@tea-agent/loop-agent 0.43.0-next.7 → 0.43.0-next.9
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/CHANGELOG.md +16 -3
- package/dist/build-stamp.json +3 -3
- package/dist/executors/dag-pi-executor.js +2 -0
- package/dist/worker/console/chat/routes.js +32 -17
- package/dist/worker/console/chat/terminal-sessions.js +65 -1
- package/dist/worker/console/chat/terminal-tools.js +17 -5
- package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-0z1FF_Mr.js → abnfDiagram-N423BO3Z-D_fNbWc_.js} +1 -1
- package/dist/worker/console/static/assets/{arc-5Rtc6XV_.js → arc-_HuqLW6m.js} +1 -1
- package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-BkywIxBo.js → architectureDiagram-T3A2C74G-Djy2qY1m.js} +1 -1
- package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-g1wALcrC.js → blockDiagram-VBNYF7ZC-bB-1TSyY.js} +1 -1
- package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-CtFfJvWJ.js → c4Diagram-5PPSVZJV-C5Hmghrz.js} +1 -1
- package/dist/worker/console/static/assets/channel-C0A6UEIa.js +1 -0
- package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-D5PQz8yM.js → chunk-2GRJ4B5K-Duyl39oy.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-DgV_JJPi.js → chunk-2Q5K7J3B-x6mdnSyf.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5RXB4S5H-xwfF7A20.js → chunk-5RXB4S5H-WlBuFj7W.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5VM5RSS4-CGqPeDdw.js → chunk-5VM5RSS4-CTF429HX.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-0wVqzhBr.js → chunk-6Q2QTUOP-Dwd6r-SF.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-GF5L2VYU-CMbMHcFc.js → chunk-GF5L2VYU-C-Br82D1.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-JWPE2WC7-BHizoNTm.js → chunk-JWPE2WC7-CuGp0DeE.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-KBJHAD2P-PS3GrTTl.js → chunk-KBJHAD2P-CJhFX6Lh.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-RYQCIY6F-igvsougt.js → chunk-RYQCIY6F-DpGOa_jT.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-XXDRQBXY-DtyvbRKY.js → chunk-XXDRQBXY-DXJaTynd.js} +1 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-DzguNppy.js +1 -0
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-DzguNppy.js +1 -0
- package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-Y3cTrz6x.js → cose-bilkent-JH36ORCC-CRBZWjE4.js} +1 -1
- package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-CNz317P7.js → cynefin-VYW2F7L2-BdXcxtlb.js} +1 -1
- package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-CqJD0Eda.js → cynefinDiagram-MW4NZA55-07UKsOts.js} +1 -1
- package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-DB9xkqs_.js → dagre-VZM6K2ZE-D38p9__S.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-7IWD3JNH-BvMd4WO1.js → diagram-7IWD3JNH-nSiBNNjH.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-kzIbfP-r.js → diagram-B4RE2ZJO-BFOTot5D.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-LBJQPF4R-D7DuDLA1.js → diagram-LBJQPF4R-DypKaZ6k.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-Q27KOJAE-DWYiiEqR.js → diagram-Q27KOJAE-B6yoOQeW.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-UB23O5K3-BRnBFo_0.js → diagram-UB23O5K3-BHYS6viX.js} +1 -1
- package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-DeTE8_JP.js → ebnfDiagram-BXEA7PRR-D2VD5Snj.js} +1 -1
- package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-DJIc6Ji-.js → erDiagram-JOGREHBK-E98mWxN1.js} +1 -1
- package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-DHYWItNm.js → flowDiagram-UKHOOZJN-CT1zxhqP.js} +1 -1
- package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-BtwhbiNv.js → ganttDiagram-PKOTCBZU-6GcngNcy.js} +1 -1
- package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-R21xagUM.js → gitGraphDiagram-DS77QQ5N-DCL6NvKe.js} +1 -1
- package/dist/worker/console/static/assets/index-24jp3aBh.js +468 -0
- package/dist/worker/console/static/assets/index-CY6y6I8M.css +1 -0
- package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-xn9vhN0g.js → infoDiagram-6WML65LV-C0627e-9.js} +1 -1
- package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-B1MMrk5S.js → ishikawaDiagram-WSZJBQD7-C_u3P6Ik.js} +1 -1
- package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-Bt_eha4U.js → journeyDiagram-NVQOT4AX-DPDPv9HL.js} +1 -1
- package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-CPIEKJzB.js → kanban-definition-27J2QSJJ-D3OHdWiO.js} +1 -1
- package/dist/worker/console/static/assets/{linear-CT6doEH4.js → linear-DI88zD7n.js} +1 -1
- package/dist/worker/console/static/assets/{mermaid.core-_8ilrIeK.js → mermaid.core-p2l8IrWY.js} +5 -5
- package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-xzLuFnQq.js → mindmap-definition-FAOFIHXS-B1bAX-oS.js} +1 -1
- package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-BUK6JRUg.js → pegDiagram-VL7TDLO6-DwOnWxdD.js} +1 -1
- package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-ChFOxDhD.js → pieDiagram-7S7Q4E2Y-xRkTXnJC.js} +1 -1
- package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-BeoCJ_wm.js → quadrantDiagram-CIZ2JOQS-_9UC5Zio.js} +1 -1
- package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-CaSV6rVf.js → railroadDiagram-AXF67PYL-CgEUirWJ.js} +1 -1
- package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-CogY5162.js → requirementDiagram-LRYGKXZP-Czbpwiyz.js} +1 -1
- package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-CmTAqVmS.js → sankeyDiagram-W5VNT64P-_j7_KiqY.js} +1 -1
- package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-DtmgJPSM.js → sequenceDiagram-SI44F4Z6-BNJa6Hyi.js} +1 -1
- package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-DY-e-ucu.js → sizeCapture-X5ZJPWSS-DedpKtOc.js} +1 -1
- package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-C0GKqasS.js → stateDiagram-OKZ733FA-BBvthr7c.js} +1 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BABVQnfM.js +1 -0
- package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-CHwJlgUA.js → swimlanes-SLNWSIFB-Ds7umgEM.js} +2 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-D0qsLaxR.js +8 -0
- package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-leVMWmSe.js → timeline-definition-Z64GVDOM-CKa-p1nF.js} +1 -1
- package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-Dh-LA6pq.js → vennDiagram-T6HMQDX7-LoUNR56o.js} +1 -1
- package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-jBwm-krQ.js → wardleyDiagram-T6FBY63Y-Bqbl6ym7.js} +1 -1
- package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-CFkAWroq.js → xychartDiagram-ELKLHX3M-B8dUg4lf.js} +1 -1
- package/dist/worker/console/static/index.html +2 -2
- package/dist/worker/console/static-src/operator-chat/active-turn-tail.js +10 -0
- package/dist/worker/console/static-src/operator-chat/chat-link.js +94 -0
- package/dist/worker/console/static-src/operator-chat/compaction-message.js +7 -0
- package/dist/worker/console/static-src/operator-chat/turn-process-disclosure.js +10 -0
- package/dist/worker/console/static-src/operator-chat/useChatSessions.js +13 -6
- package/dist/worker/console/static-src/operator-chat/useChatThread.js +2 -4
- package/dist/worker/console/static-src/operator-chat/useComposer.js +13 -4
- package/dist/worker/observe/static/router.js +1 -1
- package/dist/worker/observe/static/views/dag-inspector.js +7 -0
- package/dist/worker/observe/static/views/dag.js +2 -2
- package/package.json +1 -1
- package/dist/worker/console/static/assets/channel-Ln3PalCI.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-BwEIBfqD.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-BwEIBfqD.js +0 -1
- package/dist/worker/console/static/assets/index-Bf7dxfm-.css +0 -1
- package/dist/worker/console/static/assets/index-DHrt_6jk.js +0 -468
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BmOaJuhY.js +0 -1
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-DOCjPMNz.js +0 -8
package/CHANGELOG.md
CHANGED
|
@@ -2,22 +2,33 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.42.1] - 2026-09-09
|
|
6
|
+
|
|
5
7
|
### 新增
|
|
6
8
|
|
|
7
9
|
- Operator Chat 浏览器面板(DSH 风格):Console 右侧辅助栏新增「浏览器」tab——地址栏(自动补 https、仅 http/https、禁止 javascript/data/file 等危险协议与本机回环地址)、后退/前进/刷新导航栈、系统浏览器跳转;页面运行在无 same-origin、无 top-navigation 的沙箱 iframe 中(访问的页面拿不到 Console 的存储与 API),沙箱状态条支持单页面临时解锁(红色警示 + 一键恢复);对拒绝被嵌入的站点(X-Frame-Options / frame-ancestors)给出明确解释面板与「在系统浏览器打开 / 仍要加载」出口,探测端点仅返回响应头、仅限 http(s) 非回环、8 秒硬超时。
|
|
8
10
|
- Operator Chat 源代码管理(DSH 风格):模型获得 `scm` 工具(status/diff/stage/unstage/discard/commit/log/branch/push/pull,固定参数 git 无 shell、限时限量输出);Console 右侧辅助栏新增「源码」面板(DSH GitView 布局——分支下拉切换、已暂存/更改分组与全部暂存/取消暂存、单行提交框 Ctrl+Enter、内联分页历史带 refs 徽标与相对时间、点击文件看 diff、右键菜单放弃更改/复制路径);模型与面板共用同一工作区级 ScmService。
|
|
9
11
|
- Operator Chat 在具备 Aimax 凭据资格时,向对话进程注入 `$AIMAX_AUTH_TOKEN`(明文或 `sm4:v1:` 解密后的 ticket),供 skills 读取;文件缺失、无法解析或解密失败时不注入该变量。
|
|
10
|
-
- Operator Chat 终端管理(DSH 风格):模型获得 `terminal` 持久 PTY 工具(跨平台 shell 目录——Windows 提供 powershell/bash,macOS/Linux 提供 bash/zsh,pwsh 7 装了即用;cwd/环境变量/后台任务跨调用保留,完成标记协议 + 超时与截断保护,枚举与默认值按平台动态生成);Console 右侧辅助栏新增「终端」面板(xterm.js 渲染,实时查看/接管模型的 shell,按平台动态展示可创建的 shell,支持发送输入、Ctrl+C、终止并关闭);模型 shell 与用户面板共用同一会话注册表并开在工作区仓库根目录,命名区分来源。
|
|
12
|
+
- Operator Chat 终端管理(DSH 风格):模型获得 `terminal` 持久 PTY 工具(跨平台 shell 目录——Windows 提供 powershell/bash/cmd,macOS/Linux 提供 bash/zsh,pwsh 7 装了即用;cwd/环境变量/后台任务跨调用保留,完成标记协议 + 超时与截断保护,枚举与默认值按平台动态生成);Console 右侧辅助栏新增「终端」面板(xterm.js 渲染,实时查看/接管模型的 shell,按平台动态展示可创建的 shell,支持发送输入、Ctrl+C、终止并关闭);模型 shell 与用户面板共用同一会话注册表并开在工作区仓库根目录,命名区分来源。
|
|
13
|
+
- Windows 原生 `cmd.exe` 终端体验补全:仅 Windows 平台提供 `cmd` shell,使用经典 `C:\path>` 提示符、cmd 黑底浅灰配色与方块光标,并补回 ConPTY 丢失的 `Microsoft Windows [版本 …]` 启动横幅;bash 与 PowerShell 保持各自原生输出,不注入 Windows 横幅。
|
|
14
|
+
- Operator Chat 详情栏调整:「源码」tab 紧邻「文件」tab,便于在文件预览与源码管理之间快速切换。
|
|
11
15
|
|
|
12
16
|
### 改进
|
|
13
17
|
|
|
18
|
+
- 修复前端设计评审与实施评审遗漏 `complete_review_scope` 工具权限,导致模型无法完成分段确认、最终评审反复被拒绝的问题;补充真实 Pi SDK 工具激活与分段收口回归验证。
|
|
19
|
+
|
|
20
|
+
- 对话正文与 Human Gate、任务活动和产物卡片统一绑定会话所属工作区;修正旧式任务/运行链接,只有操作编号时查询真实记录再定位,工作区冲突或记录缺失时明确提示,避免误入其他工作区或总览。
|
|
21
|
+
|
|
22
|
+
- 节点侧栏在首次原始运行中隐藏「来源与影响」,派生运行保留该入口;打开运行中节点默认定位到「执行记录」,手动选择和明确的链接位置在刷新时保持。
|
|
23
|
+
|
|
14
24
|
- 修复前端契约可选字段未填写时,评审分片索引引用不存在字段、导致设计评审启动前失败的问题。分片生成跳过 undefined;读取端明确拒绝缺失字段、无效引用、重复或非法范围及未索引内容,保留合法空数组和 JSON 空值。
|
|
15
25
|
|
|
16
26
|
- Operator Chat 侧栏「添加工作区」图标改为与 DSH 一致的文件夹加号,不再用纯加号。
|
|
17
27
|
- Operator Chat 侧栏改为单一「新会话」;空白会话在输入框上方用芯片选择工作区和模式(工作流 / Pi),有历史后芯片收起。不再用落地页双卡或「新 Pi」按钮;换模式会复用或新建对应空白会话,不会改已有会话的模式。
|
|
18
28
|
- 修复模型续跑取消后带部分文字仍被标记成功的问题;前端 Plan 的取消、认证、限流及策略失败优先于容量恢复,精确格式错误保留原修复路径。完整性检查按需求建立单次索引,减少大计划重复扫描,同时拆分纯检查与恢复策略模块。
|
|
29
|
+
- 长会话中的输入框不再因历史消息和工具记录增多而逐键重绘整段会话,输入与自动增高在低性能电脑上更流畅。
|
|
19
30
|
- 优化 Operator Chat 长会话的流式渲染:完成回合、消息行、工具卡和用户输入锚点建立稳定的 memo 边界,流式文本更新不再重复渲染整段历史或重装锚点测量监听;缓存会在历史消息或工具实际更新时正确失效;无新增折叠回合时不再提交空状态及重复写入本地存储,工具参数与结果格式化按真实输入变化缓存。
|
|
20
|
-
- 对话页「过程折叠」对齐 DSH
|
|
31
|
+
- 对话页「过程折叠」对齐 DSH 细节:模型回复完成时直接进入折叠态,不再先展开再跳动;折叠摘要、过程内容和最终回答采用与 DSH 一致的间距,折叠内容仍保留在页面中,浏览器 Ctrl+F 可直接命中并自动展开;折叠行展开时不再多出底部空隙;箭头改为 16px、颜色更淡的固定图标(靠旋转而非换图标),并补齐系统「减少动态效果」偏好;汇总文案新增「N 个 subagent」,内置 Explore 子代理不再计入普通工具调用。
|
|
21
32
|
- 恢复前端 Plan 实时事实分页读取、逐需求 UX 遗漏检查与已完成范围复用;超限时补齐剩余验证目标,并接通 DAG 到 SDK 的原会话续跑。局部状态修改保留其他需求的关联,沿用耐久账本、显式替换和冻结分片边界。
|
|
22
33
|
|
|
23
34
|
- DAG 的 Pi SDK 节点遇到 `stopReason=length` 时,先在原会话内最多续跑 3 次,保留已完成写入和事实,成功恢复不消耗额外节点重试次数;共享原超时与上下文预算,已成功提交终态时不重复续跑,耗尽后才进入原有缩片或重试路径。
|
|
@@ -37,11 +48,13 @@
|
|
|
37
48
|
|
|
38
49
|
### 修复
|
|
39
50
|
|
|
51
|
+
- 悬停或打开会话「更多」菜单时,Pi / 工作流徽章与相对时间一并让出,避免被三个点按钮盖住。
|
|
40
52
|
- 修复点「新 Pi」后一发消息侧栏就变成「工作流」:全局会话列表和点进会话时漏了 `sessionMode`,缺省被当成工作流。
|
|
53
|
+
- 修复手动压缩上下文后,长会话会清空并重复绘制大量历史内容的问题;压缩结果现在会直接在当前消息流中更新,不再触发整段会话重载。
|
|
41
54
|
- 修复对话页存在运行活动时,收起状态的右侧辅助栏展开按钮覆盖「运行活动 N」及数字徽标的问题;中大尺寸布局现在保留 8px 操作间距,窄屏布局不变。
|
|
42
55
|
- 修复 Operator Chat 消息流的六处实际使用问题:
|
|
43
56
|
- **回复被吞**:断线/重连(含每 25 秒的 SSE 事件窗口轮转)后,保留事件里已经生成的正文会在事件流恢复时重新应用到对应回合,不再被静默丢弃;仅当该回合已有更新内容时才跳过,避免重复气泡。
|
|
44
|
-
-
|
|
57
|
+
- **用户输入消失或重复**:新消息发送后会在每一帧模型输出中持续显示,不再等回复结束才重新出现;服务端确认后,提交回滚(排队抢占、被拒绝、连接失败)不再删掉已确认的消息;确认帧到达时会原地合并临时消息与会话快照,不再重复显示同一条输入。
|
|
45
58
|
- **回复重复**:上下文溢出自动压缩并重新生成后,被打断的旧回复会被取代,不再与重新生成的回复同时显示。
|
|
46
59
|
- **只有思考没有正文**:模型回复以工具调用或思考结尾时,正文会作为回答显示,不再被折叠进「过程」区。
|
|
47
60
|
- **空气泡误删**:只包含思考或工具内容、正文为空的回合不再被清理掉。
|
package/dist/build-stamp.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"version": "0.43.0-next.
|
|
4
|
-
"gitSha": "
|
|
5
|
-
"builtAt": "2026-09-
|
|
3
|
+
"version": "0.43.0-next.9",
|
|
4
|
+
"gitSha": "d319392d4647c18fee3c3f0f3eeed0ee09df9c1b",
|
|
5
|
+
"builtAt": "2026-09-09T17:28:24.248Z"
|
|
6
6
|
}
|
|
@@ -561,6 +561,7 @@ export function resolveDagPiToolNames(task) {
|
|
|
561
561
|
if (isFrontendReviewTypedTerminalNode(task)) {
|
|
562
562
|
return [
|
|
563
563
|
...DAG_PI_READONLY_TOOLS,
|
|
564
|
+
"complete_review_scope",
|
|
564
565
|
"record_review_finding",
|
|
565
566
|
"approve_review",
|
|
566
567
|
"request_review_changes",
|
|
@@ -569,6 +570,7 @@ export function resolveDagPiToolNames(task) {
|
|
|
569
570
|
if (isFrontendDesignTypedTerminalNode(task)) {
|
|
570
571
|
return [
|
|
571
572
|
...DAG_PI_READONLY_TOOLS,
|
|
573
|
+
"complete_review_scope",
|
|
572
574
|
"record_design_finding",
|
|
573
575
|
"approve_design",
|
|
574
576
|
"request_design_changes",
|
|
@@ -4161,27 +4161,42 @@ export async function handleChatCompact(req, res, deps, sessionId) {
|
|
|
4161
4161
|
});
|
|
4162
4162
|
try {
|
|
4163
4163
|
const snapshot = await deps.runtime.compact(sessionId, customInstructions);
|
|
4164
|
+
const completedAt = new Date().toISOString();
|
|
4165
|
+
const completedData = {
|
|
4166
|
+
schemaVersion: 1,
|
|
4167
|
+
compactionId,
|
|
4168
|
+
reason: "manual",
|
|
4169
|
+
status: "completed",
|
|
4170
|
+
summary: snapshot.summary,
|
|
4171
|
+
...(snapshot.firstKeptEntryId
|
|
4172
|
+
? { firstKeptEntryId: snapshot.firstKeptEntryId }
|
|
4173
|
+
: {}),
|
|
4174
|
+
...(snapshot.tokensBefore === undefined
|
|
4175
|
+
? {}
|
|
4176
|
+
: { tokensBefore: snapshot.tokensBefore }),
|
|
4177
|
+
...(snapshot.estimatedTokensAfter === undefined
|
|
4178
|
+
? {}
|
|
4179
|
+
: { estimatedTokensAfter: snapshot.estimatedTokensAfter }),
|
|
4180
|
+
willRetry: false,
|
|
4181
|
+
};
|
|
4164
4182
|
const event = deps.events.append(sessionId, turnId, {
|
|
4165
4183
|
kind: "compaction_end",
|
|
4166
|
-
|
|
4167
|
-
|
|
4168
|
-
|
|
4169
|
-
|
|
4170
|
-
|
|
4171
|
-
|
|
4172
|
-
|
|
4173
|
-
|
|
4174
|
-
|
|
4175
|
-
|
|
4176
|
-
|
|
4177
|
-
|
|
4178
|
-
|
|
4179
|
-
|
|
4180
|
-
: { estimatedTokensAfter: snapshot.estimatedTokensAfter }),
|
|
4181
|
-
willRetry: false,
|
|
4184
|
+
at: completedAt,
|
|
4185
|
+
data: completedData,
|
|
4186
|
+
});
|
|
4187
|
+
sendJson(res, 200, {
|
|
4188
|
+
ok: true,
|
|
4189
|
+
snapshot,
|
|
4190
|
+
eventId: event.eventId,
|
|
4191
|
+
compaction: {
|
|
4192
|
+
eventId: event.eventId,
|
|
4193
|
+
kind: "compaction_end",
|
|
4194
|
+
at: completedAt,
|
|
4195
|
+
seq: event.seq,
|
|
4196
|
+
turnId,
|
|
4197
|
+
data: completedData,
|
|
4182
4198
|
},
|
|
4183
4199
|
});
|
|
4184
|
-
sendJson(res, 200, { ok: true, snapshot, eventId: event.eventId });
|
|
4185
4200
|
}
|
|
4186
4201
|
catch (error) {
|
|
4187
4202
|
const classified = classifyChatCompactionFailure(error);
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
import { spawn as ptySpawn } from "node-pty";
|
|
17
17
|
import { existsSync } from "node:fs";
|
|
18
18
|
import { randomBytes } from "node:crypto";
|
|
19
|
+
import { release as osRelease } from "node:os";
|
|
19
20
|
/** Bounded ring buffer of raw output chunks (bytes preserved as utf8 text). */
|
|
20
21
|
const MAX_BUFFER_CHARS = 200_000;
|
|
21
22
|
export class TerminalSessionError extends Error {
|
|
@@ -97,6 +98,51 @@ function resolveZsh() {
|
|
|
97
98
|
const file = firstExisting(["/bin/zsh", "/usr/bin/zsh", "/usr/local/bin/zsh", "/opt/homebrew/bin/zsh"]);
|
|
98
99
|
return file ? { file, args: ["-i"] } : undefined;
|
|
99
100
|
}
|
|
101
|
+
/** Windows `cmd.exe`. Always present on Windows; offered alongside
|
|
102
|
+
* PowerShell so users can use native Windows tooling (`dir`, `where`,
|
|
103
|
+
* `mklink`, `net user`, etc.) without leaving the terminal panel.
|
|
104
|
+
* - `/Q` turns off command echo (otherwise cmd echoes every input line,
|
|
105
|
+
* doubling every prompt in PTY output).
|
|
106
|
+
* - `/D` disables AutoRun execution from the registry (avoid running the
|
|
107
|
+
* user's HKCU\...\RunOnce / autorun scripts on every fresh shell).
|
|
108
|
+
* - `/K "prompt $P$G"` keeps the shell alive across tool calls (cwd/env
|
|
109
|
+
* survive) and uses the classic cmd prompt `C:\path>` instead of the
|
|
110
|
+
* bare `>`, so the user can see the working directory at a glance —
|
|
111
|
+
* matching the default `cmd.exe` window. */
|
|
112
|
+
function resolveCmd() {
|
|
113
|
+
if (!IS_WINDOWS)
|
|
114
|
+
return undefined;
|
|
115
|
+
const file = firstExisting([
|
|
116
|
+
"C:\\Windows\\System32\\cmd.exe",
|
|
117
|
+
// Wine / uncommon layouts
|
|
118
|
+
"C:\\Windows\\Sysnative\\cmd.exe",
|
|
119
|
+
]);
|
|
120
|
+
if (!file)
|
|
121
|
+
return undefined;
|
|
122
|
+
return {
|
|
123
|
+
file,
|
|
124
|
+
args: ["/Q", "/D", "/K", "prompt $P$G"],
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/** Synthesize the cmd.exe startup banner that node-pty drops. cmd prints
|
|
128
|
+
* `Microsoft Windows [版本 10.0.26200]\n(c) Microsoft Corporation。保留所有权利。`
|
|
129
|
+
* via `WriteConsole` BEFORE ConPTY attaches to its stdio handles, so
|
|
130
|
+
* node-pty / ConPTY never sees those writes. We re-emit an equivalent
|
|
131
|
+
* banner using `os.release()` (kernel build, e.g. "10.0.26200") so the
|
|
132
|
+
* console terminal looks like a real cmd window. The leading \r\n avoids
|
|
133
|
+
* the banner colliding with whatever ANSI preamble ConPTY already sent.
|
|
134
|
+
*
|
|
135
|
+
* Only meaningful for the cmd shell — bash and PowerShell on Windows have
|
|
136
|
+
* their own startup output that we must NOT paper over with a Windows
|
|
137
|
+
* banner they don't print. */
|
|
138
|
+
function makeCmdBanner(shell) {
|
|
139
|
+
if (!IS_WINDOWS)
|
|
140
|
+
return undefined;
|
|
141
|
+
if (shell !== "cmd")
|
|
142
|
+
return undefined;
|
|
143
|
+
const build = osRelease();
|
|
144
|
+
return `\r\nMicrosoft Windows [版本 ${build}]\r\n(c) Microsoft Corporation。保留所有权利。\r\n\r\n`;
|
|
145
|
+
}
|
|
100
146
|
let cachedCatalog;
|
|
101
147
|
/** Platform shell catalog, computed once per process. Drives both the UI
|
|
102
148
|
* button set and the model tool's shell parameter enum. */
|
|
@@ -113,6 +159,9 @@ export function availableShellKinds() {
|
|
|
113
159
|
const zsh = resolveZsh();
|
|
114
160
|
if (zsh)
|
|
115
161
|
resolved.set("zsh", zsh);
|
|
162
|
+
const cmd = resolveCmd();
|
|
163
|
+
if (cmd)
|
|
164
|
+
resolved.set("cmd", cmd);
|
|
116
165
|
cachedCatalog = { kinds: [...resolved.keys()], resolved };
|
|
117
166
|
return cachedCatalog;
|
|
118
167
|
}
|
|
@@ -165,10 +214,18 @@ export class TerminalSessionRegistry {
|
|
|
165
214
|
bufferChars: 0,
|
|
166
215
|
subscribers: new Set(),
|
|
167
216
|
disposing: undefined,
|
|
217
|
+
pendingBanner: makeCmdBanner(options.shell) ?? undefined,
|
|
168
218
|
};
|
|
169
219
|
this.entries.set(sessionId, entry);
|
|
170
220
|
pty.onData((chunk) => {
|
|
171
221
|
entry.info.totalOutputChars += chunk.length;
|
|
222
|
+
// Inject the synthesized cmd banner into the FIRST chunk the
|
|
223
|
+
// subscribers see, so SSE/streaming attaches still see it even
|
|
224
|
+
// though node-pty already missed cmd's real banner.
|
|
225
|
+
if (entry.pendingBanner !== undefined) {
|
|
226
|
+
chunk = entry.pendingBanner + chunk;
|
|
227
|
+
entry.pendingBanner = undefined;
|
|
228
|
+
}
|
|
172
229
|
entry.buffer.push(chunk);
|
|
173
230
|
entry.bufferChars += chunk.length;
|
|
174
231
|
while (entry.bufferChars > MAX_BUFFER_CHARS && entry.buffer.length > 1) {
|
|
@@ -219,8 +276,15 @@ export class TerminalSessionRegistry {
|
|
|
219
276
|
/** Full buffered output (post-trim prefix may be incomplete). */
|
|
220
277
|
readAll(sessionId) {
|
|
221
278
|
const entry = this.mustGet(sessionId);
|
|
279
|
+
let text = entry.buffer.join("");
|
|
280
|
+
// If the caller reads before any real PTY output has arrived, the
|
|
281
|
+
// banner injection in onData hasn't fired yet — fold it in here.
|
|
282
|
+
if (entry.pendingBanner !== undefined) {
|
|
283
|
+
text = entry.pendingBanner + text;
|
|
284
|
+
entry.pendingBanner = undefined;
|
|
285
|
+
}
|
|
222
286
|
return {
|
|
223
|
-
text
|
|
287
|
+
text,
|
|
224
288
|
truncated: entry.info.totalOutputChars > entry.bufferChars,
|
|
225
289
|
totalOutputChars: entry.info.totalOutputChars,
|
|
226
290
|
};
|
|
@@ -48,10 +48,16 @@ export async function buildPersistentTerminalTools(deps) {
|
|
|
48
48
|
const marker = `${MARKER_PREFIX}${Date.now().toString(36)}${Math.random()
|
|
49
49
|
.toString(36)
|
|
50
50
|
.slice(2, 8)}`;
|
|
51
|
-
// Exit-code echo
|
|
51
|
+
// Exit-code echo per shell:
|
|
52
|
+
// - PowerShell: $LASTEXITCODE
|
|
53
|
+
// - bash / zsh: $?
|
|
54
|
+
// - cmd.exe: %ERRORLEVEL% (interpolation happens before echo runs,
|
|
55
|
+
// so we use `prompt` substitution style `echo MARKER:%ERRORLEVEL%`).
|
|
52
56
|
const exitEcho = kind === "powershell"
|
|
53
57
|
? `Write-Host "${marker}:$LASTEXITCODE"`
|
|
54
|
-
:
|
|
58
|
+
: kind === "cmd"
|
|
59
|
+
? `echo ${marker}:%ERRORLEVEL%`
|
|
60
|
+
: `echo "${marker}:$?"`;
|
|
55
61
|
const wrapped = `${command}\n${exitEcho}\n`;
|
|
56
62
|
// Capture output from the moment of send until the marker line shows up.
|
|
57
63
|
const pending = [];
|
|
@@ -122,15 +128,21 @@ export async function buildPersistentTerminalTools(deps) {
|
|
|
122
128
|
});
|
|
123
129
|
};
|
|
124
130
|
const kinds = availableShellKinds().kinds;
|
|
131
|
+
// Default precedence: bash (most posix-feel for cross-platform models) →
|
|
132
|
+
// cmd (native Windows shell, offered when bash is absent) → zsh (macOS
|
|
133
|
+
// default on some dev boxes) → powershell (universal Windows fallback).
|
|
125
134
|
const defaultKind = kinds.includes("bash")
|
|
126
135
|
? "bash"
|
|
127
|
-
: kinds.includes("
|
|
128
|
-
? "
|
|
129
|
-
: "
|
|
136
|
+
: kinds.includes("cmd")
|
|
137
|
+
? "cmd"
|
|
138
|
+
: kinds.includes("zsh")
|
|
139
|
+
? "zsh"
|
|
140
|
+
: "powershell";
|
|
130
141
|
const kindLabels = {
|
|
131
142
|
powershell: "PowerShell",
|
|
132
143
|
bash: "bash",
|
|
133
144
|
zsh: "zsh",
|
|
145
|
+
cmd: "cmd",
|
|
134
146
|
};
|
|
135
147
|
const tool = defineTool({
|
|
136
148
|
name: "terminal",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-
|
|
1
|
+
import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-Dwd6r-SF.js";import{p as f}from"./chunk-JWPE2WC7-CuGp0DeE.js";import{_ as n,l as o}from"./mermaid.core-p2l8IrWY.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-BdXcxtlb.js";import"./index-24jp3aBh.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),l=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:l,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},B={parser:R,db:a,renderer:u,styles:p};export{B as diagram};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-
|
|
1
|
+
import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-p2l8IrWY.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,z,a){var O=I-l,i=D-h,n=z-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function U(l,h,I,D,v,A,z){var a=l-I,O=h-D,i=(z?A:-A)/J(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,B=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*J(on(0,T*T*R-P*P)),Y=(P*g-m*S)/R,$=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=Y-B,e=$-t,r=w-B,C=p-t;return x*x+e*e>r*r+C*C&&(Y=w,$=p),{cx:Y,cy:$,x01:-n,y01:-d,x11:Y*(v/T-1),y11:$*(v/T-1)}}function hn(){var l=cn,h=yn,I=j(0),D=null,v=gn,A=dn,z=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,B=rn(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(B>tn-y)a.moveTo(s*F(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*F(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=B,S=B,Y=z.apply(this,arguments)/2,$=Y>y&&(D?+D.apply(this,arguments):J(u*u+s*s)),w=_(rn(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if($>y){var C=sn($/u*q(Y)),K=sn($/s*q(Y));(P-=C*2)>y?(C*=t?1:-1,R+=C,T-=C):(P=0,R=T=(f+c)/2),(S-=K*2)>y?(K*=t?1:-1,m+=K,g-=K):(S=0,m=g=(f+c)/2)}var G=s*F(m),H=s*q(m),L=u*F(T),M=u*q(T);if(w>y){var N=s*F(g),Q=s*q(g),V=u*F(R),W=u*q(R),E;if(B<an)if(E=pn(G,H,V,W,N,Q,L,M)){var X=G-E[0],Z=H-E[1],b=N-E[0],k=Q-E[1],nn=1/q(fn((X*b+Z*k)/(J(X*X+Z*Z)*J(b*b+k*k)))/2),en=J(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=U(V,W,G,H,s,x,t),r=U(N,Q,L,M,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(G,H),a.arc(0,0,s,m,g,!t)):a.moveTo(G,H),!(u>y)||!(P>y)?a.lineTo(L,M):p>y?(e=U(L,M,N,Q,u,-p,t),r=U(G,H,V,W,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[F(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:j(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:j(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:j(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:j(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:j(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:j(+n),i):A},i.padAngle=function(n){return arguments.length?(z=typeof n=="function"?n:j(+n),i):z},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
|