@caupulican/pi-adaptative 0.94.1 → 0.95.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/bundled-resources/extensions/tmux-agent-manager/README.md +32 -13
  3. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts +7 -4
  4. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts.map +1 -1
  5. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js +173 -293
  6. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js.map +1 -1
  7. package/dist/bundled-resources/extensions/tmux-agent-manager/index.ts +247 -392
  8. package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.d.ts +52 -0
  9. package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.d.ts.map +1 -0
  10. package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.js +118 -0
  11. package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.js.map +1 -0
  12. package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.ts +169 -0
  13. package/dist/bundled-resources/extensions/tmux-agent-manager/templates/builder-validator.json +1 -1
  14. package/dist/bundled-resources/extensions/tmux-agent-manager/templates/provider-prompt-smoke.json +1 -1
  15. package/dist/bundled-resources/skills/pi-harness-learning/SKILL.md +13 -7
  16. package/dist/bundled-resources/skills/worker-profile-writer/SKILL.md +11 -11
  17. package/dist/core/agent-session.d.ts +11 -41
  18. package/dist/core/agent-session.d.ts.map +1 -1
  19. package/dist/core/agent-session.js +93 -160
  20. package/dist/core/agent-session.js.map +1 -1
  21. package/dist/core/autonomy/envelope-enforcement.d.ts +6 -1
  22. package/dist/core/autonomy/envelope-enforcement.d.ts.map +1 -1
  23. package/dist/core/autonomy/envelope-enforcement.js +26 -25
  24. package/dist/core/autonomy/envelope-enforcement.js.map +1 -1
  25. package/dist/core/autonomy/lane-private-paths.d.ts.map +1 -1
  26. package/dist/core/autonomy/lane-private-paths.js +2 -1
  27. package/dist/core/autonomy/lane-private-paths.js.map +1 -1
  28. package/dist/core/autonomy/lane-tool-surface.d.ts +8 -8
  29. package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
  30. package/dist/core/autonomy/lane-tool-surface.js +45 -30
  31. package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
  32. package/dist/core/autonomy/worker-session-private-scope.d.ts +12 -0
  33. package/dist/core/autonomy/worker-session-private-scope.d.ts.map +1 -0
  34. package/dist/core/autonomy/worker-session-private-scope.js +42 -0
  35. package/dist/core/autonomy/worker-session-private-scope.js.map +1 -0
  36. package/dist/core/autonomy/worker-tool-adapter-registry.d.ts +65 -0
  37. package/dist/core/autonomy/worker-tool-adapter-registry.d.ts.map +1 -0
  38. package/dist/core/autonomy/worker-tool-adapter-registry.js +145 -0
  39. package/dist/core/autonomy/worker-tool-adapter-registry.js.map +1 -0
  40. package/dist/core/background-lane-controller.d.ts +1 -1
  41. package/dist/core/background-lane-controller.d.ts.map +1 -1
  42. package/dist/core/background-lane-controller.js +1 -1
  43. package/dist/core/background-lane-controller.js.map +1 -1
  44. package/dist/core/background-tool-task-controller.d.ts +8 -2
  45. package/dist/core/background-tool-task-controller.d.ts.map +1 -1
  46. package/dist/core/background-tool-task-controller.js +10 -2
  47. package/dist/core/background-tool-task-controller.js.map +1 -1
  48. package/dist/core/cost-guard-controller.d.ts +37 -0
  49. package/dist/core/cost-guard-controller.d.ts.map +1 -0
  50. package/dist/core/cost-guard-controller.js +71 -0
  51. package/dist/core/cost-guard-controller.js.map +1 -0
  52. package/dist/core/cost-guard.d.ts +9 -4
  53. package/dist/core/cost-guard.d.ts.map +1 -1
  54. package/dist/core/cost-guard.js +7 -3
  55. package/dist/core/cost-guard.js.map +1 -1
  56. package/dist/core/delegation/worker-attempt-executor.d.ts +1 -1
  57. package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
  58. package/dist/core/delegation/worker-attempt-executor.js +0 -1
  59. package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
  60. package/dist/core/delegation/worker-authority-resolver.d.ts +16 -3
  61. package/dist/core/delegation/worker-authority-resolver.d.ts.map +1 -1
  62. package/dist/core/delegation/worker-authority-resolver.js +114 -55
  63. package/dist/core/delegation/worker-authority-resolver.js.map +1 -1
  64. package/dist/core/delegation/worker-claim.d.ts +1 -2
  65. package/dist/core/delegation/worker-claim.d.ts.map +1 -1
  66. package/dist/core/delegation/worker-claim.js.map +1 -1
  67. package/dist/core/delegation/worker-delegation-controller.d.ts +19 -6
  68. package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
  69. package/dist/core/delegation/worker-delegation-controller.js +125 -40
  70. package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
  71. package/dist/core/delegation/worker-delegation-request.d.ts +3 -3
  72. package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -1
  73. package/dist/core/delegation/worker-delegation-request.js +13 -19
  74. package/dist/core/delegation/worker-delegation-request.js.map +1 -1
  75. package/dist/core/delegation/worker-execution-policy.d.ts +3 -2
  76. package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
  77. package/dist/core/delegation/worker-execution-policy.js +54 -39
  78. package/dist/core/delegation/worker-execution-policy.js.map +1 -1
  79. package/dist/core/delegation/worker-fleet-limits.d.ts +3 -3
  80. package/dist/core/delegation/worker-fleet-limits.d.ts.map +1 -1
  81. package/dist/core/delegation/worker-fleet-limits.js +7 -7
  82. package/dist/core/delegation/worker-fleet-limits.js.map +1 -1
  83. package/dist/core/delegation/worker-machine-scope.d.ts +12 -0
  84. package/dist/core/delegation/worker-machine-scope.d.ts.map +1 -0
  85. package/dist/core/delegation/worker-machine-scope.js +38 -0
  86. package/dist/core/delegation/worker-machine-scope.js.map +1 -0
  87. package/dist/core/delegation/worker-recovery-coordinator.d.ts.map +1 -1
  88. package/dist/core/delegation/worker-recovery-coordinator.js +6 -1
  89. package/dist/core/delegation/worker-recovery-coordinator.js.map +1 -1
  90. package/dist/core/delegation/worker-runner.d.ts +5 -7
  91. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  92. package/dist/core/delegation/worker-runner.js +1 -4
  93. package/dist/core/delegation/worker-runner.js.map +1 -1
  94. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts +3 -2
  95. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts.map +1 -1
  96. package/dist/core/delegation/worker-write-reservation-coordinator.js +50 -25
  97. package/dist/core/delegation/worker-write-reservation-coordinator.js.map +1 -1
  98. package/dist/core/durable-custom-message-turn-controller.d.ts +6 -0
  99. package/dist/core/durable-custom-message-turn-controller.d.ts.map +1 -1
  100. package/dist/core/durable-custom-message-turn-controller.js +38 -15
  101. package/dist/core/durable-custom-message-turn-controller.js.map +1 -1
  102. package/dist/core/extension-binding-controller.d.ts +5 -1
  103. package/dist/core/extension-binding-controller.d.ts.map +1 -1
  104. package/dist/core/extension-binding-controller.js +15 -0
  105. package/dist/core/extension-binding-controller.js.map +1 -1
  106. package/dist/core/extensions/factory-runtime.d.ts.map +1 -1
  107. package/dist/core/extensions/factory-runtime.js +5 -0
  108. package/dist/core/extensions/factory-runtime.js.map +1 -1
  109. package/dist/core/extensions/runner.d.ts.map +1 -1
  110. package/dist/core/extensions/runner.js +1 -0
  111. package/dist/core/extensions/runner.js.map +1 -1
  112. package/dist/core/extensions/types.d.ts +8 -4
  113. package/dist/core/extensions/types.d.ts.map +1 -1
  114. package/dist/core/extensions/types.js.map +1 -1
  115. package/dist/core/foreground-terminal-handoff-controller.d.ts +14 -0
  116. package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
  117. package/dist/core/foreground-terminal-handoff-controller.js +188 -72
  118. package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
  119. package/dist/core/goals/goal-session-controller.d.ts +2 -0
  120. package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
  121. package/dist/core/goals/goal-session-controller.js +8 -0
  122. package/dist/core/goals/goal-session-controller.js.map +1 -1
  123. package/dist/core/goals/goal-tool-core.d.ts +5 -4
  124. package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
  125. package/dist/core/goals/goal-tool-core.js +23 -19
  126. package/dist/core/goals/goal-tool-core.js.map +1 -1
  127. package/dist/core/learning/auto-learn-settings.d.ts +84 -0
  128. package/dist/core/learning/auto-learn-settings.d.ts.map +1 -0
  129. package/dist/core/learning/auto-learn-settings.js +66 -0
  130. package/dist/core/learning/auto-learn-settings.js.map +1 -0
  131. package/dist/core/learning/reflection-engine.d.ts +4 -0
  132. package/dist/core/learning/reflection-engine.d.ts.map +1 -1
  133. package/dist/core/learning/reflection-engine.js +48 -10
  134. package/dist/core/learning/reflection-engine.js.map +1 -1
  135. package/dist/core/local-prefix-warm-controller.d.ts +24 -0
  136. package/dist/core/local-prefix-warm-controller.d.ts.map +1 -0
  137. package/dist/core/local-prefix-warm-controller.js +79 -0
  138. package/dist/core/local-prefix-warm-controller.js.map +1 -0
  139. package/dist/core/memory/providers/file-store.d.ts +2 -0
  140. package/dist/core/memory/providers/file-store.d.ts.map +1 -1
  141. package/dist/core/memory/providers/file-store.js +71 -15
  142. package/dist/core/memory/providers/file-store.js.map +1 -1
  143. package/dist/core/memory/worker-memory-tools.d.ts +5 -0
  144. package/dist/core/memory/worker-memory-tools.d.ts.map +1 -0
  145. package/dist/core/memory/worker-memory-tools.js +5 -0
  146. package/dist/core/memory/worker-memory-tools.js.map +1 -0
  147. package/dist/core/model-capability.d.ts +7 -0
  148. package/dist/core/model-capability.d.ts.map +1 -1
  149. package/dist/core/model-capability.js +12 -0
  150. package/dist/core/model-capability.js.map +1 -1
  151. package/dist/core/model-registry.d.ts.map +1 -1
  152. package/dist/core/model-registry.js +2 -10
  153. package/dist/core/model-registry.js.map +1 -1
  154. package/dist/core/model-router-controller.d.ts +3 -2
  155. package/dist/core/model-router-controller.d.ts.map +1 -1
  156. package/dist/core/model-router-controller.js +3 -2
  157. package/dist/core/model-router-controller.js.map +1 -1
  158. package/dist/core/orchestration/contracts.d.ts +16 -12
  159. package/dist/core/orchestration/contracts.d.ts.map +1 -1
  160. package/dist/core/orchestration/contracts.js +2 -2
  161. package/dist/core/orchestration/contracts.js.map +1 -1
  162. package/dist/core/orchestration/lane-tool-manifests.d.ts +2 -2
  163. package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -1
  164. package/dist/core/orchestration/lane-tool-manifests.js +6 -1
  165. package/dist/core/orchestration/lane-tool-manifests.js.map +1 -1
  166. package/dist/core/orchestration/profile-registry.d.ts.map +1 -1
  167. package/dist/core/orchestration/profile-registry.js +14 -0
  168. package/dist/core/orchestration/profile-registry.js.map +1 -1
  169. package/dist/core/orchestration/task-profile-writer.d.ts +7 -4
  170. package/dist/core/orchestration/task-profile-writer.d.ts.map +1 -1
  171. package/dist/core/orchestration/task-profile-writer.js +71 -59
  172. package/dist/core/orchestration/task-profile-writer.js.map +1 -1
  173. package/dist/core/orchestration/thinking-level-schema.d.ts +7 -0
  174. package/dist/core/orchestration/thinking-level-schema.d.ts.map +1 -0
  175. package/dist/core/orchestration/thinking-level-schema.js +19 -0
  176. package/dist/core/orchestration/thinking-level-schema.js.map +1 -0
  177. package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -1
  178. package/dist/core/orchestration/worker-execution-contract.js +12 -5
  179. package/dist/core/orchestration/worker-execution-contract.js.map +1 -1
  180. package/dist/core/provider-prompt-contracts.d.ts +1 -4
  181. package/dist/core/provider-prompt-contracts.d.ts.map +1 -1
  182. package/dist/core/provider-prompt-contracts.js +4 -10
  183. package/dist/core/provider-prompt-contracts.js.map +1 -1
  184. package/dist/core/provider-request-context-controller.d.ts +2 -0
  185. package/dist/core/provider-request-context-controller.d.ts.map +1 -1
  186. package/dist/core/provider-request-context-controller.js +10 -3
  187. package/dist/core/provider-request-context-controller.js.map +1 -1
  188. package/dist/core/reflection-controller.d.ts +56 -27
  189. package/dist/core/reflection-controller.d.ts.map +1 -1
  190. package/dist/core/reflection-controller.js +206 -117
  191. package/dist/core/reflection-controller.js.map +1 -1
  192. package/dist/core/runtime-builder.d.ts +1 -0
  193. package/dist/core/runtime-builder.d.ts.map +1 -1
  194. package/dist/core/runtime-builder.js +25 -14
  195. package/dist/core/runtime-builder.js.map +1 -1
  196. package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -1
  197. package/dist/core/secrets/credential-exposure-guard.js +55 -10
  198. package/dist/core/secrets/credential-exposure-guard.js.map +1 -1
  199. package/dist/core/session-role.d.ts +6 -8
  200. package/dist/core/session-role.d.ts.map +1 -1
  201. package/dist/core/session-role.js +8 -18
  202. package/dist/core/session-role.js.map +1 -1
  203. package/dist/core/settings-manager.d.ts +13 -16
  204. package/dist/core/settings-manager.d.ts.map +1 -1
  205. package/dist/core/settings-manager.js +53 -50
  206. package/dist/core/settings-manager.js.map +1 -1
  207. package/dist/core/skill-vault.d.ts +15 -0
  208. package/dist/core/skill-vault.d.ts.map +1 -1
  209. package/dist/core/skill-vault.js +79 -45
  210. package/dist/core/skill-vault.js.map +1 -1
  211. package/dist/core/skills.d.ts +3 -0
  212. package/dist/core/skills.d.ts.map +1 -1
  213. package/dist/core/skills.js +6 -6
  214. package/dist/core/skills.js.map +1 -1
  215. package/dist/core/system-prompt-builder.d.ts +2 -0
  216. package/dist/core/system-prompt-builder.d.ts.map +1 -1
  217. package/dist/core/system-prompt-builder.js +52 -12
  218. package/dist/core/system-prompt-builder.js.map +1 -1
  219. package/dist/core/system-prompt.js +1 -1
  220. package/dist/core/system-prompt.js.map +1 -1
  221. package/dist/core/tool-capability-policy.d.ts +3 -0
  222. package/dist/core/tool-capability-policy.d.ts.map +1 -1
  223. package/dist/core/tool-capability-policy.js +13 -2
  224. package/dist/core/tool-capability-policy.js.map +1 -1
  225. package/dist/core/toolkit/script-runner.d.ts +2 -1
  226. package/dist/core/toolkit/script-runner.d.ts.map +1 -1
  227. package/dist/core/toolkit/script-runner.js +10 -2
  228. package/dist/core/toolkit/script-runner.js.map +1 -1
  229. package/dist/core/tools/delegate-status.d.ts +1 -1
  230. package/dist/core/tools/delegate-status.d.ts.map +1 -1
  231. package/dist/core/tools/delegate-status.js +1 -1
  232. package/dist/core/tools/delegate-status.js.map +1 -1
  233. package/dist/core/tools/delegate.d.ts +4 -15
  234. package/dist/core/tools/delegate.d.ts.map +1 -1
  235. package/dist/core/tools/delegate.js +111 -73
  236. package/dist/core/tools/delegate.js.map +1 -1
  237. package/dist/core/tools/goal.d.ts +3 -4
  238. package/dist/core/tools/goal.d.ts.map +1 -1
  239. package/dist/core/tools/goal.js +24 -7
  240. package/dist/core/tools/goal.js.map +1 -1
  241. package/dist/core/tools/profile-writer.d.ts +2 -8
  242. package/dist/core/tools/profile-writer.d.ts.map +1 -1
  243. package/dist/core/tools/profile-writer.js +6 -18
  244. package/dist/core/tools/profile-writer.js.map +1 -1
  245. package/dist/core/tools/run-toolkit-script.d.ts +1 -1
  246. package/dist/core/tools/run-toolkit-script.d.ts.map +1 -1
  247. package/dist/core/tools/run-toolkit-script.js +2 -2
  248. package/dist/core/tools/run-toolkit-script.js.map +1 -1
  249. package/dist/core/tools/skill-audit.d.ts +28 -1
  250. package/dist/core/tools/skill-audit.d.ts.map +1 -1
  251. package/dist/core/tools/skill-audit.js +56 -12
  252. package/dist/core/tools/skill-audit.js.map +1 -1
  253. package/dist/core/tools/skill.d.ts +12 -1
  254. package/dist/core/tools/skill.d.ts.map +1 -1
  255. package/dist/core/tools/skill.js +52 -0
  256. package/dist/core/tools/skill.js.map +1 -1
  257. package/dist/core/tools/skillify.d.ts.map +1 -1
  258. package/dist/core/tools/skillify.js +16 -7
  259. package/dist/core/tools/skillify.js.map +1 -1
  260. package/dist/core/tools/task-steps.js +1 -1
  261. package/dist/core/tools/task-steps.js.map +1 -1
  262. package/dist/core/tools/tmux-dispatch.d.ts +4 -16
  263. package/dist/core/tools/tmux-dispatch.d.ts.map +1 -1
  264. package/dist/core/tools/tmux-dispatch.js +5 -20
  265. package/dist/core/tools/tmux-dispatch.js.map +1 -1
  266. package/dist/core/worktree-sync/codes.d.ts +1 -2
  267. package/dist/core/worktree-sync/codes.d.ts.map +1 -1
  268. package/dist/core/worktree-sync/codes.js +1 -2
  269. package/dist/core/worktree-sync/codes.js.map +1 -1
  270. package/dist/core/worktree-sync/lane-gate.d.ts +4 -8
  271. package/dist/core/worktree-sync/lane-gate.d.ts.map +1 -1
  272. package/dist/core/worktree-sync/lane-gate.js +5 -51
  273. package/dist/core/worktree-sync/lane-gate.js.map +1 -1
  274. package/dist/index.d.ts +5 -0
  275. package/dist/index.d.ts.map +1 -1
  276. package/dist/index.js +7 -0
  277. package/dist/index.js.map +1 -1
  278. package/dist/modes/interactive/auto-learn-controller.d.ts +6 -7
  279. package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -1
  280. package/dist/modes/interactive/auto-learn-controller.js +30 -207
  281. package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
  282. package/dist/modes/interactive/autonomy-commands.js +2 -2
  283. package/dist/modes/interactive/autonomy-commands.js.map +1 -1
  284. package/dist/modes/interactive/components/custom-message.js +17 -0
  285. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  286. package/dist/modes/interactive/components/fitness-role-selector.d.ts.map +1 -1
  287. package/dist/modes/interactive/components/fitness-role-selector.js +2 -2
  288. package/dist/modes/interactive/components/fitness-role-selector.js.map +1 -1
  289. package/dist/modes/interactive/components/footer.js +1 -1
  290. package/dist/modes/interactive/components/footer.js.map +1 -1
  291. package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
  292. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  293. package/dist/modes/interactive/components/settings-selector.js +150 -73
  294. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  295. package/dist/modes/interactive/report-commands.d.ts.map +1 -1
  296. package/dist/modes/interactive/report-commands.js +8 -4
  297. package/dist/modes/interactive/report-commands.js.map +1 -1
  298. package/dist/modes/interactive/settings-selector-flow.d.ts.map +1 -1
  299. package/dist/modes/interactive/settings-selector-flow.js +10 -0
  300. package/dist/modes/interactive/settings-selector-flow.js.map +1 -1
  301. package/docs/extensions.md +8 -0
  302. package/docs/harness-architecture.md +28 -32
  303. package/docs/index.md +1 -1
  304. package/docs/process-matrix.md +8 -6
  305. package/docs/resources.md +1 -1
  306. package/docs/settings.md +61 -51
  307. package/docs/tmux-agent-manager.md +47 -40
  308. package/docs/usage.md +1 -1
  309. package/docs/worker-profiles.md +8 -6
  310. package/docs/worktree-sync.md +26 -20
  311. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  312. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  313. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  314. package/examples/extensions/sandbox/package-lock.json +2 -2
  315. package/examples/extensions/sandbox/package.json +1 -1
  316. package/examples/extensions/with-deps/package-lock.json +2 -2
  317. package/examples/extensions/with-deps/package.json +1 -1
  318. package/npm-shrinkwrap.json +12 -12
  319. package/package.json +4 -4
  320. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts +0 -133
  321. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +0 -1
  322. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js +0 -199
  323. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +0 -1
  324. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.ts +0 -312
