@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,13 +4,117 @@ 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 { getProcessWorkRun } from "@caupulican/pi-adaptative";
7
+ import { getProcessWorkRun, PI_ORCHESTRATION_AGENT_ID_ENV, } from "@caupulican/pi-adaptative";
8
8
  import { Type } from "typebox";
9
- import { buildGrant, buildGrantUsageEntry, buildLaunchProfileFlags, buildTombstone, countGrantUsages, decodeTmuxWorkerUsageClaim, describeGrant, GRANT_CUSTOM_TYPE, GRANT_USAGE_CUSTOM_TYPE, grantCovers, isTmuxDispatchGrant, isTmuxDispatchGrantTombstone, launchProfileSourceFromGrant, ONE_SHOT_LAUNCH_PROFILE_SOURCE, } from "./dispatch-grant.js";
9
+ import { buildGrant, buildGrantUsageEntry, buildLaunchProfileFlags, buildTombstone, countGrantUsages, DEFAULT_READ_BIASED_TOOLS, decodeTmuxWorkerUsageClaim, describeGrant, GRANT_CUSTOM_TYPE, GRANT_USAGE_CUSTOM_TYPE, grantCovers, isTmuxDispatchGrant, isTmuxDispatchGrantTombstone, launchProfileSourceFromGrant, ONE_SHOT_LAUNCH_PROFILE_SOURCE, } from "./dispatch-grant.js";
10
10
  export const piConfig = { tools: ["tmux_agent_manager"] };
11
11
  function agentLaneId(jobId, agentId) {
12
12
  return `tmux:${jobId}:${agentId}`;
13
13
  }
14
+ function managedDispatch(job, agent) {
15
+ const sequence = agent.currentTurn ?? 1;
16
+ const instructions = agent.dispatchInstructions ?? job.task;
17
+ const authorizationId = agent.dispatchAuthorizationId ?? `legacy-job:${job.id}:turn:${sequence}`;
18
+ return {
19
+ sequence,
20
+ instructions,
21
+ profileId: `tmux:${agent.provider}`,
22
+ provider: agent.provider,
23
+ authorizationId,
24
+ authorizationKind: agent.dispatchAuthorizationKind ?? "legacy-recovery",
25
+ allowedTools: agent.dispatchAllowedTools ?? DEFAULT_READ_BIASED_TOOLS,
26
+ writePaths: agent.dispatchWritePaths ?? [],
27
+ ...(agent.dispatchMaxCostUsd !== undefined ? { maxCostUsd: agent.dispatchMaxCostUsd } : {}),
28
+ leaseTtlMs: agent.dispatchLeaseTtlMs ?? job.deadlineSeconds * 1_000,
29
+ };
30
+ }
31
+ function managedAuthorization(grant, fallbackId) {
32
+ const launchSource = grant ? launchProfileSourceFromGrant(grant) : ONE_SHOT_LAUNCH_PROFILE_SOURCE;
33
+ return {
34
+ authorizationId: grant?.grantId ?? fallbackId,
35
+ authorizationKind: grant ? "standing-grant" : "one-shot-owner-approval",
36
+ launchSource,
37
+ allowedTools: [...(launchSource.allowedTools?.length ? launchSource.allowedTools : DEFAULT_READ_BIASED_TOOLS)],
38
+ writePaths: [...(launchSource.writePaths ?? [])],
39
+ ...(grant?.budget.maxUsdAdvisory !== undefined ? { maxCostUsd: grant.budget.maxUsdAdvisory } : {}),
40
+ };
41
+ }
42
+ function applyManagedAuthorization(agent, authorization, args) {
43
+ agent.dispatchAuthorizationId = authorization.authorizationId;
44
+ agent.dispatchAuthorizationKind = authorization.authorizationKind;
45
+ agent.dispatchAllowedTools = [...authorization.allowedTools];
46
+ agent.dispatchWritePaths = [...authorization.writePaths];
47
+ if (authorization.maxCostUsd !== undefined)
48
+ agent.dispatchMaxCostUsd = authorization.maxCostUsd;
49
+ else
50
+ delete agent.dispatchMaxCostUsd;
51
+ agent.dispatchInstructions = args.instructions;
52
+ agent.dispatchGoalId = args.goalId;
53
+ agent.dispatchLeaseTtlMs = args.leaseTtlMs;
54
+ }
55
+ function reportManagedDispatchReservations(bridge, job, agents) {
56
+ if (!bridge.reportManagedLane)
57
+ return;
58
+ const attemptedLaneIds = [];
59
+ try {
60
+ for (const agent of agents) {
61
+ const laneId = agentLaneId(job.id, agent.id);
62
+ attemptedLaneIds.push(laneId);
63
+ bridge.reportManagedLane({
64
+ laneId,
65
+ phase: "dispatch",
66
+ goalId: agent.dispatchGoalId,
67
+ worktreeLaneKey: agent.worktreeLane,
68
+ dispatch: managedDispatch(job, agent),
69
+ });
70
+ }
71
+ }
72
+ catch (error) {
73
+ for (const laneId of attemptedLaneIds) {
74
+ try {
75
+ bridge.reportManagedLane({
76
+ laneId,
77
+ phase: "terminal",
78
+ status: "failed",
79
+ reasonCode: "managed_process_launch_reservation_failed",
80
+ });
81
+ }
82
+ catch {
83
+ // Preserve the reservation error; durable leases fence any compensation failure.
84
+ }
85
+ }
86
+ throw error;
87
+ }
88
+ }
89
+ function reportManagedLaunchFailure(bridge, job, reasonCode) {
90
+ if (!bridge.reportManagedLane)
91
+ return;
92
+ for (const agent of job.agents) {
93
+ reportManagedAgentFailure(bridge, job.id, agent.id, reasonCode);
94
+ }
95
+ }
96
+ function reportManagedAgentFailure(bridge, jobId, agentId, reasonCode) {
97
+ if (!bridge.reportManagedLane)
98
+ return;
99
+ try {
100
+ bridge.reportManagedLane({
101
+ laneId: agentLaneId(jobId, agentId),
102
+ phase: "terminal",
103
+ status: "failed",
104
+ reasonCode,
105
+ });
106
+ }
107
+ catch {
108
+ // Preserve the launch failure; durable leases fence any terminal-report failure.
109
+ }
110
+ }
111
+ function sameStringValues(left, right) {
112
+ if (left.length !== right.length)
113
+ return false;
114
+ const sortedLeft = [...left].sort();
115
+ const sortedRight = [...right].sort();
116
+ return sortedLeft.every((value, index) => value === sortedRight[index]);
117
+ }
14
118
  const EXTENSION_ROOT = path.dirname(fileURLToPath(import.meta.url));
