Skip to content

new work zone - #710

Merged
wzh1994 merged 75 commits into
LazyAGI:mainfrom
YuZou-coding:feature/newWorkZone
Sep 18, 2026
Merged

wzh1994 merged 75 commits into
LazyAGI:mainfrom
YuZou-coding:feature/newWorkZone

Conversation

@YuZou-coding

@YuZou-coding YuZou-coding commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

What

  • 新增本机工作区绑定与权限控制,支持读取、新建、修改、追加和删除授权目录内的文件
  • Core 统一管理 workspace grant、binding、permission、审批、路径边界和运行状态
  • 主会话、SubAgent、Workflow 统一通过受控 LocalFileToolkit 操作文件
  • 支持按执行冻结权限、逐次审批、审批后执行,以及会话中途修改后续执行权限
  • 前端新增工作区选择、权限切换和操作审批界面
  • 合并官方最新 main,LazyLLM gitlink 与官方保持一致

Why

原有文件工具主要用于内部产物目录,无法安全访问用户选择的本机目录,也缺少统一的权限检查和逐次审批。此次实现将目录授权和磁盘操作集中到 Core,避免 Agent、SubAgent 或 Workflow 绕过权限直接操作宿主文件。

Tests(2026-09-11 更新)

当前前端验证状态

  • 全量 pnpm typecheck:all 未通过,撤回此前“前端 typecheck 通过”的笼统表述。
  • 同一 macOS 环境:Node v26.0.0、pnpm 10.0.0、TypeScript 5.5.4;base/head 使用同一份已安装的 frontend/node_modules,各自保留对应提交的源码与 tsconfig,均在 frontend 目录执行 pnpm typecheck:all
版本 退出码 TypeScript 诊断数 说明
原始 base ffffc4e1 2 2 message.test.ts(49,1)(49,2) TS1128,多余 }); 导致语法错误,不能据此判断语义类型错误数量
复核 head a67353b1 2 486 未通过,不再以“报错不在工作区修复文件”推断与整个 PR 无关
临时 base 副本,仅删除上述多余括号 2 620 补充诊断,非原始 base 结果;用于排除语法错误阻断后的比较
修复后 87f77a0a 2 485 新发现的会话排序返回类型问题已修复,全量仍未通过
  • 对诊断按“文件路径 + TS 错误码 + 首行消息”归一化(忽略行列号,保留重复次数)比较:a67353b1 的 486 条中,485 条也出现在临时 base 副本,另有 1 条 conversationHistory.test.ts TS2345;该差异在 87f77a0a 修复。修复后 head 相对该临时副本无独有诊断。此结果不等于全量 typecheck 通过,也不是干净依赖安装或 CI 验证。
  • 本地回归:8 个测试文件、76 项通过(ChatInput、localWorkspace、conversationHistory);使用 NODE_OPTIONS=--no-experimental-webstorage pnpm test ... 规避 Node 26 原生 webstorage 与 jsdom 冲突。
  • 本轮改动文件 ESLint、git diff --check 通过。

历史验证记录(本轮未重新执行,不代表当前 head 已通过)

  • Core 全量测试、go vet ./...;工作区 Chat、SubAgent、Workflow、审批、迁移及并发回归。
  • 算法相关回归:109 passed。
  • Local 生产构建及 OpenAPI fresh 检查。
  • SQLite 租约恢复用例连续 5 次通过。

边界(诚实声明)

  • 不提供任意 Shell、custom MCP 或工作区二进制文件执行能力

@Yuang-Deng

Copy link
Copy Markdown
Contributor

本轮 review 修复已更新至 2c39e0bd4619ba174add516ec202379bead46a71,LazyLLM gitlink 为 c44b27047f00d4c00f88c02c148a272daa8ed0d4

改动

  • 保持 read 默认允许、write/delete 原有 policy;根据 trusted local / Core workspace capability 控制通用文件工具暴露。
  • Core 使用 ContextSnapshot JSON 字段生成 SubAgent metadata,继承 shell conversation grant;运行中实例保持原快照。
  • 普通工具不进入 workspace guard 执行 scope;分别标记 host_file_operation / approval_operation。
  • Chat/SubAgent 显式传递 ToolResolutionContext,不再由 middleware 解析整份配置。
  • append 改为流式二进制复制和原子替换;edit 原文件硬限制 64 KiB(65,536 字节),并限制实际读取量。
  • shell 每路保留前后各 64 KiB,返回字节计数和截断标记,处理执行及管道超时;修复 Windows 跨盘符/UNC root 检查。