@@ -38,6 +38,7 @@ function workerSummaryStatus(record, claimNeedsReview) {
38
38
  return "attention";
39
39
  return "success";
40
40
  }
41
+ const MAX_DELIVERED_TERMINAL_IDENTITIES = 512;
41
42
  export function buildForegroundWorkerTerminalHandoffContent(records, options) {
42
43
  const included = records.slice(0, 8);
43
44
  const omitted = Math.max(0, (options?.totalCount ?? records.length) - included.length);
@@ -91,52 +92,182 @@ export function buildForegroundWorkerTerminalHandoffContent(records, options) {
91
92
  /** Serializes durable background terminal delivery through the foreground submission owner. */
92
93
  export class ForegroundTerminalHandoffController {
93
94
  constructor(deps) {
95
+ this.pending = new Set();
96
+ this.terminalDeliveries = new Map();
97
+ this.deliveredTerminalIdentities = new Set();
94
98
  this.deps = deps;
95
99
  }
96
100
  async notifyWorkers(records) {
97
101
  if (records.every((record) => record.observedAt !== undefined))
98
102
  return;
99
103
  this.assertLive("worker terminal handoff was persisted");
100
- const lease = await this.deps.foreground.acquireSubmission();
104
+ await this.scheduleUnique(records, (record) => ["worker", record.laneId, record.completedAt ?? "", record.status, record.reasonCode ?? ""].join("\0"), (uniqueRecords) => this.prepareWorkerDelivery(uniqueRecords));
105
+ }
106
+ async notifyTools(records, wakeParent) {
107
+ if (!wakeParent || records.every((record) => record.observedAt !== undefined))
108
+ return;
109
+ this.assertLive("background tool terminal handoff was delivered");
110
+ await this.scheduleUnique(records, (record) => ["tool", record.sessionId, record.taskId, record.completedAt ?? "", record.status].join("\0"), (uniqueRecords) => this.prepareToolDelivery(uniqueRecords));
111
+ }
112
+ /** Deliver queued terminals immediately before the agent loop polls its steering inbox. */
113
+ flushProviderBoundary() {
114
+ for (const pending of [...this.pending]) {
115
+ try {
116
+ this.assertLive("terminal handoff reached a provider boundary");
117
+ const plan = pending.prepare();
118
+ if (!plan) {
119
+ this.pending.delete(pending);
120
+ pending.resolve();
121
+ continue;
122
+ }
123
+ if (!plan.wakeParent)
124
+ continue;
125
+ this.pending.delete(pending);
126
+ void this.deps.enqueueCustomMessageTurn(plan.message).then(pending.resolve, pending.reject);
127
+ }
128
+ catch (error) {
129
+ this.pending.delete(pending);
130
+ pending.reject(error);
131
+ }
132
+ }
133
+ }
134
+ schedule(prepare) {
135
+ return new Promise((resolve, reject) => {
136
+ const pending = { prepare, resolve, reject };
137
+ this.pending.add(pending);
138
+ void this.deliverWhenIdle(pending);
139
+ });
140
+ }
141
+ async scheduleUnique(records, identity, prepare) {
142
+ const receipts = new Set();
143
+ const uniqueRecords = [];
144
+ const uniqueIdentities = [];
145
+ for (const record of records) {
146
+ const key = identity(record);
147
+ if (this.deliveredTerminalIdentities.has(key))
148
+ continue;
149
+ const inFlight = this.terminalDeliveries.get(key);
150
+ if (inFlight) {
151
+ receipts.add(inFlight);
152
+ continue;
153
+ }
154
+ uniqueRecords.push(record);
155
+ uniqueIdentities.push(key);
156
+ }
157
+ if (uniqueRecords.length > 0) {
158
+ const delivery = this.schedule(() => prepare(uniqueRecords));
159
+ for (const key of uniqueIdentities)
160
+ this.terminalDeliveries.set(key, delivery);
161
+ receipts.add(delivery);
162
+ void delivery.then(() => {
163
+ for (const key of uniqueIdentities) {
164
+ if (this.terminalDeliveries.get(key) === delivery)
165
+ this.terminalDeliveries.delete(key);
166
+ this.rememberDeliveredTerminal(key);
167
+ }
168
+ }, () => {
169
+ for (const key of uniqueIdentities) {
170
+ if (this.terminalDeliveries.get(key) === delivery)
171
+ this.terminalDeliveries.delete(key);
172
+ }
173
+ });
174
+ }
175
+ await Promise.all(receipts);
176
+ }
177
+ rememberDeliveredTerminal(identity) {
178
+ this.deliveredTerminalIdentities.delete(identity);
179
+ this.deliveredTerminalIdentities.add(identity);
180
+ while (this.deliveredTerminalIdentities.size > MAX_DELIVERED_TERMINAL_IDENTITIES) {
181
+ const oldest = this.deliveredTerminalIdentities.values().next().value;
182
+ if (oldest === undefined)
183
+ break;
184
+ this.deliveredTerminalIdentities.delete(oldest);
185
+ }
186
+ }
187
+ async deliverWhenIdle(pending) {
188
+ try {
189
+ while (this.pending.has(pending)) {
190
+ await this.deps.foreground.waitForIdle();
191
+ if (!this.pending.has(pending))
192
+ return;
193
+ this.assertLive("terminal handoff was waiting for foreground idle");
194
+ const lease = this.deps.foreground.tryAcquireSubmission();
195
+ if (!lease)
196
+ continue;
197
+ if (!this.pending.delete(pending)) {
198
+ this.deps.foreground.releaseSubmission(lease);
199
+ return;
200
+ }
201
+ try {
202
+ await this.deliverWithLease(pending.prepare(), lease);
203
+ pending.resolve();
204
+ }
205
+ catch (error) {
206
+ pending.reject(error);
207
+ }
208
+ return;
209
+ }
210
+ }
211
+ catch (error) {
212
+ if (this.pending.delete(pending))
213
+ pending.reject(error);
214
+ }
215
+ }
216
+ async deliverWithLease(plan, lease) {
101
217
  let releaseLease = true;
102
218
  try {
103
- this.assertLive("worker terminal handoff was persisted");
104
- const unread = records.filter((record) => record.observedAt === undefined);
105
- if (unread.length === 0)
219
+ if (!plan)
106
220
  return;
107
- const prepared = unread.map((record, index) => {
108
- const snapshot = this.deps.getWorkerClaimSnapshot?.(record.laneId);
109
- const claim = snapshot?.claim;
110
- const outputArtifact = index < 8 ? workerTerminalOutputArtifact(this.deps.getWorkerResult?.(record.laneId)) : undefined;
111
- return {
112
- summaryItem: {
113
- id: record.laneId,
114
- status: workerSummaryStatus(record, claim?.parentReviewRequired === true),
115
- },
116
- laneId: record.laneId,
117
- status: record.status,
118
- ...(record.reasonCode ? { reasonCode: record.reasonCode } : {}),
119
- ...(outputArtifact ? { outputArtifact } : {}),
120
- ...(claim
121
- ? {
122
- claim: {
123
- status: claim.status,
124
- summary: claim.summary.slice(0, 1000),
125
- changedFiles: claim.changedFiles,
126
- ...(claim.blockers ? { blockers: claim.blockers } : {}),
127
- ...(claim.parentReviewRequired ? { parentReviewRequired: true } : {}),
128
- },
129
- }
130
- : {}),
131
- };
132
- });
133
- const included = prepared.slice(0, 8).map(({ summaryItem: _summaryItem, ...record }) => record);
134
- const goal = this.deps.getGoalStateSnapshot();
135
- const wakeParent = unread.some((record) => !record.goalId || (goal?.goalId === record.goalId && isGoalExecutionActive(goal.status)));
136
- const message = {
221
+ if (plan.wakeParent) {
222
+ const started = await this.deps.startCustomMessageTurn(plan.message, lease, plan.goalId);
223
+ this.releaseAfterTurn(started.completion, lease, "background terminal handoff turn");
224
+ releaseLease = false;
225
+ return;
226
+ }
227
+ await this.deps.sendCustomMessage(plan.message, { triggerTurn: false, deliverAs: "followUp" }, lease);
228
+ }
229
+ finally {
230
+ if (releaseLease)
231
+ this.deps.foreground.releaseSubmission(lease);
232
+ }
233
+ }
234
+ prepareWorkerDelivery(records) {
235
+ const unread = records.filter((record) => record.observedAt === undefined);
236
+ if (unread.length === 0)
237
+ return undefined;
238
+ const prepared = unread.map((record, index) => {
239
+ const snapshot = this.deps.getWorkerClaimSnapshot?.(record.laneId);
240
+ const claim = snapshot?.claim;
241
+ const outputArtifact = index < 8 ? workerTerminalOutputArtifact(this.deps.getWorkerResult?.(record.laneId)) : undefined;
242
+ return {
243
+ summaryItem: {
244
+ id: record.laneId,
245
+ status: workerSummaryStatus(record, claim?.parentReviewRequired === true),
246
+ },
247
+ laneId: record.laneId,
248
+ status: record.status,
249
+ ...(record.reasonCode ? { reasonCode: record.reasonCode } : {}),
250
+ ...(outputArtifact ? { outputArtifact } : {}),
251
+ ...(claim
252
+ ? {
253
+ claim: {
254
+ status: claim.status,
255
+ summary: claim.summary.slice(0, 1000),
256
+ changedFiles: claim.changedFiles,
257
+ ...(claim.blockers ? { blockers: claim.blockers } : {}),
258
+ ...(claim.parentReviewRequired ? { parentReviewRequired: true } : {}),
259
+ },
260
+ }
261
+ : {}),
262
+ };
263
+ });
264
+ const included = prepared.slice(0, 8).map(({ summaryItem: _summaryItem, ...record }) => record);
265
+ const wake = this.resolveWake(unread);
266
+ return {
267
+ message: {
137
268
  customType: "background-worker-completion",
138
269
  content: buildForegroundWorkerTerminalHandoffContent(included, {
139
- wakeParent,
270
+ wakeParent: wake.wakeParent,
140
271
  totalCount: unread.length,
141
272
  }),
142
273
  display: true,
@@ -144,35 +275,18 @@ export class ForegroundTerminalHandoffController {
144
275
  records: included,
145
276
  summary: createBackgroundActivitySummaryContract("agent", prepared.map((entry) => entry.summaryItem)),
146
277
  },
147
- };
148
- if (wakeParent) {
149
- const goalId = unread.find((record) => record.goalId === goal?.goalId)?.goalId;
150
- const started = await this.deps.startCustomMessageTurn(message, lease, goalId);
151
- this.releaseAfterTurn(started.completion, lease, "worker terminal handoff turn");
152
- releaseLease = false;
153
- }
154
- else {
155
- await this.deps.sendCustomMessage(message, { triggerTurn: false, deliverAs: "followUp" }, lease);
156
- }
157
- }
158
- finally {
159
- if (releaseLease)
160
- this.deps.foreground.releaseSubmission(lease);
161
- }
278
+ },
279
+ ...wake,
280
+ };
162
281
  }
163
- async notifyTools(records, wakeParent) {
164
- if (!wakeParent || records.every((record) => record.observedAt !== undefined))
165
- return;
166
- this.assertLive("background tool terminal handoff was delivered");
167
- const lease = await this.deps.foreground.acquireSubmission();
168
- let releaseLease = true;
169
- try {
170
- this.assertLive("background tool terminal handoff was delivered");
171
- const unread = records.filter((record) => record.observedAt === undefined);
172
- if (unread.length === 0)
173
- return;
174
- const toolMessage = createBackgroundToolTerminalMessage(unread);
175
- const message = {
282
+ prepareToolDelivery(records) {
283
+ const unread = records.filter((record) => record.observedAt === undefined);
284
+ if (unread.length === 0)
285
+ return undefined;
286
+ const wake = this.resolveWake(unread);
287
+ const toolMessage = createBackgroundToolTerminalMessage(unread, { wakeParent: wake.wakeParent });
288
+ return {
289
+ message: {
176
290
  ...toolMessage,
177
291
  details: {
178
292
  ...toolMessage.details,
@@ -185,15 +299,17 @@ export class ForegroundTerminalHandoffController {
185
299
  : "success",
186
300
  }))),
187
301
  },
188
- };
189
- const started = await this.deps.startCustomMessageTurn(message, lease);
190
- this.releaseAfterTurn(started.completion, lease, "background tool terminal handoff turn");
191
- releaseLease = false;
192
- }
193
- finally {
194
- if (releaseLease)
195
- this.deps.foreground.releaseSubmission(lease);
196
- }
302
+ },
303
+ ...wake,
304
+ };
305
+ }
306
+ resolveWake(records) {
307
+ const goal = this.deps.getGoalStateSnapshot();
308
+ const wakeParent = records.some((record) => !record.goalId || (goal?.goalId === record.goalId && isGoalExecutionActive(goal.status)));
309
+ return {
310
+ wakeParent,
311
+ ...(wakeParent ? { goalId: records.find((record) => record.goalId === goal?.goalId)?.goalId } : {}),
312
+ };
197
313
  }
