@tea-agent/loop-agent 0.29.3 → 0.31.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.
Files changed (34) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/dist/executors/dag-pi-executor.js +18 -6
  3. package/dist/worker/observability/dag-execution-trajectory.js +591 -0
  4. package/dist/worker/observability/read-model.js +258 -31
  5. package/dist/worker/observe/dag-node-execution-output.js +180 -0
  6. package/dist/worker/observe/routes.js +53 -6
  7. package/dist/worker/observe/static/dag-edge-routing.js +368 -0
  8. package/dist/worker/observe/static/dag-history-labels.js +95 -0
  9. package/dist/worker/observe/static/dag-layout.d.ts +12 -7
  10. package/dist/worker/observe/static/dag-layout.js +101 -21
  11. package/dist/worker/observe/static/favicon.svg +37 -0
  12. package/dist/worker/observe/static/format.js +31 -1
  13. package/dist/worker/observe/static/index.html +1 -1
  14. package/dist/worker/observe/static/state.js +102 -0
  15. package/dist/worker/observe/static/styles.css +267 -7
  16. package/dist/worker/observe/static/views/dag-graph.js +414 -154
  17. package/dist/worker/observe/static/views/dag-inspector.js +478 -27
  18. package/dist/worker/observe/static/views/dag-trajectory.js +313 -0
  19. package/dist/worker/observe/static/views/dag.js +20 -3
  20. package/dist/workflows/dag/backend-test-writer-completeness.js +398 -26
  21. package/dist/workflows/dag/dynamic-runtime/map.js +10 -4
  22. package/dist/workflows/dag/init-hybrid.js +228 -229
  23. package/dist/workflows/dag/node-execution.js +13 -2
  24. package/dist/workflows/dag/types.js +21 -7
  25. package/docs/architecture/README.md +4 -0
  26. package/docs/architecture/dag-execution.md +1 -1
  27. package/docs/architecture/worker-and-feature.md +1 -1
  28. package/docs/governance/README.md +3 -0
  29. package/docs/operations/README.md +1 -0
  30. package/docs/templates/backend-test-dag.json +664 -460
  31. package/docs/templates/frontend-test-dag.json +1 -1
  32. package/harness.json +2 -2
  33. package/package.json +3 -2
  34. package/scripts/kb-bootstrap-init-skeleton.sh +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,66 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.31.0] - 2026-08-08
