@tea-agent/loop-agent 0.26.3 → 0.26.4
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 +20 -0
- package/dist/executors/dag-pi-executor.js +26 -1
- package/dist/executors/pi-executor.js +233 -147
- package/dist/executors/pi-sdk-executor.js +140 -81
- package/dist/executors/pi-writer-tool-policy.js +266 -0
- package/dist/executors/shell-executor.js +355 -52
- package/dist/governance/document-index-closure.js +164 -0
- package/dist/worker/observe/node-input.js +8 -11
- package/dist/workflows/dag/convergence/controller.js +100 -3
- package/dist/workflows/dag/init-hybrid.js +51 -11
- package/dist/workflows/dag/repair-artifact.js +100 -4
- package/dist/workflows/dag/rerun-plan.js +14 -7
- package/dist/workflows/dag/types.js +6 -0
- package/dist/workflows/dag/workspace-checkpoint.js +42 -0
- package/docs/templates/init-managed-agents.md +3 -3
- package/harness.json +1 -1
- package/package.json +1 -1
- package/skills/loop-agent/references/orchestrator-and-interventions.md +13 -6
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.26.4] - 2026-08-03
|
|
6
|
+
|
|
7
|
+
### 重点更新
|
|
8
|
+
|
|
9
|
+
- 强化 DAG 运行时安全与 writer 工具级写边界
|
|
10
|
+
- 收敛效率与可选 document catalog 兼容
|
|
11
|
+
- 防污染 review-pass 知识写入
|
|
12
|
+
|
|
13
|
+
### 改进
|
|
14
|
+
|
|
15
|
+
- fresh init 与旧项目 `init update --apply-safe` 刷新的 `AGENTS.md` managed block 现要求持续监控 DAG 至 `FINISHED`、`FAILED`、`partial_failed` 等已结束终态或 Decision Gate 需要 approve;判活须组合 runner heartbeat、session events 与 `dag doctor` liveness/provider meaningful progress,并禁止 exclusive writer 运行期间主会话或其他 writer 并发修改工作区
|
|
16
|
+
- DAG 治理闭包与收敛效率:已配置 `docs/document-catalog.json` 的项目在生成时从 `completeDirectoryIndexes` 注入具体 index companion 到 implement/repair 内存路径,未配置该可选 catalog 的项目保持原有 DAG 生成能力;repair artifact 支持 `blocked-boundary`/`requiredScope` 与 empty-manifest `no-progress` 提前止损;DAG shell 支持显式 `failFast`,supervised hard verify 在同 run、同工作区指纹与命令契约下仅复用成功命令并写可审计 receipt。真实非零退出与 finished 聚合规则不放宽,且不跨 run 缓存验证结果
|
|
17
|
+
- DAG Pi writer 工具级写边界:移除 writer unrestricted `bash`,以 SDK 同名受控 `edit`/`write` 在文件 API 执行前强制 repo containment、symlink/ancestor containment、`allowedPaths`/`writeSet`/`forbiddenPaths`,并硬拒绝 `.harness/tasks/**` 与 `.harness/dag-runs/**`;CLI-only 与 SDK→CLI 对 writer fail-closed(read-only `cli-only` rollback 保留),SDK resource loader 与 CLI 同时关闭 Pi extension 自动发现,阻止 extension 在 session 启动或覆盖工具后绕过沙箱。授权递归 glob(如 `src/**`)可创建其覆盖的中间目录,但同级越界目录仍在 mutation 前拒绝。same-run hard-verify workspace fingerprint 纳入当前 Task Contract 稳定 ignored 治理输入;这些文件漂移后成功命令全部 `reused=false`,runner-owned dag-runs volatile 不进入指纹。post-run write-guard 与 change-manifest 保持第二层防御
|
|
18
|
+
- DAG convergence 成功知识防污染:只有 `review-pi` 与 review verdict recovery 均 FINISHED 且明确 `VERDICT: pass` 才写入 `review-pass` knowledge pattern;review gate 仅完成路由但上游 authority/protocol/review verdict 非 pass 时按 `non-retry-failure` 收口,不再把 `request-revision` 或被跳过的 review 误记为成功
|
|
19
|
+
|
|
20
|
+
### 修复
|
|
21
|
+
|
|
22
|
+
- 修复未配置 document catalog 的项目在 DAG 生成路径上的兼容问题,避免可选 catalog 成为硬依赖
|
|
23
|
+
- 提升 convergence 与 writer 可靠性
|
|
24
|
+
|
|
5
25
|
## [0.26.3] - 2026-08-02
|
|
6
26
|
|
|
7
27
|
### 重点更新
|
|
@@ -2,13 +2,14 @@ import path from "node:path";
|
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
3
|
import { writeDagNodeJsonArtifact, writeTextArtifactFile, } from "../infrastructure/harness/artifact-store.js";
|
|
4
4
|
import { executePiStep, } from "./pi-executor.js";
|
|
5
|
+
import { buildPiWriterToolPolicyContext, createPiWriterCustomTools, } from "./pi-writer-tool-policy.js";
|
|
5
6
|
import { redactPromptForLog, truncateOutput, } from "../shared/output-truncation.js";
|
|
6
7
|
import { GitStatusUnavailableError, pathsChangedDuringRun, readGitStatusPorcelain, recoverRootNulArtifact, snapshotGitStatusPathFingerprints, snapshotGitStatusPorcelain, validateShellWriteGuard, } from "./shell-write-guard.js";
|
|
7
8
|
import { redactSecrets, truncateUtf8Preview } from "../shared/preview.js";
|
|
8
9
|
export const DAG_PI_READONLY_TOOLS = ["read", "grep", "find", "ls"];
|
|
10
|
+
/** Bounded writer tools: no unrestricted bash; edit/write are policy-wrapped via SDK customTools. */
|
|
9
11
|
export const DAG_PI_WRITE_TOOLS = [
|
|
10
12
|
"read",
|
|
11
|
-
"bash",
|
|
12
13
|
"edit",
|
|
13
14
|
"write",
|
|
14
15
|
"grep",
|
|
@@ -313,6 +314,29 @@ export async function executeDagPiNode(input, meta, piStepFn = executePiStep, wr
|
|
|
313
314
|
});
|
|
314
315
|
}
|
|
315
316
|
: undefined;
|
|
317
|
+
let writerToolPolicy;
|
|
318
|
+
if (isWriteTask) {
|
|
319
|
+
try {
|
|
320
|
+
const policyContext = buildPiWriterToolPolicyContext({
|
|
321
|
+
repoRoot: input.cwd,
|
|
322
|
+
allowedPaths: input.task.allowedPaths,
|
|
323
|
+
writeSet: input.task.writeSet,
|
|
324
|
+
forbiddenPaths: input.task.forbiddenPaths,
|
|
325
|
+
writePolicy: input.task.writePolicy,
|
|
326
|
+
});
|
|
327
|
+
const customTools = await createPiWriterCustomTools(policyContext);
|
|
328
|
+
writerToolPolicy = { requireSdk: true, customTools };
|
|
329
|
+
}
|
|
330
|
+
catch (error) {
|
|
331
|
+
return {
|
|
332
|
+
ok: false,
|
|
333
|
+
stdout: "",
|
|
334
|
+
stderr: `pi writer tool policy unavailable before Pi execution: ${error instanceof Error ? error.message : String(error)}`,
|
|
335
|
+
failureCategory: "tool-policy",
|
|
336
|
+
durationMs: Date.now() - started,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
}
|
|
316
340
|
const result = await piStepFn({
|
|
317
341
|
attachedFiles: [],
|
|
318
342
|
modelConfig: resolveDagPiModelConfig(input.model, input.thinking ? { thinking: input.thinking } : undefined),
|
|
@@ -326,6 +350,7 @@ export async function executeDagPiNode(input, meta, piStepFn = executePiStep, wr
|
|
|
326
350
|
timeoutMs: input.timeoutMs,
|
|
327
351
|
stallTimeoutMs: input.stallTimeoutMs,
|
|
328
352
|
abortGraceMs: input.abortGraceMs,
|
|
353
|
+
...(writerToolPolicy ? { writerToolPolicy } : {}),
|
|
329
354
|
onActivity: bridgeActivity
|
|
330
355
|
? (activity) => {
|
|
331
356
|
if (activity.kind === "lease" ||
|