198
314
  releaseAfterTurn(completion, lease, label) {
199
315
  void completion.then(() => this.deps.foreground.releaseSubmission(lease), (error) => {
@@ -1 +1 @@
1
- {"version":3,"file":"foreground-terminal-handoff-controller.js","sourceRoot":"","sources":["../../src/core/foreground-terminal-handoff-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CustomMessage } from \"@caupulican/pi-agent-core\";\nimport type { LaneTerminalStatus } from \"./autonomy/lane-tracker.ts\";\nimport {\n\ttype BackgroundToolTaskRecord,\n\tcreateBackgroundToolTerminalMessage,\n} from \"./background-tool-task-controller.ts\";\nimport type { WorkerClaimSnapshotPayload } from \"./delegation/session-worker-claim.ts\";\nimport type { WorkerTerminalHandoffRecord } from \"./delegation/worker-notification-coordinator.ts\";\nimport { WORKER_COMPLETION_ERROR_CAVEMAN_GUIDANCE } from \"./delegation/worker-terminal-handoff-coordinator.ts\";\nimport { workerTerminalOutputArtifact } from \"./delegation/worker-terminal-output-artifact.ts\";\nimport type { ForegroundRecoveryController, ForegroundSubmissionLease } from \"./foreground-recovery-controller.ts\";\nimport { type GoalState, isGoalExecutionActive } from \"./goals/goal-state.ts\";\nimport type { ArtifactContract, WorkerResultContract } from \"./orchestration/contracts.ts\";\n\nexport type BackgroundActivitySummaryKind = \"agent\" | \"task\";\nexport type BackgroundActivitySummaryStatus = \"success\" | \"attention\" | \"failed\" | \"canceled\";\n\nexport interface BackgroundActivitySummaryItem {\n\tid: string;\n\tstatus: BackgroundActivitySummaryStatus;\n}\n\n/** Provider-neutral counts retained when the detailed handoff is bounded. */\nexport interface BackgroundActivitySummaryContract {\n\tkind: BackgroundActivitySummaryKind;\n\ttotalCount: number;\n\tattentionCount: number;\n\tfailedCount: number;\n\tcanceledCount: number;\n}\n\nexport function createBackgroundActivitySummaryContract(\n\tkind: BackgroundActivitySummaryKind,\n\titems: readonly BackgroundActivitySummaryItem[],\n): BackgroundActivitySummaryContract {\n\treturn {\n\t\tkind,\n\t\ttotalCount: items.length,\n\t\tattentionCount: items.filter((item) => item.status === \"attention\").length,\n\t\tfailedCount: items.filter((item) => item.status === \"failed\").length,\n\t\tcanceledCount: items.filter((item) => item.status === \"canceled\").length,\n\t};\n}\n\nexport function isBackgroundActivitySummaryContract(value: unknown): value is BackgroundActivitySummaryContract {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst summary = value as Record<string, unknown>;\n\tconst counts = [\"totalCount\", \"attentionCount\", \"failedCount\", \"canceledCount\"] as const;\n\tif (summary.kind !== \"agent\" && summary.kind !== \"task\") return false;\n\tif (\n\t\tcounts.some(\n\t\t\t(field) =>\n\t\t\t\ttypeof summary[field] !== \"number\" ||\n\t\t\t\t!Number.isSafeInteger(summary[field]) ||\n\t\t\t\t(summary[field] as number) < 0,\n\t\t)\n\t) {\n\t\treturn false;\n\t}\n\tconst totalCount = summary.totalCount as number;\n\treturn (\n\t\ttotalCount > 0 &&\n\t\t(summary.attentionCount as number) + (summary.failedCount as number) + (summary.canceledCount as number) <=\n\t\t\ttotalCount\n\t);\n}\n\nfunction workerSummaryStatus(\n\trecord: Pick<WorkerTerminalHandoffRecord, \"status\">,\n\tclaimNeedsReview: boolean,\n): BackgroundActivitySummaryStatus {\n\tif (record.status === \"failed\" || record.status === \"timeout\" || record.status === \"budget_exhausted\") {\n\t\treturn \"failed\";\n\t}\n\tif (record.status === \"canceled\") return \"canceled\";\n\tif (claimNeedsReview || record.status === \"partial\" || record.status === \"blocked\") return \"attention\";\n\treturn \"success\";\n}\n\ninterface ForegroundTerminalHandoffControllerDeps {\n\tforeground: ForegroundRecoveryController;\n\tisDisposed(): boolean;\n\tgetGoalStateSnapshot(): Pick<GoalState, \"goalId\" | \"status\"> | undefined;\n\tgetWorkerClaimSnapshot?(laneId: string): WorkerClaimSnapshotPayload | undefined;\n\tgetWorkerResult?(laneId: string): Pick<WorkerResultContract, \"artifacts\"> | undefined;\n\tstartCustomMessageTurn(\n\t\tmessage: Pick<CustomMessage<unknown>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\tlease: ForegroundSubmissionLease,\n\t\tgoalId?: string,\n\t): Promise<{ completion: Promise<void> }>;\n\tsendCustomMessage(\n\t\tmessage: Pick<CustomMessage<unknown>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions: { triggerTurn: false; deliverAs: \"followUp\" },\n\t\tlease: ForegroundSubmissionLease,\n\t): Promise<void>;\n\twarn(message: string): void;\n}\n\nexport function buildForegroundWorkerTerminalHandoffContent(\n\trecords: readonly {\n\t\tlaneId: string;\n\t\tstatus: LaneTerminalStatus;\n\t\treasonCode?: string;\n\t\toutputArtifact?: ArtifactContract;\n\t\tclaim?: {\n\t\t\tsummary?: string;\n\t\t\tstatus?: string;\n\t\t\tchangedFiles?: readonly string[];\n\t\t\tblockers?: readonly string[];\n\t\t\tparentReviewRequired?: boolean;\n\t\t};\n\t}[],\n\toptions?: { wakeParent?: boolean; totalCount?: number },\n): string {\n\tconst included = records.slice(0, 8);\n\tconst omitted = Math.max(0, (options?.totalCount ?? records.length) - included.length);\n\tconst wakeParent = options?.wakeParent ?? true;\n\tconst sanitize = (value: string): string => value.replace(/[\\r\\n]+/g, \" \").slice(0, 120);\n\treturn [\n\t\t\"Background worker terminal handoff:\",\n\t\t...included.flatMap((record) => {\n\t\t\tconst reason = record.reasonCode ? ` reason=${sanitize(record.reasonCode)}` : \"\";\n\t\t\tconst lines = [`- ${record.laneId}: ${record.status}${reason}`];\n\t\t\tif (record.outputArtifact) {\n\t\t\t\tlines.push(\n\t\t\t\t\t` Full Output: ${record.outputArtifact.uri}${record.outputArtifact.sizeBytes === undefined ? \"\" : ` (${record.outputArtifact.sizeBytes} bytes)`}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (record.claim?.summary) {\n\t\t\t\tlines.push(` Claim Status: ${record.claim.status || record.status}`);\n\t\t\t\tlines.push(` Claim Summary: ${sanitize(record.claim.summary)}`);\n\t\t\t\tif (record.claim.changedFiles && record.claim.changedFiles.length > 0) {\n\t\t\t\t\tlines.push(` Changed Files: ${record.claim.changedFiles.map((f) => sanitize(f)).join(\", \")}`);\n\t\t\t\t}\n\t\t\t\tif (record.claim.blockers && record.claim.blockers.length > 0) {\n\t\t\t\t\tlines.push(` Blockers: ${record.claim.blockers.map((b) => sanitize(b)).join(\"; \")}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn lines;\n\t\t}),\n\t\t...(omitted > 0 ? [`- ${omitted} additional terminal worker(s) omitted.`] : []),\n\t\t\"CAVEMAN MODE - MANDATORY: this event proves terminal persistence and delivery. Do not report missed completion or lost worker state from these records.\",\n\t\t...(wakeParent\n\t\t\t? [\"Read each lane with delegate status, verify the claim, then continue or replan the parent task.\"]\n\t\t\t: [\n\t\t\t\t\t\"The owning parent is no longer eligible for automatic continuation. Persist this handoff, but do not continue or replan automatically.\",\n\t\t\t\t]),\n\t\t...(records.some((record) => record.reasonCode === \"worker_blocked\")\n\t\t\t? [\"worker_blocked is a task claim with blockers, not harness failure.\"]\n\t\t\t: []),\n\t\t...(records.some((record) => record.status === \"budget_exhausted\")\n\t\t\t? [\n\t\t\t\t\t\"CAVEMAN MODE - MANDATORY: budget_exhausted means an admitted limit ended work, not harness failure. Terminal reason is authoritative; never replace it with earlier transcript errors. Read evidence, then replan only within remaining authority.\",\n\t\t\t\t]\n\t\t\t: []),\n\t\t...(records.some((record) => record.reasonCode === \"completion_error\")\n\t\t\t? [WORKER_COMPLETION_ERROR_CAVEMAN_GUIDANCE]\n\t\t\t: []),\n\t\t...(wakeParent\n\t\t\t? [\n\t\t\t\t\t'Parent woke. Evaluated terminal claim payload above. Use delegate { action: \"status\", laneId } for deep view if needed.',\n\t\t\t\t]\n\t\t\t: [\"Parent was not woken. Wait for explicit user input before reading a lane or starting more work.\"]),\n\t].join(\"\\n\");\n}\n\n/** Serializes durable background terminal delivery through the foreground submission owner. */\nexport class ForegroundTerminalHandoffController {\n\tprivate readonly deps: ForegroundTerminalHandoffControllerDeps;\n\n\tconstructor(deps: ForegroundTerminalHandoffControllerDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tasync notifyWorkers(records: readonly WorkerTerminalHandoffRecord[]): Promise<void> {\n\t\tif (records.every((record) => record.observedAt !== undefined)) return;\n\t\tthis.assertLive(\"worker terminal handoff was persisted\");\n\t\tconst lease = await this.deps.foreground.acquireSubmission();\n\t\tlet releaseLease = true;\n\t\ttry {\n\t\t\tthis.assertLive(\"worker terminal handoff was persisted\");\n\t\t\tconst unread = records.filter((record) => record.observedAt === undefined);\n\t\t\tif (unread.length === 0) return;\n\t\t\tconst prepared = unread.map((record, index) => {\n\t\t\t\tconst snapshot = this.deps.getWorkerClaimSnapshot?.(record.laneId);\n\t\t\t\tconst claim = snapshot?.claim;\n\t\t\t\tconst outputArtifact =\n\t\t\t\t\tindex < 8 ? workerTerminalOutputArtifact(this.deps.getWorkerResult?.(record.laneId)) : undefined;\n\t\t\t\treturn {\n\t\t\t\t\tsummaryItem: {\n\t\t\t\t\t\tid: record.laneId,\n\t\t\t\t\t\tstatus: workerSummaryStatus(record, claim?.parentReviewRequired === true),\n\t\t\t\t\t},\n\t\t\t\t\tlaneId: record.laneId,\n\t\t\t\t\tstatus: record.status,\n\t\t\t\t\t...(record.reasonCode ? { reasonCode: record.reasonCode } : {}),\n\t\t\t\t\t...(outputArtifact ? { outputArtifact } : {}),\n\t\t\t\t\t...(claim\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tclaim: {\n\t\t\t\t\t\t\t\t\tstatus: claim.status,\n\t\t\t\t\t\t\t\t\tsummary: claim.summary.slice(0, 1000),\n\t\t\t\t\t\t\t\t\tchangedFiles: claim.changedFiles,\n\t\t\t\t\t\t\t\t\t...(claim.blockers ? { blockers: claim.blockers } : {}),\n\t\t\t\t\t\t\t\t\t...(claim.parentReviewRequired ? { parentReviewRequired: true } : {}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t};\n\t\t\t});\n\t\t\tconst included = prepared.slice(0, 8).map(({ summaryItem: _summaryItem, ...record }) => record);\n\t\t\tconst goal = this.deps.getGoalStateSnapshot();\n\t\t\tconst wakeParent = unread.some(\n\t\t\t\t(record) => !record.goalId || (goal?.goalId === record.goalId && isGoalExecutionActive(goal.status)),\n\t\t\t);\n\t\t\tconst message = {\n\t\t\t\tcustomType: \"background-worker-completion\",\n\t\t\t\tcontent: buildForegroundWorkerTerminalHandoffContent(included, {\n\t\t\t\t\twakeParent,\n\t\t\t\t\ttotalCount: unread.length,\n\t\t\t\t}),\n\t\t\t\tdisplay: true,\n\t\t\t\tdetails: {\n\t\t\t\t\trecords: included,\n\t\t\t\t\tsummary: createBackgroundActivitySummaryContract(\n\t\t\t\t\t\t\"agent\",\n\t\t\t\t\t\tprepared.map((entry) => entry.summaryItem),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t};\n\t\t\tif (wakeParent) {\n\t\t\t\tconst goalId = unread.find((record) => record.goalId === goal?.goalId)?.goalId;\n\t\t\t\tconst started = await this.deps.startCustomMessageTurn(message, lease, goalId);\n\t\t\t\tthis.releaseAfterTurn(started.completion, lease, \"worker terminal handoff turn\");\n\t\t\t\treleaseLease = false;\n\t\t\t} else {\n\t\t\t\tawait this.deps.sendCustomMessage(message, { triggerTurn: false, deliverAs: \"followUp\" }, lease);\n\t\t\t}\n\t\t} finally {\n\t\t\tif (releaseLease) this.deps.foreground.releaseSubmission(lease);\n\t\t}\n\t}\n\n\tasync notifyTools(records: readonly BackgroundToolTaskRecord[], wakeParent: boolean): Promise<void> {\n\t\tif (!wakeParent || records.every((record) => record.observedAt !== undefined)) return;\n\t\tthis.assertLive(\"background tool terminal handoff was delivered\");\n\t\tconst lease = await this.deps.foreground.acquireSubmission();\n\t\tlet releaseLease = true;\n\t\ttry {\n\t\t\tthis.assertLive(\"background tool terminal handoff was delivered\");\n\t\t\tconst unread = records.filter((record) => record.observedAt === undefined);\n\t\t\tif (unread.length === 0) return;\n\t\t\tconst toolMessage = createBackgroundToolTerminalMessage(unread);\n\t\t\tconst message = {\n\t\t\t\t...toolMessage,\n\t\t\t\tdetails: {\n\t\t\t\t\t...toolMessage.details,\n\t\t\t\t\tsummary: createBackgroundActivitySummaryContract(\n\t\t\t\t\t\t\"task\",\n\t\t\t\t\t\tunread.map((record) => ({\n\t\t\t\t\t\t\tid: record.taskId,\n\t\t\t\t\t\t\tstatus:\n\t\t\t\t\t\t\t\trecord.status === \"failed\"\n\t\t\t\t\t\t\t\t\t? (\"failed\" as const)\n\t\t\t\t\t\t\t\t\t: record.status === \"canceled\"\n\t\t\t\t\t\t\t\t\t\t? (\"canceled\" as const)\n\t\t\t\t\t\t\t\t\t\t: (\"success\" as const),\n\t\t\t\t\t\t})),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst started = await this.deps.startCustomMessageTurn(message, lease);\n\t\t\tthis.releaseAfterTurn(started.completion, lease, \"background tool terminal handoff turn\");\n\t\t\treleaseLease = false;\n\t\t} finally {\n\t\t\tif (releaseLease) this.deps.foreground.releaseSubmission(lease);\n\t\t}\n\t}\n\n\tprivate releaseAfterTurn(completion: Promise<void>, lease: ForegroundSubmissionLease, label: string): void {\n\t\tvoid completion.then(\n\t\t\t() => this.deps.foreground.releaseSubmission(lease),\n\t\t\t(error: unknown) => {\n\t\t\t\tthis.deps.foreground.releaseSubmission(lease);\n\t\t\t\tthis.deps.warn(\n\t\t\t\t\t`${label} failed after durable delivery: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t}\n\n\tprivate assertLive(action: string): void {\n\t\tif (this.deps.isDisposed()) throw new Error(`Session disposed before ${action}`);\n\t}\n}\n"]}
1
+ {"version":3,"file":"foreground-terminal-handoff-controller.js","sourceRoot":"","sources":["../../src/core/foreground-terminal-handoff-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CustomMessage } from \"@caupulican/pi-agent-core\";\nimport type { LaneTerminalStatus } from \"./autonomy/lane-tracker.ts\";\nimport {\n\ttype BackgroundToolTaskRecord,\n\tcreateBackgroundToolTerminalMessage,\n} from \"./background-tool-task-controller.ts\";\nimport type { WorkerClaimSnapshotPayload } from \"./delegation/session-worker-claim.ts\";\nimport type { WorkerTerminalHandoffRecord } from \"./delegation/worker-notification-coordinator.ts\";\nimport { WORKER_COMPLETION_ERROR_CAVEMAN_GUIDANCE } from \"./delegation/worker-terminal-handoff-coordinator.ts\";\nimport { workerTerminalOutputArtifact } from \"./delegation/worker-terminal-output-artifact.ts\";\nimport type { ForegroundRecoveryController, ForegroundSubmissionLease } from \"./foreground-recovery-controller.ts\";\nimport { type GoalState, isGoalExecutionActive } from \"./goals/goal-state.ts\";\nimport type { ArtifactContract, WorkerResultContract } from \"./orchestration/contracts.ts\";\n\nexport type BackgroundActivitySummaryKind = \"agent\" | \"task\";\nexport type BackgroundActivitySummaryStatus = \"success\" | \"attention\" | \"failed\" | \"canceled\";\n\nexport interface BackgroundActivitySummaryItem {\n\tid: string;\n\tstatus: BackgroundActivitySummaryStatus;\n}\n\n/** Provider-neutral counts retained when the detailed handoff is bounded. */\nexport interface BackgroundActivitySummaryContract {\n\tkind: BackgroundActivitySummaryKind;\n\ttotalCount: number;\n\tattentionCount: number;\n\tfailedCount: number;\n\tcanceledCount: number;\n}\n\nexport function createBackgroundActivitySummaryContract(\n\tkind: BackgroundActivitySummaryKind,\n\titems: readonly BackgroundActivitySummaryItem[],\n): BackgroundActivitySummaryContract {\n\treturn {\n\t\tkind,\n\t\ttotalCount: items.length,\n\t\tattentionCount: items.filter((item) => item.status === \"attention\").length,\n\t\tfailedCount: items.filter((item) => item.status === \"failed\").length,\n\t\tcanceledCount: items.filter((item) => item.status === \"canceled\").length,\n\t};\n}\n\nexport function isBackgroundActivitySummaryContract(value: unknown): value is BackgroundActivitySummaryContract {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst summary = value as Record<string, unknown>;\n\tconst counts = [\"totalCount\", \"attentionCount\", \"failedCount\", \"canceledCount\"] as const;\n\tif (summary.kind !== \"agent\" && summary.kind !== \"task\") return false;\n\tif (\n\t\tcounts.some(\n\t\t\t(field) =>\n\t\t\t\ttypeof summary[field] !== \"number\" ||\n\t\t\t\t!Number.isSafeInteger(summary[field]) ||\n\t\t\t\t(summary[field] as number) < 0,\n\t\t)\n\t) {\n\t\treturn false;\n\t}\n\tconst totalCount = summary.totalCount as number;\n\treturn (\n\t\ttotalCount > 0 &&\n\t\t(summary.attentionCount as number) + (summary.failedCount as number) + (summary.canceledCount as number) <=\n\t\t\ttotalCount\n\t);\n}\n\nfunction workerSummaryStatus(\n\trecord: Pick<WorkerTerminalHandoffRecord, \"status\">,\n\tclaimNeedsReview: boolean,\n): BackgroundActivitySummaryStatus {\n\tif (record.status === \"failed\" || record.status === \"timeout\" || record.status === \"budget_exhausted\") {\n\t\treturn \"failed\";\n\t}\n\tif (record.status === \"canceled\") return \"canceled\";\n\tif (claimNeedsReview || record.status === \"partial\" || record.status === \"blocked\") return \"attention\";\n\treturn \"success\";\n}\n\ninterface ForegroundTerminalHandoffControllerDeps {\n\tforeground: ForegroundRecoveryController;\n\tisDisposed(): boolean;\n\tgetGoalStateSnapshot(): Pick<GoalState, \"goalId\" | \"status\"> | undefined;\n\tgetWorkerClaimSnapshot?(laneId: string): WorkerClaimSnapshotPayload | undefined;\n\tgetWorkerResult?(laneId: string): Pick<WorkerResultContract, \"artifacts\"> | undefined;\n\tstartCustomMessageTurn(\n\t\tmessage: Pick<CustomMessage<unknown>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\tlease: ForegroundSubmissionLease,\n\t\tgoalId?: string,\n\t): Promise<{ completion: Promise<void> }>;\n\tenqueueCustomMessageTurn(\n\t\tmessage: Pick<CustomMessage<unknown>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t): Promise<void>;\n\tsendCustomMessage(\n\t\tmessage: Pick<CustomMessage<unknown>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions: { triggerTurn: false; deliverAs: \"followUp\" },\n\t\tlease: ForegroundSubmissionLease,\n\t): Promise<void>;\n\twarn(message: string): void;\n}\n\ntype TerminalCustomMessage = Pick<CustomMessage<unknown>, \"customType\" | \"content\" | \"display\" | \"details\">;\n\ninterface TerminalDeliveryPlan {\n\tmessage: TerminalCustomMessage;\n\twakeParent: boolean;\n\tgoalId?: string;\n}\n\ninterface PendingTerminalDelivery {\n\tprepare(): TerminalDeliveryPlan | undefined;\n\tresolve(): void;\n\treject(error: unknown): void;\n}\n\nconst MAX_DELIVERED_TERMINAL_IDENTITIES = 512;\n\nexport function buildForegroundWorkerTerminalHandoffContent(\n\trecords: readonly {\n\t\tlaneId: string;\n\t\tstatus: LaneTerminalStatus;\n\t\treasonCode?: string;\n\t\toutputArtifact?: ArtifactContract;\n\t\tclaim?: {\n\t\t\tsummary?: string;\n\t\t\tstatus?: string;\n\t\t\tchangedFiles?: readonly string[];\n\t\t\tblockers?: readonly string[];\n\t\t\tparentReviewRequired?: boolean;\n\t\t};\n\t}[],\n\toptions?: { wakeParent?: boolean; totalCount?: number },\n): string {\n\tconst included = records.slice(0, 8);\n\tconst omitted = Math.max(0, (options?.totalCount ?? records.length) - included.length);\n\tconst wakeParent = options?.wakeParent ?? true;\n\tconst sanitize = (value: string): string => value.replace(/[\\r\\n]+/g, \" \").slice(0, 120);\n\treturn [\n\t\t\"Background worker terminal handoff:\",\n\t\t...included.flatMap((record) => {\n\t\t\tconst reason = record.reasonCode ? ` reason=${sanitize(record.reasonCode)}` : \"\";\n\t\t\tconst lines = [`- ${record.laneId}: ${record.status}${reason}`];\n\t\t\tif (record.outputArtifact) {\n\t\t\t\tlines.push(\n\t\t\t\t\t` Full Output: ${record.outputArtifact.uri}${record.outputArtifact.sizeBytes === undefined ? \"\" : ` (${record.outputArtifact.sizeBytes} bytes)`}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (record.claim?.summary) {\n\t\t\t\tlines.push(` Claim Status: ${record.claim.status || record.status}`);\n\t\t\t\tlines.push(` Claim Summary: ${sanitize(record.claim.summary)}`);\n\t\t\t\tif (record.claim.changedFiles && record.claim.changedFiles.length > 0) {\n\t\t\t\t\tlines.push(` Changed Files: ${record.claim.changedFiles.map((f) => sanitize(f)).join(\", \")}`);\n\t\t\t\t}\n\t\t\t\tif (record.claim.blockers && record.claim.blockers.length > 0) {\n\t\t\t\t\tlines.push(` Blockers: ${record.claim.blockers.map((b) => sanitize(b)).join(\"; \")}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn lines;\n\t\t}),\n\t\t...(omitted > 0 ? [`- ${omitted} additional terminal worker(s) omitted.`] : []),\n\t\t\"CAVEMAN MODE - MANDATORY: this event proves terminal persistence and delivery. Do not report missed completion or lost worker state from these records.\",\n\t\t...(wakeParent\n\t\t\t? [\"Read each lane with delegate status, verify the claim, then continue or replan the parent task.\"]\n\t\t\t: [\n\t\t\t\t\t\"The owning parent is no longer eligible for automatic continuation. Persist this handoff, but do not continue or replan automatically.\",\n\t\t\t\t]),\n\t\t...(records.some((record) => record.reasonCode === \"worker_blocked\")\n\t\t\t? [\"worker_blocked is a task claim with blockers, not harness failure.\"]\n\t\t\t: []),\n\t\t...(records.some((record) => record.status === \"budget_exhausted\")\n\t\t\t? [\n\t\t\t\t\t\"CAVEMAN MODE - MANDATORY: budget_exhausted means an admitted limit ended work, not harness failure. Terminal reason is authoritative; never replace it with earlier transcript errors. Read evidence, then replan only within remaining authority.\",\n\t\t\t\t]\n\t\t\t: []),\n\t\t...(records.some((record) => record.reasonCode === \"completion_error\")\n\t\t\t? [WORKER_COMPLETION_ERROR_CAVEMAN_GUIDANCE]\n\t\t\t: []),\n\t\t...(wakeParent\n\t\t\t? [\n\t\t\t\t\t'Parent woke. Evaluated terminal claim payload above. Use delegate { action: \"status\", laneId } for deep view if needed.',\n\t\t\t\t]\n\t\t\t: [\"Parent was not woken. Wait for explicit user input before reading a lane or starting more work.\"]),\n\t].join(\"\\n\");\n}\n\n/** Serializes durable background terminal delivery through the foreground submission owner. */\nexport class ForegroundTerminalHandoffController {\n\tprivate readonly deps: ForegroundTerminalHandoffControllerDeps;\n\tprivate readonly pending = new Set<PendingTerminalDelivery>();\n\tprivate readonly terminalDeliveries = new Map<string, Promise<void>>();\n\tprivate readonly deliveredTerminalIdentities = new Set<string>();\n\n\tconstructor(deps: ForegroundTerminalHandoffControllerDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tasync notifyWorkers(records: readonly WorkerTerminalHandoffRecord[]): Promise<void> {\n\t\tif (records.every((record) => record.observedAt !== undefined)) return;\n\t\tthis.assertLive(\"worker terminal handoff was persisted\");\n\t\tawait this.scheduleUnique(\n\t\t\trecords,\n\t\t\t(record) =>\n\t\t\t\t[\"worker\", record.laneId, record.completedAt ?? \"\", record.status, record.reasonCode ?? \"\"].join(\"\\0\"),\n\t\t\t(uniqueRecords) => this.prepareWorkerDelivery(uniqueRecords),\n\t\t);\n\t}\n\n\tasync notifyTools(records: readonly BackgroundToolTaskRecord[], wakeParent: boolean): Promise<void> {\n\t\tif (!wakeParent || records.every((record) => record.observedAt !== undefined)) return;\n\t\tthis.assertLive(\"background tool terminal handoff was delivered\");\n\t\tawait this.scheduleUnique(\n\t\t\trecords,\n\t\t\t(record) => [\"tool\", record.sessionId, record.taskId, record.completedAt ?? \"\", record.status].join(\"\\0\"),\n\t\t\t(uniqueRecords) => this.prepareToolDelivery(uniqueRecords),\n\t\t);\n\t}\n\n\t/** Deliver queued terminals immediately before the agent loop polls its steering inbox. */\n\tflushProviderBoundary(): void {\n\t\tfor (const pending of [...this.pending]) {\n\t\t\ttry {\n\t\t\t\tthis.assertLive(\"terminal handoff reached a provider boundary\");\n\t\t\t\tconst plan = pending.prepare();\n\t\t\t\tif (!plan) {\n\t\t\t\t\tthis.pending.delete(pending);\n\t\t\t\t\tpending.resolve();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (!plan.wakeParent) continue;\n\t\t\t\tthis.pending.delete(pending);\n\t\t\t\tvoid this.deps.enqueueCustomMessageTurn(plan.message).then(pending.resolve, pending.reject);\n\t\t\t} catch (error) {\n\t\t\t\tthis.pending.delete(pending);\n\t\t\t\tpending.reject(error);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate schedule(prepare: () => TerminalDeliveryPlan | undefined): Promise<void> {\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tconst pending: PendingTerminalDelivery = { prepare, resolve, reject };\n\t\t\tthis.pending.add(pending);\n\t\t\tvoid this.deliverWhenIdle(pending);\n\t\t});\n\t}\n\n\tprivate async scheduleUnique<T>(\n\t\trecords: readonly T[],\n\t\tidentity: (record: T) => string,\n\t\tprepare: (records: readonly T[]) => TerminalDeliveryPlan | undefined,\n\t): Promise<void> {\n\t\tconst receipts = new Set<Promise<void>>();\n\t\tconst uniqueRecords: T[] = [];\n\t\tconst uniqueIdentities: string[] = [];\n\t\tfor (const record of records) {\n\t\t\tconst key = identity(record);\n\t\t\tif (this.deliveredTerminalIdentities.has(key)) continue;\n\t\t\tconst inFlight = this.terminalDeliveries.get(key);\n\t\t\tif (inFlight) {\n\t\t\t\treceipts.add(inFlight);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tuniqueRecords.push(record);\n\t\t\tuniqueIdentities.push(key);\n\t\t}\n\t\tif (uniqueRecords.length > 0) {\n\t\t\tconst delivery = this.schedule(() => prepare(uniqueRecords));\n\t\t\tfor (const key of uniqueIdentities) this.terminalDeliveries.set(key, delivery);\n\t\t\treceipts.add(delivery);\n\t\t\tvoid delivery.then(\n\t\t\t\t() => {\n\t\t\t\t\tfor (const key of uniqueIdentities) {\n\t\t\t\t\t\tif (this.terminalDeliveries.get(key) === delivery) this.terminalDeliveries.delete(key);\n\t\t\t\t\t\tthis.rememberDeliveredTerminal(key);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tfor (const key of uniqueIdentities) {\n\t\t\t\t\t\tif (this.terminalDeliveries.get(key) === delivery) this.terminalDeliveries.delete(key);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\tawait Promise.all(receipts);\n\t}\n\n\tprivate rememberDeliveredTerminal(identity: string): void {\n\t\tthis.deliveredTerminalIdentities.delete(identity);\n\t\tthis.deliveredTerminalIdentities.add(identity);\n\t\twhile (this.deliveredTerminalIdentities.size > MAX_DELIVERED_TERMINAL_IDENTITIES) {\n\t\t\tconst oldest = this.deliveredTerminalIdentities.values().next().value;\n\t\t\tif (oldest === undefined) break;\n\t\t\tthis.deliveredTerminalIdentities.delete(oldest);\n\t\t}\n\t}\n\n\tprivate async deliverWhenIdle(pending: PendingTerminalDelivery): Promise<void> {\n\t\ttry {\n\t\t\twhile (this.pending.has(pending)) {\n\t\t\t\tawait this.deps.foreground.waitForIdle();\n\t\t\t\tif (!this.pending.has(pending)) return;\n\t\t\t\tthis.assertLive(\"terminal handoff was waiting for foreground idle\");\n\t\t\t\tconst lease = this.deps.foreground.tryAcquireSubmission();\n\t\t\t\tif (!lease) continue;\n\t\t\t\tif (!this.pending.delete(pending)) {\n\t\t\t\t\tthis.deps.foreground.releaseSubmission(lease);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tawait this.deliverWithLease(pending.prepare(), lease);\n\t\t\t\t\tpending.resolve();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tpending.reject(error);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (this.pending.delete(pending)) pending.reject(error);\n\t\t}\n\t}\n\n\tprivate async deliverWithLease(\n\t\tplan: TerminalDeliveryPlan | undefined,\n\t\tlease: ForegroundSubmissionLease,\n\t): Promise<void> {\n\t\tlet releaseLease = true;\n\t\ttry {\n\t\t\tif (!plan) return;\n\t\t\tif (plan.wakeParent) {\n\t\t\t\tconst started = await this.deps.startCustomMessageTurn(plan.message, lease, plan.goalId);\n\t\t\t\tthis.releaseAfterTurn(started.completion, lease, \"background terminal handoff turn\");\n\t\t\t\treleaseLease = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.deps.sendCustomMessage(plan.message, { triggerTurn: false, deliverAs: \"followUp\" }, lease);\n\t\t} finally {\n\t\t\tif (releaseLease) this.deps.foreground.releaseSubmission(lease);\n\t\t}\n\t}\n\n\tprivate prepareWorkerDelivery(records: readonly WorkerTerminalHandoffRecord[]): TerminalDeliveryPlan | undefined {\n\t\tconst unread = records.filter((record) => record.observedAt === undefined);\n\t\tif (unread.length === 0) return undefined;\n\t\tconst prepared = unread.map((record, index) => {\n\t\t\tconst snapshot = this.deps.getWorkerClaimSnapshot?.(record.laneId);\n\t\t\tconst claim = snapshot?.claim;\n\t\t\tconst outputArtifact =\n\t\t\t\tindex < 8 ? workerTerminalOutputArtifact(this.deps.getWorkerResult?.(record.laneId)) : undefined;\n\t\t\treturn {\n\t\t\t\tsummaryItem: {\n\t\t\t\t\tid: record.laneId,\n\t\t\t\t\tstatus: workerSummaryStatus(record, claim?.parentReviewRequired === true),\n\t\t\t\t},\n\t\t\t\tlaneId: record.laneId,\n\t\t\t\tstatus: record.status,\n\t\t\t\t...(record.reasonCode ? { reasonCode: record.reasonCode } : {}),\n\t\t\t\t...(outputArtifact ? { outputArtifact } : {}),\n\t\t\t\t...(claim\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tclaim: {\n\t\t\t\t\t\t\t\tstatus: claim.status,\n\t\t\t\t\t\t\t\tsummary: claim.summary.slice(0, 1000),\n\t\t\t\t\t\t\t\tchangedFiles: claim.changedFiles,\n\t\t\t\t\t\t\t\t...(claim.blockers ? { blockers: claim.blockers } : {}),\n\t\t\t\t\t\t\t\t...(claim.parentReviewRequired ? { parentReviewRequired: true } : {}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t};\n\t\t});\n\t\tconst included = prepared.slice(0, 8).map(({ summaryItem: _summaryItem, ...record }) => record);\n\t\tconst wake = this.resolveWake(unread);\n\t\treturn {\n\t\t\tmessage: {\n\t\t\t\tcustomType: \"background-worker-completion\",\n\t\t\t\tcontent: buildForegroundWorkerTerminalHandoffContent(included, {\n\t\t\t\t\twakeParent: wake.wakeParent,\n\t\t\t\t\ttotalCount: unread.length,\n\t\t\t\t}),\n\t\t\t\tdisplay: true,\n\t\t\t\tdetails: {\n\t\t\t\t\trecords: included,\n\t\t\t\t\tsummary: createBackgroundActivitySummaryContract(\n\t\t\t\t\t\t\"agent\",\n\t\t\t\t\t\tprepared.map((entry) => entry.summaryItem),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t},\n\t\t\t...wake,\n\t\t};\n\t}\n\n\tprivate prepareToolDelivery(records: readonly BackgroundToolTaskRecord[]): TerminalDeliveryPlan | undefined {\n\t\tconst unread = records.filter((record) => record.observedAt === undefined);\n\t\tif (unread.length === 0) return undefined;\n\t\tconst wake = this.resolveWake(unread);\n\t\tconst toolMessage = createBackgroundToolTerminalMessage(unread, { wakeParent: wake.wakeParent });\n\t\treturn {\n\t\t\tmessage: {\n\t\t\t\t...toolMessage,\n\t\t\t\tdetails: {\n\t\t\t\t\t...toolMessage.details,\n\t\t\t\t\tsummary: createBackgroundActivitySummaryContract(\n\t\t\t\t\t\t\"task\",\n\t\t\t\t\t\tunread.map((record) => ({\n\t\t\t\t\t\t\tid: record.taskId,\n\t\t\t\t\t\t\tstatus:\n\t\t\t\t\t\t\t\trecord.status === \"failed\"\n\t\t\t\t\t\t\t\t\t? (\"failed\" as const)\n\t\t\t\t\t\t\t\t\t: record.status === \"canceled\"\n\t\t\t\t\t\t\t\t\t\t? (\"canceled\" as const)\n\t\t\t\t\t\t\t\t\t\t: (\"success\" as const),\n\t\t\t\t\t\t})),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t},\n\t\t\t...wake,\n\t\t};\n\t}\n\n\tprivate resolveWake(records: readonly { goalId?: string }[]): Pick<TerminalDeliveryPlan, \"wakeParent\" | \"goalId\"> {\n\t\tconst goal = this.deps.getGoalStateSnapshot();\n\t\tconst wakeParent = records.some(\n\t\t\t(record) => !record.goalId || (goal?.goalId === record.goalId && isGoalExecutionActive(goal.status)),\n\t\t);\n\t\treturn {\n\t\t\twakeParent,\n\t\t\t...(wakeParent ? { goalId: records.find((record) => record.goalId === goal?.goalId)?.goalId } : {}),\n\t\t};\n\t}\n\n\tprivate releaseAfterTurn(completion: Promise<void>, lease: ForegroundSubmissionLease, label: string): void {\n\t\tvoid completion.then(\n\t\t\t() => this.deps.foreground.releaseSubmission(lease),\n\t\t\t(error: unknown) => {\n\t\t\t\tthis.deps.foreground.releaseSubmission(lease);\n\t\t\t\tthis.deps.warn(\n\t\t\t\t\t`${label} failed after durable delivery: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t}\n\n\tprivate assertLive(action: string): void {\n\t\tif (this.deps.isDisposed()) throw new Error(`Session disposed before ${action}`);\n\t}\n}\n"]}
@@ -85,6 +85,8 @@ export declare class GoalSessionController {
85
85
  provisionalTokenBudget?: number;
86
86
  }): GoalExecutionLease | undefined;
87
87
  endExecution(lease: GoalExecutionLease | undefined): void;
88
+ /** Goal identity authoritatively owned by the current foreground execution, if one was adopted. */
89
+ getExecutionGoalId(): string | undefined;
88
90
  /** Charge one observed assistant response exactly once, including routed responses buffered from persistence. */
89
91
  recordExecutionUsage(message: AssistantMessage): void;
90
92
  private chargeExecutionUsage;
@@ -1 +1 @@
1
- {"version":3,"file":"goal-session-controller.d.ts","sourceRoot":"","sources":["../../../src/core/goals/goal-session-controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"goal-session-controller.d.ts","sourceRoot":"","sources":["../../../src/core/goals/goal-session-controller.ts"],"names":[],"mappings":"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"}
@@ -222,6 +222,14 @@ export class GoalSessionController {
222
222
  this.flushPendingExecutionUsage(this.executionLease);
223
223
  this.executionLease = undefined;
224
224
  }
225
+ /** Goal identity authoritatively owned by the current foreground execution, if one was adopted. */
226
+ getExecutionGoalId() {
227
+ const lease = this.executionLease;
228
+ if (!lease)
229
+ return undefined;
230
+ this.resolveExecutionState(lease);
231
+ return lease.goalId;
232
+ }
225
233
  /** Charge one observed assistant response exactly once, including routed responses buffered from persistence. */
226
234
  recordExecutionUsage(message) {
227
235
  const lease = this.executionLease;