15
119
  export function getTmuxAgentManagerDataRoot() {
16
120
  const agentDir = process.env.PI_ADAPTATIVE_CODING_AGENT_DIR ||
@@ -165,6 +269,10 @@ function runTmux(args, timeoutMs = 5_000) {
165
269
  args: [tmux, ...args],
166
270
  };
167
271
  }
272
+ function requireTmuxRun(result, action) {
273
+ if (!result.ok)
274
+ throw new Error(`${action} failed: ${result.error || result.stderr || `exit ${result.status}`}`);
275
+ }
168
276
  function detectTmux() {
169
277
  const tmuxBin = process.env.PI_TMUX_MANAGER_TMUX_BIN || findExecutable("tmux");
170
278
  const errors = [];
@@ -658,6 +766,22 @@ function turnWatcherPath(job, turn) {
658
766
  function currentResultPath(job, agent) {
659
767
  return turnResultPath(job.jobDir, agent.id, agent.currentTurn ?? 1, agent.resultPath);
660
768
  }
769
+ function persistAgentTurnFailure(jobId, agentId, turn, reason) {
770
+ persistJobPatch(jobId, (current) => {
771
+ const agent = current.agents.find((entry) => entry.id === agentId);
772
+ if (!agent || agent.currentTurn !== turn)
773
+ return undefined;
774
+ const result = {
775
+ status: "failed",
776
+ detectedAt: new Date().toISOString(),
777
+ reason,
778
+ };
779
+ fs.writeFileSync(currentResultPath(current, agent), `${JSON.stringify(result, null, 2)}\n`, { mode: 0o600 });
780
+ agent.result = result;
781
+ delete agent.pendingTurn;
782
+ return current;
783
+ });
784
+ }
661
785
  /** Atomically read-modify-write job.json, always from a FRESH read (never from a caller's possibly
662
786
  * stale in-memory copy), mirroring the temp+rename pattern the original notify path used. */
663
787
  function persistJobPatch(jobId, mutate) {
@@ -670,8 +794,8 @@ function persistJobPatch(jobId, mutate) {
670
794
  return mutated;
671
795
  }
672
796
  function sendCommandToPane(paneId, command) {
673
- runTmux(["send-keys", "-t", paneId, "-l", command]);
674
- runTmux(["send-keys", "-t", paneId, "Enter"]);
797
+ requireTmuxRun(runTmux(["send-keys", "-t", paneId, "-l", command]), `tmux command injection for ${paneId}`);
798
+ requireTmuxRun(runTmux(["send-keys", "-t", paneId, "Enter"]), `tmux command submit for ${paneId}`);
675
799
  }
676
800
  function launchTmuxSession(sessionName, cwd, panes) {
677
801
  if (tmuxSessionExists(sessionName))
@@ -683,33 +807,43 @@ function launchTmuxSession(sessionName, cwd, panes) {
683
807
  runs.push(create);
684
808
  if (!create.ok)
685
809
  throw new Error(`tmux new-session failed: ${create.error || create.stderr || `exit ${create.status}`}`);
686
- const firstPane = create.stdout.trim();
687
- paneIds.push(firstPane);
688
- sendCommandToPane(firstPane, first.command);
689
- for (const pane of panes.slice(1)) {
690
- const split = runTmux(["split-window", "-d", "-P", "-F", "#{pane_id}", "-t", `${sessionName}:0`, "-c", pane.cwd || cwd], 5_000);
691
- runs.push(split);
692
- if (!split.ok)
693
- throw new Error(`tmux split-window failed: ${split.error || split.stderr || `exit ${split.status}`}`);
694
- const paneId = split.stdout.trim();
695
- paneIds.push(paneId);
696
- sendCommandToPane(paneId, pane.command);
810
+ try {
811
+ const firstPane = create.stdout.trim();
812
+ paneIds.push(firstPane);
813
+ sendCommandToPane(firstPane, first.command);
814
+ for (const pane of panes.slice(1)) {
815
+ const split = runTmux(["split-window", "-d", "-P", "-F", "#{pane_id}", "-t", `${sessionName}:0`, "-c", pane.cwd || cwd], 5_000);
816
+ runs.push(split);
817
+ if (!split.ok)
818
+ throw new Error(`tmux split-window failed: ${split.error || split.stderr || `exit ${split.status}`}`);
819
+ const paneId = split.stdout.trim();
820
+ paneIds.push(paneId);
821
+ sendCommandToPane(paneId, pane.command);
822
+ }
823
+ runs.push(runTmux(["select-layout", "-t", `${sessionName}:0`, "tiled"], 3_000));
824
+ return { runs, paneIds };
825
+ }
826
+ catch (error) {
827
+ runTmux(["kill-session", "-t", sessionName], 5_000);
828
+ throw error;
697
829
  }
698
- runs.push(runTmux(["select-layout", "-t", `${sessionName}:0`, "tiled"], 3_000));
699
- return { runs, paneIds };
700
830
  }
701
831
  function injectPromptToPane(paneId, prompt, provider) {
702
832
  const text = interactivePromptText(prompt);
703
833
  if (provider === "claude") {
704
834
  const bufferName = `pi-tmux-${crypto.randomBytes(4).toString("hex")}`;
705
- runTmux(["set-buffer", "-b", bufferName, text], 10_000);
706
- runTmux(["paste-buffer", "-b", bufferName, "-t", paneId], 10_000);
707
- runTmux(["send-keys", "-t", paneId, "Enter"], 3_000);
708
- runTmux(["delete-buffer", "-b", bufferName], 3_000);
835
+ requireTmuxRun(runTmux(["set-buffer", "-b", bufferName, text], 10_000), "tmux prompt buffer creation");
836
+ try {
837
+ requireTmuxRun(runTmux(["paste-buffer", "-b", bufferName, "-t", paneId], 10_000), `tmux prompt injection for ${paneId}`);
838
+ requireTmuxRun(runTmux(["send-keys", "-t", paneId, "Enter"], 3_000), `tmux prompt submit for ${paneId}`);
839
+ }
840
+ finally {
841
+ runTmux(["delete-buffer", "-b", bufferName], 3_000);
842
+ }
709
843
  return;
710
844
  }
711
- runTmux(["send-keys", "-t", paneId, "-l", text], 10_000);
712
- runTmux(["send-keys", "-t", paneId, provider === "agy" ? "C-m" : "Enter"], 3_000);
845
+ requireTmuxRun(runTmux(["send-keys", "-t", paneId, "-l", text], 10_000), `tmux prompt injection for ${paneId}`);
846
+ requireTmuxRun(runTmux(["send-keys", "-t", paneId, provider === "agy" ? "C-m" : "Enter"], 3_000), `tmux prompt submit for ${paneId}`);
713
847
  }
714
848
  /** Write a fresh per-turn prompt + single-agent watcher script and arm `pipe-pane -O` for it. Used by
715
849
  * send_followup to open a NEW turn on an already-live pane. Does not inject the prompt text into the
@@ -1059,7 +1193,8 @@ function applyLaunchProfile(job, source) {
1059
1193
  // dispatch sets it), so the shared `source` envelope is extended with it just for this agent's
1060
1194
  // flag build -- every other agent in a multi-agent team keeps the plain grant-derived profile.
1061
1195
  const flags = buildLaunchProfileFlags(agent.worktreeLane ? { ...source, worktreeLane: agent.worktreeLane } : source);
1062
- agent.command = appendLaunchProfileFlags(agent.command || defaultProviderInvocation(agent.provider), flags);
1196
+ const profiledCommand = appendLaunchProfileFlags(agent.command || defaultProviderInvocation(agent.provider), flags);
1197
+ agent.command = `env ${PI_ORCHESTRATION_AGENT_ID_ENV}=${quoteShell(agentLaneId(job.id, agent.id))} ${profiledCommand}`;
1063
1198
  }
1064
1199
  }
1065
1200
  /** Read an OPTIONAL, cooperative worker-reported usage claim for the turn that just went terminal (a
@@ -1258,56 +1393,80 @@ async function executeTool(_toolCallId, params, _signal, _onUpdate, ctx, bridge)
1258
1393
  jobId: job.id,
1259
1394
  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(", ")})`,
1260
1395
  });
1396
+ const managedAuthority = managedAuthorization(authorization.grant, `one-shot:${job.id}:turn:1`);
1397
+ for (const agent of job.agents) {
1398
+ agent.currentTurn = 1;
1399
+ applyManagedAuthorization(agent, managedAuthority, {
1400
+ instructions: job.task,
1401
+ goalId: params.goalId,
1402
+ leaseTtlMs: job.deadlineSeconds * 1_000,
1403
+ });
1404
+ }
1261
1405
  applyLaunchProfile(job, {
1262
- ...(authorization.grant ? launchProfileSourceFromGrant(authorization.grant) : ONE_SHOT_LAUNCH_PROFILE_SOURCE),
1406
+ ...managedAuthority.launchSource,
1407
+ ...(params.goalId ? { taskRef: params.goalId } : {}),
1263
1408
  // Process-matrix parent identity: the dispatched child self-registers as a worker of THIS
1264
1409
  // session and winds down gracefully if this session disappears (see dispatch-grant.ts's
1265
1410
  // `LaunchProfileSource.parentPid`/`parentSession` doc).
1266
1411
  parentPid: process.pid,
1267
1412
  parentSession: ctx.sessionManager.getSessionId?.() ?? ctx.sessionManager.getSessionFile(),
1268
1413
  });
1269
- const archivedJobDir = prepareJobDirForLaunch(job, params.force);
1270
- const panes = job.agents.map((agent) => ({
1271
- title: agent.name,
1272
- cwd: agent.cwd,
1273
- command: agent.command || defaultProviderInvocation(agent.provider),
1274
- }));
1275
- const launch = launchTmuxSession(job.sessionName, job.cwd, panes);
1276
- job.agents.forEach((agent, index) => {
1277
- agent.paneId = launch.paneIds[index];
1278
- });
1279
- writeFireTaskFiles(job);
1280
- const watcherPanes = startPaneWatchers(job);
1281
- for (const agent of job.agents) {
1282
- if (!agent.paneId)
1283
- continue;
1284
- injectPromptToPane(agent.paneId, fs.readFileSync(agent.promptPath, "utf8"), agent.provider);
1285
- bridge.reportManagedLane?.({
1286
- laneId: agentLaneId(job.id, agent.id),
1287
- phase: "dispatch",
1288
- status: "launched",
1289
- goalId: params.goalId,
1290
- worktreeLaneKey: agent.worktreeLane,
1414
+ // The host commits the full execution grant and starts the durable lease before any child
1415
+ // process, job artifact, watcher, or prompt side effect occurs.
1416
+ reportManagedDispatchReservations(bridge, job, job.agents);
1417
+ let sessionCreated = false;
1418
+ try {
1419
+ const archivedJobDir = prepareJobDirForLaunch(job, params.force);
1420
+ const panes = job.agents.map((agent) => ({
1421
+ title: agent.name,
1422
+ cwd: agent.cwd,
1423
+ command: agent.command || defaultProviderInvocation(agent.provider),
1424
+ }));
1425
+ const launch = launchTmuxSession(job.sessionName, job.cwd, panes);
1426
+ sessionCreated = true;
1427
+ job.agents.forEach((agent, index) => {
1428
+ agent.paneId = launch.paneIds[index];
1291
1429
  });
1292
- }
1293
- return {
1294
- content: [
1295
- {
1296
- type: "text",
1297
- text: [
1298
- `Launched tmux interactive fire-and-forget job ${job.id}.`,
1299
- `Session: ${job.sessionName}`,
1300
- `Attach: tmux attach -t ${job.sessionName}`,
1301
- `Job state: ${job.jobPath}`,
1302
- archivedJobDir ? `Archived previous job dir: ${archivedJobDir}` : undefined,
1303
- "Completion: event-driven pane output watchers armed (no polling).",
1304
- ]
1305
- .filter(Boolean)
1306
- .join("\n"),
1430
+ writeFireTaskFiles(job);
1431
+ const watcherPanes = startPaneWatchers(job);
1432
+ for (const agent of job.agents) {
1433
+ if (!agent.paneId)
1434
+ continue;
1435
+ injectPromptToPane(agent.paneId, fs.readFileSync(agent.promptPath, "utf8"), agent.provider);
1436
+ }
1437
+ return {
1438
+ content: [
1439
+ {
1440
+ type: "text",
1441
+ text: [
1442
+ `Launched tmux interactive fire-and-forget job ${job.id}.`,
1443
+ `Session: ${job.sessionName}`,
1444
+ `Attach: tmux attach -t ${job.sessionName}`,
1445
+ `Job state: ${job.jobPath}`,
1446
+ archivedJobDir ? `Archived previous job dir: ${archivedJobDir}` : undefined,
1447
+ "Completion: event-driven pane output watchers armed (no polling).",
1448
+ ]
1449
+ .filter(Boolean)
1450
+ .join("\n"),
1451
+ },
1452
+ ],
1453
+ details: {
1454
+ action,
1455
+ detection,
1456
+ job,
1457
+ runs: launch.runs,
1458
+ paneIds: launch.paneIds,
1459
+ watcherPanes,
1460
+ archivedJobDir,
1307
1461
  },
1308
- ],
1309
- details: { action, detection, job, runs: launch.runs, paneIds: launch.paneIds, watcherPanes, archivedJobDir },
1310
- };
1462
+ };
1463
+ }
1464
+ catch (error) {
1465
+ if (sessionCreated)
1466
+ runTmux(["kill-session", "-t", job.sessionName], 5_000);
1467
+ reportManagedLaunchFailure(bridge, job, "managed_process_launch_failed");
1468
+ throw error;
1469
+ }
1311
1470
  }
1312
1471
  if (action === "send_followup") {
1313
1472
  if (!params.jobId)
@@ -1347,12 +1506,19 @@ async function executeTool(_toolCallId, params, _signal, _onUpdate, ctx, bridge)
1347
1506
  // APPROVAL-GATED LAUNCH (doctrine-regression mandatory): a follow-up dispatches a fresh
1348
1507
  // turn into an already-running child, so there is no new child command to profile — only the
1349
1508
  // grant/one-shot authorization is resolved here (no applyLaunchProfile call).
1350
- await authorizeLaunch(bridge, ctx, {
1509
+ const authorization = await authorizeLaunch(bridge, ctx, {
1351
1510
  agents: [targetAgent.provider],
1352
1511
  goalId: params.goalId,
1353
1512
  jobId: `${job.id}:turn:${turn}`,
1354
1513
  description: `send_followup turn ${turn} to ${targetAgent.name} in job ${job.id}`,
1355
1514
  });
1515
+ const managedAuthority = managedAuthorization(authorization.grant, `one-shot:${job.id}:turn:${turn}`);
1516
+ const launchAllowedTools = targetAgent.dispatchAllowedTools ?? [...DEFAULT_READ_BIASED_TOOLS];
1517
+ const launchWritePaths = targetAgent.dispatchWritePaths ?? [];
1518
+ if (!sameStringValues(launchAllowedTools, managedAuthority.allowedTools) ||
1519
+ !sameStringValues(launchWritePaths, managedAuthority.writePaths)) {
1520
+ throw new Error(`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.`);
1521
+ }
1356
1522
  // Reserve before watcher/prompt side effects. Reconcile re-arms a reserved turn but never
1357
1523
  // re-injects it, so crash recovery cannot duplicate a provider prompt.
1358
1524
  const reserved = persistJobPatch(job.id, (current) => {
@@ -1362,29 +1528,41 @@ async function executeTool(_toolCallId, params, _signal, _onUpdate, ctx, bridge)
1362
1528
  agent.currentTurn = turn;
1363
1529
  agent.pendingTurn = turn;
1364
1530
  agent.result = undefined;
1531
+ applyManagedAuthorization(agent, managedAuthority, {
1532
+ instructions: followupTask,
1533
+ goalId: params.goalId,
1534
+ leaseTtlMs: job.deadlineSeconds * 1_000,
1535
+ });
1365
1536
  current.currentTurn = turn;
1366
1537
  return current;
1367
1538
  });
1368
1539
  const reservedAgent = reserved.agents.find((agent) => agent.id === targetAgent.id);
1369
1540
  if (!reservedAgent || reservedAgent.pendingTurn !== turn)
1370
1541
  throw new Error(`send_followup refused: failed to reserve turn ${turn} for ${targetAgent.id}`);
1371
- const written = dispatchAgentTurn(reserved, reservedAgent, turn, promptText);
1372
- injectPromptToPane(reservedAgent.paneId, promptText, reservedAgent.provider);
1373
- persistJobPatch(job.id, (current) => {
1374
- const agent = current.agents.find((entry) => entry.id === reservedAgent.id);
1375
- if (!agent || agent.pendingTurn !== turn)
1376
- return undefined;
1377
- delete agent.pendingTurn;
1378
- return current;
1379
- });
1380
- bridge.reportManagedLane?.({
1381
- laneId: agentLaneId(job.id, targetAgent.id),
1382
- phase: "dispatch",
1383
- status: "follow-up",
1384
- goalId: params.goalId,
1385
- request: { turn },
1386
- worktreeLaneKey: targetAgent.worktreeLane,
1387
- });
1542
+ try {
1543
+ reportManagedDispatchReservations(bridge, reserved, [reservedAgent]);
1544
+ }
1545
+ catch (error) {
1546
+ persistAgentTurnFailure(job.id, reservedAgent.id, turn, "managed_process_launch_reservation_failed");
1547
+ throw error;
1548
+ }
1549
+ let written;
1550
+ try {
1551
+ written = dispatchAgentTurn(reserved, reservedAgent, turn, promptText);
1552
+ injectPromptToPane(reservedAgent.paneId, promptText, reservedAgent.provider);
1553
+ persistJobPatch(job.id, (current) => {
1554
+ const agent = current.agents.find((entry) => entry.id === reservedAgent.id);
1555
+ if (!agent || agent.pendingTurn !== turn)
1556
+ return undefined;
1557
+ delete agent.pendingTurn;
1558
+ return current;
1559
+ });
1560
+ }
1561
+ catch (error) {
1562
+ persistAgentTurnFailure(job.id, reservedAgent.id, turn, "managed_process_followup_failed");
1563
+ reportManagedAgentFailure(bridge, job.id, reservedAgent.id, "managed_process_followup_failed");
1564
+ throw error;
1565
+ }
1388
1566
  return {
1389
1567
  content: [
1390
1568
  {
@@ -1557,13 +1735,8 @@ function reconcileTmuxSessions(ctx, bridge) {
1557
1735
  continue;
1558
1736
  if (tmuxPaneHasPipe(agent.paneId))
1559
1737
  continue;
1738
+ reportManagedDispatchReservations(bridge, job, [agent]);
1560
1739
  rearmAgentWatcher(job, agent);
1561
- bridge.reportManagedLane?.({
1562
- laneId: agentLaneId(job.id, agent.id),
1563
- phase: "dispatch",
1564
- status: "resumed",
1565
- worktreeLaneKey: agent.worktreeLane,
1566
- });
1567
1740
  }
1568
1741
  }
1569
1742
  }
@@ -1595,24 +1768,6 @@ export default function tmuxAgentManagerExtension(pi) {
1595
1768
  const pendingAgents = job.agents.filter((agent) => (agent.notifiedTurn ?? 0) < (agent.currentTurn ?? 1));
1596
1769
  if (pendingAgents.length === 0)
1597
1770
  continue;
1598
- pi.sendMessage({
1599
- customType: "tmux-background-completion",
1600
- content: formatFireTaskHandoff(job),
1601
- display: true,
1602
- details: {
1603
- jobId: job.id,
1604
- sessionName: job.sessionName,
1605
- agents: job.agents.map((agent) => ({ id: agent.id, name: agent.name, status: agent.result?.status })),
1606
- },
1607
- }, { triggerTurn: true, deliverAs: "followUp" });
1608
- persistJobPatch(job.id, (current) => {
1609
- current.notifiedAt = new Date().toISOString();
1610
- for (const agent of current.agents) {
1611
- const inMemoryAgent = job.agents.find((entry) => entry.id === agent.id);
1612
- agent.notifiedTurn = inMemoryAgent?.currentTurn ?? agent.currentTurn ?? 1;
1613
- }
1614
- return current;
1615
- });
1616
1771
  for (const agent of pendingAgents) {
1617
1772
  // Advisory-only, and only ever reported when the worker itself chose to write the
1618
1773
  // claim file — never fabricated, never a hard cross-process cap.
@@ -1630,6 +1785,34 @@ export default function tmuxAgentManagerExtension(pi) {
1630
1785
  });
1631
1786
  }
1632
1787
  }
1788
+ // Production hosts own the sole durable wake path through reportManagedLane. The direct
1789
+ // message remains only for lightweight/standalone hosts that omit that bridge entirely.
1790
+ if (!bridge.reportManagedLane) {
1791
+ pi.sendMessage({
1792
+ customType: "tmux-background-completion",
1793
+ content: formatFireTaskHandoff(job),
1794
+ display: true,
1795
+ details: {
1796
+ jobId: job.id,
1797
+ sessionName: job.sessionName,
1798
+ agents: job.agents.map((agent) => ({
1799
+ id: agent.id,
1800
+ name: agent.name,
1801
+ status: agent.result?.status,
1802
+ })),
1803
+ },
1804
+ }, { triggerTurn: true, deliverAs: "followUp" });
1805
+ }
1806
+ // reportManagedLane persisted the terminal result + outbox synchronously before returning.
1807
+ // This marker only suppresses duplicate extension reports; it is not notification truth.
1808
+ persistJobPatch(job.id, (current) => {
1809
+ current.notifiedAt = new Date().toISOString();
1810
+ for (const agent of current.agents) {
1811
+ const inMemoryAgent = job.agents.find((entry) => entry.id === agent.id);
1812
+ agent.notifiedTurn = inMemoryAgent?.currentTurn ?? agent.currentTurn ?? 1;
1813
+ }
1814
+ return current;
1815
+ });
1633
1816
  if (ctx.hasUI)
1634
1817
  ctx.ui.notify(`tmux background task ${job.id} completed.`, "info");
1635
1818
  }