6
+
7
+ ### 重点更新
8
+
9
+ - Observe 看板新增 DAG 执行轨迹视图,支持按初始执行、修复轮次和最终收敛分车道展开真实的调度执行过程
10
+ - DAG 节点新增轻量执行历史摘要,在逻辑图卡片、节点表和 Inspector 中直观展示多次尝试与恢复记录
11
+ - 统一执行轨迹与 Inspector 的业务文案为自然中文映射,主界面不再显示难以理解的裸英文状态标识
12
+ - 优化 DAG 拓扑依赖边的路由算法,实现结构化避障正交路由,并恢复平滑的视觉线条样式
13
+
14
+ ### 新增
15
+
16
+ - Observe DAG 详情新增执行轨迹视图,默认展示逻辑拓扑,支持键盘切换,点击轨迹卡片可联动 Inspector
17
+ - 为 DAG 节点投影并展示轻量执行历史摘要,包含执行次数叙事及 Inspector 分次选择器
18
+ - 新增纯函数模块统一执行轨迹与 Inspector 的业务文案中文映射,规范展示失败原因与状态转换
19
+ - Console 与 Observe 共享统一的品牌 favicon,并支持通过同步脚本保持资源一致
20
+
21
+ ### 改进
22
+
23
+ - DAG 拓扑依赖边采用结构化避障正交路由,支持长边避障与控制回环独立展示,提升复杂拓扑的可读性
24
+ - 恢复相邻层级普通依赖边的平滑视觉样式,控制回环标签视觉更轻量,避免掩盖主链路
25
+ - DAG 详情响应内嵌有界的执行轨迹投影,在历史证据缺失时安全降级并保持逻辑拓扑始终可用
26
+ - 主 UI 业务术语优化,图卡与工具栏摘要改用自然的中文轮次描述,原始内部编号仅保留在诊断提示中
27
+
28
+ ### 修复
29
+
30
+ - 修复 Console 与 Observe 未共享 favicon 的问题,现统一使用同一品牌资源并兼容嵌入模式
31
+ - 修复 Observe 逻辑拓扑中同一行 DAG 边未能保持水平的问题,确保同逻辑行混合高度边正确展示
32
+ - 修复执行轨迹车道归类错误,修正收敛开启时节点错误归入最终收敛道的问题,确保各节点按真实位置归类
33
+ - 恢复 DAG Pi writer 节点的 bash 工具权限,同时保持只读节点无 bash 且 edit/write 仍受安全策略约束
34
+
35
+ ## [0.30.0] - 2026-08-08
36
+
37
+ ### 重点更新
38
+
39
+ - 后端测试生成引入 map-shard 拓扑,将大型单节点拆分为 plan + manifest-shell + map_agent,每个模块用例获得独立的 16K 输出预算,消除大文件多轮写入被截断或完整性误报的风险
40
+ - 修复 map_agent 单个子节点超出 token 限制导致后续所有子节点被错误级联跳过的问题,确保各模块测试用例独立生成互不干扰
41
+ - Completeness Gate 升级为返回结构化缺陷原因,帮助模型精准定位并修复格式问题,有效结束续写死循环
42
+ - 后端测试用例生成全面转向需求驱动覆盖,以产品需求为基准,API 契约作为场景补充,提升测试覆盖的精准度
43
+
44
+ ### 新增
45
+
46
+ - 新增 plan 节点专属完整性评估器,仅校验 README 覆盖范围和模块索引,不再错误要求下游 map 子节点产出的文件
47
+ - 新增 `scripts/regen-backend-test-dag.mjs` 脚本,用于从 runtime builder 重建打包镜像,保持 runtime 与 packaged template 字节对齐
48
+ - Completeness Gate 的 `moduleStructurallyComplete` 新增结构化原因输出,明确指出空文件、标题层级错误、ID 格式非法或缺失必选章节等具体缺陷
49
+ - 新增 `looksLikeValidPythonModule` 校验逻辑,用于准确识别共享辅助代码和工厂函数,兼容包含合法不平衡分隔符的 fixture 字符串
50
+
51
+ ### 改进
52
+
53
+ - N2/N3 提示词改为需求驱动覆盖:Coverage Scope 固定为 new-operation/full-contract,以产品需求为基准全覆盖,API 契约补充场景维度,并禁止使用导致用例降级的 `## 测试类` 分组
54
+ - dagDynamicExpansionChildTaskSchema 扩展 `writerOutcomePolicy` 和 `retryPolicy`,使 map_agent 子节点能正确声明实现产出并受 Completeness Gate 保护
55
+ - Completeness Gate 白名单泛化,通过识别子节点 ID 前缀准确匹配 map 分片子节点
56
+ - DAG 执行器模型矩阵统一路由至当前环境实际可用的 wizard-local 模型,避免因 API Key 缺失导致节点大面积失败
57
+
58
+ ### 修复
59
+
60
+ - 修复 map_agent 中单个子节点超出 `maxTokensPerCase` 被误当作全局预算耗尽,导致后续兄弟子节点全部被跳过(SKIPPED)的问题
61
+ - 修复 plan 节点 Completeness Gate 错误要求下游 map 子节点产出文件齐全,导致计划节点始终判定为不完整并陷入重试死循环的问题
62
+ - 修复 manifest shell 命令因正则反引号和转义符在多层 shell 解析中被破坏,导致确定性 manifest 节点执行报错的问题,现采用 base64 编码彻底规避 bash 转义干扰
63
+ - 修复 pytest-plan 资源检查因严格括号配平启发式算法,误判包含合法不平衡分隔符的 fixture 字符串为不完整的问题
64
+
5
65
  ## [0.29.3] - 2026-08-07
6
66
 
7
67
  ### 重点更新
@@ -9,10 +9,10 @@ import { dagCommandPolicyAllows, resolveDagCommandPolicy, } from "../workflows/d
9
9
  import { redactPromptForLog, truncateOutput, } from "../shared/output-truncation.js";
10
10
  import { GitStatusUnavailableError, pathsChangedDuringRun, readGitStatusPorcelain, recoverRootNulArtifact, snapshotGitStatusPathFingerprints, snapshotGitStatusPorcelain, validateShellWriteGuard, } from "./shell-write-guard.js";
