pi-subagents 0.70.0 → 0.71.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 (279) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +4 -2
  3. package/agents/claude-code-writer.md +1 -0
  4. package/agents/codex-exec-writer.md +1 -0
  5. package/agents/cursor-agent-writer.md +1 -0
  6. package/agents/worker.md +3 -2
  7. package/docs/agents.md +7 -8
  8. package/docs/configuration.md +17 -1
  9. package/docs/extension-api.md +5 -1
  10. package/docs/models.md +1 -1
  11. package/docs/observability.md +17 -13
  12. package/docs/standalone-background.md +4 -4
  13. package/docs/tool-reference.md +9 -11
  14. package/docs/workflows.md +1 -1
  15. package/inspector-runner.mjs +1 -1
  16. package/package.json +2 -2
  17. package/skills/pi-subagents/SKILL.md +1 -0
  18. package/skills/pi-subagents/references/constraints-and-recipes.md +5 -2
  19. package/skills/pi-subagents/references/execution-controls.md +2 -2
  20. package/skills/pi-subagents/references/management-authoring-rpc.md +3 -3
  21. package/skills/pi-subagents/references/multi-lane-orchestration.md +8 -0
  22. package/skills/pi-subagents/references/prompting-and-roles.md +14 -13
  23. package/src/agents/agent-management.d.ts.map +1 -1
  24. package/src/agents/agent-management.js +11 -25
  25. package/src/agents/agent-management.js.map +1 -1
  26. package/src/agents/agent-serializer.d.ts.map +1 -1
  27. package/src/agents/agent-serializer.js +0 -4
  28. package/src/agents/agent-serializer.js.map +1 -1
  29. package/src/agents/agents.d.ts +17 -4
  30. package/src/agents/agents.d.ts.map +1 -1
  31. package/src/agents/agents.js +39 -22
  32. package/src/agents/agents.js.map +1 -1
  33. package/src/agents/proactive-skills.d.ts +1 -0
  34. package/src/agents/proactive-skills.d.ts.map +1 -1
  35. package/src/agents/proactive-skills.js +3 -1
  36. package/src/agents/proactive-skills.js.map +1 -1
  37. package/src/agents/runtime-agent-registry.d.ts +8 -3
  38. package/src/agents/runtime-agent-registry.d.ts.map +1 -1
  39. package/src/agents/runtime-agent-registry.js +14 -9
  40. package/src/agents/runtime-agent-registry.js.map +1 -1
  41. package/src/agents/skills.d.ts +2 -0
  42. package/src/agents/skills.d.ts.map +1 -1
  43. package/src/agents/skills.js +41 -8
  44. package/src/agents/skills.js.map +1 -1
  45. package/src/api/delegation.d.ts +14 -0
  46. package/src/api/delegation.d.ts.map +1 -1
  47. package/src/extension/index.d.ts.map +1 -1
  48. package/src/extension/index.js +5 -1
  49. package/src/extension/index.js.map +1 -1
  50. package/src/extension/rpc.d.ts +1 -1
  51. package/src/extension/rpc.d.ts.map +1 -1
  52. package/src/extension/rpc.js +11 -1
  53. package/src/extension/rpc.js.map +1 -1
  54. package/src/extension/tool-activation.d.ts +9 -0
  55. package/src/extension/tool-activation.d.ts.map +1 -0
  56. package/src/extension/tool-activation.js +172 -0
  57. package/src/extension/tool-activation.js.map +1 -0
  58. package/src/extension/tool-description.d.ts +4 -4
  59. package/src/extension/tool-description.d.ts.map +1 -1
  60. package/src/extension/tool-description.js +1 -1
  61. package/src/intercom/intercom-bridge.d.ts.map +1 -1
  62. package/src/intercom/intercom-bridge.js +2 -0
  63. package/src/intercom/intercom-bridge.js.map +1 -1
  64. package/src/runs/background/active-async-capacity.d.ts.map +1 -1
  65. package/src/runs/background/active-async-capacity.js +4 -33
  66. package/src/runs/background/active-async-capacity.js.map +1 -1
  67. package/src/runs/background/async-execution.d.ts.map +1 -1
  68. package/src/runs/background/async-execution.js +5 -67
  69. package/src/runs/background/async-execution.js.map +1 -1
  70. package/src/runs/background/async-job-tracker.d.ts.map +1 -1
  71. package/src/runs/background/async-job-tracker.js +25 -19
  72. package/src/runs/background/async-job-tracker.js.map +1 -1
  73. package/src/runs/background/async-resume.d.ts +1 -1
  74. package/src/runs/background/async-resume.d.ts.map +1 -1
  75. package/src/runs/background/async-resume.js +8 -6
  76. package/src/runs/background/async-resume.js.map +1 -1
  77. package/src/runs/background/async-status.d.ts +1 -0
  78. package/src/runs/background/async-status.d.ts.map +1 -1
  79. package/src/runs/background/async-status.js +1 -0
  80. package/src/runs/background/async-status.js.map +1 -1
  81. package/src/runs/background/binary-bootstrap.d.ts.map +1 -1
  82. package/src/runs/background/binary-bootstrap.js +28 -6
  83. package/src/runs/background/binary-bootstrap.js.map +1 -1
  84. package/src/runs/background/fleet-view.d.ts.map +1 -1
  85. package/src/runs/background/fleet-view.js +26 -7
  86. package/src/runs/background/fleet-view.js.map +1 -1
  87. package/src/runs/background/notify.d.ts +11 -0
  88. package/src/runs/background/notify.d.ts.map +1 -1
  89. package/src/runs/background/notify.js +71 -3
  90. package/src/runs/background/notify.js.map +1 -1
  91. package/src/runs/background/process-terminal-candidate.d.ts +18 -0
  92. package/src/runs/background/process-terminal-candidate.d.ts.map +1 -0
  93. package/src/runs/background/process-terminal-candidate.js +97 -0
  94. package/src/runs/background/process-terminal-candidate.js.map +1 -0
  95. package/src/runs/background/process-terminal.d.ts +3 -15
  96. package/src/runs/background/process-terminal.d.ts.map +1 -1
  97. package/src/runs/background/process-terminal.js +19 -96
  98. package/src/runs/background/process-terminal.js.map +1 -1
  99. package/src/runs/background/retained-children.d.ts.map +1 -1
  100. package/src/runs/background/retained-children.js +3 -2
  101. package/src/runs/background/retained-children.js.map +1 -1
  102. package/src/runs/background/run-child-session.d.ts +1 -0
  103. package/src/runs/background/run-child-session.d.ts.map +1 -1
  104. package/src/runs/background/run-child-session.js.map +1 -1
  105. package/src/runs/background/run-status.d.ts.map +1 -1
  106. package/src/runs/background/run-status.js +11 -5
  107. package/src/runs/background/run-status.js.map +1 -1
  108. package/src/runs/background/runner-aliases.d.ts.map +1 -1
  109. package/src/runs/background/runner-aliases.js +28 -16
  110. package/src/runs/background/runner-aliases.js.map +1 -1
  111. package/src/runs/background/runner-startup-failure.d.ts +14 -0
  112. package/src/runs/background/runner-startup-failure.d.ts.map +1 -0
  113. package/src/runs/background/runner-startup-failure.js +47 -0
  114. package/src/runs/background/runner-startup-failure.js.map +1 -0
  115. package/src/runs/background/stale-run-reconciler.d.ts.map +1 -1
  116. package/src/runs/background/stale-run-reconciler.js +9 -1
  117. package/src/runs/background/stale-run-reconciler.js.map +1 -1
  118. package/src/runs/background/subagent-runner-bootstrap.d.ts +14 -0
  119. package/src/runs/background/subagent-runner-bootstrap.d.ts.map +1 -0
  120. package/src/runs/background/subagent-runner-bootstrap.js +277 -0
  121. package/src/runs/background/subagent-runner-bootstrap.js.map +1 -0
  122. package/src/runs/background/subagent-runner.d.ts +5 -7
  123. package/src/runs/background/subagent-runner.d.ts.map +1 -1
  124. package/src/runs/background/subagent-runner.js +67 -274
  125. package/src/runs/background/subagent-runner.js.map +1 -1
  126. package/src/runs/background/workflow-terminal-proof.d.ts +18 -0
  127. package/src/runs/background/workflow-terminal-proof.d.ts.map +1 -0
  128. package/src/runs/background/workflow-terminal-proof.js +68 -0
  129. package/src/runs/background/workflow-terminal-proof.js.map +1 -0
  130. package/src/runs/foreground/execution.d.ts.map +1 -1
  131. package/src/runs/foreground/execution.js +43 -111
  132. package/src/runs/foreground/execution.js.map +1 -1
  133. package/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  134. package/src/runs/foreground/subagent-executor.js +108 -17
  135. package/src/runs/foreground/subagent-executor.js.map +1 -1
  136. package/src/runs/shared/acceptance.d.ts.map +1 -1
  137. package/src/runs/shared/acceptance.js +7 -40
  138. package/src/runs/shared/acceptance.js.map +1 -1
  139. package/src/runs/shared/child-hooks.d.ts +1 -3
  140. package/src/runs/shared/child-hooks.d.ts.map +1 -1
  141. package/src/runs/shared/child-hooks.js +1 -16
  142. package/src/runs/shared/child-hooks.js.map +1 -1
  143. package/src/runs/shared/child-launch.d.ts +0 -2
  144. package/src/runs/shared/child-launch.d.ts.map +1 -1
  145. package/src/runs/shared/child-launch.js +4 -2
  146. package/src/runs/shared/child-launch.js.map +1 -1
  147. package/src/runs/shared/child-runtime-config.d.ts +4 -0
  148. package/src/runs/shared/child-runtime-config.d.ts.map +1 -1
  149. package/src/runs/shared/child-runtime-config.js.map +1 -1
  150. package/src/runs/shared/child-session.d.ts +8 -9
  151. package/src/runs/shared/child-session.d.ts.map +1 -1
  152. package/src/runs/shared/child-session.js +67 -2
  153. package/src/runs/shared/child-session.js.map +1 -1
  154. package/src/runs/shared/dynamic-fanout.js +1 -1
  155. package/src/runs/shared/dynamic-fanout.js.map +1 -1
  156. package/src/runs/shared/external-cli-runner.d.ts.map +1 -1
  157. package/src/runs/shared/external-cli-runner.js +3 -1
  158. package/src/runs/shared/external-cli-runner.js.map +1 -1
  159. package/src/runs/shared/git-environment.d.ts +3 -0
  160. package/src/runs/shared/git-environment.d.ts.map +1 -0
  161. package/src/runs/shared/git-environment.js +28 -0
  162. package/src/runs/shared/git-environment.js.map +1 -0
  163. package/src/runs/shared/mcp-config-sources.d.ts +3 -0
  164. package/src/runs/shared/mcp-config-sources.d.ts.map +1 -1
  165. package/src/runs/shared/mcp-config-sources.js.map +1 -1
  166. package/src/runs/shared/mcp-direct-tool-allowlist.js +1 -1
  167. package/src/runs/shared/mcp-direct-tool-allowlist.js.map +1 -1
  168. package/src/runs/shared/mcp-direct-tool-grant.d.ts +3 -1
  169. package/src/runs/shared/mcp-direct-tool-grant.d.ts.map +1 -1
  170. package/src/runs/shared/mcp-direct-tool-grant.js +19 -5
  171. package/src/runs/shared/mcp-direct-tool-grant.js.map +1 -1
  172. package/src/runs/shared/parallel-utils.d.ts +0 -1
  173. package/src/runs/shared/parallel-utils.d.ts.map +1 -1
  174. package/src/runs/shared/parallel-utils.js.map +1 -1
  175. package/src/runs/shared/pi-spawn.d.ts +10 -1
  176. package/src/runs/shared/pi-spawn.d.ts.map +1 -1
  177. package/src/runs/shared/pi-spawn.js +86 -7
  178. package/src/runs/shared/pi-spawn.js.map +1 -1
  179. package/src/runs/shared/single-output.d.ts.map +1 -1
  180. package/src/runs/shared/single-output.js +10 -2
  181. package/src/runs/shared/single-output.js.map +1 -1
  182. package/src/runs/shared/structured-output.d.ts +7 -0
  183. package/src/runs/shared/structured-output.d.ts.map +1 -1
  184. package/src/runs/shared/structured-output.js +74 -0
  185. package/src/runs/shared/structured-output.js.map +1 -1
  186. package/src/runs/shared/subagent-control.d.ts.map +1 -1
  187. package/src/runs/shared/subagent-control.js +6 -19
  188. package/src/runs/shared/subagent-control.js.map +1 -1
  189. package/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
  190. package/src/runs/shared/subagent-prompt-runtime.js +23 -7
  191. package/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
  192. package/src/runs/shared/tool-availability.js +1 -1
  193. package/src/runs/shared/tool-availability.js.map +1 -1
  194. package/src/shared/child-session-name.d.ts.map +1 -1
  195. package/src/shared/child-session-name.js +4 -2
  196. package/src/shared/child-session-name.js.map +1 -1
  197. package/src/shared/fork-context.d.ts +4 -0
  198. package/src/shared/fork-context.d.ts.map +1 -1
  199. package/src/shared/fork-context.js +9 -4
  200. package/src/shared/fork-context.js.map +1 -1
  201. package/src/shared/launch-contract.d.ts.map +1 -1
  202. package/src/shared/launch-contract.js +0 -1
  203. package/src/shared/launch-contract.js.map +1 -1
  204. package/src/shared/pruned-fork.d.ts +1 -1
  205. package/src/shared/pruned-fork.d.ts.map +1 -1
  206. package/src/shared/pruned-fork.js +70 -65
  207. package/src/shared/pruned-fork.js.map +1 -1
  208. package/src/shared/types.d.ts +32 -13
  209. package/src/shared/types.d.ts.map +1 -1
  210. package/src/shared/types.js +2 -0
  211. package/src/shared/types.js.map +1 -1
  212. package/src/slash/delegation-adapters.d.ts +7 -1
  213. package/src/slash/delegation-adapters.d.ts.map +1 -1
  214. package/src/slash/delegation-adapters.js +17 -0
  215. package/src/slash/delegation-adapters.js.map +1 -1
  216. package/src/slash/prompt-template-bridge.d.ts.map +1 -1
  217. package/src/slash/prompt-template-bridge.js +14 -1
  218. package/src/slash/prompt-template-bridge.js.map +1 -1
  219. package/src/slash/prompt-workflows.d.ts.map +1 -1
  220. package/src/slash/prompt-workflows.js +16 -2
  221. package/src/slash/prompt-workflows.js.map +1 -1
  222. package/src/slash/slash-commands.d.ts.map +1 -1
  223. package/src/slash/slash-commands.js +5 -251
  224. package/src/slash/slash-commands.js.map +1 -1
  225. package/src/slash/subagent-cost.d.ts +29 -0
  226. package/src/slash/subagent-cost.d.ts.map +1 -0
  227. package/src/slash/subagent-cost.js +271 -0
  228. package/src/slash/subagent-cost.js.map +1 -0
  229. package/src/slash/subagents-admin.d.ts.map +1 -1
  230. package/src/slash/subagents-admin.js +4 -5
  231. package/src/slash/subagents-admin.js.map +1 -1
  232. package/src/tui/fleet.d.ts.map +1 -1
  233. package/src/tui/fleet.js +4 -0
  234. package/src/tui/fleet.js.map +1 -1
  235. package/src/tui/render.d.ts.map +1 -1
  236. package/src/tui/render.js +16 -11
  237. package/src/tui/render.js.map +1 -1
  238. package/src/watchdog/diff-tool.d.ts +2 -1
  239. package/src/watchdog/diff-tool.d.ts.map +1 -1
  240. package/src/watchdog/diff-tool.js +9 -3
  241. package/src/watchdog/diff-tool.js.map +1 -1
  242. package/src/watchdog/permission-arbiter.d.ts.map +1 -1
  243. package/src/watchdog/permission-arbiter.js +12 -8
  244. package/src/watchdog/permission-arbiter.js.map +1 -1
  245. package/src/watchdog/register-child.d.ts +3 -1
  246. package/src/watchdog/register-child.d.ts.map +1 -1
  247. package/src/watchdog/register-child.js +12 -3
  248. package/src/watchdog/register-child.js.map +1 -1
  249. package/src/watchdog/review.d.ts +1 -0
  250. package/src/watchdog/review.d.ts.map +1 -1
  251. package/src/watchdog/review.js +12 -6
  252. package/src/watchdog/review.js.map +1 -1
  253. package/src/watchdog/runtime.d.ts +1 -1
  254. package/src/watchdog/runtime.d.ts.map +1 -1
  255. package/src/watchdog/runtime.js +2 -1
  256. package/src/watchdog/runtime.js.map +1 -1
  257. package/src/watchdog/turn-delta.d.ts +5 -1
  258. package/src/watchdog/turn-delta.d.ts.map +1 -1
  259. package/src/watchdog/turn-delta.js +9 -5
  260. package/src/watchdog/turn-delta.js.map +1 -1
  261. package/src/workflows/scripted-workflow.d.ts.map +1 -1
  262. package/src/workflows/scripted-workflow.js +1 -3
  263. package/src/workflows/scripted-workflow.js.map +1 -1
  264. package/src/runs/shared/completion-evidence.d.ts +0 -31
  265. package/src/runs/shared/completion-evidence.d.ts.map +0 -1
  266. package/src/runs/shared/completion-evidence.js +0 -54
  267. package/src/runs/shared/completion-evidence.js.map +0 -1
  268. package/src/runs/shared/completion-guard.d.ts +0 -35
  269. package/src/runs/shared/completion-guard.d.ts.map +0 -1
  270. package/src/runs/shared/completion-guard.js +0 -214
  271. package/src/runs/shared/completion-guard.js.map +0 -1
  272. package/src/runs/shared/llm-intent-arbiter.d.ts +0 -48
  273. package/src/runs/shared/llm-intent-arbiter.d.ts.map +0 -1
  274. package/src/runs/shared/llm-intent-arbiter.js +0 -235
  275. package/src/runs/shared/llm-intent-arbiter.js.map +0 -1
  276. package/src/runs/shared/task-intent.d.ts +0 -38
  277. package/src/runs/shared/task-intent.d.ts.map +0 -1
  278. package/src/runs/shared/task-intent.js +0 -213
  279. package/src/runs/shared/task-intent.js.map +0 -1
