@tea-agent/loop-agent 0.40.0 → 0.41.0-next.1

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.
Files changed (73) hide show
  1. package/CHANGELOG.md +16 -7
  2. package/dist/build-stamp.json +3 -3
  3. package/dist/worker/console/chat/pi-runtime.js +3 -2
  4. package/dist/worker/console/chat/semantic-activity.js +12 -11
  5. package/dist/worker/console/chat/turn-process.js +18 -2
  6. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-Dy71QJp3.js → abnfDiagram-N423BO3Z-CV1qyRbn.js} +1 -1
  7. package/dist/worker/console/static/assets/{arc-M25fNMTE.js → arc-B_ljC4ma.js} +1 -1
  8. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-CUWlVl1a.js → architectureDiagram-T3A2C74G-DTBqsauL.js} +1 -1
  9. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-Dd0Whpx2.js → blockDiagram-VBNYF7ZC-CMZj6nYE.js} +1 -1
  10. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-BdfeCkI5.js → c4Diagram-5PPSVZJV-C4ey_S7v.js} +1 -1
  11. package/dist/worker/console/static/assets/channel-BvYm_83n.js +1 -0
  12. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-D_1sUkyD.js → chunk-2GRJ4B5K-CGcAlY6Z.js} +1 -1
  13. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-Cxnxf36E.js → chunk-2Q5K7J3B-XRSM64J1.js} +1 -1
  14. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-D9RG3G_x.js → chunk-5RXB4S5H-COSIFYbz.js} +1 -1
  15. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-Zz9jgjLX.js → chunk-5VM5RSS4-BwuaXiOK.js} +1 -1
  16. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-BCggDRCH.js → chunk-6Q2QTUOP-DNbFuVlv.js} +1 -1
  17. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-CFg-5iAS.js → chunk-GF5L2VYU-C4DZKffE.js} +1 -1
  18. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-DRQTE8x_.js → chunk-JWPE2WC7-M3A6iczx.js} +1 -1
  19. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-C_Dw7uZ8.js → chunk-KBJHAD2P-C5zDzQEM.js} +1 -1
  20. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-BjIiApsk.js → chunk-RYQCIY6F-uAcUDub8.js} +1 -1
  21. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-B5XQD4KG.js → chunk-XXDRQBXY-EPpz2uSP.js} +1 -1
  22. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-BNdy3f9F.js +1 -0
  23. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-BNdy3f9F.js +1 -0
  24. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-huHqH6WQ.js → cose-bilkent-JH36ORCC-BAkfFGTf.js} +1 -1
  25. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-BSi6yZqP.js → cynefin-VYW2F7L2-Cjb4d22A.js} +1 -1
  26. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-Bs_Jp31y.js → cynefinDiagram-MW4NZA55-Cf7QSgcu.js} +1 -1
  27. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-CYxavikT.js → dagre-VZM6K2ZE-UlyVBCtl.js} +1 -1
  28. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-B6TErl71.js → diagram-7IWD3JNH-DWdRAZ8p.js} +1 -1
  29. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-CvH4J2ii.js → diagram-B4RE2ZJO-Y2ag2Pm0.js} +1 -1
  30. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-v1NBAqXS.js → diagram-LBJQPF4R-DBHcuPXI.js} +1 -1
  31. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-CUNHVAn2.js → diagram-Q27KOJAE-BK7eno2C.js} +1 -1
  32. package/dist/worker/console/static/assets/{diagram-UB23O5K3-Dzz1gUu-.js → diagram-UB23O5K3-Dbyku82r.js} +1 -1
  33. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-CCF8_LjK.js → ebnfDiagram-BXEA7PRR--rS0Q41A.js} +1 -1
  34. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-DObdPVLa.js → erDiagram-JOGREHBK-Cms8pJeK.js} +1 -1
  35. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-DlN8Pxrj.js → flowDiagram-UKHOOZJN-DouONwBy.js} +1 -1
  36. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-BJKIPTGX.js → ganttDiagram-PKOTCBZU-DuKB5yDe.js} +1 -1
  37. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-XcSSnObi.js → gitGraphDiagram-DS77QQ5N-DE6zp0SI.js} +1 -1
  38. package/dist/worker/console/static/assets/{index-CS3QOTfl.js → index-C39zQYik.js} +82 -82
  39. package/dist/worker/console/static/assets/{index-CIYzS16i.css → index-Crixt9tN.css} +1 -1
  40. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-BKrRKMww.js → infoDiagram-6WML65LV-BLETv9SH.js} +1 -1
  41. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-CN5dk-yb.js → ishikawaDiagram-WSZJBQD7-DyU-2lJb.js} +1 -1
  42. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-B4P4KZ-Y.js → journeyDiagram-NVQOT4AX-BotFSygt.js} +1 -1
  43. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-BRlteP32.js → kanban-definition-27J2QSJJ-CqcAMgVk.js} +1 -1
  44. package/dist/worker/console/static/assets/{linear-CG8D9fuL.js → linear-Bf4U8h5G.js} +1 -1
  45. package/dist/worker/console/static/assets/{mermaid.core-BuB6P2rX.js → mermaid.core-D0JEVefG.js} +5 -5
  46. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-DYXGl_DR.js → mindmap-definition-FAOFIHXS-DEFgNgOo.js} +1 -1
  47. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-BM48yEVG.js → pegDiagram-VL7TDLO6-CirKhxo1.js} +1 -1
  48. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-mT8NL-Ow.js → pieDiagram-7S7Q4E2Y-BlaQYInF.js} +1 -1
  49. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-C4pZ6DH_.js → quadrantDiagram-CIZ2JOQS-BbyzqH4U.js} +1 -1
  50. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-BKAcr70m.js → railroadDiagram-AXF67PYL-qA-XykV6.js} +1 -1
  51. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-CRxcKpoO.js → requirementDiagram-LRYGKXZP-Cc85Zcxc.js} +1 -1
  52. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-Ds4LxQDI.js → sankeyDiagram-W5VNT64P-CS7BVnoH.js} +1 -1
  53. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-CPLwPf_p.js → sequenceDiagram-SI44F4Z6-DMQ-kKmZ.js} +1 -1
  54. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-CL65uij0.js → sizeCapture-X5ZJPWSS-DXKs1dcE.js} +1 -1
  55. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-CO0Mgd1W.js → stateDiagram-OKZ733FA-xG1ti87X.js} +1 -1
  56. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-tYINJZ8x.js +1 -0
  57. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-Cxv3TSNw.js → swimlanes-SLNWSIFB-BQwmKGHd.js} +2 -2
  58. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-OoBOXPiG.js +8 -0
  59. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-Dw85f9L2.js → timeline-definition-Z64GVDOM-BwL9oHtP.js} +1 -1
  60. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-B4QLCqCy.js → vennDiagram-T6HMQDX7-BWk-i_Y1.js} +1 -1
  61. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-B_yKCWwn.js → wardleyDiagram-T6FBY63Y-DAvETpEZ.js} +1 -1
  62. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-nniBEGv2.js → xychartDiagram-ELKLHX3M-Cd4pASnF.js} +1 -1
  63. package/dist/worker/console/static/index.html +2 -2
  64. package/dist/worker/console/static-src/app/useRunProgress.js +9 -2
  65. package/dist/worker/console/static-src/operator-chat/dag-progress-link.js +22 -0
  66. package/dist/worker/console/static-src/pages/tasks/run-panel-progress.js +106 -0
  67. package/dist/worker/observability/read-model.js +4 -0
  68. package/package.json +1 -1
  69. package/dist/worker/console/static/assets/channel-Ba0AKiEZ.js +0 -1
  70. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-BU3IjVEe.js +0 -1
  71. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-BU3IjVEe.js +0 -1
  72. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BUewAVYS.js +0 -1
  73. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-Bhe67Wjl.js +0 -8
package/CHANGELOG.md CHANGED
@@ -2,19 +2,28 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ - 对话中的长时间 DAG 执行现在会保留一条实时状态:持续显示总运行时间、当前阶段、完成步数和最近一次有效进展;重复等待不再堆叠,点击状态可以直接查看对应 DAG。模型仍会在阶段变化、重要发现、失败恢复和结束时,用自然语言说明刚完成什么、下一步做什么。
6
+
5
7
  ## [0.40.0] - 2026-08-31
6
8
 
7
- ### 新增
9
+ ### 重点更新
8
10
 
9
- - 新增了本发布周期内已经完成并通过验证的功能。
11
+ - **Console 对话页「轨迹」视图**:仿 DSH ui-trajectory 把对话按「用户 → 过程 → AI 回复」渲染为统一单元格列表,每行带类型标签与图标,思考/工具/超长消息可展开收起,支持一键导出自包含 HTML。轨迹顶部新增「会话注入」区,展示真实注入 Pi 会话的系统提示词全文(含字符数与注入上下文 suffix)与模型可见工具目录,离线导出同样包含;每轮新增遥测头行(步骤数、LLM 时长、首 token 延迟、解码吞吐、工具调用数与耗时、上下行 token 与成本),切换历史会话立即显示。同时修复刷新后工具耗时全部变成 0ms/消失(会话恢复现在回填每次工具调用的真实起止时间)、窄窗口耗时列被整体隐藏、展开后内容仍截断在 420 字符、多工作区下轨迹数据恒为空等问题。
12
+ - **上下文压力处理默认开启**:Operator Chat 与 DAG Pi 节点在发送前接近模型窗口时主动压缩一次、识别网关「请求上下文过大」响应后压缩并继续原请求、对 OpenAI 格式的大工具输出做线路压缩;消息流按顺序展示触发原因、压缩进度与结果。Anthropic 缺省 prompt cache 形态保持 no-op 不破坏缓存;`HARNESS_CONTEXT_PRESSURE_MODE` / `HARNESS_CONSOLE_SIFT` / `HARNESS_DAG_SIFT` 可整体或分路关闭;可选依赖 `@agent-context/sift@0.0.1-alpha.6` 精确 pin,不投影 init。
13
+ - **Console「Pi 插件」管理**:从「设置」提升为与「设置」同级的独立 tab,内置经 npm 校验的插件目录(6303 个,展示 5562 个可安装、含中文说明),支持搜索、每页条数、分页与一键安装/卸载;插件版本改为从 npm 配置的仓库地址拉取(内网镜像可用),安装时提供版本下拉、默认装最新,已安装插件显示实际版本,`@version` 形式的已装包也能正确识别;进度动画改为 JS 驱动,不受系统「减少动态效果」影响。
14
+ - **Operator Chat 持续目标模式**:用 `/goal` 或输入框上方的目标条创建跨多回合推进的目标,可随时暂停、继续、编辑或清除;长任务在安全轮数内自动续行,优先处理排队消息;上下文压缩后当前目标自动回到模型上下文;刷新后仍可见,重启 Console 不会未经确认自行续跑。配套新增任务清单与结构化提问卡片,长任务进度与需要用户决策的内容更易理解。
15
+ - **多工作区与消息流重构**:同一页面管理多个工作区,会话稳定归属创建它的工作区,会话列表改为独立全局目录(移除工作区不丢会话);消息流整体更紧凑,思考、工具执行、阶段性结果与最终回答按真实发生顺序展示;对话进行中可连续提交多条消息(编辑/删除/立即插入),排队消息由输入框上方队列面板统一管理;右侧辅助栏统一承载文件、上下文、调用记录、运行活动与当前 DAG,宽度可调。
16
+ - **CLI 可用性修复**:`--help` 现在直接显示真实 usage(此前 raw-args 命令只在解析出错时才抛出):`task advance` / `task status` / `task source prepare` 与 `dag resume|doctor|report|rerun|...` 的帮助顶部即列出完整参数契约;`task source prepare`(确定性任务源投影)从不可达死代码转正为可用子命令。
17
+ - **backend-test 执行与判定系列修复**:pytest 7.x 环境改用 run-owned Python launcher 精确执行已授权 items(不再把 `@<targets-file>` 当普通路径导致全部无法执行);payload readiness 修复空值标记误判 UNSAFE、本地 transport payload 假阴性、同模块安全 payload helper 绑定、`\u0020` 空白表示误判、超长边界 observed 持久化等系列假阳/假阴性;Scenario Partition 的 exact slot 清单正确下发 Markdown writer(普通别名不再替代 partition slots)、补集槽位合同统一;payload/fixture/Markdown→pytest 多类缺陷合并进唯一一次有界 repair;文档审计不再扫描 `.scratch/` 临时证据阻断发布前验证。
10
18
 
11
19
  ### 改进
12
20
 
13
- - 完善了日常使用体验和运行稳定性。
14
-
15
- ### 修复
16
-
17
- - 修复了影响使用体验或运行稳定性的问题。
21
+ - 初始化选择模型时识别公司内部 `wizard-local` 的 AICoder 型号梯度(default/plus/pro/max),作为 LOW/MED/HIGH 参考但不机械分档。
22
+ - 右侧文件工作台打开 HTML 默认沙箱预览(同项目相对资源可用、脚本与外部网络阻断),超大源码显示前 512 KiB 并明确提示截断。
23
+ - 工作区列表支持拖动排序并自动保存;多个 Console 同时运行时安全合并工作区增删并实时同步。
24
+ - 设置页用自然中文展示模型状态;DAG 检查器简化节点说明与提示词重启面板,长内容更易定位。
25
+ - 输入框整合模型与推理等级选择,只展示有真实数据的轮次、耗时、速度与缓存统计。
26
+ - 修复 Console「更新并初始化」被观测顶栏遮挡(入口改到操作 → 设置)、内嵌观测样式泄漏与「提示词重启」入口丢失、宽表格/窄屏多处显示异常、部分 Windows 偶发读取失败等。
18
27
 
19
28
  ## [0.39.3] - 2026-08-28
20
29
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "0.40.0",
4
- "gitSha": "0d5709685941d99bb7d5870be034691e28a55b78",
5
- "builtAt": "2026-08-31T00:50:21.960Z"
3
+ "version": "0.41.0-next.1",
4
+ "gitSha": "082093199826919c9699608265a26e4840207421",
5
+ "builtAt": "2026-08-31T02:28:34.598Z"
6
6
  }
@@ -67,10 +67,11 @@ export const OPERATOR_CHAT_SYSTEM_PROMPT_BASE = [
67
67
  "You are General Operator Chat.",
68
68
  "Use operator tools first (dagReport, dagRerunPlan, dagRerun). Pi read/write/edit/bash/grep/find/ls are available; obey repository AGENTS.md. apply_patch, full-tools, shell and coding-chat are denied. Prefer safe-read/safe-grep for probes.",
69
69
  "No harness and asked to init: `loop-agent init instructions --repo-root .`, then `loop-agent init --repo-root . --profile full --merge`; verify with doctor, inspect and docs audit. Updates: `loop-agent init upgrade --repo-root . --json` until stable; `loop-agent init check-update` is read-only.",
70
- "Long DAGs: prepareDagExecution → runDag → operationId. Never foreground-Bash task advance, tail/head pipes or nohup/Start-Process/start; do not end on accepted/queued/running or an operationId — NOT completion. Supervise operationGet/status/dagReport/dagDoctor/operationWait with 60s → 90s → 120s → 180s backoff; reset to 60s on state change; 30-60s re-checks when stall suspected. Every operationWait continuation MUST use afterSeq=previous nextSeq (recommendedNextCall); never reuse older cursors. Heartbeats: not meaningful progress. Run id 20260829-slug ≠ task id 2026-08-29-slug.",
71
- "On failure consume terminal runSummary first. If progress exists, wait; else dagReport then dagRerunPlan(fromNode=primaryFailure.nodeId); eligible → dagRerun (node rerun only: reruns the failed subgraph, keeps prior successes). If plan ineligible (unsafe-shell subgraph, binding/workspace drift): Worker Failed → workerTaskRetry; standalone → standaloneTaskRerun after contract adopt (regenerates the whole task, not node continue). Do not call dagResume. Run-failed task without open gate is terminal: do not re-advance a run-failed task. Before run start, two identical lifecycleState/blocker/revision/DAG-hash observations mean no progress: stop and report after one bounded probe; never loop identical bash/read/grep. Auto-approve only bounded writeSet inside allowedPaths, outside forbiddenPaths, with structured verification.",
70
+ "Long DAGs: prepareDagExecution → runDag → operationId. Never foreground-Bash task advance, tail/head pipes or nohup/Start-Process/start; do not end on accepted/queued/running or an operationId — NOT completion. Supervise operationGet/status/dagReport/dagDoctor/operationWait at 60s → 90s → 120s → 180s; reset to 60s on state change; 30-60s re-checks when stall suspected. operationWait MUST use afterSeq=previous nextSeq (recommendedNextCall). Heartbeats: not meaningful progress. Run id ≠ task id.",
71
+ "Failure: terminal runSummary first. With progress wait; else dagRerunPlan(fromNode=primaryFailure.nodeId); eligible → dagRerun: reruns the failed subgraph, keeps prior successes. Ineligible: Worker → workerTaskRetry; standalone → standaloneTaskRerun after contract adopt (regenerates the whole task, not node continue). Do not call dagResume; do not re-advance a run-failed task. Pre-run identical state twice: stop and report; never loop identical bash/read/grep. Approve only bounded writeSet inside allowedPaths, outside forbiddenPaths, with structured verification.",
72
72
  "Iterate toward the goal in bounded rounds: first summarize the previous round's error in one line, fix its root cause — not the symptom — then rerun the failed node with a fresh plan. Never resubmit an unchanged fix; after two rounds failing the same way, stop and report evidence and remaining routes.",
73
73
  "Continue until success, user stop, or no safe recovery remains; then stop and report failure/evidence. Never create a new task for a transient failure or replace repair-pi with direct edits.",
74
+ "Narrate long-DAG progress briefly at start, meaningful phase changes/findings, verification failure/recovery, prolonged quiet and terminal state: say what finished and what is next. Never narrate unchanged operationWait polls or heartbeats, or claim beyond structured facts.",
74
75
  ].join("\n");