11
11
  import { isWriterEmptyDiffRetryCandidate, INCOMPLETE_WRITE_SET_RETRY_CATEGORY, WRITER_EMPTY_DIFF_RETRY_CATEGORY, } from "../workflows/dag/retry-policy.js";
12
- import { assessBackendTestMdWriterCompleteness, assessBackendTestPytestWriterCompleteness, classifyBackendTestWriterCompletenessFailure, isBackendTestCompletenessRetryCandidate, writeBackendTestWriterProgressArtifacts, } from "../workflows/dag/backend-test-writer-completeness.js";
12
+ import { assessBackendTestMdPlanCompleteness, assessBackendTestMdWriterCompleteness, assessBackendTestPytestPlanCompleteness, assessBackendTestPytestWriterCompleteness, assessBackendTestShardChildCompleteness, backendTestWriterProgressRoleForTask, classifyBackendTestWriterCompletenessFailure, isBackendTestCompletenessRetryCandidate, isBackendTestMdPlanTask, isBackendTestPytestPlanTask, isBackendTestShardChildTask, writeBackendTestWriterProgressArtifacts, } from "../workflows/dag/backend-test-writer-completeness.js";
13
13
  import { redactSecrets, truncateUtf8Preview } from "../shared/preview.js";
14
14
  export const DAG_PI_READONLY_TOOLS = ["read", "grep", "find", "ls"];
15
- /** Bounded writer tools: no unrestricted bash; edit/write are policy-wrapped via SDK customTools. */
15
+ /** Bounded writer tools include bash; edit/write remain policy-wrapped via SDK customTools. */
16
16
  export const DAG_PI_WRITE_TOOLS = [
17
17
  "read",
18
18
  "edit",
@@ -20,6 +20,7 @@ export const DAG_PI_WRITE_TOOLS = [
20
20
  "grep",
21
21
  "find",
22
22
  "ls",
23
+ "bash",
23
24
  ];
24
25
  export const DEFAULT_DAG_PI_PROVIDER = "wizard-local";
25
26
  const WRITER_OUTCOME_PROTOCOL_LINE = "IMPLEMENTATION_OUTCOME:";
@@ -132,7 +133,7 @@ export function resolveDagPiToolNames(task) {
132
133
  return [...DAG_PI_READONLY_TOOLS];
133
134
  const tools = [...DAG_PI_WRITE_TOOLS];
134
135
  // Pi SDK activates custom tools only when they are in this explicit list.
135
- // Do not add a command capability to ordinary writers or read-only nodes.
136
+ // Command capabilities (playwright_cli) stay capability-gated; read-only nodes never get command tools.
136
137
  if (dagCommandPolicyAllows(task.commandPolicy, "playwright-cli")) {
137
138
  tools.push("playwright_cli");
138
139
  }
@@ -688,9 +689,20 @@ export async function executeDagPiNode(input, meta, piStepFn = executePiStep, wr
688
689
  if (writeGuardOk &&
689
690
  isBackendTestCompletenessRetryCandidate(input.task)) {
690
691
  try {
691
- const progress = input.task.id === "generate-backend-pytest-pi"
692
- ? await assessBackendTestPytestWriterCompleteness(input.cwd)
693
- : await assessBackendTestMdWriterCompleteness(input.cwd);
692
+ const writerRole = backendTestWriterProgressRoleForTask(input.task.id);
693
+ const progress = isBackendTestShardChildTask(input.task)
694
+ ? await assessBackendTestShardChildCompleteness({
695
+ workspaceRoot: input.cwd,
696
+ role: writerRole === "pytest-generate" ? "pytest-generate" : "md-generate",
697
+ writeSet: input.task.writeSet ?? [],
698
+ })
699
+ : isBackendTestMdPlanTask(input.task)
700
+ ? await assessBackendTestMdPlanCompleteness(input.cwd)
701
+ : isBackendTestPytestPlanTask(input.task)
702
+ ? await assessBackendTestPytestPlanCompleteness(input.cwd)
703
+ : writerRole === "pytest-generate"
704
+ ? await assessBackendTestPytestWriterCompleteness(input.cwd)
705
+ : await assessBackendTestMdWriterCompleteness(input.cwd);
694
706
  await writeBackendTestWriterProgressArtifacts({
695
707
  runDir: meta.runDir,
696
708
  progress,