154 lines
13 KiB
Markdown
154 lines
13 KiB
Markdown
# AI1NET 插件开发状态 + AA 开源插件功能迁至 WorkBuddy 的可行性评估
|
||||
|
|
|
|||
|
|
> 日期:2026-09-28 | 性质:**只读评估**(未改任何被评估项目的源码)
|
|||
|
|
> 取证方式:跑插件自带门禁 + 读本地实物(WorkBuddy 安装目录、插件缓存、guest SDK)
|
|||
|
|
> 材料边界:AA 的**手机侧页面与 AA Server** 不在本机任何副本内 ⇒ 本评估只判「功能本体能否在 WorkBuddy 侧落地」,不判「AA 服务端可否照抄」
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 一、结论(先给判定)
|
|||
|
|
|
|||
|
|
1. **ai1net 插件**:门禁全绿(`rc=0`),规格 21 条路由**已实现 14 条** —— M2 模型管理 / M3 技能插件管理 / M5 IM 插件侧三块完整,**M1 多租户与 M4 覆盖网络界面未接入**。
|
|||
|
|
2. **AA 开源插件的功能可分三层**:本机桥接层(强对位,可做)· 账号与设备层(部分对位,需自建服务端)· 手机接入层(**WorkBuddy 内无对应机制,不可能只靠它完成**)。
|
|||
|
|
3. ⇒ **可行,但不是「移植」而是「重做 + 复用」**:WorkBuddy 侧只做「设备侧桥」,手机接入那一段复用你们**已有的平台能力**(覆盖网络中继 + 配对端点 + 手机页)。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 二、ai1net 插件开发状态(实测)
|
|||
|
|
|
|||
|
|
**包**:`@dsh-local/ai1net`(`E:/ProgramData/AIProject/dsh-plugin-ai1net`)|pluginId `ai1net`|库 `dshs_pl_ai1net`|表前缀 `p_ai1net_`
|
|||
|
|
|
|||
|
|
**判据实跑**:`node scripts/build.mjs --check-only` ⇒ **rc=0「✅ 门禁通过」**(含语法、客户端封包契约、host 半契约、数据面声明、M2/M3/M5 逐条冻结校验;M2 回读摘要 `M2_DIGEST=11d7b1be8aea3996`)
|
|||
|
|
|
|||
|
|
| 模块 | 规格路由 | 已实现 | 状态 |
|
|||
|
|
|---|---|---|---|
|
|||
|
|
| S2 骨架 | 1(ping) | 1 | ✅ |
|
|||
|
|
| M2 模型管理 | 3 | 3 | ✅ 三条精确路由 / 六种方法;明文密钥零落台账;home 写走 UserFs |
|
|||
|
|
| M3 技能插件管理 | 7 | 7 | ✅(「搬包」在包外 = 平台侧拉取器) |
|
|||
|
|
| M5 IM 插件侧 | 3 | 3 | ✅ 含每插件令牌 + 实例级单例长轮询闸 |
|
|||
|
|
| M1 多租户 | 5 | 0 | ⛔ 未接入 |
|
|||
|
|
| M4 覆盖网络界面 | 3 | 0 | ⛔ 未接入 |
|
|||
|
|
| **合计** | **22** | **14** | 全包 14 条路径**互不重复**(实测) |
|
|||
|
|
|
|||
|
|
**产物**:`lib/` 6 件(`index.js` 36 KB · `client.js` 55 KB · `im-plugin-sdk.mjs` 49 KB · `models-sdk.mjs` 33 KB · `plugins-sdk.mjs` 24 KB · `data-limits.js` 2 KB),最新写入 09-26 17:31。
|
|||
|
|
|
|||
|
|
⚠️ **一条顺带发现**:`dsh-plugin-ai1net` **不在任何 git 仓内**(`git -C` 向上找不到 `.git`)。同一现象在 `dsh-plugin-forge` / `dsh-plugin-carbon` / `ai1net-dsh-anywhere` / `ai1net-dsh-desktop` **全部存在** ⇒ 这些"包"目前**只有文件系统副本、没有版本历史**。属风险项,不在本次评估范围。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 三、AA 开源插件是什么(被评估对象)
|
|||
|
|
|
|||
|
|
**身份**:`Agents Anywhere(AA)` 的 DSH 插件,自称 **DSH Bridge Next**。本机实物 = `ai1net-dsh-anywhere/tmp/aa-inspect-20260926/package/`(README 28 KB + RUNTIME_READS + USER_QUESTIONS + `lib/bundled-connector/` + `locale/`)。
|
|||
|
|
|
|||
|
|
**它为 DSH 桌面做的事**(= 待评估的功能全集):
|
|||
|
|
|
|||
|
|
| # | 功能 | 要点 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| F1 | 侧栏入口 + 弹窗面板 | 挂官方 `sidebar.footer.action`(设置上方),四个标签页:登录和连接 / 设置 / 桥接日志 / 维护 |
|
|||
|
|
| F2 | 账号登录(云 或 自建服务器) | OAuth + 临时回环端口 + state + PKCE S256 + 一次性授权码 |
|
|||
|
|
| F3 | 手机扫码连接 | 复用 `/auth/mobile-login/{qr,status,confirm}`,二维码内嵌**临时**登录凭据 |
|
|||
|
|
| F4 | 设备注册 / 绑定 / 凭据恢复 | 同账号同服务**复用**已有设备;失效凭据按「已删除 / 已断开」两条人工恢复分支 |
|
|||
|
|
| F5 | 内嵌 Python Connector | `@dataiku/uv` 起 venv(Python 3.12+),stdio RPC,进程互斥 + 有序 Connector ID 历史 + 共享 `connector-runtime.json` |
|
|||
|
|
| F6 | DSH runtime 桥 | 原生会话/历史读取、**Timeline 投影 v3**、增量同步检查点、附件上传(图片接口 / `fileUploads.uploadStream`)、模型 / effort / 权限 |
|
|||
|
|
| F7 | 审批转发 | 官方 `approval/request` → 远端交互通知(允许一次 / 拒绝),含 `plan-review` 计划审批卡片 |
|
|||
|
|
| F8 | 桥接日志 | 只读、最近 200 条、2 s 刷新、滚动保留、写前脱敏 |
|
|||
|
|
| F9 | 维护 | 打开数据 / 日志目录、恢复出厂(先撤销设备凭据再清本地) |
|
|||
|
|
| F10 | 跟随宿主语言 | 中英切换、已开面板即时更新 |
|
|||
|
|
| F11 | Web onboarding | 独立引导页:添加 Agent → 可选手机连接 → 完成 |
|
|||
|
|
| F12 | 承载 | **AA 云中转**(自建服务器亦可) |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 四、WorkBuddy 的扩展面(评估标尺 · 全部本地实测)
|
|||
|
|
|
|||
|
|
**WorkBuddy 内核 = `@genie/agent-cli`(CodeBuddy/Genie 系)**,与 DSH/cordis **零共享** ⇒ AA 插件**不能装进 WorkBuddy**,只能按 WorkBuddy 的扩展面重做。
|
|||
|
|
|
|||
|
|
| 扩展面 | 实测形态 | 关键约束 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| **Skill** | `.codebuddy-plugin/plugin.json`(`category: skill`,实测 52 个)+ `SKILL.md` + `references/` | 提示词与脚本层,**无自定义 UI 面板** |
|
|||
|
|
| **MCP app** | `category: mcp-app`(实测 4 个)+ `.mcp.json` | **`type: stdio`**;env 有 `${CODEBUDDY_PLUGIN_ROOT}` / `${CODEBUDDY_PLUGIN_DATA}` |
|
|||
|
|
| **Connector** | `.workbuddy/connectors/` + `enterprise-registry.json` | 外部系统集成,官方文档要求先搜连接器 |
|
|||
|
|
| **Hook** | `settings.json` → `SessionStart` / `PreToolUse` / `UserPromptSubmit` / `SessionEnd` | 会话启动时快照;**仅 4 个事件** |
|
|||
|
|
| **Automation** | 一次性 / 周期排期 | 由宿主拉起新会话 |
|
|||
|
|
| **发布为应用** | 本地项目 → 在线链接(sites) | 发布的是**项目产物**,不是 agent 会话 |
|
|||
|
|
| **guest SDK** | `resources/wb-guest-sdk/wb.js`(`@genie/workbuddy-desktop-sdk`) | 见下表;**未见公开文档** |
|
|||
|
|
|
|||
|
|
**guest SDK 暴露的能力(`wb.js` 反解)**
|
|||
|
|
|
|||
|
|
- 通用命名空间:`storage` · `config` · `account` · `openAuth` · `skills` · `experts` · `automations` · `workspaces` · `models` · `notifications` · `ops` · `connectors` · `conversations` · `artifacts` · `search` · `changes` · `intentRecognition` · `metrics` · `netdrive` · `inspirationCode` · `cloud`
|
|||
|
|
- 桌面专属:`paths` · `shell` · `mcp` · `buddyApps`
|
|||
|
|
- `conversations` 方法(节选):`sendPrompt` · `runPrompt` · `requests` · `artifacts` · `files` · `searchFiles` · `changes` · `cancel` · `resend` · `getPendingInfo` · **`resolvePending` / `rejectPending`** · `configSetModel` / `configSetPermissionMode` / `configSetExpert` …
|
|||
|
|
- 事件(节选):**`wb:conversation:permission`(权限请求)** · `stateChange` · `timelineEvent` · `planUpdate` · `artifactUpdate` · `creditChanged` · `contextUsageChanged`
|
|||
|
|
|
|||
|
|
⛔ **重要边界**:WorkBuddy 官方文档站**只有用户手册**(快速开始 / 创建任务 / 任务管理 / 对话 / 结果查看),**没有第三方插件开发文档**;`buddyApps` 虽在 SDK 命名空间里,但**未见对外形态与清单规范** ⇒ 结论必须按"未公开"处理。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 五、逐功能对位(按三层给判定)
|
|||
|
|
|
|||
|
|
### A 层 · 本机桥接 —— **对位强,可做**
|
|||
|
|
|
|||
|
|
| AA 功能 | WorkBuddy 对位 | 判定 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| F5 内嵌 Python Connector | **MCP app(stdio 外部进程)** —— 正是 WorkBuddy 的插件形态;`uv` 可直接由该进程自理 | ✅ 可做(且比 DSH 侧更顺) |
|
|||
|
|
| F6 会话 / 历史读写 | `conversations`(`requests` / `artifacts` / `files` / `searchFiles`)+ 本地转录 jsonl | ✅ 可做;**Timeline 投影与增量检查点协议须自建** |
|
|||
|
|
| F7 审批转发 | **`wb:conversation:permission` 事件 + `resolvePending` / `rejectPending`** + `PreToolUse` 钩子 | ✅ **最强对位**,语义几乎一一对应("允许一次 / 拒绝") |
|
|||
|
|
| F8 桥接日志 | `ops` / `notifications` + 自建滚动文件 | ✅ 可做 |
|
|||
|
|
| F9 维护 | `paths`(桌面专属)+ `storage` | ✅ 可做 |
|
|||
|
|
| F10 语言 | `config` | ✅ 可做 |
|
|||
|
|
| F1 侧栏入口 + 自定义弹窗 | ⛔ **无公开对位**(插件 category 只有 `skill` / `mcp-app`;`buddyApps` 未文档化) | ⚠️ **做不出同等交互** ⇒ 退化为「对话式 skill」或「产物卡片」 |
|
|||
|
|
|
|||
|
|
### B 层 · 账号与设备 —— **部分对位,需自建服务端**
|
|||
|
|
|
|||
|
|
| AA 功能 | WorkBuddy 对位 | 判定 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| F2 账号登录 / 自建服务器 | `account` + **`openAuth`**(OAuth) | ✅ 可做 |
|
|||
|
|
| F4 设备注册 / 绑定 / 恢复 | `storage` 存本地绑定;**设备台账与 `/revoke` 语义须自建服务端** | ⚠️ 半可做 |
|
|||
|
|
| F12 云端承载 | `cloud` / `netdrive`;但**WorkBuddy 不提供"把本机 agent 暴露给外部"的中转服务** | ⛔ 须外部服务端 |
|
|||
|
|
|
|||
|
|
### C 层 · 手机接入 —— **WorkBuddy 内无对应机制**
|
|||
|
|
|
|||
|
|
| AA 功能 | WorkBuddy 对位 | 判定 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| F3 扫码配对 | 无配对服务端、无设备台账、无二维码轮询通道 | ⛔ **须外部服务端** |
|
|||
|
|
| 手机页面 / Web onboarding(F11) | WorkBuddy 无对外 HTTP 服务面(`sites` 发布的是项目产物,非 agent 会话) | ⛔ **须外部服务端** |
|
|||
|
|
| 反隧道(本机被外部打到) | 无;但 **MCP app 是普通进程 ⇒ 可自己绑定回环 + 主动拨出**,这一点技术上成立 | ⚠️ 可行但**须实测进程常驻性** |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 六、结论与推荐路径
|
|||
|
|
|
|||
|
|
**判定:功能本体「大部分可实现」,但「手机接入」这一段不可能只靠 WorkBuddy 完成。**
|
|||
|
|
|
|||
|
|
推荐落地形态(三层拼装,各用其长):
|
|||
|
|
|
|||
|
|
1. **WorkBuddy 侧**:做一个 **MCP app 插件**充当「设备侧桥」 —— 挂 `PreToolUse` / `conversation.permission` 做审批转发;用 `conversations` 读写会话;把桥接到的事件通过本机回环 + 主动拨出送给中继。**不碰**任何对外服务面。
|
|||
|
|
2. **手机侧**:⛔ 不在 WorkBuddy 内重造 —— **直接复用你们已经验证过的那一套**(`overlay-pair` 五端点 + `pair.html` + 覆盖网络中继),它已产出 **28 条判据全绿** 的运行面读数。
|
|||
|
|
3. **平台侧**:沿用 ai1net 平台做设备台账与准入四道闸(这正是 AA 用云中转做、而你们已用自研中继替掉的那部分)。
|
|||
|
|
|
|||
|
|
**一句话**:AA 的**用户可见仪式**可对齐,**承载与配对**用你们自己的;WorkBuddy 侧只需补「桥」这一层。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 七、卡点与未验证项(⛔ 不得当成已定)
|
|||
|
|
|
|||
|
|
1. **进程常驻性未验**:MCP app 是 `stdio`、生命周期由宿主管(`defer_loading` / preload 语义);「让一个能常驻监听回环并拨出中继的守护」在 WorkBuddy 里能否稳定存活,**必须实测**,不能按"是普通进程"推断。
|
|||
|
|
2. **无 UI 扩展形态**:AA 那种侧栏 + 弹窗面板在 WorkBuddy 无公开对位 ⇒ 若产品要求"看得见的面板",须先确认 `buddyApps` 是否对第三方开放(本机无文档 ⇒ 判"未公开")。
|
|||
|
|
3. **材料缺口**:AA 的**手机侧页面**与 **AA Server** 不在本机副本内(`vendor/agents-anywhere/README.md` 明写其归该包所有)⇒ 本文不评价其服务端实现,也不假设可照抄。
|
|||
|
|
4. **审计结论互不影响**:本次是**功能可行性**评估;AA 包的**许可与供应链**未审(其 `package/` 为检视副本,来源与授权未核)⇒ 真要复用代码前须单独做一轮许可核查。
|
|||
|
|
5. **同一缺口在 ai1net 侧也存在**:M1 多租户 / M4 覆盖网络界面未接入,与本评估的"手机接入"是两条独立线,⛔ 别混为一谈。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 附:本次取证命令与读数
|
|||
|
|
|
|||
|
|
| # | 命令 / 位置 | 读数 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| 1 | `node scripts/build.mjs --check-only`(dsh-plugin-ai1net) | **rc=0**、「✅ 门禁通过」、全包 14 条路径互不重复 |
|
|||
|
|
| 2 | `git -C dsh-plugin-ai1net rev-parse` | `fatal: not a git repository` ⇒ **不在任何 git 仓内** |
|
|||
|
|
| 3 | `grep -rho '"category":"…"'`(WorkBuddy 插件缓存) | skill 52 · interaction 10 · welcomeMode 6 · builtin-plugin 5 · **mcp-app 4** · template 2 |
|
|||
|
|
| 4 | `cat .codebuddy-plugin/plugin.json`(mcp-miora) | `category: mcp-app` · `runtimeOwner: agent-cli` |
|
|||
|
|
| 5 | `cat .mcp.json`(mcp-miora) | `type: stdio` · `${CODEBUDDY_PLUGIN_ROOT}` · `${CODEBUDDY_PLUGIN_DATA}` |
|
|||
|
|
| 6 | `head wb-guest-sdk/wb.js`(WorkBuddy resources) | 21 个通用命名空间 + 4 个桌面专属 + `conversations` 方法/事件全表 |
|
|||
|
|
| 7 | `WebFetch workbuddy.cn/docs/workbuddy/Overview` | 仅用户手册(5 章),**无插件开发章节** |
|
|||
|
|
| 8 | 规格书 `05-交接单/交接单_包规格书_20260926.md` §五 A1/A3 | 五模块 A1 清单 + A3 精确路径全表(21 条 + S2 1 条) |
|