验证

  • 现有容器中 LazyLLM 文件/shell/host lifecycle:39 项通过。
  • LazyMind 能力暴露、SideChat 只读、SubAgent、附件资源、typed context、权限矩阵及混合工具相关测试通过;1 项需独立 HTTP fixture 的可选测试跳过。
  • Go go test ./localworkspace ./subagent -count=1 通过。
  • 真实 Core HTTP → Main allow_future(shell) → RebuildSubagentParams → Python WorkspaceContext → 新实例 shell 无再次审批的跨语言集成通过。
  • 修改的 Python 生产代码及 LazyLLM 文件 flake8、两个仓库 diff 检查通过。
  • Windows 仅验证路径语义,未做原生运行测试;本轮未重跑前端或全量构建,此前前端 typecheck 未通过的记录仍有效。

正文中的旧描述需以当前实现为准

通用文件操作现在使用 FileSystemToolkit,磁盘 IO 在宿主工具侧执行,Core 管理授权与审批;shell 具有独立审批及会话 grant。正文中“统一通过 LocalFileToolkit”“磁盘操作集中到 Core”“不提供任意 Shell”的旧表述未反映当前实现。本账号无法修改此 PR 正文,因此在此补充说明。

@Yuang-Deng

Copy link
Copy Markdown
Contributor

新增本地工作区绑定和工具审批,并将 host_file 授权限定为产品策略:非本地部署不注入 policy,准备成功默认放行;本地/Desktop 根据 Core 冻结的可信上下文使用“始终询问 / 按需确认 / 完全信任”。缺失本地上下文不会降级放行。

  • Algorithm 负责文件意图、策略判断及原工具 IO;Core 管理审批、运行身份和会话授权,不执行 host_access 文件 IO。
  • UNDECLARED/MCP 可以批准一次或在按需确认模式下记住本会话授权;始终询问忽略既有 grant。完全信任复用 allow_all,覆盖 shell、脚本和未声明工具,同时保留参数准备、业务权限及文件身份检查。
  • 通用工具审批复用 host_access 生命周期,绑定调用、工具身份、参数摘要和任务身份。allow_future 依据 operation 冻结的权限模式,界面同步展示允许的动作。
  • MCP 身份使用持久 server ID、连接目标、transport 和协议工具原名的单次摘要,独立于模型 alias;没有稳定身份只支持允许一次。本次不改同名工具注册规则。
  • 复用 ConversationToolGrant,扩容字段并迁移 CHECK 约束,兼容 PostgreSQL/SQLite,保留 shell 授权并同步现有聚合迁移。
  • 主任务和子任务使用权限快照。默认内置工具继续要求完整声明,前端更新权限说明和工具来源展示。

验证:

  • 容器内 Algorithm 授权、MCP 加载、默认工具声明、执行器、子任务上下文及相关回归通过。
  • Core 的 ./localworkspace、./chat 测试通过;新增可信部署标识及快照审批测试通过。
  • PostgreSQL/SQLite 增量升级、回滚、既有 shell grant 保留及聚合/增量结构一致性通过。
  • 真实 Python → Core HTTP 往返通过,包含文件审批、shell/通用工具会话授权和子任务继承。
  • 前端 LocalWorkspaceControl 35 项通过;错误码翻译检查和 git diff --check 通过。

LazyLLM gitlink 固定为联合验证使用的 ff55fd156ccc03da4fc176cfc947c53fbd4bfdf5,对应 LazyLLM #1320。本轮未运行全量前端类型检查,不撤销此前未通过的记录;未验证 Windows 原生 IO,也未执行生产部署。能力声明不是进程沙箱。

AI 参与:Codex 主导实现,方案由用户确认。

@Yuang-Deng

Copy link
Copy Markdown
Contributor

变更

为本地和 Desktop 会话提供工作区绑定、权限选择和工具审批。通用文件操作由 LazyLLM FileSystemToolkit 执行,Algorithm 的 WorkspaceAuthorizationPolicy 根据会话权限和工具声明决定 ALLOW / ASK / DENY;Core 保存工作区与授权,处理审批和执行生命周期。Main Agent、SubAgent、Workflow 共用这条链路,附件读取与产物发布保持独立。

支持 allow_all、always_ask、ask_as_needed,以及 shell 和具备稳定身份的工具授权。审批绑定调用参数摘要与 run/lease 身份,保留权限快照、撤销、超时、幂等和不确定结果处理。

Core 文件执行协议仅接受 host_access,保留批量准备、状态查询、审批、claim 和 complete。删除旧单操作 prepare/execute 路由、Core 文件 IO、旧协议专属字段及无生产调用的 workspace_tool_metadata(),并同步审批响应、OpenAPI、生成客户端和文档。历史 local/空模式不会进入新执行链。

删除 workspace 的 ReadPolicy/WritePolicy,权限统一由会话 PermissionMode 决定。新增增量迁移,支持 PostgreSQL 和 SQLite 升级/回滚,SQLite 保留数据、索引和绑定;回滚恢复两列为 allow。同步 v0_3 聚合结构,不改写已共享增量迁移。

