@caupulican/pi-adaptative 0.81.42 → 0.81.43

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 (1406) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/bun/cli.d.ts.map +1 -1
  3. package/dist/bun/cli.js.map +1 -1
  4. package/dist/bun/register-bedrock.d.ts.map +1 -1
  5. package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
  6. package/dist/bun/restore-sandbox-env.js.map +1 -1
  7. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +1 -1
  8. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +1 -1
  9. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts.map +1 -1
  10. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js +52 -49
  11. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js.map +1 -1
  12. package/dist/bundled-resources/extensions/tmux-agent-manager/index.ts +62 -57
  13. package/dist/bundled-resources/prompts/skillify.md +1 -1
  14. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/fs.py +16 -19
  15. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/search.py +12 -26
  16. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/strings.py +15 -121
  17. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/text.py +52 -79
  18. package/dist/bundled-resources/runtimes/pi-shell-engine/escapes.py +70 -0
  19. package/dist/bundled-resources/runtimes/pi-shell-engine/exec.py +110 -61
  20. package/dist/bundled-resources/runtimes/pi-shell-engine/main.py +106 -23
  21. package/dist/bundled-resources/runtimes/pi-shell-engine/paths.py +10 -0
  22. package/dist/bundled-resources/runtimes/pi-shell-engine/proc.py +12 -4
  23. package/dist/bundled-resources/runtimes/pi-shell-engine/shell_args.py +22 -0
  24. package/dist/bundled-resources/runtimes/pi-shell-engine/state.py +9 -2
  25. package/dist/bundled-resources/runtimes/pi-shell-engine/tokens.py +129 -259
  26. package/dist/bundled-resources/skills/authorized-web-security-audit/SKILL.md +187 -0
  27. package/dist/bundled-resources/skills/authorized-web-security-audit/references/assessment-contract.md +92 -0
  28. package/dist/bundled-resources/skills/deduplicate-by-evidence/SKILL.md +134 -0
  29. package/dist/bundled-resources/skills/evidence-gated-tdd/SKILL.md +93 -0
  30. package/dist/bundled-resources/skills/evidence-gated-tdd/references/evidence-model.md +27 -0
  31. package/dist/bundled-resources/skills/evidence-gated-tdd/references/security-scanners.md +24 -0
  32. package/dist/bundled-resources/skills/harness-self-adaptation/SKILL.md +4 -2
  33. package/dist/bundled-resources/skills/secure-agent-tool-surfaces/SKILL.md +217 -0
  34. package/dist/bundled-resources/skills/secure-agent-tool-surfaces/references/defensive-exploit-catalogue.md +175 -0
  35. package/dist/bundled-resources/skills/secure-agent-tool-surfaces/references/tool-boundary-checklist.md +87 -0
  36. package/dist/bundled-resources/skills/skill-architect/SKILL.md +2 -2
  37. package/dist/bundled-resources/skills/skill-creator/SKILL.md +188 -0
  38. package/dist/bundled-resources/skills/skill-creator/references/pi-skill-contract.md +73 -0
  39. package/dist/bundled-resources/skills/skill-creator/scripts/init-skill.mjs +142 -0
  40. package/dist/bundled-resources/skills/skill-creator/scripts/validate-skill.mjs +122 -0
  41. package/dist/cli/args.d.ts.map +1 -1
  42. package/dist/cli/args.js.map +1 -1
  43. package/dist/cli/config-selector.d.ts.map +1 -1
  44. package/dist/cli/config-selector.js.map +1 -1
  45. package/dist/cli/file-processor.d.ts.map +1 -1
  46. package/dist/cli/file-processor.js +8 -8
  47. package/dist/cli/file-processor.js.map +1 -1
  48. package/dist/cli/initial-message.d.ts +1 -1
  49. package/dist/cli/initial-message.d.ts.map +1 -1
  50. package/dist/cli/initial-message.js.map +1 -1
  51. package/dist/cli/list-models.d.ts.map +1 -1
  52. package/dist/cli/list-models.js.map +1 -1
  53. package/dist/cli/piped-stdin.d.ts +4 -0
  54. package/dist/cli/piped-stdin.d.ts.map +1 -0
  55. package/dist/cli/piped-stdin.js +13 -0
  56. package/dist/cli/piped-stdin.js.map +1 -0
  57. package/dist/cli/session-picker.d.ts.map +1 -1
  58. package/dist/cli/session-picker.js.map +1 -1
  59. package/dist/cli.d.ts.map +1 -1
  60. package/dist/cli.js.map +1 -1
  61. package/dist/config.d.ts.map +1 -1
  62. package/dist/config.js +9 -14
  63. package/dist/config.js.map +1 -1
  64. package/dist/core/agent-directory-layout.d.ts.map +1 -1
  65. package/dist/core/agent-directory-layout.js.map +1 -1
  66. package/dist/core/agent-paths.d.ts.map +1 -1
  67. package/dist/core/agent-paths.js.map +1 -1
  68. package/dist/core/agent-session-contracts.d.ts +5 -9
  69. package/dist/core/agent-session-contracts.d.ts.map +1 -1
  70. package/dist/core/agent-session-contracts.js +1 -12
  71. package/dist/core/agent-session-contracts.js.map +1 -1
  72. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  73. package/dist/core/agent-session-runtime.js +10 -25
  74. package/dist/core/agent-session-runtime.js.map +1 -1
  75. package/dist/core/agent-session-services.d.ts.map +1 -1
  76. package/dist/core/agent-session-services.js.map +1 -1
  77. package/dist/core/agent-session.d.ts +24 -1
  78. package/dist/core/agent-session.d.ts.map +1 -1
  79. package/dist/core/agent-session.js +210 -237
  80. package/dist/core/agent-session.js.map +1 -1
  81. package/dist/core/auth-guidance.d.ts.map +1 -1
  82. package/dist/core/auth-guidance.js.map +1 -1
  83. package/dist/core/auth-storage.d.ts +4 -1
  84. package/dist/core/auth-storage.d.ts.map +1 -1
  85. package/dist/core/auth-storage.js +13 -39
  86. package/dist/core/auth-storage.js.map +1 -1
  87. package/dist/core/autonomy/approval-gate.d.ts.map +1 -1
  88. package/dist/core/autonomy/approval-gate.js.map +1 -1
  89. package/dist/core/autonomy/bounded-completion.d.ts.map +1 -1
  90. package/dist/core/autonomy/bounded-completion.js.map +1 -1
  91. package/dist/core/autonomy/contracts.d.ts.map +1 -1
  92. package/dist/core/autonomy/envelope-enforcement.d.ts.map +1 -1
  93. package/dist/core/autonomy/envelope-enforcement.js.map +1 -1
  94. package/dist/core/autonomy/evidence-finding-projection.d.ts +11 -0
  95. package/dist/core/autonomy/evidence-finding-projection.d.ts.map +1 -0
  96. package/dist/core/autonomy/evidence-finding-projection.js +37 -0
  97. package/dist/core/autonomy/evidence-finding-projection.js.map +1 -0
  98. package/dist/core/autonomy/foreground-envelope.d.ts.map +1 -1
  99. package/dist/core/autonomy/foreground-envelope.js.map +1 -1
  100. package/dist/core/autonomy/gates.d.ts.map +1 -1
  101. package/dist/core/autonomy/gates.js.map +1 -1
  102. package/dist/core/autonomy/lane-private-paths.d.ts.map +1 -1
  103. package/dist/core/autonomy/lane-private-paths.js.map +1 -1
  104. package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
  105. package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
  106. package/dist/core/autonomy/lane-tracker.d.ts.map +1 -1
  107. package/dist/core/autonomy/lane-tracker.js +2 -3
  108. package/dist/core/autonomy/lane-tracker.js.map +1 -1
  109. package/dist/core/autonomy/path-scope.d.ts.map +1 -1
  110. package/dist/core/autonomy/path-scope.js.map +1 -1
  111. package/dist/core/autonomy/risk-assessment.d.ts.map +1 -1
  112. package/dist/core/autonomy/session-lane-record.d.ts.map +1 -1
  113. package/dist/core/autonomy/session-lane-record.js.map +1 -1
  114. package/dist/core/autonomy/status.d.ts.map +1 -1
  115. package/dist/core/autonomy/status.js.map +1 -1
  116. package/dist/core/autonomy/subagent-prompt.d.ts.map +1 -1
  117. package/dist/core/autonomy/subagent-prompt.js.map +1 -1
  118. package/dist/core/autonomy/telemetry-events.d.ts.map +1 -1
  119. package/dist/core/autonomy/telemetry-events.js.map +1 -1
  120. package/dist/core/autonomy-telemetry.d.ts.map +1 -1
  121. package/dist/core/autonomy-telemetry.js +2 -4
  122. package/dist/core/autonomy-telemetry.js.map +1 -1
  123. package/dist/core/background-lane-controller.d.ts.map +1 -1
  124. package/dist/core/background-lane-controller.js +2 -15
  125. package/dist/core/background-lane-controller.js.map +1 -1
  126. package/dist/core/background-tool-task-controller.d.ts +88 -0
  127. package/dist/core/background-tool-task-controller.d.ts.map +1 -0
  128. package/dist/core/background-tool-task-controller.js +470 -0
  129. package/dist/core/background-tool-task-controller.js.map +1 -0
  130. package/dist/core/bash-execution-controller.d.ts +1 -0
  131. package/dist/core/bash-execution-controller.d.ts.map +1 -1
  132. package/dist/core/bash-execution-controller.js +5 -4
  133. package/dist/core/bash-execution-controller.js.map +1 -1
  134. package/dist/core/bash-executor.d.ts.map +1 -1
  135. package/dist/core/bash-executor.js.map +1 -1
  136. package/dist/core/bedrock-sso-login.d.ts.map +1 -1
  137. package/dist/core/bedrock-sso-login.js.map +1 -1
  138. package/dist/core/billing-failover-controller.d.ts.map +1 -1
  139. package/dist/core/billing-failover-controller.js +3 -3
  140. package/dist/core/billing-failover-controller.js.map +1 -1
  141. package/dist/core/billing-failover.d.ts.map +1 -1
  142. package/dist/core/billing-failover.js.map +1 -1
  143. package/dist/core/capability-contract.d.ts.map +1 -1
  144. package/dist/core/catalog-manager.d.ts.map +1 -1
  145. package/dist/core/catalog-manager.js +0 -0
  146. package/dist/core/catalog-manager.js.map +1 -1
  147. package/dist/core/compaction-controller.d.ts +2 -0
  148. package/dist/core/compaction-controller.d.ts.map +1 -1
  149. package/dist/core/compaction-controller.js +21 -8
  150. package/dist/core/compaction-controller.js.map +1 -1
  151. package/dist/core/compaction-support.d.ts +8 -0
  152. package/dist/core/compaction-support.d.ts.map +1 -1
  153. package/dist/core/compaction-support.js +0 -2
  154. package/dist/core/compaction-support.js.map +1 -1
  155. package/dist/core/context/artifact-retrieval.d.ts.map +1 -1
  156. package/dist/core/context/artifact-retrieval.js.map +1 -1
  157. package/dist/core/context/brain-curator.d.ts.map +1 -1
  158. package/dist/core/context/brain-curator.js +14 -33
  159. package/dist/core/context/brain-curator.js.map +1 -1
  160. package/dist/core/context/context-artifacts.d.ts.map +1 -1
  161. package/dist/core/context/context-artifacts.js +16 -24
  162. package/dist/core/context/context-artifacts.js.map +1 -1
  163. package/dist/core/context/context-audit.d.ts.map +1 -1
  164. package/dist/core/context/context-audit.js +3 -17
  165. package/dist/core/context/context-audit.js.map +1 -1
  166. package/dist/core/context/context-composition.d.ts.map +1 -1
  167. package/dist/core/context/context-composition.js.map +1 -1
  168. package/dist/core/context/context-item.d.ts.map +1 -1
  169. package/dist/core/context/context-item.js.map +1 -1
  170. package/dist/core/context/context-prompt-enforcement.d.ts.map +1 -1
  171. package/dist/core/context/context-prompt-enforcement.js +3 -16
  172. package/dist/core/context/context-prompt-enforcement.js.map +1 -1
  173. package/dist/core/context/context-prompt-policy.d.ts.map +1 -1
  174. package/dist/core/context/context-prompt-policy.js.map +1 -1
  175. package/dist/core/context/context-retention.d.ts.map +1 -1
  176. package/dist/core/context/context-retention.js.map +1 -1
  177. package/dist/core/context/context-store-retention.d.ts.map +1 -1
  178. package/dist/core/context/context-store-retention.js.map +1 -1
  179. package/dist/core/context/context-store.d.ts.map +1 -1
  180. package/dist/core/context/context-store.js.map +1 -1
  181. package/dist/core/context/context-tool-result.d.ts +4 -0
  182. package/dist/core/context/context-tool-result.d.ts.map +1 -0
  183. package/dist/core/context/context-tool-result.js +15 -0
  184. package/dist/core/context/context-tool-result.js.map +1 -0
  185. package/dist/core/context/current-work-memory.d.ts.map +1 -1
  186. package/dist/core/context/current-work-memory.js.map +1 -1
  187. package/dist/core/context/file-store-memory-provider.d.ts.map +1 -1
  188. package/dist/core/context/file-store-memory-provider.js +7 -28
  189. package/dist/core/context/file-store-memory-provider.js.map +1 -1
  190. package/dist/core/context/local-memory-search.d.ts +11 -0
  191. package/dist/core/context/local-memory-search.d.ts.map +1 -0
  192. package/dist/core/context/local-memory-search.js +37 -0
  193. package/dist/core/context/local-memory-search.js.map +1 -0
  194. package/dist/core/context/long-term-memory-trigger.d.ts.map +1 -1
  195. package/dist/core/context/long-term-memory-trigger.js.map +1 -1
  196. package/dist/core/context/memory-diagnostics.d.ts.map +1 -1
  197. package/dist/core/context/memory-diagnostics.js.map +1 -1
  198. package/dist/core/context/memory-index-store.d.ts.map +1 -1
  199. package/dist/core/context/memory-index-store.js.map +1 -1
  200. package/dist/core/context/memory-prompt-block.d.ts.map +1 -1
  201. package/dist/core/context/memory-prompt-block.js.map +1 -1
  202. package/dist/core/context/memory-prompt-budget.d.ts.map +1 -1
  203. package/dist/core/context/memory-prompt-budget.js.map +1 -1
  204. package/dist/core/context/memory-provider-contract.d.ts.map +1 -1
  205. package/dist/core/context/memory-provider-contract.js.map +1 -1
  206. package/dist/core/context/memory-retrieval.d.ts.map +1 -1
  207. package/dist/core/context/memory-retrieval.js.map +1 -1
  208. package/dist/core/context/memory-tier-composer.d.ts.map +1 -1
  209. package/dist/core/context/memory-tier-composer.js.map +1 -1
  210. package/dist/core/context/message-text.d.ts +7 -0
  211. package/dist/core/context/message-text.d.ts.map +1 -0
  212. package/dist/core/context/message-text.js +68 -0
  213. package/dist/core/context/message-text.js.map +1 -0
  214. package/dist/core/context/okf-memory-provider.d.ts.map +1 -1
  215. package/dist/core/context/okf-memory-provider.js +4 -30
  216. package/dist/core/context/okf-memory-provider.js.map +1 -1
  217. package/dist/core/context/okf-memory.d.ts.map +1 -1
  218. package/dist/core/context/okf-memory.js.map +1 -1
  219. package/dist/core/context/policy-engine.d.ts.map +1 -1
  220. package/dist/core/context/policy-engine.js.map +1 -1
  221. package/dist/core/context/policy-types.d.ts.map +1 -1
  222. package/dist/core/context/sqlite-runtime-index.d.ts.map +1 -1
  223. package/dist/core/context/sqlite-runtime-index.js.map +1 -1
  224. package/dist/core/context/storage-authority.d.ts.map +1 -1
  225. package/dist/core/context/tool-output-packer.d.ts.map +1 -1
  226. package/dist/core/context/tool-output-packer.js.map +1 -1
  227. package/dist/core/context-gc.d.ts.map +1 -1
  228. package/dist/core/context-gc.js +14 -21
  229. package/dist/core/context-gc.js.map +1 -1
  230. package/dist/core/context-pipeline.d.ts +1 -3
  231. package/dist/core/context-pipeline.d.ts.map +1 -1
  232. package/dist/core/context-pipeline.js +64 -145
  233. package/dist/core/context-pipeline.js.map +1 -1
  234. package/dist/core/cost/cost-summary.d.ts.map +1 -1
  235. package/dist/core/cost/cost-summary.js.map +1 -1
  236. package/dist/core/cost/daily-usage.d.ts.map +1 -1
  237. package/dist/core/cost/daily-usage.js.map +1 -1
  238. package/dist/core/cost/session-usage.d.ts.map +1 -1
  239. package/dist/core/cost/session-usage.js.map +1 -1
  240. package/dist/core/cost-guard.d.ts.map +1 -1
  241. package/dist/core/cost-guard.js.map +1 -1
  242. package/dist/core/default-tool-surface.d.ts.map +1 -1
  243. package/dist/core/default-tool-surface.js +1 -0
  244. package/dist/core/default-tool-surface.js.map +1 -1
  245. package/dist/core/defaults.d.ts.map +1 -1
  246. package/dist/core/delegation/managed-lane-controller.d.ts.map +1 -1
  247. package/dist/core/delegation/managed-lane-controller.js +2 -6
  248. package/dist/core/delegation/managed-lane-controller.js.map +1 -1
  249. package/dist/core/delegation/session-worker-claim.d.ts.map +1 -1
  250. package/dist/core/delegation/session-worker-claim.js.map +1 -1
  251. package/dist/core/delegation/worker-action-journal.d.ts.map +1 -1
  252. package/dist/core/delegation/worker-action-journal.js +0 -4
  253. package/dist/core/delegation/worker-action-journal.js.map +1 -1
  254. package/dist/core/delegation/worker-actions.d.ts.map +1 -1
  255. package/dist/core/delegation/worker-actions.js.map +1 -1
  256. package/dist/core/delegation/worker-agent-control-coordinator.d.ts +1 -0
  257. package/dist/core/delegation/worker-agent-control-coordinator.d.ts.map +1 -1
  258. package/dist/core/delegation/worker-agent-control-coordinator.js +13 -15
  259. package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -1
  260. package/dist/core/delegation/worker-agent-control.d.ts.map +1 -1
  261. package/dist/core/delegation/worker-agent-control.js +1 -4
  262. package/dist/core/delegation/worker-agent-control.js.map +1 -1
  263. package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
  264. package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
  265. package/dist/core/delegation/worker-claim.d.ts.map +1 -1
  266. package/dist/core/delegation/worker-claim.js.map +1 -1
  267. package/dist/core/delegation/worker-conversation-store.d.ts.map +1 -1
  268. package/dist/core/delegation/worker-conversation-store.js +0 -2
  269. package/dist/core/delegation/worker-conversation-store.js.map +1 -1
  270. package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
  271. package/dist/core/delegation/worker-delegation-controller.js +5 -14
  272. package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
  273. package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -1
  274. package/dist/core/delegation/worker-dispatch-scheduler.d.ts.map +1 -1
  275. package/dist/core/delegation/worker-dispatch-scheduler.js +5 -6
  276. package/dist/core/delegation/worker-dispatch-scheduler.js.map +1 -1
  277. package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
  278. package/dist/core/delegation/worker-execution-policy.js.map +1 -1
  279. package/dist/core/delegation/worker-lane-projection.d.ts.map +1 -1
  280. package/dist/core/delegation/worker-lane-projection.js.map +1 -1
  281. package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -1
  282. package/dist/core/delegation/worker-lifecycle.js +0 -3
  283. package/dist/core/delegation/worker-lifecycle.js.map +1 -1
  284. package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -1
  285. package/dist/core/delegation/worker-notification-coordinator.js +4 -5
  286. package/dist/core/delegation/worker-notification-coordinator.js.map +1 -1
  287. package/dist/core/delegation/worker-process-owner.d.ts.map +1 -1
  288. package/dist/core/delegation/worker-process-owner.js.map +1 -1
  289. package/dist/core/delegation/worker-profile-resolver.d.ts.map +1 -1
  290. package/dist/core/delegation/worker-profile-resolver.js +1 -2
  291. package/dist/core/delegation/worker-profile-resolver.js.map +1 -1
  292. package/dist/core/delegation/worker-recovery-coordinator.d.ts.map +1 -1
  293. package/dist/core/delegation/worker-recovery-coordinator.js +3 -4
  294. package/dist/core/delegation/worker-recovery-coordinator.js.map +1 -1
  295. package/dist/core/delegation/worker-resource-catalog.d.ts.map +1 -1
  296. package/dist/core/delegation/worker-resource-catalog.js.map +1 -1
  297. package/dist/core/delegation/worker-resource-materializer.d.ts.map +1 -1
  298. package/dist/core/delegation/worker-resource-materializer.js +1 -4
  299. package/dist/core/delegation/worker-resource-materializer.js.map +1 -1
  300. package/dist/core/delegation/worker-runner.d.ts +2 -4
  301. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  302. package/dist/core/delegation/worker-runner.js +6 -18
  303. package/dist/core/delegation/worker-runner.js.map +1 -1
  304. package/dist/core/delegation/worker-task-label.d.ts.map +1 -1
  305. package/dist/core/delegation/worker-task-label.js.map +1 -1
  306. package/dist/core/delegation/worker-terminal-finalizer.d.ts.map +1 -1
  307. package/dist/core/delegation/worker-terminal-finalizer.js.map +1 -1
  308. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts.map +1 -1
  309. package/dist/core/delegation/worker-write-reservation-coordinator.js +1 -4
  310. package/dist/core/delegation/worker-write-reservation-coordinator.js.map +1 -1
  311. package/dist/core/delegation/worker-write-reservation.d.ts.map +1 -1
  312. package/dist/core/delegation/worker-write-reservation.js +0 -2
  313. package/dist/core/delegation/worker-write-reservation.js.map +1 -1
  314. package/dist/core/diagnostics.d.ts.map +1 -1
  315. package/dist/core/doctor.d.ts.map +1 -1
  316. package/dist/core/doctor.js.map +1 -1
  317. package/dist/core/event-bus.d.ts.map +1 -1
  318. package/dist/core/event-bus.js.map +1 -1
  319. package/dist/core/exec.d.ts.map +1 -1
  320. package/dist/core/exec.js +26 -7
  321. package/dist/core/exec.js.map +1 -1
  322. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  323. package/dist/core/export-html/ansi-to-html.js +21 -74
  324. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  325. package/dist/core/export-html/index.d.ts.map +1 -1
  326. package/dist/core/export-html/index.js +4 -0
  327. package/dist/core/export-html/index.js.map +1 -1
  328. package/dist/core/export-html/session-tree-foundations.d.mts +67 -0
  329. package/dist/core/export-html/session-tree-foundations.mjs +313 -0
  330. package/dist/core/export-html/template.css +14 -41
  331. package/dist/core/export-html/template.html +3 -1
  332. package/dist/core/export-html/template.js +26 -435
  333. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  334. package/dist/core/export-html/tool-renderer.js.map +1 -1
  335. package/dist/core/extension-import-authority.d.ts.map +1 -1
  336. package/dist/core/extension-import-authority.js.map +1 -1
  337. package/dist/core/extension-metadata.d.ts.map +1 -1
  338. package/dist/core/extension-metadata.js.map +1 -1
  339. package/dist/core/extensions/builtin.d.ts +17 -0
  340. package/dist/core/extensions/builtin.d.ts.map +1 -1
  341. package/dist/core/extensions/builtin.js +18 -54
  342. package/dist/core/extensions/builtin.js.map +1 -1
  343. package/dist/core/extensions/entry-resolution.d.ts +3 -0
  344. package/dist/core/extensions/entry-resolution.d.ts.map +1 -0
  345. package/dist/core/extensions/entry-resolution.js +17 -0
  346. package/dist/core/extensions/entry-resolution.js.map +1 -0
  347. package/dist/core/extensions/index.d.ts.map +1 -1
  348. package/dist/core/extensions/loader.d.ts.map +1 -1
  349. package/dist/core/extensions/loader.js +76 -21
  350. package/dist/core/extensions/loader.js.map +1 -1
  351. package/dist/core/extensions/runner.d.ts +2 -0
  352. package/dist/core/extensions/runner.d.ts.map +1 -1
  353. package/dist/core/extensions/runner.js +41 -112
  354. package/dist/core/extensions/runner.js.map +1 -1
  355. package/dist/core/extensions/stale-context.d.ts.map +1 -1
  356. package/dist/core/extensions/storage.d.ts.map +1 -1
  357. package/dist/core/extensions/storage.js.map +1 -1
  358. package/dist/core/extensions/types.d.ts.map +1 -1
  359. package/dist/core/extensions/types.js.map +1 -1
  360. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  361. package/dist/core/extensions/wrapper.js.map +1 -1
  362. package/dist/core/failure-corpus.d.ts.map +1 -1
  363. package/dist/core/failure-corpus.js +2 -5
  364. package/dist/core/failure-corpus.js.map +1 -1
  365. package/dist/core/footer-data-provider.d.ts.map +1 -1
  366. package/dist/core/footer-data-provider.js +27 -33
  367. package/dist/core/footer-data-provider.js.map +1 -1
  368. package/dist/core/foreground-recovery-controller.d.ts.map +1 -1
  369. package/dist/core/foreground-recovery-controller.js +0 -4
  370. package/dist/core/foreground-recovery-controller.js.map +1 -1
  371. package/dist/core/gateways/channel-provider.d.ts.map +1 -1
  372. package/dist/core/gateways/channel-provider.js +7 -5
  373. package/dist/core/gateways/channel-provider.js.map +1 -1
  374. package/dist/core/goal-loop-controller.d.ts.map +1 -1
  375. package/dist/core/goal-loop-controller.js +0 -1
  376. package/dist/core/goal-loop-controller.js.map +1 -1
  377. package/dist/core/goals/compact-goal-context.d.ts.map +1 -1
  378. package/dist/core/goals/compact-goal-context.js +2 -4
  379. package/dist/core/goals/compact-goal-context.js.map +1 -1
  380. package/dist/core/goals/goal-acceptance.d.ts.map +1 -1
  381. package/dist/core/goals/goal-acceptance.js.map +1 -1
  382. package/dist/core/goals/goal-auto-continue-controller.d.ts.map +1 -1
  383. package/dist/core/goals/goal-auto-continue-controller.js +1 -3
  384. package/dist/core/goals/goal-auto-continue-controller.js.map +1 -1
  385. package/dist/core/goals/goal-continuation-controller.d.ts.map +1 -1
  386. package/dist/core/goals/goal-continuation-controller.js.map +1 -1
  387. package/dist/core/goals/goal-continuation-defaults.d.ts.map +1 -1
  388. package/dist/core/goals/goal-continuation-prompt.d.ts.map +1 -1
  389. package/dist/core/goals/goal-continuation-prompt.js.map +1 -1
  390. package/dist/core/goals/goal-lifecycle.d.ts.map +1 -1
  391. package/dist/core/goals/goal-lifecycle.js.map +1 -1
  392. package/dist/core/goals/goal-record.d.ts.map +1 -1
  393. package/dist/core/goals/goal-record.js.map +1 -1
  394. package/dist/core/goals/goal-runtime-snapshot.d.ts.map +1 -1
  395. package/dist/core/goals/goal-runtime-snapshot.js.map +1 -1
  396. package/dist/core/goals/goal-session-controller.d.ts +15 -0
  397. package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
  398. package/dist/core/goals/goal-session-controller.js +27 -3
  399. package/dist/core/goals/goal-session-controller.js.map +1 -1
  400. package/dist/core/goals/goal-state.d.ts.map +1 -1
  401. package/dist/core/goals/goal-state.js +35 -51
  402. package/dist/core/goals/goal-state.js.map +1 -1
  403. package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
  404. package/dist/core/goals/goal-tool-core.js.map +1 -1
  405. package/dist/core/goals/natural-language-goal.d.ts +9 -0
  406. package/dist/core/goals/natural-language-goal.d.ts.map +1 -0
  407. package/dist/core/goals/natural-language-goal.js +23 -0
  408. package/dist/core/goals/natural-language-goal.js.map +1 -0
  409. package/dist/core/goals/session-goal-state.d.ts.map +1 -1
  410. package/dist/core/goals/session-goal-state.js.map +1 -1
  411. package/dist/core/http-dispatcher.d.ts.map +1 -1
  412. package/dist/core/http-dispatcher.js.map +1 -1
  413. package/dist/core/human-input-controller.d.ts.map +1 -1
  414. package/dist/core/human-input-controller.js +2 -3
  415. package/dist/core/human-input-controller.js.map +1 -1
  416. package/dist/core/human-input.d.ts.map +1 -1
  417. package/dist/core/human-input.js.map +1 -1
  418. package/dist/core/improvement-loop.d.ts.map +1 -1
  419. package/dist/core/improvement-loop.js +11 -11
  420. package/dist/core/improvement-loop.js.map +1 -1
  421. package/dist/core/index.d.ts.map +1 -1
  422. package/dist/core/install-telemetry.d.ts.map +1 -1
  423. package/dist/core/install-telemetry.js.map +1 -1
  424. package/dist/core/isolated-text-completion.d.ts +17 -0
  425. package/dist/core/isolated-text-completion.d.ts.map +1 -0
  426. package/dist/core/isolated-text-completion.js +15 -0
  427. package/dist/core/isolated-text-completion.js.map +1 -0
  428. package/dist/core/keybindings.d.ts +47 -2
  429. package/dist/core/keybindings.d.ts.map +1 -1
  430. package/dist/core/keybindings.js +12 -1
  431. package/dist/core/keybindings.js.map +1 -1
  432. package/dist/core/learning/learning-audit.d.ts.map +1 -1
  433. package/dist/core/learning/learning-audit.js.map +1 -1
  434. package/dist/core/learning/learning-gate.d.ts.map +1 -1
  435. package/dist/core/learning/learning-gate.js.map +1 -1
  436. package/dist/core/learning/observation-store.d.ts.map +1 -1
  437. package/dist/core/learning/observation-store.js +0 -2
  438. package/dist/core/learning/observation-store.js.map +1 -1
  439. package/dist/core/learning/reflection-engine.d.ts +1 -1
  440. package/dist/core/learning/reflection-engine.d.ts.map +1 -1
  441. package/dist/core/learning/reflection-engine.js +3 -0
  442. package/dist/core/learning/reflection-engine.js.map +1 -1
  443. package/dist/core/learning/reflection-turn-analysis.d.ts +20 -0
  444. package/dist/core/learning/reflection-turn-analysis.d.ts.map +1 -0
  445. package/dist/core/learning/reflection-turn-analysis.js +136 -0
  446. package/dist/core/learning/reflection-turn-analysis.js.map +1 -0
  447. package/dist/core/learning/session-learning-decision.d.ts.map +1 -1
  448. package/dist/core/learning/session-learning-decision.js.map +1 -1
  449. package/dist/core/learning/skill-curator.d.ts.map +1 -1
  450. package/dist/core/learning/skill-curator.js +0 -3
  451. package/dist/core/learning/skill-curator.js.map +1 -1
  452. package/dist/core/local-runtime-controller.d.ts +39 -0
  453. package/dist/core/local-runtime-controller.d.ts.map +1 -1
  454. package/dist/core/local-runtime-controller.js +41 -62
  455. package/dist/core/local-runtime-controller.js.map +1 -1
  456. package/dist/core/memory/effectiveness-tracker.d.ts.map +1 -1
  457. package/dist/core/memory/effectiveness-tracker.js +4 -2
  458. package/dist/core/memory/effectiveness-tracker.js.map +1 -1
  459. package/dist/core/memory/memory-manager.d.ts.map +1 -1
  460. package/dist/core/memory/memory-manager.js +7 -7
  461. package/dist/core/memory/memory-manager.js.map +1 -1
  462. package/dist/core/memory/memory-provider.d.ts.map +1 -1
  463. package/dist/core/memory/providers/file-store.d.ts +7 -0
  464. package/dist/core/memory/providers/file-store.d.ts.map +1 -1
  465. package/dist/core/memory/providers/file-store.js +48 -13
  466. package/dist/core/memory/providers/file-store.js.map +1 -1
  467. package/dist/core/memory/providers/transcript-recall-worker-protocol.d.ts +47 -0
  468. package/dist/core/memory/providers/transcript-recall-worker-protocol.d.ts.map +1 -0
  469. package/dist/core/memory/providers/transcript-recall-worker-protocol.js +50 -0
  470. package/dist/core/memory/providers/transcript-recall-worker-protocol.js.map +1 -0
  471. package/dist/core/memory/providers/transcript-recall-worker.d.ts +2 -0
  472. package/dist/core/memory/providers/transcript-recall-worker.d.ts.map +1 -0
  473. package/dist/core/memory/providers/transcript-recall-worker.js +143 -0
  474. package/dist/core/memory/providers/transcript-recall-worker.js.map +1 -0
  475. package/dist/core/memory/providers/transcript-recall.d.ts +24 -13
  476. package/dist/core/memory/providers/transcript-recall.d.ts.map +1 -1
  477. package/dist/core/memory/providers/transcript-recall.js +143 -141
  478. package/dist/core/memory/providers/transcript-recall.js.map +1 -1
  479. package/dist/core/memory/providers/user-memory-archive.d.ts +39 -0
  480. package/dist/core/memory/providers/user-memory-archive.d.ts.map +1 -0
  481. package/dist/core/memory/providers/user-memory-archive.js +258 -0
  482. package/dist/core/memory/providers/user-memory-archive.js.map +1 -0
  483. package/dist/core/memory/transcript-index.d.ts.map +1 -1
  484. package/dist/core/memory/transcript-index.js +1 -1
  485. package/dist/core/memory/transcript-index.js.map +1 -1
  486. package/dist/core/memory-controller.d.ts +9 -0
  487. package/dist/core/memory-controller.d.ts.map +1 -1
  488. package/dist/core/memory-controller.js +57 -16
  489. package/dist/core/memory-controller.js.map +1 -1
  490. package/dist/core/model-capability.d.ts.map +1 -1
  491. package/dist/core/model-capability.js.map +1 -1
  492. package/dist/core/model-output-json.d.ts +10 -0
  493. package/dist/core/model-output-json.d.ts.map +1 -0
  494. package/dist/core/model-output-json.js +43 -0
  495. package/dist/core/model-output-json.js.map +1 -0
  496. package/dist/core/model-registry.d.ts +8 -8
  497. package/dist/core/model-registry.d.ts.map +1 -1
  498. package/dist/core/model-registry.js +29 -52
  499. package/dist/core/model-registry.js.map +1 -1
  500. package/dist/core/model-resolver.d.ts.map +1 -1
  501. package/dist/core/model-resolver.js +1 -1
  502. package/dist/core/model-resolver.js.map +1 -1
  503. package/dist/core/model-router/config-diagnostics.d.ts.map +1 -1
  504. package/dist/core/model-router/config-diagnostics.js.map +1 -1
  505. package/dist/core/model-router/executor-route.d.ts.map +1 -1
  506. package/dist/core/model-router/executor-route.js.map +1 -1
  507. package/dist/core/model-router/fitness-gate.d.ts.map +1 -1
  508. package/dist/core/model-router/fitness-gate.js.map +1 -1
  509. package/dist/core/model-router/intent-classifier.d.ts.map +1 -1
  510. package/dist/core/model-router/route-judge.d.ts.map +1 -1
  511. package/dist/core/model-router/route-judge.js +18 -36
  512. package/dist/core/model-router/route-judge.js.map +1 -1
  513. package/dist/core/model-router/session-buffer.d.ts.map +1 -1
  514. package/dist/core/model-router/session-buffer.js.map +1 -1
  515. package/dist/core/model-router/status.d.ts.map +1 -1
  516. package/dist/core/model-router/status.js.map +1 -1
  517. package/dist/core/model-router/tool-escalation.d.ts.map +1 -1
  518. package/dist/core/model-router/tool-escalation.js.map +1 -1
  519. package/dist/core/model-router-controller.d.ts +1 -0
  520. package/dist/core/model-router-controller.d.ts.map +1 -1
  521. package/dist/core/model-router-controller.js +25 -56
  522. package/dist/core/model-router-controller.js.map +1 -1
  523. package/dist/core/model-selection-controller.d.ts +10 -0
  524. package/dist/core/model-selection-controller.d.ts.map +1 -1
  525. package/dist/core/model-selection-controller.js +0 -1
  526. package/dist/core/model-selection-controller.js.map +1 -1
  527. package/dist/core/model-tool-protocol.d.ts.map +1 -1
  528. package/dist/core/model-tool-protocol.js.map +1 -1
  529. package/dist/core/models/adaptation-store.d.ts.map +1 -1
  530. package/dist/core/models/adaptation-store.js +0 -1
  531. package/dist/core/models/adaptation-store.js.map +1 -1
  532. package/dist/core/models/context-sizing.d.ts.map +1 -1
  533. package/dist/core/models/context-sizing.js.map +1 -1
  534. package/dist/core/models/default-model-suggestions.d.ts.map +1 -1
  535. package/dist/core/models/default-model-suggestions.js.map +1 -1
  536. package/dist/core/models/fitness-store.d.ts.map +1 -1
  537. package/dist/core/models/fitness-store.js +0 -1
  538. package/dist/core/models/fitness-store.js.map +1 -1
  539. package/dist/core/models/host-state-store.d.ts.map +1 -1
  540. package/dist/core/models/host-state-store.js +1 -6
  541. package/dist/core/models/host-state-store.js.map +1 -1
  542. package/dist/core/models/llamacpp-runtime.d.ts +4 -19
  543. package/dist/core/models/llamacpp-runtime.d.ts.map +1 -1
  544. package/dist/core/models/llamacpp-runtime.js +32 -136
  545. package/dist/core/models/llamacpp-runtime.js.map +1 -1
  546. package/dist/core/models/local-registration.d.ts.map +1 -1
  547. package/dist/core/models/local-registration.js +82 -115
  548. package/dist/core/models/local-registration.js.map +1 -1
  549. package/dist/core/models/local-runtime.d.ts +12 -18
  550. package/dist/core/models/local-runtime.d.ts.map +1 -1
  551. package/dist/core/models/local-runtime.js +60 -204
  552. package/dist/core/models/local-runtime.js.map +1 -1
  553. package/dist/core/models/model-endpoint.d.ts.map +1 -1
  554. package/dist/core/models/model-endpoint.js.map +1 -1
  555. package/dist/core/models/model-ref.d.ts.map +1 -1
  556. package/dist/core/models/model-ref.js.map +1 -1
  557. package/dist/core/models/needle-runtime.d.ts +7 -3
  558. package/dist/core/models/needle-runtime.d.ts.map +1 -1
  559. package/dist/core/models/needle-runtime.js +16 -92
  560. package/dist/core/models/needle-runtime.js.map +1 -1
  561. package/dist/core/models/perf-profile.d.ts +1 -1
  562. package/dist/core/models/perf-profile.d.ts.map +1 -1
  563. package/dist/core/models/perf-profile.js +6 -13
  564. package/dist/core/models/perf-profile.js.map +1 -1
  565. package/dist/core/models/prism-llamacpp-lifecycle.d.ts.map +1 -1
  566. package/dist/core/models/prism-llamacpp-lifecycle.js.map +1 -1
  567. package/dist/core/models/runtime-arbiter.d.ts.map +1 -1
  568. package/dist/core/models/runtime-arbiter.js +3 -15
  569. package/dist/core/models/runtime-arbiter.js.map +1 -1
  570. package/dist/core/models/runtime-process.d.ts +100 -0
  571. package/dist/core/models/runtime-process.d.ts.map +1 -0
  572. package/dist/core/models/runtime-process.js +183 -0
  573. package/dist/core/models/runtime-process.js.map +1 -0
  574. package/dist/core/orchestration/agent-resume.d.ts.map +1 -1
  575. package/dist/core/orchestration/agent-resume.js.map +1 -1
  576. package/dist/core/orchestration/attempt-usage.d.ts.map +1 -1
  577. package/dist/core/orchestration/attempt-usage.js.map +1 -1
  578. package/dist/core/orchestration/capability-gateway.d.ts.map +1 -1
  579. package/dist/core/orchestration/capability-gateway.js +0 -14
  580. package/dist/core/orchestration/capability-gateway.js.map +1 -1
  581. package/dist/core/orchestration/contracts.d.ts.map +1 -1
  582. package/dist/core/orchestration/contracts.js.map +1 -1
  583. package/dist/core/orchestration/delegation-ledger.d.ts.map +1 -1
  584. package/dist/core/orchestration/delegation-ledger.js +0 -2
  585. package/dist/core/orchestration/delegation-ledger.js.map +1 -1
  586. package/dist/core/orchestration/event-store.d.ts.map +1 -1
  587. package/dist/core/orchestration/event-store.js +1 -14
  588. package/dist/core/orchestration/event-store.js.map +1 -1
  589. package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -1
  590. package/dist/core/orchestration/lane-tool-manifests.js.map +1 -1
  591. package/dist/core/orchestration/model-binding.d.ts.map +1 -1
  592. package/dist/core/orchestration/model-binding.js.map +1 -1
  593. package/dist/core/orchestration/policy-compiler.d.ts.map +1 -1
  594. package/dist/core/orchestration/policy-compiler.js +0 -3
  595. package/dist/core/orchestration/policy-compiler.js.map +1 -1
  596. package/dist/core/orchestration/policy-gate.d.ts.map +1 -1
  597. package/dist/core/orchestration/policy-gate.js +0 -2
  598. package/dist/core/orchestration/policy-gate.js.map +1 -1
  599. package/dist/core/orchestration/profile-registry.d.ts.map +1 -1
  600. package/dist/core/orchestration/profile-registry.js +1 -1
  601. package/dist/core/orchestration/profile-registry.js.map +1 -1
  602. package/dist/core/orchestration/profile-store.d.ts.map +1 -1
  603. package/dist/core/orchestration/profile-store.js +0 -3
  604. package/dist/core/orchestration/profile-store.js.map +1 -1
  605. package/dist/core/orchestration/risk-budget.d.ts.map +1 -1
  606. package/dist/core/orchestration/risk-budget.js.map +1 -1
  607. package/dist/core/orchestration/task-runtime.d.ts +1 -0
  608. package/dist/core/orchestration/task-runtime.d.ts.map +1 -1
  609. package/dist/core/orchestration/task-runtime.js +27 -42
  610. package/dist/core/orchestration/task-runtime.js.map +1 -1
  611. package/dist/core/orchestration/work-state-projection.d.ts.map +1 -1
  612. package/dist/core/orchestration/work-state-projection.js.map +1 -1
  613. package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -1
  614. package/dist/core/orchestration/worker-execution-contract.js.map +1 -1
  615. package/dist/core/orchestration/worker-result-adapter.d.ts.map +1 -1
  616. package/dist/core/orchestration/worker-result-adapter.js.map +1 -1
  617. package/dist/core/output-guard.d.ts.map +1 -1
  618. package/dist/core/output-guard.js.map +1 -1
  619. package/dist/core/package-manager.d.ts +3 -0
  620. package/dist/core/package-manager.d.ts.map +1 -1
  621. package/dist/core/package-manager.js +88 -353
  622. package/dist/core/package-manager.js.map +1 -1
  623. package/dist/core/process-identity.d.ts.map +1 -1
  624. package/dist/core/process-identity.js.map +1 -1
  625. package/dist/core/process-liveness.d.ts +3 -0
  626. package/dist/core/process-liveness.d.ts.map +1 -0
  627. package/dist/core/process-liveness.js +17 -0
  628. package/dist/core/process-liveness.js.map +1 -0
  629. package/dist/core/process-matrix/codes.d.ts.map +1 -1
  630. package/dist/core/process-matrix/resume-launcher.d.ts.map +1 -1
  631. package/dist/core/process-matrix/resume-launcher.js.map +1 -1
  632. package/dist/core/process-matrix/runtime.d.ts.map +1 -1
  633. package/dist/core/process-matrix/runtime.js.map +1 -1
  634. package/dist/core/process-matrix/store.d.ts.map +1 -1
  635. package/dist/core/process-matrix/store.js.map +1 -1
  636. package/dist/core/process-matrix/supervisor.d.ts.map +1 -1
  637. package/dist/core/process-matrix/supervisor.js.map +1 -1
  638. package/dist/core/profile-filter-controller.d.ts.map +1 -1
  639. package/dist/core/profile-filter-controller.js +7 -8
  640. package/dist/core/profile-filter-controller.js.map +1 -1
  641. package/dist/core/profile-registry.d.ts.map +1 -1
  642. package/dist/core/profile-registry.js +1 -2
  643. package/dist/core/profile-registry.js.map +1 -1
  644. package/dist/core/profile-resource-selection.d.ts.map +1 -1
  645. package/dist/core/profile-resource-selection.js +18 -59
  646. package/dist/core/profile-resource-selection.js.map +1 -1
  647. package/dist/core/prompt-markup.d.ts +3 -0
  648. package/dist/core/prompt-markup.d.ts.map +1 -0
  649. package/dist/core/prompt-markup.js +7 -0
  650. package/dist/core/prompt-markup.js.map +1 -0
  651. package/dist/core/prompt-templates.d.ts.map +1 -1
  652. package/dist/core/prompt-templates.js +13 -39
  653. package/dist/core/prompt-templates.js.map +1 -1
  654. package/dist/core/provider-display-names.d.ts.map +1 -1
  655. package/dist/core/python-runtime.d.ts.map +1 -1
  656. package/dist/core/python-runtime.js.map +1 -1
  657. package/dist/core/reflection-controller.d.ts +22 -1
  658. package/dist/core/reflection-controller.d.ts.map +1 -1
  659. package/dist/core/reflection-controller.js +143 -25
  660. package/dist/core/reflection-controller.js.map +1 -1
  661. package/dist/core/reload-blockers.d.ts +2 -1
  662. package/dist/core/reload-blockers.d.ts.map +1 -1
  663. package/dist/core/reload-blockers.js +4 -14
  664. package/dist/core/reload-blockers.js.map +1 -1
  665. package/dist/core/request-auth.d.ts.map +1 -1
  666. package/dist/core/request-auth.js.map +1 -1
  667. package/dist/core/research/automata-provider.d.ts.map +1 -1
  668. package/dist/core/research/automata-provider.js.map +1 -1
  669. package/dist/core/research/evidence-bundle.d.ts.map +1 -1
  670. package/dist/core/research/evidence-bundle.js.map +1 -1
  671. package/dist/core/research/lane-model-resolver.d.ts.map +1 -1
  672. package/dist/core/research/lane-model-resolver.js +0 -1
  673. package/dist/core/research/lane-model-resolver.js.map +1 -1
  674. package/dist/core/research/model-fitness-controller.d.ts.map +1 -1
  675. package/dist/core/research/model-fitness-controller.js +17 -33
  676. package/dist/core/research/model-fitness-controller.js.map +1 -1
  677. package/dist/core/research/model-fitness.d.ts.map +1 -1
  678. package/dist/core/research/model-fitness.js +4 -25
  679. package/dist/core/research/model-fitness.js.map +1 -1
  680. package/dist/core/research/research-gate.d.ts.map +1 -1
  681. package/dist/core/research/research-gate.js.map +1 -1
  682. package/dist/core/research/research-lane-controller.d.ts.map +1 -1
  683. package/dist/core/research/research-lane-controller.js +5 -10
  684. package/dist/core/research/research-lane-controller.js.map +1 -1
  685. package/dist/core/research/research-runner.d.ts +2 -4
  686. package/dist/core/research/research-runner.d.ts.map +1 -1
  687. package/dist/core/research/research-runner.js +17 -48
  688. package/dist/core/research/research-runner.js.map +1 -1
  689. package/dist/core/research/session-evidence-bundle.d.ts.map +1 -1
  690. package/dist/core/research/session-evidence-bundle.js.map +1 -1
  691. package/dist/core/research/workspace-collector.d.ts.map +1 -1
  692. package/dist/core/research/workspace-collector.js.map +1 -1
  693. package/dist/core/resolve-config-value.d.ts.map +1 -1
  694. package/dist/core/resolve-config-value.js.map +1 -1
  695. package/dist/core/resource-ignore.d.ts +6 -0
  696. package/dist/core/resource-ignore.d.ts.map +1 -0
  697. package/dist/core/resource-ignore.js +44 -0
  698. package/dist/core/resource-ignore.js.map +1 -0
  699. package/dist/core/resource-loader.d.ts +0 -1
  700. package/dist/core/resource-loader.d.ts.map +1 -1
  701. package/dist/core/resource-loader.js +52 -187
  702. package/dist/core/resource-loader.js.map +1 -1
  703. package/dist/core/resource-profile-blocks.d.ts +3 -1
  704. package/dist/core/resource-profile-blocks.d.ts.map +1 -1
  705. package/dist/core/resource-profile-blocks.js +8 -5
  706. package/dist/core/resource-profile-blocks.js.map +1 -1
  707. package/dist/core/resource-profile-equality.d.ts.map +1 -1
  708. package/dist/core/resource-profile-equality.js.map +1 -1
  709. package/dist/core/resource-traversal.d.ts +43 -0
  710. package/dist/core/resource-traversal.d.ts.map +1 -0
  711. package/dist/core/resource-traversal.js +84 -0
  712. package/dist/core/resource-traversal.js.map +1 -0
  713. package/dist/core/risk-classifier.d.ts.map +1 -1
  714. package/dist/core/risk-classifier.js.map +1 -1
  715. package/dist/core/runtime-builder.d.ts +4 -1
  716. package/dist/core/runtime-builder.d.ts.map +1 -1
  717. package/dist/core/runtime-builder.js +25 -50
  718. package/dist/core/runtime-builder.js.map +1 -1
  719. package/dist/core/scout-controller.d.ts.map +1 -1
  720. package/dist/core/scout-controller.js +0 -1
  721. package/dist/core/scout-controller.js.map +1 -1
  722. package/dist/core/sdk.d.ts.map +1 -1
  723. package/dist/core/sdk.js.map +1 -1
  724. package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -1
  725. package/dist/core/secrets/credential-exposure-guard.js +70 -44
  726. package/dist/core/secrets/credential-exposure-guard.js.map +1 -1
  727. package/dist/core/secrets/secret-dotenv.d.ts.map +1 -1
  728. package/dist/core/secrets/secret-dotenv.js +0 -1
  729. package/dist/core/secrets/secret-dotenv.js.map +1 -1
  730. package/dist/core/secrets/secret-vault-format.d.ts.map +1 -1
  731. package/dist/core/secrets/secret-vault-format.js +0 -1
  732. package/dist/core/secrets/secret-vault-format.js.map +1 -1
  733. package/dist/core/secrets/secret-vault.d.ts.map +1 -1
  734. package/dist/core/secrets/secret-vault.js +2 -10
  735. package/dist/core/secrets/secret-vault.js.map +1 -1
  736. package/dist/core/security/secret-text.d.ts.map +1 -1
  737. package/dist/core/security/secret-text.js.map +1 -1
  738. package/dist/core/security/untrusted-boundary.d.ts.map +1 -1
  739. package/dist/core/security/untrusted-boundary.js.map +1 -1
  740. package/dist/core/session-analytics.d.ts.map +1 -1
  741. package/dist/core/session-analytics.js +18 -50
  742. package/dist/core/session-analytics.js.map +1 -1
  743. package/dist/core/session-artifact-bundle.d.ts.map +1 -1
  744. package/dist/core/session-artifact-bundle.js.map +1 -1
  745. package/dist/core/session-cwd.d.ts.map +1 -1
  746. package/dist/core/session-cwd.js +0 -1
  747. package/dist/core/session-cwd.js.map +1 -1
  748. package/dist/core/session-entry-index.d.ts +8 -0
  749. package/dist/core/session-entry-index.d.ts.map +1 -0
  750. package/dist/core/session-entry-index.js +16 -0
  751. package/dist/core/session-entry-index.js.map +1 -0
  752. package/dist/core/session-image-store.d.ts.map +1 -1
  753. package/dist/core/session-image-store.js +0 -3
  754. package/dist/core/session-image-store.js.map +1 -1
  755. package/dist/core/session-jsonl-writer.d.ts +3 -0
  756. package/dist/core/session-jsonl-writer.d.ts.map +1 -0
  757. package/dist/core/session-jsonl-writer.js +38 -0
  758. package/dist/core/session-jsonl-writer.js.map +1 -0
  759. package/dist/core/session-manager-factory.d.ts.map +1 -1
  760. package/dist/core/session-manager-factory.js.map +1 -1
  761. package/dist/core/session-role.d.ts.map +1 -1
  762. package/dist/core/session-role.js.map +1 -1
  763. package/dist/core/session-snapshot.d.ts.map +1 -1
  764. package/dist/core/session-snapshot.js.map +1 -1
  765. package/dist/core/session-supervision-runtime.d.ts.map +1 -1
  766. package/dist/core/session-supervision-runtime.js +1 -4
  767. package/dist/core/session-supervision-runtime.js.map +1 -1
  768. package/dist/core/session-tree-navigator.d.ts.map +1 -1
  769. package/dist/core/session-tree-navigator.js +0 -1
  770. package/dist/core/session-tree-navigator.js.map +1 -1
  771. package/dist/core/settings-manager.d.ts +2 -1
  772. package/dist/core/settings-manager.d.ts.map +1 -1
  773. package/dist/core/settings-manager.js +64 -162
  774. package/dist/core/settings-manager.js.map +1 -1
  775. package/dist/core/skill-block.d.mts +8 -0
  776. package/dist/core/skill-block.mjs +52 -0
  777. package/dist/core/skill-discovery.d.ts +5 -0
  778. package/dist/core/skill-discovery.d.ts.map +1 -0
  779. package/dist/core/skill-discovery.js +34 -0
  780. package/dist/core/skill-discovery.js.map +1 -0
  781. package/dist/core/skills.d.ts.map +1 -1
  782. package/dist/core/skills.js +23 -159
  783. package/dist/core/skills.js.map +1 -1
  784. package/dist/core/slash-commands.d.ts.map +1 -1
  785. package/dist/core/source-info.d.ts.map +1 -1
  786. package/dist/core/source-info.js.map +1 -1
  787. package/dist/core/spawned-usage.d.ts +21 -0
  788. package/dist/core/spawned-usage.d.ts.map +1 -0
  789. package/dist/core/spawned-usage.js +29 -0
  790. package/dist/core/spawned-usage.js.map +1 -0
  791. package/dist/core/system-prompt-builder.d.ts +4 -0
  792. package/dist/core/system-prompt-builder.d.ts.map +1 -1
  793. package/dist/core/system-prompt-builder.js +15 -8
  794. package/dist/core/system-prompt-builder.js.map +1 -1
  795. package/dist/core/system-prompt.d.ts.map +1 -1
  796. package/dist/core/system-prompt.js +52 -35
  797. package/dist/core/system-prompt.js.map +1 -1
  798. package/dist/core/tasks/session-task-state.d.ts.map +1 -1
  799. package/dist/core/tasks/session-task-state.js.map +1 -1
  800. package/dist/core/tasks/task-command.d.ts.map +1 -1
  801. package/dist/core/tasks/task-command.js.map +1 -1
  802. package/dist/core/tasks/task-contract-monitor.d.ts.map +1 -1
  803. package/dist/core/tasks/task-contract-monitor.js.map +1 -1
  804. package/dist/core/tasks/task-projection.d.ts.map +1 -1
  805. package/dist/core/tasks/task-projection.js.map +1 -1
  806. package/dist/core/tasks/task-state.d.ts.map +1 -1
  807. package/dist/core/tasks/task-state.js.map +1 -1
  808. package/dist/core/text-preview.d.ts +4 -0
  809. package/dist/core/text-preview.d.ts.map +1 -0
  810. package/dist/core/text-preview.js +33 -0
  811. package/dist/core/text-preview.js.map +1 -0
  812. package/dist/core/timings.d.ts.map +1 -1
  813. package/dist/core/timings.js.map +1 -1
  814. package/dist/core/tool-capability-policy.d.ts.map +1 -1
  815. package/dist/core/tool-capability-policy.js.map +1 -1
  816. package/dist/core/tool-gate-controller.d.ts.map +1 -1
  817. package/dist/core/tool-gate-controller.js +86 -87
  818. package/dist/core/tool-gate-controller.js.map +1 -1
  819. package/dist/core/tool-protocol-controller.d.ts +4 -1
  820. package/dist/core/tool-protocol-controller.d.ts.map +1 -1
  821. package/dist/core/tool-protocol-controller.js +19 -23
  822. package/dist/core/tool-protocol-controller.js.map +1 -1
  823. package/dist/core/tool-recovery-log-records.d.ts.map +1 -1
  824. package/dist/core/tool-recovery-log-records.js.map +1 -1
  825. package/dist/core/tool-recovery-log-worker.d.ts.map +1 -1
  826. package/dist/core/tool-recovery-log-worker.js.map +1 -1
  827. package/dist/core/tool-recovery-logger.d.ts.map +1 -1
  828. package/dist/core/tool-recovery-logger.js +12 -24
  829. package/dist/core/tool-recovery-logger.js.map +1 -1
  830. package/dist/core/tool-recovery-stats.d.ts.map +1 -1
  831. package/dist/core/tool-recovery-stats.js +16 -22
  832. package/dist/core/tool-recovery-stats.js.map +1 -1
  833. package/dist/core/tool-repair-health.d.ts.map +1 -1
  834. package/dist/core/tool-repair-health.js.map +1 -1
  835. package/dist/core/tool-repair-settings.d.ts.map +1 -1
  836. package/dist/core/tool-repair-settings.js.map +1 -1
  837. package/dist/core/tool-selection/expected-utility.d.ts.map +1 -1
  838. package/dist/core/tool-selection/expected-utility.js.map +1 -1
  839. package/dist/core/tool-selection/promotion.d.ts.map +1 -1
  840. package/dist/core/tool-selection/promotion.js.map +1 -1
  841. package/dist/core/tool-selection/tool-performance-store.d.ts +2 -0
  842. package/dist/core/tool-selection/tool-performance-store.d.ts.map +1 -1
  843. package/dist/core/tool-selection/tool-performance-store.js +49 -7
  844. package/dist/core/tool-selection/tool-performance-store.js.map +1 -1
  845. package/dist/core/tool-selection/tool-phase-timing.d.ts +19 -0
  846. package/dist/core/tool-selection/tool-phase-timing.d.ts.map +1 -0
  847. package/dist/core/tool-selection/tool-phase-timing.js +63 -0
  848. package/dist/core/tool-selection/tool-phase-timing.js.map +1 -0
  849. package/dist/core/tool-selection/tool-selection-controller.d.ts +2 -5
  850. package/dist/core/tool-selection/tool-selection-controller.d.ts.map +1 -1
  851. package/dist/core/tool-selection/tool-selection-controller.js +50 -30
  852. package/dist/core/tool-selection/tool-selection-controller.js.map +1 -1
  853. package/dist/core/toolkit/reflex-interpreter.d.ts +16 -0
  854. package/dist/core/toolkit/reflex-interpreter.d.ts.map +1 -1
  855. package/dist/core/toolkit/reflex-interpreter.js +21 -0
  856. package/dist/core/toolkit/reflex-interpreter.js.map +1 -1
  857. package/dist/core/toolkit/script-registry.d.ts.map +1 -1
  858. package/dist/core/toolkit/script-registry.js.map +1 -1
  859. package/dist/core/toolkit/script-runner.d.ts.map +1 -1
  860. package/dist/core/toolkit/script-runner.js.map +1 -1
  861. package/dist/core/tools/artifact-retrieve.d.ts.map +1 -1
  862. package/dist/core/tools/artifact-retrieve.js.map +1 -1
  863. package/dist/core/tools/ask-question.d.ts +2 -3
  864. package/dist/core/tools/ask-question.d.ts.map +1 -1
  865. package/dist/core/tools/ask-question.js +14 -40
  866. package/dist/core/tools/ask-question.js.map +1 -1
  867. package/dist/core/tools/bash.d.ts +2 -0
  868. package/dist/core/tools/bash.d.ts.map +1 -1
  869. package/dist/core/tools/bash.js +83 -30
  870. package/dist/core/tools/bash.js.map +1 -1
  871. package/dist/core/tools/context-scout.d.ts.map +1 -1
  872. package/dist/core/tools/context-scout.js.map +1 -1
  873. package/dist/core/tools/delegate-status.d.ts.map +1 -1
  874. package/dist/core/tools/delegate-status.js +9 -7
  875. package/dist/core/tools/delegate-status.js.map +1 -1
  876. package/dist/core/tools/delegate.d.ts.map +1 -1
  877. package/dist/core/tools/delegate.js +6 -6
  878. package/dist/core/tools/delegate.js.map +1 -1
  879. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  880. package/dist/core/tools/edit-diff.js.map +1 -1
  881. package/dist/core/tools/edit.d.ts.map +1 -1
  882. package/dist/core/tools/edit.js.map +1 -1
  883. package/dist/core/tools/extensionify.d.ts.map +1 -1
  884. package/dist/core/tools/extensionify.js.map +1 -1
  885. package/dist/core/tools/fff-search-backend.d.ts +19 -0
  886. package/dist/core/tools/fff-search-backend.d.ts.map +1 -1
  887. package/dist/core/tools/fff-search-backend.js +28 -2
  888. package/dist/core/tools/fff-search-backend.js.map +1 -1
  889. package/dist/core/tools/file-encoding-policy.d.ts.map +1 -1
  890. package/dist/core/tools/file-encoding-policy.js.map +1 -1
  891. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  892. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  893. package/dist/core/tools/find.d.ts +1 -1
  894. package/dist/core/tools/find.d.ts.map +1 -1
  895. package/dist/core/tools/find.js +44 -108
  896. package/dist/core/tools/find.js.map +1 -1
  897. package/dist/core/tools/git-filter.d.ts.map +1 -1
  898. package/dist/core/tools/git-filter.js.map +1 -1
  899. package/dist/core/tools/goal.d.ts.map +1 -1
  900. package/dist/core/tools/goal.js +7 -7
  901. package/dist/core/tools/goal.js.map +1 -1
  902. package/dist/core/tools/grep.d.ts +1 -1
  903. package/dist/core/tools/grep.d.ts.map +1 -1
  904. package/dist/core/tools/grep.js +42 -102
  905. package/dist/core/tools/grep.js.map +1 -1
  906. package/dist/core/tools/index.d.ts.map +1 -1
  907. package/dist/core/tools/index.js.map +1 -1
  908. package/dist/core/tools/ls.d.ts.map +1 -1
  909. package/dist/core/tools/ls.js +20 -36
  910. package/dist/core/tools/ls.js.map +1 -1
  911. package/dist/core/tools/model-fitness.d.ts.map +1 -1
  912. package/dist/core/tools/model-fitness.js.map +1 -1
  913. package/dist/core/tools/orchestration-panel.d.ts +5 -0
  914. package/dist/core/tools/orchestration-panel.d.ts.map +1 -1
  915. package/dist/core/tools/orchestration-panel.js +5 -5
  916. package/dist/core/tools/orchestration-panel.js.map +1 -1
  917. package/dist/core/tools/output-accumulator.d.ts +2 -0
  918. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  919. package/dist/core/tools/output-accumulator.js +24 -36
  920. package/dist/core/tools/output-accumulator.js.map +1 -1
  921. package/dist/core/tools/path-utils.d.ts.map +1 -1
  922. package/dist/core/tools/path-utils.js.map +1 -1
  923. package/dist/core/tools/persistent-process-coordinator.d.ts +31 -0
  924. package/dist/core/tools/persistent-process-coordinator.d.ts.map +1 -0
  925. package/dist/core/tools/persistent-process-coordinator.js +123 -0
  926. package/dist/core/tools/persistent-process-coordinator.js.map +1 -0
  927. package/dist/core/tools/python.d.ts.map +1 -1
  928. package/dist/core/tools/python.js.map +1 -1
  929. package/dist/core/tools/read.d.ts.map +1 -1
  930. package/dist/core/tools/read.js +14 -13
  931. package/dist/core/tools/read.js.map +1 -1
  932. package/dist/core/tools/render-utils.d.ts +29 -0
  933. package/dist/core/tools/render-utils.d.ts.map +1 -1
  934. package/dist/core/tools/render-utils.js +31 -1
  935. package/dist/core/tools/render-utils.js.map +1 -1
  936. package/dist/core/tools/run-process.d.ts.map +1 -1
  937. package/dist/core/tools/run-process.js.map +1 -1
  938. package/dist/core/tools/run-toolkit-script.d.ts.map +1 -1
  939. package/dist/core/tools/run-toolkit-script.js.map +1 -1
  940. package/dist/core/tools/search-command-guard.d.ts +10 -0
  941. package/dist/core/tools/search-command-guard.d.ts.map +1 -1
  942. package/dist/core/tools/search-command-guard.js +118 -31
  943. package/dist/core/tools/search-command-guard.js.map +1 -1
  944. package/dist/core/tools/search-router.d.ts.map +1 -1
  945. package/dist/core/tools/search-router.js.map +1 -1
  946. package/dist/core/tools/search-tool-runtime.d.ts +19 -0
  947. package/dist/core/tools/search-tool-runtime.d.ts.map +1 -0
  948. package/dist/core/tools/search-tool-runtime.js +12 -0
  949. package/dist/core/tools/search-tool-runtime.js.map +1 -0
  950. package/dist/core/tools/secret-store.d.ts.map +1 -1
  951. package/dist/core/tools/secret-store.js.map +1 -1
  952. package/dist/core/tools/shell-command-parser.d.ts.map +1 -1
  953. package/dist/core/tools/shell-command-parser.js.map +1 -1
  954. package/dist/core/tools/shell-contract-router.d.ts.map +1 -1
  955. package/dist/core/tools/shell-contract-router.js +4 -1
  956. package/dist/core/tools/shell-contract-router.js.map +1 -1
  957. package/dist/core/tools/shell-execution-session.d.ts +4 -0
  958. package/dist/core/tools/shell-execution-session.d.ts.map +1 -0
  959. package/dist/core/tools/shell-execution-session.js +11 -0
  960. package/dist/core/tools/shell-execution-session.js.map +1 -0
  961. package/dist/core/tools/shell-output-projection.d.ts +49 -0
  962. package/dist/core/tools/shell-output-projection.d.ts.map +1 -0
  963. package/dist/core/tools/shell-output-projection.js +381 -0
  964. package/dist/core/tools/shell-output-projection.js.map +1 -0
  965. package/dist/core/tools/shell-session.d.ts +2 -13
  966. package/dist/core/tools/shell-session.d.ts.map +1 -1
  967. package/dist/core/tools/shell-session.js +36 -136
  968. package/dist/core/tools/shell-session.js.map +1 -1
  969. package/dist/core/tools/skill-audit.d.ts.map +1 -1
  970. package/dist/core/tools/skill-audit.js.map +1 -1
  971. package/dist/core/tools/skillify.d.ts.map +1 -1
  972. package/dist/core/tools/skillify.js.map +1 -1
  973. package/dist/core/tools/task-steps.d.ts +8 -8
  974. package/dist/core/tools/task-steps.d.ts.map +1 -1
  975. package/dist/core/tools/task-steps.js +17 -18
  976. package/dist/core/tools/task-steps.js.map +1 -1
  977. package/dist/core/tools/tmux-dispatch.d.ts.map +1 -1
  978. package/dist/core/tools/tmux-dispatch.js.map +1 -1
  979. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  980. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  981. package/dist/core/tools/tool-task.d.ts +23 -0
  982. package/dist/core/tools/tool-task.d.ts.map +1 -0
  983. package/dist/core/tools/tool-task.js +93 -0
  984. package/dist/core/tools/tool-task.js.map +1 -0
  985. package/dist/core/tools/windows-shell-engine.d.ts +17 -11
  986. package/dist/core/tools/windows-shell-engine.d.ts.map +1 -1
  987. package/dist/core/tools/windows-shell-engine.js +339 -117
  988. package/dist/core/tools/windows-shell-engine.js.map +1 -1
  989. package/dist/core/tools/windows-shell-state.d.ts.map +1 -1
  990. package/dist/core/tools/windows-shell-state.js.map +1 -1
  991. package/dist/core/tools/worktree-sync.d.ts.map +1 -1
  992. package/dist/core/tools/worktree-sync.js +8 -12
  993. package/dist/core/tools/worktree-sync.js.map +1 -1
  994. package/dist/core/tools/write.d.ts.map +1 -1
  995. package/dist/core/tools/write.js +0 -1
  996. package/dist/core/tools/write.js.map +1 -1
  997. package/dist/core/trust-manager.d.ts.map +1 -1
  998. package/dist/core/trust-manager.js +7 -40
  999. package/dist/core/trust-manager.js.map +1 -1
  1000. package/dist/core/util/atomic-file.d.ts +19 -0
  1001. package/dist/core/util/atomic-file.d.ts.map +1 -1
  1002. package/dist/core/util/atomic-file.js +50 -15
  1003. package/dist/core/util/atomic-file.js.map +1 -1
  1004. package/dist/core/util/bounded-file.d.ts.map +1 -1
  1005. package/dist/core/util/bounded-file.js.map +1 -1
  1006. package/dist/core/util/bounded-jsonl.d.ts.map +1 -1
  1007. package/dist/core/util/bounded-jsonl.js +2 -9
  1008. package/dist/core/util/bounded-jsonl.js.map +1 -1
  1009. package/dist/core/util/bounded-value.d.ts.map +1 -1
  1010. package/dist/core/util/bounded-value.js.map +1 -1
  1011. package/dist/core/util/json-size.d.ts +3 -0
  1012. package/dist/core/util/json-size.d.ts.map +1 -0
  1013. package/dist/core/util/json-size.js +95 -0
  1014. package/dist/core/util/json-size.js.map +1 -0
  1015. package/dist/core/util/minimatch-cache.d.ts.map +1 -1
  1016. package/dist/core/util/minimatch-cache.js.map +1 -1
  1017. package/dist/core/util/value-guards.d.ts.map +1 -1
  1018. package/dist/core/util/value-guards.js.map +1 -1
  1019. package/dist/core/worktree-sync/codes.d.ts.map +1 -1
  1020. package/dist/core/worktree-sync/git-engine.d.ts.map +1 -1
  1021. package/dist/core/worktree-sync/git-engine.js +20 -36
  1022. package/dist/core/worktree-sync/git-engine.js.map +1 -1
  1023. package/dist/core/worktree-sync/lane-gate.d.ts.map +1 -1
  1024. package/dist/core/worktree-sync/lane-gate.js +1 -4
  1025. package/dist/core/worktree-sync/lane-gate.js.map +1 -1
  1026. package/dist/core/worktree-sync/runtime.d.ts.map +1 -1
  1027. package/dist/core/worktree-sync/runtime.js.map +1 -1
  1028. package/dist/core/worktree-sync/store.d.ts.map +1 -1
  1029. package/dist/core/worktree-sync/store.js.map +1 -1
  1030. package/dist/core/worktree-sync/watcher.d.ts.map +1 -1
  1031. package/dist/core/worktree-sync/watcher.js.map +1 -1
  1032. package/dist/index.d.ts.map +1 -1
  1033. package/dist/index.js.map +1 -1
  1034. package/dist/main.d.ts.map +1 -1
  1035. package/dist/main.js +10 -32
  1036. package/dist/main.js.map +1 -1
  1037. package/dist/migrations.d.ts.map +1 -1
  1038. package/dist/migrations.js +6 -19
  1039. package/dist/migrations.js.map +1 -1
  1040. package/dist/modes/index.d.ts.map +1 -1
  1041. package/dist/modes/interactive/auth-dialogs-controller.d.ts +3 -0
  1042. package/dist/modes/interactive/auth-dialogs-controller.d.ts.map +1 -1
  1043. package/dist/modes/interactive/auth-dialogs-controller.js +96 -132
  1044. package/dist/modes/interactive/auth-dialogs-controller.js.map +1 -1
  1045. package/dist/modes/interactive/auto-learn-controller.d.ts +1 -31
  1046. package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -1
  1047. package/dist/modes/interactive/auto-learn-controller.js +86 -307
  1048. package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
  1049. package/dist/modes/interactive/autocomplete-provider.d.ts.map +1 -1
  1050. package/dist/modes/interactive/autocomplete-provider.js.map +1 -1
  1051. package/dist/modes/interactive/autonomy-commands.d.ts.map +1 -1
  1052. package/dist/modes/interactive/autonomy-commands.js +2 -8
  1053. package/dist/modes/interactive/autonomy-commands.js.map +1 -1
  1054. package/dist/modes/interactive/clipboard-input.d.ts +5 -1
  1055. package/dist/modes/interactive/clipboard-input.d.ts.map +1 -1
  1056. package/dist/modes/interactive/clipboard-input.js +17 -0
  1057. package/dist/modes/interactive/clipboard-input.js.map +1 -1
  1058. package/dist/modes/interactive/compaction-queue.d.ts.map +1 -1
  1059. package/dist/modes/interactive/compaction-queue.js +13 -18
  1060. package/dist/modes/interactive/compaction-queue.js.map +1 -1
  1061. package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -1
  1062. package/dist/modes/interactive/components/activity-lane.js +6 -10
  1063. package/dist/modes/interactive/components/activity-lane.js.map +1 -1
  1064. package/dist/modes/interactive/components/armin.d.ts +1 -0
  1065. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  1066. package/dist/modes/interactive/components/armin.js +10 -21
  1067. package/dist/modes/interactive/components/armin.js.map +1 -1
  1068. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  1069. package/dist/modes/interactive/components/assistant-message.js +1 -6
  1070. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  1071. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  1072. package/dist/modes/interactive/components/bash-execution.js +4 -9
  1073. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  1074. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  1075. package/dist/modes/interactive/components/bordered-loader.js +0 -3
  1076. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  1077. package/dist/modes/interactive/components/branch-summary-message.d.ts +3 -8
  1078. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  1079. package/dist/modes/interactive/components/branch-summary-message.js +13 -35
  1080. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  1081. package/dist/modes/interactive/components/compaction-summary-message.d.ts +3 -8
  1082. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  1083. package/dist/modes/interactive/components/compaction-summary-message.js +14 -36
  1084. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  1085. package/dist/modes/interactive/components/config-selector.d.ts +1 -0
  1086. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  1087. package/dist/modes/interactive/components/config-selector.js +20 -43
  1088. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  1089. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  1090. package/dist/modes/interactive/components/countdown-timer.js +0 -5
  1091. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  1092. package/dist/modes/interactive/components/custom-editor.d.ts +2 -0
  1093. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  1094. package/dist/modes/interactive/components/custom-editor.js +4 -8
  1095. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  1096. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  1097. package/dist/modes/interactive/components/custom-message.js +1 -6
  1098. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  1099. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  1100. package/dist/modes/interactive/components/daxnuts.js +6 -8
  1101. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  1102. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  1103. package/dist/modes/interactive/components/diff.js.map +1 -1
  1104. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  1105. package/dist/modes/interactive/components/dynamic-border.js +0 -1
  1106. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  1107. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  1108. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  1109. package/dist/modes/interactive/components/expandable-markdown-message.d.ts +21 -0
  1110. package/dist/modes/interactive/components/expandable-markdown-message.d.ts.map +1 -0
  1111. package/dist/modes/interactive/components/expandable-markdown-message.js +48 -0
  1112. package/dist/modes/interactive/components/expandable-markdown-message.js.map +1 -0
  1113. package/dist/modes/interactive/components/expandable-text.d.ts.map +1 -1
  1114. package/dist/modes/interactive/components/expandable-text.js +0 -2
  1115. package/dist/modes/interactive/components/expandable-text.js.map +1 -1
  1116. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  1117. package/dist/modes/interactive/components/extension-editor.js +1 -9
  1118. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  1119. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  1120. package/dist/modes/interactive/components/extension-input.js +2 -8
  1121. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  1122. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  1123. package/dist/modes/interactive/components/extension-selector.js +5 -20
  1124. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  1125. package/dist/modes/interactive/components/fitness-role-selector.d.ts.map +1 -1
  1126. package/dist/modes/interactive/components/fitness-role-selector.js +0 -1
  1127. package/dist/modes/interactive/components/fitness-role-selector.js.map +1 -1
  1128. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  1129. package/dist/modes/interactive/components/footer.js +1 -5
  1130. package/dist/modes/interactive/components/footer.js.map +1 -1
  1131. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  1132. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  1133. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  1134. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  1135. package/dist/modes/interactive/components/login-dialog.js +4 -10
  1136. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  1137. package/dist/modes/interactive/components/model-selector.d.ts +2 -2
  1138. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  1139. package/dist/modes/interactive/components/model-selector.js +21 -44
  1140. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  1141. package/dist/modes/interactive/components/model-suggestion-selector.d.ts.map +1 -1
  1142. package/dist/modes/interactive/components/model-suggestion-selector.js +0 -1
  1143. package/dist/modes/interactive/components/model-suggestion-selector.js.map +1 -1
  1144. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  1145. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  1146. package/dist/modes/interactive/components/oauth-selector.js +16 -32
  1147. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  1148. package/dist/modes/interactive/components/profile-resource-editor.d.ts +3 -4
  1149. package/dist/modes/interactive/components/profile-resource-editor.d.ts.map +1 -1
  1150. package/dist/modes/interactive/components/profile-resource-editor.js +34 -93
  1151. package/dist/modes/interactive/components/profile-resource-editor.js.map +1 -1
  1152. package/dist/modes/interactive/components/profile-selector.d.ts.map +1 -1
  1153. package/dist/modes/interactive/components/profile-selector.js +0 -1
  1154. package/dist/modes/interactive/components/profile-selector.js.map +1 -1
  1155. package/dist/modes/interactive/components/scoped-models-selector.d.ts +3 -4
  1156. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  1157. package/dist/modes/interactive/components/scoped-models-selector.js +34 -79
  1158. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  1159. package/dist/modes/interactive/components/selector-list.d.ts +63 -0
  1160. package/dist/modes/interactive/components/selector-list.d.ts.map +1 -0
  1161. package/dist/modes/interactive/components/selector-list.js +186 -0
  1162. package/dist/modes/interactive/components/selector-list.js.map +1 -0
  1163. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  1164. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  1165. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  1166. package/dist/modes/interactive/components/session-selector.js +34 -59
  1167. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  1168. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  1169. package/dist/modes/interactive/components/settings-selector.js +40 -138
  1170. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  1171. package/dist/modes/interactive/components/show-images-selector.d.ts +2 -4
  1172. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  1173. package/dist/modes/interactive/components/show-images-selector.js +9 -28
  1174. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  1175. package/dist/modes/interactive/components/skill-invocation-message.d.ts +3 -8
  1176. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  1177. package/dist/modes/interactive/components/skill-invocation-message.js +12 -40
  1178. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  1179. package/dist/modes/interactive/components/theme-selector.d.ts +2 -5
  1180. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  1181. package/dist/modes/interactive/components/theme-selector.js +11 -37
  1182. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  1183. package/dist/modes/interactive/components/thinking-selector.d.ts +2 -4
  1184. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  1185. package/dist/modes/interactive/components/thinking-selector.js +9 -31
  1186. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  1187. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  1188. package/dist/modes/interactive/components/tool-execution.js +9 -28
  1189. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  1190. package/dist/modes/interactive/components/tool-group.d.ts.map +1 -1
  1191. package/dist/modes/interactive/components/tool-group.js +2 -3
  1192. package/dist/modes/interactive/components/tool-group.js.map +1 -1
  1193. package/dist/modes/interactive/components/tool-panel-registry.d.ts.map +1 -1
  1194. package/dist/modes/interactive/components/tool-panel-registry.js +5 -3
  1195. package/dist/modes/interactive/components/tool-panel-registry.js.map +1 -1
  1196. package/dist/modes/interactive/components/tool-title.d.ts.map +1 -1
  1197. package/dist/modes/interactive/components/tool-title.js +0 -4
  1198. package/dist/modes/interactive/components/tool-title.js.map +1 -1
  1199. package/dist/modes/interactive/components/transcript-pager.d.ts +26 -0
  1200. package/dist/modes/interactive/components/transcript-pager.d.ts.map +1 -0
  1201. package/dist/modes/interactive/components/transcript-pager.js +81 -0
  1202. package/dist/modes/interactive/components/transcript-pager.js.map +1 -0
  1203. package/dist/modes/interactive/components/tree-selector.d.ts +1 -12
  1204. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  1205. package/dist/modes/interactive/components/tree-selector.js +42 -402
  1206. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  1207. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  1208. package/dist/modes/interactive/components/trust-selector.js +4 -16
  1209. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  1210. package/dist/modes/interactive/components/usage-action-selector.d.ts.map +1 -1
  1211. package/dist/modes/interactive/components/usage-action-selector.js +2 -10
  1212. package/dist/modes/interactive/components/usage-action-selector.js.map +1 -1
  1213. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  1214. package/dist/modes/interactive/components/user-message-selector.js +3 -6
  1215. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  1216. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  1217. package/dist/modes/interactive/components/user-message.js +0 -1
  1218. package/dist/modes/interactive/components/user-message.js.map +1 -1
  1219. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  1220. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  1221. package/dist/modes/interactive/config-backup.d.ts.map +1 -1
  1222. package/dist/modes/interactive/config-backup.js.map +1 -1
  1223. package/dist/modes/interactive/editor-overlay-host.d.ts.map +1 -1
  1224. package/dist/modes/interactive/editor-overlay-host.js +0 -3
  1225. package/dist/modes/interactive/editor-overlay-host.js.map +1 -1
  1226. package/dist/modes/interactive/extension-ui-host.d.ts +2 -0
  1227. package/dist/modes/interactive/extension-ui-host.d.ts.map +1 -1
  1228. package/dist/modes/interactive/extension-ui-host.js +51 -72
  1229. package/dist/modes/interactive/extension-ui-host.js.map +1 -1
  1230. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  1231. package/dist/modes/interactive/external-editor.js +2 -15
  1232. package/dist/modes/interactive/external-editor.js.map +1 -1
  1233. package/dist/modes/interactive/history-reload-math.d.ts.map +1 -1
  1234. package/dist/modes/interactive/history-reload-math.js.map +1 -1
  1235. package/dist/modes/interactive/interactive-event-controller.d.ts.map +1 -1
  1236. package/dist/modes/interactive/interactive-event-controller.js +23 -16
  1237. package/dist/modes/interactive/interactive-event-controller.js.map +1 -1
  1238. package/dist/modes/interactive/interactive-mode.d.ts +13 -4
  1239. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  1240. package/dist/modes/interactive/interactive-mode.js +123 -204
  1241. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  1242. package/dist/modes/interactive/interactive-selection-prompts.d.ts +20 -0
  1243. package/dist/modes/interactive/interactive-selection-prompts.d.ts.map +1 -0
  1244. package/dist/modes/interactive/interactive-selection-prompts.js +43 -0
  1245. package/dist/modes/interactive/interactive-selection-prompts.js.map +1 -0
  1246. package/dist/modes/interactive/key-handlers.d.ts +2 -1
  1247. package/dist/modes/interactive/key-handlers.d.ts.map +1 -1
  1248. package/dist/modes/interactive/key-handlers.js +4 -2
  1249. package/dist/modes/interactive/key-handlers.js.map +1 -1
  1250. package/dist/modes/interactive/loaded-resources-view.d.ts.map +1 -1
  1251. package/dist/modes/interactive/loaded-resources-view.js.map +1 -1
  1252. package/dist/modes/interactive/local-model-commands.d.ts.map +1 -1
  1253. package/dist/modes/interactive/local-model-commands.js +4 -9
  1254. package/dist/modes/interactive/local-model-commands.js.map +1 -1
  1255. package/dist/modes/interactive/model-fitness-presentation.d.ts +21 -0
  1256. package/dist/modes/interactive/model-fitness-presentation.d.ts.map +1 -0
  1257. package/dist/modes/interactive/model-fitness-presentation.js +13 -0
  1258. package/dist/modes/interactive/model-fitness-presentation.js.map +1 -0
  1259. package/dist/modes/interactive/profile-menu-controller.d.ts +2 -0
  1260. package/dist/modes/interactive/profile-menu-controller.d.ts.map +1 -1
  1261. package/dist/modes/interactive/profile-menu-controller.js +79 -171
  1262. package/dist/modes/interactive/profile-menu-controller.js.map +1 -1
  1263. package/dist/modes/interactive/report-commands.d.ts +2 -0
  1264. package/dist/modes/interactive/report-commands.d.ts.map +1 -1
  1265. package/dist/modes/interactive/report-commands.js +12 -6
  1266. package/dist/modes/interactive/report-commands.js.map +1 -1
  1267. package/dist/modes/interactive/resource-display.d.ts.map +1 -1
  1268. package/dist/modes/interactive/resource-display.js.map +1 -1
  1269. package/dist/modes/interactive/resource-shell-commands.d.ts.map +1 -1
  1270. package/dist/modes/interactive/resource-shell-commands.js +6 -23
  1271. package/dist/modes/interactive/resource-shell-commands.js.map +1 -1
  1272. package/dist/modes/interactive/session-flow-commands.d.ts.map +1 -1
  1273. package/dist/modes/interactive/session-flow-commands.js +21 -25
  1274. package/dist/modes/interactive/session-flow-commands.js.map +1 -1
  1275. package/dist/modes/interactive/session-io-commands.d.ts.map +1 -1
  1276. package/dist/modes/interactive/session-io-commands.js.map +1 -1
  1277. package/dist/modes/interactive/session-replacement-errors.d.ts.map +1 -1
  1278. package/dist/modes/interactive/session-replacement-errors.js.map +1 -1
  1279. package/dist/modes/interactive/settings-selector-flow.d.ts.map +1 -1
  1280. package/dist/modes/interactive/settings-selector-flow.js.map +1 -1
  1281. package/dist/modes/interactive/signal-lifecycle.d.ts.map +1 -1
  1282. package/dist/modes/interactive/signal-lifecycle.js.map +1 -1
  1283. package/dist/modes/interactive/startup-checks.d.ts.map +1 -1
  1284. package/dist/modes/interactive/startup-checks.js +12 -8
  1285. package/dist/modes/interactive/startup-checks.js.map +1 -1
  1286. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  1287. package/dist/modes/interactive/theme/theme.js +10 -76
  1288. package/dist/modes/interactive/theme/theme.js.map +1 -1
  1289. package/dist/modes/interactive/usage-commands.d.ts.map +1 -1
  1290. package/dist/modes/interactive/usage-commands.js.map +1 -1
  1291. package/dist/modes/print-mode.d.ts.map +1 -1
  1292. package/dist/modes/print-mode.js +5 -22
  1293. package/dist/modes/print-mode.js.map +1 -1
  1294. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  1295. package/dist/modes/rpc/jsonl.js +1 -1
  1296. package/dist/modes/rpc/jsonl.js.map +1 -1
  1297. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  1298. package/dist/modes/rpc/rpc-client.js +7 -8
  1299. package/dist/modes/rpc/rpc-client.js.map +1 -1
  1300. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  1301. package/dist/modes/rpc/rpc-mode.js +5 -20
  1302. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  1303. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  1304. package/dist/modes/rpc/rpc-types.js.map +1 -1
  1305. package/dist/modes/termination-signals.d.ts +4 -0
  1306. package/dist/modes/termination-signals.d.ts.map +1 -0
  1307. package/dist/modes/termination-signals.js +21 -0
  1308. package/dist/modes/termination-signals.js.map +1 -0
  1309. package/dist/package-manager-cli.d.ts.map +1 -1
  1310. package/dist/package-manager-cli.js.map +1 -1
  1311. package/dist/utils/ansi-colors.d.ts +5 -0
  1312. package/dist/utils/ansi-colors.d.ts.map +1 -0
  1313. package/dist/utils/ansi-colors.js +38 -0
  1314. package/dist/utils/ansi-colors.js.map +1 -0
  1315. package/dist/utils/ansi.d.ts.map +1 -1
  1316. package/dist/utils/ansi.js.map +1 -1
  1317. package/dist/utils/changelog.d.ts.map +1 -1
  1318. package/dist/utils/changelog.js.map +1 -1
  1319. package/dist/utils/child-process.d.ts.map +1 -1
  1320. package/dist/utils/child-process.js.map +1 -1
  1321. package/dist/utils/clipboard-image.d.ts.map +1 -1
  1322. package/dist/utils/clipboard-image.js.map +1 -1
  1323. package/dist/utils/clipboard-native.d.ts.map +1 -1
  1324. package/dist/utils/clipboard-native.js.map +1 -1
  1325. package/dist/utils/clipboard.d.ts.map +1 -1
  1326. package/dist/utils/clipboard.js.map +1 -1
  1327. package/dist/utils/deprecation.d.ts.map +1 -1
  1328. package/dist/utils/deprecation.js.map +1 -1
  1329. package/dist/utils/exif-orientation.d.ts.map +1 -1
  1330. package/dist/utils/exif-orientation.js.map +1 -1
  1331. package/dist/utils/external-editor-command.d.ts.map +1 -1
  1332. package/dist/utils/external-editor-command.js.map +1 -1
  1333. package/dist/utils/frontmatter.d.ts.map +1 -1
  1334. package/dist/utils/frontmatter.js.map +1 -1
  1335. package/dist/utils/fs-watch.d.ts.map +1 -1
  1336. package/dist/utils/fs-watch.js.map +1 -1
  1337. package/dist/utils/git.d.ts.map +1 -1
  1338. package/dist/utils/git.js +20 -28
  1339. package/dist/utils/git.js.map +1 -1
  1340. package/dist/utils/highlight-js-languages.d.ts.map +1 -1
  1341. package/dist/utils/html.d.ts.map +1 -1
  1342. package/dist/utils/html.js.map +1 -1
  1343. package/dist/utils/image-convert.d.ts.map +1 -1
  1344. package/dist/utils/image-convert.js.map +1 -1
  1345. package/dist/utils/image-resize-core.d.ts.map +1 -1
  1346. package/dist/utils/image-resize-core.js.map +1 -1
  1347. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  1348. package/dist/utils/image-resize-worker.js.map +1 -1
  1349. package/dist/utils/image-resize.d.ts.map +1 -1
  1350. package/dist/utils/image-resize.js.map +1 -1
  1351. package/dist/utils/json.d.ts.map +1 -1
  1352. package/dist/utils/json.js.map +1 -1
  1353. package/dist/utils/mime.d.ts.map +1 -1
  1354. package/dist/utils/mime.js.map +1 -1
  1355. package/dist/utils/open-browser.d.ts.map +1 -1
  1356. package/dist/utils/open-browser.js.map +1 -1
  1357. package/dist/utils/paths.d.ts.map +1 -1
  1358. package/dist/utils/paths.js.map +1 -1
  1359. package/dist/utils/photon.d.ts.map +1 -1
  1360. package/dist/utils/photon.js.map +1 -1
  1361. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  1362. package/dist/utils/pi-user-agent.js.map +1 -1
  1363. package/dist/utils/platform.d.ts.map +1 -1
  1364. package/dist/utils/platform.js.map +1 -1
  1365. package/dist/utils/process-memory.d.ts.map +1 -1
  1366. package/dist/utils/process-memory.js.map +1 -1
  1367. package/dist/utils/safe-write-stream.d.ts.map +1 -1
  1368. package/dist/utils/safe-write-stream.js.map +1 -1
  1369. package/dist/utils/shell.d.ts.map +1 -1
  1370. package/dist/utils/shell.js.map +1 -1
  1371. package/dist/utils/sleep.d.ts.map +1 -1
  1372. package/dist/utils/sleep.js +2 -15
  1373. package/dist/utils/sleep.js.map +1 -1
  1374. package/dist/utils/stdin-events.d.ts +8 -0
  1375. package/dist/utils/stdin-events.d.ts.map +1 -0
  1376. package/dist/utils/stdin-events.js +19 -0
  1377. package/dist/utils/stdin-events.js.map +1 -0
  1378. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  1379. package/dist/utils/syntax-highlight.js +20 -13
  1380. package/dist/utils/syntax-highlight.js.map +1 -1
  1381. package/dist/utils/tools-manager.d.ts.map +1 -1
  1382. package/dist/utils/tools-manager.js.map +1 -1
  1383. package/dist/utils/version-check.d.ts.map +1 -1
  1384. package/dist/utils/version-check.js.map +1 -1
  1385. package/dist/utils/windows-self-update.d.ts.map +1 -1
  1386. package/dist/utils/windows-self-update.js.map +1 -1
  1387. package/dist/utils/work-directory.d.ts.map +1 -1
  1388. package/dist/utils/work-directory.js.map +1 -1
  1389. package/docs/compaction.md +11 -3
  1390. package/docs/sessions.md +6 -0
  1391. package/docs/settings.md +1 -1
  1392. package/docs/windows.md +26 -1
  1393. package/docs/work-directory.md +9 -1
  1394. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  1395. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  1396. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  1397. package/examples/extensions/sandbox/package-lock.json +2 -2
  1398. package/examples/extensions/sandbox/package.json +1 -1
  1399. package/examples/extensions/with-deps/package-lock.json +2 -2
  1400. package/examples/extensions/with-deps/package.json +1 -1
  1401. package/npm-shrinkwrap.json +16 -16
  1402. package/package.json +10 -10
  1403. package/dist/utils/streaming-lines.d.ts +0 -20
  1404. package/dist/utils/streaming-lines.d.ts.map +0 -1
  1405. package/dist/utils/streaming-lines.js +0 -79
  1406. package/dist/utils/streaming-lines.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"cost-guard.d.ts","sourceRoot":"","sources":["../../src/core/cost-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,gEAAgE;AAChE,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,cAAc,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;CACpG,GAAG,MAAM,CAaT;AAED,qEAAqE;AACrE,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,WAAW,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IACjC,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,iGAAiG;IACjG,MAAM,EAAE,eAAe,CAAC;CACxB;AAED,eAAO,MAAM,2BAA2B,EAAE,iBAGzC,CAAC;AAEF,MAAM,WAAW,iBAAiB;IACjC,2GAA2G;IAC3G,IAAI,EAAE,OAAO,CAAC;IACd,0HAAwH;IACxH,MAAM,EAAE,MAAM,CAAC;IACf,8KAA4K;IAC5K,aAAa,EAAE,MAAM,CAAC;IACtB,uFAAqF;IACrF,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,eAAe,CAAC;CACxB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,iBAAiB,EAC3B,uBAAuB,SAAI,GACzB,iBAAiB,CAYnB;AAED,qGAAqG;AACrG,QAAA,MAAM,gBAAgB,+EAAgF,CAAC;AACvG,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC/D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAO1F;;;;;GAKG;AACH,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,SAAS,cAAc,EAAE,EAC3C,SAAS,CAAC,EAAE,kBAAkB,GAC5B,cAAc,GAAG,MAAM,CAczB","sourcesContent":["/**\n * Proactive per-turn token cost guard (Hermes-parity superiority item #34).\n *\n * Hermes (and pi today) only react to context growth by compressing AFTER it's expensive. This estimates\n * the dollar cost of the NEXT LLM call BEFORE it is submitted, so the agent can warn the user or\n * automatically reduce reasoning effort before a runaway billing spike — a proactive ceiling, not a\n * reactive cleanup. Pure functions: no I/O, fully testable.\n */\n\n/** Per-million-token USD prices, as carried on `Model.cost`. */\nexport interface ModelTokenCost {\n\tinput: number;\n\toutput: number;\n\tcacheRead?: number;\n\tcacheWrite?: number;\n}\n\n/**\n * Estimate the USD cost of one turn: the whole current context is billed as input, plus up to\n * `maxOutputTokens` of output. `cachedInputTokens` (prefix-cache hits) are billed at the cheaper\n * cache-read rate. Fresh input is billed once at the higher of the uncached-input and cache-write\n * rates because a provider may select that prefix for a new cache write. This is an UPPER bound on\n * the turn (it also assumes the model emits its full output budget), which is what a spending ceiling\n * should bound against.\n */\nexport function estimateTurnCostUsd(args: {\n\tinputTokens: number;\n\tmaxOutputTokens: number;\n\tcost: ModelTokenCost;\n\tcachedInputTokens?: number;\n\tlongContextPricing?: { thresholdTokens: number; inputMultiplier: number; outputMultiplier: number };\n}): number {\n\tconst { inputTokens, maxOutputTokens, cost } = args;\n\tconst cached = Math.max(0, Math.min(args.cachedInputTokens ?? 0, inputTokens));\n\tconst freshInput = inputTokens - cached;\n\tconst cacheReadRate = cost.cacheRead ?? cost.input;\n\tconst freshInputRate = Math.max(cost.input, cost.cacheWrite ?? cost.input);\n\tconst longContextPricing = args.longContextPricing;\n\tconst useLongContextTier = longContextPricing && inputTokens > longContextPricing.thresholdTokens;\n\tconst inputMultiplier = useLongContextTier ? longContextPricing.inputMultiplier : 1;\n\tconst outputMultiplier = useLongContextTier ? longContextPricing.outputMultiplier : 1;\n\tconst inputUsd = ((freshInput * freshInputRate + cached * cacheReadRate) * inputMultiplier) / 1_000_000;\n\tconst outputUsd = (Math.max(0, maxOutputTokens) * cost.output * outputMultiplier) / 1_000_000;\n\treturn inputUsd + outputUsd;\n}\n\n/** What to do when a turn's projected cost exceeds the threshold. */\nexport type CostGuardAction = \"warn\" | \"downgrade\";\n\nexport interface CostGuardSettings {\n\t/** Per-turn projected USD threshold. `0` disables the guard entirely. */\n\tmaxTurnUsd: number;\n\t/** Over the ceiling: `warn` (surface a notice) or `downgrade` (also reduce reasoning effort). */\n\taction: CostGuardAction;\n}\n\nexport const DEFAULT_COST_GUARD_SETTINGS: CostGuardSettings = {\n\tmaxTurnUsd: 2.5,\n\taction: \"warn\",\n};\n\nexport interface CostGuardDecision {\n\t/** True when the guard is enabled AND the projected TOTAL (estUsd + backgroundUsd) exceeds the ceiling. */\n\tover: boolean;\n\t/** Projected USD cost of the next foreground call alone (unchanged meaning — what the footer's \"/turn\" label shows). */\n\testUsd: number;\n\t/** Background/spawned-lane USD spend (research/worker/reflection/fitness) folded into this decision — the caller decides the window (e.g. since the current turn began). */\n\tbackgroundUsd: number;\n\t/** `estUsd + backgroundUsd` — the value actually compared against `thresholdUsd`. */\n\ttotalUsd: number;\n\tthresholdUsd: number;\n\taction: CostGuardAction;\n}\n\n/**\n * Decide whether the projected turn cost trips the guard. Disabled (`maxTurnUsd<=0`) is never `over`.\n *\n * `cumulativeBackgroundUsd` (default 0) is spawned/background-lane spend (research, worker delegation,\n * reflection, model-fitness probes — see {@link SpawnedUsageTotals}) folded into the same ceiling as the\n * next foreground call. This function is window-agnostic — it just sums whatever the caller passes — but\n * the intended caller convention (agent-session.ts) is spend attributed to the CURRENT turn only (a\n * baseline snapshotted at the top of the turn, subtracted from the live cumulative total), not the\n * session's entire lifetime, so a turn that is cheap in the foreground but has quietly spent a lot in\n * background lanes THIS turn still trips the guard, without a prior turn's spend keeping it stuck over\n * forever (still warn-only by default).\n */\nexport function evaluateCostGuard(\n\testUsd: number,\n\tsettings: CostGuardSettings,\n\tcumulativeBackgroundUsd = 0,\n): CostGuardDecision {\n\tconst enabled = settings.maxTurnUsd > 0;\n\tconst backgroundUsd = Math.max(0, cumulativeBackgroundUsd);\n\tconst totalUsd = estUsd + backgroundUsd;\n\treturn {\n\t\tover: enabled && totalUsd > settings.maxTurnUsd,\n\t\testUsd,\n\t\tbackgroundUsd,\n\t\ttotalUsd,\n\t\tthresholdUsd: settings.maxTurnUsd,\n\t\taction: settings.action,\n\t};\n}\n\n/** Reasoning levels in descending cost order, used to pick the next-cheaper level on a downgrade. */\nconst REASONING_LADDER = [\"ultra\", \"max\", \"xhigh\", \"high\", \"medium\", \"low\", \"minimal\", \"off\"] as const;\nexport type ReasoningLevel = (typeof REASONING_LADDER)[number];\nexport type ReasoningEffortMap = Readonly<Partial<Record<ReasoningLevel, string | null>>>;\n\nfunction effectiveReasoningEffort(level: ReasoningLevel, effortMap: ReasoningEffortMap | undefined): string | null {\n\tconst mapped = effortMap?.[level];\n\treturn mapped === undefined ? level : mapped;\n}\n\n/**\n * One supported step down the reasoning ladder (cost reduction) from `current`. When\n * `supportedLevels` is provided, unsupported intermediate levels are skipped instead of relying on a\n * provider clamp that may move back upward. Returns `current` unchanged when already at the model's\n * floor or unrecognized — the guard never raises effort, only lowers it.\n */\nexport function downgradeReasoning(\n\tcurrent: string,\n\tsupportedLevels?: readonly ReasoningLevel[],\n\teffortMap?: ReasoningEffortMap,\n): ReasoningLevel | string {\n\tconst i = REASONING_LADDER.indexOf(current as ReasoningLevel);\n\tif (i < 0) return current;\n\tif (!supportedLevels) {\n\t\treturn REASONING_LADDER[Math.min(i + 1, REASONING_LADDER.length - 1)];\n\t}\n\tconst supported = new Set<ReasoningLevel>(supportedLevels);\n\tconst currentEffort = effectiveReasoningEffort(current as ReasoningLevel, effortMap);\n\tfor (let nextIndex = i + 1; nextIndex < REASONING_LADDER.length; nextIndex++) {\n\t\tconst candidate = REASONING_LADDER[nextIndex];\n\t\tif (supported.has(candidate) && effectiveReasoningEffort(candidate, effortMap) !== currentEffort)\n\t\t\treturn candidate;\n\t}\n\treturn current;\n}\n"]}