75
76
  /** Compose the inspectable system prompt actually injected into Operator Chat. */
76
77
  export function composeOperatorChatSystemPrompt(input) {
@@ -296,13 +296,6 @@ function operationIdFromArgs(args) {
296
296
  const operationId = record?.operationId;
297
297
  return typeof operationId === "string" && operationId ? operationId : undefined;
298
298
  }
299
- function maxWaitSeconds(args) {
300
- const record = parseJsonRecord(args);
301
- const raw = record?.maxWaitMs;
302
- if (typeof raw !== "number" || !Number.isFinite(raw) || raw <= 0)
303
- return undefined;
304
- return Math.max(1, Math.round(raw / 1000));
305
- }
306
299
  function activityRefForTool(tool) {
307
300
  // Plan A (2026-08-16): server backfills operationId on the persisted tool
308
301
  // entry (and live tool_result frames carry it in the result payload), so
@@ -313,6 +306,17 @@ function activityRefForTool(tool) {
313
306
  operationIdFromArgs(tool.resultText);
314
307
  return operationId ? `operation:${operationId}` : `tool:${tool.id}`;
315
308
  }
309
+ export function dagProgressActivityForTool(tool) {
310
+ if (tool.toolName !== "operationWait")
311
+ return undefined;
312
+ const activityRef = activityRefForTool(tool);
313
+ if (!activityRef.startsWith("operation:"))
314
+ return undefined;
315
+ return {
316
+ id: `dag-progress:${activityRef}`,
317
+ activityRef,
318
+ };
319
+ }
316
320
  function semanticKindForStatus(status) {
317
321
  if (status === "running")
318
322
  return "progress";
@@ -377,14 +381,11 @@ function nodeActivityFromMessages(messages, id, activityRef) {
377
381
  function operationWaitActivity(tool) {
378
382
  const activityRef = activityRefForTool(tool);
379
383
  const id = `activity:${tool.id}`;
380
- const seconds = maxWaitSeconds(tool.args);
381
384
  if (tool.status === "running") {
382
385
  return {
383
386
  id,
384
387
  kind: "progress",
385
- title: seconds
386
- ? `正在等待新的执行进展,最长等待时间 ${seconds} 秒`
387
- : "正在等待新的执行进展",
388
+ title: "正在等待新的执行进展",
388
389
  activityRef,
389
390
  };
390
391
  }
@@ -2,7 +2,7 @@
2
2
  * Turn grouping for Operator Chat inline process UX (pi-web ProcessDetails mind).
3
3
  */
4
4
  import { getDisplayableAssistantBlocks, joinAssistantText, parseAssistantContent, splitFinalAssistantBlocks, } from "./assistant-content.js";
5
- import { semanticActivityForTool, } from "./semantic-activity.js";
5
+ import { dagProgressActivityForTool, semanticActivityForTool, } from "./semantic-activity.js";
6
6
  function emptyGroup(key) {
7
7
  return {
8
8
  key,
@@ -126,6 +126,11 @@ function flushToolBuffer(processItems, buffer) {
126
126
  return;
127
127
  const sorted = sortToolsStable(buffer);
128
128
  for (const tool of sorted) {
129
+ const dagProgress = dagProgressActivityForTool(tool);
130
+ if (dagProgress) {
131
+ processItems.push({ kind: "dag-progress", progress: dagProgress });
132
+ continue;
133
+ }
129
134
  const activity = semanticActivityForTool(tool);
130
135
  if (activity) {
131
136
  processItems.push({ kind: "activity", activity });
@@ -135,6 +140,17 @@ function flushToolBuffer(processItems, buffer) {
135
140
  }
136
141
  }
137
142
  }
143
+ function collapseDagProgressItems(items) {
144
+ const seen = new Set();
145
+ return items.filter((item) => {
146
+ if (item.kind !== "dag-progress")
147
+ return true;
148
+ if (seen.has(item.progress.activityRef))
149
+ return false;
150
+ seen.add(item.progress.activityRef);
151
+ return true;
152
+ });
153
+ }
138
154
  function emitProcessBlocks(blocks, group, processItems, usedToolIds) {
139
155
  let buffer = [];
140
156
  for (const block of blocks) {
@@ -209,7 +225,7 @@ function fillProcessDetails(group) {
209
225
  const orphans = group.tools.filter((tool) => !usedToolIds.has(tool.id));
210
226
  if (orphans.length > 0)
211
227
  flushToolBuffer(processItems, orphans);
212
- group.processItems = processItems;
228
+ group.processItems = collapseDagProgressItems(processItems);
213
229
  if (!finalAssistant)
214
230
  return;
215
231
  if (blocks.length === 0) {
@@ -1 +1 @@
1
- import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-BCggDRCH.js";import{p as f}from"./chunk-JWPE2WC7-DRQTE8x_.js";import{_ as n,l as o}from"./mermaid.core-BuB6P2rX.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-BSi6yZqP.js";import"./index-CS3QOTfl.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
+ import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-DNbFuVlv.js";import{p as f}from"./chunk-JWPE2WC7-M3A6iczx.js";import{_ as n,l as o}from"./mermaid.core-D0JEVefG.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-Cjb4d22A.js";import"./index-C39zQYik.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-BuB6P2rX.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};
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-D0JEVefG.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};