依赖

LazyLLM 后续清理 PR:LazyAGI/LazyLLM#1323 。本 PR 的 gitlink 指向其提交 47a43df9,删除 #1320 引入的两个 require_host_file 参数并收敛执行校验。

验证(2026-09-16)

在现有容器完成以下验证,未启动 evo、未部署、未操作开发业务数据:

  • LazyLLM 工具运行时、授权生命周期、安全策略、调度及 Agent 事件:74 passed。
  • Algorithm 工具注册、声明和授权等相关回归:130 passed、1 skipped;最后一处调用调整后相关子集 65 passed。
  • Core localworkspace 测试、相关 Chat/SubAgent 测试和 OpenAPI 测试通过;独立验证本次实际提交快照的 Workspace/HostAccess/HostOperation/LocalOperation 用例通过,不依赖工作区中未提交的平台身份修复。
  • Python/Go 真实工具审批往返通过;Windows 交叉编译通过,未进行原生 Windows IO 验证。
  • PostgreSQL/SQLite 测试数据库升级、回滚、数据与绑定保留及增量/聚合结构一致性测试通过。
  • OpenAPI 客户端重新生成并通过 freshness 检查;工作区审批组件 38 项测试通过。
  • 前端全量类型检查仍未通过:本轮清理前后均为 539 条诊断,比较无新增。此对比保留相同的原有未提交改动,不代表整个 PR 相对 main 无类型问题,也不代表干净安装或 CI 验证。

升级边界

先更新 LazyLLM,再在没有执行中审批的窗口协调更新 Core 与 Algorithm。不提供旧协议混跑兼容,不清空业务数据。本次清理仅针对本 PR 及关联 LazyLLM PR 新增内容;原有未提交的平台身份、前端及运行配置修改未纳入提交。

@Yuang-Deng

Copy link
Copy Markdown
Contributor

修改内容

为本机目录提供工作区授权、会话绑定和三档权限控制。LazyLLM 工具负责实际执行,Core 统一校验目录身份、执行状态及审批;文件工具、Shell 和 MCP 调用遵守对应权限规则。

  • macOS 使用卷 UUID + inode 保存目录身份,避免设备号变化后原工作区失效;Windows 使用完整 64 位卷序列号 + 128 位 File ID。授权、绑定和执行时校验复用相同实现,接口失败不降级为路径授权。Linux 保持原实现。
  • 新会话创建阶段遇到工作区不可用、撤销或项目身份冲突时显示业务原因,保留输入和工作区选择,不进入不存在会话的重连流程;真实网络中断保留恢复行为。
  • 失效审批返回 HTTP 409 / execution_inactive,超时返回 HTTP 409 / selection_expired;真实存储或解码故障仍返回 500。保留执行前校验、审批并发控制和幂等行为,失效请求不能执行或保存后续授权。
  • 审批界面区分“执行已结束,请求已失效”和“请求已过期”。

验证

  • 容器 Core:go test ./localworkspace ./chat 通过;此前 conversationgroup 回归通过。包含真实 HTTP handler、审批状态清理、超时、claim 期间过期、真实身份冲突回滚及正常审批回归。
  • 前端 LocalWorkspaceControl 40 项通过;此前会话创建相关回归通过。VITE_LAZYMIND_MODE=local 生产构建通过。
  • macOS 原生目录身份测试通过;Windows 仅完成交叉编译,不能替代原生验收。
  • 现有开发环境网页验证:新工作区连续创建会话、calculator、区内/区外写入、允许一次、拒绝、停止、Shell 及完全信任实际执行通过;DeepWiki MCP 查询和后续授权经刷新及服务重启验证。
  • 最新网页验收:写入等待审批后停止生成,重放 allow_once / allow_future / reject 均返回 409 / execution_inactive,目标文件未创建;实际超时请求返回 409 / selection_expired。
  • 全量前端 typecheck 仍未通过,不宣称全量类型检查或跨平台完整验收通过。

已知边界

  • 不兼容或迁移旧授权,不修复历史项目绑定;使用新目录重新授权。Linux 跨重挂载稳定性不在本次解决范围。
  • Windows NTFS / ReFS 原生运行、系统重启后的持久性仍待验收;不自动重启电脑。
  • Skill run_script 真实联网验收仍未通过:已定位脚本退出后日志辅助进程持有 stderr 管道导致等待超时,本次未修复。
  • 未修改 CI、未新增依赖,未提交本地模型配置。

详细验收记录:docs/workspace-identity-validation-20260916.md。

@wzh1994 wzh1994 changed the title Feature/new work zone new work zone Sep 17, 2026
@wzh1994
wzh1994 merged commit 6a77a0e into LazyAGI:main Sep 18, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants