@caupulican/pi-adaptative 0.81.39 → 0.81.40

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 (667) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +2 -0
  3. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts +2 -0
  4. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +1 -1
  5. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js +2 -0
  6. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +1 -1
  7. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.ts +3 -0
  8. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts +9 -0
  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 +290 -107
  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 +357 -122
  13. package/dist/bundled-resources/skills/tool-call-repair/references/repair-catalogue.md +2 -2
  14. package/dist/cli/args.d.ts +2 -0
  15. package/dist/cli/args.d.ts.map +1 -1
  16. package/dist/cli/args.js +9 -0
  17. package/dist/cli/args.js.map +1 -1
  18. package/dist/core/agent-directory-layout.d.ts +15 -0
  19. package/dist/core/agent-directory-layout.d.ts.map +1 -0
  20. package/dist/core/agent-directory-layout.js +72 -0
  21. package/dist/core/agent-directory-layout.js.map +1 -0
  22. package/dist/core/agent-paths.d.ts +19 -2
  23. package/dist/core/agent-paths.d.ts.map +1 -1
  24. package/dist/core/agent-paths.js +67 -4
  25. package/dist/core/agent-paths.js.map +1 -1
  26. package/dist/core/agent-session-runtime.d.ts +52 -8
  27. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  28. package/dist/core/agent-session-runtime.js +397 -79
  29. package/dist/core/agent-session-runtime.js.map +1 -1
  30. package/dist/core/agent-session-services.d.ts +1 -0
  31. package/dist/core/agent-session-services.d.ts.map +1 -1
  32. package/dist/core/agent-session-services.js +1 -0
  33. package/dist/core/agent-session-services.js.map +1 -1
  34. package/dist/core/agent-session.d.ts +71 -136
  35. package/dist/core/agent-session.d.ts.map +1 -1
  36. package/dist/core/agent-session.js +477 -1318
  37. package/dist/core/agent-session.js.map +1 -1
  38. package/dist/core/autonomy/approval-gate.d.ts +3 -2
  39. package/dist/core/autonomy/approval-gate.d.ts.map +1 -1
  40. package/dist/core/autonomy/approval-gate.js +6 -28
  41. package/dist/core/autonomy/approval-gate.js.map +1 -1
  42. package/dist/core/autonomy/bounded-completion.d.ts +1 -1
  43. package/dist/core/autonomy/bounded-completion.d.ts.map +1 -1
  44. package/dist/core/autonomy/bounded-completion.js +1 -1
  45. package/dist/core/autonomy/bounded-completion.js.map +1 -1
  46. package/dist/core/autonomy/contracts.d.ts +20 -12
  47. package/dist/core/autonomy/contracts.d.ts.map +1 -1
  48. package/dist/core/autonomy/contracts.js.map +1 -1
  49. package/dist/core/autonomy/foreground-envelope.d.ts +8 -2
  50. package/dist/core/autonomy/foreground-envelope.d.ts.map +1 -1
  51. package/dist/core/autonomy/foreground-envelope.js +8 -25
  52. package/dist/core/autonomy/foreground-envelope.js.map +1 -1
  53. package/dist/core/autonomy/gates.d.ts.map +1 -1
  54. package/dist/core/autonomy/gates.js +8 -10
  55. package/dist/core/autonomy/gates.js.map +1 -1
  56. package/dist/core/autonomy/lane-private-paths.d.ts +2 -0
  57. package/dist/core/autonomy/lane-private-paths.d.ts.map +1 -0
  58. package/dist/core/autonomy/lane-private-paths.js +16 -0
  59. package/dist/core/autonomy/lane-private-paths.js.map +1 -0
  60. package/dist/core/autonomy/lane-tool-surface.d.ts +10 -0
  61. package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
  62. package/dist/core/autonomy/lane-tool-surface.js +46 -8
  63. package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
  64. package/dist/core/autonomy/lane-tracker.d.ts +14 -0
  65. package/dist/core/autonomy/lane-tracker.d.ts.map +1 -1
  66. package/dist/core/autonomy/lane-tracker.js +38 -0
  67. package/dist/core/autonomy/lane-tracker.js.map +1 -1
  68. package/dist/core/autonomy/risk-assessment.d.ts +1 -2
  69. package/dist/core/autonomy/risk-assessment.d.ts.map +1 -1
  70. package/dist/core/autonomy/risk-assessment.js +1 -123
  71. package/dist/core/autonomy/risk-assessment.js.map +1 -1
  72. package/dist/core/autonomy/session-lane-record.d.ts +4 -4
  73. package/dist/core/autonomy/session-lane-record.d.ts.map +1 -1
  74. package/dist/core/autonomy/session-lane-record.js +16 -29
  75. package/dist/core/autonomy/session-lane-record.js.map +1 -1
  76. package/dist/core/autonomy/telemetry-events.d.ts +1 -1
  77. package/dist/core/autonomy/telemetry-events.d.ts.map +1 -1
  78. package/dist/core/autonomy/telemetry-events.js +1 -1
  79. package/dist/core/autonomy/telemetry-events.js.map +1 -1
  80. package/dist/core/autonomy-telemetry.d.ts +7 -7
  81. package/dist/core/autonomy-telemetry.d.ts.map +1 -1
  82. package/dist/core/autonomy-telemetry.js +9 -9
  83. package/dist/core/autonomy-telemetry.js.map +1 -1
  84. package/dist/core/background-lane-controller.d.ts +54 -236
  85. package/dist/core/background-lane-controller.d.ts.map +1 -1
  86. package/dist/core/background-lane-controller.js +140 -1273
  87. package/dist/core/background-lane-controller.js.map +1 -1
  88. package/dist/core/capability-contract.d.ts +4 -0
  89. package/dist/core/capability-contract.d.ts.map +1 -0
  90. package/dist/core/capability-contract.js +28 -0
  91. package/dist/core/capability-contract.js.map +1 -0
  92. package/dist/core/compaction-controller.d.ts +90 -0
  93. package/dist/core/compaction-controller.d.ts.map +1 -0
  94. package/dist/core/compaction-controller.js +452 -0
  95. package/dist/core/compaction-controller.js.map +1 -0
  96. package/dist/core/compaction-support.d.ts +12 -11
  97. package/dist/core/compaction-support.d.ts.map +1 -1
  98. package/dist/core/compaction-support.js.map +1 -1
  99. package/dist/core/context/context-artifacts.d.ts +6 -2
  100. package/dist/core/context/context-artifacts.d.ts.map +1 -1
  101. package/dist/core/context/context-artifacts.js +34 -2
  102. package/dist/core/context/context-artifacts.js.map +1 -1
  103. package/dist/core/context/context-store-retention.d.ts +8 -2
  104. package/dist/core/context/context-store-retention.d.ts.map +1 -1
  105. package/dist/core/context/context-store-retention.js +158 -35
  106. package/dist/core/context/context-store-retention.js.map +1 -1
  107. package/dist/core/context/okf-memory.d.ts.map +1 -1
  108. package/dist/core/context/okf-memory.js +9 -11
  109. package/dist/core/context/okf-memory.js.map +1 -1
  110. package/dist/core/context/sqlite-runtime-index.d.ts.map +1 -1
  111. package/dist/core/context/sqlite-runtime-index.js +6 -8
  112. package/dist/core/context/sqlite-runtime-index.js.map +1 -1
  113. package/dist/core/context-gc.d.ts +3 -0
  114. package/dist/core/context-gc.d.ts.map +1 -1
  115. package/dist/core/context-gc.js +10 -5
  116. package/dist/core/context-gc.js.map +1 -1
  117. package/dist/core/context-pipeline.d.ts.map +1 -1
  118. package/dist/core/context-pipeline.js +9 -4
  119. package/dist/core/context-pipeline.js.map +1 -1
  120. package/dist/core/default-tool-surface.d.ts.map +1 -1
  121. package/dist/core/default-tool-surface.js +1 -0
  122. package/dist/core/default-tool-surface.js.map +1 -1
  123. package/dist/core/delegation/managed-lane-controller.d.ts +34 -0
  124. package/dist/core/delegation/managed-lane-controller.d.ts.map +1 -0
  125. package/dist/core/delegation/managed-lane-controller.js +217 -0
  126. package/dist/core/delegation/managed-lane-controller.js.map +1 -0
  127. package/dist/core/delegation/session-worker-claim.d.ts +44 -0
  128. package/dist/core/delegation/session-worker-claim.d.ts.map +1 -0
  129. package/dist/core/delegation/session-worker-claim.js +98 -0
  130. package/dist/core/delegation/session-worker-claim.js.map +1 -0
  131. package/dist/core/delegation/worker-actions.d.ts +7 -5
  132. package/dist/core/delegation/worker-actions.d.ts.map +1 -1
  133. package/dist/core/delegation/worker-actions.js +20 -4
  134. package/dist/core/delegation/worker-actions.js.map +1 -1
  135. package/dist/core/delegation/{worker-result.d.ts → worker-claim.d.ts} +13 -13
  136. package/dist/core/delegation/worker-claim.d.ts.map +1 -0
  137. package/dist/core/delegation/{worker-result.js → worker-claim.js} +61 -51
  138. package/dist/core/delegation/worker-claim.js.map +1 -0
  139. package/dist/core/delegation/worker-delegation-controller.d.ts +110 -0
  140. package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -0
  141. package/dist/core/delegation/worker-delegation-controller.js +861 -0
  142. package/dist/core/delegation/worker-delegation-controller.js.map +1 -0
  143. package/dist/core/delegation/worker-delegation-request.d.ts +11 -0
  144. package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -0
  145. package/dist/core/delegation/worker-delegation-request.js +2 -0
  146. package/dist/core/delegation/worker-delegation-request.js.map +1 -0
  147. package/dist/core/delegation/worker-dispatch-scheduler.d.ts +40 -0
  148. package/dist/core/delegation/worker-dispatch-scheduler.d.ts.map +1 -0
  149. package/dist/core/delegation/worker-dispatch-scheduler.js +93 -0
  150. package/dist/core/delegation/worker-dispatch-scheduler.js.map +1 -0
  151. package/dist/core/delegation/worker-execution-policy.d.ts +62 -0
  152. package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -0
  153. package/dist/core/delegation/worker-execution-policy.js +160 -0
  154. package/dist/core/delegation/worker-execution-policy.js.map +1 -0
  155. package/dist/core/delegation/worker-lane-projection.d.ts +14 -0
  156. package/dist/core/delegation/worker-lane-projection.d.ts.map +1 -0
  157. package/dist/core/delegation/worker-lane-projection.js +100 -0
  158. package/dist/core/delegation/worker-lane-projection.js.map +1 -0
  159. package/dist/core/delegation/worker-lifecycle.d.ts +97 -0
  160. package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -0
  161. package/dist/core/delegation/worker-lifecycle.js +339 -0
  162. package/dist/core/delegation/worker-lifecycle.js.map +1 -0
  163. package/dist/core/delegation/worker-notification-coordinator.d.ts +36 -0
  164. package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -0
  165. package/dist/core/delegation/worker-notification-coordinator.js +90 -0
  166. package/dist/core/delegation/worker-notification-coordinator.js.map +1 -0
  167. package/dist/core/delegation/worker-profile-resolver.d.ts +55 -0
  168. package/dist/core/delegation/worker-profile-resolver.d.ts.map +1 -0
  169. package/dist/core/delegation/worker-profile-resolver.js +113 -0
  170. package/dist/core/delegation/worker-profile-resolver.js.map +1 -0
  171. package/dist/core/delegation/worker-runner.d.ts +25 -14
  172. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  173. package/dist/core/delegation/worker-runner.js +122 -53
  174. package/dist/core/delegation/worker-runner.js.map +1 -1
  175. package/dist/core/delegation/worker-task-label.d.ts +3 -0
  176. package/dist/core/delegation/worker-task-label.d.ts.map +1 -0
  177. package/dist/core/delegation/worker-task-label.js +11 -0
  178. package/dist/core/delegation/worker-task-label.js.map +1 -0
  179. package/dist/core/doctor.d.ts +8 -0
  180. package/dist/core/doctor.d.ts.map +1 -1
  181. package/dist/core/doctor.js +32 -1
  182. package/dist/core/doctor.js.map +1 -1
  183. package/dist/core/extensions/index.d.ts +1 -1
  184. package/dist/core/extensions/index.d.ts.map +1 -1
  185. package/dist/core/extensions/index.js.map +1 -1
  186. package/dist/core/extensions/loader.d.ts +5 -1
  187. package/dist/core/extensions/loader.d.ts.map +1 -1
  188. package/dist/core/extensions/loader.js +50 -15
  189. package/dist/core/extensions/loader.js.map +1 -1
  190. package/dist/core/extensions/runner.d.ts.map +1 -1
  191. package/dist/core/extensions/runner.js +6 -0
  192. package/dist/core/extensions/runner.js.map +1 -1
  193. package/dist/core/extensions/storage.d.ts +8 -0
  194. package/dist/core/extensions/storage.d.ts.map +1 -0
  195. package/dist/core/extensions/storage.js +28 -0
  196. package/dist/core/extensions/storage.js.map +1 -0
  197. package/dist/core/extensions/types.d.ts +70 -21
  198. package/dist/core/extensions/types.d.ts.map +1 -1
  199. package/dist/core/extensions/types.js.map +1 -1
  200. package/dist/core/failure-corpus.d.ts +1 -15
  201. package/dist/core/failure-corpus.d.ts.map +1 -1
  202. package/dist/core/failure-corpus.js +9 -37
  203. package/dist/core/failure-corpus.js.map +1 -1
  204. package/dist/core/foreground-recovery-controller.d.ts +52 -0
  205. package/dist/core/foreground-recovery-controller.d.ts.map +1 -0
  206. package/dist/core/foreground-recovery-controller.js +111 -0
  207. package/dist/core/foreground-recovery-controller.js.map +1 -0
  208. package/dist/core/gateways/channel-provider.d.ts +3 -0
  209. package/dist/core/gateways/channel-provider.d.ts.map +1 -1
  210. package/dist/core/gateways/channel-provider.js +31 -6
  211. package/dist/core/gateways/channel-provider.js.map +1 -1
  212. package/dist/core/goals/goal-acceptance.d.ts +11 -0
  213. package/dist/core/goals/goal-acceptance.d.ts.map +1 -0
  214. package/dist/core/goals/goal-acceptance.js +25 -0
  215. package/dist/core/goals/goal-acceptance.js.map +1 -0
  216. package/dist/core/goals/goal-auto-continue-controller.d.ts +27 -0
  217. package/dist/core/goals/goal-auto-continue-controller.d.ts.map +1 -0
  218. package/dist/core/goals/goal-auto-continue-controller.js +93 -0
  219. package/dist/core/goals/goal-auto-continue-controller.js.map +1 -0
  220. package/dist/core/goals/goal-continuation-controller.d.ts +1 -1
  221. package/dist/core/goals/goal-continuation-controller.d.ts.map +1 -1
  222. package/dist/core/goals/goal-continuation-controller.js +10 -0
  223. package/dist/core/goals/goal-continuation-controller.js.map +1 -1
  224. package/dist/core/goals/goal-continuation-prompt.d.ts +1 -1
  225. package/dist/core/goals/goal-continuation-prompt.d.ts.map +1 -1
  226. package/dist/core/goals/goal-continuation-prompt.js +6 -6
  227. package/dist/core/goals/goal-continuation-prompt.js.map +1 -1
  228. package/dist/core/goals/goal-lifecycle.d.ts +20 -0
  229. package/dist/core/goals/goal-lifecycle.d.ts.map +1 -0
  230. package/dist/core/goals/goal-lifecycle.js +17 -0
  231. package/dist/core/goals/goal-lifecycle.js.map +1 -0
  232. package/dist/core/goals/goal-runtime-snapshot.d.ts +11 -9
  233. package/dist/core/goals/goal-runtime-snapshot.d.ts.map +1 -1
  234. package/dist/core/goals/goal-runtime-snapshot.js +10 -8
  235. package/dist/core/goals/goal-runtime-snapshot.js.map +1 -1
  236. package/dist/core/goals/goal-state.d.ts +1 -0
  237. package/dist/core/goals/goal-state.d.ts.map +1 -1
  238. package/dist/core/goals/goal-state.js +7 -10
  239. package/dist/core/goals/goal-state.js.map +1 -1
  240. package/dist/core/goals/goal-tool-core.d.ts +8 -6
  241. package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
  242. package/dist/core/goals/goal-tool-core.js +11 -41
  243. package/dist/core/goals/goal-tool-core.js.map +1 -1
  244. package/dist/core/goals/session-goal-state.d.ts +2 -4
  245. package/dist/core/goals/session-goal-state.d.ts.map +1 -1
  246. package/dist/core/goals/session-goal-state.js +10 -33
  247. package/dist/core/goals/session-goal-state.js.map +1 -1
  248. package/dist/core/human-input.d.ts +100 -0
  249. package/dist/core/human-input.d.ts.map +1 -0
  250. package/dist/core/human-input.js +362 -0
  251. package/dist/core/human-input.js.map +1 -0
  252. package/dist/core/index.d.ts +9 -1
  253. package/dist/core/index.d.ts.map +1 -1
  254. package/dist/core/index.js +9 -1
  255. package/dist/core/index.js.map +1 -1
  256. package/dist/core/{telemetry.d.ts → install-telemetry.d.ts} +1 -1
  257. package/dist/core/install-telemetry.d.ts.map +1 -0
  258. package/dist/core/{telemetry.js → install-telemetry.js} +1 -1
  259. package/dist/core/install-telemetry.js.map +1 -0
  260. package/dist/core/keybindings.d.ts +17 -1
  261. package/dist/core/keybindings.d.ts.map +1 -1
  262. package/dist/core/keybindings.js +24 -6
  263. package/dist/core/keybindings.js.map +1 -1
  264. package/dist/core/learning/learning-audit.d.ts +2 -4
  265. package/dist/core/learning/learning-audit.d.ts.map +1 -1
  266. package/dist/core/learning/learning-audit.js +9 -29
  267. package/dist/core/learning/learning-audit.js.map +1 -1
  268. package/dist/core/learning/learning-gate.d.ts.map +1 -1
  269. package/dist/core/learning/learning-gate.js +1 -6
  270. package/dist/core/learning/learning-gate.js.map +1 -1
  271. package/dist/core/learning/session-learning-decision.d.ts +2 -4
  272. package/dist/core/learning/session-learning-decision.d.ts.map +1 -1
  273. package/dist/core/learning/session-learning-decision.js +9 -29
  274. package/dist/core/learning/session-learning-decision.js.map +1 -1
  275. package/dist/core/memory-controller.d.ts.map +1 -1
  276. package/dist/core/memory-controller.js +4 -4
  277. package/dist/core/memory-controller.js.map +1 -1
  278. package/dist/core/model-capability.d.ts.map +1 -1
  279. package/dist/core/model-capability.js +1 -0
  280. package/dist/core/model-capability.js.map +1 -1
  281. package/dist/core/model-resolver.d.ts +1 -1
  282. package/dist/core/model-resolver.d.ts.map +1 -1
  283. package/dist/core/model-resolver.js +6 -9
  284. package/dist/core/model-resolver.js.map +1 -1
  285. package/dist/core/model-router/intent-classifier.d.ts +1 -4
  286. package/dist/core/model-router/intent-classifier.d.ts.map +1 -1
  287. package/dist/core/model-router/intent-classifier.js +1 -156
  288. package/dist/core/model-router/intent-classifier.js.map +1 -1
  289. package/dist/core/model-router-controller.d.ts.map +1 -1
  290. package/dist/core/model-router-controller.js +2 -2
  291. package/dist/core/model-router-controller.js.map +1 -1
  292. package/dist/core/model-selection-controller.d.ts +4 -4
  293. package/dist/core/model-selection-controller.d.ts.map +1 -1
  294. package/dist/core/model-selection-controller.js.map +1 -1
  295. package/dist/core/model-tool-protocol.d.ts +23 -0
  296. package/dist/core/model-tool-protocol.d.ts.map +1 -0
  297. package/dist/core/model-tool-protocol.js +43 -0
  298. package/dist/core/model-tool-protocol.js.map +1 -0
  299. package/dist/core/models/adaptation-store.d.ts +4 -6
  300. package/dist/core/models/adaptation-store.d.ts.map +1 -1
  301. package/dist/core/models/adaptation-store.js +95 -83
  302. package/dist/core/models/adaptation-store.js.map +1 -1
  303. package/dist/core/models/fitness-store.d.ts +2 -12
  304. package/dist/core/models/fitness-store.d.ts.map +1 -1
  305. package/dist/core/models/fitness-store.js +84 -57
  306. package/dist/core/models/fitness-store.js.map +1 -1
  307. package/dist/core/models/host-state-store.d.ts +34 -0
  308. package/dist/core/models/host-state-store.d.ts.map +1 -0
  309. package/dist/core/models/host-state-store.js +86 -0
  310. package/dist/core/models/host-state-store.js.map +1 -0
  311. package/dist/core/orchestration/agent-resume.d.ts +24 -0
  312. package/dist/core/orchestration/agent-resume.d.ts.map +1 -0
  313. package/dist/core/orchestration/agent-resume.js +90 -0
  314. package/dist/core/orchestration/agent-resume.js.map +1 -0
  315. package/dist/core/orchestration/capability-gateway.d.ts +61 -0
  316. package/dist/core/orchestration/capability-gateway.d.ts.map +1 -0
  317. package/dist/core/orchestration/capability-gateway.js +152 -0
  318. package/dist/core/orchestration/capability-gateway.js.map +1 -0
  319. package/dist/core/orchestration/contracts.d.ts +343 -0
  320. package/dist/core/orchestration/contracts.d.ts.map +1 -0
  321. package/dist/core/orchestration/contracts.js +135 -0
  322. package/dist/core/orchestration/contracts.js.map +1 -0
  323. package/dist/core/orchestration/delegation-ledger.d.ts +56 -0
  324. package/dist/core/orchestration/delegation-ledger.d.ts.map +1 -0
  325. package/dist/core/orchestration/delegation-ledger.js +197 -0
  326. package/dist/core/orchestration/delegation-ledger.js.map +1 -0
  327. package/dist/core/orchestration/event-store.d.ts +83 -0
  328. package/dist/core/orchestration/event-store.d.ts.map +1 -0
  329. package/dist/core/orchestration/event-store.js +560 -0
  330. package/dist/core/orchestration/event-store.js.map +1 -0
  331. package/dist/core/orchestration/lane-tool-manifests.d.ts +9 -0
  332. package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -0
  333. package/dist/core/orchestration/lane-tool-manifests.js +37 -0
  334. package/dist/core/orchestration/lane-tool-manifests.js.map +1 -0
  335. package/dist/core/orchestration/model-binding.d.ts +15 -0
  336. package/dist/core/orchestration/model-binding.d.ts.map +1 -0
  337. package/dist/core/orchestration/model-binding.js +29 -0
  338. package/dist/core/orchestration/model-binding.js.map +1 -0
  339. package/dist/core/orchestration/policy-compiler.d.ts +49 -0
  340. package/dist/core/orchestration/policy-compiler.d.ts.map +1 -0
  341. package/dist/core/orchestration/policy-compiler.js +191 -0
  342. package/dist/core/orchestration/policy-compiler.js.map +1 -0
  343. package/dist/core/orchestration/policy-gate.d.ts +18 -0
  344. package/dist/core/orchestration/policy-gate.d.ts.map +1 -0
  345. package/dist/core/orchestration/policy-gate.js +24 -0
  346. package/dist/core/orchestration/policy-gate.js.map +1 -0
  347. package/dist/core/orchestration/profile-registry.d.ts +51 -0
  348. package/dist/core/orchestration/profile-registry.d.ts.map +1 -0
  349. package/dist/core/orchestration/profile-registry.js +393 -0
  350. package/dist/core/orchestration/profile-registry.js.map +1 -0
  351. package/dist/core/orchestration/profile-store.d.ts +31 -0
  352. package/dist/core/orchestration/profile-store.d.ts.map +1 -0
  353. package/dist/core/orchestration/profile-store.js +136 -0
  354. package/dist/core/orchestration/profile-store.js.map +1 -0
  355. package/dist/core/orchestration/risk-budget.d.ts +9 -0
  356. package/dist/core/orchestration/risk-budget.d.ts.map +1 -0
  357. package/dist/core/orchestration/risk-budget.js +48 -0
  358. package/dist/core/orchestration/risk-budget.js.map +1 -0
  359. package/dist/core/orchestration/task-runtime.d.ts +168 -0
  360. package/dist/core/orchestration/task-runtime.d.ts.map +1 -0
  361. package/dist/core/orchestration/task-runtime.js +1600 -0
  362. package/dist/core/orchestration/task-runtime.js.map +1 -0
  363. package/dist/core/orchestration/work-state-projection.d.ts +32 -0
  364. package/dist/core/orchestration/work-state-projection.d.ts.map +1 -0
  365. package/dist/core/orchestration/work-state-projection.js +116 -0
  366. package/dist/core/orchestration/work-state-projection.js.map +1 -0
  367. package/dist/core/orchestration/worker-execution-contract.d.ts +21 -0
  368. package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -0
  369. package/dist/core/orchestration/worker-execution-contract.js +179 -0
  370. package/dist/core/orchestration/worker-execution-contract.js.map +1 -0
  371. package/dist/core/orchestration/worker-result-adapter.d.ts +21 -0
  372. package/dist/core/orchestration/worker-result-adapter.d.ts.map +1 -0
  373. package/dist/core/orchestration/worker-result-adapter.js +109 -0
  374. package/dist/core/orchestration/worker-result-adapter.js.map +1 -0
  375. package/dist/core/process-identity.d.ts +11 -0
  376. package/dist/core/process-identity.d.ts.map +1 -0
  377. package/dist/core/process-identity.js +26 -0
  378. package/dist/core/process-identity.js.map +1 -0
  379. package/dist/core/process-matrix/codes.d.ts +14 -3
  380. package/dist/core/process-matrix/codes.d.ts.map +1 -1
  381. package/dist/core/process-matrix/codes.js.map +1 -1
  382. package/dist/core/process-matrix/resume-launcher.d.ts +26 -0
  383. package/dist/core/process-matrix/resume-launcher.d.ts.map +1 -0
  384. package/dist/core/process-matrix/resume-launcher.js +62 -0
  385. package/dist/core/process-matrix/resume-launcher.js.map +1 -0
  386. package/dist/core/process-matrix/runtime.d.ts +37 -22
  387. package/dist/core/process-matrix/runtime.d.ts.map +1 -1
  388. package/dist/core/process-matrix/runtime.js +399 -76
  389. package/dist/core/process-matrix/runtime.js.map +1 -1
  390. package/dist/core/process-matrix/store.d.ts +5 -2
  391. package/dist/core/process-matrix/store.d.ts.map +1 -1
  392. package/dist/core/process-matrix/store.js +123 -14
  393. package/dist/core/process-matrix/store.js.map +1 -1
  394. package/dist/core/process-matrix/supervisor.d.ts +10 -7
  395. package/dist/core/process-matrix/supervisor.d.ts.map +1 -1
  396. package/dist/core/process-matrix/supervisor.js +45 -14
  397. package/dist/core/process-matrix/supervisor.js.map +1 -1
  398. package/dist/core/profile-registry.d.ts.map +1 -1
  399. package/dist/core/profile-registry.js +6 -8
  400. package/dist/core/profile-registry.js.map +1 -1
  401. package/dist/core/reflection-controller.d.ts +4 -4
  402. package/dist/core/reflection-controller.d.ts.map +1 -1
  403. package/dist/core/reflection-controller.js +2 -1
  404. package/dist/core/reflection-controller.js.map +1 -1
  405. package/dist/core/reload-blockers.d.ts.map +1 -1
  406. package/dist/core/reload-blockers.js +6 -8
  407. package/dist/core/reload-blockers.js.map +1 -1
  408. package/dist/core/research/evidence-bundle.d.ts.map +1 -1
  409. package/dist/core/research/evidence-bundle.js +1 -6
  410. package/dist/core/research/evidence-bundle.js.map +1 -1
  411. package/dist/core/research/lane-model-resolver.d.ts +33 -0
  412. package/dist/core/research/lane-model-resolver.d.ts.map +1 -0
  413. package/dist/core/research/lane-model-resolver.js +65 -0
  414. package/dist/core/research/lane-model-resolver.js.map +1 -0
  415. package/dist/core/research/model-fitness-controller.d.ts +38 -0
  416. package/dist/core/research/model-fitness-controller.d.ts.map +1 -0
  417. package/dist/core/research/model-fitness-controller.js +106 -0
  418. package/dist/core/research/model-fitness-controller.js.map +1 -0
  419. package/dist/core/research/model-fitness.d.ts +1 -1
  420. package/dist/core/research/model-fitness.d.ts.map +1 -1
  421. package/dist/core/research/model-fitness.js +4 -4
  422. package/dist/core/research/model-fitness.js.map +1 -1
  423. package/dist/core/research/research-gate.d.ts.map +1 -1
  424. package/dist/core/research/research-gate.js +7 -7
  425. package/dist/core/research/research-gate.js.map +1 -1
  426. package/dist/core/research/research-lane-controller.d.ts +62 -0
  427. package/dist/core/research/research-lane-controller.d.ts.map +1 -0
  428. package/dist/core/research/research-lane-controller.js +292 -0
  429. package/dist/core/research/research-lane-controller.js.map +1 -0
  430. package/dist/core/research/session-evidence-bundle.d.ts +2 -4
  431. package/dist/core/research/session-evidence-bundle.d.ts.map +1 -1
  432. package/dist/core/research/session-evidence-bundle.js +10 -46
  433. package/dist/core/research/session-evidence-bundle.js.map +1 -1
  434. package/dist/core/resource-loader.d.ts.map +1 -1
  435. package/dist/core/resource-loader.js +7 -2
  436. package/dist/core/resource-loader.js.map +1 -1
  437. package/dist/core/risk-classifier.d.ts +6 -0
  438. package/dist/core/risk-classifier.d.ts.map +1 -0
  439. package/dist/core/risk-classifier.js +225 -0
  440. package/dist/core/risk-classifier.js.map +1 -0
  441. package/dist/core/runtime-builder.d.ts +26 -20
  442. package/dist/core/runtime-builder.d.ts.map +1 -1
  443. package/dist/core/runtime-builder.js +237 -178
  444. package/dist/core/runtime-builder.js.map +1 -1
  445. package/dist/core/sdk.d.ts +6 -3
  446. package/dist/core/sdk.d.ts.map +1 -1
  447. package/dist/core/sdk.js +61 -24
  448. package/dist/core/sdk.js.map +1 -1
  449. package/dist/core/session-analytics.d.ts.map +1 -1
  450. package/dist/core/session-analytics.js +28 -1
  451. package/dist/core/session-analytics.js.map +1 -1
  452. package/dist/core/session-image-store.d.ts +33 -0
  453. package/dist/core/session-image-store.d.ts.map +1 -0
  454. package/dist/core/session-image-store.js +283 -0
  455. package/dist/core/session-image-store.js.map +1 -0
  456. package/dist/core/session-role.d.ts +6 -4
  457. package/dist/core/session-role.d.ts.map +1 -1
  458. package/dist/core/session-role.js +10 -4
  459. package/dist/core/session-role.js.map +1 -1
  460. package/dist/core/session-snapshot.d.ts +34 -0
  461. package/dist/core/session-snapshot.d.ts.map +1 -0
  462. package/dist/core/session-snapshot.js +68 -0
  463. package/dist/core/session-snapshot.js.map +1 -0
  464. package/dist/core/session-supervision-runtime.d.ts +31 -0
  465. package/dist/core/session-supervision-runtime.d.ts.map +1 -0
  466. package/dist/core/session-supervision-runtime.js +97 -0
  467. package/dist/core/session-supervision-runtime.js.map +1 -0
  468. package/dist/core/settings-manager.d.ts +9 -4
  469. package/dist/core/settings-manager.d.ts.map +1 -1
  470. package/dist/core/settings-manager.js +80 -28
  471. package/dist/core/settings-manager.js.map +1 -1
  472. package/dist/core/tasks/session-task-state.d.ts +2 -4
  473. package/dist/core/tasks/session-task-state.d.ts.map +1 -1
  474. package/dist/core/tasks/session-task-state.js +10 -28
  475. package/dist/core/tasks/session-task-state.js.map +1 -1
  476. package/dist/core/tasks/task-projection.d.ts +20 -0
  477. package/dist/core/tasks/task-projection.d.ts.map +1 -0
  478. package/dist/core/tasks/task-projection.js +47 -0
  479. package/dist/core/tasks/task-projection.js.map +1 -0
  480. package/dist/core/tasks/task-state.d.ts +4 -0
  481. package/dist/core/tasks/task-state.d.ts.map +1 -1
  482. package/dist/core/tasks/task-state.js +28 -11
  483. package/dist/core/tasks/task-state.js.map +1 -1
  484. package/dist/core/tool-capability-policy.d.ts +13 -0
  485. package/dist/core/tool-capability-policy.d.ts.map +1 -0
  486. package/dist/core/tool-capability-policy.js +85 -0
  487. package/dist/core/tool-capability-policy.js.map +1 -0
  488. package/dist/core/tool-protocol-controller.d.ts +91 -0
  489. package/dist/core/tool-protocol-controller.d.ts.map +1 -0
  490. package/dist/core/tool-protocol-controller.js +512 -0
  491. package/dist/core/tool-protocol-controller.js.map +1 -0
  492. package/dist/core/tool-recovery-log-records.d.ts +2 -3
  493. package/dist/core/tool-recovery-log-records.d.ts.map +1 -1
  494. package/dist/core/tool-recovery-log-records.js +9 -35
  495. package/dist/core/tool-recovery-log-records.js.map +1 -1
  496. package/dist/core/tool-selection/tool-performance-store.d.ts +3 -7
  497. package/dist/core/tool-selection/tool-performance-store.d.ts.map +1 -1
  498. package/dist/core/tool-selection/tool-performance-store.js +97 -138
  499. package/dist/core/tool-selection/tool-performance-store.js.map +1 -1
  500. package/dist/core/tools/ask-question.d.ts +124 -0
  501. package/dist/core/tools/ask-question.d.ts.map +1 -0
  502. package/dist/core/tools/ask-question.js +693 -0
  503. package/dist/core/tools/ask-question.js.map +1 -0
  504. package/dist/core/tools/delegate-status.d.ts +31 -3
  505. package/dist/core/tools/delegate-status.d.ts.map +1 -1
  506. package/dist/core/tools/delegate-status.js +149 -29
  507. package/dist/core/tools/delegate-status.js.map +1 -1
  508. package/dist/core/tools/delegate.d.ts +15 -13
  509. package/dist/core/tools/delegate.d.ts.map +1 -1
  510. package/dist/core/tools/delegate.js +108 -23
  511. package/dist/core/tools/delegate.js.map +1 -1
  512. package/dist/core/tools/extensionify.d.ts.map +1 -1
  513. package/dist/core/tools/extensionify.js +1 -0
  514. package/dist/core/tools/extensionify.js.map +1 -1
  515. package/dist/core/tools/goal.d.ts +5 -5
  516. package/dist/core/tools/goal.d.ts.map +1 -1
  517. package/dist/core/tools/goal.js +10 -10
  518. package/dist/core/tools/goal.js.map +1 -1
  519. package/dist/core/tools/model-fitness.d.ts.map +1 -1
  520. package/dist/core/tools/model-fitness.js +2 -2
  521. package/dist/core/tools/model-fitness.js.map +1 -1
  522. package/dist/core/tools/orchestration-panel.d.ts +43 -0
  523. package/dist/core/tools/orchestration-panel.d.ts.map +1 -0
  524. package/dist/core/tools/orchestration-panel.js +168 -0
  525. package/dist/core/tools/orchestration-panel.js.map +1 -0
  526. package/dist/core/tools/run-process.d.ts +26 -0
  527. package/dist/core/tools/run-process.d.ts.map +1 -0
  528. package/dist/core/tools/run-process.js +138 -0
  529. package/dist/core/tools/run-process.js.map +1 -0
  530. package/dist/core/tools/task-steps.d.ts +2 -0
  531. package/dist/core/tools/task-steps.d.ts.map +1 -1
  532. package/dist/core/tools/task-steps.js +102 -0
  533. package/dist/core/tools/task-steps.js.map +1 -1
  534. package/dist/core/tools/tmux-dispatch.d.ts +3 -5
  535. package/dist/core/tools/tmux-dispatch.d.ts.map +1 -1
  536. package/dist/core/tools/tmux-dispatch.js +4 -4
  537. package/dist/core/tools/tmux-dispatch.js.map +1 -1
  538. package/dist/core/tools/windows-shell-engine.d.ts.map +1 -1
  539. package/dist/core/tools/windows-shell-engine.js +4 -6
  540. package/dist/core/tools/windows-shell-engine.js.map +1 -1
  541. package/dist/core/util/bounded-jsonl.d.ts +10 -0
  542. package/dist/core/util/bounded-jsonl.d.ts.map +1 -0
  543. package/dist/core/util/bounded-jsonl.js +75 -0
  544. package/dist/core/util/bounded-jsonl.js.map +1 -0
  545. package/dist/core/util/value-guards.d.ts +5 -0
  546. package/dist/core/util/value-guards.d.ts.map +1 -0
  547. package/dist/core/util/value-guards.js +12 -0
  548. package/dist/core/util/value-guards.js.map +1 -0
  549. package/dist/core/worktree-sync/store.d.ts +3 -3
  550. package/dist/core/worktree-sync/store.d.ts.map +1 -1
  551. package/dist/core/worktree-sync/store.js +10 -5
  552. package/dist/core/worktree-sync/store.js.map +1 -1
  553. package/dist/index.d.ts +13 -3
  554. package/dist/index.d.ts.map +1 -1
  555. package/dist/index.js +12 -2
  556. package/dist/index.js.map +1 -1
  557. package/dist/main.d.ts.map +1 -1
  558. package/dist/main.js +128 -44
  559. package/dist/main.js.map +1 -1
  560. package/dist/migrations.d.ts +4 -6
  561. package/dist/migrations.d.ts.map +1 -1
  562. package/dist/migrations.js +186 -28
  563. package/dist/migrations.js.map +1 -1
  564. package/dist/modes/interactive/clipboard-input.d.ts +7 -1
  565. package/dist/modes/interactive/clipboard-input.d.ts.map +1 -1
  566. package/dist/modes/interactive/clipboard-input.js +44 -6
  567. package/dist/modes/interactive/clipboard-input.js.map +1 -1
  568. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  569. package/dist/modes/interactive/components/settings-selector.js +2 -2
  570. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  571. package/dist/modes/interactive/config-backup.d.ts.map +1 -1
  572. package/dist/modes/interactive/config-backup.js +5 -4
  573. package/dist/modes/interactive/config-backup.js.map +1 -1
  574. package/dist/modes/interactive/extension-ui-host.d.ts +14 -0
  575. package/dist/modes/interactive/extension-ui-host.d.ts.map +1 -1
  576. package/dist/modes/interactive/extension-ui-host.js +76 -15
  577. package/dist/modes/interactive/extension-ui-host.js.map +1 -1
  578. package/dist/modes/interactive/interactive-mode.d.ts +3 -0
  579. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  580. package/dist/modes/interactive/interactive-mode.js +63 -1
  581. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  582. package/dist/modes/interactive/key-handlers.d.ts.map +1 -1
  583. package/dist/modes/interactive/key-handlers.js +1 -1
  584. package/dist/modes/interactive/key-handlers.js.map +1 -1
  585. package/dist/modes/interactive/profile-menu-controller.d.ts.map +1 -1
  586. package/dist/modes/interactive/profile-menu-controller.js +7 -7
  587. package/dist/modes/interactive/profile-menu-controller.js.map +1 -1
  588. package/dist/modes/interactive/report-commands.d.ts.map +1 -1
  589. package/dist/modes/interactive/report-commands.js +21 -0
  590. package/dist/modes/interactive/report-commands.js.map +1 -1
  591. package/dist/modes/interactive/session-flow-commands.d.ts +17 -2
  592. package/dist/modes/interactive/session-flow-commands.d.ts.map +1 -1
  593. package/dist/modes/interactive/session-flow-commands.js +50 -17
  594. package/dist/modes/interactive/session-flow-commands.js.map +1 -1
  595. package/dist/modes/interactive/session-io-commands.d.ts.map +1 -1
  596. package/dist/modes/interactive/session-io-commands.js +16 -6
  597. package/dist/modes/interactive/session-io-commands.js.map +1 -1
  598. package/dist/modes/interactive/session-replacement-errors.d.ts +7 -0
  599. package/dist/modes/interactive/session-replacement-errors.d.ts.map +1 -0
  600. package/dist/modes/interactive/session-replacement-errors.js +15 -0
  601. package/dist/modes/interactive/session-replacement-errors.js.map +1 -0
  602. package/dist/modes/interactive/startup-checks.d.ts.map +1 -1
  603. package/dist/modes/interactive/startup-checks.js +1 -1
  604. package/dist/modes/interactive/startup-checks.js.map +1 -1
  605. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  606. package/dist/modes/rpc/rpc-mode.js +82 -23
  607. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  608. package/dist/modes/rpc/rpc-types.d.ts +15 -0
  609. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  610. package/dist/modes/rpc/rpc-types.js +138 -1
  611. package/dist/modes/rpc/rpc-types.js.map +1 -1
  612. package/dist/utils/clipboard-image.d.ts.map +1 -1
  613. package/dist/utils/clipboard-image.js +2 -13
  614. package/dist/utils/clipboard-image.js.map +1 -1
  615. package/dist/utils/clipboard-native.d.ts +1 -0
  616. package/dist/utils/clipboard-native.d.ts.map +1 -1
  617. package/dist/utils/clipboard-native.js.map +1 -1
  618. package/dist/utils/clipboard.d.ts +1 -0
  619. package/dist/utils/clipboard.d.ts.map +1 -1
  620. package/dist/utils/clipboard.js +52 -1
  621. package/dist/utils/clipboard.js.map +1 -1
  622. package/dist/utils/platform.d.ts +3 -0
  623. package/dist/utils/platform.d.ts.map +1 -0
  624. package/dist/utils/platform.js +8 -0
  625. package/dist/utils/platform.js.map +1 -0
  626. package/dist/utils/work-directory.d.ts +11 -0
  627. package/dist/utils/work-directory.d.ts.map +1 -1
  628. package/dist/utils/work-directory.js +30 -9
  629. package/dist/utils/work-directory.js.map +1 -1
  630. package/docs/UI_POLISH_ORCHESTRATION.md +44 -0
  631. package/docs/UI_QUALITY_ORCHESTRATION.md +30 -0
  632. package/docs/docs.json +4 -0
  633. package/docs/extensions.md +62 -2
  634. package/docs/harness-architecture.md +156 -0
  635. package/docs/keybindings.md +11 -1
  636. package/docs/process-matrix.md +59 -26
  637. package/docs/rpc.md +45 -2
  638. package/docs/sessions.md +15 -0
  639. package/docs/settings.md +125 -11
  640. package/docs/task-steps.md +8 -0
  641. package/docs/telemetry.md +19 -0
  642. package/docs/tmux-agent-manager.md +10 -3
  643. package/docs/ui-reference/README.md +9 -0
  644. package/docs/ui-reference/orchestration-after.txt +7 -0
  645. package/docs/ui-reference/orchestration-before.txt +7 -0
  646. package/docs/ui-reference/orchestration-reference.txt +6 -0
  647. package/docs/usage.md +14 -2
  648. package/docs/work-directory.md +19 -8
  649. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  650. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  651. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  652. package/examples/extensions/question.ts +34 -245
  653. package/examples/extensions/questionnaire.ts +41 -407
  654. package/examples/extensions/sandbox/package-lock.json +2 -2
  655. package/examples/extensions/sandbox/package.json +1 -1
  656. package/examples/extensions/with-deps/package-lock.json +2 -2
  657. package/examples/extensions/with-deps/package.json +1 -1
  658. package/npm-shrinkwrap.json +12 -12
  659. package/package.json +4 -4
  660. package/dist/core/delegation/session-worker-result.d.ts +0 -46
  661. package/dist/core/delegation/session-worker-result.d.ts.map +0 -1
  662. package/dist/core/delegation/session-worker-result.js +0 -113
  663. package/dist/core/delegation/session-worker-result.js.map +0 -1
  664. package/dist/core/delegation/worker-result.d.ts.map +0 -1
  665. package/dist/core/delegation/worker-result.js.map +0 -1
  666. package/dist/core/telemetry.d.ts.map +0 -1
  667. package/dist/core/telemetry.js.map +0 -1