1
+ {"version":3,"file":"cost-guard.d.ts","sourceRoot":"","sources":["../../src/core/cost-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,gEAAgE;AAChE,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,cAAc,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;CACpG,GAAG,MAAM,CAaT;AAED,qEAAqE;AACrE,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,WAAW,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IACjC,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,iGAAiG;IACjG,MAAM,EAAE,eAAe,CAAC;CACxB;AAED,eAAO,MAAM,2BAA2B,EAAE,iBAGzC,CAAC;AAEF,MAAM,WAAW,iBAAiB;IACjC,2GAA2G;IAC3G,IAAI,EAAE,OAAO,CAAC;IACd,wHAAwH;IACxH,MAAM,EAAE,MAAM,CAAC;IACf,4KAA4K;IAC5K,aAAa,EAAE,MAAM,CAAC;IACtB,qFAAqF;IACrF,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,eAAe,CAAC;CACxB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,iBAAiB,EAC3B,uBAAuB,SAAI,GACzB,iBAAiB,CAYnB;AAED,qGAAqG;AACrG,QAAA,MAAM,gBAAgB,YAAI,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAU,CAAC;AACvG,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC/D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAO1F;;;;;GAKG;AACH,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,SAAS,cAAc,EAAE,EAC3C,SAAS,CAAC,EAAE,kBAAkB,GAC5B,cAAc,GAAG,MAAM,CAczB"}
@@ -1 +1 @@
1
- {"version":3,"file":"cost-guard.js","sourceRoot":"","sources":["../../src/core/cost-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAMnC,EAAU;IACV,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;IAC/E,MAAM,UAAU,GAAG,WAAW,GAAG,MAAM,CAAC;IACxC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC;IACnD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3E,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;IACnD,MAAM,kBAAkB,GAAG,kBAAkB,IAAI,WAAW,GAAG,kBAAkB,CAAC,eAAe,CAAC;IAClG,MAAM,eAAe,GAAG,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,GAAG,cAAc,GAAG,MAAM,GAAG,aAAa,CAAC,GAAG,eAAe,CAAC,GAAG,SAAS,CAAC;IACxG,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC,GAAG,SAAS,CAAC;IAC9F,OAAO,QAAQ,GAAG,SAAS,CAAC;AAAA,CAC5B;AAYD,MAAM,CAAC,MAAM,2BAA2B,GAAsB;IAC7D,UAAU,EAAE,GAAG;IACf,MAAM,EAAE,MAAM;CACd,CAAC;AAeF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAChC,MAAc,EACd,QAA2B,EAC3B,uBAAuB,GAAG,CAAC,EACP;IACpB,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,MAAM,GAAG,aAAa,CAAC;IACxC,OAAO;QACN,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG,QAAQ,CAAC,UAAU;QAC/C,MAAM;QACN,aAAa;QACb,QAAQ;QACR,YAAY,EAAE,QAAQ,CAAC,UAAU;QACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;KACvB,CAAC;AAAA,CACF;AAED,qGAAqG;AACrG,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAU,CAAC;AAIvG,SAAS,wBAAwB,CAAC,KAAqB,EAAE,SAAyC,EAAiB;IAClH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAAA,CAC7C;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CACjC,OAAe,EACf,eAA2C,EAC3C,SAA8B,EACJ;IAC1B,MAAM,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAyB,CAAC,CAAC;IAC9D,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAC1B,IAAI,CAAC,eAAe,EAAE,CAAC;QACtB,OAAO,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAiB,eAAe,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,wBAAwB,CAAC,OAAyB,EAAE,SAAS,CAAC,CAAC;IACrF,KAAK,IAAI,SAAS,GAAG,CAAC,GAAG,CAAC,EAAE,SAAS,GAAG,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;QAC9E,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,wBAAwB,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,aAAa;YAC/F,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC;AAAA,CACf","sourcesContent":["/**\n * Proactive per-turn token cost guard (Hermes-parity superiority item #34).\n *\n * Hermes (and pi today) only react to context growth by compressing AFTER it's expensive. This estimates\n * the dollar cost of the NEXT LLM call BEFORE it is submitted, so the agent can warn the user or\n * automatically reduce reasoning effort before a runaway billing spike — a proactive ceiling, not a\n * reactive cleanup. Pure functions: no I/O, fully testable.\n */\n\n/** Per-million-token USD prices, as carried on `Model.cost`. */\nexport interface ModelTokenCost {\n\tinput: number;\n\toutput: number;\n\tcacheRead?: number;\n\tcacheWrite?: number;\n}\n\n/**\n * Estimate the USD cost of one turn: the whole current context is billed as input, plus up to\n * `maxOutputTokens` of output. `cachedInputTokens` (prefix-cache hits) are billed at the cheaper\n * cache-read rate. Fresh input is billed once at the higher of the uncached-input and cache-write\n * rates because a provider may select that prefix for a new cache write. This is an UPPER bound on\n * the turn (it also assumes the model emits its full output budget), which is what a spending ceiling\n * should bound against.\n */\nexport function estimateTurnCostUsd(args: {\n\tinputTokens: number;\n\tmaxOutputTokens: number;\n\tcost: ModelTokenCost;\n\tcachedInputTokens?: number;\n\tlongContextPricing?: { thresholdTokens: number; inputMultiplier: number; outputMultiplier: number };\n}): number {\n\tconst { inputTokens, maxOutputTokens, cost } = args;\n\tconst cached = Math.max(0, Math.min(args.cachedInputTokens ?? 0, inputTokens));\n\tconst freshInput = inputTokens - cached;\n\tconst cacheReadRate = cost.cacheRead ?? cost.input;\n\tconst freshInputRate = Math.max(cost.input, cost.cacheWrite ?? cost.input);\n\tconst longContextPricing = args.longContextPricing;\n\tconst useLongContextTier = longContextPricing && inputTokens > longContextPricing.thresholdTokens;\n\tconst inputMultiplier = useLongContextTier ? longContextPricing.inputMultiplier : 1;\n\tconst outputMultiplier = useLongContextTier ? longContextPricing.outputMultiplier : 1;\n\tconst inputUsd = ((freshInput * freshInputRate + cached * cacheReadRate) * inputMultiplier) / 1_000_000;\n\tconst outputUsd = (Math.max(0, maxOutputTokens) * cost.output * outputMultiplier) / 1_000_000;\n\treturn inputUsd + outputUsd;\n}\n\n/** What to do when a turn's projected cost exceeds the threshold. */\nexport type CostGuardAction = \"warn\" | \"downgrade\";\n\nexport interface CostGuardSettings {\n\t/** Per-turn projected USD threshold. `0` disables the guard entirely. */\n\tmaxTurnUsd: number;\n\t/** Over the ceiling: `warn` (surface a notice) or `downgrade` (also reduce reasoning effort). */\n\taction: CostGuardAction;\n}\n\nexport const DEFAULT_COST_GUARD_SETTINGS: CostGuardSettings = {\n\tmaxTurnUsd: 2.5,\n\taction: \"warn\",\n};\n\nexport interface CostGuardDecision {\n\t/** True when the guard is enabled AND the projected TOTAL (estUsd + backgroundUsd) exceeds the ceiling. */\n\tover: boolean;\n\t/** Projected USD cost of the next foreground call alone (unchanged meaning — what the footer's \"/turn\" label shows). */\n\testUsd: number;\n\t/** Background/spawned-lane USD spend (research/worker/reflection/fitness) folded into this decision — the caller decides the window (e.g. since the current turn began). */\n\tbackgroundUsd: number;\n\t/** `estUsd + backgroundUsd` — the value actually compared against `thresholdUsd`. */\n\ttotalUsd: number;\n\tthresholdUsd: number;\n\taction: CostGuardAction;\n}\n\n/**\n * Decide whether the projected turn cost trips the guard. Disabled (`maxTurnUsd<=0`) is never `over`.\n *\n * `cumulativeBackgroundUsd` (default 0) is spawned/background-lane spend (research, worker delegation,\n * reflection, model-fitness probes — see {@link SpawnedUsageTotals}) folded into the same ceiling as the\n * next foreground call. This function is window-agnostic — it just sums whatever the caller passes — but\n * the intended caller convention (agent-session.ts) is spend attributed to the CURRENT turn only (a\n * baseline snapshotted at the top of the turn, subtracted from the live cumulative total), not the\n * session's entire lifetime, so a turn that is cheap in the foreground but has quietly spent a lot in\n * background lanes THIS turn still trips the guard, without a prior turn's spend keeping it stuck over\n * forever (still warn-only by default).\n */\nexport function evaluateCostGuard(\n\testUsd: number,\n\tsettings: CostGuardSettings,\n\tcumulativeBackgroundUsd = 0,\n): CostGuardDecision {\n\tconst enabled = settings.maxTurnUsd > 0;\n\tconst backgroundUsd = Math.max(0, cumulativeBackgroundUsd);\n\tconst totalUsd = estUsd + backgroundUsd;\n\treturn {\n\t\tover: enabled && totalUsd > settings.maxTurnUsd,\n\t\testUsd,\n\t\tbackgroundUsd,\n\t\ttotalUsd,\n\t\tthresholdUsd: settings.maxTurnUsd,\n\t\taction: settings.action,\n\t};\n}\n\n/** Reasoning levels in descending cost order, used to pick the next-cheaper level on a downgrade. */\nconst REASONING_LADDER = [\"ultra\", \"max\", \"xhigh\", \"high\", \"medium\", \"low\", \"minimal\", \"off\"] as const;\nexport type ReasoningLevel = (typeof REASONING_LADDER)[number];\nexport type ReasoningEffortMap = Readonly<Partial<Record<ReasoningLevel, string | null>>>;\n\nfunction effectiveReasoningEffort(level: ReasoningLevel, effortMap: ReasoningEffortMap | undefined): string | null {\n\tconst mapped = effortMap?.[level];\n\treturn mapped === undefined ? level : mapped;\n}\n\n/**\n * One supported step down the reasoning ladder (cost reduction) from `current`. When\n * `supportedLevels` is provided, unsupported intermediate levels are skipped instead of relying on a\n * provider clamp that may move back upward. Returns `current` unchanged when already at the model's\n * floor or unrecognized — the guard never raises effort, only lowers it.\n */\nexport function downgradeReasoning(\n\tcurrent: string,\n\tsupportedLevels?: readonly ReasoningLevel[],\n\teffortMap?: ReasoningEffortMap,\n): ReasoningLevel | string {\n\tconst i = REASONING_LADDER.indexOf(current as ReasoningLevel);\n\tif (i < 0) return current;\n\tif (!supportedLevels) {\n\t\treturn REASONING_LADDER[Math.min(i + 1, REASONING_LADDER.length - 1)];\n\t}\n\tconst supported = new Set<ReasoningLevel>(supportedLevels);\n\tconst currentEffort = effectiveReasoningEffort(current as ReasoningLevel, effortMap);\n\tfor (let nextIndex = i + 1; nextIndex < REASONING_LADDER.length; nextIndex++) {\n\t\tconst candidate = REASONING_LADDER[nextIndex];\n\t\tif (supported.has(candidate) && effectiveReasoningEffort(candidate, effortMap) !== currentEffort)\n\t\t\treturn candidate;\n\t}\n\treturn current;\n}\n"]}
1
+ {"version":3,"file":"cost-guard.js","sourceRoot":"","sources":["../../src/core/cost-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAMnC;IACA,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;IAC/E,MAAM,UAAU,GAAG,WAAW,GAAG,MAAM,CAAC;IACxC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC;IACnD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3E,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;IACnD,MAAM,kBAAkB,GAAG,kBAAkB,IAAI,WAAW,GAAG,kBAAkB,CAAC,eAAe,CAAC;IAClG,MAAM,eAAe,GAAG,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,GAAG,cAAc,GAAG,MAAM,GAAG,aAAa,CAAC,GAAG,eAAe,CAAC,GAAG,SAAS,CAAC;IACxG,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC,GAAG,SAAS,CAAC;IAC9F,OAAO,QAAQ,GAAG,SAAS,CAAC;AAC7B,CAAC;AAYD,MAAM,CAAC,MAAM,2BAA2B,GAAsB;IAC7D,UAAU,EAAE,GAAG;IACf,MAAM,EAAE,MAAM;CACd,CAAC;AAeF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAChC,MAAc,EACd,QAA2B,EAC3B,uBAAuB,GAAG,CAAC;IAE3B,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,MAAM,GAAG,aAAa,CAAC;IACxC,OAAO;QACN,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG,QAAQ,CAAC,UAAU;QAC/C,MAAM;QACN,aAAa;QACb,QAAQ;QACR,YAAY,EAAE,QAAQ,CAAC,UAAU;QACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;KACvB,CAAC;AACH,CAAC;AAED,qGAAqG;AACrG,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAU,CAAC;AAIvG,SAAS,wBAAwB,CAAC,KAAqB,EAAE,SAAyC;IACjG,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAC9C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CACjC,OAAe,EACf,eAA2C,EAC3C,SAA8B;IAE9B,MAAM,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAyB,CAAC,CAAC;IAC9D,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAC1B,IAAI,CAAC,eAAe,EAAE,CAAC;QACtB,OAAO,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAiB,eAAe,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,wBAAwB,CAAC,OAAyB,EAAE,SAAS,CAAC,CAAC;IACrF,KAAK,IAAI,SAAS,GAAG,CAAC,GAAG,CAAC,EAAE,SAAS,GAAG,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;QAC9E,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,wBAAwB,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,aAAa;YAC/F,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC","sourcesContent":["/**\n * Proactive per-turn token cost guard (Hermes-parity superiority item #34).\n *\n * Hermes (and pi today) only react to context growth by compressing AFTER it's expensive. This estimates\n * the dollar cost of the NEXT LLM call BEFORE it is submitted, so the agent can warn the user or\n * automatically reduce reasoning effort before a runaway billing spike — a proactive ceiling, not a\n * reactive cleanup. Pure functions: no I/O, fully testable.\n */\n\n/** Per-million-token USD prices, as carried on `Model.cost`. */\nexport interface ModelTokenCost {\n\tinput: number;\n\toutput: number;\n\tcacheRead?: number;\n\tcacheWrite?: number;\n}\n\n/**\n * Estimate the USD cost of one turn: the whole current context is billed as input, plus up to\n * `maxOutputTokens` of output. `cachedInputTokens` (prefix-cache hits) are billed at the cheaper\n * cache-read rate. Fresh input is billed once at the higher of the uncached-input and cache-write\n * rates because a provider may select that prefix for a new cache write. This is an UPPER bound on\n * the turn (it also assumes the model emits its full output budget), which is what a spending ceiling\n * should bound against.\n */\nexport function estimateTurnCostUsd(args: {\n\tinputTokens: number;\n\tmaxOutputTokens: number;\n\tcost: ModelTokenCost;\n\tcachedInputTokens?: number;\n\tlongContextPricing?: { thresholdTokens: number; inputMultiplier: number; outputMultiplier: number };\n}): number {\n\tconst { inputTokens, maxOutputTokens, cost } = args;\n\tconst cached = Math.max(0, Math.min(args.cachedInputTokens ?? 0, inputTokens));\n\tconst freshInput = inputTokens - cached;\n\tconst cacheReadRate = cost.cacheRead ?? cost.input;\n\tconst freshInputRate = Math.max(cost.input, cost.cacheWrite ?? cost.input);\n\tconst longContextPricing = args.longContextPricing;\n\tconst useLongContextTier = longContextPricing && inputTokens > longContextPricing.thresholdTokens;\n\tconst inputMultiplier = useLongContextTier ? longContextPricing.inputMultiplier : 1;\n\tconst outputMultiplier = useLongContextTier ? longContextPricing.outputMultiplier : 1;\n\tconst inputUsd = ((freshInput * freshInputRate + cached * cacheReadRate) * inputMultiplier) / 1_000_000;\n\tconst outputUsd = (Math.max(0, maxOutputTokens) * cost.output * outputMultiplier) / 1_000_000;\n\treturn inputUsd + outputUsd;\n}\n\n/** What to do when a turn's projected cost exceeds the threshold. */\nexport type CostGuardAction = \"warn\" | \"downgrade\";\n\nexport interface CostGuardSettings {\n\t/** Per-turn projected USD threshold. `0` disables the guard entirely. */\n\tmaxTurnUsd: number;\n\t/** Over the ceiling: `warn` (surface a notice) or `downgrade` (also reduce reasoning effort). */\n\taction: CostGuardAction;\n}\n\nexport const DEFAULT_COST_GUARD_SETTINGS: CostGuardSettings = {\n\tmaxTurnUsd: 2.5,\n\taction: \"warn\",\n};\n\nexport interface CostGuardDecision {\n\t/** True when the guard is enabled AND the projected TOTAL (estUsd + backgroundUsd) exceeds the ceiling. */\n\tover: boolean;\n\t/** Projected USD cost of the next foreground call alone (unchanged meaning — what the footer's \"/turn\" label shows). */\n\testUsd: number;\n\t/** Background/spawned-lane USD spend (research/worker/reflection/fitness) folded into this decision — the caller decides the window (e.g. since the current turn began). */\n\tbackgroundUsd: number;\n\t/** `estUsd + backgroundUsd` — the value actually compared against `thresholdUsd`. */\n\ttotalUsd: number;\n\tthresholdUsd: number;\n\taction: CostGuardAction;\n}\n\n/**\n * Decide whether the projected turn cost trips the guard. Disabled (`maxTurnUsd<=0`) is never `over`.\n *\n * `cumulativeBackgroundUsd` (default 0) is spawned/background-lane spend (research, worker delegation,\n * reflection, model-fitness probes — see {@link SpawnedUsageTotals}) folded into the same ceiling as the\n * next foreground call. This function is window-agnostic — it just sums whatever the caller passes — but\n * the intended caller convention (agent-session.ts) is spend attributed to the CURRENT turn only (a\n * baseline snapshotted at the top of the turn, subtracted from the live cumulative total), not the\n * session's entire lifetime, so a turn that is cheap in the foreground but has quietly spent a lot in\n * background lanes THIS turn still trips the guard, without a prior turn's spend keeping it stuck over\n * forever (still warn-only by default).\n */\nexport function evaluateCostGuard(\n\testUsd: number,\n\tsettings: CostGuardSettings,\n\tcumulativeBackgroundUsd = 0,\n): CostGuardDecision {\n\tconst enabled = settings.maxTurnUsd > 0;\n\tconst backgroundUsd = Math.max(0, cumulativeBackgroundUsd);\n\tconst totalUsd = estUsd + backgroundUsd;\n\treturn {\n\t\tover: enabled && totalUsd > settings.maxTurnUsd,\n\t\testUsd,\n\t\tbackgroundUsd,\n\t\ttotalUsd,\n\t\tthresholdUsd: settings.maxTurnUsd,\n\t\taction: settings.action,\n\t};\n}\n\n/** Reasoning levels in descending cost order, used to pick the next-cheaper level on a downgrade. */\nconst REASONING_LADDER = [\"ultra\", \"max\", \"xhigh\", \"high\", \"medium\", \"low\", \"minimal\", \"off\"] as const;\nexport type ReasoningLevel = (typeof REASONING_LADDER)[number];\nexport type ReasoningEffortMap = Readonly<Partial<Record<ReasoningLevel, string | null>>>;\n\nfunction effectiveReasoningEffort(level: ReasoningLevel, effortMap: ReasoningEffortMap | undefined): string | null {\n\tconst mapped = effortMap?.[level];\n\treturn mapped === undefined ? level : mapped;\n}\n\n/**\n * One supported step down the reasoning ladder (cost reduction) from `current`. When\n * `supportedLevels` is provided, unsupported intermediate levels are skipped instead of relying on a\n * provider clamp that may move back upward. Returns `current` unchanged when already at the model's\n * floor or unrecognized — the guard never raises effort, only lowers it.\n */\nexport function downgradeReasoning(\n\tcurrent: string,\n\tsupportedLevels?: readonly ReasoningLevel[],\n\teffortMap?: ReasoningEffortMap,\n): ReasoningLevel | string {\n\tconst i = REASONING_LADDER.indexOf(current as ReasoningLevel);\n\tif (i < 0) return current;\n\tif (!supportedLevels) {\n\t\treturn REASONING_LADDER[Math.min(i + 1, REASONING_LADDER.length - 1)];\n\t}\n\tconst supported = new Set<ReasoningLevel>(supportedLevels);\n\tconst currentEffort = effectiveReasoningEffort(current as ReasoningLevel, effortMap);\n\tfor (let nextIndex = i + 1; nextIndex < REASONING_LADDER.length; nextIndex++) {\n\t\tconst candidate = REASONING_LADDER[nextIndex];\n\t\tif (supported.has(candidate) && effectiveReasoningEffort(candidate, effortMap) !== currentEffort)\n\t\t\treturn candidate;\n\t}\n\treturn current;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"default-tool-surface.d.ts","sourceRoot":"","sources":["../../src/core/default-tool-surface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,GAAE,MAAM,CAAC,QAA2B,GAAG,SAAS,MAAM,EAAE,CAe1G;AAED,4CAA4C;AAC5C,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAAgC,CAAC;AAExF,uFAAuF;AACvF,wBAAgB,uBAAuB,CACtC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,SAAS,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,EAAE,CAOV","sourcesContent":["/**\n * Default built-in tool request shared by every AgentSession construction path.\n *\n * RuntimeBuilder still registers additional opt-in tools, while model capability and UAC profile\n * filters may only narrow this request. Keeping the SDK and direct-runtime paths on one list avoids\n * silently losing goal/delegation/toolkit capabilities in SDK-created interactive sessions.\n *\n * `bash` is the stable agent shell contract on every platform; its finite grammar routes to\n * PowerShell on Windows. `python` is a separate bounded, uv-managed execution contract.\n */\nexport function getDefaultActiveToolNames(_platform: NodeJS.Platform = process.platform): readonly string[] {\n\treturn [\n\t\t\"read\",\n\t\t\"bash\",\n\t\t\"python\",\n\t\t\"edit\",\n\t\t\"write\",\n\t\t\"context_audit\",\n\t\t\"goal\",\n\t\t\"task_steps\",\n\t\t\"ask_question\",\n\t\t\"secret_store\",\n\t\t\"delegate\",\n\t\t\"run_toolkit_script\",\n\t];\n}\n\n/** Current-process default tool request. */\nexport const DEFAULT_ACTIVE_TOOL_NAMES: readonly string[] = getDefaultActiveToolNames();\n\n/** Map legacy/platform-specific shell names to the stable Bash-like agent contract. */\nexport function mapToolNamesForPlatform(\n\tnames: readonly string[],\n\t_platform: NodeJS.Platform = process.platform,\n): string[] {\n\tconst mapped: string[] = [];\n\tfor (const name of names) {\n\t\tconst resolved = name === \"powershell\" ? \"bash\" : name;\n\t\tif (!mapped.includes(resolved)) mapped.push(resolved);\n\t}\n\treturn mapped;\n}\n"]}
1
+ {"version":3,"file":"default-tool-surface.d.ts","sourceRoot":"","sources":["../../src/core/default-tool-surface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,GAAE,MAAM,CAAC,QAA2B,GAAG,SAAS,MAAM,EAAE,CAgB1G;AAED,4CAA4C;AAC5C,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAAgC,CAAC;AAExF,uFAAuF;AACvF,wBAAgB,uBAAuB,CACtC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,SAAS,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,EAAE,CAOV"}
@@ -21,6 +21,7 @@ export function getDefaultActiveToolNames(_platform = process.platform) {
21
21
  "ask_question",
22
22
  "secret_store",
23
23
  "delegate",
24
+ "tool_task",
24
25
  "run_toolkit_script",
25
26
  ];
26
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"default-tool-surface.js","sourceRoot":"","sources":["../../src/core/default-tool-surface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,UAAU,yBAAyB,CAAC,SAAS,GAAoB,OAAO,CAAC,QAAQ,EAAqB;IAC3G,OAAO;QACN,MAAM;QACN,MAAM;QACN,QAAQ;QACR,MAAM;QACN,OAAO;QACP,eAAe;QACf,MAAM;QACN,YAAY;QACZ,cAAc;QACd,cAAc;QACd,UAAU;QACV,oBAAoB;KACpB,CAAC;AAAA,CACF;AAED,4CAA4C;AAC5C,MAAM,CAAC,MAAM,yBAAyB,GAAsB,yBAAyB,EAAE,CAAC;AAExF,uFAAuF;AACvF,MAAM,UAAU,uBAAuB,CACtC,KAAwB,EACxB,SAAS,GAAoB,OAAO,CAAC,QAAQ,EAClC;IACX,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,MAAM,CAAC;AAAA,CACd","sourcesContent":["/**\n * Default built-in tool request shared by every AgentSession construction path.\n *\n * RuntimeBuilder still registers additional opt-in tools, while model capability and UAC profile\n * filters may only narrow this request. Keeping the SDK and direct-runtime paths on one list avoids\n * silently losing goal/delegation/toolkit capabilities in SDK-created interactive sessions.\n *\n * `bash` is the stable agent shell contract on every platform; its finite grammar routes to\n * PowerShell on Windows. `python` is a separate bounded, uv-managed execution contract.\n */\nexport function getDefaultActiveToolNames(_platform: NodeJS.Platform = process.platform): readonly string[] {\n\treturn [\n\t\t\"read\",\n\t\t\"bash\",\n\t\t\"python\",\n\t\t\"edit\",\n\t\t\"write\",\n\t\t\"context_audit\",\n\t\t\"goal\",\n\t\t\"task_steps\",\n\t\t\"ask_question\",\n\t\t\"secret_store\",\n\t\t\"delegate\",\n\t\t\"run_toolkit_script\",\n\t];\n}\n\n/** Current-process default tool request. */\nexport const DEFAULT_ACTIVE_TOOL_NAMES: readonly string[] = getDefaultActiveToolNames();\n\n/** Map legacy/platform-specific shell names to the stable Bash-like agent contract. */\nexport function mapToolNamesForPlatform(\n\tnames: readonly string[],\n\t_platform: NodeJS.Platform = process.platform,\n): string[] {\n\tconst mapped: string[] = [];\n\tfor (const name of names) {\n\t\tconst resolved = name === \"powershell\" ? \"bash\" : name;\n\t\tif (!mapped.includes(resolved)) mapped.push(resolved);\n\t}\n\treturn mapped;\n}\n"]}
1
+ {"version":3,"file":"default-tool-surface.js","sourceRoot":"","sources":["../../src/core/default-tool-surface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,UAAU,yBAAyB,CAAC,SAAS,GAAoB,OAAO,CAAC,QAAQ;IACtF,OAAO;QACN,MAAM;QACN,MAAM;QACN,QAAQ;QACR,MAAM;QACN,OAAO;QACP,eAAe;QACf,MAAM;QACN,YAAY;QACZ,cAAc;QACd,cAAc;QACd,UAAU;QACV,WAAW;QACX,oBAAoB;KACpB,CAAC;AACH,CAAC;AAED,4CAA4C;AAC5C,MAAM,CAAC,MAAM,yBAAyB,GAAsB,yBAAyB,EAAE,CAAC;AAExF,uFAAuF;AACvF,MAAM,UAAU,uBAAuB,CACtC,KAAwB,EACxB,SAAS,GAAoB,OAAO,CAAC,QAAQ;IAE7C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC","sourcesContent":["/**\n * Default built-in tool request shared by every AgentSession construction path.\n *\n * RuntimeBuilder still registers additional opt-in tools, while model capability and UAC profile\n * filters may only narrow this request. Keeping the SDK and direct-runtime paths on one list avoids\n * silently losing goal/delegation/toolkit capabilities in SDK-created interactive sessions.\n *\n * `bash` is the stable agent shell contract on every platform; its finite grammar routes to\n * PowerShell on Windows. `python` is a separate bounded, uv-managed execution contract.\n */\nexport function getDefaultActiveToolNames(_platform: NodeJS.Platform = process.platform): readonly string[] {\n\treturn [\n\t\t\"read\",\n\t\t\"bash\",\n\t\t\"python\",\n\t\t\"edit\",\n\t\t\"write\",\n\t\t\"context_audit\",\n\t\t\"goal\",\n\t\t\"task_steps\",\n\t\t\"ask_question\",\n\t\t\"secret_store\",\n\t\t\"delegate\",\n\t\t\"tool_task\",\n\t\t\"run_toolkit_script\",\n\t];\n}\n\n/** Current-process default tool request. */\nexport const DEFAULT_ACTIVE_TOOL_NAMES: readonly string[] = getDefaultActiveToolNames();\n\n/** Map legacy/platform-specific shell names to the stable Bash-like agent contract. */\nexport function mapToolNamesForPlatform(\n\tnames: readonly string[],\n\t_platform: NodeJS.Platform = process.platform,\n): string[] {\n\tconst mapped: string[] = [];\n\tfor (const name of names) {\n\t\tconst resolved = name === \"powershell\" ? \"bash\" : name;\n\t\tif (!mapped.includes(resolved)) mapped.push(resolved);\n\t}\n\treturn mapped;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/core/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,eAAO,MAAM,sBAAsB,EAAE,aAAwB,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@caupulican/pi-agent-core\";\n\nexport const DEFAULT_THINKING_LEVEL: ThinkingLevel = \"medium\";\n"]}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/core/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,eAAO,MAAM,sBAAsB,EAAE,aAAwB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"managed-lane-controller.d.ts","sourceRoot":"","sources":["../../../src/core/delegation/managed-lane-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAElH,OAAO,EAAwB,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAE7G,OAAO,KAAK,EAAuB,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAYxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAM7D,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,kBAAkB,CAc/F;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,kBAAkB,GAAG,iBAAiB,CAW1F;AAED,MAAM,WAAW,yBAAyB;IACzC,UAAU,IAAI,OAAO,CAAC;IACtB,WAAW,IAAI,MAAM,CAAC;IACtB,MAAM,IAAI,MAAM,CAAC;IACjB,iBAAiB,IAAI,cAAc,CAAC;IACpC,oBAAoB,IAAI,SAAS,GAAG,SAAS,CAAC;IAC9C,qBAAqB,IAAI,kBAAkB,GAAG,SAAS,CAAC;IACxD,uBAAuB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;IAC7E,uGAAuG;IACvG,eAAe,CAAC,CACf,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAClE,MAAM,GAAG,SAAS,CAAC;CACtB;AAED,mGAAmG;AACnG,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8D;IAC7F,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAiC;IAClE,OAAO,CAAC,QAAQ,CAAS;IAEzB,YACC,IAAI,EAAE,yBAAyB,EAC/B,SAAS,EAAE,eAAe,EAC1B,cAAc,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,KAAK,IAAI,EAC3E,IAAI,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAe,EAM1C;IAED,cAAc,IAAI,IAAI,CAwCrB;IAED,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIhD;IAED,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,UAAU,GAAG,SAAS,CAsHtD;IAED,OAAO,IAAI,IAAI,CAGd;IAED,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,mBAAmB;IAK3B,2GAA2G;IAC3G,OAAO,CAAC,2BAA2B;IASnC,OAAO,CAAC,YAAY;CAyBpB","sourcesContent":["import type { SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { Usage } from \"@caupulican/pi-ai\";\nimport type { CapabilityEnvelope, WorkerClaim, WorkerClaimStatus, WorkerRequest } from \"../autonomy/contracts.ts\";\nimport { getPrivateLaneDeniedPaths } from \"../autonomy/lane-private-paths.ts\";\nimport { isLaneTerminalStatus, type LaneRecord, type LaneTerminalStatus } from \"../autonomy/lane-tracker.ts\";\nimport { appendLaneRecordSnapshot, getLatestLaneRecordSnapshots } from \"../autonomy/session-lane-record.ts\";\nimport type { ManagedLaneDispatch, ManagedLaneEvent } from \"../extensions/types.ts\";\nimport type { GoalState } from \"../goals/goal-state.ts\";\nimport { validateProviderUsage } from \"../orchestration/attempt-usage.ts\";\nimport type { ExecutionGrant } from \"../orchestration/contracts.ts\";\nimport { registerInFlightWork } from \"../reload-blockers.ts\";\nimport { getActiveSessionBranchEntries } from \"../session-snapshot.ts\";\nimport { getLatestWorkerClaimSnapshot } from \"./session-worker-claim.ts\";\nimport {\n\tnormalizeWorkerClaimForHost,\n\tnormalizeWorkerClaimReasonCode,\n\treviewManagedLaneChangedFiles,\n} from \"./worker-claim.ts\";\nimport { compileManagedProcessExecutionGrant } from \"./worker-execution-policy.ts\";\nimport type { WorkerLifecycle } from \"./worker-lifecycle.ts\";\nimport { finalizeWorkerClaim } from \"./worker-terminal-finalizer.ts\";\n\nconst LEGACY_MANAGED_LEASE_TTL_MS = 24 * 60 * 60 * 1_000;\nconst LEGACY_MANAGED_READ_TOOLS = [\"read\", \"grep\", \"find\", \"ls\"] as const;\n\nexport function resolveManagedLaneTerminalStatus(status: string | undefined): LaneTerminalStatus {\n\tif (isLaneTerminalStatus(status)) return status;\n\tswitch (status) {\n\t\tcase \"done\":\n\t\tcase \"completed\":\n\t\t\treturn \"succeeded\";\n\t\tcase \"blocked\":\n\t\t\treturn \"failed\";\n\t\tcase \"dismissed\":\n\t\tcase \"cancelled\":\n\t\t\treturn \"canceled\";\n\t\tdefault:\n\t\t\treturn \"failed\";\n\t}\n}\n\nexport function mapManagedLaneTerminalStatus(status: LaneTerminalStatus): WorkerClaimStatus {\n\tswitch (status) {\n\t\tcase \"succeeded\":\n\t\t\treturn \"completed\";\n\t\tcase \"canceled\":\n\t\t\treturn \"cancelled\";\n\t\tcase \"failed\":\n\t\tcase \"timeout\":\n\t\tcase \"budget_exhausted\":\n\t\t\treturn \"failed\";\n\t}\n}\n\nexport interface ManagedLaneControllerDeps {\n\tisDisposed(): boolean;\n\tgetAgentDir(): string;\n\tgetCwd(): string;\n\tgetSessionManager(): SessionManager;\n\tgetGoalStateSnapshot(): GoalState | undefined;\n\tgetCapabilityEnvelope(): CapabilityEnvelope | undefined;\n\tsaveWorkerClaimSnapshot(claim: WorkerClaim, request?: WorkerRequest): string;\n\t/** Optional only for minimal host embeddings; normal AgentSession integration always supplies this. */\n\taddSpawnedUsage?(\n\t\tusage: Usage,\n\t\topts: { label?: string; sourceSessionId?: string; reportId: string },\n\t): string | undefined;\n}\n\n/** Out-of-process adapter over the same durable worker lifecycle used by in-process delegation. */\nexport class ManagedLaneController {\n\tprivate readonly deps: ManagedLaneControllerDeps;\n\tprivate readonly lifecycle: WorkerLifecycle;\n\tprivate readonly recordTerminal: (record: LaneRecord, durableNotificationId: string) => void;\n\tprivate readonly warn: (message: string) => void;\n\tprivate readonly deregisterByLane = new Map<string, () => void>();\n\tprivate hydrated = false;\n\n\tconstructor(\n\t\tdeps: ManagedLaneControllerDeps,\n\t\tlifecycle: WorkerLifecycle,\n\t\trecordTerminal: (record: LaneRecord, durableNotificationId: string) => void,\n\t\twarn: (message: string) => void = () => {},\n\t) {\n\t\tthis.deps = deps;\n\t\tthis.lifecycle = lifecycle;\n\t\tthis.recordTerminal = recordTerminal;\n\t\tthis.warn = warn;\n\t}\n\n\tensureHydrated(): void {\n\t\tif (this.hydrated) return;\n\t\tthis.hydrated = true;\n\t\tconst durableIds = new Set(this.lifecycle.getManagedRecords().map((record) => record.laneId));\n\t\tfor (const legacy of getLatestLaneRecordSnapshots(getActiveSessionBranchEntries(this.deps.getSessionManager()))) {\n\t\t\tif (\n\t\t\t\tlegacy.type !== \"tmux-worker\" ||\n\t\t\t\t(legacy.status !== \"queued\" && legacy.status !== \"running\") ||\n\t\t\t\tdurableIds.has(legacy.laneId)\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.lifecycle.prepareManaged({\n\t\t\t\tlaneId: legacy.laneId,\n\t\t\t\tdispatchSequence: 1,\n\t\t\t\tinstructions: legacy.label ?? `Resume externally managed lane ${legacy.laneId}`,\n\t\t\t\tprofileId: legacy.profileId ?? \"legacy-managed-process\",\n\t\t\t\tprovider: \"legacy\",\n\t\t\t\tauthorizationId: `legacy-session-lane:${legacy.laneId}`,\n\t\t\t\trole: \"implementer\",\n\t\t\t\triskBudget: { maxAttempts: 1, maxWallClockMs: LEGACY_MANAGED_LEASE_TTL_MS },\n\t\t\t\tleaseTtlMs: LEGACY_MANAGED_LEASE_TTL_MS,\n\t\t\t\tcompileGrant: (target) =>\n\t\t\t\t\tthis.compileGrant(target, legacy.laneId, {\n\t\t\t\t\t\tsequence: 1,\n\t\t\t\t\t\tinstructions: legacy.label ?? `Resume externally managed lane ${legacy.laneId}`,\n\t\t\t\t\t\tprofileId: legacy.profileId ?? \"legacy-managed-process\",\n\t\t\t\t\t\tprovider: \"legacy\",\n\t\t\t\t\t\tauthorizationId: `legacy-session-lane:${legacy.laneId}`,\n\t\t\t\t\t\tauthorizationKind: \"legacy-recovery\",\n\t\t\t\t\t\tallowedTools: LEGACY_MANAGED_READ_TOOLS,\n\t\t\t\t\t\twritePaths: [],\n\t\t\t\t\t\tleaseTtlMs: LEGACY_MANAGED_LEASE_TTL_MS,\n\t\t\t\t\t}),\n\t\t\t\t...(legacy.worktreeLaneKey ? { worktreeLaneKey: legacy.worktreeLaneKey } : {}),\n\t\t\t});\n\t\t}\n\t\tfor (const record of this.lifecycle.getManagedRecords()) {\n\t\t\tif (record.status === \"queued\" || record.status === \"running\") this.ensureRegistration(record.laneId);\n\t\t}\n\t}\n\n\tresolve(callerLaneId: string): string | undefined {\n\t\tthis.ensureHydrated();\n\t\tconst record = this.lifecycle.getManagedRecord(callerLaneId);\n\t\treturn record && (record.status === \"queued\" || record.status === \"running\") ? callerLaneId : undefined;\n\t}\n\n\trecord(event: ManagedLaneEvent): LaneRecord | undefined {\n\t\tif (this.deps.isDisposed()) return undefined;\n\t\tthis.ensureHydrated();\n\t\tif (event.phase === \"dispatch\") {\n\t\t\tconst goal = this.deps.getGoalStateSnapshot();\n\t\t\tconst prepared = this.lifecycle.prepareManaged({\n\t\t\t\tlaneId: event.laneId,\n\t\t\t\tdispatchSequence: event.dispatch.sequence,\n\t\t\t\tinstructions: event.dispatch.instructions,\n\t\t\t\tprofileId: event.dispatch.profileId,\n\t\t\t\tprovider: event.dispatch.provider,\n\t\t\t\tauthorizationId: event.dispatch.authorizationId,\n\t\t\t\tleaseTtlMs: event.dispatch.leaseTtlMs,\n\t\t\t\tcompileGrant: (target) => this.compileGrant(target, event.laneId, event.dispatch),\n\t\t\t\trole: \"implementer\",\n\t\t\t\triskBudget: { maxAttempts: 1, maxWallClockMs: event.dispatch.leaseTtlMs },\n\t\t\t\t...(goal && Array.isArray(goal.requirements) && (!event.goalId || goal.goalId === event.goalId)\n\t\t\t\t\t? { goal }\n\t\t\t\t\t: {}),\n\t\t\t\t...(event.goalId ? { goalId: event.goalId } : {}),\n\t\t\t\t...(event.worktreeLaneKey ? { worktreeLaneKey: event.worktreeLaneKey } : {}),\n\t\t\t});\n\t\t\tif (!prepared.created) return undefined;\n\t\t\tthis.ensureRegistration(event.laneId);\n\t\t\tappendLaneRecordSnapshot(this.deps.getSessionManager(), prepared.record);\n\t\t\treturn prepared.record;\n\t\t}\n\n\t\tconst attempt = this.lifecycle.getManagedAttempt(event.laneId);\n\t\tconst handle = this.lifecycle.getManagedHandle(event.laneId);\n\t\tif (!attempt || !handle || (attempt.status !== \"leased\" && attempt.status !== \"running\")) return undefined;\n\t\tlet usage: Usage | undefined;\n\t\ttry {\n\t\t\tusage = event.usage ? validateProviderUsage(event.usage, \"managed lane usage\") : undefined;\n\t\t} catch (error) {\n\t\t\tthis.warn(\n\t\t\t\t`Rejected terminal report for managed worker ${event.laneId}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\t\tconst resolvedStatus = resolveManagedLaneTerminalStatus(event.status);\n\t\tconst usageReportId = usage && this.deps.addSpawnedUsage ? `managed-worker:${handle.attemptId}` : undefined;\n\t\tlet claim: WorkerClaim;\n\t\ttry {\n\t\t\tclaim = normalizeWorkerClaimForHost({\n\t\t\t\trequestId: event.laneId,\n\t\t\t\tterminalAttemptId: handle.attemptId,\n\t\t\t\tstatus: mapManagedLaneTerminalStatus(resolvedStatus),\n\t\t\t\tsummary: `Managed worker lane ${event.laneId} reported terminal status \"${resolvedStatus}\".`,\n\t\t\t\tchangedFiles: event.changedFiles ?? [],\n\t\t\t\t...(usageReportId ? { usageReportId } : {}),\n\t\t\t\tcreatedAt: new Date().toISOString(),\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis.warn(\n\t\t\t\t`Rejected terminal report for managed worker ${event.laneId}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\t\tconst review = reviewManagedLaneChangedFiles({\n\t\t\tchangedFiles: claim.changedFiles,\n\t\t\tenvelope: this.deps.getCapabilityEnvelope() ?? {},\n\t\t\tcwd: this.deps.getCwd(),\n\t\t});\n\t\tclaim = normalizeWorkerClaimForHost({\n\t\t\t...claim,\n\t\t\tsummary: `${claim.summary}${\n\t\t\t\treview.reviewRequired ? ` Changed files require parent review (${review.reasonCode}).` : \"\"\n\t\t\t}`,\n\t\t\tparentReviewRequired: review.reviewRequired,\n\t\t});\n\t\tlet record: LaneRecord | undefined;\n\t\tlet finalized = false;\n\t\ttry {\n\t\t\t// Accounting must commit before the lifecycle terminal transition. A failed append leaves the\n\t\t\t// fenced attempt active so the same terminal event can retry with this stable report id.\n\t\t\tif (usage && usageReportId) {\n\t\t\t\tthis.deps.addSpawnedUsage?.(usage, { label: \"managed-worker\", reportId: usageReportId });\n\t\t\t}\n\t\t\tif (!this.hasPersistedClaimForAttempt(claim)) this.deps.saveWorkerClaimSnapshot(claim);\n\t\t\tconst terminal = finalizeWorkerClaim(this.lifecycle, {\n\t\t\t\thandle,\n\t\t\t\tclaim,\n\t\t\t\taccepted: resolvedStatus === \"succeeded\" && !review.reviewRequired,\n\t\t\t\tcostUsd: usage?.cost.total,\n\t\t\t\tcwd: this.deps.getCwd(),\n\t\t\t\t...(usage\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tinputTokens: usage.input,\n\t\t\t\t\t\t\toutputTokens: usage.output,\n\t\t\t\t\t\t\ttotalTokens: usage.totalTokens,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t\twallClockMs: Math.max(0, Date.now() - Date.parse(attempt.createdAt)),\n\t\t\t\ttoolCalls: 0,\n\t\t\t\treasonCode: normalizeWorkerClaimReasonCode(\n\t\t\t\t\treview.reviewRequired ? `parent_review_required:${review.reasonCode}` : event.reasonCode,\n\t\t\t\t\t`managed_worker_${resolvedStatus}`,\n\t\t\t\t),\n\t\t\t});\n\t\t\trecord = terminal.record;\n\t\t\tfinalized = true;\n\t\t\tif (terminal.notification) this.recordTerminal(record, terminal.notification.notificationId);\n\t\t\tappendLaneRecordSnapshot(this.deps.getSessionManager(), record);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tif (finalized) {\n\t\t\t\tthis.warn(\n\t\t\t\t\t`Managed worker ${event.laneId} finalized, but terminal projection or handoff failed: ${message}`,\n\t\t\t\t);\n\t\t\t\treturn record;\n\t\t\t}\n\t\t\tthis.warn(`Managed worker ${event.laneId} terminal processing failed and remains retryable: ${message}`);\n\t\t\treturn undefined;\n\t\t} finally {\n\t\t\tif (finalized) this.releaseRegistration(event.laneId);\n\t\t}\n\t\treturn record;\n\t}\n\n\trelease(): void {\n\t\tfor (const deregister of this.deregisterByLane.values()) deregister();\n\t\tthis.deregisterByLane.clear();\n\t}\n\n\tprivate ensureRegistration(laneId: string): void {\n\t\tif (this.deregisterByLane.has(laneId)) return;\n\t\tthis.deregisterByLane.set(laneId, registerInFlightWork(this.deps.getAgentDir(), \"lane\", `tmux:${laneId}`));\n\t}\n\n\tprivate releaseRegistration(laneId: string): void {\n\t\tthis.deregisterByLane.get(laneId)?.();\n\t\tthis.deregisterByLane.delete(laneId);\n\t}\n\n\t/** A replay after a crash between claim append and lifecycle finalization must not duplicate the claim. */\n\tprivate hasPersistedClaimForAttempt(claim: WorkerClaim): boolean {\n\t\tif (!claim.terminalAttemptId) return false;\n\t\tconst latest = getLatestWorkerClaimSnapshot(\n\t\t\tgetActiveSessionBranchEntries(this.deps.getSessionManager()),\n\t\t\tclaim.requestId,\n\t\t);\n\t\treturn latest?.claim.terminalAttemptId === claim.terminalAttemptId;\n\t}\n\n\tprivate compileGrant(\n\t\ttarget: { objectiveId: string; taskId: string; attemptId: string },\n\t\tlaneId: string,\n\t\tdispatch: ManagedLaneDispatch,\n\t): ExecutionGrant {\n\t\tconst compiled = compileManagedProcessExecutionGrant({\n\t\t\ttarget,\n\t\t\tlaneId,\n\t\t\tauthorizationId: dispatch.authorizationId,\n\t\t\trole: \"implementer\",\n\t\t\tallowedTools: dispatch.allowedTools,\n\t\t\twritePaths: dispatch.writePaths,\n\t\t\tcwd: this.deps.getCwd(),\n\t\t\tdeniedPaths: getPrivateLaneDeniedPaths(this.deps.getCwd(), this.deps.getAgentDir()),\n\t\t\tbudget: {\n\t\t\t\tmaxAttempts: 1,\n\t\t\t\tmaxWallClockMs: dispatch.leaseTtlMs,\n\t\t\t\t...(dispatch.maxCostUsd !== undefined ? { maxCostUsd: dispatch.maxCostUsd } : {}),\n\t\t\t},\n\t\t});\n\t\tif (!compiled.ok) {\n\t\t\tthrow new Error(`Managed worker '${laneId}' execution grant was denied: ${compiled.reasonCodes.join(\", \")}`);\n\t\t}\n\t\treturn compiled.grant;\n\t}\n}\n"]}
1
+ {"version":3,"file":"managed-lane-controller.d.ts","sourceRoot":"","sources":["../../../src/core/delegation/managed-lane-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAElH,OAAO,EAAwB,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAE7G,OAAO,KAAK,EAAuB,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAYxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAM7D,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,kBAAkB,CAc/F;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,kBAAkB,GAAG,iBAAiB,CAW1F;AAED,MAAM,WAAW,yBAAyB;IACzC,UAAU,IAAI,OAAO,CAAC;IACtB,WAAW,IAAI,MAAM,CAAC;IACtB,MAAM,IAAI,MAAM,CAAC;IACjB,iBAAiB,IAAI,cAAc,CAAC;IACpC,oBAAoB,IAAI,SAAS,GAAG,SAAS,CAAC;IAC9C,qBAAqB,IAAI,kBAAkB,GAAG,SAAS,CAAC;IACxD,uBAAuB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;IAC7E,uGAAuG;IACvG,eAAe,CAAC,CACf,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAClE,MAAM,GAAG,SAAS,CAAC;CACtB;AAED,mGAAmG;AACnG,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8D;IAC7F,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAiC;IAClE,OAAO,CAAC,QAAQ,CAAS;IAEzB,YACC,IAAI,EAAE,yBAAyB,EAC/B,SAAS,EAAE,eAAe,EAC1B,cAAc,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,KAAK,IAAI,EAC3E,IAAI,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAe,EAM1C;IAED,cAAc,IAAI,IAAI,CAwCrB;IAED,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIhD;IAED,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,UAAU,GAAG,SAAS,CAsHtD;IAED,OAAO,IAAI,IAAI,CAGd;IAED,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,mBAAmB;IAK3B,2GAA2G;IAC3G,OAAO,CAAC,2BAA2B;IASnC,OAAO,CAAC,YAAY;CAyBpB"}
@@ -40,13 +40,9 @@ export function mapManagedLaneTerminalStatus(status) {
40
40
  }
41
41
  /** Out-of-process adapter over the same durable worker lifecycle used by in-process delegation. */
42
42
  export class ManagedLaneController {
43
- deps;
44
- lifecycle;
45
- recordTerminal;
46
- warn;
47
- deregisterByLane = new Map();
48
- hydrated = false;
49
43
  constructor(deps, lifecycle, recordTerminal, warn = () => { }) {
44
+ this.deregisterByLane = new Map();
45
+ this.hydrated = false;
50
46
  this.deps = deps;
51
47
  this.lifecycle = lifecycle;
52
48
  this.recordTerminal = recordTerminal;
@@ -1 +1 @@
1
- {"version":3,"file":"managed-lane-controller.js","sourceRoot":"","sources":["../../../src/core/delegation/managed-lane-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { Usage } from \"@caupulican/pi-ai\";\nimport type { CapabilityEnvelope, WorkerClaim, WorkerClaimStatus, WorkerRequest } from \"../autonomy/contracts.ts\";\nimport { getPrivateLaneDeniedPaths } from \"../autonomy/lane-private-paths.ts\";\nimport { isLaneTerminalStatus, type LaneRecord, type LaneTerminalStatus } from \"../autonomy/lane-tracker.ts\";\nimport { appendLaneRecordSnapshot, getLatestLaneRecordSnapshots } from \"../autonomy/session-lane-record.ts\";\nimport type { ManagedLaneDispatch, ManagedLaneEvent } from \"../extensions/types.ts\";\nimport type { GoalState } from \"../goals/goal-state.ts\";\nimport { validateProviderUsage } from \"../orchestration/attempt-usage.ts\";\nimport type { ExecutionGrant } from \"../orchestration/contracts.ts\";\nimport { registerInFlightWork } from \"../reload-blockers.ts\";\nimport { getActiveSessionBranchEntries } from \"../session-snapshot.ts\";\nimport { getLatestWorkerClaimSnapshot } from \"./session-worker-claim.ts\";\nimport {\n\tnormalizeWorkerClaimForHost,\n\tnormalizeWorkerClaimReasonCode,\n\treviewManagedLaneChangedFiles,\n} from \"./worker-claim.ts\";\nimport { compileManagedProcessExecutionGrant } from \"./worker-execution-policy.ts\";\nimport type { WorkerLifecycle } from \"./worker-lifecycle.ts\";\nimport { finalizeWorkerClaim } from \"./worker-terminal-finalizer.ts\";\n\nconst LEGACY_MANAGED_LEASE_TTL_MS = 24 * 60 * 60 * 1_000;\nconst LEGACY_MANAGED_READ_TOOLS = [\"read\", \"grep\", \"find\", \"ls\"] as const;\n\nexport function resolveManagedLaneTerminalStatus(status: string | undefined): LaneTerminalStatus {\n\tif (isLaneTerminalStatus(status)) return status;\n\tswitch (status) {\n\t\tcase \"done\":\n\t\tcase \"completed\":\n\t\t\treturn \"succeeded\";\n\t\tcase \"blocked\":\n\t\t\treturn \"failed\";\n\t\tcase \"dismissed\":\n\t\tcase \"cancelled\":\n\t\t\treturn \"canceled\";\n\t\tdefault:\n\t\t\treturn \"failed\";\n\t}\n}\n\nexport function mapManagedLaneTerminalStatus(status: LaneTerminalStatus): WorkerClaimStatus {\n\tswitch (status) {\n\t\tcase \"succeeded\":\n\t\t\treturn \"completed\";\n\t\tcase \"canceled\":\n\t\t\treturn \"cancelled\";\n\t\tcase \"failed\":\n\t\tcase \"timeout\":\n\t\tcase \"budget_exhausted\":\n\t\t\treturn \"failed\";\n\t}\n}\n\nexport interface ManagedLaneControllerDeps {\n\tisDisposed(): boolean;\n\tgetAgentDir(): string;\n\tgetCwd(): string;\n\tgetSessionManager(): SessionManager;\n\tgetGoalStateSnapshot(): GoalState | undefined;\n\tgetCapabilityEnvelope(): CapabilityEnvelope | undefined;\n\tsaveWorkerClaimSnapshot(claim: WorkerClaim, request?: WorkerRequest): string;\n\t/** Optional only for minimal host embeddings; normal AgentSession integration always supplies this. */\n\taddSpawnedUsage?(\n\t\tusage: Usage,\n\t\topts: { label?: string; sourceSessionId?: string; reportId: string },\n\t): string | undefined;\n}\n\n/** Out-of-process adapter over the same durable worker lifecycle used by in-process delegation. */\nexport class ManagedLaneController {\n\tprivate readonly deps: ManagedLaneControllerDeps;\n\tprivate readonly lifecycle: WorkerLifecycle;\n\tprivate readonly recordTerminal: (record: LaneRecord, durableNotificationId: string) => void;\n\tprivate readonly warn: (message: string) => void;\n\tprivate readonly deregisterByLane = new Map<string, () => void>();\n\tprivate hydrated = false;\n\n\tconstructor(\n\t\tdeps: ManagedLaneControllerDeps,\n\t\tlifecycle: WorkerLifecycle,\n\t\trecordTerminal: (record: LaneRecord, durableNotificationId: string) => void,\n\t\twarn: (message: string) => void = () => {},\n\t) {\n\t\tthis.deps = deps;\n\t\tthis.lifecycle = lifecycle;\n\t\tthis.recordTerminal = recordTerminal;\n\t\tthis.warn = warn;\n\t}\n\n\tensureHydrated(): void {\n\t\tif (this.hydrated) return;\n\t\tthis.hydrated = true;\n\t\tconst durableIds = new Set(this.lifecycle.getManagedRecords().map((record) => record.laneId));\n\t\tfor (const legacy of getLatestLaneRecordSnapshots(getActiveSessionBranchEntries(this.deps.getSessionManager()))) {\n\t\t\tif (\n\t\t\t\tlegacy.type !== \"tmux-worker\" ||\n\t\t\t\t(legacy.status !== \"queued\" && legacy.status !== \"running\") ||\n\t\t\t\tdurableIds.has(legacy.laneId)\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.lifecycle.prepareManaged({\n\t\t\t\tlaneId: legacy.laneId,\n\t\t\t\tdispatchSequence: 1,\n\t\t\t\tinstructions: legacy.label ?? `Resume externally managed lane ${legacy.laneId}`,\n\t\t\t\tprofileId: legacy.profileId ?? \"legacy-managed-process\",\n\t\t\t\tprovider: \"legacy\",\n\t\t\t\tauthorizationId: `legacy-session-lane:${legacy.laneId}`,\n\t\t\t\trole: \"implementer\",\n\t\t\t\triskBudget: { maxAttempts: 1, maxWallClockMs: LEGACY_MANAGED_LEASE_TTL_MS },\n\t\t\t\tleaseTtlMs: LEGACY_MANAGED_LEASE_TTL_MS,\n\t\t\t\tcompileGrant: (target) =>\n\t\t\t\t\tthis.compileGrant(target, legacy.laneId, {\n\t\t\t\t\t\tsequence: 1,\n\t\t\t\t\t\tinstructions: legacy.label ?? `Resume externally managed lane ${legacy.laneId}`,\n\t\t\t\t\t\tprofileId: legacy.profileId ?? \"legacy-managed-process\",\n\t\t\t\t\t\tprovider: \"legacy\",\n\t\t\t\t\t\tauthorizationId: `legacy-session-lane:${legacy.laneId}`,\n\t\t\t\t\t\tauthorizationKind: \"legacy-recovery\",\n\t\t\t\t\t\tallowedTools: LEGACY_MANAGED_READ_TOOLS,\n\t\t\t\t\t\twritePaths: [],\n\t\t\t\t\t\tleaseTtlMs: LEGACY_MANAGED_LEASE_TTL_MS,\n\t\t\t\t\t}),\n\t\t\t\t...(legacy.worktreeLaneKey ? { worktreeLaneKey: legacy.worktreeLaneKey } : {}),\n\t\t\t});\n\t\t}\n\t\tfor (const record of this.lifecycle.getManagedRecords()) {\n\t\t\tif (record.status === \"queued\" || record.status === \"running\") this.ensureRegistration(record.laneId);\n\t\t}\n\t}\n\n\tresolve(callerLaneId: string): string | undefined {\n\t\tthis.ensureHydrated();\n\t\tconst record = this.lifecycle.getManagedRecord(callerLaneId);\n\t\treturn record && (record.status === \"queued\" || record.status === \"running\") ? callerLaneId : undefined;\n\t}\n\n\trecord(event: ManagedLaneEvent): LaneRecord | undefined {\n\t\tif (this.deps.isDisposed()) return undefined;\n\t\tthis.ensureHydrated();\n\t\tif (event.phase === \"dispatch\") {\n\t\t\tconst goal = this.deps.getGoalStateSnapshot();\n\t\t\tconst prepared = this.lifecycle.prepareManaged({\n\t\t\t\tlaneId: event.laneId,\n\t\t\t\tdispatchSequence: event.dispatch.sequence,\n\t\t\t\tinstructions: event.dispatch.instructions,\n\t\t\t\tprofileId: event.dispatch.profileId,\n\t\t\t\tprovider: event.dispatch.provider,\n\t\t\t\tauthorizationId: event.dispatch.authorizationId,\n\t\t\t\tleaseTtlMs: event.dispatch.leaseTtlMs,\n\t\t\t\tcompileGrant: (target) => this.compileGrant(target, event.laneId, event.dispatch),\n\t\t\t\trole: \"implementer\",\n\t\t\t\triskBudget: { maxAttempts: 1, maxWallClockMs: event.dispatch.leaseTtlMs },\n\t\t\t\t...(goal && Array.isArray(goal.requirements) && (!event.goalId || goal.goalId === event.goalId)\n\t\t\t\t\t? { goal }\n\t\t\t\t\t: {}),\n\t\t\t\t...(event.goalId ? { goalId: event.goalId } : {}),\n\t\t\t\t...(event.worktreeLaneKey ? { worktreeLaneKey: event.worktreeLaneKey } : {}),\n\t\t\t});\n\t\t\tif (!prepared.created) return undefined;\n\t\t\tthis.ensureRegistration(event.laneId);\n\t\t\tappendLaneRecordSnapshot(this.deps.getSessionManager(), prepared.record);\n\t\t\treturn prepared.record;\n\t\t}\n\n\t\tconst attempt = this.lifecycle.getManagedAttempt(event.laneId);\n\t\tconst handle = this.lifecycle.getManagedHandle(event.laneId);\n\t\tif (!attempt || !handle || (attempt.status !== \"leased\" && attempt.status !== \"running\")) return undefined;\n\t\tlet usage: Usage | undefined;\n\t\ttry {\n\t\t\tusage = event.usage ? validateProviderUsage(event.usage, \"managed lane usage\") : undefined;\n\t\t} catch (error) {\n\t\t\tthis.warn(\n\t\t\t\t`Rejected terminal report for managed worker ${event.laneId}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\t\tconst resolvedStatus = resolveManagedLaneTerminalStatus(event.status);\n\t\tconst usageReportId = usage && this.deps.addSpawnedUsage ? `managed-worker:${handle.attemptId}` : undefined;\n\t\tlet claim: WorkerClaim;\n\t\ttry {\n\t\t\tclaim = normalizeWorkerClaimForHost({\n\t\t\t\trequestId: event.laneId,\n\t\t\t\tterminalAttemptId: handle.attemptId,\n\t\t\t\tstatus: mapManagedLaneTerminalStatus(resolvedStatus),\n\t\t\t\tsummary: `Managed worker lane ${event.laneId} reported terminal status \"${resolvedStatus}\".`,\n\t\t\t\tchangedFiles: event.changedFiles ?? [],\n\t\t\t\t...(usageReportId ? { usageReportId } : {}),\n\t\t\t\tcreatedAt: new Date().toISOString(),\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis.warn(\n\t\t\t\t`Rejected terminal report for managed worker ${event.laneId}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\t\tconst review = reviewManagedLaneChangedFiles({\n\t\t\tchangedFiles: claim.changedFiles,\n\t\t\tenvelope: this.deps.getCapabilityEnvelope() ?? {},\n\t\t\tcwd: this.deps.getCwd(),\n\t\t});\n\t\tclaim = normalizeWorkerClaimForHost({\n\t\t\t...claim,\n\t\t\tsummary: `${claim.summary}${\n\t\t\t\treview.reviewRequired ? ` Changed files require parent review (${review.reasonCode}).` : \"\"\n\t\t\t}`,\n\t\t\tparentReviewRequired: review.reviewRequired,\n\t\t});\n\t\tlet record: LaneRecord | undefined;\n\t\tlet finalized = false;\n\t\ttry {\n\t\t\t// Accounting must commit before the lifecycle terminal transition. A failed append leaves the\n\t\t\t// fenced attempt active so the same terminal event can retry with this stable report id.\n\t\t\tif (usage && usageReportId) {\n\t\t\t\tthis.deps.addSpawnedUsage?.(usage, { label: \"managed-worker\", reportId: usageReportId });\n\t\t\t}\n\t\t\tif (!this.hasPersistedClaimForAttempt(claim)) this.deps.saveWorkerClaimSnapshot(claim);\n\t\t\tconst terminal = finalizeWorkerClaim(this.lifecycle, {\n\t\t\t\thandle,\n\t\t\t\tclaim,\n\t\t\t\taccepted: resolvedStatus === \"succeeded\" && !review.reviewRequired,\n\t\t\t\tcostUsd: usage?.cost.total,\n\t\t\t\tcwd: this.deps.getCwd(),\n\t\t\t\t...(usage\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tinputTokens: usage.input,\n\t\t\t\t\t\t\toutputTokens: usage.output,\n\t\t\t\t\t\t\ttotalTokens: usage.totalTokens,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t\twallClockMs: Math.max(0, Date.now() - Date.parse(attempt.createdAt)),\n\t\t\t\ttoolCalls: 0,\n\t\t\t\treasonCode: normalizeWorkerClaimReasonCode(\n\t\t\t\t\treview.reviewRequired ? `parent_review_required:${review.reasonCode}` : event.reasonCode,\n\t\t\t\t\t`managed_worker_${resolvedStatus}`,\n\t\t\t\t),\n\t\t\t});\n\t\t\trecord = terminal.record;\n\t\t\tfinalized = true;\n\t\t\tif (terminal.notification) this.recordTerminal(record, terminal.notification.notificationId);\n\t\t\tappendLaneRecordSnapshot(this.deps.getSessionManager(), record);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tif (finalized) {\n\t\t\t\tthis.warn(\n\t\t\t\t\t`Managed worker ${event.laneId} finalized, but terminal projection or handoff failed: ${message}`,\n\t\t\t\t);\n\t\t\t\treturn record;\n\t\t\t}\n\t\t\tthis.warn(`Managed worker ${event.laneId} terminal processing failed and remains retryable: ${message}`);\n\t\t\treturn undefined;\n\t\t} finally {\n\t\t\tif (finalized) this.releaseRegistration(event.laneId);\n\t\t}\n\t\treturn record;\n\t}\n\n\trelease(): void {\n\t\tfor (const deregister of this.deregisterByLane.values()) deregister();\n\t\tthis.deregisterByLane.clear();\n\t}\n\n\tprivate ensureRegistration(laneId: string): void {\n\t\tif (this.deregisterByLane.has(laneId)) return;\n\t\tthis.deregisterByLane.set(laneId, registerInFlightWork(this.deps.getAgentDir(), \"lane\", `tmux:${laneId}`));\n\t}\n\n\tprivate releaseRegistration(laneId: string): void {\n\t\tthis.deregisterByLane.get(laneId)?.();\n\t\tthis.deregisterByLane.delete(laneId);\n\t}\n\n\t/** A replay after a crash between claim append and lifecycle finalization must not duplicate the claim. */\n\tprivate hasPersistedClaimForAttempt(claim: WorkerClaim): boolean {\n\t\tif (!claim.terminalAttemptId) return false;\n\t\tconst latest = getLatestWorkerClaimSnapshot(\n\t\t\tgetActiveSessionBranchEntries(this.deps.getSessionManager()),\n\t\t\tclaim.requestId,\n\t\t);\n\t\treturn latest?.claim.terminalAttemptId === claim.terminalAttemptId;\n\t}\n\n\tprivate compileGrant(\n\t\ttarget: { objectiveId: string; taskId: string; attemptId: string },\n\t\tlaneId: string,\n\t\tdispatch: ManagedLaneDispatch,\n\t): ExecutionGrant {\n\t\tconst compiled = compileManagedProcessExecutionGrant({\n\t\t\ttarget,\n\t\t\tlaneId,\n\t\t\tauthorizationId: dispatch.authorizationId,\n\t\t\trole: \"implementer\",\n\t\t\tallowedTools: dispatch.allowedTools,\n\t\t\twritePaths: dispatch.writePaths,\n\t\t\tcwd: this.deps.getCwd(),\n\t\t\tdeniedPaths: getPrivateLaneDeniedPaths(this.deps.getCwd(), this.deps.getAgentDir()),\n\t\t\tbudget: {\n\t\t\t\tmaxAttempts: 1,\n\t\t\t\tmaxWallClockMs: dispatch.leaseTtlMs,\n\t\t\t\t...(dispatch.maxCostUsd !== undefined ? { maxCostUsd: dispatch.maxCostUsd } : {}),\n\t\t\t},\n\t\t});\n\t\tif (!compiled.ok) {\n\t\t\tthrow new Error(`Managed worker '${laneId}' execution grant was denied: ${compiled.reasonCodes.join(\", \")}`);\n\t\t}\n\t\treturn compiled.grant;\n\t}\n}\n"]}
1
+ {"version":3,"file":"managed-lane-controller.js","sourceRoot":"","sources":["../../../src/core/delegation/managed-lane-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { Usage } from \"@caupulican/pi-ai\";\nimport type { CapabilityEnvelope, WorkerClaim, WorkerClaimStatus, WorkerRequest } from \"../autonomy/contracts.ts\";\nimport { getPrivateLaneDeniedPaths } from \"../autonomy/lane-private-paths.ts\";\nimport { isLaneTerminalStatus, type LaneRecord, type LaneTerminalStatus } from \"../autonomy/lane-tracker.ts\";\nimport { appendLaneRecordSnapshot, getLatestLaneRecordSnapshots } from \"../autonomy/session-lane-record.ts\";\nimport type { ManagedLaneDispatch, ManagedLaneEvent } from \"../extensions/types.ts\";\nimport type { GoalState } from \"../goals/goal-state.ts\";\nimport { validateProviderUsage } from \"../orchestration/attempt-usage.ts\";\nimport type { ExecutionGrant } from \"../orchestration/contracts.ts\";\nimport { registerInFlightWork } from \"../reload-blockers.ts\";\nimport { getActiveSessionBranchEntries } from \"../session-snapshot.ts\";\nimport { getLatestWorkerClaimSnapshot } from \"./session-worker-claim.ts\";\nimport {\n\tnormalizeWorkerClaimForHost,\n\tnormalizeWorkerClaimReasonCode,\n\treviewManagedLaneChangedFiles,\n} from \"./worker-claim.ts\";\nimport { compileManagedProcessExecutionGrant } from \"./worker-execution-policy.ts\";\nimport type { WorkerLifecycle } from \"./worker-lifecycle.ts\";\nimport { finalizeWorkerClaim } from \"./worker-terminal-finalizer.ts\";\n\nconst LEGACY_MANAGED_LEASE_TTL_MS = 24 * 60 * 60 * 1_000;\nconst LEGACY_MANAGED_READ_TOOLS = [\"read\", \"grep\", \"find\", \"ls\"] as const;\n\nexport function resolveManagedLaneTerminalStatus(status: string | undefined): LaneTerminalStatus {\n\tif (isLaneTerminalStatus(status)) return status;\n\tswitch (status) {\n\t\tcase \"done\":\n\t\tcase \"completed\":\n\t\t\treturn \"succeeded\";\n\t\tcase \"blocked\":\n\t\t\treturn \"failed\";\n\t\tcase \"dismissed\":\n\t\tcase \"cancelled\":\n\t\t\treturn \"canceled\";\n\t\tdefault:\n\t\t\treturn \"failed\";\n\t}\n}\n\nexport function mapManagedLaneTerminalStatus(status: LaneTerminalStatus): WorkerClaimStatus {\n\tswitch (status) {\n\t\tcase \"succeeded\":\n\t\t\treturn \"completed\";\n\t\tcase \"canceled\":\n\t\t\treturn \"cancelled\";\n\t\tcase \"failed\":\n\t\tcase \"timeout\":\n\t\tcase \"budget_exhausted\":\n\t\t\treturn \"failed\";\n\t}\n}\n\nexport interface ManagedLaneControllerDeps {\n\tisDisposed(): boolean;\n\tgetAgentDir(): string;\n\tgetCwd(): string;\n\tgetSessionManager(): SessionManager;\n\tgetGoalStateSnapshot(): GoalState | undefined;\n\tgetCapabilityEnvelope(): CapabilityEnvelope | undefined;\n\tsaveWorkerClaimSnapshot(claim: WorkerClaim, request?: WorkerRequest): string;\n\t/** Optional only for minimal host embeddings; normal AgentSession integration always supplies this. */\n\taddSpawnedUsage?(\n\t\tusage: Usage,\n\t\topts: { label?: string; sourceSessionId?: string; reportId: string },\n\t): string | undefined;\n}\n\n/** Out-of-process adapter over the same durable worker lifecycle used by in-process delegation. */\nexport class ManagedLaneController {\n\tprivate readonly deps: ManagedLaneControllerDeps;\n\tprivate readonly lifecycle: WorkerLifecycle;\n\tprivate readonly recordTerminal: (record: LaneRecord, durableNotificationId: string) => void;\n\tprivate readonly warn: (message: string) => void;\n\tprivate readonly deregisterByLane = new Map<string, () => void>();\n\tprivate hydrated = false;\n\n\tconstructor(\n\t\tdeps: ManagedLaneControllerDeps,\n\t\tlifecycle: WorkerLifecycle,\n\t\trecordTerminal: (record: LaneRecord, durableNotificationId: string) => void,\n\t\twarn: (message: string) => void = () => {},\n\t) {\n\t\tthis.deps = deps;\n\t\tthis.lifecycle = lifecycle;\n\t\tthis.recordTerminal = recordTerminal;\n\t\tthis.warn = warn;\n\t}\n\n\tensureHydrated(): void {\n\t\tif (this.hydrated) return;\n\t\tthis.hydrated = true;\n\t\tconst durableIds = new Set(this.lifecycle.getManagedRecords().map((record) => record.laneId));\n\t\tfor (const legacy of getLatestLaneRecordSnapshots(getActiveSessionBranchEntries(this.deps.getSessionManager()))) {\n\t\t\tif (\n\t\t\t\tlegacy.type !== \"tmux-worker\" ||\n\t\t\t\t(legacy.status !== \"queued\" && legacy.status !== \"running\") ||\n\t\t\t\tdurableIds.has(legacy.laneId)\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.lifecycle.prepareManaged({\n\t\t\t\tlaneId: legacy.laneId,\n\t\t\t\tdispatchSequence: 1,\n\t\t\t\tinstructions: legacy.label ?? `Resume externally managed lane ${legacy.laneId}`,\n\t\t\t\tprofileId: legacy.profileId ?? \"legacy-managed-process\",\n\t\t\t\tprovider: \"legacy\",\n\t\t\t\tauthorizationId: `legacy-session-lane:${legacy.laneId}`,\n\t\t\t\trole: \"implementer\",\n\t\t\t\triskBudget: { maxAttempts: 1, maxWallClockMs: LEGACY_MANAGED_LEASE_TTL_MS },\n\t\t\t\tleaseTtlMs: LEGACY_MANAGED_LEASE_TTL_MS,\n\t\t\t\tcompileGrant: (target) =>\n\t\t\t\t\tthis.compileGrant(target, legacy.laneId, {\n\t\t\t\t\t\tsequence: 1,\n\t\t\t\t\t\tinstructions: legacy.label ?? `Resume externally managed lane ${legacy.laneId}`,\n\t\t\t\t\t\tprofileId: legacy.profileId ?? \"legacy-managed-process\",\n\t\t\t\t\t\tprovider: \"legacy\",\n\t\t\t\t\t\tauthorizationId: `legacy-session-lane:${legacy.laneId}`,\n\t\t\t\t\t\tauthorizationKind: \"legacy-recovery\",\n\t\t\t\t\t\tallowedTools: LEGACY_MANAGED_READ_TOOLS,\n\t\t\t\t\t\twritePaths: [],\n\t\t\t\t\t\tleaseTtlMs: LEGACY_MANAGED_LEASE_TTL_MS,\n\t\t\t\t\t}),\n\t\t\t\t...(legacy.worktreeLaneKey ? { worktreeLaneKey: legacy.worktreeLaneKey } : {}),\n\t\t\t});\n\t\t}\n\t\tfor (const record of this.lifecycle.getManagedRecords()) {\n\t\t\tif (record.status === \"queued\" || record.status === \"running\") this.ensureRegistration(record.laneId);\n\t\t}\n\t}\n\n\tresolve(callerLaneId: string): string | undefined {\n\t\tthis.ensureHydrated();\n\t\tconst record = this.lifecycle.getManagedRecord(callerLaneId);\n\t\treturn record && (record.status === \"queued\" || record.status === \"running\") ? callerLaneId : undefined;\n\t}\n\n\trecord(event: ManagedLaneEvent): LaneRecord | undefined {\n\t\tif (this.deps.isDisposed()) return undefined;\n\t\tthis.ensureHydrated();\n\t\tif (event.phase === \"dispatch\") {\n\t\t\tconst goal = this.deps.getGoalStateSnapshot();\n\t\t\tconst prepared = this.lifecycle.prepareManaged({\n\t\t\t\tlaneId: event.laneId,\n\t\t\t\tdispatchSequence: event.dispatch.sequence,\n\t\t\t\tinstructions: event.dispatch.instructions,\n\t\t\t\tprofileId: event.dispatch.profileId,\n\t\t\t\tprovider: event.dispatch.provider,\n\t\t\t\tauthorizationId: event.dispatch.authorizationId,\n\t\t\t\tleaseTtlMs: event.dispatch.leaseTtlMs,\n\t\t\t\tcompileGrant: (target) => this.compileGrant(target, event.laneId, event.dispatch),\n\t\t\t\trole: \"implementer\",\n\t\t\t\triskBudget: { maxAttempts: 1, maxWallClockMs: event.dispatch.leaseTtlMs },\n\t\t\t\t...(goal && Array.isArray(goal.requirements) && (!event.goalId || goal.goalId === event.goalId)\n\t\t\t\t\t? { goal }\n\t\t\t\t\t: {}),\n\t\t\t\t...(event.goalId ? { goalId: event.goalId } : {}),\n\t\t\t\t...(event.worktreeLaneKey ? { worktreeLaneKey: event.worktreeLaneKey } : {}),\n\t\t\t});\n\t\t\tif (!prepared.created) return undefined;\n\t\t\tthis.ensureRegistration(event.laneId);\n\t\t\tappendLaneRecordSnapshot(this.deps.getSessionManager(), prepared.record);\n\t\t\treturn prepared.record;\n\t\t}\n\n\t\tconst attempt = this.lifecycle.getManagedAttempt(event.laneId);\n\t\tconst handle = this.lifecycle.getManagedHandle(event.laneId);\n\t\tif (!attempt || !handle || (attempt.status !== \"leased\" && attempt.status !== \"running\")) return undefined;\n\t\tlet usage: Usage | undefined;\n\t\ttry {\n\t\t\tusage = event.usage ? validateProviderUsage(event.usage, \"managed lane usage\") : undefined;\n\t\t} catch (error) {\n\t\t\tthis.warn(\n\t\t\t\t`Rejected terminal report for managed worker ${event.laneId}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\t\tconst resolvedStatus = resolveManagedLaneTerminalStatus(event.status);\n\t\tconst usageReportId = usage && this.deps.addSpawnedUsage ? `managed-worker:${handle.attemptId}` : undefined;\n\t\tlet claim: WorkerClaim;\n\t\ttry {\n\t\t\tclaim = normalizeWorkerClaimForHost({\n\t\t\t\trequestId: event.laneId,\n\t\t\t\tterminalAttemptId: handle.attemptId,\n\t\t\t\tstatus: mapManagedLaneTerminalStatus(resolvedStatus),\n\t\t\t\tsummary: `Managed worker lane ${event.laneId} reported terminal status \"${resolvedStatus}\".`,\n\t\t\t\tchangedFiles: event.changedFiles ?? [],\n\t\t\t\t...(usageReportId ? { usageReportId } : {}),\n\t\t\t\tcreatedAt: new Date().toISOString(),\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis.warn(\n\t\t\t\t`Rejected terminal report for managed worker ${event.laneId}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\t\tconst review = reviewManagedLaneChangedFiles({\n\t\t\tchangedFiles: claim.changedFiles,\n\t\t\tenvelope: this.deps.getCapabilityEnvelope() ?? {},\n\t\t\tcwd: this.deps.getCwd(),\n\t\t});\n\t\tclaim = normalizeWorkerClaimForHost({\n\t\t\t...claim,\n\t\t\tsummary: `${claim.summary}${\n\t\t\t\treview.reviewRequired ? ` Changed files require parent review (${review.reasonCode}).` : \"\"\n\t\t\t}`,\n\t\t\tparentReviewRequired: review.reviewRequired,\n\t\t});\n\t\tlet record: LaneRecord | undefined;\n\t\tlet finalized = false;\n\t\ttry {\n\t\t\t// Accounting must commit before the lifecycle terminal transition. A failed append leaves the\n\t\t\t// fenced attempt active so the same terminal event can retry with this stable report id.\n\t\t\tif (usage && usageReportId) {\n\t\t\t\tthis.deps.addSpawnedUsage?.(usage, { label: \"managed-worker\", reportId: usageReportId });\n\t\t\t}\n\t\t\tif (!this.hasPersistedClaimForAttempt(claim)) this.deps.saveWorkerClaimSnapshot(claim);\n\t\t\tconst terminal = finalizeWorkerClaim(this.lifecycle, {\n\t\t\t\thandle,\n\t\t\t\tclaim,\n\t\t\t\taccepted: resolvedStatus === \"succeeded\" && !review.reviewRequired,\n\t\t\t\tcostUsd: usage?.cost.total,\n\t\t\t\tcwd: this.deps.getCwd(),\n\t\t\t\t...(usage\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tinputTokens: usage.input,\n\t\t\t\t\t\t\toutputTokens: usage.output,\n\t\t\t\t\t\t\ttotalTokens: usage.totalTokens,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t\twallClockMs: Math.max(0, Date.now() - Date.parse(attempt.createdAt)),\n\t\t\t\ttoolCalls: 0,\n\t\t\t\treasonCode: normalizeWorkerClaimReasonCode(\n\t\t\t\t\treview.reviewRequired ? `parent_review_required:${review.reasonCode}` : event.reasonCode,\n\t\t\t\t\t`managed_worker_${resolvedStatus}`,\n\t\t\t\t),\n\t\t\t});\n\t\t\trecord = terminal.record;\n\t\t\tfinalized = true;\n\t\t\tif (terminal.notification) this.recordTerminal(record, terminal.notification.notificationId);\n\t\t\tappendLaneRecordSnapshot(this.deps.getSessionManager(), record);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tif (finalized) {\n\t\t\t\tthis.warn(\n\t\t\t\t\t`Managed worker ${event.laneId} finalized, but terminal projection or handoff failed: ${message}`,\n\t\t\t\t);\n\t\t\t\treturn record;\n\t\t\t}\n\t\t\tthis.warn(`Managed worker ${event.laneId} terminal processing failed and remains retryable: ${message}`);\n\t\t\treturn undefined;\n\t\t} finally {\n\t\t\tif (finalized) this.releaseRegistration(event.laneId);\n\t\t}\n\t\treturn record;\n\t}\n\n\trelease(): void {\n\t\tfor (const deregister of this.deregisterByLane.values()) deregister();\n\t\tthis.deregisterByLane.clear();\n\t}\n\n\tprivate ensureRegistration(laneId: string): void {\n\t\tif (this.deregisterByLane.has(laneId)) return;\n\t\tthis.deregisterByLane.set(laneId, registerInFlightWork(this.deps.getAgentDir(), \"lane\", `tmux:${laneId}`));\n\t}\n\n\tprivate releaseRegistration(laneId: string): void {\n\t\tthis.deregisterByLane.get(laneId)?.();\n\t\tthis.deregisterByLane.delete(laneId);\n\t}\n\n\t/** A replay after a crash between claim append and lifecycle finalization must not duplicate the claim. */\n\tprivate hasPersistedClaimForAttempt(claim: WorkerClaim): boolean {\n\t\tif (!claim.terminalAttemptId) return false;\n\t\tconst latest = getLatestWorkerClaimSnapshot(\n\t\t\tgetActiveSessionBranchEntries(this.deps.getSessionManager()),\n\t\t\tclaim.requestId,\n\t\t);\n\t\treturn latest?.claim.terminalAttemptId === claim.terminalAttemptId;\n\t}\n\n\tprivate compileGrant(\n\t\ttarget: { objectiveId: string; taskId: string; attemptId: string },\n\t\tlaneId: string,\n\t\tdispatch: ManagedLaneDispatch,\n\t): ExecutionGrant {\n\t\tconst compiled = compileManagedProcessExecutionGrant({\n\t\t\ttarget,\n\t\t\tlaneId,\n\t\t\tauthorizationId: dispatch.authorizationId,\n\t\t\trole: \"implementer\",\n\t\t\tallowedTools: dispatch.allowedTools,\n\t\t\twritePaths: dispatch.writePaths,\n\t\t\tcwd: this.deps.getCwd(),\n\t\t\tdeniedPaths: getPrivateLaneDeniedPaths(this.deps.getCwd(), this.deps.getAgentDir()),\n\t\t\tbudget: {\n\t\t\t\tmaxAttempts: 1,\n\t\t\t\tmaxWallClockMs: dispatch.leaseTtlMs,\n\t\t\t\t...(dispatch.maxCostUsd !== undefined ? { maxCostUsd: dispatch.maxCostUsd } : {}),\n\t\t\t},\n\t\t});\n\t\tif (!compiled.ok) {\n\t\t\tthrow new Error(`Managed worker '${laneId}' execution grant was denied: ${compiled.reasonCodes.join(\", \")}`);\n\t\t}\n\t\treturn compiled.grant;\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"session-worker-claim.d.ts","sourceRoot":"","sources":["../../../src/core/delegation/session-worker-claim.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAKN,KAAK,wBAAwB,EAE7B,KAAK,sBAAsB,EAC3B,MAAM,wBAAwB,CAAC;AAShC,eAAO,MAAM,wBAAwB,iBAAiB,CAAC;AAEvD,MAAM,MAAM,0BAA0B,GAAG,sBAAsB,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG;IACvF;uEACmE;IACnE,OAAO,CAAC,EAAE,aAAa,CAAC;CACxB,CAAC;AASF,wBAAgB,yBAAyB,CACxC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,mBAAmB,CAAC,EACzD,KAAK,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE,aAAa;AACvB;;4EAE4E;AAC5E,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACxB,MAAM,CAiBR;AAED,kDAAkD;AAClD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,aAAa,EAAE,CAY3F;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,WAAW,EAAE,CAEvF;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC3C,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,SAAS,EAAE,MAAM,GACf,0BAA0B,GAAG,SAAS,CAkBxC;AAED,MAAM,MAAM,6BAA6B,GAAG,sBAAsB,GAAG,aAAa,GAAG,kBAAkB,CAAC;AAExG,MAAM,MAAM,6BAA6B,GACtC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,6BAA6B,CAAA;CAAE,CAAC;AAExD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC3C,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,mBAAmB,CAAC,GAAG,wBAAwB,EACpF,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,MAAM,MAAuC,GAChD,6BAA6B,CAQ/B","sourcesContent":["import type { SessionEntry, SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { WorkerClaim, WorkerRequest } from \"../autonomy/contracts.ts\";\nimport {\n\tdecodeSessionSnapshotPayload,\n\tgetActiveSessionBranchEntries,\n\tgetSessionSnapshots,\n\tisVersionOneSessionSnapshotPayload,\n\ttype SessionBranchEntrySource,\n\ttype SessionSnapshotCodec,\n\ttype SessionSnapshotPayload,\n} from \"../session-snapshot.ts\";\nimport { isPlainRecord } from \"../util/value-guards.ts\";\nimport {\n\tcloneWorkerClaimForStorage,\n\tisParentReviewRequired,\n\tisWorkerClaim,\n\tnormalizeWorkerClaimForHost,\n} from \"./worker-claim.ts\";\n\nexport const WORKER_CLAIM_CUSTOM_TYPE = \"worker_claim\";\n\nexport type WorkerClaimSnapshotPayload = SessionSnapshotPayload<\"claim\", WorkerClaim> & {\n\t/** The originating request, when the host has one, makes a claim auditable against the\n\t * instructions, route, and capability envelope that bounded it. */\n\trequest?: WorkerRequest;\n};\n\nconst WORKER_CLAIM_SNAPSHOT_CODEC: SessionSnapshotCodec<WorkerClaim, \"claim\"> = {\n\tcustomType: WORKER_CLAIM_CUSTOM_TYPE,\n\tvalueKey: \"claim\",\n\tisValue: isWorkerClaim,\n\tclone: cloneWorkerClaimForStorage,\n};\n\nexport function appendWorkerClaimSnapshot(\n\tsessionManager: Pick<SessionManager, \"appendCustomEntry\">,\n\tclaim: WorkerClaim,\n\trequest?: WorkerRequest,\n\t/** Baseline for relative changedFiles when re-deriving the review marker; forwarded to\n\t * `isParentReviewRequired`/`validateWorkerClaim`. Defaults to `process.cwd()`, matching the\n\t * validator's own documented default for single-cwd-per-process callers. */\n\toptions?: { cwd?: string },\n): string {\n\tconst normalizedClaim = normalizeWorkerClaimForHost(claim);\n\tconst stored = cloneWorkerClaimForStorage(normalizedClaim);\n\t// Stamp the parent-review marker here by re-running the SAME gate\n\t// (validateWorkerClaim, via isParentReviewRequired) that originally decided\n\t// ask-user/parent_review_required, so the marker can never drift from the gate's own verdict.\n\t// Only computable when `request` is available; externally managed lanes leave the field unset —\n\t// \"unknown\", never falsely \"false\".\n\tif (request) {\n\t\tstored.parentReviewRequired = isParentReviewRequired({ request, claim: normalizedClaim, cwd: options?.cwd });\n\t}\n\tconst payload: WorkerClaimSnapshotPayload = {\n\t\tversion: 1,\n\t\tclaim: stored,\n\t\t...(request ? { request: structuredClone(request) } : {}),\n\t};\n\treturn sessionManager.appendCustomEntry(WORKER_CLAIM_CUSTOM_TYPE, payload);\n}\n\n/** Requests persisted alongside worker claims. */\nexport function getWorkerRequestSnapshots(entries: readonly SessionEntry[]): WorkerRequest[] {\n\tconst requests: WorkerRequest[] = [];\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"custom\" || entry.customType !== WORKER_CLAIM_CUSTOM_TYPE) continue;\n\t\tconst payload = entry.data;\n\t\tif (!isVersionOneSessionSnapshotPayload(payload)) continue;\n\t\tconst request = payload.request;\n\t\tif (isPlainRecord(request) && typeof request.id === \"string\") {\n\t\t\trequests.push(structuredClone(request) as unknown as WorkerRequest);\n\t\t}\n\t}\n\treturn requests;\n}\n\nexport function getWorkerClaimSnapshots(entries: readonly SessionEntry[]): WorkerClaim[] {\n\treturn getSessionSnapshots(entries, WORKER_CLAIM_SNAPSHOT_CODEC);\n}\n\n/**\n * Latest persisted snapshot (claim + originating request, when available) for one worker\n * requestId — \"latest wins\" over the append-only entries, the same collapse `delegate_status`\n * already performs when it maps results by requestId. Used to read, and durably update, the\n * parent-review marker.\n */\nexport function getLatestWorkerClaimSnapshot(\n\tentries: readonly SessionEntry[],\n\trequestId: string,\n): WorkerClaimSnapshotPayload | undefined {\n\tlet latest: WorkerClaimSnapshotPayload | undefined;\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"custom\" || entry.customType !== WORKER_CLAIM_CUSTOM_TYPE) continue;\n\t\tconst payload = entry.data;\n\t\tif (!isVersionOneSessionSnapshotPayload(payload)) continue;\n\t\tconst claim = decodeSessionSnapshotPayload(payload, WORKER_CLAIM_SNAPSHOT_CODEC);\n\t\tif (!claim || claim.requestId !== requestId) continue;\n\t\tconst request = payload.request;\n\t\tlatest = {\n\t\t\tversion: 1,\n\t\t\tclaim,\n\t\t\t...(isPlainRecord(request) && typeof request.id === \"string\"\n\t\t\t\t? { request: structuredClone(request) as unknown as WorkerRequest }\n\t\t\t\t: {}),\n\t\t};\n\t}\n\treturn latest;\n}\n\nexport type AcknowledgeWorkerReviewReason = \"unknown_worker_claim\" | \"not_flagged\" | \"already_reviewed\";\n\nexport type AcknowledgeWorkerReviewResult =\n\t| { ok: true; requestId: string; reviewedAt: string }\n\t| { ok: false; reason: AcknowledgeWorkerReviewReason };\n\n/**\n * Durably acknowledge an unreviewed worker mutation. Re-appends the latest snapshot for\n * `requestId` with `parentReviewedAt` set, so the ack is a first-class entry in the same\n * append-only audit trail as the original claim — it survives reload and any future re-read of\n * `getWorkerClaimSnapshots`/`getLatestWorkerClaimSnapshot` (both are \"latest wins\"). Never\n * write-blocking: this only marks the mutation reviewed, it does not touch the worker's files.\n */\nexport function acknowledgeWorkerClaimReview(\n\tsessionManager: Pick<SessionManager, \"appendCustomEntry\"> & SessionBranchEntrySource,\n\trequestId: string,\n\tnow: () => string = () => new Date().toISOString(),\n): AcknowledgeWorkerReviewResult {\n\tconst latest = getLatestWorkerClaimSnapshot(getActiveSessionBranchEntries(sessionManager), requestId);\n\tif (!latest) return { ok: false, reason: \"unknown_worker_claim\" };\n\tif (!latest.claim.parentReviewRequired) return { ok: false, reason: \"not_flagged\" };\n\tif (latest.claim.parentReviewedAt) return { ok: false, reason: \"already_reviewed\" };\n\tconst reviewedAt = now();\n\tappendWorkerClaimSnapshot(sessionManager, { ...latest.claim, parentReviewedAt: reviewedAt }, latest.request);\n\treturn { ok: true, requestId, reviewedAt };\n}\n"]}
1
+ {"version":3,"file":"session-worker-claim.d.ts","sourceRoot":"","sources":["../../../src/core/delegation/session-worker-claim.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAKN,KAAK,wBAAwB,EAE7B,KAAK,sBAAsB,EAC3B,MAAM,wBAAwB,CAAC;AAShC,eAAO,MAAM,wBAAwB,iBAAiB,CAAC;AAEvD,MAAM,MAAM,0BAA0B,GAAG,sBAAsB,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG;IACvF;uEACmE;IACnE,OAAO,CAAC,EAAE,aAAa,CAAC;CACxB,CAAC;AASF,wBAAgB,yBAAyB,CACxC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,mBAAmB,CAAC,EACzD,KAAK,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE,aAAa;AACvB;;4EAE4E;AAC5E,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACxB,MAAM,CAiBR;AAED,kDAAkD;AAClD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,aAAa,EAAE,CAY3F;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,WAAW,EAAE,CAEvF;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC3C,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,SAAS,EAAE,MAAM,GACf,0BAA0B,GAAG,SAAS,CAkBxC;AAED,MAAM,MAAM,6BAA6B,GAAG,sBAAsB,GAAG,aAAa,GAAG,kBAAkB,CAAC;AAExG,MAAM,MAAM,6BAA6B,GACtC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,6BAA6B,CAAA;CAAE,CAAC;AAExD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC3C,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,mBAAmB,CAAC,GAAG,wBAAwB,EACpF,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,MAAM,MAAuC,GAChD,6BAA6B,CAQ/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"session-worker-claim.js","sourceRoot":"","sources":["../../../src/core/delegation/session-worker-claim.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SessionEntry, SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { WorkerClaim, WorkerRequest } from \"../autonomy/contracts.ts\";\nimport {\n\tdecodeSessionSnapshotPayload,\n\tgetActiveSessionBranchEntries,\n\tgetSessionSnapshots,\n\tisVersionOneSessionSnapshotPayload,\n\ttype SessionBranchEntrySource,\n\ttype SessionSnapshotCodec,\n\ttype SessionSnapshotPayload,\n} from \"../session-snapshot.ts\";\nimport { isPlainRecord } from \"../util/value-guards.ts\";\nimport {\n\tcloneWorkerClaimForStorage,\n\tisParentReviewRequired,\n\tisWorkerClaim,\n\tnormalizeWorkerClaimForHost,\n} from \"./worker-claim.ts\";\n\nexport const WORKER_CLAIM_CUSTOM_TYPE = \"worker_claim\";\n\nexport type WorkerClaimSnapshotPayload = SessionSnapshotPayload<\"claim\", WorkerClaim> & {\n\t/** The originating request, when the host has one, makes a claim auditable against the\n\t * instructions, route, and capability envelope that bounded it. */\n\trequest?: WorkerRequest;\n};\n\nconst WORKER_CLAIM_SNAPSHOT_CODEC: SessionSnapshotCodec<WorkerClaim, \"claim\"> = {\n\tcustomType: WORKER_CLAIM_CUSTOM_TYPE,\n\tvalueKey: \"claim\",\n\tisValue: isWorkerClaim,\n\tclone: cloneWorkerClaimForStorage,\n};\n\nexport function appendWorkerClaimSnapshot(\n\tsessionManager: Pick<SessionManager, \"appendCustomEntry\">,\n\tclaim: WorkerClaim,\n\trequest?: WorkerRequest,\n\t/** Baseline for relative changedFiles when re-deriving the review marker; forwarded to\n\t * `isParentReviewRequired`/`validateWorkerClaim`. Defaults to `process.cwd()`, matching the\n\t * validator's own documented default for single-cwd-per-process callers. */\n\toptions?: { cwd?: string },\n): string {\n\tconst normalizedClaim = normalizeWorkerClaimForHost(claim);\n\tconst stored = cloneWorkerClaimForStorage(normalizedClaim);\n\t// Stamp the parent-review marker here by re-running the SAME gate\n\t// (validateWorkerClaim, via isParentReviewRequired) that originally decided\n\t// ask-user/parent_review_required, so the marker can never drift from the gate's own verdict.\n\t// Only computable when `request` is available; externally managed lanes leave the field unset —\n\t// \"unknown\", never falsely \"false\".\n\tif (request) {\n\t\tstored.parentReviewRequired = isParentReviewRequired({ request, claim: normalizedClaim, cwd: options?.cwd });\n\t}\n\tconst payload: WorkerClaimSnapshotPayload = {\n\t\tversion: 1,\n\t\tclaim: stored,\n\t\t...(request ? { request: structuredClone(request) } : {}),\n\t};\n\treturn sessionManager.appendCustomEntry(WORKER_CLAIM_CUSTOM_TYPE, payload);\n}\n\n/** Requests persisted alongside worker claims. */\nexport function getWorkerRequestSnapshots(entries: readonly SessionEntry[]): WorkerRequest[] {\n\tconst requests: WorkerRequest[] = [];\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"custom\" || entry.customType !== WORKER_CLAIM_CUSTOM_TYPE) continue;\n\t\tconst payload = entry.data;\n\t\tif (!isVersionOneSessionSnapshotPayload(payload)) continue;\n\t\tconst request = payload.request;\n\t\tif (isPlainRecord(request) && typeof request.id === \"string\") {\n\t\t\trequests.push(structuredClone(request) as unknown as WorkerRequest);\n\t\t}\n\t}\n\treturn requests;\n}\n\nexport function getWorkerClaimSnapshots(entries: readonly SessionEntry[]): WorkerClaim[] {\n\treturn getSessionSnapshots(entries, WORKER_CLAIM_SNAPSHOT_CODEC);\n}\n\n/**\n * Latest persisted snapshot (claim + originating request, when available) for one worker\n * requestId — \"latest wins\" over the append-only entries, the same collapse `delegate_status`\n * already performs when it maps results by requestId. Used to read, and durably update, the\n * parent-review marker.\n */\nexport function getLatestWorkerClaimSnapshot(\n\tentries: readonly SessionEntry[],\n\trequestId: string,\n): WorkerClaimSnapshotPayload | undefined {\n\tlet latest: WorkerClaimSnapshotPayload | undefined;\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"custom\" || entry.customType !== WORKER_CLAIM_CUSTOM_TYPE) continue;\n\t\tconst payload = entry.data;\n\t\tif (!isVersionOneSessionSnapshotPayload(payload)) continue;\n\t\tconst claim = decodeSessionSnapshotPayload(payload, WORKER_CLAIM_SNAPSHOT_CODEC);\n\t\tif (!claim || claim.requestId !== requestId) continue;\n\t\tconst request = payload.request;\n\t\tlatest = {\n\t\t\tversion: 1,\n\t\t\tclaim,\n\t\t\t...(isPlainRecord(request) && typeof request.id === \"string\"\n\t\t\t\t? { request: structuredClone(request) as unknown as WorkerRequest }\n\t\t\t\t: {}),\n\t\t};\n\t}\n\treturn latest;\n}\n\nexport type AcknowledgeWorkerReviewReason = \"unknown_worker_claim\" | \"not_flagged\" | \"already_reviewed\";\n\nexport type AcknowledgeWorkerReviewResult =\n\t| { ok: true; requestId: string; reviewedAt: string }\n\t| { ok: false; reason: AcknowledgeWorkerReviewReason };\n\n/**\n * Durably acknowledge an unreviewed worker mutation. Re-appends the latest snapshot for\n * `requestId` with `parentReviewedAt` set, so the ack is a first-class entry in the same\n * append-only audit trail as the original claim — it survives reload and any future re-read of\n * `getWorkerClaimSnapshots`/`getLatestWorkerClaimSnapshot` (both are \"latest wins\"). Never\n * write-blocking: this only marks the mutation reviewed, it does not touch the worker's files.\n */\nexport function acknowledgeWorkerClaimReview(\n\tsessionManager: Pick<SessionManager, \"appendCustomEntry\"> & SessionBranchEntrySource,\n\trequestId: string,\n\tnow: () => string = () => new Date().toISOString(),\n): AcknowledgeWorkerReviewResult {\n\tconst latest = getLatestWorkerClaimSnapshot(getActiveSessionBranchEntries(sessionManager), requestId);\n\tif (!latest) return { ok: false, reason: \"unknown_worker_claim\" };\n\tif (!latest.claim.parentReviewRequired) return { ok: false, reason: \"not_flagged\" };\n\tif (latest.claim.parentReviewedAt) return { ok: false, reason: \"already_reviewed\" };\n\tconst reviewedAt = now();\n\tappendWorkerClaimSnapshot(sessionManager, { ...latest.claim, parentReviewedAt: reviewedAt }, latest.request);\n\treturn { ok: true, requestId, reviewedAt };\n}\n"]}
1
+ {"version":3,"file":"session-worker-claim.js","sourceRoot":"","sources":["../../../src/core/delegation/session-worker-claim.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SessionEntry, SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { WorkerClaim, WorkerRequest } from \"../autonomy/contracts.ts\";\nimport {\n\tdecodeSessionSnapshotPayload,\n\tgetActiveSessionBranchEntries,\n\tgetSessionSnapshots,\n\tisVersionOneSessionSnapshotPayload,\n\ttype SessionBranchEntrySource,\n\ttype SessionSnapshotCodec,\n\ttype SessionSnapshotPayload,\n} from \"../session-snapshot.ts\";\nimport { isPlainRecord } from \"../util/value-guards.ts\";\nimport {\n\tcloneWorkerClaimForStorage,\n\tisParentReviewRequired,\n\tisWorkerClaim,\n\tnormalizeWorkerClaimForHost,\n} from \"./worker-claim.ts\";\n\nexport const WORKER_CLAIM_CUSTOM_TYPE = \"worker_claim\";\n\nexport type WorkerClaimSnapshotPayload = SessionSnapshotPayload<\"claim\", WorkerClaim> & {\n\t/** The originating request, when the host has one, makes a claim auditable against the\n\t * instructions, route, and capability envelope that bounded it. */\n\trequest?: WorkerRequest;\n};\n\nconst WORKER_CLAIM_SNAPSHOT_CODEC: SessionSnapshotCodec<WorkerClaim, \"claim\"> = {\n\tcustomType: WORKER_CLAIM_CUSTOM_TYPE,\n\tvalueKey: \"claim\",\n\tisValue: isWorkerClaim,\n\tclone: cloneWorkerClaimForStorage,\n};\n\nexport function appendWorkerClaimSnapshot(\n\tsessionManager: Pick<SessionManager, \"appendCustomEntry\">,\n\tclaim: WorkerClaim,\n\trequest?: WorkerRequest,\n\t/** Baseline for relative changedFiles when re-deriving the review marker; forwarded to\n\t * `isParentReviewRequired`/`validateWorkerClaim`. Defaults to `process.cwd()`, matching the\n\t * validator's own documented default for single-cwd-per-process callers. */\n\toptions?: { cwd?: string },\n): string {\n\tconst normalizedClaim = normalizeWorkerClaimForHost(claim);\n\tconst stored = cloneWorkerClaimForStorage(normalizedClaim);\n\t// Stamp the parent-review marker here by re-running the SAME gate\n\t// (validateWorkerClaim, via isParentReviewRequired) that originally decided\n\t// ask-user/parent_review_required, so the marker can never drift from the gate's own verdict.\n\t// Only computable when `request` is available; externally managed lanes leave the field unset —\n\t// \"unknown\", never falsely \"false\".\n\tif (request) {\n\t\tstored.parentReviewRequired = isParentReviewRequired({ request, claim: normalizedClaim, cwd: options?.cwd });\n\t}\n\tconst payload: WorkerClaimSnapshotPayload = {\n\t\tversion: 1,\n\t\tclaim: stored,\n\t\t...(request ? { request: structuredClone(request) } : {}),\n\t};\n\treturn sessionManager.appendCustomEntry(WORKER_CLAIM_CUSTOM_TYPE, payload);\n}\n\n/** Requests persisted alongside worker claims. */\nexport function getWorkerRequestSnapshots(entries: readonly SessionEntry[]): WorkerRequest[] {\n\tconst requests: WorkerRequest[] = [];\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"custom\" || entry.customType !== WORKER_CLAIM_CUSTOM_TYPE) continue;\n\t\tconst payload = entry.data;\n\t\tif (!isVersionOneSessionSnapshotPayload(payload)) continue;\n\t\tconst request = payload.request;\n\t\tif (isPlainRecord(request) && typeof request.id === \"string\") {\n\t\t\trequests.push(structuredClone(request) as unknown as WorkerRequest);\n\t\t}\n\t}\n\treturn requests;\n}\n\nexport function getWorkerClaimSnapshots(entries: readonly SessionEntry[]): WorkerClaim[] {\n\treturn getSessionSnapshots(entries, WORKER_CLAIM_SNAPSHOT_CODEC);\n}\n\n/**\n * Latest persisted snapshot (claim + originating request, when available) for one worker\n * requestId — \"latest wins\" over the append-only entries, the same collapse `delegate_status`\n * already performs when it maps results by requestId. Used to read, and durably update, the\n * parent-review marker.\n */\nexport function getLatestWorkerClaimSnapshot(\n\tentries: readonly SessionEntry[],\n\trequestId: string,\n): WorkerClaimSnapshotPayload | undefined {\n\tlet latest: WorkerClaimSnapshotPayload | undefined;\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"custom\" || entry.customType !== WORKER_CLAIM_CUSTOM_TYPE) continue;\n\t\tconst payload = entry.data;\n\t\tif (!isVersionOneSessionSnapshotPayload(payload)) continue;\n\t\tconst claim = decodeSessionSnapshotPayload(payload, WORKER_CLAIM_SNAPSHOT_CODEC);\n\t\tif (!claim || claim.requestId !== requestId) continue;\n\t\tconst request = payload.request;\n\t\tlatest = {\n\t\t\tversion: 1,\n\t\t\tclaim,\n\t\t\t...(isPlainRecord(request) && typeof request.id === \"string\"\n\t\t\t\t? { request: structuredClone(request) as unknown as WorkerRequest }\n\t\t\t\t: {}),\n\t\t};\n\t}\n\treturn latest;\n}\n\nexport type AcknowledgeWorkerReviewReason = \"unknown_worker_claim\" | \"not_flagged\" | \"already_reviewed\";\n\nexport type AcknowledgeWorkerReviewResult =\n\t| { ok: true; requestId: string; reviewedAt: string }\n\t| { ok: false; reason: AcknowledgeWorkerReviewReason };\n\n/**\n * Durably acknowledge an unreviewed worker mutation. Re-appends the latest snapshot for\n * `requestId` with `parentReviewedAt` set, so the ack is a first-class entry in the same\n * append-only audit trail as the original claim — it survives reload and any future re-read of\n * `getWorkerClaimSnapshots`/`getLatestWorkerClaimSnapshot` (both are \"latest wins\"). Never\n * write-blocking: this only marks the mutation reviewed, it does not touch the worker's files.\n */\nexport function acknowledgeWorkerClaimReview(\n\tsessionManager: Pick<SessionManager, \"appendCustomEntry\"> & SessionBranchEntrySource,\n\trequestId: string,\n\tnow: () => string = () => new Date().toISOString(),\n): AcknowledgeWorkerReviewResult {\n\tconst latest = getLatestWorkerClaimSnapshot(getActiveSessionBranchEntries(sessionManager), requestId);\n\tif (!latest) return { ok: false, reason: \"unknown_worker_claim\" };\n\tif (!latest.claim.parentReviewRequired) return { ok: false, reason: \"not_flagged\" };\n\tif (latest.claim.parentReviewedAt) return { ok: false, reason: \"already_reviewed\" };\n\tconst reviewedAt = now();\n\tappendWorkerClaimSnapshot(sessionManager, { ...latest.claim, parentReviewedAt: reviewedAt }, latest.request);\n\treturn { ok: true, requestId, reviewedAt };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"worker-action-journal.d.ts","sourceRoot":"","sources":["../../../src/core/delegation/worker-action-journal.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,wBAAwB,GAAG,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE1F,MAAM,WAAW,wBAAwB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,yBAAyB;IACzC,EAAE,EAAE,OAAO,GAAG,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,sBAAsB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,yBAAyB,CAAC;IAClC,sFAAsF;IACtF,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC3C,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,8BAA8B;IAC9C,IAAI,EAAE,qBAAqB,CAAC;IAC5B,KAAK,EAAE,OAAO,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAC;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,uBAAuB,GAAG,2BAA2B,GAAG,8BAA8B,CAAC;AAEnG,MAAM,WAAW,6BAA6B;IAC7C,KAAK,EAAE,wBAAwB,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AA8DD,wGAAwG;AACxG,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAInF;AAmHD;;;;GAIG;AACH,qBAAa,mBAAmB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6C;IACnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IAEvD,YAAY,KAAK,EAAE,wBAAwB,EAK1C;IAED,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,6BAA6B,CAO7D;IAED,KAAK,CAAC,KAAK,EAAE,sBAAsB,GAAG,uBAAuB,CAsC5D;IAED,eAAe,CAAC,MAAM,EAAE,2BAA2B,EAAE,OAAO,GAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,IAAI,CAErG;IAED,YAAY,CACX,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAO,GACxC,IAAI,CAON;IAED,OAAO,CAAC,cAAc;IA8BtB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,aAAa;CA4BrB","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { workerActionJournalFile } from \"../agent-paths.ts\";\nimport { withFileLockSync, writeFileAtomicSync } from \"../util/atomic-file.ts\";\nimport { readBoundedTextFileSync } from \"../util/bounded-file.ts\";\nimport { requireBoundedTrimmedText } from \"../util/bounded-value.ts\";\n\nconst JOURNAL_SCHEMA_VERSION = 1;\nconst MAX_IDENTIFIER_CHARS = 256;\nconst MAX_TARGET_CHARS = 2048;\nconst MAX_REASON_CHARS = 512;\nconst MAX_EVIDENCE_POINTER_CHARS = 512;\nconst MAX_ENTRIES = 64;\nconst MAX_JOURNAL_BYTES = 256 * 1024;\n\nexport type WorkerActionJournalState = \"not_started\" | \"unknown\" | \"succeeded\" | \"failed\";\n\nexport interface WorkerActionJournalScope {\n\tagentDir: string;\n\tparentSessionId: string;\n\ttaskId: string;\n\tattemptId: string;\n\tfencingToken: number;\n}\n\nexport interface WorkerActionJournalAction {\n\top: \"write\" | \"edit\";\n\tpath: string;\n\tcontent?: string;\n\told?: string;\n\tnew?: string;\n}\n\nexport interface BeginWorkerActionInput {\n\tindex: number;\n\taction: WorkerActionJournalAction;\n\t/** Realpath-resolved target used by the executor, never model-provided text alone. */\n\ttargetPath: string;\n}\n\nexport interface WorkerActionExecutionPermit {\n\tkind: \"execute\";\n\tstate: \"not_started\";\n\tactionId: string;\n\tactionDigest: string;\n\tnormalizedTarget: string;\n}\n\nexport interface WorkerActionInspectionRequired {\n\tkind: \"inspection_required\";\n\tstate: Exclude<WorkerActionJournalState, \"not_started\">;\n\tactionId: string;\n\tactionDigest: string;\n\tnormalizedTarget: string;\n\treasonCode: string;\n\tevidencePointer?: string;\n}\n\nexport type BeginWorkerActionResult = WorkerActionExecutionPermit | WorkerActionInspectionRequired;\n\nexport interface WorkerActionJournalInspection {\n\tstate: WorkerActionJournalState;\n\tactionId: string;\n\tactionDigest?: string;\n\tnormalizedTarget?: string;\n\treasonCode?: string;\n\tevidencePointer?: string;\n}\n\ninterface PersistedJournalEntry {\n\tactionId: string;\n\tactionDigest: string;\n\tindex: number;\n\tattemptId: string;\n\tfencingToken: number;\n\toperation: \"write\" | \"edit\";\n\tnormalizedTarget: string;\n\tstatus: \"intent\" | \"succeeded\" | \"failed\";\n\tcreatedAt: string;\n\tupdatedAt: string;\n\treasonCode?: string;\n\tevidencePointer?: string;\n}\n\ninterface PersistedJournal {\n\tschemaVersion: number;\n\tscope: WorkerActionJournalIdentity;\n\tentries: PersistedJournalEntry[];\n}\n\ninterface WorkerActionJournalIdentity {\n\tparentSessionId: string;\n\ttaskId: string;\n}\n\nfunction safeFencingToken(value: unknown): number {\n\tif (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 1)\n\t\tthrow new TypeError(\"Worker action journal fencing token must be a positive safe integer.\");\n\treturn value;\n}\n\nfunction validateScope(scope: WorkerActionJournalScope): Omit<WorkerActionJournalScope, \"agentDir\"> {\n\treturn {\n\t\tparentSessionId: requireBoundedTrimmedText(scope.parentSessionId, MAX_IDENTIFIER_CHARS, \"Parent session id\"),\n\t\ttaskId: requireBoundedTrimmedText(scope.taskId, MAX_IDENTIFIER_CHARS, \"Task id\"),\n\t\tattemptId: requireBoundedTrimmedText(scope.attemptId, MAX_IDENTIFIER_CHARS, \"Attempt id\"),\n\t\tfencingToken: safeFencingToken(scope.fencingToken),\n\t};\n}\n\nfunction journalIdentity(scope: Omit<WorkerActionJournalScope, \"agentDir\">): WorkerActionJournalIdentity {\n\treturn { parentSessionId: scope.parentSessionId, taskId: scope.taskId };\n}\n\nfunction scopeDigest(scope: WorkerActionJournalIdentity): string {\n\treturn createHash(\"sha256\")\n\t\t.update(\"pi-worker-action-journal-scope-v1\")\n\t\t.update(\"\\0\")\n\t\t.update(scope.parentSessionId)\n\t\t.update(\"\\0\")\n\t\t.update(scope.taskId)\n\t\t.update(\"\\0\")\n\t\t.digest(\"hex\");\n}\n\nfunction usesWindowsPath(value: string): boolean {\n\treturn /^[a-zA-Z]:([\\\\/]|$)/.test(value) || value.startsWith(\"\\\\\\\\\") || value.startsWith(\"//\");\n}\n\n/** Canonical lexical identity for an already-authorized real target, including native Windows paths. */\nexport function normalizeWorkerActionTarget(cwd: string, targetPath: string): string {\n\tconst pathApi = usesWindowsPath(cwd) || usesWindowsPath(targetPath) ? path.win32 : path.posix;\n\tconst normalized = pathApi.resolve(cwd, targetPath);\n\treturn pathApi === path.win32 ? normalized.toLowerCase() : normalized;\n}\n\nfunction actionDigest(input: BeginWorkerActionInput, normalizedTarget: string): string {\n\tconst hash = createHash(\"sha256\");\n\thash.update(\"pi-worker-action-v1\");\n\thash.update(\"\\0\");\n\thash.update(input.action.op);\n\thash.update(\"\\0\");\n\thash.update(normalizedTarget);\n\thash.update(\"\\0\");\n\tif (input.action.op === \"write\") {\n\t\thash.update(input.action.content ?? \"\");\n\t} else {\n\t\thash.update(input.action.old ?? \"\");\n\t\thash.update(\"\\0\");\n\t\thash.update(input.action.new ?? \"\");\n\t}\n\treturn hash.digest(\"hex\");\n}\n\nfunction actionId(scope: Omit<WorkerActionJournalScope, \"agentDir\">, index: number, digest: string): string {\n\treturn createHash(\"sha256\")\n\t\t.update(\"pi-worker-action-id-v1\")\n\t\t.update(\"\\0\")\n\t\t.update(scope.attemptId)\n\t\t.update(\"\\0\")\n\t\t.update(String(scope.fencingToken))\n\t\t.update(\"\\0\")\n\t\t.update(String(index))\n\t\t.update(\"\\0\")\n\t\t.update(digest)\n\t\t.digest(\"hex\")\n\t\t.slice(0, 40);\n}\n\nfunction stringValue(value: unknown, label: string, maximum: number): string {\n\tif (typeof value !== \"string\" || value.length === 0 || value.length > maximum) {\n\t\tthrow new Error(`Worker action journal ${label} is invalid.`);\n\t}\n\treturn value;\n}\n\nfunction objectValue(value: unknown, label: string): Record<string, unknown> {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value))\n\t\tthrow new Error(`Worker action journal ${label} is invalid.`);\n\treturn value as Record<string, unknown>;\n}\n\nfunction parseEntry(value: unknown): PersistedJournalEntry {\n\tconst entry = objectValue(value, \"entry\");\n\tconst index = entry.index;\n\tif (typeof index !== \"number\" || !Number.isSafeInteger(index) || index < 0)\n\t\tthrow new Error(\"Worker action journal entry index is invalid.\");\n\tconst parsedIndex = index;\n\tconst operation = entry.operation;\n\tconst status = entry.status;\n\tif (\n\t\t(operation !== \"write\" && operation !== \"edit\") ||\n\t\t(status !== \"intent\" && status !== \"succeeded\" && status !== \"failed\")\n\t) {\n\t\tthrow new Error(\"Worker action journal entry shape is invalid.\");\n\t}\n\tconst reasonCode = entry.reasonCode;\n\tconst evidencePointer = entry.evidencePointer;\n\tif (reasonCode !== undefined && (typeof reasonCode !== \"string\" || reasonCode.length > MAX_REASON_CHARS)) {\n\t\tthrow new Error(\"Worker action journal entry reason is invalid.\");\n\t}\n\tif (\n\t\tevidencePointer !== undefined &&\n\t\t(typeof evidencePointer !== \"string\" || evidencePointer.length > MAX_EVIDENCE_POINTER_CHARS)\n\t) {\n\t\tthrow new Error(\"Worker action journal entry evidence pointer is invalid.\");\n\t}\n\treturn {\n\t\tactionId: stringValue(entry.actionId, \"entry action id\", 128),\n\t\tactionDigest: stringValue(entry.actionDigest, \"entry action digest\", 128),\n\t\tindex: parsedIndex,\n\t\tattemptId: stringValue(entry.attemptId, \"entry attempt id\", MAX_IDENTIFIER_CHARS),\n\t\tfencingToken: safeFencingToken(entry.fencingToken),\n\t\toperation,\n\t\tnormalizedTarget: stringValue(entry.normalizedTarget, \"entry target\", MAX_TARGET_CHARS),\n\t\tstatus,\n\t\tcreatedAt: stringValue(entry.createdAt, \"entry created time\", 128),\n\t\tupdatedAt: stringValue(entry.updatedAt, \"entry updated time\", 128),\n\t\t...(reasonCode ? { reasonCode } : {}),\n\t\t...(evidencePointer ? { evidencePointer } : {}),\n\t};\n}\n\nfunction parseJournal(value: unknown, expectedScope: WorkerActionJournalIdentity): PersistedJournal {\n\tconst journal = objectValue(value, \"document\");\n\tif (journal.schemaVersion !== JOURNAL_SCHEMA_VERSION)\n\t\tthrow new Error(\"Worker action journal schema is unsupported.\");\n\tconst scope = objectValue(journal.scope, \"scope\");\n\tconst parsedScope = {\n\t\tparentSessionId: stringValue(scope.parentSessionId, \"scope parent session\", MAX_IDENTIFIER_CHARS),\n\t\ttaskId: stringValue(scope.taskId, \"scope task\", MAX_IDENTIFIER_CHARS),\n\t};\n\tif (parsedScope.parentSessionId !== expectedScope.parentSessionId || parsedScope.taskId !== expectedScope.taskId) {\n\t\tthrow new Error(\"Worker action journal scope conflicts with the current fenced attempt.\");\n\t}\n\tif (!Array.isArray(journal.entries) || journal.entries.length > MAX_ENTRIES) {\n\t\tthrow new Error(\"Worker action journal entries are invalid.\");\n\t}\n\tconst entries = journal.entries.map(parseEntry);\n\tif (new Set(entries.map((entry) => entry.actionId)).size !== entries.length) {\n\t\tthrow new Error(\"Worker action journal contains duplicate action identities.\");\n\t}\n\treturn { schemaVersion: JOURNAL_SCHEMA_VERSION, scope: parsedScope, entries };\n}\n\nfunction now(): string {\n\treturn new Date().toISOString();\n}\n\n/**\n * Durable intent/receipt journal for model-emitted structured mutations. It deliberately records\n * only action digests and normalized targets; operation payloads can contain source text or secrets\n * and must never leave the model result in persisted orchestration state.\n */\nexport class WorkerActionJournal {\n\treadonly agentDir: string;\n\treadonly filePath: string;\n\tprivate readonly scope: Omit<WorkerActionJournalScope, \"agentDir\">;\n\tprivate readonly identity: WorkerActionJournalIdentity;\n\n\tconstructor(scope: WorkerActionJournalScope) {\n\t\tthis.agentDir = requireBoundedTrimmedText(scope.agentDir, MAX_TARGET_CHARS, \"Agent directory\");\n\t\tthis.scope = validateScope(scope);\n\t\tthis.identity = journalIdentity(this.scope);\n\t\tthis.filePath = workerActionJournalFile(this.agentDir, this.scope.parentSessionId, scopeDigest(this.identity));\n\t}\n\n\tinspect(actionIdentity: string): WorkerActionJournalInspection {\n\t\tconst actionId = requireBoundedTrimmedText(actionIdentity, 128, \"Worker action id\");\n\t\treturn withFileLockSync(this.filePath, () => {\n\t\t\tconst entry = this.readLocked().entries.find((candidate) => candidate.actionId === actionId);\n\t\t\tif (!entry) return { state: \"not_started\", actionId };\n\t\t\treturn this.inspectionFor(entry);\n\t\t});\n\t}\n\n\tbegin(input: BeginWorkerActionInput): BeginWorkerActionResult {\n\t\tif (!Number.isSafeInteger(input.index) || input.index < 0 || input.index >= MAX_ENTRIES) {\n\t\t\tthrow new TypeError(`Worker action index must be a safe integer from 0 through ${MAX_ENTRIES - 1}.`);\n\t\t}\n\t\tconst normalizedTarget = normalizeWorkerActionTarget(this.agentDir, input.targetPath);\n\t\tif (normalizedTarget.length > MAX_TARGET_CHARS) throw new TypeError(\"Worker action target is too long.\");\n\t\tconst digest = actionDigest(input, normalizedTarget);\n\t\tconst id = actionId(this.scope, input.index, digest);\n\t\treturn withFileLockSync(this.filePath, () => {\n\t\t\tconst journal = this.readLocked();\n\t\t\tconst existing = journal.entries.find((entry) => entry.actionId === id);\n\t\t\tif (existing) {\n\t\t\t\tif (existing.actionDigest !== digest) throw new Error(\"Worker action journal action identity collision.\");\n\t\t\t\treturn this.inspectionFor(existing);\n\t\t\t}\n\t\t\tconst previousFence = journal.entries.find(\n\t\t\t\t(entry) =>\n\t\t\t\t\tentry.actionDigest === digest &&\n\t\t\t\t\tentry.operation === input.action.op &&\n\t\t\t\t\tentry.normalizedTarget === normalizedTarget,\n\t\t\t);\n\t\t\tif (previousFence) return this.inspectionFor(previousFence, true);\n\t\t\tconst timestamp = now();\n\t\t\tjournal.entries.push({\n\t\t\t\tactionId: id,\n\t\t\t\tactionDigest: digest,\n\t\t\t\tindex: input.index,\n\t\t\t\tattemptId: this.scope.attemptId,\n\t\t\t\tfencingToken: this.scope.fencingToken,\n\t\t\t\toperation: input.action.op,\n\t\t\t\tnormalizedTarget,\n\t\t\t\tstatus: \"intent\",\n\t\t\t\tcreatedAt: timestamp,\n\t\t\t\tupdatedAt: timestamp,\n\t\t\t});\n\t\t\tthis.writeLocked(journal);\n\t\t\treturn { kind: \"execute\", state: \"not_started\", actionId: id, actionDigest: digest, normalizedTarget };\n\t\t});\n\t}\n\n\trecordSucceeded(permit: WorkerActionExecutionPermit, options: { evidencePointer?: string } = {}): void {\n\t\tthis.recordTerminal(permit, \"succeeded\", \"worker_action_applied\", options.evidencePointer);\n\t}\n\n\trecordFailed(\n\t\tpermit: WorkerActionExecutionPermit,\n\t\treasonCode: string,\n\t\toptions: { evidencePointer?: string } = {},\n\t): void {\n\t\tthis.recordTerminal(\n\t\t\tpermit,\n\t\t\t\"failed\",\n\t\t\trequireBoundedTrimmedText(reasonCode, MAX_REASON_CHARS, \"Worker action failure reason\"),\n\t\t\toptions.evidencePointer,\n\t\t);\n\t}\n\n\tprivate recordTerminal(\n\t\tpermit: WorkerActionExecutionPermit,\n\t\tstatus: \"succeeded\" | \"failed\",\n\t\treasonCode: string,\n\t\tevidencePointer: string | undefined,\n\t): void {\n\t\tconst boundedEvidence = evidencePointer\n\t\t\t? requireBoundedTrimmedText(evidencePointer, MAX_EVIDENCE_POINTER_CHARS, \"Worker action evidence pointer\")\n\t\t\t: undefined;\n\t\twithFileLockSync(this.filePath, () => {\n\t\t\tconst journal = this.readLocked();\n\t\t\tconst entry = journal.entries.find((candidate) => candidate.actionId === permit.actionId);\n\t\t\tif (\n\t\t\t\t!entry ||\n\t\t\t\tentry.actionDigest !== permit.actionDigest ||\n\t\t\t\tentry.normalizedTarget !== permit.normalizedTarget ||\n\t\t\t\tentry.attemptId !== this.scope.attemptId ||\n\t\t\t\tentry.fencingToken !== this.scope.fencingToken\n\t\t\t) {\n\t\t\t\tthrow new Error(\"Worker action journal receipt does not match a persisted intent.\");\n\t\t\t}\n\t\t\tif (entry.status !== \"intent\") throw new Error(\"Worker action journal intent already has a terminal receipt.\");\n\t\t\tentry.status = status;\n\t\t\tentry.reasonCode = reasonCode;\n\t\t\tentry.updatedAt = now();\n\t\t\tif (boundedEvidence) entry.evidencePointer = boundedEvidence;\n\t\t\tthis.writeLocked(journal);\n\t\t});\n\t}\n\n\tprivate readLocked(): PersistedJournal {\n\t\tif (!existsSync(this.filePath)) {\n\t\t\treturn { schemaVersion: JOURNAL_SCHEMA_VERSION, scope: structuredClone(this.identity), entries: [] };\n\t\t}\n\t\tconst content = readBoundedTextFileSync(this.filePath, MAX_JOURNAL_BYTES, \"Worker action journal\");\n\t\tlet raw: unknown;\n\t\ttry {\n\t\t\traw = JSON.parse(content);\n\t\t} catch {\n\t\t\tthrow new Error(\"Worker action journal is unreadable; refusing mutation replay.\");\n\t\t}\n\t\treturn parseJournal(raw, this.identity);\n\t}\n\n\tprivate writeLocked(journal: PersistedJournal): void {\n\t\tconst serialized = `${JSON.stringify(journal)}\\n`;\n\t\tif (Buffer.byteLength(serialized, \"utf-8\") > MAX_JOURNAL_BYTES) {\n\t\t\tthrow new Error(\"Worker action journal would exceed its byte limit.\");\n\t\t}\n\t\twriteFileAtomicSync(this.filePath, serialized, { mode: 0o600 });\n\t}\n\n\tprivate inspectionFor(entry: PersistedJournalEntry, fromPreviousFence = false): WorkerActionInspectionRequired {\n\t\tif (entry.status === \"intent\") {\n\t\t\treturn {\n\t\t\t\tkind: \"inspection_required\",\n\t\t\t\tstate: \"unknown\",\n\t\t\t\tactionId: entry.actionId,\n\t\t\t\tactionDigest: entry.actionDigest,\n\t\t\t\tnormalizedTarget: entry.normalizedTarget,\n\t\t\t\treasonCode: fromPreviousFence\n\t\t\t\t\t? \"worker_action_prior_fence_requires_inspection\"\n\t\t\t\t\t: \"worker_action_outcome_unknown\",\n\t\t\t\t...(entry.evidencePointer ? { evidencePointer: entry.evidencePointer } : {}),\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"inspection_required\",\n\t\t\tstate: entry.status,\n\t\t\tactionId: entry.actionId,\n\t\t\tactionDigest: entry.actionDigest,\n\t\t\tnormalizedTarget: entry.normalizedTarget,\n\t\t\treasonCode: fromPreviousFence\n\t\t\t\t? \"worker_action_prior_fence_requires_inspection\"\n\t\t\t\t: entry.status === \"succeeded\"\n\t\t\t\t\t? \"worker_action_already_succeeded\"\n\t\t\t\t\t: \"worker_action_previously_failed\",\n\t\t\t...(entry.evidencePointer ? { evidencePointer: entry.evidencePointer } : {}),\n\t\t};\n\t}\n}\n"]}
1
+ {"version":3,"file":"worker-action-journal.d.ts","sourceRoot":"","sources":["../../../src/core/delegation/worker-action-journal.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,wBAAwB,GAAG,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE1F,MAAM,WAAW,wBAAwB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,yBAAyB;IACzC,EAAE,EAAE,OAAO,GAAG,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,sBAAsB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,yBAAyB,CAAC;IAClC,sFAAsF;IACtF,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC3C,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,8BAA8B;IAC9C,IAAI,EAAE,qBAAqB,CAAC;IAC5B,KAAK,EAAE,OAAO,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAC;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,uBAAuB,GAAG,2BAA2B,GAAG,8BAA8B,CAAC;AAEnG,MAAM,WAAW,6BAA6B;IAC7C,KAAK,EAAE,wBAAwB,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AA8DD,wGAAwG;AACxG,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAInF;AAmHD;;;;GAIG;AACH,qBAAa,mBAAmB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6C;IACnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IAEvD,YAAY,KAAK,EAAE,wBAAwB,EAK1C;IAED,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,6BAA6B,CAO7D;IAED,KAAK,CAAC,KAAK,EAAE,sBAAsB,GAAG,uBAAuB,CAsC5D;IAED,eAAe,CAAC,MAAM,EAAE,2BAA2B,EAAE,OAAO,GAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,IAAI,CAErG;IAED,YAAY,CACX,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAO,GACxC,IAAI,CAON;IAED,OAAO,CAAC,cAAc;IA8BtB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,aAAa;CA4BrB"}
@@ -156,10 +156,6 @@ function now() {
156
156
  * and must never leave the model result in persisted orchestration state.
157
157
  */
158
158
  export class WorkerActionJournal {
159
- agentDir;
160
- filePath;
161
- scope;
162
- identity;
163
159
  constructor(scope) {
164
160
  this.agentDir = requireBoundedTrimmedText(scope.agentDir, MAX_TARGET_CHARS, "Agent directory");
165
161
  this.scope = validateScope(scope);
@@ -1 +1 @@
1
- {"version":3,"file":"worker-action-journal.js","sourceRoot":"","sources":["../../../src/core/delegation/worker-action-journal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAErE,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,0BAA0B,GAAG,GAAG,CAAC;AACvC,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,iBAAiB,GAAG,GAAG,GAAG,IAAI,CAAC;AAkFrC,SAAS,gBAAgB,CAAC,KAAc,EAAU;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QACzE,MAAM,IAAI,SAAS,CAAC,sEAAsE,CAAC,CAAC;IAC7F,OAAO,KAAK,CAAC;AAAA,CACb;AAED,SAAS,aAAa,CAAC,KAA+B,EAA8C;IACnG,OAAO;QACN,eAAe,EAAE,yBAAyB,CAAC,KAAK,CAAC,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,CAAC;QAC5G,MAAM,EAAE,yBAAyB,CAAC,KAAK,CAAC,MAAM,EAAE,oBAAoB,EAAE,SAAS,CAAC;QAChF,SAAS,EAAE,yBAAyB,CAAC,KAAK,CAAC,SAAS,EAAE,oBAAoB,EAAE,YAAY,CAAC;QACzF,YAAY,EAAE,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC;KAClD,CAAC;AAAA,CACF;AAED,SAAS,eAAe,CAAC,KAAiD,EAA+B;IACxG,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AAAA,CACxE;AAED,SAAS,WAAW,CAAC,KAAkC,EAAU;IAChE,OAAO,UAAU,CAAC,QAAQ,CAAC;SACzB,MAAM,CAAC,mCAAmC,CAAC;SAC3C,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC;SAC7B,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;SACpB,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,KAAK,CAAC,CAAC;AAAA,CAChB;AAED,SAAS,eAAe,CAAC,KAAa,EAAW;IAChD,OAAO,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/F;AAED,wGAAwG;AACxG,MAAM,UAAU,2BAA2B,CAAC,GAAW,EAAE,UAAkB,EAAU;IACpF,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IAC9F,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACpD,OAAO,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;AAAA,CACtE;AAED,SAAS,YAAY,CAAC,KAA6B,EAAE,gBAAwB,EAAU;IACtF,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClB,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACP,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAAA,CAC1B;AAED,SAAS,QAAQ,CAAC,KAAiD,EAAE,KAAa,EAAE,MAAc,EAAU;IAC3G,OAAO,UAAU,CAAC,QAAQ,CAAC;SACzB,MAAM,CAAC,wBAAwB,CAAC;SAChC,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;SACvB,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;SAClC,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACrB,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,MAAM,CAAC;SACd,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAAA,CACf;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa,EAAE,OAAe,EAAU;IAC5E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;QAC/E,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,cAAc,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CACb;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa,EAA2B;IAC5E,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,cAAc,CAAC,CAAC;IAC/D,OAAO,KAAgC,CAAC;AAAA,CACxC;AAED,SAAS,UAAU,CAAC,KAAc,EAAyB;IAC1D,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,KAAK,CAAC;IAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IAClC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,IACC,CAAC,SAAS,KAAK,OAAO,IAAI,SAAS,KAAK,MAAM,CAAC;QAC/C,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,QAAQ,CAAC,EACrE,CAAC;QACF,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACpC,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;IAC9C,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,GAAG,gBAAgB,CAAC,EAAE,CAAC;QAC1G,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACnE,CAAC;IACD,IACC,eAAe,KAAK,SAAS;QAC7B,CAAC,OAAO,eAAe,KAAK,QAAQ,IAAI,eAAe,CAAC,MAAM,GAAG,0BAA0B,CAAC,EAC3F,CAAC;QACF,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO;QACN,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,CAAC;QAC7D,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,YAAY,EAAE,qBAAqB,EAAE,GAAG,CAAC;QACzE,KAAK,EAAE,WAAW;QAClB,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,kBAAkB,EAAE,oBAAoB,CAAC;QACjF,YAAY,EAAE,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC;QAClD,SAAS;QACT,gBAAgB,EAAE,WAAW,CAAC,KAAK,CAAC,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,CAAC;QACvF,MAAM;QACN,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,oBAAoB,EAAE,GAAG,CAAC;QAClE,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,oBAAoB,EAAE,GAAG,CAAC;QAClE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/C,CAAC;AAAA,CACF;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,aAA0C,EAAoB;IACnG,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,aAAa,KAAK,sBAAsB;QACnD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG;QACnB,eAAe,EAAE,WAAW,CAAC,KAAK,CAAC,eAAe,EAAE,sBAAsB,EAAE,oBAAoB,CAAC;QACjG,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,oBAAoB,CAAC;KACrE,CAAC;IACF,IAAI,WAAW,CAAC,eAAe,KAAK,aAAa,CAAC,eAAe,IAAI,WAAW,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;QAClH,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7E,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAChD,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;QAC7E,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AAAA,CAC9E;AAED,SAAS,GAAG,GAAW;IACtB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAAA,CAChC;AAED;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;IACtB,QAAQ,CAAS;IACjB,QAAQ,CAAS;IACT,KAAK,CAA6C;IAClD,QAAQ,CAA8B;IAEvD,YAAY,KAA+B,EAAE;QAC5C,IAAI,CAAC,QAAQ,GAAG,yBAAyB,CAAC,KAAK,CAAC,QAAQ,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;QAC/F,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAAA,CAC/G;IAED,OAAO,CAAC,cAAsB,EAAiC;QAC9D,MAAM,QAAQ,GAAG,yBAAyB,CAAC,cAAc,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACpF,OAAO,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;YAC7F,IAAI,CAAC,KAAK;gBAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;YACtD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAAA,CACjC,CAAC,CAAC;IAAA,CACH;IAED,KAAK,CAAC,KAA6B,EAA2B;QAC7D,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,WAAW,EAAE,CAAC;YACzF,MAAM,IAAI,SAAS,CAAC,6DAA6D,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC;QACtG,CAAC;QACD,MAAM,gBAAgB,GAAG,2BAA2B,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACtF,IAAI,gBAAgB,CAAC,MAAM,GAAG,gBAAgB;YAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;QACzG,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QACrD,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACrD,OAAO,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;YAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC;YACxE,IAAI,QAAQ,EAAE,CAAC;gBACd,IAAI,QAAQ,CAAC,YAAY,KAAK,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;gBAC1G,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC;YACD,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CACzC,CAAC,KAAK,EAAE,EAAE,CACT,KAAK,CAAC,YAAY,KAAK,MAAM;gBAC7B,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE;gBACnC,KAAK,CAAC,gBAAgB,KAAK,gBAAgB,CAC5C,CAAC;YACF,IAAI,aAAa;gBAAE,OAAO,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YAClE,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;YACxB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;gBACpB,QAAQ,EAAE,EAAE;gBACZ,YAAY,EAAE,MAAM;gBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;gBAC/B,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;gBACrC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;gBAC1B,gBAAgB;gBAChB,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,SAAS;gBACpB,SAAS,EAAE,SAAS;aACpB,CAAC,CAAC;YACH,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC1B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;QAAA,CACvG,CAAC,CAAC;IAAA,CACH;IAED,eAAe,CAAC,MAAmC,EAAE,OAAO,GAAiC,EAAE,EAAQ;QACtG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,uBAAuB,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAAA,CAC3F;IAED,YAAY,CACX,MAAmC,EACnC,UAAkB,EAClB,OAAO,GAAiC,EAAE,EACnC;QACP,IAAI,CAAC,cAAc,CAClB,MAAM,EACN,QAAQ,EACR,yBAAyB,CAAC,UAAU,EAAE,gBAAgB,EAAE,8BAA8B,CAAC,EACvF,OAAO,CAAC,eAAe,CACvB,CAAC;IAAA,CACF;IAEO,cAAc,CACrB,MAAmC,EACnC,MAA8B,EAC9B,UAAkB,EAClB,eAAmC,EAC5B;QACP,MAAM,eAAe,GAAG,eAAe;YACtC,CAAC,CAAC,yBAAyB,CAAC,eAAe,EAAE,0BAA0B,EAAE,gCAAgC,CAAC;YAC1G,CAAC,CAAC,SAAS,CAAC;QACb,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1F,IACC,CAAC,KAAK;gBACN,KAAK,CAAC,YAAY,KAAK,MAAM,CAAC,YAAY;gBAC1C,KAAK,CAAC,gBAAgB,KAAK,MAAM,CAAC,gBAAgB;gBAClD,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS;gBACxC,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY,EAC7C,CAAC;gBACF,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;YACrF,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;YAC/G,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;YACtB,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;YAC9B,KAAK,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;YACxB,IAAI,eAAe;gBAAE,KAAK,CAAC,eAAe,GAAG,eAAe,CAAC;YAC7D,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAAA,CAC1B,CAAC,CAAC;IAAA,CACH;IAEO,UAAU,GAAqB;QACtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACtG,CAAC;QACD,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,EAAE,uBAAuB,CAAC,CAAC;QACnG,IAAI,GAAY,CAAC;QACjB,IAAI,CAAC;YACJ,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAAA,CACxC;IAEO,WAAW,CAAC,OAAyB,EAAQ;QACpD,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;QAClD,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,iBAAiB,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACvE,CAAC;QACD,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAAA,CAChE;IAEO,aAAa,CAAC,KAA4B,EAAE,iBAAiB,GAAG,KAAK,EAAkC;QAC9G,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO;gBACN,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;gBACxC,UAAU,EAAE,iBAAiB;oBAC5B,CAAC,CAAC,+CAA+C;oBACjD,CAAC,CAAC,+BAA+B;gBAClC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5E,CAAC;QACH,CAAC;QACD,OAAO;YACN,IAAI,EAAE,qBAAqB;YAC3B,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,UAAU,EAAE,iBAAiB;gBAC5B,CAAC,CAAC,+CAA+C;gBACjD,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW;oBAC7B,CAAC,CAAC,iCAAiC;oBACnC,CAAC,CAAC,iCAAiC;YACrC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC;IAAA,CACF;CACD","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { workerActionJournalFile } from \"../agent-paths.ts\";\nimport { withFileLockSync, writeFileAtomicSync } from \"../util/atomic-file.ts\";\nimport { readBoundedTextFileSync } from \"../util/bounded-file.ts\";\nimport { requireBoundedTrimmedText } from \"../util/bounded-value.ts\";\n\nconst JOURNAL_SCHEMA_VERSION = 1;\nconst MAX_IDENTIFIER_CHARS = 256;\nconst MAX_TARGET_CHARS = 2048;\nconst MAX_REASON_CHARS = 512;\nconst MAX_EVIDENCE_POINTER_CHARS = 512;\nconst MAX_ENTRIES = 64;\nconst MAX_JOURNAL_BYTES = 256 * 1024;\n\nexport type WorkerActionJournalState = \"not_started\" | \"unknown\" | \"succeeded\" | \"failed\";\n\nexport interface WorkerActionJournalScope {\n\tagentDir: string;\n\tparentSessionId: string;\n\ttaskId: string;\n\tattemptId: string;\n\tfencingToken: number;\n}\n\nexport interface WorkerActionJournalAction {\n\top: \"write\" | \"edit\";\n\tpath: string;\n\tcontent?: string;\n\told?: string;\n\tnew?: string;\n}\n\nexport interface BeginWorkerActionInput {\n\tindex: number;\n\taction: WorkerActionJournalAction;\n\t/** Realpath-resolved target used by the executor, never model-provided text alone. */\n\ttargetPath: string;\n}\n\nexport interface WorkerActionExecutionPermit {\n\tkind: \"execute\";\n\tstate: \"not_started\";\n\tactionId: string;\n\tactionDigest: string;\n\tnormalizedTarget: string;\n}\n\nexport interface WorkerActionInspectionRequired {\n\tkind: \"inspection_required\";\n\tstate: Exclude<WorkerActionJournalState, \"not_started\">;\n\tactionId: string;\n\tactionDigest: string;\n\tnormalizedTarget: string;\n\treasonCode: string;\n\tevidencePointer?: string;\n}\n\nexport type BeginWorkerActionResult = WorkerActionExecutionPermit | WorkerActionInspectionRequired;\n\nexport interface WorkerActionJournalInspection {\n\tstate: WorkerActionJournalState;\n\tactionId: string;\n\tactionDigest?: string;\n\tnormalizedTarget?: string;\n\treasonCode?: string;\n\tevidencePointer?: string;\n}\n\ninterface PersistedJournalEntry {\n\tactionId: string;\n\tactionDigest: string;\n\tindex: number;\n\tattemptId: string;\n\tfencingToken: number;\n\toperation: \"write\" | \"edit\";\n\tnormalizedTarget: string;\n\tstatus: \"intent\" | \"succeeded\" | \"failed\";\n\tcreatedAt: string;\n\tupdatedAt: string;\n\treasonCode?: string;\n\tevidencePointer?: string;\n}\n\ninterface PersistedJournal {\n\tschemaVersion: number;\n\tscope: WorkerActionJournalIdentity;\n\tentries: PersistedJournalEntry[];\n}\n\ninterface WorkerActionJournalIdentity {\n\tparentSessionId: string;\n\ttaskId: string;\n}\n\nfunction safeFencingToken(value: unknown): number {\n\tif (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 1)\n\t\tthrow new TypeError(\"Worker action journal fencing token must be a positive safe integer.\");\n\treturn value;\n}\n\nfunction validateScope(scope: WorkerActionJournalScope): Omit<WorkerActionJournalScope, \"agentDir\"> {\n\treturn {\n\t\tparentSessionId: requireBoundedTrimmedText(scope.parentSessionId, MAX_IDENTIFIER_CHARS, \"Parent session id\"),\n\t\ttaskId: requireBoundedTrimmedText(scope.taskId, MAX_IDENTIFIER_CHARS, \"Task id\"),\n\t\tattemptId: requireBoundedTrimmedText(scope.attemptId, MAX_IDENTIFIER_CHARS, \"Attempt id\"),\n\t\tfencingToken: safeFencingToken(scope.fencingToken),\n\t};\n}\n\nfunction journalIdentity(scope: Omit<WorkerActionJournalScope, \"agentDir\">): WorkerActionJournalIdentity {\n\treturn { parentSessionId: scope.parentSessionId, taskId: scope.taskId };\n}\n\nfunction scopeDigest(scope: WorkerActionJournalIdentity): string {\n\treturn createHash(\"sha256\")\n\t\t.update(\"pi-worker-action-journal-scope-v1\")\n\t\t.update(\"\\0\")\n\t\t.update(scope.parentSessionId)\n\t\t.update(\"\\0\")\n\t\t.update(scope.taskId)\n\t\t.update(\"\\0\")\n\t\t.digest(\"hex\");\n}\n\nfunction usesWindowsPath(value: string): boolean {\n\treturn /^[a-zA-Z]:([\\\\/]|$)/.test(value) || value.startsWith(\"\\\\\\\\\") || value.startsWith(\"//\");\n}\n\n/** Canonical lexical identity for an already-authorized real target, including native Windows paths. */\nexport function normalizeWorkerActionTarget(cwd: string, targetPath: string): string {\n\tconst pathApi = usesWindowsPath(cwd) || usesWindowsPath(targetPath) ? path.win32 : path.posix;\n\tconst normalized = pathApi.resolve(cwd, targetPath);\n\treturn pathApi === path.win32 ? normalized.toLowerCase() : normalized;\n}\n\nfunction actionDigest(input: BeginWorkerActionInput, normalizedTarget: string): string {\n\tconst hash = createHash(\"sha256\");\n\thash.update(\"pi-worker-action-v1\");\n\thash.update(\"\\0\");\n\thash.update(input.action.op);\n\thash.update(\"\\0\");\n\thash.update(normalizedTarget);\n\thash.update(\"\\0\");\n\tif (input.action.op === \"write\") {\n\t\thash.update(input.action.content ?? \"\");\n\t} else {\n\t\thash.update(input.action.old ?? \"\");\n\t\thash.update(\"\\0\");\n\t\thash.update(input.action.new ?? \"\");\n\t}\n\treturn hash.digest(\"hex\");\n}\n\nfunction actionId(scope: Omit<WorkerActionJournalScope, \"agentDir\">, index: number, digest: string): string {\n\treturn createHash(\"sha256\")\n\t\t.update(\"pi-worker-action-id-v1\")\n\t\t.update(\"\\0\")\n\t\t.update(scope.attemptId)\n\t\t.update(\"\\0\")\n\t\t.update(String(scope.fencingToken))\n\t\t.update(\"\\0\")\n\t\t.update(String(index))\n\t\t.update(\"\\0\")\n\t\t.update(digest)\n\t\t.digest(\"hex\")\n\t\t.slice(0, 40);\n}\n\nfunction stringValue(value: unknown, label: string, maximum: number): string {\n\tif (typeof value !== \"string\" || value.length === 0 || value.length > maximum) {\n\t\tthrow new Error(`Worker action journal ${label} is invalid.`);\n\t}\n\treturn value;\n}\n\nfunction objectValue(value: unknown, label: string): Record<string, unknown> {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value))\n\t\tthrow new Error(`Worker action journal ${label} is invalid.`);\n\treturn value as Record<string, unknown>;\n}\n\nfunction parseEntry(value: unknown): PersistedJournalEntry {\n\tconst entry = objectValue(value, \"entry\");\n\tconst index = entry.index;\n\tif (typeof index !== \"number\" || !Number.isSafeInteger(index) || index < 0)\n\t\tthrow new Error(\"Worker action journal entry index is invalid.\");\n\tconst parsedIndex = index;\n\tconst operation = entry.operation;\n\tconst status = entry.status;\n\tif (\n\t\t(operation !== \"write\" && operation !== \"edit\") ||\n\t\t(status !== \"intent\" && status !== \"succeeded\" && status !== \"failed\")\n\t) {\n\t\tthrow new Error(\"Worker action journal entry shape is invalid.\");\n\t}\n\tconst reasonCode = entry.reasonCode;\n\tconst evidencePointer = entry.evidencePointer;\n\tif (reasonCode !== undefined && (typeof reasonCode !== \"string\" || reasonCode.length > MAX_REASON_CHARS)) {\n\t\tthrow new Error(\"Worker action journal entry reason is invalid.\");\n\t}\n\tif (\n\t\tevidencePointer !== undefined &&\n\t\t(typeof evidencePointer !== \"string\" || evidencePointer.length > MAX_EVIDENCE_POINTER_CHARS)\n\t) {\n\t\tthrow new Error(\"Worker action journal entry evidence pointer is invalid.\");\n\t}\n\treturn {\n\t\tactionId: stringValue(entry.actionId, \"entry action id\", 128),\n\t\tactionDigest: stringValue(entry.actionDigest, \"entry action digest\", 128),\n\t\tindex: parsedIndex,\n\t\tattemptId: stringValue(entry.attemptId, \"entry attempt id\", MAX_IDENTIFIER_CHARS),\n\t\tfencingToken: safeFencingToken(entry.fencingToken),\n\t\toperation,\n\t\tnormalizedTarget: stringValue(entry.normalizedTarget, \"entry target\", MAX_TARGET_CHARS),\n\t\tstatus,\n\t\tcreatedAt: stringValue(entry.createdAt, \"entry created time\", 128),\n\t\tupdatedAt: stringValue(entry.updatedAt, \"entry updated time\", 128),\n\t\t...(reasonCode ? { reasonCode } : {}),\n\t\t...(evidencePointer ? { evidencePointer } : {}),\n\t};\n}\n\nfunction parseJournal(value: unknown, expectedScope: WorkerActionJournalIdentity): PersistedJournal {\n\tconst journal = objectValue(value, \"document\");\n\tif (journal.schemaVersion !== JOURNAL_SCHEMA_VERSION)\n\t\tthrow new Error(\"Worker action journal schema is unsupported.\");\n\tconst scope = objectValue(journal.scope, \"scope\");\n\tconst parsedScope = {\n\t\tparentSessionId: stringValue(scope.parentSessionId, \"scope parent session\", MAX_IDENTIFIER_CHARS),\n\t\ttaskId: stringValue(scope.taskId, \"scope task\", MAX_IDENTIFIER_CHARS),\n\t};\n\tif (parsedScope.parentSessionId !== expectedScope.parentSessionId || parsedScope.taskId !== expectedScope.taskId) {\n\t\tthrow new Error(\"Worker action journal scope conflicts with the current fenced attempt.\");\n\t}\n\tif (!Array.isArray(journal.entries) || journal.entries.length > MAX_ENTRIES) {\n\t\tthrow new Error(\"Worker action journal entries are invalid.\");\n\t}\n\tconst entries = journal.entries.map(parseEntry);\n\tif (new Set(entries.map((entry) => entry.actionId)).size !== entries.length) {\n\t\tthrow new Error(\"Worker action journal contains duplicate action identities.\");\n\t}\n\treturn { schemaVersion: JOURNAL_SCHEMA_VERSION, scope: parsedScope, entries };\n}\n\nfunction now(): string {\n\treturn new Date().toISOString();\n}\n\n/**\n * Durable intent/receipt journal for model-emitted structured mutations. It deliberately records\n * only action digests and normalized targets; operation payloads can contain source text or secrets\n * and must never leave the model result in persisted orchestration state.\n */\nexport class WorkerActionJournal {\n\treadonly agentDir: string;\n\treadonly filePath: string;\n\tprivate readonly scope: Omit<WorkerActionJournalScope, \"agentDir\">;\n\tprivate readonly identity: WorkerActionJournalIdentity;\n\n\tconstructor(scope: WorkerActionJournalScope) {\n\t\tthis.agentDir = requireBoundedTrimmedText(scope.agentDir, MAX_TARGET_CHARS, \"Agent directory\");\n\t\tthis.scope = validateScope(scope);\n\t\tthis.identity = journalIdentity(this.scope);\n\t\tthis.filePath = workerActionJournalFile(this.agentDir, this.scope.parentSessionId, scopeDigest(this.identity));\n\t}\n\n\tinspect(actionIdentity: string): WorkerActionJournalInspection {\n\t\tconst actionId = requireBoundedTrimmedText(actionIdentity, 128, \"Worker action id\");\n\t\treturn withFileLockSync(this.filePath, () => {\n\t\t\tconst entry = this.readLocked().entries.find((candidate) => candidate.actionId === actionId);\n\t\t\tif (!entry) return { state: \"not_started\", actionId };\n\t\t\treturn this.inspectionFor(entry);\n\t\t});\n\t}\n\n\tbegin(input: BeginWorkerActionInput): BeginWorkerActionResult {\n\t\tif (!Number.isSafeInteger(input.index) || input.index < 0 || input.index >= MAX_ENTRIES) {\n\t\t\tthrow new TypeError(`Worker action index must be a safe integer from 0 through ${MAX_ENTRIES - 1}.`);\n\t\t}\n\t\tconst normalizedTarget = normalizeWorkerActionTarget(this.agentDir, input.targetPath);\n\t\tif (normalizedTarget.length > MAX_TARGET_CHARS) throw new TypeError(\"Worker action target is too long.\");\n\t\tconst digest = actionDigest(input, normalizedTarget);\n\t\tconst id = actionId(this.scope, input.index, digest);\n\t\treturn withFileLockSync(this.filePath, () => {\n\t\t\tconst journal = this.readLocked();\n\t\t\tconst existing = journal.entries.find((entry) => entry.actionId === id);\n\t\t\tif (existing) {\n\t\t\t\tif (existing.actionDigest !== digest) throw new Error(\"Worker action journal action identity collision.\");\n\t\t\t\treturn this.inspectionFor(existing);\n\t\t\t}\n\t\t\tconst previousFence = journal.entries.find(\n\t\t\t\t(entry) =>\n\t\t\t\t\tentry.actionDigest === digest &&\n\t\t\t\t\tentry.operation === input.action.op &&\n\t\t\t\t\tentry.normalizedTarget === normalizedTarget,\n\t\t\t);\n\t\t\tif (previousFence) return this.inspectionFor(previousFence, true);\n\t\t\tconst timestamp = now();\n\t\t\tjournal.entries.push({\n\t\t\t\tactionId: id,\n\t\t\t\tactionDigest: digest,\n\t\t\t\tindex: input.index,\n\t\t\t\tattemptId: this.scope.attemptId,\n\t\t\t\tfencingToken: this.scope.fencingToken,\n\t\t\t\toperation: input.action.op,\n\t\t\t\tnormalizedTarget,\n\t\t\t\tstatus: \"intent\",\n\t\t\t\tcreatedAt: timestamp,\n\t\t\t\tupdatedAt: timestamp,\n\t\t\t});\n\t\t\tthis.writeLocked(journal);\n\t\t\treturn { kind: \"execute\", state: \"not_started\", actionId: id, actionDigest: digest, normalizedTarget };\n\t\t});\n\t}\n\n\trecordSucceeded(permit: WorkerActionExecutionPermit, options: { evidencePointer?: string } = {}): void {\n\t\tthis.recordTerminal(permit, \"succeeded\", \"worker_action_applied\", options.evidencePointer);\n\t}\n\n\trecordFailed(\n\t\tpermit: WorkerActionExecutionPermit,\n\t\treasonCode: string,\n\t\toptions: { evidencePointer?: string } = {},\n\t): void {\n\t\tthis.recordTerminal(\n\t\t\tpermit,\n\t\t\t\"failed\",\n\t\t\trequireBoundedTrimmedText(reasonCode, MAX_REASON_CHARS, \"Worker action failure reason\"),\n\t\t\toptions.evidencePointer,\n\t\t);\n\t}\n\n\tprivate recordTerminal(\n\t\tpermit: WorkerActionExecutionPermit,\n\t\tstatus: \"succeeded\" | \"failed\",\n\t\treasonCode: string,\n\t\tevidencePointer: string | undefined,\n\t): void {\n\t\tconst boundedEvidence = evidencePointer\n\t\t\t? requireBoundedTrimmedText(evidencePointer, MAX_EVIDENCE_POINTER_CHARS, \"Worker action evidence pointer\")\n\t\t\t: undefined;\n\t\twithFileLockSync(this.filePath, () => {\n\t\t\tconst journal = this.readLocked();\n\t\t\tconst entry = journal.entries.find((candidate) => candidate.actionId === permit.actionId);\n\t\t\tif (\n\t\t\t\t!entry ||\n\t\t\t\tentry.actionDigest !== permit.actionDigest ||\n\t\t\t\tentry.normalizedTarget !== permit.normalizedTarget ||\n\t\t\t\tentry.attemptId !== this.scope.attemptId ||\n\t\t\t\tentry.fencingToken !== this.scope.fencingToken\n\t\t\t) {\n\t\t\t\tthrow new Error(\"Worker action journal receipt does not match a persisted intent.\");\n\t\t\t}\n\t\t\tif (entry.status !== \"intent\") throw new Error(\"Worker action journal intent already has a terminal receipt.\");\n\t\t\tentry.status = status;\n\t\t\tentry.reasonCode = reasonCode;\n\t\t\tentry.updatedAt = now();\n\t\t\tif (boundedEvidence) entry.evidencePointer = boundedEvidence;\n\t\t\tthis.writeLocked(journal);\n\t\t});\n\t}\n\n\tprivate readLocked(): PersistedJournal {\n\t\tif (!existsSync(this.filePath)) {\n\t\t\treturn { schemaVersion: JOURNAL_SCHEMA_VERSION, scope: structuredClone(this.identity), entries: [] };\n\t\t}\n\t\tconst content = readBoundedTextFileSync(this.filePath, MAX_JOURNAL_BYTES, \"Worker action journal\");\n\t\tlet raw: unknown;\n\t\ttry {\n\t\t\traw = JSON.parse(content);\n\t\t} catch {\n\t\t\tthrow new Error(\"Worker action journal is unreadable; refusing mutation replay.\");\n\t\t}\n\t\treturn parseJournal(raw, this.identity);\n\t}\n\n\tprivate writeLocked(journal: PersistedJournal): void {\n\t\tconst serialized = `${JSON.stringify(journal)}\\n`;\n\t\tif (Buffer.byteLength(serialized, \"utf-8\") > MAX_JOURNAL_BYTES) {\n\t\t\tthrow new Error(\"Worker action journal would exceed its byte limit.\");\n\t\t}\n\t\twriteFileAtomicSync(this.filePath, serialized, { mode: 0o600 });\n\t}\n\n\tprivate inspectionFor(entry: PersistedJournalEntry, fromPreviousFence = false): WorkerActionInspectionRequired {\n\t\tif (entry.status === \"intent\") {\n\t\t\treturn {\n\t\t\t\tkind: \"inspection_required\",\n\t\t\t\tstate: \"unknown\",\n\t\t\t\tactionId: entry.actionId,\n\t\t\t\tactionDigest: entry.actionDigest,\n\t\t\t\tnormalizedTarget: entry.normalizedTarget,\n\t\t\t\treasonCode: fromPreviousFence\n\t\t\t\t\t? \"worker_action_prior_fence_requires_inspection\"\n\t\t\t\t\t: \"worker_action_outcome_unknown\",\n\t\t\t\t...(entry.evidencePointer ? { evidencePointer: entry.evidencePointer } : {}),\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"inspection_required\",\n\t\t\tstate: entry.status,\n\t\t\tactionId: entry.actionId,\n\t\t\tactionDigest: entry.actionDigest,\n\t\t\tnormalizedTarget: entry.normalizedTarget,\n\t\t\treasonCode: fromPreviousFence\n\t\t\t\t? \"worker_action_prior_fence_requires_inspection\"\n\t\t\t\t: entry.status === \"succeeded\"\n\t\t\t\t\t? \"worker_action_already_succeeded\"\n\t\t\t\t\t: \"worker_action_previously_failed\",\n\t\t\t...(entry.evidencePointer ? { evidencePointer: entry.evidencePointer } : {}),\n\t\t};\n\t}\n}\n"]}
1
+ {"version":3,"file":"worker-action-journal.js","sourceRoot":"","sources":["../../../src/core/delegation/worker-action-journal.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { workerActionJournalFile } from \"../agent-paths.ts\";\nimport { withFileLockSync, writeFileAtomicSync } from \"../util/atomic-file.ts\";\nimport { readBoundedTextFileSync } from \"../util/bounded-file.ts\";\nimport { requireBoundedTrimmedText } from \"../util/bounded-value.ts\";\n\nconst JOURNAL_SCHEMA_VERSION = 1;\nconst MAX_IDENTIFIER_CHARS = 256;\nconst MAX_TARGET_CHARS = 2048;\nconst MAX_REASON_CHARS = 512;\nconst MAX_EVIDENCE_POINTER_CHARS = 512;\nconst MAX_ENTRIES = 64;\nconst MAX_JOURNAL_BYTES = 256 * 1024;\n\nexport type WorkerActionJournalState = \"not_started\" | \"unknown\" | \"succeeded\" | \"failed\";\n\nexport interface WorkerActionJournalScope {\n\tagentDir: string;\n\tparentSessionId: string;\n\ttaskId: string;\n\tattemptId: string;\n\tfencingToken: number;\n}\n\nexport interface WorkerActionJournalAction {\n\top: \"write\" | \"edit\";\n\tpath: string;\n\tcontent?: string;\n\told?: string;\n\tnew?: string;\n}\n\nexport interface BeginWorkerActionInput {\n\tindex: number;\n\taction: WorkerActionJournalAction;\n\t/** Realpath-resolved target used by the executor, never model-provided text alone. */\n\ttargetPath: string;\n}\n\nexport interface WorkerActionExecutionPermit {\n\tkind: \"execute\";\n\tstate: \"not_started\";\n\tactionId: string;\n\tactionDigest: string;\n\tnormalizedTarget: string;\n}\n\nexport interface WorkerActionInspectionRequired {\n\tkind: \"inspection_required\";\n\tstate: Exclude<WorkerActionJournalState, \"not_started\">;\n\tactionId: string;\n\tactionDigest: string;\n\tnormalizedTarget: string;\n\treasonCode: string;\n\tevidencePointer?: string;\n}\n\nexport type BeginWorkerActionResult = WorkerActionExecutionPermit | WorkerActionInspectionRequired;\n\nexport interface WorkerActionJournalInspection {\n\tstate: WorkerActionJournalState;\n\tactionId: string;\n\tactionDigest?: string;\n\tnormalizedTarget?: string;\n\treasonCode?: string;\n\tevidencePointer?: string;\n}\n\ninterface PersistedJournalEntry {\n\tactionId: string;\n\tactionDigest: string;\n\tindex: number;\n\tattemptId: string;\n\tfencingToken: number;\n\toperation: \"write\" | \"edit\";\n\tnormalizedTarget: string;\n\tstatus: \"intent\" | \"succeeded\" | \"failed\";\n\tcreatedAt: string;\n\tupdatedAt: string;\n\treasonCode?: string;\n\tevidencePointer?: string;\n}\n\ninterface PersistedJournal {\n\tschemaVersion: number;\n\tscope: WorkerActionJournalIdentity;\n\tentries: PersistedJournalEntry[];\n}\n\ninterface WorkerActionJournalIdentity {\n\tparentSessionId: string;\n\ttaskId: string;\n}\n\nfunction safeFencingToken(value: unknown): number {\n\tif (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 1)\n\t\tthrow new TypeError(\"Worker action journal fencing token must be a positive safe integer.\");\n\treturn value;\n}\n\nfunction validateScope(scope: WorkerActionJournalScope): Omit<WorkerActionJournalScope, \"agentDir\"> {\n\treturn {\n\t\tparentSessionId: requireBoundedTrimmedText(scope.parentSessionId, MAX_IDENTIFIER_CHARS, \"Parent session id\"),\n\t\ttaskId: requireBoundedTrimmedText(scope.taskId, MAX_IDENTIFIER_CHARS, \"Task id\"),\n\t\tattemptId: requireBoundedTrimmedText(scope.attemptId, MAX_IDENTIFIER_CHARS, \"Attempt id\"),\n\t\tfencingToken: safeFencingToken(scope.fencingToken),\n\t};\n}\n\nfunction journalIdentity(scope: Omit<WorkerActionJournalScope, \"agentDir\">): WorkerActionJournalIdentity {\n\treturn { parentSessionId: scope.parentSessionId, taskId: scope.taskId };\n}\n\nfunction scopeDigest(scope: WorkerActionJournalIdentity): string {\n\treturn createHash(\"sha256\")\n\t\t.update(\"pi-worker-action-journal-scope-v1\")\n\t\t.update(\"\\0\")\n\t\t.update(scope.parentSessionId)\n\t\t.update(\"\\0\")\n\t\t.update(scope.taskId)\n\t\t.update(\"\\0\")\n\t\t.digest(\"hex\");\n}\n\nfunction usesWindowsPath(value: string): boolean {\n\treturn /^[a-zA-Z]:([\\\\/]|$)/.test(value) || value.startsWith(\"\\\\\\\\\") || value.startsWith(\"//\");\n}\n\n/** Canonical lexical identity for an already-authorized real target, including native Windows paths. */\nexport function normalizeWorkerActionTarget(cwd: string, targetPath: string): string {\n\tconst pathApi = usesWindowsPath(cwd) || usesWindowsPath(targetPath) ? path.win32 : path.posix;\n\tconst normalized = pathApi.resolve(cwd, targetPath);\n\treturn pathApi === path.win32 ? normalized.toLowerCase() : normalized;\n}\n\nfunction actionDigest(input: BeginWorkerActionInput, normalizedTarget: string): string {\n\tconst hash = createHash(\"sha256\");\n\thash.update(\"pi-worker-action-v1\");\n\thash.update(\"\\0\");\n\thash.update(input.action.op);\n\thash.update(\"\\0\");\n\thash.update(normalizedTarget);\n\thash.update(\"\\0\");\n\tif (input.action.op === \"write\") {\n\t\thash.update(input.action.content ?? \"\");\n\t} else {\n\t\thash.update(input.action.old ?? \"\");\n\t\thash.update(\"\\0\");\n\t\thash.update(input.action.new ?? \"\");\n\t}\n\treturn hash.digest(\"hex\");\n}\n\nfunction actionId(scope: Omit<WorkerActionJournalScope, \"agentDir\">, index: number, digest: string): string {\n\treturn createHash(\"sha256\")\n\t\t.update(\"pi-worker-action-id-v1\")\n\t\t.update(\"\\0\")\n\t\t.update(scope.attemptId)\n\t\t.update(\"\\0\")\n\t\t.update(String(scope.fencingToken))\n\t\t.update(\"\\0\")\n\t\t.update(String(index))\n\t\t.update(\"\\0\")\n\t\t.update(digest)\n\t\t.digest(\"hex\")\n\t\t.slice(0, 40);\n}\n\nfunction stringValue(value: unknown, label: string, maximum: number): string {\n\tif (typeof value !== \"string\" || value.length === 0 || value.length > maximum) {\n\t\tthrow new Error(`Worker action journal ${label} is invalid.`);\n\t}\n\treturn value;\n}\n\nfunction objectValue(value: unknown, label: string): Record<string, unknown> {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value))\n\t\tthrow new Error(`Worker action journal ${label} is invalid.`);\n\treturn value as Record<string, unknown>;\n}\n\nfunction parseEntry(value: unknown): PersistedJournalEntry {\n\tconst entry = objectValue(value, \"entry\");\n\tconst index = entry.index;\n\tif (typeof index !== \"number\" || !Number.isSafeInteger(index) || index < 0)\n\t\tthrow new Error(\"Worker action journal entry index is invalid.\");\n\tconst parsedIndex = index;\n\tconst operation = entry.operation;\n\tconst status = entry.status;\n\tif (\n\t\t(operation !== \"write\" && operation !== \"edit\") ||\n\t\t(status !== \"intent\" && status !== \"succeeded\" && status !== \"failed\")\n\t) {\n\t\tthrow new Error(\"Worker action journal entry shape is invalid.\");\n\t}\n\tconst reasonCode = entry.reasonCode;\n\tconst evidencePointer = entry.evidencePointer;\n\tif (reasonCode !== undefined && (typeof reasonCode !== \"string\" || reasonCode.length > MAX_REASON_CHARS)) {\n\t\tthrow new Error(\"Worker action journal entry reason is invalid.\");\n\t}\n\tif (\n\t\tevidencePointer !== undefined &&\n\t\t(typeof evidencePointer !== \"string\" || evidencePointer.length > MAX_EVIDENCE_POINTER_CHARS)\n\t) {\n\t\tthrow new Error(\"Worker action journal entry evidence pointer is invalid.\");\n\t}\n\treturn {\n\t\tactionId: stringValue(entry.actionId, \"entry action id\", 128),\n\t\tactionDigest: stringValue(entry.actionDigest, \"entry action digest\", 128),\n\t\tindex: parsedIndex,\n\t\tattemptId: stringValue(entry.attemptId, \"entry attempt id\", MAX_IDENTIFIER_CHARS),\n\t\tfencingToken: safeFencingToken(entry.fencingToken),\n\t\toperation,\n\t\tnormalizedTarget: stringValue(entry.normalizedTarget, \"entry target\", MAX_TARGET_CHARS),\n\t\tstatus,\n\t\tcreatedAt: stringValue(entry.createdAt, \"entry created time\", 128),\n\t\tupdatedAt: stringValue(entry.updatedAt, \"entry updated time\", 128),\n\t\t...(reasonCode ? { reasonCode } : {}),\n\t\t...(evidencePointer ? { evidencePointer } : {}),\n\t};\n}\n\nfunction parseJournal(value: unknown, expectedScope: WorkerActionJournalIdentity): PersistedJournal {\n\tconst journal = objectValue(value, \"document\");\n\tif (journal.schemaVersion !== JOURNAL_SCHEMA_VERSION)\n\t\tthrow new Error(\"Worker action journal schema is unsupported.\");\n\tconst scope = objectValue(journal.scope, \"scope\");\n\tconst parsedScope = {\n\t\tparentSessionId: stringValue(scope.parentSessionId, \"scope parent session\", MAX_IDENTIFIER_CHARS),\n\t\ttaskId: stringValue(scope.taskId, \"scope task\", MAX_IDENTIFIER_CHARS),\n\t};\n\tif (parsedScope.parentSessionId !== expectedScope.parentSessionId || parsedScope.taskId !== expectedScope.taskId) {\n\t\tthrow new Error(\"Worker action journal scope conflicts with the current fenced attempt.\");\n\t}\n\tif (!Array.isArray(journal.entries) || journal.entries.length > MAX_ENTRIES) {\n\t\tthrow new Error(\"Worker action journal entries are invalid.\");\n\t}\n\tconst entries = journal.entries.map(parseEntry);\n\tif (new Set(entries.map((entry) => entry.actionId)).size !== entries.length) {\n\t\tthrow new Error(\"Worker action journal contains duplicate action identities.\");\n\t}\n\treturn { schemaVersion: JOURNAL_SCHEMA_VERSION, scope: parsedScope, entries };\n}\n\nfunction now(): string {\n\treturn new Date().toISOString();\n}\n\n/**\n * Durable intent/receipt journal for model-emitted structured mutations. It deliberately records\n * only action digests and normalized targets; operation payloads can contain source text or secrets\n * and must never leave the model result in persisted orchestration state.\n */\nexport class WorkerActionJournal {\n\treadonly agentDir: string;\n\treadonly filePath: string;\n\tprivate readonly scope: Omit<WorkerActionJournalScope, \"agentDir\">;\n\tprivate readonly identity: WorkerActionJournalIdentity;\n\n\tconstructor(scope: WorkerActionJournalScope) {\n\t\tthis.agentDir = requireBoundedTrimmedText(scope.agentDir, MAX_TARGET_CHARS, \"Agent directory\");\n\t\tthis.scope = validateScope(scope);\n\t\tthis.identity = journalIdentity(this.scope);\n\t\tthis.filePath = workerActionJournalFile(this.agentDir, this.scope.parentSessionId, scopeDigest(this.identity));\n\t}\n\n\tinspect(actionIdentity: string): WorkerActionJournalInspection {\n\t\tconst actionId = requireBoundedTrimmedText(actionIdentity, 128, \"Worker action id\");\n\t\treturn withFileLockSync(this.filePath, () => {\n\t\t\tconst entry = this.readLocked().entries.find((candidate) => candidate.actionId === actionId);\n\t\t\tif (!entry) return { state: \"not_started\", actionId };\n\t\t\treturn this.inspectionFor(entry);\n\t\t});\n\t}\n\n\tbegin(input: BeginWorkerActionInput): BeginWorkerActionResult {\n\t\tif (!Number.isSafeInteger(input.index) || input.index < 0 || input.index >= MAX_ENTRIES) {\n\t\t\tthrow new TypeError(`Worker action index must be a safe integer from 0 through ${MAX_ENTRIES - 1}.`);\n\t\t}\n\t\tconst normalizedTarget = normalizeWorkerActionTarget(this.agentDir, input.targetPath);\n\t\tif (normalizedTarget.length > MAX_TARGET_CHARS) throw new TypeError(\"Worker action target is too long.\");\n\t\tconst digest = actionDigest(input, normalizedTarget);\n\t\tconst id = actionId(this.scope, input.index, digest);\n\t\treturn withFileLockSync(this.filePath, () => {\n\t\t\tconst journal = this.readLocked();\n\t\t\tconst existing = journal.entries.find((entry) => entry.actionId === id);\n\t\t\tif (existing) {\n\t\t\t\tif (existing.actionDigest !== digest) throw new Error(\"Worker action journal action identity collision.\");\n\t\t\t\treturn this.inspectionFor(existing);\n\t\t\t}\n\t\t\tconst previousFence = journal.entries.find(\n\t\t\t\t(entry) =>\n\t\t\t\t\tentry.actionDigest === digest &&\n\t\t\t\t\tentry.operation === input.action.op &&\n\t\t\t\t\tentry.normalizedTarget === normalizedTarget,\n\t\t\t);\n\t\t\tif (previousFence) return this.inspectionFor(previousFence, true);\n\t\t\tconst timestamp = now();\n\t\t\tjournal.entries.push({\n\t\t\t\tactionId: id,\n\t\t\t\tactionDigest: digest,\n\t\t\t\tindex: input.index,\n\t\t\t\tattemptId: this.scope.attemptId,\n\t\t\t\tfencingToken: this.scope.fencingToken,\n\t\t\t\toperation: input.action.op,\n\t\t\t\tnormalizedTarget,\n\t\t\t\tstatus: \"intent\",\n\t\t\t\tcreatedAt: timestamp,\n\t\t\t\tupdatedAt: timestamp,\n\t\t\t});\n\t\t\tthis.writeLocked(journal);\n\t\t\treturn { kind: \"execute\", state: \"not_started\", actionId: id, actionDigest: digest, normalizedTarget };\n\t\t});\n\t}\n\n\trecordSucceeded(permit: WorkerActionExecutionPermit, options: { evidencePointer?: string } = {}): void {\n\t\tthis.recordTerminal(permit, \"succeeded\", \"worker_action_applied\", options.evidencePointer);\n\t}\n\n\trecordFailed(\n\t\tpermit: WorkerActionExecutionPermit,\n\t\treasonCode: string,\n\t\toptions: { evidencePointer?: string } = {},\n\t): void {\n\t\tthis.recordTerminal(\n\t\t\tpermit,\n\t\t\t\"failed\",\n\t\t\trequireBoundedTrimmedText(reasonCode, MAX_REASON_CHARS, \"Worker action failure reason\"),\n\t\t\toptions.evidencePointer,\n\t\t);\n\t}\n\n\tprivate recordTerminal(\n\t\tpermit: WorkerActionExecutionPermit,\n\t\tstatus: \"succeeded\" | \"failed\",\n\t\treasonCode: string,\n\t\tevidencePointer: string | undefined,\n\t): void {\n\t\tconst boundedEvidence = evidencePointer\n\t\t\t? requireBoundedTrimmedText(evidencePointer, MAX_EVIDENCE_POINTER_CHARS, \"Worker action evidence pointer\")\n\t\t\t: undefined;\n\t\twithFileLockSync(this.filePath, () => {\n\t\t\tconst journal = this.readLocked();\n\t\t\tconst entry = journal.entries.find((candidate) => candidate.actionId === permit.actionId);\n\t\t\tif (\n\t\t\t\t!entry ||\n\t\t\t\tentry.actionDigest !== permit.actionDigest ||\n\t\t\t\tentry.normalizedTarget !== permit.normalizedTarget ||\n\t\t\t\tentry.attemptId !== this.scope.attemptId ||\n\t\t\t\tentry.fencingToken !== this.scope.fencingToken\n\t\t\t) {\n\t\t\t\tthrow new Error(\"Worker action journal receipt does not match a persisted intent.\");\n\t\t\t}\n\t\t\tif (entry.status !== \"intent\") throw new Error(\"Worker action journal intent already has a terminal receipt.\");\n\t\t\tentry.status = status;\n\t\t\tentry.reasonCode = reasonCode;\n\t\t\tentry.updatedAt = now();\n\t\t\tif (boundedEvidence) entry.evidencePointer = boundedEvidence;\n\t\t\tthis.writeLocked(journal);\n\t\t});\n\t}\n\n\tprivate readLocked(): PersistedJournal {\n\t\tif (!existsSync(this.filePath)) {\n\t\t\treturn { schemaVersion: JOURNAL_SCHEMA_VERSION, scope: structuredClone(this.identity), entries: [] };\n\t\t}\n\t\tconst content = readBoundedTextFileSync(this.filePath, MAX_JOURNAL_BYTES, \"Worker action journal\");\n\t\tlet raw: unknown;\n\t\ttry {\n\t\t\traw = JSON.parse(content);\n\t\t} catch {\n\t\t\tthrow new Error(\"Worker action journal is unreadable; refusing mutation replay.\");\n\t\t}\n\t\treturn parseJournal(raw, this.identity);\n\t}\n\n\tprivate writeLocked(journal: PersistedJournal): void {\n\t\tconst serialized = `${JSON.stringify(journal)}\\n`;\n\t\tif (Buffer.byteLength(serialized, \"utf-8\") > MAX_JOURNAL_BYTES) {\n\t\t\tthrow new Error(\"Worker action journal would exceed its byte limit.\");\n\t\t}\n\t\twriteFileAtomicSync(this.filePath, serialized, { mode: 0o600 });\n\t}\n\n\tprivate inspectionFor(entry: PersistedJournalEntry, fromPreviousFence = false): WorkerActionInspectionRequired {\n\t\tif (entry.status === \"intent\") {\n\t\t\treturn {\n\t\t\t\tkind: \"inspection_required\",\n\t\t\t\tstate: \"unknown\",\n\t\t\t\tactionId: entry.actionId,\n\t\t\t\tactionDigest: entry.actionDigest,\n\t\t\t\tnormalizedTarget: entry.normalizedTarget,\n\t\t\t\treasonCode: fromPreviousFence\n\t\t\t\t\t? \"worker_action_prior_fence_requires_inspection\"\n\t\t\t\t\t: \"worker_action_outcome_unknown\",\n\t\t\t\t...(entry.evidencePointer ? { evidencePointer: entry.evidencePointer } : {}),\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"inspection_required\",\n\t\t\tstate: entry.status,\n\t\t\tactionId: entry.actionId,\n\t\t\tactionDigest: entry.actionDigest,\n\t\t\tnormalizedTarget: entry.normalizedTarget,\n\t\t\treasonCode: fromPreviousFence\n\t\t\t\t? \"worker_action_prior_fence_requires_inspection\"\n\t\t\t\t: entry.status === \"succeeded\"\n\t\t\t\t\t? \"worker_action_already_succeeded\"\n\t\t\t\t\t: \"worker_action_previously_failed\",\n\t\t\t...(entry.evidencePointer ? { evidencePointer: entry.evidencePointer } : {}),\n\t\t};\n\t}\n}\n"]}