@tea-agent/loop-agent 0.35.4-beta.0 → 0.36.0
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/AGENTS.md +4 -2
- package/CHANGELOG.md +55 -7
- package/dist/application/task-lifecycle/advance.js +1 -0
- package/dist/application/task-lifecycle/observe.js +15 -0
- package/dist/application/task-lifecycle/plan-transitions.js +15 -0
- package/dist/build-stamp.json +3 -3
- package/dist/commands/init-upgrade.js +351 -19
- package/dist/commands/init.js +14 -67
- package/dist/commands/run-dag-progress.js +14 -0
- package/dist/commands/task-advance.js +33 -3
- package/dist/executors/dag-pi-executor.js +3 -1
- package/dist/shared/operator/capabilities.js +125 -11
- package/dist/task/source-prepare/completeness.js +17 -0
- package/dist/task/source-prepare/parse-intent.js +15 -1
- package/dist/worker/console/chat/artifact-card.js +8 -1
- package/dist/worker/console/chat/chat-event-store.js +61 -0
- package/dist/worker/console/chat/human-gate-card.js +9 -1
- package/dist/worker/console/chat/operation-card.js +71 -2
- package/dist/worker/console/chat/pi-runtime.js +69 -30
- package/dist/worker/console/chat/routes.js +27 -4
- package/dist/worker/console/chat/semantic-activity.js +465 -0
- package/dist/worker/console/chat/turn-process.js +31 -12
- package/dist/worker/console/operation-run-facts.js +190 -0
- package/dist/worker/console/operation-runner.js +107 -6
- package/dist/worker/console/operation-wait.js +314 -0
- package/dist/worker/console/operator-actions.js +153 -2
- package/dist/worker/console/static/assets/index-2OeZODxk.js +57 -0
- package/dist/worker/console/static/assets/index-DVJlUL8X.css +1 -0
- package/dist/worker/console/static/index.html +2 -2
- package/dist/worker/console/static-src/operator-chat/activity-journey.js +125 -0
- package/dist/worker/console/static-src/operator-chat/activity-rail-presentation.js +73 -0
- package/dist/worker/console/static-src/operator-chat/activity-references.js +20 -0
- package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +69 -31
- package/dist/worker/console/static-src/operator-chat/slash-palette-layout.js +24 -0
- package/dist/worker/console/static-src/operator-chat/slash-palette-nav.js +141 -0
- package/dist/worker/console/static-src/operator-chat/spatial-overlay.js +2 -1
- package/dist/worker/console/static-src/operator-chat/useActivityRailTransition.js +59 -0
- package/dist/worker/console/static-src/operator-chat/useChatSessions.js +16 -5
- package/dist/worker/console/static-src/operator-chat/useComposer.js +30 -7
- package/dist/worker/console/static-src/operator-chat/workspace-layout-mode.js +7 -3
- package/dist/worker/observe/static/operator-chrome.js +1 -1
- package/dist/workflows/dag/failure-routing.js +4 -9
- package/dist/workflows/dag/init-hybrid.js +74 -2
- package/dist/workflows/dag/lifecycle.js +0 -4
- package/dist/workflows/dag/report.js +0 -6
- package/docs/README.md +3 -3
- package/docs/architecture/evolution.md +102 -67
- package/docs/templates/frontend-task-constraints.md +7 -13
- package/docs/templates/init-managed-agents.md +5 -2
- package/harness.json +2 -2
- package/package.json +1 -1
- package/skills/loop-agent/SKILL.md +1 -0
- package/skills/loop-agent/references/command-reference.md +2 -0
- package/dist/worker/console/static/assets/index-DRqZiQ7J.css +0 -1
- package/dist/worker/console/static/assets/index-DuVLjCIT.js +0 -57
package/AGENTS.md
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
- Shell 搜索优先 `rg`,按名找文件优先 `fd`;脚本用 Git Bash / 兼容 Bash。
|
|
25
25
|
- 用 loop-agent 迭代本仓库时,控制器必须来自已发布 npm 包(记录实际版本);启动后不要中途升级;不要用工作区 `npm link` / `npm run dev` 控制可能改 CLI/runtime/package 的任务。
|
|
26
26
|
- 反复出现的约束固化为文档、脚本、检查、测试或模板;禁止占位实现(除非 contract 标明脚手架)。
|
|
27
|
-
- 非微小实现:`exec-plan` 不能替代 Agent DAG;除非用户要求 one-shot 或计划记录 escape hatch,否则改实现前完成 `task advance`(PRD +
|
|
27
|
+
- 非微小实现:`exec-plan` 不能替代 Agent DAG;除非用户要求 one-shot 或计划记录 escape hatch,否则改实现前完成 `task advance`(PRD + 结构化路径边界)与 writeSet gate 审查。长跑 DAG 启动一律走 `prepareDagExecution → runDag → operationId` 由 Console operation 后台持有;**禁止**在前台 Bash 直接执行 `task advance --approve-gate`(会阻塞会话且超时杀 runner)、禁止把长跑命令管道到 `tail`/`head`、禁止自行拼接 `nohup`/`Start-Process`/`start`。
|
|
28
28
|
- **实现默认 DAG,主会话不直接改代码**:只要是实现/修复/行为或展示语义变更(含 observe 文案映射、runtime status、schema、executor、CLI 等),主会话只做 Orient / 建 task / dry-run / validate / writeSet 审查 / 执行与监视 DAG,**不得**自己改 `src/**`、`test/**` 等交付面。仅当用户**明确授权**主会话直接处理(例如「直接改」「主会话改」「one-shot」「不用 DAG」)时,才允许主会话写入;授权后仍须记录边界、allowedPaths 与验证证据。纯答疑、读代码、查状态、提交/推送已有 diff、或用户点名的文档微调(如本文件规则)不在此限。
|
|
29
29
|
- 不要自行引入外部 SDD/spec-first 等强制平行治理树;以本文件与 `docs/` 为准(ADR 0006)。
|
|
30
30
|
|
|
@@ -49,10 +49,12 @@
|
|
|
49
49
|
|
|
50
50
|
启动 loop-agent DAG 流程后,主 agent 应自主推进到整个流程结束,不要中途请求无谓的人工确认(如“要我现在执行 DAG 吗?”)。只要 dry-run / validate / writeSet 审查通过就应直接执行并跑完全部 ranks;遇到真问题(契约不一致、writeSet 越界、verify 失败且超出 maxFixLoops、用户明显未授权的高风险动作)才停。即便 profile 是 supervised/reviewed,也不默认在 review-gate 主动停下等人——控制器会在需要人工 approve 时自行提示,主 agent 的职责是推动流程跑完。
|
|
51
51
|
|
|
52
|
-
DAG 执行期间主 agent
|
|
52
|
+
DAG 执行期间主 agent 必须持续监督直到 run 结束(FINISHED / FAILED / 需要 approve),不能查一次就停下等用户。监督优先用 Console 的 `operationWait` 长轮询(只读、model-callable、无 Human Gate):退避 60 → 90 → 120 → 180 秒,状态变化后重置 60 秒,疑似 stall 用 30–60 秒复查;heartbeat 不是 meaningful progress(默认 `operationWait` 已过滤),不得因 heartbeat 重置退避。无法走 Console 工具时(如本机 CLI 直接操作)才退回 bash 轮询:看 `state.json` 的 `runner.heartbeatAt` 是否持续刷新 + `session-events.jsonl` 是否在增长 + `dag doctor` 的 `liveness` 字段,不要只用 `tasklist /FI "PID eq X"` 这类过滤语法在 Git Bash 下会误报 DEAD,从而错判一个正常工作的 run 为 orphaned。遇到疑似 stall 先按 `docs/runtime/agent-dag-runner.md` 查 `lastMeaningfulProgressAt` / provider 活动,有真实进展就继续等,绝不盲目 supersede。持续监视过程中,主 agent 可在合适节点(例如 rank/节点状态变化、进入 verify/closeout、出现 stall 嫌疑或需要 approve 时)向用户做简短进度汇报(当前节点、状态、是否有风险),避免长时间静默;汇报是告知,不是请求确认,不得因此停下流程。
|
|
53
53
|
|
|
54
54
|
DAG 执行期间,主 agent 不得修改 writeSet 外的任何工作区文件(包括 AGENTS.md、docs、根配置等)。bounded writer 节点的 write guard 用「节点运行期间的工作区 diff」作为越界证据,不区分改动来自 pi 还是主会话——主会话在 pi 节点跑的时候改了 writeSet 外文件,会让 write guard 把账算到 pi 头上、判节点 ERROR、下游 cascade skip。需要改文档/约束时,要么在 DAG 启动前改完,要么等 run 结束后改;务必与 DAG 写入节点在时间上互斥。排查任务路由问题时优先用 `resolveTaskDagTemplateSelection` / `classifyTaskDemand` 等纯函数探针或 `--output` 指定临时路径,不要反复 `dag execute --dry-run` / 无必要的 lifecycle 探测。dry-run 不执行节点;若确需预演,检查命令返回的 `.harness/dag-runs/dry-run/<runId>/` `runDir`,它不进入 active overview,也不能作为 `dag resume` 目标。优先用纯函数探针或 `task status`。
|
|
55
55
|
|
|
56
|
+
失败恢复与契约漂移:run 失败后先 `dag report` / `dag doctor`,优先 `dag rerun --from-node`(含 unsafe shell 节点的子图会判不 eligible,属预期;此时改契约后同 task 重新 advance / `dag rerun-task`)。直接编辑 `source/需求.md` / `执行约束.md` 会使契约进入 `externally-modified`,后续 advance 会拒用新内容(DIRTY_SOURCE / hash 不一致);合法收编用 `task contract adopt --task <id> --expected-revision <n> --expected-observed-hash <hash> --request-id <id> --request-payload-sha256 <sha>`(hash 从 `task status --json` 的 `contract.observedCanonicalHash` 取),或改 PRD 后重新 importPrd 走完整重投影;禁止手改 `lifecycle.json` / `.transactions/` 绕过。
|
|
57
|
+
|
|
56
58
|
## 项目地图
|
|
57
59
|
|
|
58
60
|
- `CONTEXT.md`:术语表
|
package/CHANGELOG.md
CHANGED
|
@@ -1,17 +1,30 @@
|
|
|
1
1
|
# 更新日志
|
|
2
2
|
|
|
3
|
-
## [
|
|
3
|
+
## [Unreleased]
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## [0.36.0] - 2026-08-15
|
|
6
6
|
|
|
7
|
-
###
|
|
7
|
+
### 新增
|
|
8
8
|
|
|
9
|
-
-
|
|
9
|
+
- add task journey activity rail
|
|
10
|
+
- harden Operator Chat DAG recovery
|
|
11
|
+
- confirm session deletion inline
|
|
12
|
+
- supervise long-running DAG operations
|
|
13
|
+
- polish slash command card grid
|
|
14
|
+
- localize generated runtime state
|
|
10
15
|
|
|
11
|
-
###
|
|
16
|
+
### 修复
|
|
12
17
|
|
|
13
|
-
-
|
|
14
|
-
-
|
|
18
|
+
- harden task advance supervision
|
|
19
|
+
- runner heartbeat logs no longer wake operationWait; writers must use edit tools for markdown
|
|
20
|
+
- require writer to sync catalog index companions in writeSet
|
|
21
|
+
- accept zh-CN acceptance heading variants in PRD parse
|
|
22
|
+
- writer must materialize plan and not claim blocked for untouched forbidden paths
|
|
23
|
+
- parse dag report runs[] envelope in rerun eligibility
|
|
24
|
+
- tell writers diff is measured from git status, not response text
|
|
25
|
+
- allow custom operator tools in SDK session allowlist
|
|
26
|
+
- fit slash palette to available height
|
|
27
|
+
- close operator chat command gaps
|
|
15
28
|
|
|
16
29
|
## [0.35.3] - 2026-08-15
|
|
17
30
|
|
|
@@ -84,6 +97,41 @@
|
|
|
84
97
|
- 修复 PRD 三件套上传时工程边界缺失以 EMPTY_ALLOWED_PATHS blocking 卡死、semantic intake 拒绝接管、契约永不 apply 的问题
|
|
85
98
|
- 修复文字录入「请参照这三个prd路径XXX」只物化一句话、引用文件从未导入的问题
|
|
86
99
|
- 修复 semantic intake attempt marker 一次性失败后永不重试的问题:新的 PRD 导入会重置 marker,失败可随新证据重试
|
|
100
|
+
- Operator Chat DAG recovery P0 收敛:`operationWait` 默认仅由 meaningful progress 或终态唤醒,同时保留 `wakeOn=all` 诊断兼容;operation 终态原子保存并安全投影受信任的 `runSummary`/`dagRunId`,Operation Card 与 prompt 可直接消费失败节点、category 和 recovery 摘要;独立 review 后补齐所有 allowlisted 文本字段中的 Windows drive、UNC 与 POSIX absolute-path 子串脱敏,且不暴露 raw result、CLI 参数、绝对 artifact path 或 secrets。
|
|
101
|
+
- 修复 terminal `run-failed + gate=null` 仍建议 `task advance` 的无进展循环;task status 与 Operation Card 现在停止盲目 resume/retry,并只提供合法的 Inspect/外部恢复导航。
|
|
102
|
+
- 为 Console shortcut palette 的动态高度 custom property 声明 `62vh` 默认值,保留 ChatComposer inline override 与既有 fallback,并维持 `shell-ui-boundary` 未定义 token 检查强度。
|
|
103
|
+
|
|
104
|
+
## [0.35.1-beta.0] - 2026-08-14
|
|
105
|
+
|
|
106
|
+
### 重点更新
|
|
107
|
+
|
|
108
|
+
- Operator Chat 新增长跑 DAG 自主监督能力,通过只读 `operationWait`、canonical heartbeat 与有界退避持续监控后台 operation 至真实终态
|
|
109
|
+
- `task advance --approve-gate --json` 新增 stderr 周期进度,同时保证 stdout 保持单一最终 JSON
|
|
110
|
+
- `loop-agent init` 收敛 managed `.gitignore` 与运行态目录迁移评估,并保留项目自有 Pi routing
|
|
111
|
+
- Operator Chat `/` 命令面板升级为响应式 3/2/1 列卡片网格,补齐参数命令、动态目录与键盘/IME 行为
|
|
112
|
+
|
|
113
|
+
### 新增
|
|
114
|
+
|
|
115
|
+
- Operator Chat 长跑 DAG 监督 P0-P2:新增只读、model-callable、无需 Human Gate 的 `operationWait` action/tool(复用 operation event store 的 `listFrom`/`subscribe`,订阅先于复查防竞态;已有事件/终态/needs-reconcile 立即返回,首个新事件立即 settle,超时返回 `timedOut:true` 摘要而非命令失败,NOT_FOUND/EVENT_CURSOR_EXPIRED 确定性错误;所有路径单次 settle 并清理 timer/listener)。
|
|
116
|
+
- Console operation runner 将 sibling CLI 的 `LoopAgentClient` heartbeat 投影为 canonical `kind: "heartbeat"` operation event(含 `at`、`elapsedMs` 与 operation/action/run/task 安全摘要);写入失败不终止 sibling CLI/DAG 执行,不改变 DAG runner lease heartbeat 频率。
|
|
117
|
+
|
|
118
|
+
### 改进
|
|
119
|
+
|
|
120
|
+
- `task advance --approve-gate --json` 运行 DAG 时周期进度只写 stderr(`--quiet` 可关闭),stdout 保持单个 `OperatorCommandResultV1` JSON;新增 `--progress-interval-ms`(下限 1000ms,与 `dag execute` 同语义)与 `--quiet` 参数;observer 仅在 approve 且非 dry-run 时创建,所有终态/异常路径 `finally` dispose,不留 timer。
|
|
121
|
+
- Operator Chat 长跑监督合同统一为 60 → 90 → 120 → 180 秒退避(状态变化后重置 60 秒,疑似 stall 用 30–60 秒复查);base prompt 与 managed init `AGENTS.md` 模板明确:长跑 DAG 必须经 `prepareDagExecution → runDag → operationId` 由 Console operation 后台持有,禁止前台 Bash 直接 `task advance --approve-gate`、禁止管道 `tail`/`head`、禁止模型自行拼接 `nohup`/`Start-Process`/`start`。
|
|
122
|
+
|
|
123
|
+
### Init / Upgrade
|
|
124
|
+
|
|
125
|
+
- `loop-agent init` 的 managed `.gitignore` block 收敛为四条目录级规则(`.harness/`、`.agents/`、`.task-pool/`、`.worktrees/`):删除旧细粒度规则与反向放行;`scripts/` 与 `ai_workspace/loop-agent/` 保持可提交。旧格式 block 仍由 `check-update` 确定性报告 `refresh-managed-block`,`update --apply-safe` / `upgrade` 应用后收敛,block 外用户规则原样保留。
|
|
126
|
+
- full init 不再生成 `.harness/**/.gitkeep` 占位文件(目录照常创建)。
|
|
127
|
+
- `init upgrade` 在 managed block 收敛后生成只读 gitignore 迁移评估(`.harness/init-upgrades/<run-id>/gitignore-migration.json`):inventory 已跟踪的 `.harness/**` 与 `.agents/**`,建议 index-only 的 `git rm -r --cached --ignore-unmatch` 命令(只改 index、保留工作区文件);`.agents` 已跟踪内容触发审查暂停,非 Git 仓库 / git 查询失败 / 存在 staged 条目时 fail closed,controller 不自动修改 Git index。
|
|
128
|
+
|
|
129
|
+
### Operator Chat
|
|
130
|
+
|
|
131
|
+
- 会话历史删除改为 pi-web 式列表行内二次确认:首次点击垃圾桶只在原行显示“删除 / 取消”,不再弹出浏览器原生确认框;同一时刻仅允许一行确认,切换会话、点击取消或按 `Escape` 可撤销,删除中显示忙碌态并阻止重复请求,同时保留原 DELETE confirmation token、失败提示和当前会话清理合同。
|
|
132
|
+
- 修复 Operator Chat 斜杠命令面板在紧凑布局或低高度窗口中顶部被 `.oc-main` 裁切的问题:面板打开后按主工作区顶边与 Composer 锚点之间的真实可用空间动态收缩,并在窗口、VisualViewport 与 Composer 尺寸变化时重算;面板头部保持可见,候选列表继续独立滚动,同时保留原有 `62vh / 520px` 安全上限与无测量回退。
|
|
133
|
+
- Operator Chat 斜杠命令面板完成 UI-12 响应式卡片网格:Operator / Pi Web / Extensions / Prompts / Skills 分组按现有 `comfortable / compact / narrow` 容器模式渲染 3 / 2 / 1 列,卡片仅显示真实命令名与最多两行描述;面板头部固定、候选区独立滚动、分组标题 sticky,长命令不会撑宽页面。键盘支持四方向几何导航与最小滚动,hover、`aria-selected`、`aria-activedescendant` 保持同源;IME composition 与结束后 100ms 保护阻止误导航/误接受,完整描述通过 `aria-describedby` 关联。补足 1/2/3 列、跨分组和 shuffled globalIndex 回归测试,并以真实浏览器验证三档列数、无横向溢出及 Operator/extension/prompt/skill 补全路径。
|
|
134
|
+
- 修复 Operator Chat 命令面板缺口:`/name` 与 `/compact` 参数走本地重命名/压缩路径,palette Enter/Tab 对参数命令进入可编辑前缀,动态 Extension/Skill/Prompt 冲突按优先级保留最高来源,动态目录 fail-soft 时保留本地命令并展示可重试 warning;会话标题 tooltip 水平夹紧视口,单条 Markdown 渲染失败仅该消息降级为纯文本。
|
|
87
135
|
|
|
88
136
|
## [0.35.1-beta.4] - 2026-08-15
|
|
89
137
|
|
|
@@ -1045,6 +1045,7 @@ export async function advanceTaskLifecycle(input) {
|
|
|
1045
1045
|
cwd: input.repoRoot,
|
|
1046
1046
|
initOnly: false,
|
|
1047
1047
|
dryRun: false,
|
|
1048
|
+
...(input.observer ? { observer: input.observer } : {}),
|
|
1048
1049
|
...(input.maxConcurrent !== undefined
|
|
1049
1050
|
? { maxConcurrent: input.maxConcurrent }
|
|
1050
1051
|
: {}),
|
|
@@ -396,6 +396,21 @@ function deriveNextFromSnapshot(input) {
|
|
|
396
396
|
command: `loop-agent task status ${input.taskId} --json`,
|
|
397
397
|
};
|
|
398
398
|
}
|
|
399
|
+
if (input.lifecycleState === "run-failed" && !input.gate) {
|
|
400
|
+
// Terminal failed run without an open gate: task advance cannot make
|
|
401
|
+
// progress on a terminal run state (no determinate no-progress loop).
|
|
402
|
+
// Point the operator at external recovery diagnostics instead.
|
|
403
|
+
return {
|
|
404
|
+
kind: "external-action",
|
|
405
|
+
description: "The latest DAG run failed and is terminal; task advance cannot progress it. Read the run report (loop-agent dag report --run-id <runId> --json), then follow the recovery guidance (eligible node rerun / same-task recovery) or fix the root cause before advancing.",
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
if (input.lifecycleState === "run-succeeded" && !input.gate) {
|
|
409
|
+
return {
|
|
410
|
+
kind: "external-action",
|
|
411
|
+
description: "The latest DAG run succeeded; task advance cannot progress it. Run promotion/closeout via the lifecycle closeout path or archive the task.",
|
|
412
|
+
};
|
|
413
|
+
}
|
|
399
414
|
return {
|
|
400
415
|
kind: "advance",
|
|
401
416
|
command: `loop-agent task advance ${input.taskId} --json`,
|
|
@@ -229,6 +229,21 @@ function deriveNext(snapshot, gate, approveGate) {
|
|
|
229
229
|
if (snapshot.lifecycleState === "evidence-closed") {
|
|
230
230
|
return { kind: "none" };
|
|
231
231
|
}
|
|
232
|
+
// Keep planner semantics aligned with observe (AC-001): a terminal failed
|
|
233
|
+
// run without an open gate must not recommend task advance — advance cannot
|
|
234
|
+
// progress a terminal run state.
|
|
235
|
+
if (snapshot.lifecycleState === "run-failed" && !gate) {
|
|
236
|
+
return {
|
|
237
|
+
kind: "external-action",
|
|
238
|
+
description: "The latest DAG run failed and is terminal; task advance cannot progress it. Read the run report (loop-agent dag report --run-id <runId> --json), then follow the recovery guidance (eligible node rerun / same-task recovery) or fix the root cause before advancing.",
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
if (snapshot.lifecycleState === "run-succeeded" && !gate) {
|
|
242
|
+
return {
|
|
243
|
+
kind: "external-action",
|
|
244
|
+
description: "The latest DAG run succeeded; task advance cannot progress it. Run promotion/closeout via the lifecycle closeout path or archive the task.",
|
|
245
|
+
};
|
|
246
|
+
}
|
|
232
247
|
return {
|
|
233
248
|
kind: "advance",
|
|
234
249
|
command: `loop-agent task advance ${snapshot.taskId} --json`,
|
package/dist/build-stamp.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"version": "0.
|
|
4
|
-
"gitSha": "
|
|
5
|
-
"builtAt": "2026-08-
|
|
3
|
+
"version": "0.36.0",
|
|
4
|
+
"gitSha": "4737885305b1a168317cfc97ae06596ae7a39512",
|
|
5
|
+
"builtAt": "2026-08-15T20:30:11.790Z"
|
|
6
6
|
}
|