@tea-agent/loop-agent 0.43.0-next.17 → 0.43.0-next.3

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 (187) hide show
  1. package/CHANGELOG.md +9 -140
  2. package/dist/application/task-lifecycle/advance.js +4 -17
  3. package/dist/application/task-lifecycle/observe.js +29 -43
  4. package/dist/application/task-lifecycle/plan-transitions.js +4 -5
  5. package/dist/build-stamp.json +3 -3
  6. package/dist/commands/client-recovery.js +55 -20
  7. package/dist/commands/new-task.js +5 -0
  8. package/dist/commands/status.js +57 -0
  9. package/dist/commands/task-contract.js +269 -0
  10. package/dist/executors/dag-pi-executor.js +230 -269
  11. package/dist/executors/pi-executor.js +0 -2
  12. package/dist/executors/pi-sdk-executor.js +39 -77
  13. package/dist/executors/shell-executor.js +2 -3
  14. package/dist/executors/shell-write-guard.js +32 -27
  15. package/dist/shared/pi-context-pressure/extension.js +16 -26
  16. package/dist/shared/pi-retry-settings.js +0 -40
  17. package/dist/shared/prompts.js +26 -0
  18. package/dist/task/config.js +2 -0
  19. package/dist/task/contract/validate-draft.js +106 -0
  20. package/dist/task/goal.js +3 -0
  21. package/dist/task/index.js +12 -0
  22. package/dist/task/lifecycle.js +1 -0
  23. package/dist/task/operator/capabilities.js +6 -0
  24. package/dist/task/operator/envelope.js +2 -0
  25. package/dist/task/operator/index.js +5 -0
  26. package/dist/task/operator/registry.js +2 -0
  27. package/dist/task/operator/types.js +1 -0
  28. package/dist/task/paths.js +1 -0
  29. package/dist/task/source-prepare/source-fidelity-pi.js +2 -2
  30. package/dist/task/source-references.js +23 -48
  31. package/dist/task/source-state.js +1 -0
  32. package/dist/task/subagent-guidance.js +1 -0
  33. package/dist/worker/console/chat/assistant-content.js +2 -23
  34. package/dist/worker/console/chat/explore-tools.js +0 -13
  35. package/dist/worker/console/chat/pi-runtime.js +1182 -221
  36. package/dist/worker/console/chat/routes.js +71 -213
  37. package/dist/worker/console/chat/sdd-data-alignment.js +9 -65
  38. package/dist/worker/console/chat/session-catalog.js +0 -32
  39. package/dist/worker/console/chat/session-store.js +6 -22
  40. package/dist/worker/console/chat/shortcuts.js +0 -6
  41. package/dist/worker/console/chat/sift-bridge.js +1 -0
  42. package/dist/worker/console/chat/tool-preview.js +0 -11
  43. package/dist/worker/console/chat/tools.js +0 -6
  44. package/dist/worker/console/console-update-and-init.js +19 -1
  45. package/dist/worker/console/console-update-runtime.js +20 -5
  46. package/dist/worker/console/index.js +20 -0
  47. package/dist/worker/console/operator-actions.js +1 -13
  48. package/dist/worker/console/routes.js +0 -8
  49. package/dist/worker/console/server.js +29 -11
  50. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-C4NXyedy.js → abnfDiagram-N423BO3Z-hUmM_GRf.js} +1 -1
  51. package/dist/worker/console/static/assets/{arc-NZ3qXvBI.js → arc-Bt-xuieW.js} +1 -1
  52. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-COZSRvml.js → architectureDiagram-T3A2C74G-DTqkL4DJ.js} +1 -1
  53. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-Ck0Gxi9C.js → blockDiagram-VBNYF7ZC-Cy0MNnzV.js} +1 -1
  54. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-BX5HQ4Ox.js → c4Diagram-5PPSVZJV-DDdlT0Pd.js} +1 -1
  55. package/dist/worker/console/static/assets/channel-BpzRnZmU.js +1 -0
  56. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-CoviemSL.js → chunk-2GRJ4B5K-3JawwNZ6.js} +1 -1
  57. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-DbOdOkbZ.js → chunk-2Q5K7J3B-DoTp7Cri.js} +1 -1
  58. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-BsG2pmdQ.js → chunk-5RXB4S5H-CcirhZaS.js} +1 -1
  59. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-DGdvrNm8.js → chunk-5VM5RSS4-VrG21gnP.js} +1 -1
  60. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-BAy7Yd6y.js → chunk-6Q2QTUOP-DDOgIS70.js} +1 -1
  61. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-D9UA7hUb.js → chunk-GF5L2VYU-CBjmgvJ_.js} +1 -1
  62. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-DPz7SZ8V.js → chunk-JWPE2WC7-CCQSht8M.js} +1 -1
  63. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-BmuEOIh7.js → chunk-KBJHAD2P-BpGMkUUV.js} +1 -1
  64. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-CIhBWnd8.js → chunk-RYQCIY6F-DNDT41QL.js} +1 -1
  65. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-CScR6mDD.js → chunk-XXDRQBXY-euXnDFbn.js} +1 -1
  66. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-BhlMVqCc.js +1 -0
  67. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-BhlMVqCc.js +1 -0
  68. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-BjpfWaUr.js → cose-bilkent-JH36ORCC-BJ6NAeql.js} +1 -1
  69. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-BFQohJgT.js → cynefin-VYW2F7L2-F5JKIvIq.js} +1 -1
  70. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-D3gzRJnS.js → cynefinDiagram-MW4NZA55-Cwmkl_Gi.js} +1 -1
  71. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-5eojkhoA.js → dagre-VZM6K2ZE-BmCZ8815.js} +1 -1
  72. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-CpD8LWu_.js → diagram-7IWD3JNH-zWA3hUnX.js} +1 -1
  73. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-B8_4qJ2a.js → diagram-B4RE2ZJO-BzA-888F.js} +1 -1
  74. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-HOsXf0eu.js → diagram-LBJQPF4R-tPNheoch.js} +1 -1
  75. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-BqwRwiWP.js → diagram-Q27KOJAE-Cdi7Fyqp.js} +1 -1
  76. package/dist/worker/console/static/assets/{diagram-UB23O5K3-BRVCNZe1.js → diagram-UB23O5K3-DFK9VBf1.js} +1 -1
  77. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-Cvb1TgGh.js → ebnfDiagram-BXEA7PRR-xCUr1kpg.js} +1 -1
  78. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-DS0O0qG9.js → erDiagram-JOGREHBK-BANQHY_A.js} +1 -1
  79. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-BHIRvRr3.js → flowDiagram-UKHOOZJN-VHJYEMkP.js} +1 -1
  80. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-DcCJ1JWx.js → ganttDiagram-PKOTCBZU-DiyZQ0C6.js} +1 -1
  81. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-B9ia5ony.js → gitGraphDiagram-DS77QQ5N-CZtIeBBa.js} +1 -1
  82. package/dist/worker/console/static/assets/index-BlN6ytLr.css +1 -0
  83. package/dist/worker/console/static/assets/index-CA-jfWlE.js +449 -0
  84. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-3ogpgegn.js → infoDiagram-6WML65LV-BuSspC0X.js} +1 -1
  85. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-4tgpQ5SL.js → ishikawaDiagram-WSZJBQD7-DRJZyPFy.js} +1 -1
  86. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-DNfgHqFx.js → journeyDiagram-NVQOT4AX-DIfXIVuE.js} +1 -1
  87. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-Dz7ngC8z.js → kanban-definition-27J2QSJJ-CT10_7Lt.js} +1 -1
  88. package/dist/worker/console/static/assets/{linear-DI7Jv62E.js → linear-ufemj74H.js} +1 -1
  89. package/dist/worker/console/static/assets/{mermaid.core-CQA4Nzmo.js → mermaid.core-DEQe8-_m.js} +5 -5
  90. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-CtsMc8Mf.js → mindmap-definition-FAOFIHXS-BRLUrbrC.js} +1 -1
  91. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-ByppE9yH.js → pegDiagram-VL7TDLO6-BgibKtiF.js} +1 -1
  92. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-B5PtgFgt.js → pieDiagram-7S7Q4E2Y-D3eyfdV9.js} +1 -1
  93. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-Cq4p0k2K.js → quadrantDiagram-CIZ2JOQS-DXeTk5Px.js} +1 -1
  94. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-DjfkyljN.js → railroadDiagram-AXF67PYL-BgXdFEe7.js} +1 -1
  95. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-DzynNRSl.js → requirementDiagram-LRYGKXZP-CseC2A7R.js} +1 -1
  96. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-Cj7TCpTJ.js → sankeyDiagram-W5VNT64P-D80PFzfJ.js} +1 -1
  97. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-C73C6ykA.js → sequenceDiagram-SI44F4Z6-BWzHW7LS.js} +1 -1
  98. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-BiNLgN2x.js → sizeCapture-X5ZJPWSS-xWQYTLAn.js} +1 -1
  99. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-UwvjS64-.js → stateDiagram-OKZ733FA-CLxtpZeL.js} +1 -1
  100. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-CiVoq4G-.js +1 -0
  101. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-CC7DH98r.js → swimlanes-SLNWSIFB-DwugtmWV.js} +2 -2
  102. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-BkdgdpfR.js +8 -0
  103. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-LSBXTR70.js → timeline-definition-Z64GVDOM-DHEOwHIe.js} +1 -1
  104. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-BAuxWwGP.js → vennDiagram-T6HMQDX7-pmbZKlBK.js} +1 -1
  105. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y--E5_gjZx.js → wardleyDiagram-T6FBY63Y-CivHoM5q.js} +1 -1
  106. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-dJWNmyzF.js → xychartDiagram-ELKLHX3M-BfHIE7o6.js} +1 -1
  107. package/dist/worker/console/static/index.html +2 -2
  108. package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +10 -122
  109. package/dist/worker/console/static-src/operator-chat/compaction-message.js +0 -7
  110. package/dist/worker/console/static-src/operator-chat/pending-user-message.js +15 -35
  111. package/dist/worker/console/static-src/operator-chat/useChatSessions.js +62 -136
  112. package/dist/worker/console/static-src/operator-chat/useChatStream.js +68 -159
  113. package/dist/worker/console/static-src/operator-chat/useChatThread.js +56 -75
  114. package/dist/worker/console/static-src/operator-chat/useComposer.js +78 -206
  115. package/dist/worker/console/workspace-context.js +1 -21
  116. package/dist/worker/observe/static/router.js +1 -1
  117. package/dist/worker/observe/static/styles.css +4 -7
  118. package/dist/worker/observe/static/views/dag-inspector.js +19 -12
  119. package/dist/worker/observe/static/views/dag.js +2 -2
  120. package/dist/worker/scheduler/index.js +25 -0
  121. package/dist/workflows/dag/facts.js +4 -0
  122. package/dist/workflows/dag/frontend-closeout.js +1 -1
  123. package/dist/workflows/dag/frontend-design-policy.js +1 -2
  124. package/dist/workflows/dag/frontend-implementation-contract.js +4 -8
  125. package/dist/workflows/dag/frontend-prewrite-gate.js +3 -3
  126. package/dist/workflows/dag/frontend-repair.js +76 -55
  127. package/dist/workflows/dag/frontend-review-context.js +1 -2
  128. package/dist/workflows/dag/frontend-review-scopes.js +12 -34
  129. package/dist/workflows/dag/frontend-shape-facts.js +2 -12
  130. package/dist/workflows/dag/frontend-verification-trace.js +42 -8
  131. package/dist/workflows/dag/index.js +6 -0
  132. package/dist/workflows/dag/init-hybrid.js +160 -97
  133. package/dist/workflows/dynamic/index.js +7 -0
  134. package/docs/architecture/runtime-boundaries.md +3 -3
  135. package/docs/templates/frontend-implementation-dag.json +8 -9
  136. package/package.json +3 -7
  137. package/skills/frontend-bounded-implement/SKILL.md +3 -4
  138. package/skills/frontend-bounded-implement/references/code-standards.md +3 -3
  139. package/skills/frontend-contract/references/contract-protocol.md +1 -3
  140. package/skills/frontend-design-review/SKILL.md +7 -12
  141. package/skills/frontend-design-review/references/review-checklist.md +7 -7
  142. package/skills/frontend-plan/SKILL.md +0 -19
  143. package/skills/frontend-plan/references/decision-contract.md +19 -26
  144. package/skills/frontend-review/SKILL.md +18 -12
  145. package/skills/frontend-review/references/review-findings.md +43 -24
  146. package/dist/shared/pi-provider-recovery.js +0 -182
  147. package/dist/worker/console/chat/browser-automation.js +0 -363
  148. package/dist/worker/console/chat/browser-policy.js +0 -113
  149. package/dist/worker/console/chat/browser-routes.js +0 -162
  150. package/dist/worker/console/chat/pi-runtime/custom-tools/ask-user-question.js +0 -44
  151. package/dist/worker/console/chat/pi-runtime/custom-tools/browser-tools.js +0 -89
  152. package/dist/worker/console/chat/pi-runtime/custom-tools/explore-tools.js +0 -202
  153. package/dist/worker/console/chat/pi-runtime/custom-tools/goal-tools.js +0 -79
  154. package/dist/worker/console/chat/pi-runtime/custom-tools/operator-tools.js +0 -86
  155. package/dist/worker/console/chat/pi-runtime/custom-tools/todo-write.js +0 -38
  156. package/dist/worker/console/chat/pi-runtime/inspection-types.js +0 -28
  157. package/dist/worker/console/chat/pi-runtime/inspection.js +0 -439
  158. package/dist/worker/console/chat/pi-runtime/sdk-bindings.js +0 -153
  159. package/dist/worker/console/chat/pi-runtime/sdk-session.js +0 -5
  160. package/dist/worker/console/chat/scm-routes.js +0 -217
  161. package/dist/worker/console/chat/scm-service.js +0 -283
  162. package/dist/worker/console/chat/scm-tools.js +0 -111
  163. package/dist/worker/console/chat/session-mode-view.js +0 -49
  164. package/dist/worker/console/chat/session-mode.js +0 -220
  165. package/dist/worker/console/chat/terminal-routes.js +0 -216
  166. package/dist/worker/console/chat/terminal-sessions.js +0 -348
  167. package/dist/worker/console/chat/terminal-tools.js +0 -211
  168. package/dist/worker/console/static/assets/channel-BxdTlb_5.js +0 -1
  169. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-_ByA1Nf8.js +0 -1
  170. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-_ByA1Nf8.js +0 -1
  171. package/dist/worker/console/static/assets/index-B9goN3S5.css +0 -1
  172. package/dist/worker/console/static/assets/index-wXlQohNs.js +0 -469
  173. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-nLgMZ0D3.js +0 -1
  174. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-BcYqTady.js +0 -8
  175. package/dist/worker/console/static-src/operator-chat/active-turn-tail.js +0 -10
  176. package/dist/worker/console/static-src/operator-chat/chat-link.js +0 -94
  177. package/dist/worker/console/static-src/operator-chat/chat-scroll-position.js +0 -24
  178. package/dist/worker/console/static-src/operator-chat/composer-session-ledger.js +0 -192
  179. package/dist/worker/console/static-src/operator-chat/process-label.js +0 -41
  180. package/dist/worker/console/static-src/operator-chat/turn-group-equality.js +0 -13
  181. package/dist/worker/console/static-src/operator-chat/turn-process-disclosure.js +0 -10
  182. package/dist/worker/console/static-src/operator-chat/use-searchable-hidden.js +0 -51
  183. package/dist/worker/console/static-src/operator-chat/user-turn-anchor-equality.js +0 -21
  184. package/dist/worker/console/workspace-initialization.js +0 -209
  185. package/dist/workflows/dag/frontend-capacity.js +0 -9
  186. package/dist/workflows/dag/frontend-plan-completeness.js +0 -186
  187. package/dist/workflows/dag/frontend-plan-recovery-policy.js +0 -18