@@ -4,7 +4,12 @@ import * as fs from "node:fs";
4
4
  import { homedir } from "node:os";
5
5
  import * as path from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
- import { type ExtensionAPI, type ExtensionContext, getProcessWorkRun } from "@caupulican/pi-adaptative";
7
+ import {
8
+ type ExtensionAPI,
9
+ type ExtensionContext,
10
+ getProcessWorkRun,
11
+ PI_ORCHESTRATION_AGENT_ID_ENV,
12
+ } from "@caupulican/pi-adaptative";
8
13
  import type { AgentToolResult } from "@caupulican/pi-agent-core";
9
14
  import type { Usage } from "@caupulican/pi-ai";
10
15
  import { Type } from "typebox";
@@ -14,6 +19,7 @@ import {
14
19
  buildLaunchProfileFlags,
15
20
  buildTombstone,
16
21
  countGrantUsages,
22
+ DEFAULT_READ_BIASED_TOOLS,
17
23
  decodeTmuxWorkerUsageClaim,
18
24
  describeGrant,
19
25
  GRANT_CUSTOM_TYPE,
@@ -99,8 +105,8 @@ type Params = {
99
105
  dryRun?: boolean;
100
106
  force?: boolean;
101
107
  confirm?: string;
102
- /** Goal this dispatch/grant is scoped to. Optional today (no caller wires it yet); accepted so a
103
- * future goal-loop dispatch can pass it through to grant scope/coverage checks without a shape change. */
108
+ /** Goal this dispatch/grant is scoped to. Goal-bound dispatch wires this through to grant
109
+ * coverage, managed-lane ownership, and the child process's task-recovery fence. */
104
110
  goalId?: string;
105
111
  /** grant_dispatch: target agent for the standing grant. revoke_grant: unused (the active grant's own
106
112
  * agent is used for its tombstone; this field is not required to revoke). */
@@ -162,6 +168,15 @@ type FireAgentPlan = {
162
168
  /** Mirrors `AgentSpec.worktreeLane` -- carried onto the plan so `applyLaunchProfile` (per-agent
163
169
  * flags) and the dispatch-phase `reportManagedLane` call can both read it after `buildFireTaskPlan`. */
164
170
  worktreeLane?: string;
171
+ /** Durable host-lifecycle metadata for the current turn. */
172
+ dispatchAuthorizationId?: string;
173
+ dispatchAuthorizationKind?: "standing-grant" | "one-shot-owner-approval" | "legacy-recovery";
174
+ dispatchAllowedTools?: string[];
175
+ dispatchWritePaths?: string[];
176
+ dispatchMaxCostUsd?: number;
177
+ dispatchInstructions?: string;
178
+ dispatchGoalId?: string;
179
+ dispatchLeaseTtlMs?: number;
165
180
  };
166
181
  type FireTaskPlan = {
167
182
  id: string;
@@ -192,22 +207,37 @@ type FireTaskPlan = {
192
207
  * synthesized single-agent, single-turn spec (send_followup, reconcile resume) can reuse it without
193
208
  * fabricating unrelated FireTaskPlan fields (createdAt, jobPath, task, ...). */
194
209
  type PaneWatcherJobSpec = Pick<FireTaskPlan, "id" | "sessionName" | "deadlineSeconds" | "agents">;
195
- type ManagedLaneBridgeEvent = {
210
+ type ManagedLaneDispatchBridge = {
211
+ sequence: number;
212
+ instructions: string;
213
+ profileId: string;
214
+ provider: string;
215
+ authorizationId: string;
216
+ authorizationKind: "standing-grant" | "one-shot-owner-approval" | "legacy-recovery";
217
+ allowedTools: readonly string[];
218
+ writePaths: readonly string[];
219
+ maxCostUsd?: number;
220
+ leaseTtlMs: number;
221
+ };
222
+ type ManagedLaneBridgeEventBase = {
196
223
  laneId: string;
197
- phase: "dispatch" | "terminal";
198
224
  goalId?: string;
199
- status?: string;
200
- reasonCode?: string;
201
- changedFiles?: string[];
202
225
  worktreeLaneKey?: string;
203
- request?: unknown;
204
- usage?: Usage;
205
226
  };
227
+ type ManagedLaneBridgeEvent =
228
+ | (ManagedLaneBridgeEventBase & { phase: "dispatch"; dispatch: ManagedLaneDispatchBridge })
229
+ | (ManagedLaneBridgeEventBase & {
230
+ phase: "terminal";
231
+ status?: string;
232
+ reasonCode?: string;
233
+ changedFiles?: string[];
234
+ usage?: Usage;
235
+ });
206
236
  /** The subset of `ExtensionAPI` this file calls through a narrow local type instead of the full
207
237
  * `ExtensionAPI`, so a lightweight test double only needs to implement what a given test path actually
208
- * exercises. `reportManagedLane`/`reportSpawnedUsage` are wired live host-side (the lane/usage bridge)
209
- * but stay optional-chained here best-effort reporting, never a gate: a host/test double that omits
210
- * them degrades to "the lane/usage claim was not reported," never a crash or a silently-skipped launch.
238
+ * exercises. Production hosts provide `reportManagedLane`, making its pre-launch durable reservation a
239
+ * hard gate. The optional shape only preserves standalone extension-test hosts; without the bridge,
240
+ * lifecycle durability is explicitly unavailable. `reportSpawnedUsage` remains an advisory claim sink.
211
241
  * `appendEntry`/`getFlag`/`registerFlag` back the STANDING GRANT itself (session persistence + the
212
242
  * non-interactive opt-in flag); `registerFlag` is called unconditionally at extension load so it stays
213
243
  * optional-chained too, while `appendEntry`/`getFlag` are asserted present at the point a grant action
@@ -226,6 +256,126 @@ function agentLaneId(jobId: string, agentId: string): string {
226
256
  return `tmux:${jobId}:${agentId}`;
227
257
  }
228
258
 
259
+ function managedDispatch(job: FireTaskPlan, agent: FireAgentPlan): ManagedLaneDispatchBridge {
260
+ const sequence = agent.currentTurn ?? 1;
261
+ const instructions = agent.dispatchInstructions ?? job.task;
262
+ const authorizationId = agent.dispatchAuthorizationId ?? `legacy-job:${job.id}:turn:${sequence}`;
263
+ return {
264
+ sequence,
265
+ instructions,
266
+ profileId: `tmux:${agent.provider}`,
267
+ provider: agent.provider,
268
+ authorizationId,
269
+ authorizationKind: agent.dispatchAuthorizationKind ?? "legacy-recovery",
270
+ allowedTools: agent.dispatchAllowedTools ?? DEFAULT_READ_BIASED_TOOLS,
271
+ writePaths: agent.dispatchWritePaths ?? [],
272
+ ...(agent.dispatchMaxCostUsd !== undefined ? { maxCostUsd: agent.dispatchMaxCostUsd } : {}),
273
+ leaseTtlMs: agent.dispatchLeaseTtlMs ?? job.deadlineSeconds * 1_000,
274
+ };
275
+ }
276
+
277
+ function managedAuthorization(
278
+ grant: TmuxDispatchGrant | undefined,
279
+ fallbackId: string,
280
+ ): {
281
+ authorizationId: string;
282
+ authorizationKind: "standing-grant" | "one-shot-owner-approval";
283
+ launchSource: LaunchProfileSource;
284
+ allowedTools: string[];
285
+ writePaths: string[];
286
+ maxCostUsd?: number;
287
+ } {
288
+ const launchSource = grant ? launchProfileSourceFromGrant(grant) : ONE_SHOT_LAUNCH_PROFILE_SOURCE;
289
+ return {
290
+ authorizationId: grant?.grantId ?? fallbackId,
291
+ authorizationKind: grant ? "standing-grant" : "one-shot-owner-approval",
292
+ launchSource,
293
+ allowedTools: [...(launchSource.allowedTools?.length ? launchSource.allowedTools : DEFAULT_READ_BIASED_TOOLS)],
294
+ writePaths: [...(launchSource.writePaths ?? [])],
295
+ ...(grant?.budget.maxUsdAdvisory !== undefined ? { maxCostUsd: grant.budget.maxUsdAdvisory } : {}),
296
+ };
297
+ }
298
+
299
+ function applyManagedAuthorization(
300
+ agent: FireAgentPlan,
301
+ authorization: ReturnType<typeof managedAuthorization>,
302
+ args: { instructions: string; goalId?: string; leaseTtlMs: number },
303
+ ): void {
304
+ agent.dispatchAuthorizationId = authorization.authorizationId;
305
+ agent.dispatchAuthorizationKind = authorization.authorizationKind;
306
+ agent.dispatchAllowedTools = [...authorization.allowedTools];
307
+ agent.dispatchWritePaths = [...authorization.writePaths];
308
+ if (authorization.maxCostUsd !== undefined) agent.dispatchMaxCostUsd = authorization.maxCostUsd;
309
+ else delete agent.dispatchMaxCostUsd;
310
+ agent.dispatchInstructions = args.instructions;
311
+ agent.dispatchGoalId = args.goalId;
312
+ agent.dispatchLeaseTtlMs = args.leaseTtlMs;
313
+ }
314
+
315
+ function reportManagedDispatchReservations(
316
+ bridge: HostBridge,
317
+ job: FireTaskPlan,
318
+ agents: readonly FireAgentPlan[],
319
+ ): void {
320
+ if (!bridge.reportManagedLane) return;
321
+ const attemptedLaneIds: string[] = [];
322
+ try {
323
+ for (const agent of agents) {
324
+ const laneId = agentLaneId(job.id, agent.id);
325
+ attemptedLaneIds.push(laneId);
326
+ bridge.reportManagedLane({
327
+ laneId,
328
+ phase: "dispatch",
329
+ goalId: agent.dispatchGoalId,
330
+ worktreeLaneKey: agent.worktreeLane,
331
+ dispatch: managedDispatch(job, agent),
332
+ });
333
+ }
334
+ } catch (error: unknown) {
335
+ for (const laneId of attemptedLaneIds) {
336
+ try {
337
+ bridge.reportManagedLane({
338
+ laneId,
339
+ phase: "terminal",
340
+ status: "failed",
341
+ reasonCode: "managed_process_launch_reservation_failed",
342
+ });
343
+ } catch {
344
+ // Preserve the reservation error; durable leases fence any compensation failure.
345
+ }
346
+ }
347
+ throw error;
348
+ }
349
+ }
350
+
351
+ function reportManagedLaunchFailure(bridge: HostBridge, job: FireTaskPlan, reasonCode: string): void {
352
+ if (!bridge.reportManagedLane) return;
353
+ for (const agent of job.agents) {
354
+ reportManagedAgentFailure(bridge, job.id, agent.id, reasonCode);
355
+ }
356
+ }
357
+
358
+ function reportManagedAgentFailure(bridge: HostBridge, jobId: string, agentId: string, reasonCode: string): void {
359
+ if (!bridge.reportManagedLane) return;
360
+ try {
361
+ bridge.reportManagedLane({
362
+ laneId: agentLaneId(jobId, agentId),
363
+ phase: "terminal",
364
+ status: "failed",
365
+ reasonCode,
366
+ });
367
+ } catch {
368
+ // Preserve the launch failure; durable leases fence any terminal-report failure.
369
+ }
370
+ }
371
+
372
+ function sameStringValues(left: readonly string[], right: readonly string[]): boolean {
373
+ if (left.length !== right.length) return false;
374
+ const sortedLeft = [...left].sort();
375
+ const sortedRight = [...right].sort();
376
+ return sortedLeft.every((value, index) => value === sortedRight[index]);
377
+ }
378
+
229
379
  const EXTENSION_ROOT = path.dirname(fileURLToPath(import.meta.url));
230
380
  export function getTmuxAgentManagerDataRoot(): string {
231
381
  const agentDir =
@@ -379,6 +529,9 @@ function runTmux(args: string[], timeoutMs = 5_000): RunResult {
379
529
  args: [tmux, ...args],
380
530
  };
381
531
  }
532
+ function requireTmuxRun(result: RunResult, action: string): void {
533
+ if (!result.ok) throw new Error(`${action} failed: ${result.error || result.stderr || `exit ${result.status}`}`);
534
+ }
382
535
  function detectTmux(): TmuxDetection {
383
536
  const tmuxBin = process.env.PI_TMUX_MANAGER_TMUX_BIN || findExecutable("tmux");
384
537
  const errors: string[] = [];
@@ -887,6 +1040,22 @@ function turnWatcherPath(job: FireTaskPlan, turn: number): string {
887
1040
  function currentResultPath(job: FireTaskPlan, agent: FireAgentPlan): string {
888
1041
  return turnResultPath(job.jobDir, agent.id, agent.currentTurn ?? 1, agent.resultPath);
889
1042
  }
1043
+
1044
+ function persistAgentTurnFailure(jobId: string, agentId: string, turn: number, reason: string): void {
1045
+ persistJobPatch(jobId, (current) => {
1046
+ const agent = current.agents.find((entry) => entry.id === agentId);
1047
+ if (!agent || agent.currentTurn !== turn) return undefined;
1048
+ const result: AgentResult = {
1049
+ status: "failed",
1050
+ detectedAt: new Date().toISOString(),
1051
+ reason,
1052
+ };
1053
+ fs.writeFileSync(currentResultPath(current, agent), `${JSON.stringify(result, null, 2)}\n`, { mode: 0o600 });
1054
+ agent.result = result;
1055
+ delete agent.pendingTurn;
1056
+ return current;
1057
+ });
1058
+ }
890
1059
  /** Atomically read-modify-write job.json, always from a FRESH read (never from a caller's possibly
891
1060
  * stale in-memory copy), mirroring the temp+rename pattern the original notify path used. */
892
1061
  function persistJobPatch(jobId: string, mutate: (current: FireTaskPlan) => FireTaskPlan | undefined): FireTaskPlan {
@@ -899,8 +1068,8 @@ function persistJobPatch(jobId: string, mutate: (current: FireTaskPlan) => FireT
899
1068
  return mutated;
900
1069
  }
901
1070
  function sendCommandToPane(paneId: string, command: string): void {
902
- runTmux(["send-keys", "-t", paneId, "-l", command]);
903
- runTmux(["send-keys", "-t", paneId, "Enter"]);
1071
+ requireTmuxRun(runTmux(["send-keys", "-t", paneId, "-l", command]), `tmux command injection for ${paneId}`);
1072
+ requireTmuxRun(runTmux(["send-keys", "-t", paneId, "Enter"]), `tmux command submit for ${paneId}`);
904
1073
  }
905
1074
  function launchTmuxSession(
906
1075
  sessionName: string,
@@ -921,36 +1090,50 @@ function launchTmuxSession(
921
1090
  runs.push(create);
922
1091
  if (!create.ok)
923
1092
  throw new Error(`tmux new-session failed: ${create.error || create.stderr || `exit ${create.status}`}`);
924
- const firstPane = create.stdout.trim();
925
- paneIds.push(firstPane);
926
- sendCommandToPane(firstPane, first.command);
927
- for (const pane of panes.slice(1)) {
928
- const split = runTmux(
929
- ["split-window", "-d", "-P", "-F", "#{pane_id}", "-t", `${sessionName}:0`, "-c", pane.cwd || cwd],
930
- 5_000,
931
- );
932
- runs.push(split);
933
- if (!split.ok)
934
- throw new Error(`tmux split-window failed: ${split.error || split.stderr || `exit ${split.status}`}`);
935
- const paneId = split.stdout.trim();
936
- paneIds.push(paneId);
937
- sendCommandToPane(paneId, pane.command);
1093
+ try {
1094
+ const firstPane = create.stdout.trim();
1095
+ paneIds.push(firstPane);
1096
+ sendCommandToPane(firstPane, first.command);
1097
+ for (const pane of panes.slice(1)) {
1098
+ const split = runTmux(
1099
+ ["split-window", "-d", "-P", "-F", "#{pane_id}", "-t", `${sessionName}:0`, "-c", pane.cwd || cwd],
1100
+ 5_000,
1101
+ );
1102
+ runs.push(split);
1103
+ if (!split.ok)
1104
+ throw new Error(`tmux split-window failed: ${split.error || split.stderr || `exit ${split.status}`}`);
1105
+ const paneId = split.stdout.trim();
1106
+ paneIds.push(paneId);
1107
+ sendCommandToPane(paneId, pane.command);
1108
+ }
1109
+ runs.push(runTmux(["select-layout", "-t", `${sessionName}:0`, "tiled"], 3_000));
1110
+ return { runs, paneIds };
1111
+ } catch (error: unknown) {
1112
+ runTmux(["kill-session", "-t", sessionName], 5_000);
1113
+ throw error;
938
1114
  }
939
- runs.push(runTmux(["select-layout", "-t", `${sessionName}:0`, "tiled"], 3_000));
940
- return { runs, paneIds };
941
1115
  }
942
1116
  function injectPromptToPane(paneId: string, prompt: string, provider: Provider): void {
943
1117
  const text = interactivePromptText(prompt);
944
1118
  if (provider === "claude") {
945
1119
  const bufferName = `pi-tmux-${crypto.randomBytes(4).toString("hex")}`;
946
- runTmux(["set-buffer", "-b", bufferName, text], 10_000);
947
- runTmux(["paste-buffer", "-b", bufferName, "-t", paneId], 10_000);
948
- runTmux(["send-keys", "-t", paneId, "Enter"], 3_000);
949
- runTmux(["delete-buffer", "-b", bufferName], 3_000);
1120
+ requireTmuxRun(runTmux(["set-buffer", "-b", bufferName, text], 10_000), "tmux prompt buffer creation");
1121
+ try {
1122
+ requireTmuxRun(
1123
+ runTmux(["paste-buffer", "-b", bufferName, "-t", paneId], 10_000),
1124
+ `tmux prompt injection for ${paneId}`,
1125
+ );
1126
+ requireTmuxRun(runTmux(["send-keys", "-t", paneId, "Enter"], 3_000), `tmux prompt submit for ${paneId}`);
1127
+ } finally {
1128
+ runTmux(["delete-buffer", "-b", bufferName], 3_000);
1129
+ }
950
1130
  return;
951
1131
  }
952
- runTmux(["send-keys", "-t", paneId, "-l", text], 10_000);
953
- runTmux(["send-keys", "-t", paneId, provider === "agy" ? "C-m" : "Enter"], 3_000);
1132
+ requireTmuxRun(runTmux(["send-keys", "-t", paneId, "-l", text], 10_000), `tmux prompt injection for ${paneId}`);
1133
+ requireTmuxRun(
1134
+ runTmux(["send-keys", "-t", paneId, provider === "agy" ? "C-m" : "Enter"], 3_000),
1135
+ `tmux prompt submit for ${paneId}`,
1136
+ );
954
1137
  }
955
1138
  /** Write a fresh per-turn prompt + single-agent watcher script and arm `pipe-pane -O` for it. Used by
956
1139
  * send_followup to open a NEW turn on an already-live pane. Does not inject the prompt text into the
@@ -1296,7 +1479,11 @@ function applyLaunchProfile(job: FireTaskPlan, source: LaunchProfileSource): voi
1296
1479
  const flags = buildLaunchProfileFlags(
1297
1480
  agent.worktreeLane ? { ...source, worktreeLane: agent.worktreeLane } : source,
1298
1481
  );
1299
- agent.command = appendLaunchProfileFlags(agent.command || defaultProviderInvocation(agent.provider), flags);
1482
+ const profiledCommand = appendLaunchProfileFlags(
1483
+ agent.command || defaultProviderInvocation(agent.provider),
1484
+ flags,
1485
+ );
1486
+ agent.command = `env ${PI_ORCHESTRATION_AGENT_ID_ENV}=${quoteShell(agentLaneId(job.id, agent.id))} ${profiledCommand}`;
1300
1487
  }
1301
1488
  }
1302
1489
  /** Read an OPTIONAL, cooperative worker-reported usage claim for the turn that just went terminal (a
@@ -1498,55 +1685,77 @@ async function executeTool(
1498
1685
  jobId: job.id,
1499
1686
  description: `fire_task launch of job ${job.id} (${job.agents.length} child process${job.agents.length === 1 ? "" : "es"}: ${job.agents.map((agent) => `${agent.name}/${agent.provider}`).join(", ")})`,
1500
1687
  });
1688
+ const managedAuthority = managedAuthorization(authorization.grant, `one-shot:${job.id}:turn:1`);
1689
+ for (const agent of job.agents) {
1690
+ agent.currentTurn = 1;
1691
+ applyManagedAuthorization(agent, managedAuthority, {
1692
+ instructions: job.task,
1693
+ goalId: params.goalId,
1694
+ leaseTtlMs: job.deadlineSeconds * 1_000,
1695
+ });
1696
+ }
1501
1697
  applyLaunchProfile(job, {
1502
- ...(authorization.grant ? launchProfileSourceFromGrant(authorization.grant) : ONE_SHOT_LAUNCH_PROFILE_SOURCE),
1698
+ ...managedAuthority.launchSource,
1699
+ ...(params.goalId ? { taskRef: params.goalId } : {}),
1503
1700
  // Process-matrix parent identity: the dispatched child self-registers as a worker of THIS
1504
1701
  // session and winds down gracefully if this session disappears (see dispatch-grant.ts's
1505
1702
  // `LaunchProfileSource.parentPid`/`parentSession` doc).
1506
1703
  parentPid: process.pid,
1507
1704
  parentSession: ctx.sessionManager.getSessionId?.() ?? ctx.sessionManager.getSessionFile(),
1508
1705
  });
1509
- const archivedJobDir = prepareJobDirForLaunch(job, params.force);
1510
- const panes = job.agents.map((agent) => ({
1511
- title: agent.name,
1512
- cwd: agent.cwd,
1513
- command: agent.command || defaultProviderInvocation(agent.provider),
1514
- }));
1515
- const launch = launchTmuxSession(job.sessionName, job.cwd, panes);
1516
- job.agents.forEach((agent, index) => {
1517
- agent.paneId = launch.paneIds[index];
1518
- });
1519
- writeFireTaskFiles(job);
1520
- const watcherPanes = startPaneWatchers(job);
1521
- for (const agent of job.agents) {
1522
- if (!agent.paneId) continue;
1523
- injectPromptToPane(agent.paneId, fs.readFileSync(agent.promptPath, "utf8"), agent.provider);
1524
- bridge.reportManagedLane?.({
1525
- laneId: agentLaneId(job.id, agent.id),
1526
- phase: "dispatch",
1527
- status: "launched",
1528
- goalId: params.goalId,
1529
- worktreeLaneKey: agent.worktreeLane,
1706
+ // The host commits the full execution grant and starts the durable lease before any child
1707
+ // process, job artifact, watcher, or prompt side effect occurs.
1708
+ reportManagedDispatchReservations(bridge, job, job.agents);
1709
+ let sessionCreated = false;
1710
+ try {
1711
+ const archivedJobDir = prepareJobDirForLaunch(job, params.force);
1712
+ const panes = job.agents.map((agent) => ({
1713
+ title: agent.name,
1714
+ cwd: agent.cwd,
1715
+ command: agent.command || defaultProviderInvocation(agent.provider),
1716
+ }));
1717
+ const launch = launchTmuxSession(job.sessionName, job.cwd, panes);
1718
+ sessionCreated = true;
1719
+ job.agents.forEach((agent, index) => {
1720
+ agent.paneId = launch.paneIds[index];
1530
1721
  });
1531
- }
1532
- return {
1533
- content: [
1534
- {
1535
- type: "text",
1536
- text: [
1537
- `Launched tmux interactive fire-and-forget job ${job.id}.`,
1538
- `Session: ${job.sessionName}`,
1539
- `Attach: tmux attach -t ${job.sessionName}`,
1540
- `Job state: ${job.jobPath}`,
1541
- archivedJobDir ? `Archived previous job dir: ${archivedJobDir}` : undefined,
1542
- "Completion: event-driven pane output watchers armed (no polling).",
1543
- ]
1544
- .filter(Boolean)
1545
- .join("\n"),
1722
+ writeFireTaskFiles(job);
1723
+ const watcherPanes = startPaneWatchers(job);
1724
+ for (const agent of job.agents) {
1725
+ if (!agent.paneId) continue;
1726
+ injectPromptToPane(agent.paneId, fs.readFileSync(agent.promptPath, "utf8"), agent.provider);
1727
+ }
1728
+ return {
1729
+ content: [
1730
+ {
1731
+ type: "text",
1732
+ text: [
1733
+ `Launched tmux interactive fire-and-forget job ${job.id}.`,
1734
+ `Session: ${job.sessionName}`,
1735
+ `Attach: tmux attach -t ${job.sessionName}`,
1736
+ `Job state: ${job.jobPath}`,
1737
+ archivedJobDir ? `Archived previous job dir: ${archivedJobDir}` : undefined,
1738
+ "Completion: event-driven pane output watchers armed (no polling).",
1739
+ ]
1740
+ .filter(Boolean)
1741
+ .join("\n"),
1742
+ },
1743
+ ],
1744
+ details: {
1745
+ action,
1746
+ detection,
1747
+ job,
1748
+ runs: launch.runs,
1749
+ paneIds: launch.paneIds,
1750
+ watcherPanes,
1751
+ archivedJobDir,
1546
1752
  },
1547
- ],
1548
- details: { action, detection, job, runs: launch.runs, paneIds: launch.paneIds, watcherPanes, archivedJobDir },
1549
- };
1753
+ };
1754
+ } catch (error: unknown) {
1755
+ if (sessionCreated) runTmux(["kill-session", "-t", job.sessionName], 5_000);
1756
+ reportManagedLaunchFailure(bridge, job, "managed_process_launch_failed");
1757
+ throw error;
1758
+ }
1550
1759
  }
1551
1760
  if (action === "send_followup") {
1552
1761
  if (!params.jobId) throw new Error("send_followup requires jobId");
@@ -1595,12 +1804,23 @@ async function executeTool(
1595
1804
  // APPROVAL-GATED LAUNCH (doctrine-regression mandatory): a follow-up dispatches a fresh
1596
1805
  // turn into an already-running child, so there is no new child command to profile — only the
1597
1806
  // grant/one-shot authorization is resolved here (no applyLaunchProfile call).
1598
- await authorizeLaunch(bridge, ctx, {
1807
+ const authorization = await authorizeLaunch(bridge, ctx, {
1599
1808
  agents: [targetAgent.provider],
1600
1809
  goalId: params.goalId,
1601
1810
  jobId: `${job.id}:turn:${turn}`,
1602
1811
  description: `send_followup turn ${turn} to ${targetAgent.name} in job ${job.id}`,
1603
1812
  });
1813
+ const managedAuthority = managedAuthorization(authorization.grant, `one-shot:${job.id}:turn:${turn}`);
1814
+ const launchAllowedTools = targetAgent.dispatchAllowedTools ?? [...DEFAULT_READ_BIASED_TOOLS];
1815
+ const launchWritePaths = targetAgent.dispatchWritePaths ?? [];
1816
+ if (
1817
+ !sameStringValues(launchAllowedTools, managedAuthority.allowedTools) ||
1818
+ !sameStringValues(launchWritePaths, managedAuthority.writePaths)
1819
+ ) {
1820
+ throw new Error(
1821
+ `send_followup refused: authorization scope differs from the already-running process for ${targetAgent.name}; relaunch the worker to apply a new tool or write-path scope.`,
1822
+ );
1823
+ }
1604
1824
  // Reserve before watcher/prompt side effects. Reconcile re-arms a reserved turn but never
1605
1825
  // re-injects it, so crash recovery cannot duplicate a provider prompt.
1606
1826
  const reserved = persistJobPatch(job.id, (current) => {
@@ -1609,28 +1829,38 @@ async function executeTool(
1609
1829
  agent.currentTurn = turn;
1610
1830
  agent.pendingTurn = turn;
1611
1831
  agent.result = undefined;
1832
+ applyManagedAuthorization(agent, managedAuthority, {
1833
+ instructions: followupTask,
1834
+ goalId: params.goalId,
1835
+ leaseTtlMs: job.deadlineSeconds * 1_000,
1836
+ });
1612
1837
  current.currentTurn = turn;
1613
1838
  return current;
1614
1839
  });
1615
1840
  const reservedAgent = reserved.agents.find((agent) => agent.id === targetAgent.id);
1616
1841
  if (!reservedAgent || reservedAgent.pendingTurn !== turn)
1617
1842
  throw new Error(`send_followup refused: failed to reserve turn ${turn} for ${targetAgent.id}`);
1618
- const written = dispatchAgentTurn(reserved, reservedAgent, turn, promptText);
1619
- injectPromptToPane(reservedAgent.paneId as string, promptText, reservedAgent.provider);
1620
- persistJobPatch(job.id, (current) => {
1621
- const agent = current.agents.find((entry) => entry.id === reservedAgent.id);
1622
- if (!agent || agent.pendingTurn !== turn) return undefined;
1623
- delete agent.pendingTurn;
1624
- return current;
1625
- });
1626
- bridge.reportManagedLane?.({
1627
- laneId: agentLaneId(job.id, targetAgent.id),
1628
- phase: "dispatch",
1629
- status: "follow-up",
1630
- goalId: params.goalId,
1631
- request: { turn },
1632
- worktreeLaneKey: targetAgent.worktreeLane,
1633
- });
1843
+ try {
1844
+ reportManagedDispatchReservations(bridge, reserved, [reservedAgent]);
1845
+ } catch (error: unknown) {
1846
+ persistAgentTurnFailure(job.id, reservedAgent.id, turn, "managed_process_launch_reservation_failed");
1847
+ throw error;
1848
+ }
1849
+ let written: ReturnType<typeof dispatchAgentTurn>;
1850
+ try {
1851
+ written = dispatchAgentTurn(reserved, reservedAgent, turn, promptText);
1852
+ injectPromptToPane(reservedAgent.paneId as string, promptText, reservedAgent.provider);
1853
+ persistJobPatch(job.id, (current) => {
1854
+ const agent = current.agents.find((entry) => entry.id === reservedAgent.id);
1855
+ if (!agent || agent.pendingTurn !== turn) return undefined;
1856
+ delete agent.pendingTurn;
1857
+ return current;
1858
+ });
1859
+ } catch (error: unknown) {
1860
+ persistAgentTurnFailure(job.id, reservedAgent.id, turn, "managed_process_followup_failed");
1861
+ reportManagedAgentFailure(bridge, job.id, reservedAgent.id, "managed_process_followup_failed");
1862
+ throw error;
1863
+ }
1634
1864
  return {
1635
1865
  content: [
1636
1866
  {
@@ -1796,13 +2026,8 @@ function reconcileTmuxSessions(ctx: ExtensionContext, bridge: HostBridge): void
1796
2026
  if (agent.result !== undefined) continue;
1797
2027
  if (!agent.paneId || !tmuxPaneExists(job.sessionName, agent.paneId)) continue;
1798
2028
  if (tmuxPaneHasPipe(agent.paneId)) continue;
2029
+ reportManagedDispatchReservations(bridge, job, [agent]);
1799
2030
  rearmAgentWatcher(job, agent);
1800
- bridge.reportManagedLane?.({
1801
- laneId: agentLaneId(job.id, agent.id),
1802
- phase: "dispatch",
1803
- status: "resumed",
1804
- worktreeLaneKey: agent.worktreeLane,
1805
- });
1806
2031
  }
1807
2032
  }
1808
2033
  }
@@ -1837,27 +2062,6 @@ export default function tmuxAgentManagerExtension(pi: ExtensionAPI) {
1837
2062
  // single whole-job notifiedAt flag.
1838
2063
  const pendingAgents = job.agents.filter((agent) => (agent.notifiedTurn ?? 0) < (agent.currentTurn ?? 1));
1839
2064
  if (pendingAgents.length === 0) continue;
1840
- pi.sendMessage(
1841
- {
1842
- customType: "tmux-background-completion",
1843
- content: formatFireTaskHandoff(job),
1844
- display: true,
1845
- details: {
1846
- jobId: job.id,
1847
- sessionName: job.sessionName,
1848
- agents: job.agents.map((agent) => ({ id: agent.id, name: agent.name, status: agent.result?.status })),
1849
- },
1850
- },
1851
- { triggerTurn: true, deliverAs: "followUp" },
1852
- );
1853
- persistJobPatch(job.id, (current) => {
1854
- current.notifiedAt = new Date().toISOString();
1855
- for (const agent of current.agents) {
1856
- const inMemoryAgent = job.agents.find((entry) => entry.id === agent.id);
1857
- agent.notifiedTurn = inMemoryAgent?.currentTurn ?? agent.currentTurn ?? 1;
1858
- }
1859
- return current;
1860
- });
1861
2065
  for (const agent of pendingAgents) {
1862
2066
  // Advisory-only, and only ever reported when the worker itself chose to write the
1863
2067
  // claim file — never fabricated, never a hard cross-process cap.
@@ -1875,6 +2079,37 @@ export default function tmuxAgentManagerExtension(pi: ExtensionAPI) {
1875
2079
  });
1876
2080
  }
1877
2081
  }
2082
+ // Production hosts own the sole durable wake path through reportManagedLane. The direct
2083
+ // message remains only for lightweight/standalone hosts that omit that bridge entirely.
2084
+ if (!bridge.reportManagedLane) {
2085
+ pi.sendMessage(
2086
+ {
2087
+ customType: "tmux-background-completion",
2088
+ content: formatFireTaskHandoff(job),
2089
+ display: true,
2090
+ details: {
2091
+ jobId: job.id,
2092
+ sessionName: job.sessionName,
2093
+ agents: job.agents.map((agent) => ({
2094
+ id: agent.id,
2095
+ name: agent.name,
2096
+ status: agent.result?.status,
2097
+ })),
2098
+ },
2099
+ },
2100
+ { triggerTurn: true, deliverAs: "followUp" },
2101
+ );
2102
+ }
2103
+ // reportManagedLane persisted the terminal result + outbox synchronously before returning.
2104
+ // This marker only suppresses duplicate extension reports; it is not notification truth.
2105
+ persistJobPatch(job.id, (current) => {
2106
+ current.notifiedAt = new Date().toISOString();
2107
+ for (const agent of current.agents) {
2108
+ const inMemoryAgent = job.agents.find((entry) => entry.id === agent.id);
2109
+ agent.notifiedTurn = inMemoryAgent?.currentTurn ?? agent.currentTurn ?? 1;
2110
+ }
2111
+ return current;
2112
+ });
1878
2113
  if (ctx.hasUI) ctx.ui.notify(`tmux background task ${job.id} completed.`, "info");
1879
2114
  }
1880
2115
 
@@ -184,8 +184,8 @@ clean|repaired|bounced, failureModes: [1..5|other], repairsApplied:
184
184
  [registry names], taught: none|note|rule}`. Link repair events to the same call's execution
185
185
  outcome (did the repaired call succeed?) and compute recurrence-after-teach
186
186
  per (model, failureMode). Aggregate per model into the table below. Wire
187
- through the existing telemetry path (`core/telemetry.ts` / session-analytics)
188
- rather than a new sink. The "round-trips saved" metric is simply the repaired
187
+ through the existing tool-recovery logger and session analytics rather than a
188
+ new sink. The "round-trips saved" metric is simply the repaired
189
189
  count; the "teach works" metric is recurrence decay.
190
190
 
191
191
  ## Model notes (living table; append, do not rewrite)
@@ -13,6 +13,7 @@ export interface Args {
13
13
  worktreeLane?: string;
14
14
  parentPid?: number;
15
15
  parentSession?: string;
16
+ taskRef?: string;
16
17
  thinking?: ThinkingLevel;
17
18
  continue?: boolean;
18
19
  resume?: boolean;
@@ -32,6 +33,7 @@ export interface Args {
32
33
  noBuiltinTools?: boolean;
33
34
  resourceProfiles?: string[];
34
35
  resourceProfileJson?: string[];
36
+ orchestrationProfile?: string;
35
37
  extensions?: string[];
36
38
  noExtensions?: boolean;
37
39
  print?: boolean;