web/browser/ 仍为多文件源码包,但只注册一个名为以下名称的 callable: playwright_browser。因此浏览器直接显示一个 callable 行,不重复显示 browser → playwright_browser 两层。只有导出多个 callable 的源码包才成为可展开行。
Programs 源码分类
Programs 浏览器遵循已安装 Python 源码层级。普通 Function 按用途实际存放在 openprogram/programs/tools/下;界面读取该层级,不从运行时工具元数据重新构造无关目录。
已验证实现与缺口
| 当前边界 | 已验证行为 | 缺口 |
|---|---|---|
tools | 以下位置的用途目录: openprogram/programs/tools/ 存放确定性的 @function 包。 | 无:公开 callable 名称保持不变。 |
GET /api/tools | 返回运行时 callable,包括 MCP 工具和显示分组。 | 它仍是运行时/配置接口,不再定义 Programs 目录。 |
GET /api/programs/explorer | 将 tools/, workflow/以及 packages/ 列为以 callable 为主的行。 | 无:叶子 Workflow 包不可展开。 |
分类合同
| 侧栏行 | 规范证据 | 显示项 | 变更 |
|---|---|---|---|
tools | 安装包下的实际目录 | files, web, knowledge, planning, agents, jobs, code, interaction以及 runtime. | 只读目录 |
tools/<purpose>/<module-or-package> | 实际 Python 源码及注册元数据 | 单一 callable 来源显示为一个 callable 行;注册多个 callable 的来源显示为可展开分组,内部列出各 callable。 | 收藏与使用操作作用于 callable |
workflow | 以下路径下的实际目录与模块: openprogram/programs/workflow/ | 按 callable 名称显示每个注册 Workflow,包括同一包中的多个导出。 | 继续支持收藏与使用 |
packages | /api/programs/explorer | 已安装 Program 包。 | 既有调用树与图 |
参考比较与决策
| 参考 | 相关模型 | 本设计决策 |
|---|---|---|
| OpenProgram 注册表 | 普通函数与 agentic 函数注册到统一 callable 接口,同时保留源码层元数据。 | 采用统一运行目录;只在管理界面增加只读源码筛选。 |
| Hermes toolsets | 命名 toolset 表达选择,不表达源码归属。 | 工具 profile 与源码分类保持独立。 |
| Claude Code | 官方仓库不公开产品内部工具实现树,因此可见界面不能证明源码布局合同。 | 不复制无法验证的每工具一个目录假设。 |
| OpenAI Codex | 公开工具实现同时使用 handler 文件和子模块。 | 采用相同的按复杂度区分方式,不复制 Rust 专属命名。 |
采用:用途目录是普通 Python 包。只有一个实现文件的 Function 使用模块;含 provider、prompt、action、worker、共享状态或多个协作入口的 Function/子系统使用包。一个源码包可注册多个 callable,因此 agent 和 memory 等包保持完整。拒绝:强制每个 callable 一个目录、强制每份源码一个文件、纯前端分类、第二分类注册表、旧 import 路径上的兼容副本、原始源码文件浏览,以及在 Programs 中重复外部 MCP 工具。
实际源码计划
| 目录 | 移入的包 |
|---|---|
files | apply_patch, bash, edit, glob, grep, list, process, read, write, worktree |
web | agent_browser, browser, image_analyze, image_generate, pdf, web_fetch, web_search |
knowledge | memory, read_conversation |
planning | plan_mode, todo |
agents | agent, mixture_of_agents, send_message |
jobs | cron |
code | execute_code, lsp, semble |
interaction | canvas, clarify, send_file |
runtime | mcp_meta, program, skill |
单文件模块: apply_patch, edit, glob, grep, list, process, read, write, agent_browser, pdf, web_fetch, read_conversation, mixture_of_agents, execute_code, canvas, clarify, send_file, program以及 skill。其余条目保留为包,因为它们已有协作实现文件或多个注册 callable。
行为、兼容性与失败
- 浏览器惰性展开已安装目录层级,不在浏览器端编造分类路径。
- 单一 callable 的模块或包直接渲染为注册 callable,不增加额外源码包装行。
- 注册多个 callable 的包展开显示这些 callable 名称,同时保留同一共享源码边界。
- 刷新 Programs 会重新扫描并加载同一浏览器接口。
- 来源为
mcp的条目不出现在 Programs;MCP Servers 是其唯一管理页面。 - Agentic Function 使用公开 callable 名称;源码路径仅在可用时用于静态调用分析。
- Workflows、Applications、收藏、聊天启动、调用树与图行为不变。
任务说明与门禁清单
生产文件: 实际 vanilla 包及其 import、Programs 浏览器接口和既有 Programs 页面。 测试文件: 浏览器公开入口测试、注册表/import 测试及 Programs UI 合同。 排除: 公开 callable 重命名、工具 profile 策略变化、卡片样式修改、依赖及外部 MCP 目录变化。
验收: 每份随附 vanilla 源码恰好属于一个用途目录;简单来源是模块,复杂来源是包;不保留旧顶层源码; playwright_browser 直接可见,并保留 tools/web/browser 作为逻辑路径;所有注册 vanilla callable 名称继续可用;Workflows 与 Applications 不变。
验证: 浏览器/注册表专项 RED/GREEN 测试、import 冒烟测试、Programs UI 检查、TypeScript 编译、构建、默认 18100 打包 App DOM 与截图,以及 git diff --check.
Application import 兼容性
从以下路径加载的 Program 包: openprogram/programs/packages 必须通过规范 openprogram.programs.workflow 命名空间导入内置 Agentic Function。已移除的 openprogram.programs.Agents 命名空间不恢复为第二兼容包。
验收: 已打包的 gui_agent 公开入口可以开始桌面运行而不发生模块导入错误;GUI、research 和 wiki 应用包的生产代码不导入已移除命名空间。
实现状态
Application 函数调用
Application 视图每次请求读取当前包源码,从装饰的公开函数开始,跟踪本地函数调用和包 import,而不把仓库中每个 import 都当作执行边。测试、benchmark 和无关文件不进入图。
条件调用标注为条件关系,不作为固定执行顺序。既有树和图共享源码推导节点。报告无法解析的调用和分析限制;分析器绝不执行包代码来发现关系。页面打开时刷新分析。调用树初始展开前三层,显示能力函数并收起内部实现。分支行可通过点击、Enter 或 Space 切换。所选 Program 的展开状态在源码刷新后保留;叶子和重复引用没有开关。
实现状态
源码追踪、条件边和可见页面刷新已实现。回归测试覆盖源码编辑、入口选择与未解析 callable alias。已安装 App 可视验收仍未验证。本改动不含 Archify 集成或 Harness 执行变化。