@@ -5,7 +5,7 @@
5
5
  * source/references/, separate from the derived source/需求.md contract.
6
6
  */
7
7
  import { createHash } from "node:crypto";
8
- import { access, copyFile, lstat, mkdir, readdir, readFile, writeFile, } from "node:fs/promises";
8
+ import { access, copyFile, mkdir, readdir, readFile, writeFile, } from "node:fs/promises";
9
9
  import path from "node:path";
10
10
  import { getTaskPaths, loadTaskConfig } from "./runtime.js";
11
11
  import { writeTaskConfig } from "../infrastructure/harness/task-store.js";
@@ -87,7 +87,6 @@ export async function materializeTaskReferenceDocs(input) {
87
87
  const referenceDir = path.join(paths.sourceDir, SOURCE_REFERENCE_DIRECTORY);
88
88
  await mkdir(referenceDir, { recursive: true });
89
89
  const materialized = [];
90
- const manifest = await readSourceManifest(paths.sourceDir);
91
90
  for (const doc of docs) {
92
91
  const absoluteSource = path.isAbsolute(doc.path)
93
92
  ? doc.path
@@ -95,10 +94,7 @@ export async function materializeTaskReferenceDocs(input) {
95
94
  await assertReadableFile(absoluteSource, `referenceDocs entry "${doc.name ?? doc.path}"`);
96
95
  const extension = path.extname(absoluteSource) || ".md";
97
96
  const baseName = slugifyName(doc.name ?? path.basename(absoluteSource, extension));
98
- const imported = manifest?.documents.find((entry) => path.basename(entry.materializedPath, path.extname(entry.materializedPath)) === baseName);
99
- const targetName = imported
100
- ? path.basename(imported.materializedPath)
101
- : `${baseName}${extension}`;
97
+ const targetName = `${baseName}${extension}`;
102
98
  const targetPath = path.join(referenceDir, targetName);
103
99
  try {
104
100
  await access(targetPath);
@@ -136,23 +132,14 @@ export async function importPrdDocument(input) {
136
132
  catch {
137
133
  // directory may be empty / just created
138
134
  }
139
- // Search every immutable reference, including suffixed and renamed imports.
140
- // Roles remain distinct: identical bytes must not erase a constraint/AC role.
141
- const matching = existingManifest?.documents.find((doc) => doc.role === role && doc.sha256 === hash.sha256 && doc.bytes === hash.bytes);
142
- if (matching) {
143
- const candidate = path.resolve(paths.sourceDir, matching.materializedPath);
144
- if (path.dirname(candidate) !== path.resolve(referenceDir)) {
145
- throw new Error(`REFERENCE_PATH_UNSAFE: ${matching.materializedPath}`);
146
- }
147
- const stats = await lstat(candidate);
148
- if (!stats.isFile() || stats.isSymbolicLink() ||
149
- !(await sameHashIfExists(candidate, hash.sha256))) {
150
- throw new Error(`REFERENCE_HASH_MISMATCH: ${matching.materializedPath}`);
151
- }
152
- }
153
- const targetFileName = matching
154
- ? path.basename(matching.materializedPath)
155
- : ensureUniqueReferenceName(existingNames, requestedName, extension);
135
+ // Prefer stable name "requirement.md" when free; otherwise suffix.
136
+ const preferredName = `${requestedName}${extension}`;
137
+ const targetFileName = existingNames.has(preferredName)
138
+ ? // If the same content is already there, reuse; else unique name.
139
+ (await sameHashIfExists(path.join(referenceDir, preferredName), hash.sha256))
140
+ ? preferredName
141
+ : ensureUniqueReferenceName(existingNames, requestedName, extension)
142
+ : preferredName;
156
143
  const targetPath = path.join(referenceDir, targetFileName);
157
144
  if (!(await fileExists(targetPath))) {
158
145
  await writeFile(targetPath, hash.content);
@@ -162,7 +149,7 @@ export async function importPrdDocument(input) {
162
149
  ? toPosixRelative(input.repoRoot, absoluteSource)
163
150
  : input.filePath.split(path.sep).join("/");
164
151
  const materializedRelativePath = `${SOURCE_REFERENCE_DIRECTORY}/${targetFileName}`;
165
- const document = matching ?? {
152
+ const document = {
166
153
  role,
167
154
  name: requestedName,
168
155
  sourcePath: sourcePathForRecord,
@@ -189,28 +176,20 @@ export async function importPrdDocument(input) {
189
176
  : (existingManifest?.updatedAt ?? importedAt),
190
177
  documents,
191
178
  };
192
- if (documentSetChanged)
193
- await writeSourceManifest(paths.sourceDir, manifest);
179
+ await writeSourceManifest(paths.sourceDir, manifest);
194
180
  const taskConfig = await loadTaskConfig(input.repoRoot, input.taskId);
195
181
  const referenceDocs = [...(taskConfig.referenceDocs ?? [])];
196
- const listedIndex = referenceDocs.findIndex((doc) => {
182
+ const alreadyListed = referenceDocs.some((doc) => {
197
183
  const absolute = path.isAbsolute(doc.path)
198
184
  ? doc.path
199
185
  : path.resolve(input.repoRoot, doc.path);
200
186
  return absolute === absoluteSource;
201
187
  });
202
- // Keep original source paths as provenance, but point materialization at
203
- // the chosen immutable filename so DAG generation cannot recreate duplicates.
204
- const reference = {
205
- name: path.basename(targetFileName, path.extname(targetFileName)),
206
- path: sourcePathForRecord,
207
- };
208
- const configChanged = listedIndex < 0 || referenceDocs[listedIndex]?.name !== reference.name;
209
- if (configChanged) {
210
- if (listedIndex < 0)
211
- referenceDocs.push(reference);
212
- else
213
- referenceDocs[listedIndex] = { ...referenceDocs[listedIndex], ...reference };
188
+ if (!alreadyListed) {
189
+ referenceDocs.push({
190
+ name: requestedName,
191
+ path: sourcePathForRecord,
192
+ });
214
193
  await writeTaskConfig(input.repoRoot, input.taskId, {
215
194
  ...taskConfig,
216
195
  referenceDocs,
@@ -219,15 +198,11 @@ export async function importPrdDocument(input) {
219
198
  // Managed contracts must bump revision after import-prd mutates manifest/task config.
220
199
  // Lazy import avoids circular init with contract/observe.
221
200
  const { refreshManagedContractAfterImport } = await import("./contract/import-revision.js");
222
- const changed = documentSetChanged || configChanged;
223
- if (changed) {
224
- await refreshManagedContractAfterImport({
225
- repoRoot: input.repoRoot,
226
- taskId: input.taskId,
227
- });
228
- }
201
+ await refreshManagedContractAfterImport({
202
+ repoRoot: input.repoRoot,
203
+ taskId: input.taskId,
204
+ });
229
205
  return {
230
- changed,
231
206
  taskId: input.taskId,
232
207
  sourcePath: sourcePathForRecord,
233
208
  materializedAbsolutePath: targetPath,
@@ -235,7 +210,7 @@ export async function importPrdDocument(input) {
235
210
  sha256: hash.sha256,
236
211
  bytes: hash.bytes,
237
212
  manifestPath: getSourceManifestPath(paths.sourceDir),
238
- referenceDocs,
213
+ referenceDocs: alreadyListed ? referenceDocs : [...referenceDocs],
239
214
  };
240
215
  }
241
216
  async function sameHashIfExists(filePath, sha256) {
@@ -0,0 +1 @@
1
+ export { assertPlanFreshForImplement, markSpecCompleted, refreshSourceState, } from "./runtime.js";
@@ -0,0 +1 @@
1
+ export { resolvePiSubagentTools, resolveSubagentGuidance, shouldInjectSubagentGuidance, SUBAGENT_GUIDANCE, SUBAGENT_GUIDANCE_STANDARD, SUBAGENT_GUIDANCE_STRONG, } from "./runtime.js";
@@ -115,30 +115,9 @@ export function splitFinalAssistantBlocks(blocks, options = {}) {
115
115
  if (lastProcessIndex === -1) {
116
116
  return { answerBlocks: displayable, processBlocks: [] };
117
117
  }
118
- const trailing = displayable.slice(lastProcessIndex + 1);
119
- if (trailing.length > 0) {
120
- return {
121
- answerBlocks: trailing,
122
- processBlocks: displayable.slice(0, lastProcessIndex + 1),
123
- };
124
- }
125
- // The stage ends on a non-text block (a tool call after the prose, or a final
126
- // thinking block). Returning an empty answer here hid the whole reply inside
127
- // the collapsed process subtree; keep the last prose block as the visible
128
- // answer instead (2026-09-08).
129
- let lastTextIndex = -1;
130
- for (let i = displayable.length - 1; i >= 0; i--) {
131
- if (isFinalAnswerBlock(displayable[i])) {
132
- lastTextIndex = i;
133
- break;
134
- }
135
- }
136
- if (lastTextIndex === -1) {
137
- return { answerBlocks: [], processBlocks: displayable };
138
- }
139
118
  return {
140
- answerBlocks: [displayable[lastTextIndex]],
141
- processBlocks: displayable.filter((_block, index) => index !== lastTextIndex),
119
+ answerBlocks: displayable.slice(lastProcessIndex + 1),
120
+ processBlocks: displayable.slice(0, lastProcessIndex + 1),
142
121
  };
143
122
  }
144
123
  export function joinAssistantText(blocks) {
@@ -71,10 +71,6 @@ export const SECRET_SCRUB_PATTERNS = [
71
71
  name: "private-key-block",
72
72
  re: /-----BEGIN (?:RSA |EC |OPENSSH |DSA |)PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |DSA |)PRIVATE KEY-----/g,
73
73
  },
74
- {
75
- name: "aimax-auth-token",
76
- re: /\bAIMAX_AUTH_TOKEN=["']?[^\s"']+/g,
77
- },
78
74
  ];
79
75
  /** Throw a typed explore error (kept as a value object so callers can read .code). */
80
76
  export class ExploreDeniedError extends Error {
@@ -93,10 +89,6 @@ export class ExploreDeniedError extends Error {
93
89
  */
94
90
  export function scrubSecrets(input) {
95
91
  let out = input;
96
- const liveToken = process.env.AIMAX_AUTH_TOKEN;
97
- if (liveToken && liveToken.length >= 8 && out.includes(liveToken)) {
98
- out = out.split(liveToken).join("[REDACTED:aimax-auth-token]");
99
- }
100
92
  const redactions = [];
101
93
  for (const { name, re } of SECRET_SCRUB_PATTERNS) {
102
94
  re.lastIndex = 0;
@@ -106,11 +98,6 @@ export function scrubSecrets(input) {
106
98
  redactions.push({ name, count: matches.length });
107
99
  }
108
100
  }
109
- if (liveToken && liveToken.length >= 8 && input.includes(liveToken)) {
110
- const existing = redactions.find((entry) => entry.name === "aimax-auth-token");
111
- if (!existing)
112
- redactions.push({ name: "aimax-auth-token", count: 1 });
113
- }
114
101
  return { scrubbed: out, redactions };
115
102
  }
116
103
  /** True if a repo-relative path matches a sensitive-file denylist pattern. */