@@ -1,214 +0,0 @@
1
- import { isMutatingTool } from "./long-running-guard.js";
2
- import { classifyTaskMutationIntent, expectsImplementationMutation, taskMayMutate } from "./task-intent.js";
3
- export { expectsImplementationMutation };
4
- const READ_ONLY_BUILTIN_TOOLS = new Set([
5
- "read",
6
- "grep",
7
- "find",
8
- "ls",
9
- "web_search",
10
- "fetch_content",
11
- "get_search_content",
12
- "source_check",
13
- "intercom",
14
- "contact_supervisor",
15
- "structured_output",
16
- ]);
17
- // Cursor native edit/write often land as thinking traces (inactive_trace /
18
- // transcript_trace) rather than toolCall parts when native tool replay is off
19
- // or the tool is inactive in context. Match pi-cursor-sdk display labels.
20
- const CURSOR_FILE_MUTATION_THINKING = /(?:^|\n)\s*Cursor (?:edit|write)\s*:/i;
21
- const REVIVED_TASK_PREFIX = /^You are reviving a previous subagent conversation\.\n\nOriginal run: .+\nOriginal agent: .+(?:\nOriginal session file: .+)?\n\nUse the stored session context as background\. Answer the orchestrator's follow-up below\. Do not assume the original child session is still running\.\n\nFollow-up:\n/;
22
- const IMPLEMENTATION_CHALLENGE_FOLLOW_UP_PATTERN = /^(?:Run )?implementation challenge pass (?:one|two|\d+)(?:\s+and implement any better current[- ]scope change\.?|\s+for the accepted candidate\.\s+Reconsider it and implement any better current[- ]scope change\.?)?$/i;
23
- const NO_BETTER_CHANGE_NEEDED_PATTERN = /^\s*no (?:better|further|additional) (?:current[- ]scope )?(?:code |source |file )?(?:change|changes|edit|edits|patch|patches) (?:is|are) needed\b/i;
24
- const KEPT_CURRENT_IMPLEMENTATION_PATTERN = /\b(?:kept (?:the )?current (?:implementation|candidate|shape)|(?:the )?current (?:implementation|candidate|shape) was kept)\b/i;
25
- const NO_CHANGE_MADE_PATTERN = /\bno (?:new )?(?:(?:code|source|file|test)(?:\s*(?:,\s*or|,|\/|or)\s*(?:code|source|file|test))* changes?|changes?) (?:were|was) made\b/i;
26
- const NO_BETTER_CHANGE_QUALIFIER_PATTERN = /\b(?:do\s+not|don't|dont|not|never|cannot|can't|cant|unable|uncertain|unsure|unclear|disagree|wrong|false|reject|rejected|rejecting|maybe|might|may|\w+n['’]t)\b/i;
27
- const REPORT_SENTENCE_PATTERN = /[^.!?]+(?:[.!?]+(?=(?:["”'’]?\s)|["”'’]?$)|$)/g;
28
- const QUOTED_CLAIM_PATTERN = /["“]([^"”]+)["”]([.!?]?\s*[^.!?]*)/g;
29
- const QUOTED_CLAIM_REFERENCE_PATTERN = /\b(?:that|this|it|claim|report|message|disagree)\b/i;
30
- const CLAIM_CONTRADICTION_PATTERN = /\bbut\b[^.!?]*\b(?:uncertain|unsure|unclear|disagree|wrong|false|reject|rejected|rejecting)\b/i;
31
- const IMPLEMENTATION_RETRACTION_PATTERN = /\b(?:found|identified)\s+(?:(?:a|an|the)\s+)?(?:required|necessary|additional|better)?\s*(?:(?:code|source|file|test)\s+)?(?:changes?|edits?|patches?)\b|\b(?:(?:implementation|code|source|file|test)\s+)?work\s+(?:remains?|is\s+(?:needed|required))\b|\b(?:(?:a|an|the)\s+)?(?:(?:code|source|file|test)\s+)?(?:changes?|edits?|patches?)\s+(?:are|is)\s+(?:needed|required)\b|\b(?:required|necessary|additional|better)\s+(?:(?:code|source|file|test)\s+)?(?:changes?|edits?|patches?)\b|\b(?:I|we)?\s*need\s+(?:(?:code|source|file|test)\s+)?(?:changes?|edits?|patches?)\b|\b(?:need|needs|require|requires)\s+(?:to\s+)?(?:implement|make|apply)\b/i;
32
- const IMPLEMENTATION_RETRACTION_GLOBAL_PATTERN = new RegExp(IMPLEMENTATION_RETRACTION_PATTERN.source, "gi");
33
- const DIRECT_CLAIM_RETRACTION_PATTERN = /^\s*(?:I\s+)?(?:disagree|reject|retract)\b|\b(?:disagree|retract|retracted|retracting|reject|rejected|rejecting)\b[^.!?]*\b(?:that|this|it|claim|report|message)\b|\b(?:that|this|it|claim|report|message)\b[^.!?]*\b(?:is|was)\s+(?:rejected|retracted)\b/i;
34
- const NEGATED_RETRACTION_PREFIX_PATTERN = /\b(?:no|not|\w+n['’]t)\b(?:\s+\w+){0,2}\s*$/i;
35
- const REPORTED_CLAIM_PREFIX_PATTERN = /["“]|\b(?:prior|previous)\s+(?:message|report)\b|\b(?:said|stated|reported)\b/i;
36
- const POST_CLAIM_SEPARATOR_PATTERN = /^[\s,;:.—–'"“‘’-]+/;
37
- export function hasMutationToolCapability(tools, mcpDirectTools) {
38
- if ((mcpDirectTools?.length ?? 0) > 0)
39
- return true;
40
- if (tools === undefined)
41
- return true;
42
- return !tools.every((tool) => READ_ONLY_BUILTIN_TOOLS.has(tool));
43
- }
44
- function hasBuiltinMutationTool(tools) {
45
- return tools === undefined || tools.some((tool) => !READ_ONLY_BUILTIN_TOOLS.has(tool));
46
- }
47
- function isWriterRole(agent, acceptanceRole) {
48
- return acceptanceRole === "writer"
49
- || (acceptanceRole === undefined && /\bworker\b/i.test(agent));
50
- }
51
- const WRITER_DELIVERY_PATTERN = /\b(?:address|resolve|work)\s+(?:backlog\s+)?(?:item|issue)\b|\b(?:land|ship)\s+(?:the\s+)?(?:change|changes|fix|feature|implementation)\b/i;
52
- export function validateImplementationToolContract(input) {
53
- if (input.completionGuard === false)
54
- return undefined;
55
- const requestedMutationTools = input.requestedTools?.filter((tool) => !READ_ONLY_BUILTIN_TOOLS.has(tool)) ?? [];
56
- const declaredMutationToolsWereRemoved = requestedMutationTools.length > 0 && !hasBuiltinMutationTool(input.tools);
57
- const configuredExtensionCapability = (input.configuredExtensions?.length ?? 0) > 0 && !declaredMutationToolsWereRemoved;
58
- if (hasMutationToolCapability(input.tools, input.mcpDirectTools) || configuredExtensionCapability)
59
- return undefined;
60
- const intent = classifyTaskMutationIntent(input.acceptanceRole === "writer" ? "worker" : input.agent, input.task);
61
- if (intent.kind === "read-only")
62
- return undefined;
63
- const writerTaskMayMutate = input.acceptanceRole === "writer"
64
- ? true
65
- : isWriterRole(input.agent, input.acceptanceRole)
66
- && (taskMayMutate(input.task) || WRITER_DELIVERY_PATTERN.test(input.task));
67
- if (intent.kind !== "implementation" && !writerTaskMayMutate && !declaredMutationToolsWereRemoved)
68
- return undefined;
69
- return `Agent '${input.agent}' was given an implementation task, but its tool allowlist has no mutation-capable tools. Add bash, edit, write, or another mutation-capable tool to the agent, or use a read-only task/agent.`;
70
- }
71
- function hasCheckpointMutationEvidence(message) {
72
- const record = message;
73
- if ((record.role !== "custom" && record.type !== "custom") || record.customType !== "pi-checkpoint")
74
- return false;
75
- const details = typeof record.details === "object" && record.details !== null && !Array.isArray(record.details)
76
- ? record.details
77
- : undefined;
78
- const data = typeof record.data === "object" && record.data !== null && !Array.isArray(record.data)
79
- ? record.data
80
- : typeof details?.beforeCommit === "string" || typeof details?.afterCommit === "string"
81
- ? details
82
- : details?.data && typeof details.data === "object" && !Array.isArray(details.data)
83
- ? details.data
84
- : undefined;
85
- return typeof data?.beforeCommit === "string"
86
- && typeof data.afterCommit === "string"
87
- && data.beforeCommit !== data.afterCommit;
88
- }
89
- export function hasMutationToolCall(messages, mutationTools) {
90
- for (const message of messages) {
91
- if (hasCheckpointMutationEvidence(message))
92
- return true;
93
- if (message.role !== "assistant")
94
- continue;
95
- for (const part of message.content) {
96
- if (part.type === "thinking" && CURSOR_FILE_MUTATION_THINKING.test(part.thinking))
97
- return true;
98
- if (part.type !== "toolCall")
99
- continue;
100
- const args = typeof part.arguments === "object" && part.arguments !== null && !Array.isArray(part.arguments)
101
- ? part.arguments
102
- : {};
103
- if (isMutatingTool(part.name, args, mutationTools))
104
- return true;
105
- }
106
- }
107
- return false;
108
- }
109
- function hasImplementationRetraction(text) {
110
- return Array.from(text.matchAll(IMPLEMENTATION_RETRACTION_GLOBAL_PATTERN)).some((retraction) => !NEGATED_RETRACTION_PREFIX_PATTERN.test(text.slice(0, retraction.index)));
111
- }
112
- function hasDirectClaimRetraction(text) {
113
- return DIRECT_CLAIM_RETRACTION_PATTERN.test(text.replace(POST_CLAIM_SEPARATOR_PATTERN, ""));
114
- }
115
- function isInsideQuotedText(report, index) {
116
- let quote;
117
- for (const char of report.slice(0, index)) {
118
- if (quote === "double") {
119
- if (char === "\"" || char === "”")
120
- quote = undefined;
121
- }
122
- else if (quote === "single") {
123
- if (char === "’")
124
- quote = undefined;
125
- }
126
- else if (char === "\"" || char === "“") {
127
- quote = "double";
128
- }
129
- else if (char === "‘") {
130
- quote = "single";
131
- }
132
- }
133
- return quote !== undefined;
134
- }
135
- function unqualifiedClaimIndex(report, sentences, pattern) {
136
- return sentences.findIndex((sentence) => {
137
- const claim = sentence.text.match(pattern);
138
- if (claim === null)
139
- return false;
140
- const before = sentence.text.slice(0, claim.index);
141
- const after = sentence.text.slice(claim.index + claim[0].length);
142
- const previous = before.trimEnd().at(-1);
143
- return previous !== "'"
144
- && previous !== "‘"
145
- && !isInsideQuotedText(report, sentence.offset + claim.index)
146
- && !REPORTED_CLAIM_PREFIX_PATTERN.test(before)
147
- && !NO_BETTER_CHANGE_QUALIFIER_PATTERN.test(before)
148
- && !CLAIM_CONTRADICTION_PATTERN.test(after)
149
- && !hasImplementationRetraction(after)
150
- && !hasDirectClaimRetraction(after);
151
- });
152
- }
153
- function hasLaterClaimRetraction(sentences, claimIndex) {
154
- return sentences.slice(claimIndex + 1).some((sentence) => hasImplementationRetraction(sentence.text)
155
- || hasDirectClaimRetraction(sentence.text));
156
- }
157
- function explicitlyRejectsQuotedClaim(report) {
158
- for (const [, claim, response] of report.matchAll(QUOTED_CLAIM_PATTERN)) {
159
- if ((KEPT_CURRENT_IMPLEMENTATION_PATTERN.test(claim) || NO_CHANGE_MADE_PATTERN.test(claim))
160
- && NO_BETTER_CHANGE_QUALIFIER_PATTERN.test(response)
161
- && QUOTED_CLAIM_REFERENCE_PATTERN.test(response))
162
- return true;
163
- }
164
- return false;
165
- }
166
- function isImplementationChallengeTask(task) {
167
- const followUp = task.replace(REVIVED_TASK_PREFIX, "");
168
- return followUp !== task && IMPLEMENTATION_CHALLENGE_FOLLOW_UP_PATTERN.test(followUp.trim());
169
- }
170
- function reportsNoBetterChallengeChange(messages) {
171
- const report = messages
172
- .filter((message) => message.role === "assistant")
173
- .flatMap((message) => message.content)
174
- .flatMap((part) => part.type === "text" ? [part.text] : [])
175
- .join("\n");
176
- if (explicitlyRejectsQuotedClaim(report))
177
- return false;
178
- const sentences = Array.from(report.matchAll(REPORT_SENTENCE_PATTERN), (match) => ({
179
- text: match[0],
180
- offset: match.index,
181
- }));
182
- const noBetterIndex = unqualifiedClaimIndex(report, sentences, NO_BETTER_CHANGE_NEEDED_PATTERN);
183
- if (noBetterIndex >= 0)
184
- return !hasLaterClaimRetraction(sentences, noBetterIndex);
185
- const keptIndex = unqualifiedClaimIndex(report, sentences, KEPT_CURRENT_IMPLEMENTATION_PATTERN);
186
- const noChangeIndex = unqualifiedClaimIndex(report, sentences, NO_CHANGE_MADE_PATTERN);
187
- return keptIndex >= 0
188
- && noChangeIndex >= 0
189
- && !hasLaterClaimRetraction(sentences, Math.min(keptIndex, noChangeIndex));
190
- }
191
- export function evaluateCompletionMutationGuard(input) {
192
- if (input.toolAvailabilityError && expectsImplementationMutation(input.agent, input.task)) {
193
- return {
194
- expectedMutation: true,
195
- attemptedMutation: false,
196
- triggered: false,
197
- blocked: true,
198
- message: input.toolAvailabilityError,
199
- };
200
- }
201
- const expectedMutation = hasMutationToolCapability(input.tools, input.mcpDirectTools)
202
- ? expectsImplementationMutation(input.agent, input.task)
203
- : false;
204
- const attemptedMutation = hasMutationToolCall(input.messages, input.mutationTools) || input.mutationEvidence?.attemptedMutation === true;
205
- const noEditChallengeComplete = isImplementationChallengeTask(input.task)
206
- && reportsNoBetterChallengeChange(input.messages);
207
- return {
208
- expectedMutation,
209
- attemptedMutation,
210
- triggered: expectedMutation && !attemptedMutation && !noEditChallengeComplete,
211
- blocked: false,
212
- };
213
- }
214
- //# sourceMappingURL=completion-guard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"completion-guard.js","sourceRoot":"","sources":["../../../../src/runs/shared/completion-guard.ts"],"names":[],"mappings":"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"}
@@ -1,48 +0,0 @@
1
- import type { StreamFn } from "@earendil-works/pi-agent-core";
2
- import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
3
- export type TaskMutationVerdict = "read-only" | "implementation" | "unavailable";
4
- export type TaskMutationArbiter = (task: string) => Promise<TaskMutationVerdict>;
5
- /** Map a model decision to a verdict. Only a high-confidence read_only rescues. */
6
- export declare function mapArbiterDecision(decision: {
7
- classification?: string;
8
- confidence?: string;
9
- } | undefined): TaskMutationVerdict;
10
- export interface TaskMutationArbiterOptions {
11
- /** Explicit "provider/id" model override (tests, config). */
12
- model?: string;
13
- /** Injectable stream function (tests). */
14
- streamFn?: StreamFn;
15
- timeoutMs?: number;
16
- }
17
- /** Model services the arbiter needs, plus the caller's session id for OpenCode session-routing headers. */
18
- export type ArbiterModelContext = Pick<ExtensionContext, "model" | "modelRegistry"> & {
19
- /** Session id the headers attach to (the child's, captured by detached runners; the parent's, passed by foreground callers). */
20
- sessionId?: string;
21
- };
22
- /** Create a memoized arbiter bound to the supplied model services, or undefined when disabled/unavailable. */
23
- export declare function createTaskMutationArbiter(ctx: ArbiterModelContext, options?: TaskMutationArbiterOptions): TaskMutationArbiter | undefined;
24
- export declare function isCompletionGuardFailure(result: {
25
- error?: string;
26
- }): boolean;
27
- export declare function arbitrateCompletionGuardRescue(input: {
28
- guardTriggered: boolean;
29
- task: string;
30
- arbiter?: TaskMutationArbiter;
31
- }): Promise<{
32
- triggered: boolean;
33
- rescued: boolean;
34
- }>;
35
- /**
36
- * When the completion guard hard-failed a run and the arbiter classifies the
37
- * task as read-only, clear the failure. Returns true when rescued. All other
38
- * verdicts and every failure mode keep the original guard behavior.
39
- *
40
- * Classification uses the task text only: the agent's own final message is
41
- * never evidence, so a child that failed to implement cannot talk its way
42
- * out of the guard by claiming the work was read-only.
43
- */
44
- export declare function maybeRescueCompletionGuardFailure(result: {
45
- exitCode?: number;
46
- error?: string;
47
- }, task: string, arbiter: TaskMutationArbiter | undefined): Promise<boolean>;
48
- //# sourceMappingURL=llm-intent-arbiter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"llm-intent-arbiter.d.ts","sourceRoot":"","sources":["../../../../src/runs/shared/llm-intent-arbiter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAuBxE,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,gBAAgB,GAAG,aAAa,CAAC;AAEjF,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAgBjF,mFAAmF;AACnF,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GACpE,mBAAmB,CAIrB;AAoBD,MAAM,WAAW,0BAA0B;IAC1C,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD,2GAA2G;AAC3G,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,eAAe,CAAC,GAAG;IACrF,gIAAgI;IAChI,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AA6JF,8GAA8G;AAC9G,wBAAgB,yBAAyB,CACxC,GAAG,EAAE,mBAAmB,EACxB,OAAO,CAAC,EAAE,0BAA0B,GAClC,mBAAmB,GAAG,SAAS,CAejC;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAE5E;AAED,wBAAsB,8BAA8B,CAAC,KAAK,EAAE;IAC3D,cAAc,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,mBAAmB,CAAC;CAC9B,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAgBpD;AAED;;;;;;;;GAQG;AACH,wBAAsB,iCAAiC,CACtD,MAAM,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,mBAAmB,GAAG,SAAS,GACtC,OAAO,CAAC,OAAO,CAAC,CAOlB"}
@@ -1,235 +0,0 @@
1
- import { createHash } from "node:crypto";
2
- import { Type } from "typebox";
3
- import { agentStreamOptions } from "../../shared/agent-stream-options.js";
4
- import { opencodeSessionHeaders } from "../../shared/opencode-session-headers.js";
5
- /**
6
- * LLM intent arbiter for the completion mutation guard.
7
- *
8
- * The regex classifier (task-intent.ts) is deliberately narrow, so exotic
9
- * review wording can still look like an implementation task ("to fix this,
10
- * compare the outputs", verbs inside URLs or quoted text). When the guard is
11
- * about to hard-fail a run that made no edits, this arbiter asks a model
12
- * whether the task actually instructed file changes. It can only downgrade a
13
- * failure to a pass; every error, timeout, or non-read-only verdict keeps the
14
- * guard's original behavior.
15
- *
16
- * Enabled by default; set PI_SUBAGENTS_LLM_INTENT_ARBITER=0 to disable.
17
- */
18
- const COMPLETION_GUARD_ERROR_PREFIX = "Subagent completed without making edits for an implementation task.";
19
- const DecisionParams = Type.Object({
20
- classification: Type.String({ enum: ["read_only", "implementation"] }),
21
- confidence: Type.String({
22
- enum: ["low", "medium", "high"],
23
- description: "Confidence in the classification. Only read_only with high confidence rescues a failed run.",
24
- }),
25
- reason: Type.String({ description: "One concise reason for this classification." }),
26
- }, { additionalProperties: false });
27
- /** Map a model decision to a verdict. Only a high-confidence read_only rescues. */
28
- export function mapArbiterDecision(decision) {
29
- if (!decision)
30
- return "unavailable";
31
- if (decision.classification === "read_only" && decision.confidence === "high")
32
- return "read-only";
33
- return "implementation";
34
- }
35
- const DEFAULT_ARBITER_TIMEOUT_MS = 10_000;
36
- function resolveArbiterModel(ctx, options) {
37
- const registry = ctx.modelRegistry;
38
- const explicit = options?.model?.trim();
39
- if (explicit) {
40
- const [provider, id] = explicit.split("/");
41
- if (provider && id)
42
- return registry.find?.(provider, id) ?? null;
43
- return null;
44
- }
45
- if (ctx.model)
46
- return ctx.model;
47
- const first = registry.getAvailable?.()[0];
48
- if (first?.provider && first.id)
49
- return registry.find?.(first.provider, first.id) ?? null;
50
- return null;
51
- }
52
- function resolveArbiterRuntime(ctx, options) {
53
- const model = resolveArbiterModel(ctx, options);
54
- if (!model?.provider || !model.id)
55
- return null;
56
- const registry = ctx.modelRegistry;
57
- const registered = registry.getRegisteredProviderConfig?.(model.provider);
58
- return {
59
- model,
60
- explicitStreamFn: options?.streamFn,
61
- registeredStreamFn: registered?.streamSimple,
62
- registeredApi: registered?.api,
63
- sessionId: ctx.sessionId,
64
- timeoutMs: options?.timeoutMs ?? DEFAULT_ARBITER_TIMEOUT_MS,
65
- };
66
- }
67
- async function resolveArbiterAuth(ctx, model) {
68
- const registry = ctx.modelRegistry;
69
- // Call as a METHOD on the registry: the host ModelRegistry implementation
70
- // is a class whose method reads instance state (this.runtime), so a
71
- // detached call silently fails auth. Same shape as the watchdog.
72
- if (!registry.getApiKeyAndHeaders)
73
- return {};
74
- try {
75
- const auth = await registry.getApiKeyAndHeaders(model);
76
- if (auth.ok === false)
77
- return undefined;
78
- return {
79
- ...(auth.apiKey ? { apiKey: auth.apiKey } : {}),
80
- ...(auth.headers ? { headers: auth.headers } : {}),
81
- ...(auth.env ? { env: auth.env } : {}),
82
- };
83
- }
84
- catch {
85
- return undefined;
86
- }
87
- }
88
- /** Build the effective stream function with resolved credentials wrapped in (watchdog pattern). */
89
- function authWrappedStreamFn(base, auth, sessionId) {
90
- return (model, context, streamOptions) => base(model, context, {
91
- ...(streamOptions ?? {}),
92
- ...(auth.apiKey ? { apiKey: auth.apiKey } : {}),
93
- ...(auth.env || streamOptions?.env ? { env: { ...(auth.env ?? {}), ...(streamOptions?.env ?? {}) } } : {}),
94
- headers: { ...opencodeSessionHeaders(model, sessionId), ...(streamOptions?.headers ?? {}), ...(auth.headers ?? {}) },
95
- });
96
- }
97
- async function runArbitration(runtime, auth, task) {
98
- // Keep optional Pi peers out of the detached runner's static import graph.
99
- const [{ Agent }, { convertToLlm }, { streamSimple }] = await Promise.all([
100
- import("@earendil-works/pi-agent-core"),
101
- import("@earendil-works/pi-coding-agent"),
102
- import("@earendil-works/pi-ai/compat"),
103
- ]);
104
- const streamFn = runtime.explicitStreamFn
105
- ?? (runtime.registeredApi !== undefined && runtime.registeredApi === runtime.model.api ? runtime.registeredStreamFn : undefined)
106
- ?? streamSimple;
107
- let decision;
108
- const tool = {
109
- name: "task_mutation_decision",
110
- label: "Task mutation decision",
111
- description: "Classify whether the task instructed file/code changes. Call exactly once.",
112
- parameters: DecisionParams,
113
- executionMode: "sequential",
114
- async execute(_toolCallId, params) {
115
- if (!decision)
116
- decision = params;
117
- return { content: [{ type: "text", text: "Decision recorded." }], details: { recorded: true } };
118
- },
119
- };
120
- const agent = new Agent({
121
- initialState: {
122
- systemPrompt: [
123
- "You classify whether a delegated coding-agent task instructed file or code changes.",
124
- "A task that asks to review, inspect, verify, report, or summarize is read-only even when it contains words like 'fix' as severity vocabulary ('must-fix items') or conditional change instructions that leave the change optional.",
125
- "Classify read_only only when the task text alone clearly indicates a read-only outcome. When in doubt, classify implementation.",
126
- "Set confidence to high only when you are certain the task is read-only; a read_only classification without high confidence is treated as implementation.",
127
- "The agent's own final message is never evidence: an agent that made no edits may still have failed to implement.",
128
- "Call task_mutation_decision exactly once with read_only or implementation, a confidence level, and a concise reason.",
129
- ].join("\n"),
130
- model: runtime.model,
131
- tools: [tool],
132
- },
133
- convertToLlm,
134
- ...agentStreamOptions(authWrappedStreamFn(streamFn, auth, runtime.sessionId)),
135
- getApiKey: (providerName) => providerName === runtime.model.provider ? auth.apiKey : undefined,
136
- beforeToolCall: async ({ toolCall }) => toolCall.name === tool.name ? undefined : { block: true, reason: "Only task_mutation_decision is allowed." },
137
- toolExecution: "sequential",
138
- });
139
- try {
140
- // The rescue gate refuses tasks over 8000 chars; if the arbiter is
141
- // still invoked with one, fail closed rather than decide from
142
- // partial evidence (an implementation clause could sit in the
143
- // omitted middle).
144
- if (task.length > 8000)
145
- return "unavailable";
146
- const prompt = `TASK:\n${task}`;
147
- await Promise.race([
148
- agent.prompt(prompt),
149
- new Promise((_, reject) => {
150
- const timeout = setTimeout(() => {
151
- agent.abort();
152
- reject(new Error("Task mutation arbiter timed out."));
153
- }, runtime.timeoutMs);
154
- timeout.unref?.();
155
- }),
156
- ]);
157
- if (!decision)
158
- return "unavailable";
159
- return mapArbiterDecision(decision);
160
- }
161
- catch {
162
- return "unavailable";
163
- }
164
- }
165
- /** Create a memoized arbiter bound to the supplied model services, or undefined when disabled/unavailable. */
166
- export function createTaskMutationArbiter(ctx, options) {
167
- if (process.env.PI_SUBAGENTS_LLM_INTENT_ARBITER === "0")
168
- return undefined;
169
- const runtime = resolveArbiterRuntime(ctx, options);
170
- if (!runtime)
171
- return undefined;
172
- const cache = new Map();
173
- return async (task) => {
174
- const key = createHash("sha256").update(task).digest("base64url");
175
- const cached = cache.get(key);
176
- if (cached)
177
- return cached;
178
- const auth = await resolveArbiterAuth(ctx, runtime.model);
179
- const verdict = auth ? await runArbitration(runtime, auth, task) : "unavailable";
180
- if (cache.size > 200)
181
- cache.clear();
182
- cache.set(key, verdict);
183
- return verdict;
184
- };
185
- }
186
- export function isCompletionGuardFailure(result) {
187
- return result.error?.startsWith(COMPLETION_GUARD_ERROR_PREFIX) === true;
188
- }
189
- export async function arbitrateCompletionGuardRescue(input) {
190
- if (!input.guardTriggered || !input.arbiter) {
191
- return { triggered: input.guardTriggered, rescued: false };
192
- }
193
- // Never decide from partial evidence: refuse tasks over 8000 chars before
194
- // even consulting the model.
195
- if (input.task.length > 8000) {
196
- return { triggered: true, rescued: false };
197
- }
198
- try {
199
- const verdict = await input.arbiter(input.task);
200
- if (verdict === "read-only")
201
- return { triggered: false, rescued: true };
202
- return { triggered: true, rescued: false };
203
- }
204
- catch {
205
- return { triggered: true, rescued: false };
206
- }
207
- }
208
- /**
209
- * When the completion guard hard-failed a run and the arbiter classifies the
210
- * task as read-only, clear the failure. Returns true when rescued. All other
211
- * verdicts and every failure mode keep the original guard behavior.
212
- *
213
- * Classification uses the task text only: the agent's own final message is
214
- * never evidence, so a child that failed to implement cannot talk its way
215
- * out of the guard by claiming the work was read-only.
216
- */
217
- export async function maybeRescueCompletionGuardFailure(result, task, arbiter) {
218
- if (!arbiter || !isCompletionGuardFailure(result))
219
- return false;
220
- const verdict = await arbitrateWithGuard(arbiter, task);
221
- if (verdict !== "read-only")
222
- return false;
223
- result.exitCode = 0;
224
- delete result.error;
225
- return true;
226
- }
227
- async function arbitrateWithGuard(arbiter, task) {
228
- try {
229
- return await arbiter(task);
230
- }
231
- catch {
232
- return "unavailable";
233
- }
234
- }
235
- //# sourceMappingURL=llm-intent-arbiter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"llm-intent-arbiter.js","sourceRoot":"","sources":["../../../../src/runs/shared/llm-intent-arbiter.ts"],"names":[],"mappings":"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"}
@@ -1,38 +0,0 @@
1
- /**
2
- * Shared task mutation-intent classifier.
3
- *
4
- * Single authority for reading a task's wording, answering two different
5
- * questions from one prohibition analysis:
6
- *
7
- * - `classifyTaskMutationIntent` / `expectsImplementationMutation`: does the
8
- * task REQUIRE file changes? Consumed by the completion mutation guard,
9
- * which blocks completion, so its vocabulary is deliberately narrow.
10
- * Verbs inside filenames and path-like tokens do not count.
11
- * - `taskMayMutate`: COULD the task plausibly change files? Consumed by
12
- * acceptance level inference, which only raises evidence gates, so its
13
- * vocabulary is deliberately broad (any bare write verb).
14
- *
15
- * Explicit read-only wording ("do not modify", "review only") is a task-level
16
- * intent only when no write imperative survives outside those phrases. A task
17
- * like "Do not modify tests; implement the fix" is an implementation task with
18
- * a scoped constraint, not a read-only task.
19
- */
20
- declare function stripSeverityCompounds(task: string): string;
21
- export { stripSeverityCompounds };
22
- export type TaskMutationIntent = {
23
- kind: "implementation";
24
- } | {
25
- kind: "read-only";
26
- } | {
27
- kind: "unknown";
28
- };
29
- export declare function classifyTaskMutationIntent(agent: string, task: string): TaskMutationIntent;
30
- export declare function expectsImplementationMutation(agent: string, task: string): boolean;
31
- /**
32
- * Whether the task could plausibly change files. Blanket prohibitions win;
33
- * write verbs inside a scoped prohibition's object or a read-only deliverable
34
- * phrase ("write a summary report") do not count; any other bare write verb
35
- * does.
36
- */
37
- export declare function taskMayMutate(task: string): boolean;
38
- //# sourceMappingURL=task-intent.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"task-intent.d.ts","sourceRoot":"","sources":["../../../../src/runs/shared/task-intent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AA4EH,iBAAS,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AACD,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAwClC,MAAM,MAAM,kBAAkB,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AA8D1G,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAoB1F;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAElF;AASD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKnD"}