@xcanwin/manyoyo 7.0.26 → 7.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/web/AGENTS.md +6 -8
- package/lib/web/frontend/shadcn.html +91 -88
- package/lib/web/server.js +16 -171
- package/package.json +2 -21
- package/lib/web/frontend/app.css +0 -2269
- package/lib/web/frontend/app.html +0 -394
- package/lib/web/frontend/app.js +0 -5352
- package/lib/web/frontend/chat-behavior.js +0 -107
- package/lib/web/frontend/codemirror-entry.js +0 -111
- package/lib/web/frontend/codemirror.bundle.js +0 -31
- package/lib/web/frontend/file-browser.js +0 -800
- package/lib/web/frontend/login.css +0 -208
- package/lib/web/frontend/login.html +0 -25
- package/lib/web/frontend/login.js +0 -74
- package/lib/web/frontend/markdown-renderer.js +0 -316
- package/lib/web/frontend/markdown.css +0 -84
package/lib/web/AGENTS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# lib/web/ 协作指引
|
|
2
2
|
|
|
3
|
-
根目录 `AGENTS.md` 的补充,仅在改动 Web
|
|
3
|
+
根目录 `AGENTS.md` 的补充,仅在改动 Web 服务端时适用。前端在 `frontend-shadcn/`,见该目录的 `AGENTS.md`。
|
|
4
4
|
|
|
5
5
|
## lib/web/server.js(6000+ 行单文件)
|
|
6
6
|
|
|
@@ -9,25 +9,23 @@
|
|
|
9
9
|
- `resolveYoloCommand()` 委托到 `lib/agent-adapters/index.js`,与 `bin/manyoyo.js` 共用同一份映射,无需分别维护。
|
|
10
10
|
- Agent 会话恢复参数:Claude/Gemini → `-r`,Codex → `resume`,OpenCode → `-c`。
|
|
11
11
|
- 会话控制事件:`/agent/stream`、`/agent/stop` 通过 `createWebStreamEmitter()` / `appendWebSessionControlEvent()` 写入 `lib/core/event-store.js`(`FileEventStore`),`GET /api/sessions/:name/audit` 导出该会话的事件与投影。
|
|
12
|
-
- **`/agent/stream` 的 NDJSON
|
|
12
|
+
- **`/agent/stream` 的 NDJSON 事件协议是跨前后端的契约**,改一处必须同步另一处:服务端 `lib/web/server.js`、前端 `frontend-shadcn/src/lib/api.ts` 的 `StreamEvent` + `workspace-panel.tsx` 的事件分支
|
|
13
13
|
- `content_chunk`:token 级增量,前端**追加**;`reset: true` 表示换了一条 assistant 消息、从空白重新开始。只发新增片段,不要改成重发累计全文(几千个增量就是 O(n²) 流量)。
|
|
14
14
|
- `content_delta`:每条 assistant 消息落地时下发一次的权威全文,前端**整体覆盖**。
|
|
15
|
+
- `trace`:**不保证带结构化 `traceEvent`**。stderr 行(`emitStderrTraceLine`)和解析不出 JSON 的 stdout 行只有 `text` + `stream`,前端靠 `toTraceEvent()` 兜底成 `kind="output"` 的事件展示。新增只认 `traceEvent` 的分支等于把自定义 CLI、CLI 报错的输出全吞掉。
|
|
15
16
|
- `ping`:保活心跳,前端忽略。`DEFAULT_AGENT_STREAM_HEARTBEAT_MS` 必须明显小于反向代理的空闲读超时(nginx `proxy_read_timeout` 默认 60s),否则 agent 静默期间流会被 RST,浏览器侧表现为输入框上方冒出 `network error`。
|
|
16
17
|
- token 级增量**不写**事件日志、历史落盘按 `AGENT_STREAM_PARTIAL_PERSIST_INTERVAL_MS` 节流;新增逐事件的落盘/日志动作前先想清楚它会不会被每个 token 触发一次。
|
|
17
18
|
- `GET /api/sessions` 是**同步 IO 大户**:逐容器 `readFileSync` + `JSON.parse` 整份历史。前端每标签页 6s 轮询一次,它阻塞多久事件循环就卡多久,正在跑的 `/agent/stream` 只能在空隙里把输出攒着分批推。往这条路径上加同步操作前务必实测耗时;`buildSessionSummary()` 已支持传入调用方加载好的 history,不要再重复读。(`docker ps -a` + 批量 `inspect` 实测仅约 90ms,不是瓶颈,别被旧注释误导)
|
|
18
19
|
- 请求处理链路上注册在**全局认证网关之前**的代码(如 `res.on('finish')` 之类的钩子)必须自带 try/catch:那里抛异常会冒泡成 `uncaughtException`,而 `bin/manyoyo.js` 的处理器直接 `process.exit(1)`——等于未认证请求可打挂 serve。回归用例见 `test/web-server-auth.test.js` 的 `Web Server Robustness`。
|
|
19
20
|
- **终端 WebSocket**:`/api/sessions/:name/terminal/ws`,在 `server.on('upgrade')` 里做 Origin 校验 + 认证 + 容器名校验,再交给 `bindTerminalWebSocket()`。上行 `input` / `ping` / `close`,下行 `output` / `status`(`ready` / `closed`)/ `error` / `pong`;实现是 `docker exec` 里用 `script` 或 python `pty` 引导出的伪 TTY,**不支持动态 resize**(`resize` 消息是预留的空实现,行列只在建连时由 query 参数定死)。并发上限 `WEB_TERMINAL_MAX_SESSIONS = 20`,每条连接对应一个 `ptyProcess`,`ws` 关闭即 `SIGTERM`——所以前端任何「卸载终端组件」的改动都等于杀掉用户正在跑的 shell。
|
|
20
21
|
- 空闲保活是 `/agent/stream` 那条心跳规则的同类问题,**两个入口都要守**:终端侧服务端每 `WEB_TERMINAL_PING_INTERVAL_MS`(30s)发 WebSocket ping 帧,连续 `WEB_TERMINAL_MAX_MISSED_PONGS`(3 次,约 90s)无 pong 才判死;前端另发应用层 `ping`(浏览器 JS 发不出 ping 帧,上行需要自己造流量)。判死阈值不要收紧到一个周期:手机切后台会让连接短暂挂起,误杀等于用户的 shell 没了。升级后的 socket 还要 `setTimeout(0)` + `setKeepAlive`,解除 HTTP 侧空闲超时。
|
|
21
|
-
- 终端 vendor 资源(`/app/vendor/xterm.css`、`xterm.js`、`xterm-addon-fit.js`)由本文件从 `@xterm/*` 依赖映射提供。
|
|
22
22
|
- 新增接口/页面必须走全局认证网关,禁止在业务路由里零散补认证;匿名白名单见根 `AGENTS.md` 的安全约束。
|
|
23
23
|
|
|
24
|
-
## lib/web/frontend
|
|
24
|
+
## lib/web/frontend/
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
只剩一个文件:`shadcn.html`,是 `npm run build:web-shadcn` 的产物(已 `.gitignore`),由 `loadTemplate()` 在每次请求时读取。服务端不再托管其它前端静态资源,别往这个目录里放新的散装 js/css。
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
- 中间工作台的「终端/文件/详情/配置/检查」5 个次要标签收在 `#workspaceSwitcherToggle` 图标按钮触发的弹出面板 `#workspaceSwitcherPanel` 里,仅「活动」作为常驻标签;`setActiveTab()` / `isActiveSessionHistoryOnly()` 逻辑本身未变,只是触发入口从常驻按钮改为面板内按钮。
|
|
30
|
-
- `connectTerminal()` 前须加 `isActiveSessionHistoryOnly()` 守卫(三处:`setActiveTab`、`handleSessionItemClick`、`refreshSessions`),否则点击「仅历史」会话会触发后端新建容器。
|
|
28
|
+
目录里没有任何被跟踪的文件,而 git 不记录空目录——**全新检出(CI、别人第一次 clone)是没有 `lib/web/frontend/` 这个目录的**。任何往这里写文件的构建步骤都必须自己 `mkdir -p`(见 `frontend-shadcn/scripts/emit-shadcn-html.mjs`),否则本地有目录跑得好好的,CI 上直接 ENOENT。
|
|
31
29
|
|
|
32
30
|
## 测试
|
|
33
31
|
|