@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
@@ -0,0 +1,179 @@
1
+ import path from "node:path";
2
+ import { isDeepStrictEqual } from "node:util";
3
+ import { isPlainRecord } from "../util/value-guards.js";
4
+ import { isHarnessCapability, ORCHESTRATION_SCHEMA_VERSION, ORCHESTRATION_THINKING_LEVELS, } from "./contracts.js";
5
+ import { OrchestrationProfileError, parseOrchestrationProfile } from "./profile-registry.js";
6
+ import { intersectRiskBudgets, validateRiskBudget } from "./risk-budget.js";
7
+ export class WorkerExecutionContractError extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = "WorkerExecutionContractError";
11
+ }
12
+ }
13
+ function exactKeys(record, allowed) {
14
+ const allowedSet = new Set(allowed);
15
+ return Object.keys(record).every((key) => allowedSet.has(key));
16
+ }
17
+ function parseModelBinding(value, label) {
18
+ if (!isPlainRecord(value) ||
19
+ !exactKeys(value, ["provider", "modelId", "thinkingLevel"]) ||
20
+ typeof value.provider !== "string" ||
21
+ !value.provider.trim() ||
22
+ typeof value.modelId !== "string" ||
23
+ !value.modelId.trim() ||
24
+ typeof value.thinkingLevel !== "string" ||
25
+ !ORCHESTRATION_THINKING_LEVELS.includes(value.thinkingLevel)) {
26
+ throw new WorkerExecutionContractError(`${label} model binding is invalid.`);
27
+ }
28
+ return {
29
+ provider: value.provider,
30
+ modelId: value.modelId,
31
+ thinkingLevel: value.thinkingLevel,
32
+ };
33
+ }
34
+ function stringArray(value, label) {
35
+ if (!Array.isArray(value) || !value.every((entry) => typeof entry === "string" && entry.length > 0)) {
36
+ throw new WorkerExecutionContractError(`${label} must be an array of non-empty strings.`);
37
+ }
38
+ if (new Set(value).size !== value.length) {
39
+ throw new WorkerExecutionContractError(`${label} contains duplicates.`);
40
+ }
41
+ return [...value];
42
+ }
43
+ function parseAuthority(value, profile, label) {
44
+ if (!isPlainRecord(value) ||
45
+ !exactKeys(value, ["capabilities", "toolNames", "readPaths", "writePaths", "deniedPaths", "budget"])) {
46
+ throw new WorkerExecutionContractError(`${label} authority is invalid.`);
47
+ }
48
+ const capabilities = stringArray(value.capabilities, `${label} authority capabilities`);
49
+ if (!capabilities.every(isHarnessCapability)) {
50
+ throw new WorkerExecutionContractError(`${label} authority contains an unknown capability.`);
51
+ }
52
+ if (capabilities.some((capability) => !profile.capabilityCeiling.includes(capability))) {
53
+ throw new WorkerExecutionContractError(`${label} authority exceeds its profile capability ceiling.`);
54
+ }
55
+ const toolNames = stringArray(value.toolNames, `${label} authority toolNames`);
56
+ if (toolNames.some((toolName) => !profile.toolNames.includes(toolName))) {
57
+ throw new WorkerExecutionContractError(`${label} authority contains a tool outside its profile.`);
58
+ }
59
+ const readPaths = stringArray(value.readPaths, `${label} authority readPaths`);
60
+ const writePaths = stringArray(value.writePaths, `${label} authority writePaths`);
61
+ const deniedPaths = stringArray(value.deniedPaths, `${label} authority deniedPaths`);
62
+ if ([...readPaths, ...writePaths, ...deniedPaths].some((entry) => !path.isAbsolute(entry))) {
63
+ throw new WorkerExecutionContractError(`${label} authority paths must be absolute.`);
64
+ }
65
+ if (!isPlainRecord(value.budget)) {
66
+ throw new WorkerExecutionContractError(`${label} authority budget is invalid.`);
67
+ }
68
+ const budget = structuredClone(value.budget);
69
+ try {
70
+ validateRiskBudget(budget, `${label} authority budget`);
71
+ }
72
+ catch (error) {
73
+ throw new WorkerExecutionContractError(error instanceof Error ? error.message : String(error));
74
+ }
75
+ if (!isDeepStrictEqual(intersectRiskBudgets(profile.budget, budget), budget)) {
76
+ throw new WorkerExecutionContractError(`${label} authority exceeds its profile budget.`);
77
+ }
78
+ const readGranted = capabilities.some((capability) => capability === "filesystem.read" || capability === "worktree.read");
79
+ const writeGranted = capabilities.some((capability) => capability === "filesystem.write" || capability === "worktree.mutate");
80
+ if (readGranted && readPaths.length === 0) {
81
+ throw new WorkerExecutionContractError(`${label} read authority lacks a positive path scope.`);
82
+ }
83
+ if (writeGranted && writePaths.length === 0) {
84
+ throw new WorkerExecutionContractError(`${label} write authority lacks a positive path scope.`);
85
+ }
86
+ return {
87
+ capabilities: capabilities,
88
+ toolNames,
89
+ readPaths,
90
+ writePaths,
91
+ deniedPaths,
92
+ budget,
93
+ };
94
+ }
95
+ function parseProfileContract(value, label) {
96
+ if (!isPlainRecord(value) ||
97
+ !exactKeys(value, ["schemaVersion", "profile", "modelBinding", "authority", "soul"]) ||
98
+ value.schemaVersion !== ORCHESTRATION_SCHEMA_VERSION) {
99
+ throw new WorkerExecutionContractError(`${label} is invalid.`);
100
+ }
101
+ let profile;
102
+ try {
103
+ profile = parseOrchestrationProfile(value.profile);
104
+ }
105
+ catch (error) {
106
+ throw new WorkerExecutionContractError(error instanceof OrchestrationProfileError ? error.message : `${label} profile is invalid.`);
107
+ }
108
+ if (profile.role === "orchestrator") {
109
+ throw new WorkerExecutionContractError(`${label} cannot materialize an orchestrator profile.`);
110
+ }
111
+ const modelBinding = parseModelBinding(value.modelBinding, label);
112
+ if (!profile.modelPolicy.candidates.some((candidate) => isDeepStrictEqual(candidate, modelBinding))) {
113
+ throw new WorkerExecutionContractError(`${label} model binding is not declared by its profile.`);
114
+ }
115
+ if (value.soul !== undefined && (typeof value.soul !== "string" || !value.soul.trim())) {
116
+ throw new WorkerExecutionContractError(`${label} soul is invalid.`);
117
+ }
118
+ const authority = parseAuthority(value.authority, profile, label);
119
+ return {
120
+ schemaVersion: ORCHESTRATION_SCHEMA_VERSION,
121
+ profile,
122
+ modelBinding,
123
+ authority,
124
+ ...(typeof value.soul === "string" ? { soul: value.soul } : {}),
125
+ };
126
+ }
127
+ export function parseWorkerExecutionContract(value) {
128
+ if (!isPlainRecord(value) ||
129
+ !exactKeys(value, ["schemaVersion", "worker", "verifier"]) ||
130
+ value.schemaVersion !== ORCHESTRATION_SCHEMA_VERSION) {
131
+ throw new WorkerExecutionContractError("Worker execution contract is invalid.");
132
+ }
133
+ const worker = parseProfileContract(value.worker, "Worker execution contract");
134
+ const verifier = value.verifier
135
+ ? parseProfileContract(value.verifier, "Worker verifier execution contract")
136
+ : undefined;
137
+ if (worker.profile.requireIndependentVerification) {
138
+ if (!verifier || worker.profile.verificationProfileId !== verifier.profile.profileId) {
139
+ throw new WorkerExecutionContractError("Worker execution contract is missing its owner-pinned verifier.");
140
+ }
141
+ if (verifier.profile.role !== "verifier") {
142
+ throw new WorkerExecutionContractError("Worker verifier execution contract does not use a verifier profile.");
143
+ }
144
+ }
145
+ else if (verifier) {
146
+ throw new WorkerExecutionContractError("Worker execution contract has an unexpected verifier.");
147
+ }
148
+ return {
149
+ schemaVersion: ORCHESTRATION_SCHEMA_VERSION,
150
+ worker,
151
+ ...(verifier ? { verifier } : {}),
152
+ };
153
+ }
154
+ function snapshotProfile(profile) {
155
+ const { sourcePath: _sourcePath, ...persisted } = profile;
156
+ return structuredClone(persisted);
157
+ }
158
+ function snapshotResolvedProfile(source) {
159
+ return {
160
+ schemaVersion: ORCHESTRATION_SCHEMA_VERSION,
161
+ profile: snapshotProfile(source.profile),
162
+ modelBinding: structuredClone(source.modelBinding),
163
+ authority: structuredClone(source.authority),
164
+ ...(source.soul ? { soul: source.soul } : {}),
165
+ };
166
+ }
167
+ export function createWorkerExecutionContract(args) {
168
+ return parseWorkerExecutionContract({
169
+ schemaVersion: ORCHESTRATION_SCHEMA_VERSION,
170
+ worker: snapshotResolvedProfile(args.worker),
171
+ ...(args.verifier ? { verifier: snapshotResolvedProfile(args.verifier) } : {}),
172
+ });
173
+ }
174
+ export function verifierWorkerExecutionContract(contract) {
175
+ return contract.verifier
176
+ ? parseWorkerExecutionContract({ schemaVersion: ORCHESTRATION_SCHEMA_VERSION, worker: contract.verifier })
177
+ : undefined;
178
+ }
179
+ //# sourceMappingURL=worker-execution-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-execution-contract.js","sourceRoot":"","sources":["../../../src/core/orchestration/worker-execution-contract.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { isPlainRecord } from \"../util/value-guards.ts\";\nimport {\n\tisHarnessCapability,\n\tORCHESTRATION_SCHEMA_VERSION,\n\tORCHESTRATION_THINKING_LEVELS,\n\ttype OrchestrationModelBinding,\n\ttype OrchestrationProfile,\n\ttype WorkerExecutionAuthorityContract,\n\ttype WorkerExecutionContract,\n\ttype WorkerProfileExecutionContract,\n} from \"./contracts.ts\";\nimport { OrchestrationProfileError, parseOrchestrationProfile } from \"./profile-registry.ts\";\nimport { intersectRiskBudgets, validateRiskBudget } from \"./risk-budget.ts\";\n\nexport class WorkerExecutionContractError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"WorkerExecutionContractError\";\n\t}\n}\n\nfunction exactKeys(record: Record<string, unknown>, allowed: readonly string[]): boolean {\n\tconst allowedSet = new Set(allowed);\n\treturn Object.keys(record).every((key) => allowedSet.has(key));\n}\n\nfunction parseModelBinding(value: unknown, label: string): OrchestrationModelBinding {\n\tif (\n\t\t!isPlainRecord(value) ||\n\t\t!exactKeys(value, [\"provider\", \"modelId\", \"thinkingLevel\"]) ||\n\t\ttypeof value.provider !== \"string\" ||\n\t\t!value.provider.trim() ||\n\t\ttypeof value.modelId !== \"string\" ||\n\t\t!value.modelId.trim() ||\n\t\ttypeof value.thinkingLevel !== \"string\" ||\n\t\t!ORCHESTRATION_THINKING_LEVELS.includes(value.thinkingLevel as (typeof ORCHESTRATION_THINKING_LEVELS)[number])\n\t) {\n\t\tthrow new WorkerExecutionContractError(`${label} model binding is invalid.`);\n\t}\n\treturn {\n\t\tprovider: value.provider,\n\t\tmodelId: value.modelId,\n\t\tthinkingLevel: value.thinkingLevel as (typeof ORCHESTRATION_THINKING_LEVELS)[number],\n\t};\n}\n\nfunction stringArray(value: unknown, label: string): string[] {\n\tif (!Array.isArray(value) || !value.every((entry) => typeof entry === \"string\" && entry.length > 0)) {\n\t\tthrow new WorkerExecutionContractError(`${label} must be an array of non-empty strings.`);\n\t}\n\tif (new Set(value).size !== value.length) {\n\t\tthrow new WorkerExecutionContractError(`${label} contains duplicates.`);\n\t}\n\treturn [...value];\n}\n\nfunction parseAuthority(\n\tvalue: unknown,\n\tprofile: OrchestrationProfile,\n\tlabel: string,\n): WorkerExecutionAuthorityContract {\n\tif (\n\t\t!isPlainRecord(value) ||\n\t\t!exactKeys(value, [\"capabilities\", \"toolNames\", \"readPaths\", \"writePaths\", \"deniedPaths\", \"budget\"])\n\t) {\n\t\tthrow new WorkerExecutionContractError(`${label} authority is invalid.`);\n\t}\n\tconst capabilities = stringArray(value.capabilities, `${label} authority capabilities`);\n\tif (!capabilities.every(isHarnessCapability)) {\n\t\tthrow new WorkerExecutionContractError(`${label} authority contains an unknown capability.`);\n\t}\n\tif (capabilities.some((capability) => !profile.capabilityCeiling.includes(capability))) {\n\t\tthrow new WorkerExecutionContractError(`${label} authority exceeds its profile capability ceiling.`);\n\t}\n\tconst toolNames = stringArray(value.toolNames, `${label} authority toolNames`);\n\tif (toolNames.some((toolName) => !profile.toolNames.includes(toolName))) {\n\t\tthrow new WorkerExecutionContractError(`${label} authority contains a tool outside its profile.`);\n\t}\n\tconst readPaths = stringArray(value.readPaths, `${label} authority readPaths`);\n\tconst writePaths = stringArray(value.writePaths, `${label} authority writePaths`);\n\tconst deniedPaths = stringArray(value.deniedPaths, `${label} authority deniedPaths`);\n\tif ([...readPaths, ...writePaths, ...deniedPaths].some((entry) => !path.isAbsolute(entry))) {\n\t\tthrow new WorkerExecutionContractError(`${label} authority paths must be absolute.`);\n\t}\n\tif (!isPlainRecord(value.budget)) {\n\t\tthrow new WorkerExecutionContractError(`${label} authority budget is invalid.`);\n\t}\n\tconst budget = structuredClone(value.budget);\n\ttry {\n\t\tvalidateRiskBudget(budget, `${label} authority budget`);\n\t} catch (error) {\n\t\tthrow new WorkerExecutionContractError(error instanceof Error ? error.message : String(error));\n\t}\n\tif (!isDeepStrictEqual(intersectRiskBudgets(profile.budget, budget), budget)) {\n\t\tthrow new WorkerExecutionContractError(`${label} authority exceeds its profile budget.`);\n\t}\n\tconst readGranted = capabilities.some(\n\t\t(capability) => capability === \"filesystem.read\" || capability === \"worktree.read\",\n\t);\n\tconst writeGranted = capabilities.some(\n\t\t(capability) => capability === \"filesystem.write\" || capability === \"worktree.mutate\",\n\t);\n\tif (readGranted && readPaths.length === 0) {\n\t\tthrow new WorkerExecutionContractError(`${label} read authority lacks a positive path scope.`);\n\t}\n\tif (writeGranted && writePaths.length === 0) {\n\t\tthrow new WorkerExecutionContractError(`${label} write authority lacks a positive path scope.`);\n\t}\n\treturn {\n\t\tcapabilities: capabilities as WorkerExecutionAuthorityContract[\"capabilities\"],\n\t\ttoolNames,\n\t\treadPaths,\n\t\twritePaths,\n\t\tdeniedPaths,\n\t\tbudget,\n\t};\n}\n\nfunction parseProfileContract(value: unknown, label: string): WorkerProfileExecutionContract {\n\tif (\n\t\t!isPlainRecord(value) ||\n\t\t!exactKeys(value, [\"schemaVersion\", \"profile\", \"modelBinding\", \"authority\", \"soul\"]) ||\n\t\tvalue.schemaVersion !== ORCHESTRATION_SCHEMA_VERSION\n\t) {\n\t\tthrow new WorkerExecutionContractError(`${label} is invalid.`);\n\t}\n\tlet profile: OrchestrationProfile;\n\ttry {\n\t\tprofile = parseOrchestrationProfile(value.profile);\n\t} catch (error) {\n\t\tthrow new WorkerExecutionContractError(\n\t\t\terror instanceof OrchestrationProfileError ? error.message : `${label} profile is invalid.`,\n\t\t);\n\t}\n\tif (profile.role === \"orchestrator\") {\n\t\tthrow new WorkerExecutionContractError(`${label} cannot materialize an orchestrator profile.`);\n\t}\n\tconst modelBinding = parseModelBinding(value.modelBinding, label);\n\tif (!profile.modelPolicy.candidates.some((candidate) => isDeepStrictEqual(candidate, modelBinding))) {\n\t\tthrow new WorkerExecutionContractError(`${label} model binding is not declared by its profile.`);\n\t}\n\tif (value.soul !== undefined && (typeof value.soul !== \"string\" || !value.soul.trim())) {\n\t\tthrow new WorkerExecutionContractError(`${label} soul is invalid.`);\n\t}\n\tconst authority = parseAuthority(value.authority, profile, label);\n\treturn {\n\t\tschemaVersion: ORCHESTRATION_SCHEMA_VERSION,\n\t\tprofile,\n\t\tmodelBinding,\n\t\tauthority,\n\t\t...(typeof value.soul === \"string\" ? { soul: value.soul } : {}),\n\t};\n}\n\nexport function parseWorkerExecutionContract(value: unknown): WorkerExecutionContract {\n\tif (\n\t\t!isPlainRecord(value) ||\n\t\t!exactKeys(value, [\"schemaVersion\", \"worker\", \"verifier\"]) ||\n\t\tvalue.schemaVersion !== ORCHESTRATION_SCHEMA_VERSION\n\t) {\n\t\tthrow new WorkerExecutionContractError(\"Worker execution contract is invalid.\");\n\t}\n\tconst worker = parseProfileContract(value.worker, \"Worker execution contract\");\n\tconst verifier = value.verifier\n\t\t? parseProfileContract(value.verifier, \"Worker verifier execution contract\")\n\t\t: undefined;\n\tif (worker.profile.requireIndependentVerification) {\n\t\tif (!verifier || worker.profile.verificationProfileId !== verifier.profile.profileId) {\n\t\t\tthrow new WorkerExecutionContractError(\"Worker execution contract is missing its owner-pinned verifier.\");\n\t\t}\n\t\tif (verifier.profile.role !== \"verifier\") {\n\t\t\tthrow new WorkerExecutionContractError(\"Worker verifier execution contract does not use a verifier profile.\");\n\t\t}\n\t} else if (verifier) {\n\t\tthrow new WorkerExecutionContractError(\"Worker execution contract has an unexpected verifier.\");\n\t}\n\treturn {\n\t\tschemaVersion: ORCHESTRATION_SCHEMA_VERSION,\n\t\tworker,\n\t\t...(verifier ? { verifier } : {}),\n\t};\n}\n\nfunction snapshotProfile(profile: OrchestrationProfile): OrchestrationProfile {\n\tconst { sourcePath: _sourcePath, ...persisted } = profile;\n\treturn structuredClone(persisted) as OrchestrationProfile;\n}\n\nfunction snapshotResolvedProfile(source: {\n\tprofile: OrchestrationProfile;\n\tmodelBinding: OrchestrationModelBinding;\n\tauthority: WorkerExecutionAuthorityContract;\n\tsoul?: string;\n}): WorkerProfileExecutionContract {\n\treturn {\n\t\tschemaVersion: ORCHESTRATION_SCHEMA_VERSION,\n\t\tprofile: snapshotProfile(source.profile),\n\t\tmodelBinding: structuredClone(source.modelBinding),\n\t\tauthority: structuredClone(source.authority),\n\t\t...(source.soul ? { soul: source.soul } : {}),\n\t};\n}\n\nexport function createWorkerExecutionContract(args: {\n\tworker: {\n\t\tprofile: OrchestrationProfile;\n\t\tmodelBinding: OrchestrationModelBinding;\n\t\tauthority: WorkerExecutionAuthorityContract;\n\t\tsoul?: string;\n\t};\n\tverifier?: {\n\t\tprofile: OrchestrationProfile;\n\t\tmodelBinding: OrchestrationModelBinding;\n\t\tauthority: WorkerExecutionAuthorityContract;\n\t\tsoul?: string;\n\t};\n}): WorkerExecutionContract {\n\treturn parseWorkerExecutionContract({\n\t\tschemaVersion: ORCHESTRATION_SCHEMA_VERSION,\n\t\tworker: snapshotResolvedProfile(args.worker),\n\t\t...(args.verifier ? { verifier: snapshotResolvedProfile(args.verifier) } : {}),\n\t});\n}\n\nexport function verifierWorkerExecutionContract(\n\tcontract: WorkerExecutionContract,\n): WorkerExecutionContract | undefined {\n\treturn contract.verifier\n\t\t? parseWorkerExecutionContract({ schemaVersion: ORCHESTRATION_SCHEMA_VERSION, worker: contract.verifier })\n\t\t: undefined;\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import type { WorkerClaim } from "../autonomy/contracts.ts";
2
+ import { type WorkerResultContract } from "./contracts.ts";
3
+ import type { StartedDelegationAttempt } from "./delegation-ledger.ts";
4
+ /** Sole host-owned conversion from an untrusted claim to a fenced durable result. */
5
+ export declare function createWorkerResultContract(args: {
6
+ handle: StartedDelegationAttempt;
7
+ claim: WorkerClaim;
8
+ accepted: boolean;
9
+ costUsd?: number;
10
+ cwd: string;
11
+ inputTokens?: number;
12
+ outputTokens?: number;
13
+ totalTokens?: number;
14
+ wallClockMs: number;
15
+ toolCalls: number;
16
+ verificationRequired?: boolean;
17
+ verificationCriterionIds?: readonly string[];
18
+ reasonCode?: string;
19
+ createdAt?: string;
20
+ }): WorkerResultContract;
21
+ //# sourceMappingURL=worker-result-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-result-adapter.d.ts","sourceRoot":"","sources":["../../../src/core/orchestration/worker-result-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAIN,KAAK,oBAAoB,EACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAqEvE,qFAAqF;AACrF,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAChD,MAAM,EAAE,wBAAwB,CAAC;IACjC,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,wBAAwB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,oBAAoB,CA6CvB","sourcesContent":["import { existsSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { WorkerClaim } from \"../autonomy/contracts.ts\";\nimport {\n\ttype ArtifactContract,\n\ttype EvidenceContract,\n\tORCHESTRATION_SCHEMA_VERSION,\n\ttype WorkerResultContract,\n} from \"./contracts.ts\";\nimport type { StartedDelegationAttempt } from \"./delegation-ledger.ts\";\n\nfunction artifactForChangedFile(cwd: string, changedPath: string, index: number, createdAt: string): ArtifactContract {\n\tconst absolutePath = path.isAbsolute(changedPath) ? path.resolve(changedPath) : path.resolve(cwd, changedPath);\n\tlet sizeBytes: number | undefined;\n\ttry {\n\t\tif (existsSync(absolutePath)) sizeBytes = statSync(absolutePath).size;\n\t} catch {\n\t\t// The path remains useful evidence even if it disappeared before metadata collection.\n\t}\n\treturn {\n\t\tartifactId: `changed-file-${index + 1}`,\n\t\tkind: \"file\",\n\t\turi: pathToFileURL(absolutePath).href,\n\t\t...(sizeBytes !== undefined ? { sizeBytes } : {}),\n\t\tcreatedAt,\n\t};\n}\n\nfunction evidenceForClaim(claim: WorkerClaim, createdAt: string): EvidenceContract[] {\n\tconst findings = claim.evidence?.findings ?? [];\n\treturn findings.map((finding, index) => ({\n\t\tevidenceId: `worker-finding-${index + 1}`,\n\t\tkind: \"observation\",\n\t\tsummary: finding.summary,\n\t\tartifactIds: [],\n\t\ttrusted: false,\n\t\tcreatedAt,\n\t\t...(finding.confidence !== undefined ? { metadata: { confidence: finding.confidence } } : {}),\n\t}));\n}\n\nfunction verificationEvidence(\n\tclaim: WorkerClaim,\n\taccepted: boolean,\n\tcriterionIds: readonly string[],\n\tcreatedAt: string,\n): EvidenceContract[] {\n\tif (!claim.verification) return [];\n\tconst trustedReview = accepted;\n\treturn [\n\t\t{\n\t\t\tevidenceId: \"independent-review\",\n\t\t\tkind: \"review\",\n\t\t\tsummary: claim.summary,\n\t\t\tartifactIds: [],\n\t\t\ttrusted: trustedReview,\n\t\t\tcreatedAt,\n\t\t\tmetadata: {\n\t\t\t\tsubjectTaskId: claim.verification.subjectTaskId,\n\t\t\t\tverdict: claim.verification.verdict,\n\t\t\t\treasonCodes: [...claim.verification.reasonCodes],\n\t\t\t},\n\t\t},\n\t\t...criterionIds.map(\n\t\t\t(criterionId, index): EvidenceContract => ({\n\t\t\t\tevidenceId: `independent-review-criterion-${index + 1}`,\n\t\t\t\tcriterionId,\n\t\t\t\tkind: \"review\",\n\t\t\t\tsummary: claim.summary,\n\t\t\t\tartifactIds: [],\n\t\t\t\ttrusted: trustedReview && claim.verification?.verdict === \"accepted\",\n\t\t\t\tcreatedAt,\n\t\t\t\tmetadata: { subjectTaskId: claim.verification?.subjectTaskId ?? \"\" },\n\t\t\t}),\n\t\t),\n\t];\n}\n\n/** Sole host-owned conversion from an untrusted claim to a fenced durable result. */\nexport function createWorkerResultContract(args: {\n\thandle: StartedDelegationAttempt;\n\tclaim: WorkerClaim;\n\taccepted: boolean;\n\tcostUsd?: number;\n\tcwd: string;\n\tinputTokens?: number;\n\toutputTokens?: number;\n\ttotalTokens?: number;\n\twallClockMs: number;\n\ttoolCalls: number;\n\tverificationRequired?: boolean;\n\tverificationCriterionIds?: readonly string[];\n\treasonCode?: string;\n\tcreatedAt?: string;\n}): WorkerResultContract {\n\tconst createdAt = args.createdAt ?? new Date().toISOString();\n\tconst claim = args.claim;\n\tconst status: WorkerResultContract[\"status\"] =\n\t\tclaim.status === \"completed\"\n\t\t\t? args.accepted && !args.verificationRequired\n\t\t\t\t? \"completed\"\n\t\t\t\t: \"partial\"\n\t\t\t: claim.status;\n\tconst artifacts = claim.changedFiles.map((changedPath, index) =>\n\t\tartifactForChangedFile(args.cwd, changedPath, index, createdAt),\n\t);\n\tconst blockers = claim.blockers ?? [];\n\treturn {\n\t\tschemaVersion: ORCHESTRATION_SCHEMA_VERSION,\n\t\tresultId: `result-${args.handle.attemptId}-${args.handle.fencingToken}`,\n\t\tobjectiveId: args.handle.objectiveId,\n\t\ttaskId: args.handle.taskId,\n\t\tattemptId: args.handle.attemptId,\n\t\tleaseId: args.handle.leaseId,\n\t\tfencingToken: args.handle.fencingToken,\n\t\tstatus,\n\t\treasonCode: args.reasonCode ?? `worker_${claim.status}`,\n\t\tsummary: claim.summary,\n\t\tartifacts,\n\t\tevidence: [\n\t\t\t...evidenceForClaim(claim, createdAt),\n\t\t\t...verificationEvidence(claim, args.accepted, args.verificationCriterionIds ?? [], createdAt),\n\t\t],\n\t\terrors: blockers.map((message) => ({ code: \"worker_blocker\", message, retryable: false })),\n\t\t...(args.verificationRequired\n\t\t\t? { nextAction: \"independent_verification_required\" }\n\t\t\t: !args.accepted || claim.parentReviewRequired\n\t\t\t\t? { nextAction: \"parent_review\" }\n\t\t\t\t: {}),\n\t\tusage: {\n\t\t\t...(args.inputTokens !== undefined ? { inputTokens: args.inputTokens } : {}),\n\t\t\t...(args.outputTokens !== undefined ? { outputTokens: args.outputTokens } : {}),\n\t\t\t...(args.totalTokens !== undefined ? { totalTokens: args.totalTokens } : {}),\n\t\t\t...(args.costUsd !== undefined ? { costUsd: args.costUsd } : {}),\n\t\t\twallClockMs: args.wallClockMs,\n\t\t\ttoolCalls: args.toolCalls,\n\t\t},\n\t\tcreatedAt,\n\t};\n}\n"]}
@@ -0,0 +1,109 @@
1
+ import { existsSync, statSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { ORCHESTRATION_SCHEMA_VERSION, } from "./contracts.js";
5
+ function artifactForChangedFile(cwd, changedPath, index, createdAt) {
6
+ const absolutePath = path.isAbsolute(changedPath) ? path.resolve(changedPath) : path.resolve(cwd, changedPath);
7
+ let sizeBytes;
8
+ try {
9
+ if (existsSync(absolutePath))
10
+ sizeBytes = statSync(absolutePath).size;
11
+ }
12
+ catch {
13
+ // The path remains useful evidence even if it disappeared before metadata collection.
14
+ }
15
+ return {
16
+ artifactId: `changed-file-${index + 1}`,
17
+ kind: "file",
18
+ uri: pathToFileURL(absolutePath).href,
19
+ ...(sizeBytes !== undefined ? { sizeBytes } : {}),
20
+ createdAt,
21
+ };
22
+ }
23
+ function evidenceForClaim(claim, createdAt) {
24
+ const findings = claim.evidence?.findings ?? [];
25
+ return findings.map((finding, index) => ({
26
+ evidenceId: `worker-finding-${index + 1}`,
27
+ kind: "observation",
28
+ summary: finding.summary,
29
+ artifactIds: [],
30
+ trusted: false,
31
+ createdAt,
32
+ ...(finding.confidence !== undefined ? { metadata: { confidence: finding.confidence } } : {}),
33
+ }));
34
+ }
35
+ function verificationEvidence(claim, accepted, criterionIds, createdAt) {
36
+ if (!claim.verification)
37
+ return [];
38
+ const trustedReview = accepted;
39
+ return [
40
+ {
41
+ evidenceId: "independent-review",
42
+ kind: "review",
43
+ summary: claim.summary,
44
+ artifactIds: [],
45
+ trusted: trustedReview,
46
+ createdAt,
47
+ metadata: {
48
+ subjectTaskId: claim.verification.subjectTaskId,
49
+ verdict: claim.verification.verdict,
50
+ reasonCodes: [...claim.verification.reasonCodes],
51
+ },
52
+ },
53
+ ...criterionIds.map((criterionId, index) => ({
54
+ evidenceId: `independent-review-criterion-${index + 1}`,
55
+ criterionId,
56
+ kind: "review",
57
+ summary: claim.summary,
58
+ artifactIds: [],
59
+ trusted: trustedReview && claim.verification?.verdict === "accepted",
60
+ createdAt,
61
+ metadata: { subjectTaskId: claim.verification?.subjectTaskId ?? "" },
62
+ })),
63
+ ];
64
+ }
65
+ /** Sole host-owned conversion from an untrusted claim to a fenced durable result. */
66
+ export function createWorkerResultContract(args) {
67
+ const createdAt = args.createdAt ?? new Date().toISOString();
68
+ const claim = args.claim;
69
+ const status = claim.status === "completed"
70
+ ? args.accepted && !args.verificationRequired
71
+ ? "completed"
72
+ : "partial"
73
+ : claim.status;
74
+ const artifacts = claim.changedFiles.map((changedPath, index) => artifactForChangedFile(args.cwd, changedPath, index, createdAt));
75
+ const blockers = claim.blockers ?? [];
76
+ return {
77
+ schemaVersion: ORCHESTRATION_SCHEMA_VERSION,
78
+ resultId: `result-${args.handle.attemptId}-${args.handle.fencingToken}`,
79
+ objectiveId: args.handle.objectiveId,
80
+ taskId: args.handle.taskId,
81
+ attemptId: args.handle.attemptId,
82
+ leaseId: args.handle.leaseId,
83
+ fencingToken: args.handle.fencingToken,
84
+ status,
85
+ reasonCode: args.reasonCode ?? `worker_${claim.status}`,
86
+ summary: claim.summary,
87
+ artifacts,
88
+ evidence: [
89
+ ...evidenceForClaim(claim, createdAt),
90
+ ...verificationEvidence(claim, args.accepted, args.verificationCriterionIds ?? [], createdAt),
91
+ ],
92
+ errors: blockers.map((message) => ({ code: "worker_blocker", message, retryable: false })),
93
+ ...(args.verificationRequired
94
+ ? { nextAction: "independent_verification_required" }
95
+ : !args.accepted || claim.parentReviewRequired
96
+ ? { nextAction: "parent_review" }
97
+ : {}),
98
+ usage: {
99
+ ...(args.inputTokens !== undefined ? { inputTokens: args.inputTokens } : {}),
100
+ ...(args.outputTokens !== undefined ? { outputTokens: args.outputTokens } : {}),
101
+ ...(args.totalTokens !== undefined ? { totalTokens: args.totalTokens } : {}),
102
+ ...(args.costUsd !== undefined ? { costUsd: args.costUsd } : {}),
103
+ wallClockMs: args.wallClockMs,
104
+ toolCalls: args.toolCalls,
105
+ },
106
+ createdAt,
107
+ };
108
+ }
109
+ //# sourceMappingURL=worker-result-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-result-adapter.js","sourceRoot":"","sources":["../../../src/core/orchestration/worker-result-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { WorkerClaim } from \"../autonomy/contracts.ts\";\nimport {\n\ttype ArtifactContract,\n\ttype EvidenceContract,\n\tORCHESTRATION_SCHEMA_VERSION,\n\ttype WorkerResultContract,\n} from \"./contracts.ts\";\nimport type { StartedDelegationAttempt } from \"./delegation-ledger.ts\";\n\nfunction artifactForChangedFile(cwd: string, changedPath: string, index: number, createdAt: string): ArtifactContract {\n\tconst absolutePath = path.isAbsolute(changedPath) ? path.resolve(changedPath) : path.resolve(cwd, changedPath);\n\tlet sizeBytes: number | undefined;\n\ttry {\n\t\tif (existsSync(absolutePath)) sizeBytes = statSync(absolutePath).size;\n\t} catch {\n\t\t// The path remains useful evidence even if it disappeared before metadata collection.\n\t}\n\treturn {\n\t\tartifactId: `changed-file-${index + 1}`,\n\t\tkind: \"file\",\n\t\turi: pathToFileURL(absolutePath).href,\n\t\t...(sizeBytes !== undefined ? { sizeBytes } : {}),\n\t\tcreatedAt,\n\t};\n}\n\nfunction evidenceForClaim(claim: WorkerClaim, createdAt: string): EvidenceContract[] {\n\tconst findings = claim.evidence?.findings ?? [];\n\treturn findings.map((finding, index) => ({\n\t\tevidenceId: `worker-finding-${index + 1}`,\n\t\tkind: \"observation\",\n\t\tsummary: finding.summary,\n\t\tartifactIds: [],\n\t\ttrusted: false,\n\t\tcreatedAt,\n\t\t...(finding.confidence !== undefined ? { metadata: { confidence: finding.confidence } } : {}),\n\t}));\n}\n\nfunction verificationEvidence(\n\tclaim: WorkerClaim,\n\taccepted: boolean,\n\tcriterionIds: readonly string[],\n\tcreatedAt: string,\n): EvidenceContract[] {\n\tif (!claim.verification) return [];\n\tconst trustedReview = accepted;\n\treturn [\n\t\t{\n\t\t\tevidenceId: \"independent-review\",\n\t\t\tkind: \"review\",\n\t\t\tsummary: claim.summary,\n\t\t\tartifactIds: [],\n\t\t\ttrusted: trustedReview,\n\t\t\tcreatedAt,\n\t\t\tmetadata: {\n\t\t\t\tsubjectTaskId: claim.verification.subjectTaskId,\n\t\t\t\tverdict: claim.verification.verdict,\n\t\t\t\treasonCodes: [...claim.verification.reasonCodes],\n\t\t\t},\n\t\t},\n\t\t...criterionIds.map(\n\t\t\t(criterionId, index): EvidenceContract => ({\n\t\t\t\tevidenceId: `independent-review-criterion-${index + 1}`,\n\t\t\t\tcriterionId,\n\t\t\t\tkind: \"review\",\n\t\t\t\tsummary: claim.summary,\n\t\t\t\tartifactIds: [],\n\t\t\t\ttrusted: trustedReview && claim.verification?.verdict === \"accepted\",\n\t\t\t\tcreatedAt,\n\t\t\t\tmetadata: { subjectTaskId: claim.verification?.subjectTaskId ?? \"\" },\n\t\t\t}),\n\t\t),\n\t];\n}\n\n/** Sole host-owned conversion from an untrusted claim to a fenced durable result. */\nexport function createWorkerResultContract(args: {\n\thandle: StartedDelegationAttempt;\n\tclaim: WorkerClaim;\n\taccepted: boolean;\n\tcostUsd?: number;\n\tcwd: string;\n\tinputTokens?: number;\n\toutputTokens?: number;\n\ttotalTokens?: number;\n\twallClockMs: number;\n\ttoolCalls: number;\n\tverificationRequired?: boolean;\n\tverificationCriterionIds?: readonly string[];\n\treasonCode?: string;\n\tcreatedAt?: string;\n}): WorkerResultContract {\n\tconst createdAt = args.createdAt ?? new Date().toISOString();\n\tconst claim = args.claim;\n\tconst status: WorkerResultContract[\"status\"] =\n\t\tclaim.status === \"completed\"\n\t\t\t? args.accepted && !args.verificationRequired\n\t\t\t\t? \"completed\"\n\t\t\t\t: \"partial\"\n\t\t\t: claim.status;\n\tconst artifacts = claim.changedFiles.map((changedPath, index) =>\n\t\tartifactForChangedFile(args.cwd, changedPath, index, createdAt),\n\t);\n\tconst blockers = claim.blockers ?? [];\n\treturn {\n\t\tschemaVersion: ORCHESTRATION_SCHEMA_VERSION,\n\t\tresultId: `result-${args.handle.attemptId}-${args.handle.fencingToken}`,\n\t\tobjectiveId: args.handle.objectiveId,\n\t\ttaskId: args.handle.taskId,\n\t\tattemptId: args.handle.attemptId,\n\t\tleaseId: args.handle.leaseId,\n\t\tfencingToken: args.handle.fencingToken,\n\t\tstatus,\n\t\treasonCode: args.reasonCode ?? `worker_${claim.status}`,\n\t\tsummary: claim.summary,\n\t\tartifacts,\n\t\tevidence: [\n\t\t\t...evidenceForClaim(claim, createdAt),\n\t\t\t...verificationEvidence(claim, args.accepted, args.verificationCriterionIds ?? [], createdAt),\n\t\t],\n\t\terrors: blockers.map((message) => ({ code: \"worker_blocker\", message, retryable: false })),\n\t\t...(args.verificationRequired\n\t\t\t? { nextAction: \"independent_verification_required\" }\n\t\t\t: !args.accepted || claim.parentReviewRequired\n\t\t\t\t? { nextAction: \"parent_review\" }\n\t\t\t\t: {}),\n\t\tusage: {\n\t\t\t...(args.inputTokens !== undefined ? { inputTokens: args.inputTokens } : {}),\n\t\t\t...(args.outputTokens !== undefined ? { outputTokens: args.outputTokens } : {}),\n\t\t\t...(args.totalTokens !== undefined ? { totalTokens: args.totalTokens } : {}),\n\t\t\t...(args.costUsd !== undefined ? { costUsd: args.costUsd } : {}),\n\t\t\twallClockMs: args.wallClockMs,\n\t\t\ttoolCalls: args.toolCalls,\n\t\t},\n\t\tcreatedAt,\n\t};\n}\n"]}
@@ -0,0 +1,11 @@
1
+ /** Cross-process identity carried by managed child sessions. */
2
+ export declare const PI_PARENT_PID_ENV = "PI_PARENT_PID";
3
+ export declare const PI_PARENT_SESSION_ENV = "PI_PARENT_SESSION";
4
+ export declare const PI_ORCHESTRATION_AGENT_ID_ENV = "PI_ORCHESTRATION_AGENT_ID";
5
+ export declare const PI_TASK_REF_ENV = "PI_TASK_REF";
6
+ /** A malformed or non-positive parent pid is ignored. */
7
+ export declare function getParentPid(env?: NodeJS.ProcessEnv): number | undefined;
8
+ export declare function getParentSessionId(env?: NodeJS.ProcessEnv): string | undefined;
9
+ export declare function getOrchestrationAgentId(env?: NodeJS.ProcessEnv): string | undefined;
10
+ export declare function getProcessTaskRef(env?: NodeJS.ProcessEnv): string | undefined;
11
+ //# sourceMappingURL=process-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-identity.d.ts","sourceRoot":"","sources":["../../src/core/process-identity.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AACjD,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AACzD,eAAO,MAAM,6BAA6B,8BAA8B,CAAC;AACzE,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAE7C,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,SAAS,CAKrF;AAED,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,SAAS,CAG3F;AAED,wBAAgB,uBAAuB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,SAAS,CAGhG;AAED,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,SAAS,CAG1F","sourcesContent":["/** Cross-process identity carried by managed child sessions. */\n\nexport const PI_PARENT_PID_ENV = \"PI_PARENT_PID\";\nexport const PI_PARENT_SESSION_ENV = \"PI_PARENT_SESSION\";\nexport const PI_ORCHESTRATION_AGENT_ID_ENV = \"PI_ORCHESTRATION_AGENT_ID\";\nexport const PI_TASK_REF_ENV = \"PI_TASK_REF\";\n\n/** A malformed or non-positive parent pid is ignored. */\nexport function getParentPid(env: NodeJS.ProcessEnv = process.env): number | undefined {\n\tconst raw = env[PI_PARENT_PID_ENV];\n\tif (raw === undefined) return undefined;\n\tconst value = Number.parseInt(raw, 10);\n\treturn Number.isFinite(value) && value > 0 ? value : undefined;\n}\n\nexport function getParentSessionId(env: NodeJS.ProcessEnv = process.env): string | undefined {\n\tconst value = env[PI_PARENT_SESSION_ENV]?.trim();\n\treturn value && value.length > 0 ? value : undefined;\n}\n\nexport function getOrchestrationAgentId(env: NodeJS.ProcessEnv = process.env): string | undefined {\n\tconst value = env[PI_ORCHESTRATION_AGENT_ID_ENV]?.trim();\n\treturn value && value.length > 0 ? value : undefined;\n}\n\nexport function getProcessTaskRef(env: NodeJS.ProcessEnv = process.env): string | undefined {\n\tconst value = env[PI_TASK_REF_ENV]?.trim();\n\treturn value && value.length > 0 ? value : undefined;\n}\n"]}
@@ -0,0 +1,26 @@
1
+ /** Cross-process identity carried by managed child sessions. */
2
+ export const PI_PARENT_PID_ENV = "PI_PARENT_PID";
3
+ export const PI_PARENT_SESSION_ENV = "PI_PARENT_SESSION";
4
+ export const PI_ORCHESTRATION_AGENT_ID_ENV = "PI_ORCHESTRATION_AGENT_ID";
5
+ export const PI_TASK_REF_ENV = "PI_TASK_REF";
6
+ /** A malformed or non-positive parent pid is ignored. */
7
+ export function getParentPid(env = process.env) {
8
+ const raw = env[PI_PARENT_PID_ENV];
9
+ if (raw === undefined)
10
+ return undefined;
11
+ const value = Number.parseInt(raw, 10);
12
+ return Number.isFinite(value) && value > 0 ? value : undefined;
13
+ }
14
+ export function getParentSessionId(env = process.env) {
15
+ const value = env[PI_PARENT_SESSION_ENV]?.trim();
16
+ return value && value.length > 0 ? value : undefined;
17
+ }
18
+ export function getOrchestrationAgentId(env = process.env) {
19
+ const value = env[PI_ORCHESTRATION_AGENT_ID_ENV]?.trim();
20
+ return value && value.length > 0 ? value : undefined;
21
+ }
22
+ export function getProcessTaskRef(env = process.env) {
23
+ const value = env[PI_TASK_REF_ENV]?.trim();
24
+ return value && value.length > 0 ? value : undefined;
25
+ }
26
+ //# sourceMappingURL=process-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-identity.js","sourceRoot":"","sources":["../../src/core/process-identity.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AACjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;AACzD,MAAM,CAAC,MAAM,6BAA6B,GAAG,2BAA2B,CAAC;AACzE,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAC;AAE7C,yDAAyD;AACzD,MAAM,UAAU,YAAY,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAsB;IACtF,MAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CAC/D;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAsB;IAC5F,MAAM,KAAK,GAAG,GAAG,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,CAAC;IACjD,OAAO,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CACrD;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAsB;IACjG,MAAM,KAAK,GAAG,GAAG,CAAC,6BAA6B,CAAC,EAAE,IAAI,EAAE,CAAC;IACzD,OAAO,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CACrD;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAsB;IAC3F,MAAM,KAAK,GAAG,GAAG,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC;IAC3C,OAAO,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CACrD","sourcesContent":["/** Cross-process identity carried by managed child sessions. */\n\nexport const PI_PARENT_PID_ENV = \"PI_PARENT_PID\";\nexport const PI_PARENT_SESSION_ENV = \"PI_PARENT_SESSION\";\nexport const PI_ORCHESTRATION_AGENT_ID_ENV = \"PI_ORCHESTRATION_AGENT_ID\";\nexport const PI_TASK_REF_ENV = \"PI_TASK_REF\";\n\n/** A malformed or non-positive parent pid is ignored. */\nexport function getParentPid(env: NodeJS.ProcessEnv = process.env): number | undefined {\n\tconst raw = env[PI_PARENT_PID_ENV];\n\tif (raw === undefined) return undefined;\n\tconst value = Number.parseInt(raw, 10);\n\treturn Number.isFinite(value) && value > 0 ? value : undefined;\n}\n\nexport function getParentSessionId(env: NodeJS.ProcessEnv = process.env): string | undefined {\n\tconst value = env[PI_PARENT_SESSION_ENV]?.trim();\n\treturn value && value.length > 0 ? value : undefined;\n}\n\nexport function getOrchestrationAgentId(env: NodeJS.ProcessEnv = process.env): string | undefined {\n\tconst value = env[PI_ORCHESTRATION_AGENT_ID_ENV]?.trim();\n\treturn value && value.length > 0 ? value : undefined;\n}\n\nexport function getProcessTaskRef(env: NodeJS.ProcessEnv = process.env): string | undefined {\n\tconst value = env[PI_TASK_REF_ENV]?.trim();\n\treturn value && value.length > 0 ? value : undefined;\n}\n"]}
@@ -11,6 +11,7 @@
11
11
  * tmux-dispatched agent. A worker knows its parent's pid and winds down gracefully -- never
12
12
  * silently -- when that parent disappears.
13
13
  */
14
+ import type { AgentIdentityContract } from "../orchestration/contracts.ts";
14
15
  export type ProcessRole = "master" | "worker";
15
16
  /**
16
17
  * - `running` -- normal operation.
@@ -25,16 +26,24 @@ export type ProcessStatus = "running" | "winding_down" | "resumable" | "adopted"
25
26
  export type WindDownReason = "parent_lost" | "parent_shutdown" | "user_cleanup";
26
27
  /** What a wound-down worker leaves behind so its task can be picked back up. */
27
28
  export interface ResumablePayload {
28
- laneKey?: string;
29
+ agent: AgentIdentityContract;
30
+ taskRef?: string;
29
31
  taskSummary?: string;
30
32
  lastCode: ProcessStatus;
31
33
  }
34
+ /** Durable terminal notification outbox for one worker process. */
35
+ export interface ProcessTerminalHandoff {
36
+ code: number | null;
37
+ signal: string | null;
38
+ observedAt: string;
39
+ notificationDeliveredAt?: string;
40
+ }
32
41
  /** One process-matrix entry: one file under `state/process-matrix/<entryId>.json` (see `store.ts`). */
33
42
  export interface ProcessMatrixEntry {
34
43
  entryId: string;
35
44
  role: ProcessRole;
45
+ agent: AgentIdentityContract;
36
46
  pid: number;
37
- sessionId: string;
38
47
  hostname: string;
39
48
  startedAt: string;
40
49
  heartbeatAt: string;
@@ -42,12 +51,13 @@ export interface ProcessMatrixEntry {
42
51
  /** Worker-only: the pid of the process that launched this one. */
43
52
  parentPid?: number;
44
53
  parentSessionId?: string;
45
- laneKey?: string;
46
54
  tmuxSession?: string;
47
55
  tmuxPanePid?: number;
48
56
  taskRef?: string;
57
+ taskSummary?: string;
49
58
  windDownReason?: WindDownReason;
50
59
  resumable?: ResumablePayload;
60
+ terminal?: ProcessTerminalHandoff;
51
61
  }
52
62
  /** What a master decides to do about one orphaned worker during the startup scan. */
53
63
  export type CleanupAction = "adopt" | "cleanup" | "leave";
@@ -68,5 +78,6 @@ export interface ReconcileMatrixResult {
68
78
  code: "reconciled";
69
79
  kept: ProcessMatrixEntry[];
70
80
  prunedEntryIds: string[];
81
+ recoveredEntryIds: string[];
71
82
  }
72
83
  //# sourceMappingURL=codes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codes.d.ts","sourceRoot":"","sources":["../../../src/core/process-matrix/codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9C;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,cAAc,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE5F,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,iBAAiB,GAAG,cAAc,CAAC;AAEhF,gFAAgF;AAChF,MAAM,WAAW,gBAAgB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,aAAa,CAAC;CACxB;AAED,uGAAuG;AACvG,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED,qFAAqF;AACrF,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjH,iGAAiG;AACjG,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;CACzB","sourcesContent":["/**\n * Process-matrix SSOT for tagged result codes and shared record types.\n *\n * Every process-matrix lifecycle transition is expressed as one of the string-literal codes/status\n * values below -- callers (the runtime, the master orphan scan, the worker watcher) branch on\n * `code`/`status`, NEVER on a message/substring (the same doctrine as `worktree-sync/codes.ts`).\n *\n * The matrix tracks two roles:\n * - `master`: the top-level interactive/direct session (or the root of a launch chain).\n * - `worker`: a session launched with a known parent (`PI_PARENT_PID`/`--parent-pid`), e.g. a\n * tmux-dispatched agent. A worker knows its parent's pid and winds down gracefully -- never\n * silently -- when that parent disappears.\n */\n\nexport type ProcessRole = \"master\" | \"worker\";\n\n/**\n * - `running` -- normal operation.\n * - `winding_down` -- a lifecycle transition is in progress (parent lost, parent shutdown, or a\n * cooperative user-requested cleanup); the process is finishing up before exit.\n * - `resumable` -- wound down leaving a payload describing how to pick the task back up.\n * - `adopted` -- claimed by a new parent after the original parent was lost (retained by\n * `reconcileMatrix` alongside `resumable`, TTL-gated).\n * - `closed` -- terminal; safe to prune.\n */\nexport type ProcessStatus = \"running\" | \"winding_down\" | \"resumable\" | \"adopted\" | \"closed\";\n\nexport type WindDownReason = \"parent_lost\" | \"parent_shutdown\" | \"user_cleanup\";\n\n/** What a wound-down worker leaves behind so its task can be picked back up. */\nexport interface ResumablePayload {\n\tlaneKey?: string;\n\ttaskSummary?: string;\n\tlastCode: ProcessStatus;\n}\n\n/** One process-matrix entry: one file under `state/process-matrix/<entryId>.json` (see `store.ts`). */\nexport interface ProcessMatrixEntry {\n\tentryId: string;\n\trole: ProcessRole;\n\tpid: number;\n\tsessionId: string;\n\thostname: string;\n\tstartedAt: string;\n\theartbeatAt: string;\n\tstatus: ProcessStatus;\n\t/** Worker-only: the pid of the process that launched this one. */\n\tparentPid?: number;\n\tparentSessionId?: string;\n\tlaneKey?: string;\n\ttmuxSession?: string;\n\ttmuxPanePid?: number;\n\ttaskRef?: string;\n\twindDownReason?: WindDownReason;\n\tresumable?: ResumablePayload;\n}\n\n/** What a master decides to do about one orphaned worker during the startup scan. */\nexport type CleanupAction = \"adopt\" | \"cleanup\" | \"leave\";\n\n/**\n * What a worker learns by re-reading its OWN fresh matrix entry (a master may have written an\n * adoption or a cooperative-cleanup request into it -- see `docs/process-matrix.md`).\n */\nexport type WorkerDirective = { code: \"adopt\"; parentPid: number } | { code: \"user_cleanup\" } | { code: \"none\" };\n\n/** Outcome of a `reconcileMatrix` pass: which entries survive and which were pruned, and why. */\nexport interface ReconcileMatrixResult {\n\tcode: \"reconciled\";\n\tkept: ProcessMatrixEntry[];\n\tprunedEntryIds: string[];\n}\n"]}
1
+ {"version":3,"file":"codes.d.ts","sourceRoot":"","sources":["../../../src/core/process-matrix/codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9C;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,cAAc,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE5F,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,iBAAiB,GAAG,cAAc,CAAC;AAEhF,gFAAgF;AAChF,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,aAAa,CAAC;CACxB;AAED,mEAAmE;AACnE,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,uGAAuG;AACvG,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,qBAAqB,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,QAAQ,CAAC,EAAE,sBAAsB,CAAC;CAClC;AAED,qFAAqF;AACrF,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjH,iGAAiG;AACjG,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC5B","sourcesContent":["/**\n * Process-matrix SSOT for tagged result codes and shared record types.\n *\n * Every process-matrix lifecycle transition is expressed as one of the string-literal codes/status\n * values below -- callers (the runtime, the master orphan scan, the worker watcher) branch on\n * `code`/`status`, NEVER on a message/substring (the same doctrine as `worktree-sync/codes.ts`).\n *\n * The matrix tracks two roles:\n * - `master`: the top-level interactive/direct session (or the root of a launch chain).\n * - `worker`: a session launched with a known parent (`PI_PARENT_PID`/`--parent-pid`), e.g. a\n * tmux-dispatched agent. A worker knows its parent's pid and winds down gracefully -- never\n * silently -- when that parent disappears.\n */\n\nimport type { AgentIdentityContract } from \"../orchestration/contracts.ts\";\n\nexport type ProcessRole = \"master\" | \"worker\";\n\n/**\n * - `running` -- normal operation.\n * - `winding_down` -- a lifecycle transition is in progress (parent lost, parent shutdown, or a\n * cooperative user-requested cleanup); the process is finishing up before exit.\n * - `resumable` -- wound down leaving a payload describing how to pick the task back up.\n * - `adopted` -- claimed by a new parent after the original parent was lost (retained by\n * `reconcileMatrix` alongside `resumable`, TTL-gated).\n * - `closed` -- terminal; safe to prune.\n */\nexport type ProcessStatus = \"running\" | \"winding_down\" | \"resumable\" | \"adopted\" | \"closed\";\n\nexport type WindDownReason = \"parent_lost\" | \"parent_shutdown\" | \"user_cleanup\";\n\n/** What a wound-down worker leaves behind so its task can be picked back up. */\nexport interface ResumablePayload {\n\tagent: AgentIdentityContract;\n\ttaskRef?: string;\n\ttaskSummary?: string;\n\tlastCode: ProcessStatus;\n}\n\n/** Durable terminal notification outbox for one worker process. */\nexport interface ProcessTerminalHandoff {\n\tcode: number | null;\n\tsignal: string | null;\n\tobservedAt: string;\n\tnotificationDeliveredAt?: string;\n}\n\n/** One process-matrix entry: one file under `state/process-matrix/<entryId>.json` (see `store.ts`). */\nexport interface ProcessMatrixEntry {\n\tentryId: string;\n\trole: ProcessRole;\n\tagent: AgentIdentityContract;\n\tpid: number;\n\thostname: string;\n\tstartedAt: string;\n\theartbeatAt: string;\n\tstatus: ProcessStatus;\n\t/** Worker-only: the pid of the process that launched this one. */\n\tparentPid?: number;\n\tparentSessionId?: string;\n\ttmuxSession?: string;\n\ttmuxPanePid?: number;\n\ttaskRef?: string;\n\ttaskSummary?: string;\n\twindDownReason?: WindDownReason;\n\tresumable?: ResumablePayload;\n\tterminal?: ProcessTerminalHandoff;\n}\n\n/** What a master decides to do about one orphaned worker during the startup scan. */\nexport type CleanupAction = \"adopt\" | \"cleanup\" | \"leave\";\n\n/**\n * What a worker learns by re-reading its OWN fresh matrix entry (a master may have written an\n * adoption or a cooperative-cleanup request into it -- see `docs/process-matrix.md`).\n */\nexport type WorkerDirective = { code: \"adopt\"; parentPid: number } | { code: \"user_cleanup\" } | { code: \"none\" };\n\n/** Outcome of a `reconcileMatrix` pass: which entries survive and which were pruned, and why. */\nexport interface ReconcileMatrixResult {\n\tcode: \"reconciled\";\n\tkept: ProcessMatrixEntry[];\n\tprunedEntryIds: string[];\n\trecoveredEntryIds: string[];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"codes.js","sourceRoot":"","sources":["../../../src/core/process-matrix/codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG","sourcesContent":["/**\n * Process-matrix SSOT for tagged result codes and shared record types.\n *\n * Every process-matrix lifecycle transition is expressed as one of the string-literal codes/status\n * values below -- callers (the runtime, the master orphan scan, the worker watcher) branch on\n * `code`/`status`, NEVER on a message/substring (the same doctrine as `worktree-sync/codes.ts`).\n *\n * The matrix tracks two roles:\n * - `master`: the top-level interactive/direct session (or the root of a launch chain).\n * - `worker`: a session launched with a known parent (`PI_PARENT_PID`/`--parent-pid`), e.g. a\n * tmux-dispatched agent. A worker knows its parent's pid and winds down gracefully -- never\n * silently -- when that parent disappears.\n */\n\nexport type ProcessRole = \"master\" | \"worker\";\n\n/**\n * - `running` -- normal operation.\n * - `winding_down` -- a lifecycle transition is in progress (parent lost, parent shutdown, or a\n * cooperative user-requested cleanup); the process is finishing up before exit.\n * - `resumable` -- wound down leaving a payload describing how to pick the task back up.\n * - `adopted` -- claimed by a new parent after the original parent was lost (retained by\n * `reconcileMatrix` alongside `resumable`, TTL-gated).\n * - `closed` -- terminal; safe to prune.\n */\nexport type ProcessStatus = \"running\" | \"winding_down\" | \"resumable\" | \"adopted\" | \"closed\";\n\nexport type WindDownReason = \"parent_lost\" | \"parent_shutdown\" | \"user_cleanup\";\n\n/** What a wound-down worker leaves behind so its task can be picked back up. */\nexport interface ResumablePayload {\n\tlaneKey?: string;\n\ttaskSummary?: string;\n\tlastCode: ProcessStatus;\n}\n\n/** One process-matrix entry: one file under `state/process-matrix/<entryId>.json` (see `store.ts`). */\nexport interface ProcessMatrixEntry {\n\tentryId: string;\n\trole: ProcessRole;\n\tpid: number;\n\tsessionId: string;\n\thostname: string;\n\tstartedAt: string;\n\theartbeatAt: string;\n\tstatus: ProcessStatus;\n\t/** Worker-only: the pid of the process that launched this one. */\n\tparentPid?: number;\n\tparentSessionId?: string;\n\tlaneKey?: string;\n\ttmuxSession?: string;\n\ttmuxPanePid?: number;\n\ttaskRef?: string;\n\twindDownReason?: WindDownReason;\n\tresumable?: ResumablePayload;\n}\n\n/** What a master decides to do about one orphaned worker during the startup scan. */\nexport type CleanupAction = \"adopt\" | \"cleanup\" | \"leave\";\n\n/**\n * What a worker learns by re-reading its OWN fresh matrix entry (a master may have written an\n * adoption or a cooperative-cleanup request into it -- see `docs/process-matrix.md`).\n */\nexport type WorkerDirective = { code: \"adopt\"; parentPid: number } | { code: \"user_cleanup\" } | { code: \"none\" };\n\n/** Outcome of a `reconcileMatrix` pass: which entries survive and which were pruned, and why. */\nexport interface ReconcileMatrixResult {\n\tcode: \"reconciled\";\n\tkept: ProcessMatrixEntry[];\n\tprunedEntryIds: string[];\n}\n"]}
1
+ {"version":3,"file":"codes.js","sourceRoot":"","sources":["../../../src/core/process-matrix/codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG","sourcesContent":["/**\n * Process-matrix SSOT for tagged result codes and shared record types.\n *\n * Every process-matrix lifecycle transition is expressed as one of the string-literal codes/status\n * values below -- callers (the runtime, the master orphan scan, the worker watcher) branch on\n * `code`/`status`, NEVER on a message/substring (the same doctrine as `worktree-sync/codes.ts`).\n *\n * The matrix tracks two roles:\n * - `master`: the top-level interactive/direct session (or the root of a launch chain).\n * - `worker`: a session launched with a known parent (`PI_PARENT_PID`/`--parent-pid`), e.g. a\n * tmux-dispatched agent. A worker knows its parent's pid and winds down gracefully -- never\n * silently -- when that parent disappears.\n */\n\nimport type { AgentIdentityContract } from \"../orchestration/contracts.ts\";\n\nexport type ProcessRole = \"master\" | \"worker\";\n\n/**\n * - `running` -- normal operation.\n * - `winding_down` -- a lifecycle transition is in progress (parent lost, parent shutdown, or a\n * cooperative user-requested cleanup); the process is finishing up before exit.\n * - `resumable` -- wound down leaving a payload describing how to pick the task back up.\n * - `adopted` -- claimed by a new parent after the original parent was lost (retained by\n * `reconcileMatrix` alongside `resumable`, TTL-gated).\n * - `closed` -- terminal; safe to prune.\n */\nexport type ProcessStatus = \"running\" | \"winding_down\" | \"resumable\" | \"adopted\" | \"closed\";\n\nexport type WindDownReason = \"parent_lost\" | \"parent_shutdown\" | \"user_cleanup\";\n\n/** What a wound-down worker leaves behind so its task can be picked back up. */\nexport interface ResumablePayload {\n\tagent: AgentIdentityContract;\n\ttaskRef?: string;\n\ttaskSummary?: string;\n\tlastCode: ProcessStatus;\n}\n\n/** Durable terminal notification outbox for one worker process. */\nexport interface ProcessTerminalHandoff {\n\tcode: number | null;\n\tsignal: string | null;\n\tobservedAt: string;\n\tnotificationDeliveredAt?: string;\n}\n\n/** One process-matrix entry: one file under `state/process-matrix/<entryId>.json` (see `store.ts`). */\nexport interface ProcessMatrixEntry {\n\tentryId: string;\n\trole: ProcessRole;\n\tagent: AgentIdentityContract;\n\tpid: number;\n\thostname: string;\n\tstartedAt: string;\n\theartbeatAt: string;\n\tstatus: ProcessStatus;\n\t/** Worker-only: the pid of the process that launched this one. */\n\tparentPid?: number;\n\tparentSessionId?: string;\n\ttmuxSession?: string;\n\ttmuxPanePid?: number;\n\ttaskRef?: string;\n\ttaskSummary?: string;\n\twindDownReason?: WindDownReason;\n\tresumable?: ResumablePayload;\n\tterminal?: ProcessTerminalHandoff;\n}\n\n/** What a master decides to do about one orphaned worker during the startup scan. */\nexport type CleanupAction = \"adopt\" | \"cleanup\" | \"leave\";\n\n/**\n * What a worker learns by re-reading its OWN fresh matrix entry (a master may have written an\n * adoption or a cooperative-cleanup request into it -- see `docs/process-matrix.md`).\n */\nexport type WorkerDirective = { code: \"adopt\"; parentPid: number } | { code: \"user_cleanup\" } | { code: \"none\" };\n\n/** Outcome of a `reconcileMatrix` pass: which entries survive and which were pruned, and why. */\nexport interface ReconcileMatrixResult {\n\tcode: \"reconciled\";\n\tkept: ProcessMatrixEntry[];\n\tprunedEntryIds: string[];\n\trecoveredEntryIds: string[];\n}\n"]}
@@ -0,0 +1,26 @@
1
+ import type { ResumablePayload } from "./codes.ts";
2
+ export interface PiSelfLaunchTarget {
3
+ executable: string;
4
+ argsPrefix: readonly string[];
5
+ }
6
+ export type ResumablePiAgentLaunchOutcome = {
7
+ started: true;
8
+ pid: number;
9
+ completion: Promise<{
10
+ code: number | null;
11
+ signal: NodeJS.Signals | null;
12
+ }>;
13
+ } | {
14
+ started: false;
15
+ reason: string;
16
+ };
17
+ export declare function buildResumablePiAgentWakePrompt(payload: ResumablePayload): string;
18
+ /** Launches one exact persisted Pi session; completion is observed only through process events. */
19
+ export declare function launchResumablePiAgent(options: {
20
+ payload: ResumablePayload;
21
+ target: PiSelfLaunchTarget;
22
+ parentPid: number;
23
+ parentSessionId: string;
24
+ environment: NodeJS.ProcessEnv;
25
+ }): Promise<ResumablePiAgentLaunchOutcome>;
26
+ //# sourceMappingURL=resume-launcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-launcher.d.ts","sourceRoot":"","sources":["../../../src/core/process-matrix/resume-launcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,MAAM,6BAA6B,GACtC;IACA,OAAO,EAAE,IAAI,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CAC3E,GACD;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAgBjF;AAED,mGAAmG;AACnG,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACrD,OAAO,EAAE,gBAAgB,CAAC;IAC1B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B,GAAG,OAAO,CAAC,6BAA6B,CAAC,CA4CzC","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { buildPiResumeLaunchSpec } from \"../orchestration/agent-resume.ts\";\nimport type { ResumablePayload } from \"./codes.ts\";\n\nexport interface PiSelfLaunchTarget {\n\texecutable: string;\n\targsPrefix: readonly string[];\n}\n\nexport type ResumablePiAgentLaunchOutcome =\n\t| {\n\t\t\tstarted: true;\n\t\t\tpid: number;\n\t\t\tcompletion: Promise<{ code: number | null; signal: NodeJS.Signals | null }>;\n\t }\n\t| { started: false; reason: string };\n\nexport function buildResumablePiAgentWakePrompt(payload: ResumablePayload): string {\n\tconst context = payload.agent.resumeContext;\n\tconst taskSummary = payload.taskSummary?.trim().slice(0, 2_000);\n\tconst contextPointers = context.contextPointers\n\t\t.slice(0, 20)\n\t\t.map(\n\t\t\t(pointer) =>\n\t\t\t\t`- ${JSON.stringify({ id: pointer.id, kind: pointer.kind, uri: pointer.uri, readOnly: pointer.readOnly }).slice(0, 1_000)}`,\n\t\t);\n\treturn [\n\t\t\"Resume this interrupted delegated task using the persisted session context and the same logical agent identity.\",\n\t\t...(taskSummary ? [`Task: ${taskSummary}`] : []),\n\t\t...(context.latestCheckpointId ? [`Latest checkpoint: ${context.latestCheckpointId}`] : []),\n\t\t...(contextPointers.length > 0 ? [\"Persisted context pointers:\", ...contextPointers] : []),\n\t\t\"Continue from the persisted transcript and referenced checkpoints or artifacts, then finish with a persisted terminal result.\",\n\t].join(\"\\n\");\n}\n\n/** Launches one exact persisted Pi session; completion is observed only through process events. */\nexport async function launchResumablePiAgent(options: {\n\tpayload: ResumablePayload;\n\ttarget: PiSelfLaunchTarget;\n\tparentPid: number;\n\tparentSessionId: string;\n\tenvironment: NodeJS.ProcessEnv;\n}): Promise<ResumablePiAgentLaunchOutcome> {\n\tconst context = options.payload.agent.resumeContext;\n\tif (!context || context.provider !== \"pi\") {\n\t\treturn { started: false, reason: \"Pi resume context is unavailable.\" };\n\t}\n\tconst spec = buildPiResumeLaunchSpec(options.payload.agent, {\n\t\texecutable: options.target.executable,\n\t\targsPrefix: options.target.argsPrefix,\n\t\tparentPid: options.parentPid,\n\t\tparentSessionId: options.parentSessionId,\n\t\ttaskRef: options.payload.taskRef,\n\t\twakePrompt: buildResumablePiAgentWakePrompt(options.payload),\n\t});\n\tif ([spec.executable, spec.cwd, ...spec.args].some((value) => value.includes(\"\\0\"))) {\n\t\treturn { started: false, reason: \"Resume launch data contains a null byte.\" };\n\t}\n\ttry {\n\t\tconst child = spawn(spec.executable, spec.args, {\n\t\t\tcwd: spec.cwd,\n\t\t\tdetached: true,\n\t\t\tstdio: \"ignore\",\n\t\t\tenv: { ...options.environment, ...spec.env },\n\t\t});\n\t\treturn await new Promise<ResumablePiAgentLaunchOutcome>((resolve) => {\n\t\t\tchild.once(\"error\", (error) => resolve({ started: false, reason: error.message }));\n\t\t\tchild.once(\"spawn\", () => {\n\t\t\t\tconst childPid = child.pid;\n\t\t\t\tif (childPid === undefined || !Number.isSafeInteger(childPid) || childPid <= 0) {\n\t\t\t\t\tresolve({ started: false, reason: \"Resume process started without a valid pid.\" });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst completion = new Promise<{ code: number | null; signal: NodeJS.Signals | null }>(\n\t\t\t\t\t(resolveCompletion, rejectCompletion) => {\n\t\t\t\t\t\tchild.once(\"exit\", (code, signal) => resolveCompletion({ code, signal }));\n\t\t\t\t\t\tchild.once(\"error\", rejectCompletion);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tchild.unref();\n\t\t\t\tresolve({ started: true, pid: childPid, completion });\n\t\t\t});\n\t\t});\n\t} catch (error) {\n\t\treturn { started: false, reason: error instanceof Error ? error.message : String(error) };\n\t}\n}\n"]}