@tea-agent/loop-agent 0.28.9 → 0.28.11

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 CHANGED
@@ -2,6 +2,26 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.28.11] - 2026-08-06
6
+
7
+ ### 重点更新
8
+
9
+ - 修复 Night Scheduler 收尾提交因前导空格处理不当导致变更路径截断、暂存失败的问题
10
+
11
+ ### 修复
12
+
13
+ - Night Scheduler 收尾提交改用 trimEnd 替代 trim,保留 git porcelain 格式的前导空格,修复 worktree-only 变更路径被截断(如 src/hello.js 变为 rc/hello.js)导致 git add 失败的问题
14
+
15
+ ## [0.28.10] - 2026-08-05
16
+
17
+ ### 重点更新
18
+
19
+ - 修复 DAG 变更清单 schema 校验误杀合法执行清单的问题,恢复夜间测试成功路径
20
+
21
+ ### 修复
22
+
23
+ - DAG writer change-manifest 的 schema 校验现可正确接受 Pi 执行器写入的 effectiveWriteSet 与 approval 元数据字段,修复 verify-pi project-governance-integrity 因 ownership/schema 不匹配而误拒合法 implement-pi 清单的问题
24
+
5
25
  ## [0.28.9] - 2026-08-05
6
26
 
7
27
  ### 重点更新
@@ -26,11 +26,14 @@ export async function createNightClosingCommit(input) {
26
26
  reason: card.ok ? "task card required for closing commit" : card.reason,
27
27
  };
28
28
  }
29
+ // Never full String#trim() porcelain: a leading space is the index column for
30
+ // worktree-only changes (` M path`). Trimming turns ` M src/a` into `M src/a`,
31
+ // which parseGitStatusPorcelain then mis-reads as `rc/a`.
29
32
  const status = (await runGit(input.workspaceRoot, [
30
33
  "status",
31
34
  "--porcelain=v1",
32
35
  "--untracked-files=all",
33
- ])).trim();
36
+ ])).trimEnd();
34
37
  if (!status) {
35
38
  return { ok: false, reason: "no changes to commit after execution" };
36
39
  }
@@ -292,6 +292,9 @@ const writerChangeManifestSchema = z
292
292
  .object({
293
293
  schemaVersion: z.literal(1),
294
294
  writerNodeId: z.string().min(1),
295
+ effectiveWriteSet: z.array(z.string()).optional(),
296
+ approvalSourceNodeId: z.string().min(1).optional(),
297
+ approvalDigest: z.string().min(1).optional(),
295
298
  changedFiles: z.array(relativePathSchema),
296
299
  beforeStatusSha256: sha256Schema,
297
300
  afterStatusSha256: sha256Schema,
@@ -419,13 +419,19 @@ function parseContext(value) {
419
419
  throw new DagProjectGovernanceIntegrityError(`project governance context schema validation failed: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
420
420
  }
421
421
  }
422
- const writerChangeManifestArtifactSchema = z.object({
422
+ const writerChangeManifestArtifactSchema = z
423
+ .object({
423
424
  schemaVersion: z.literal(1),
424
425
  writerNodeId: z.string().min(1),
426
+ /** Runtime authorization used by the writer (optional on older manifests). */
427
+ effectiveWriteSet: z.array(z.string()).optional(),
428
+ approvalSourceNodeId: z.string().min(1).optional(),
429
+ approvalDigest: z.string().min(1).optional(),
425
430
  changedFiles: z.array(z.string()),
426
431
  beforeStatusSha256: z.string().regex(/^[a-f0-9]{64}$/),
427
432
  afterStatusSha256: z.string().regex(/^[a-f0-9]{64}$/),
428
- }).strict();
433
+ })
434
+ .strict();
429
435
  /**
430
436
  * Read run-owned manifests only for Pi nodes that actually finished with the
431
437
  * bounded write tool profile. A finished writer without its manifest fails
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tea-agent/loop-agent",
3
- "version": "0.28.9",
3
+ "version": "0.28.11",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "loop-agent": "bin/loop-agent.js",