@caupulican/pi-adaptative 0.81.40 → 0.81.42

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 (599) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +1 -1
  3. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js +1 -0
  4. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +1 -1
  5. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.ts +1 -0
  6. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/text.py +5 -1
  7. package/dist/bundled-resources/runtimes/pi-shell-engine/context.py +3 -3
  8. package/dist/bundled-resources/runtimes/pi-shell-engine/errors.py +8 -0
  9. package/dist/bundled-resources/runtimes/pi-shell-engine/exec.py +26 -3
  10. package/dist/bundled-resources/runtimes/pi-shell-engine/expand.py +3 -0
  11. package/dist/bundled-resources/runtimes/pi-shell-engine/main.py +4 -1
  12. package/dist/bundled-resources/runtimes/pi-shell-engine/state.py +2 -1
  13. package/dist/bundled-resources/runtimes/pi-shell-engine/tokens.py +2 -0
  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 +22 -1
  17. package/dist/cli/args.js.map +1 -1
  18. package/dist/core/agent-paths.d.ts +38 -0
  19. package/dist/core/agent-paths.d.ts.map +1 -1
  20. package/dist/core/agent-paths.js +77 -0
  21. package/dist/core/agent-paths.js.map +1 -1
  22. package/dist/core/agent-session-contracts.d.ts +311 -0
  23. package/dist/core/agent-session-contracts.d.ts.map +1 -0
  24. package/dist/core/agent-session-contracts.js +26 -0
  25. package/dist/core/agent-session-contracts.js.map +1 -0
  26. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  27. package/dist/core/agent-session-runtime.js +3 -0
  28. package/dist/core/agent-session-runtime.js.map +1 -1
  29. package/dist/core/agent-session.d.ts +26 -405
  30. package/dist/core/agent-session.d.ts.map +1 -1
  31. package/dist/core/agent-session.js +90 -316
  32. package/dist/core/agent-session.js.map +1 -1
  33. package/dist/core/auth-storage.d.ts.map +1 -1
  34. package/dist/core/auth-storage.js +3 -1
  35. package/dist/core/auth-storage.js.map +1 -1
  36. package/dist/core/autonomy/contracts.d.ts +2 -0
  37. package/dist/core/autonomy/contracts.d.ts.map +1 -1
  38. package/dist/core/autonomy/contracts.js.map +1 -1
  39. package/dist/core/autonomy/envelope-enforcement.d.ts.map +1 -1
  40. package/dist/core/autonomy/envelope-enforcement.js +4 -9
  41. package/dist/core/autonomy/envelope-enforcement.js.map +1 -1
  42. package/dist/core/autonomy/lane-tool-surface.d.ts +3 -1
  43. package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
  44. package/dist/core/autonomy/lane-tool-surface.js +19 -5
  45. package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
  46. package/dist/core/autonomy/path-scope.d.ts +14 -0
  47. package/dist/core/autonomy/path-scope.d.ts.map +1 -1
  48. package/dist/core/autonomy/path-scope.js +37 -6
  49. package/dist/core/autonomy/path-scope.js.map +1 -1
  50. package/dist/core/background-lane-controller.d.ts +30 -2
  51. package/dist/core/background-lane-controller.d.ts.map +1 -1
  52. package/dist/core/background-lane-controller.js +33 -1
  53. package/dist/core/background-lane-controller.js.map +1 -1
  54. package/dist/core/bedrock-sso-login.d.ts +16 -0
  55. package/dist/core/bedrock-sso-login.d.ts.map +1 -0
  56. package/dist/core/bedrock-sso-login.js +98 -0
  57. package/dist/core/bedrock-sso-login.js.map +1 -0
  58. package/dist/core/compaction-controller.d.ts.map +1 -1
  59. package/dist/core/compaction-controller.js +1 -1
  60. package/dist/core/compaction-controller.js.map +1 -1
  61. package/dist/core/compaction-support.d.ts +3 -8
  62. package/dist/core/compaction-support.d.ts.map +1 -1
  63. package/dist/core/compaction-support.js +3 -3
  64. package/dist/core/compaction-support.js.map +1 -1
  65. package/dist/core/context-pipeline.d.ts +1 -1
  66. package/dist/core/context-pipeline.d.ts.map +1 -1
  67. package/dist/core/context-pipeline.js +7 -33
  68. package/dist/core/context-pipeline.js.map +1 -1
  69. package/dist/core/cost/cost-summary.d.ts.map +1 -1
  70. package/dist/core/cost/cost-summary.js +5 -3
  71. package/dist/core/cost/cost-summary.js.map +1 -1
  72. package/dist/core/cost/daily-usage.d.ts.map +1 -1
  73. package/dist/core/cost/daily-usage.js +4 -5
  74. package/dist/core/cost/daily-usage.js.map +1 -1
  75. package/dist/core/default-tool-surface.d.ts.map +1 -1
  76. package/dist/core/default-tool-surface.js +1 -0
  77. package/dist/core/default-tool-surface.js.map +1 -1
  78. package/dist/core/delegation/managed-lane-controller.d.ts +11 -1
  79. package/dist/core/delegation/managed-lane-controller.d.ts.map +1 -1
  80. package/dist/core/delegation/managed-lane-controller.js +84 -41
  81. package/dist/core/delegation/managed-lane-controller.js.map +1 -1
  82. package/dist/core/delegation/session-worker-claim.d.ts.map +1 -1
  83. package/dist/core/delegation/session-worker-claim.js +4 -3
  84. package/dist/core/delegation/session-worker-claim.js.map +1 -1
  85. package/dist/core/delegation/worker-action-journal.d.ts +73 -0
  86. package/dist/core/delegation/worker-action-journal.d.ts.map +1 -0
  87. package/dist/core/delegation/worker-action-journal.js +297 -0
  88. package/dist/core/delegation/worker-action-journal.js.map +1 -0
  89. package/dist/core/delegation/worker-actions.d.ts +36 -1
  90. package/dist/core/delegation/worker-actions.d.ts.map +1 -1
  91. package/dist/core/delegation/worker-actions.js +171 -46
  92. package/dist/core/delegation/worker-actions.js.map +1 -1
  93. package/dist/core/delegation/worker-agent-control-coordinator.d.ts +75 -0
  94. package/dist/core/delegation/worker-agent-control-coordinator.d.ts.map +1 -0
  95. package/dist/core/delegation/worker-agent-control-coordinator.js +218 -0
  96. package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -0
  97. package/dist/core/delegation/worker-agent-control.d.ts +66 -0
  98. package/dist/core/delegation/worker-agent-control.d.ts.map +1 -0
  99. package/dist/core/delegation/worker-agent-control.js +163 -0
  100. package/dist/core/delegation/worker-agent-control.js.map +1 -0
  101. package/dist/core/delegation/worker-attempt-executor.d.ts +80 -0
  102. package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -0
  103. package/dist/core/delegation/worker-attempt-executor.js +343 -0
  104. package/dist/core/delegation/worker-attempt-executor.js.map +1 -0
  105. package/dist/core/delegation/worker-claim.d.ts +30 -0
  106. package/dist/core/delegation/worker-claim.d.ts.map +1 -1
  107. package/dist/core/delegation/worker-claim.js +205 -53
  108. package/dist/core/delegation/worker-claim.js.map +1 -1
  109. package/dist/core/delegation/worker-conversation-store.d.ts +116 -0
  110. package/dist/core/delegation/worker-conversation-store.d.ts.map +1 -0
  111. package/dist/core/delegation/worker-conversation-store.js +442 -0
  112. package/dist/core/delegation/worker-conversation-store.js.map +1 -0
  113. package/dist/core/delegation/worker-delegation-controller.d.ts +21 -5
  114. package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
  115. package/dist/core/delegation/worker-delegation-controller.js +386 -251
  116. package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
  117. package/dist/core/delegation/worker-delegation-request.d.ts +14 -0
  118. package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -1
  119. package/dist/core/delegation/worker-delegation-request.js.map +1 -1
  120. package/dist/core/delegation/worker-dispatch-scheduler.d.ts +4 -2
  121. package/dist/core/delegation/worker-dispatch-scheduler.d.ts.map +1 -1
  122. package/dist/core/delegation/worker-dispatch-scheduler.js +16 -6
  123. package/dist/core/delegation/worker-dispatch-scheduler.js.map +1 -1
  124. package/dist/core/delegation/worker-execution-policy.d.ts +2 -1
  125. package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
  126. package/dist/core/delegation/worker-execution-policy.js +5 -7
  127. package/dist/core/delegation/worker-execution-policy.js.map +1 -1
  128. package/dist/core/delegation/worker-lifecycle.d.ts +44 -1
  129. package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -1
  130. package/dist/core/delegation/worker-lifecycle.js +120 -0
  131. package/dist/core/delegation/worker-lifecycle.js.map +1 -1
  132. package/dist/core/delegation/worker-process-owner.d.ts +18 -0
  133. package/dist/core/delegation/worker-process-owner.d.ts.map +1 -0
  134. package/dist/core/delegation/worker-process-owner.js +54 -0
  135. package/dist/core/delegation/worker-process-owner.js.map +1 -0
  136. package/dist/core/delegation/worker-profile-resolver.d.ts +5 -1
  137. package/dist/core/delegation/worker-profile-resolver.d.ts.map +1 -1
  138. package/dist/core/delegation/worker-profile-resolver.js +8 -0
  139. package/dist/core/delegation/worker-profile-resolver.js.map +1 -1
  140. package/dist/core/delegation/worker-recovery-coordinator.d.ts +54 -0
  141. package/dist/core/delegation/worker-recovery-coordinator.d.ts.map +1 -0
  142. package/dist/core/delegation/worker-recovery-coordinator.js +181 -0
  143. package/dist/core/delegation/worker-recovery-coordinator.js.map +1 -0
  144. package/dist/core/delegation/worker-resource-catalog.d.ts +32 -0
  145. package/dist/core/delegation/worker-resource-catalog.d.ts.map +1 -0
  146. package/dist/core/delegation/worker-resource-catalog.js +116 -0
  147. package/dist/core/delegation/worker-resource-catalog.js.map +1 -0
  148. package/dist/core/delegation/worker-resource-materializer.d.ts +47 -0
  149. package/dist/core/delegation/worker-resource-materializer.d.ts.map +1 -0
  150. package/dist/core/delegation/worker-resource-materializer.js +137 -0
  151. package/dist/core/delegation/worker-resource-materializer.js.map +1 -0
  152. package/dist/core/delegation/worker-runner.d.ts +3 -1
  153. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  154. package/dist/core/delegation/worker-runner.js +189 -54
  155. package/dist/core/delegation/worker-runner.js.map +1 -1
  156. package/dist/core/delegation/worker-terminal-finalizer.d.ts +23 -0
  157. package/dist/core/delegation/worker-terminal-finalizer.d.ts.map +1 -0
  158. package/dist/core/delegation/worker-terminal-finalizer.js +12 -0
  159. package/dist/core/delegation/worker-terminal-finalizer.js.map +1 -0
  160. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts +38 -0
  161. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts.map +1 -0
  162. package/dist/core/delegation/worker-write-reservation-coordinator.js +107 -0
  163. package/dist/core/delegation/worker-write-reservation-coordinator.js.map +1 -0
  164. package/dist/core/delegation/worker-write-reservation.d.ts +90 -0
  165. package/dist/core/delegation/worker-write-reservation.d.ts.map +1 -0
  166. package/dist/core/delegation/worker-write-reservation.js +348 -0
  167. package/dist/core/delegation/worker-write-reservation.js.map +1 -0
  168. package/dist/core/extension-import-authority.d.ts +6 -0
  169. package/dist/core/extension-import-authority.d.ts.map +1 -0
  170. package/dist/core/extension-import-authority.js +10 -0
  171. package/dist/core/extension-import-authority.js.map +1 -0
  172. package/dist/core/extensions/loader.d.ts.map +1 -1
  173. package/dist/core/extensions/loader.js +2 -3
  174. package/dist/core/extensions/loader.js.map +1 -1
  175. package/dist/core/extensions/runner.d.ts +3 -0
  176. package/dist/core/extensions/runner.d.ts.map +1 -1
  177. package/dist/core/extensions/runner.js +14 -5
  178. package/dist/core/extensions/runner.js.map +1 -1
  179. package/dist/core/extensions/stale-context.d.ts +2 -0
  180. package/dist/core/extensions/stale-context.d.ts.map +1 -0
  181. package/dist/core/extensions/stale-context.js +2 -0
  182. package/dist/core/extensions/stale-context.js.map +1 -0
  183. package/dist/core/extensions/types.d.ts +8 -0
  184. package/dist/core/extensions/types.d.ts.map +1 -1
  185. package/dist/core/extensions/types.js.map +1 -1
  186. package/dist/core/foreground-recovery-controller.d.ts +1 -0
  187. package/dist/core/foreground-recovery-controller.d.ts.map +1 -1
  188. package/dist/core/foreground-recovery-controller.js +13 -13
  189. package/dist/core/foreground-recovery-controller.js.map +1 -1
  190. package/dist/core/goal-loop-controller.d.ts +14 -9
  191. package/dist/core/goal-loop-controller.d.ts.map +1 -1
  192. package/dist/core/goal-loop-controller.js +47 -75
  193. package/dist/core/goal-loop-controller.js.map +1 -1
  194. package/dist/core/goals/compact-goal-context.d.ts +11 -0
  195. package/dist/core/goals/compact-goal-context.d.ts.map +1 -0
  196. package/dist/core/goals/compact-goal-context.js +59 -0
  197. package/dist/core/goals/compact-goal-context.js.map +1 -0
  198. package/dist/core/goals/goal-acceptance.d.ts.map +1 -1
  199. package/dist/core/goals/goal-acceptance.js +2 -0
  200. package/dist/core/goals/goal-acceptance.js.map +1 -1
  201. package/dist/core/goals/goal-auto-continue-controller.d.ts +2 -1
  202. package/dist/core/goals/goal-auto-continue-controller.d.ts.map +1 -1
  203. package/dist/core/goals/goal-auto-continue-controller.js +5 -8
  204. package/dist/core/goals/goal-auto-continue-controller.js.map +1 -1
  205. package/dist/core/goals/goal-continuation-controller.d.ts +2 -2
  206. package/dist/core/goals/goal-continuation-controller.d.ts.map +1 -1
  207. package/dist/core/goals/goal-continuation-controller.js +42 -11
  208. package/dist/core/goals/goal-continuation-controller.js.map +1 -1
  209. package/dist/core/goals/goal-continuation-defaults.d.ts +4 -29
  210. package/dist/core/goals/goal-continuation-defaults.d.ts.map +1 -1
  211. package/dist/core/goals/goal-continuation-defaults.js +4 -32
  212. package/dist/core/goals/goal-continuation-defaults.js.map +1 -1
  213. package/dist/core/goals/goal-continuation-prompt.d.ts +8 -18
  214. package/dist/core/goals/goal-continuation-prompt.d.ts.map +1 -1
  215. package/dist/core/goals/goal-continuation-prompt.js +9 -179
  216. package/dist/core/goals/goal-continuation-prompt.js.map +1 -1
  217. package/dist/core/goals/goal-lifecycle.d.ts +35 -12
  218. package/dist/core/goals/goal-lifecycle.d.ts.map +1 -1
  219. package/dist/core/goals/goal-lifecycle.js +98 -13
  220. package/dist/core/goals/goal-lifecycle.js.map +1 -1
  221. package/dist/core/goals/goal-record.d.ts +17 -0
  222. package/dist/core/goals/goal-record.d.ts.map +1 -0
  223. package/dist/core/goals/goal-record.js +31 -0
  224. package/dist/core/goals/goal-record.js.map +1 -0
  225. package/dist/core/goals/goal-session-controller.d.ts +42 -0
  226. package/dist/core/goals/goal-session-controller.d.ts.map +1 -0
  227. package/dist/core/goals/goal-session-controller.js +128 -0
  228. package/dist/core/goals/goal-session-controller.js.map +1 -0
  229. package/dist/core/goals/goal-state.d.ts +45 -25
  230. package/dist/core/goals/goal-state.d.ts.map +1 -1
  231. package/dist/core/goals/goal-state.js +85 -15
  232. package/dist/core/goals/goal-state.js.map +1 -1
  233. package/dist/core/goals/goal-tool-core.d.ts +1 -4
  234. package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
  235. package/dist/core/goals/goal-tool-core.js +49 -34
  236. package/dist/core/goals/goal-tool-core.js.map +1 -1
  237. package/dist/core/goals/session-goal-state.d.ts +18 -8
  238. package/dist/core/goals/session-goal-state.d.ts.map +1 -1
  239. package/dist/core/goals/session-goal-state.js +134 -11
  240. package/dist/core/goals/session-goal-state.js.map +1 -1
  241. package/dist/core/human-input-controller.d.ts +47 -0
  242. package/dist/core/human-input-controller.d.ts.map +1 -0
  243. package/dist/core/human-input-controller.js +181 -0
  244. package/dist/core/human-input-controller.js.map +1 -0
  245. package/dist/core/local-runtime-controller.d.ts +1 -1
  246. package/dist/core/local-runtime-controller.d.ts.map +1 -1
  247. package/dist/core/local-runtime-controller.js.map +1 -1
  248. package/dist/core/model-capability.d.ts +0 -19
  249. package/dist/core/model-capability.d.ts.map +1 -1
  250. package/dist/core/model-capability.js +0 -19
  251. package/dist/core/model-capability.js.map +1 -1
  252. package/dist/core/model-registry.d.ts +6 -1
  253. package/dist/core/model-registry.d.ts.map +1 -1
  254. package/dist/core/model-registry.js +13 -5
  255. package/dist/core/model-registry.js.map +1 -1
  256. package/dist/core/model-resolver.d.ts +16 -1
  257. package/dist/core/model-resolver.d.ts.map +1 -1
  258. package/dist/core/model-resolver.js +32 -16
  259. package/dist/core/model-resolver.js.map +1 -1
  260. package/dist/core/model-router-controller.d.ts +1 -1
  261. package/dist/core/model-router-controller.d.ts.map +1 -1
  262. package/dist/core/model-router-controller.js.map +1 -1
  263. package/dist/core/model-selection-controller.d.ts +1 -1
  264. package/dist/core/model-selection-controller.d.ts.map +1 -1
  265. package/dist/core/model-selection-controller.js.map +1 -1
  266. package/dist/core/models/model-endpoint.d.ts +3 -0
  267. package/dist/core/models/model-endpoint.d.ts.map +1 -0
  268. package/dist/core/models/model-endpoint.js +11 -0
  269. package/dist/core/models/model-endpoint.js.map +1 -0
  270. package/dist/core/orchestration/agent-resume.d.ts +2 -0
  271. package/dist/core/orchestration/agent-resume.d.ts.map +1 -1
  272. package/dist/core/orchestration/agent-resume.js +7 -0
  273. package/dist/core/orchestration/agent-resume.js.map +1 -1
  274. package/dist/core/orchestration/attempt-usage.d.ts +28 -0
  275. package/dist/core/orchestration/attempt-usage.d.ts.map +1 -0
  276. package/dist/core/orchestration/attempt-usage.js +168 -0
  277. package/dist/core/orchestration/attempt-usage.js.map +1 -0
  278. package/dist/core/orchestration/capability-gateway.d.ts +19 -1
  279. package/dist/core/orchestration/capability-gateway.d.ts.map +1 -1
  280. package/dist/core/orchestration/capability-gateway.js +128 -28
  281. package/dist/core/orchestration/capability-gateway.js.map +1 -1
  282. package/dist/core/orchestration/contracts.d.ts +35 -0
  283. package/dist/core/orchestration/contracts.d.ts.map +1 -1
  284. package/dist/core/orchestration/contracts.js +17 -0
  285. package/dist/core/orchestration/contracts.js.map +1 -1
  286. package/dist/core/orchestration/delegation-ledger.d.ts +17 -2
  287. package/dist/core/orchestration/delegation-ledger.d.ts.map +1 -1
  288. package/dist/core/orchestration/delegation-ledger.js +81 -3
  289. package/dist/core/orchestration/delegation-ledger.js.map +1 -1
  290. package/dist/core/orchestration/event-store.d.ts +1 -0
  291. package/dist/core/orchestration/event-store.d.ts.map +1 -1
  292. package/dist/core/orchestration/event-store.js +78 -38
  293. package/dist/core/orchestration/event-store.js.map +1 -1
  294. package/dist/core/orchestration/profile-registry.d.ts.map +1 -1
  295. package/dist/core/orchestration/profile-registry.js +81 -41
  296. package/dist/core/orchestration/profile-registry.js.map +1 -1
  297. package/dist/core/orchestration/profile-store.d.ts.map +1 -1
  298. package/dist/core/orchestration/profile-store.js +18 -4
  299. package/dist/core/orchestration/profile-store.js.map +1 -1
  300. package/dist/core/orchestration/risk-budget.d.ts +2 -0
  301. package/dist/core/orchestration/risk-budget.d.ts.map +1 -1
  302. package/dist/core/orchestration/risk-budget.js +26 -0
  303. package/dist/core/orchestration/risk-budget.js.map +1 -1
  304. package/dist/core/orchestration/task-runtime.d.ts +13 -1
  305. package/dist/core/orchestration/task-runtime.d.ts.map +1 -1
  306. package/dist/core/orchestration/task-runtime.js +127 -16
  307. package/dist/core/orchestration/task-runtime.js.map +1 -1
  308. package/dist/core/orchestration/work-state-projection.d.ts.map +1 -1
  309. package/dist/core/orchestration/work-state-projection.js +1 -1
  310. package/dist/core/orchestration/work-state-projection.js.map +1 -1
  311. package/dist/core/orchestration/worker-execution-contract.d.ts +3 -1
  312. package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -1
  313. package/dist/core/orchestration/worker-execution-contract.js +75 -23
  314. package/dist/core/orchestration/worker-execution-contract.js.map +1 -1
  315. package/dist/core/orchestration/worker-result-adapter.d.ts +9 -3
  316. package/dist/core/orchestration/worker-result-adapter.d.ts.map +1 -1
  317. package/dist/core/orchestration/worker-result-adapter.js +167 -14
  318. package/dist/core/orchestration/worker-result-adapter.js.map +1 -1
  319. package/dist/core/package-manager.d.ts.map +1 -1
  320. package/dist/core/package-manager.js +20 -3
  321. package/dist/core/package-manager.js.map +1 -1
  322. package/dist/core/profile-filter-controller.d.ts +8 -1
  323. package/dist/core/profile-filter-controller.d.ts.map +1 -1
  324. package/dist/core/profile-filter-controller.js +23 -5
  325. package/dist/core/profile-filter-controller.js.map +1 -1
  326. package/dist/core/prompt-templates.d.ts +1 -0
  327. package/dist/core/prompt-templates.d.ts.map +1 -1
  328. package/dist/core/prompt-templates.js +18 -29
  329. package/dist/core/prompt-templates.js.map +1 -1
  330. package/dist/core/reflection-controller.d.ts +2 -2
  331. package/dist/core/reflection-controller.d.ts.map +1 -1
  332. package/dist/core/reflection-controller.js +92 -54
  333. package/dist/core/reflection-controller.js.map +1 -1
  334. package/dist/core/request-auth.d.ts +7 -0
  335. package/dist/core/request-auth.d.ts.map +1 -0
  336. package/dist/core/request-auth.js +8 -0
  337. package/dist/core/request-auth.js.map +1 -0
  338. package/dist/core/research/evidence-bundle.d.ts +20 -0
  339. package/dist/core/research/evidence-bundle.d.ts.map +1 -1
  340. package/dist/core/research/evidence-bundle.js +173 -69
  341. package/dist/core/research/evidence-bundle.js.map +1 -1
  342. package/dist/core/resource-loader.d.ts.map +1 -1
  343. package/dist/core/resource-loader.js +16 -6
  344. package/dist/core/resource-loader.js.map +1 -1
  345. package/dist/core/risk-classifier.d.ts.map +1 -1
  346. package/dist/core/risk-classifier.js +8 -0
  347. package/dist/core/risk-classifier.js.map +1 -1
  348. package/dist/core/runtime-builder.d.ts +22 -3
  349. package/dist/core/runtime-builder.d.ts.map +1 -1
  350. package/dist/core/runtime-builder.js +147 -80
  351. package/dist/core/runtime-builder.js.map +1 -1
  352. package/dist/core/sdk.d.ts.map +1 -1
  353. package/dist/core/sdk.js +7 -1
  354. package/dist/core/sdk.js.map +1 -1
  355. package/dist/core/secrets/credential-exposure-guard.d.ts +9 -0
  356. package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -0
  357. package/dist/core/secrets/credential-exposure-guard.js +241 -0
  358. package/dist/core/secrets/credential-exposure-guard.js.map +1 -0
  359. package/dist/core/secrets/secret-dotenv.d.ts +27 -0
  360. package/dist/core/secrets/secret-dotenv.d.ts.map +1 -0
  361. package/dist/core/secrets/secret-dotenv.js +183 -0
  362. package/dist/core/secrets/secret-dotenv.js.map +1 -0
  363. package/dist/core/secrets/secret-vault-format.d.ts +112 -0
  364. package/dist/core/secrets/secret-vault-format.d.ts.map +1 -0
  365. package/dist/core/secrets/secret-vault-format.js +397 -0
  366. package/dist/core/secrets/secret-vault-format.js.map +1 -0
  367. package/dist/core/secrets/secret-vault.d.ts +72 -0
  368. package/dist/core/secrets/secret-vault.d.ts.map +1 -0
  369. package/dist/core/secrets/secret-vault.js +671 -0
  370. package/dist/core/secrets/secret-vault.js.map +1 -0
  371. package/dist/core/session-analytics.d.ts +4 -23
  372. package/dist/core/session-analytics.d.ts.map +1 -1
  373. package/dist/core/session-analytics.js +39 -69
  374. package/dist/core/session-analytics.js.map +1 -1
  375. package/dist/core/session-artifact-bundle.d.ts +35 -0
  376. package/dist/core/session-artifact-bundle.d.ts.map +1 -0
  377. package/dist/core/session-artifact-bundle.js +61 -0
  378. package/dist/core/session-artifact-bundle.js.map +1 -0
  379. package/dist/core/session-role.d.ts +5 -0
  380. package/dist/core/session-role.d.ts.map +1 -1
  381. package/dist/core/session-role.js +14 -1
  382. package/dist/core/session-role.js.map +1 -1
  383. package/dist/core/session-tree-navigator.d.ts +4 -6
  384. package/dist/core/session-tree-navigator.d.ts.map +1 -1
  385. package/dist/core/session-tree-navigator.js +4 -1
  386. package/dist/core/session-tree-navigator.js.map +1 -1
  387. package/dist/core/settings-manager.d.ts +1 -1
  388. package/dist/core/settings-manager.d.ts.map +1 -1
  389. package/dist/core/settings-manager.js +1 -1
  390. package/dist/core/settings-manager.js.map +1 -1
  391. package/dist/core/slash-commands.d.ts.map +1 -1
  392. package/dist/core/slash-commands.js +2 -2
  393. package/dist/core/slash-commands.js.map +1 -1
  394. package/dist/core/tool-capability-policy.d.ts.map +1 -1
  395. package/dist/core/tool-capability-policy.js +1 -0
  396. package/dist/core/tool-capability-policy.js.map +1 -1
  397. package/dist/core/tool-gate-controller.d.ts.map +1 -1
  398. package/dist/core/tool-gate-controller.js +8 -2
  399. package/dist/core/tool-gate-controller.js.map +1 -1
  400. package/dist/core/tool-protocol-controller.d.ts +2 -4
  401. package/dist/core/tool-protocol-controller.d.ts.map +1 -1
  402. package/dist/core/tool-protocol-controller.js.map +1 -1
  403. package/dist/core/tool-recovery-stats.d.ts +21 -1
  404. package/dist/core/tool-recovery-stats.d.ts.map +1 -1
  405. package/dist/core/tool-recovery-stats.js.map +1 -1
  406. package/dist/core/tools/bash.d.ts +5 -0
  407. package/dist/core/tools/bash.d.ts.map +1 -1
  408. package/dist/core/tools/bash.js +59 -5
  409. package/dist/core/tools/bash.js.map +1 -1
  410. package/dist/core/tools/delegate-status.d.ts +6 -1
  411. package/dist/core/tools/delegate-status.d.ts.map +1 -1
  412. package/dist/core/tools/delegate-status.js +106 -25
  413. package/dist/core/tools/delegate-status.js.map +1 -1
  414. package/dist/core/tools/delegate.d.ts +9 -1
  415. package/dist/core/tools/delegate.d.ts.map +1 -1
  416. package/dist/core/tools/delegate.js +329 -69
  417. package/dist/core/tools/delegate.js.map +1 -1
  418. package/dist/core/tools/git-filter.d.ts +1 -8
  419. package/dist/core/tools/git-filter.d.ts.map +1 -1
  420. package/dist/core/tools/git-filter.js +2 -63
  421. package/dist/core/tools/git-filter.js.map +1 -1
  422. package/dist/core/tools/goal.d.ts +5 -3
  423. package/dist/core/tools/goal.d.ts.map +1 -1
  424. package/dist/core/tools/goal.js +97 -19
  425. package/dist/core/tools/goal.js.map +1 -1
  426. package/dist/core/tools/index.d.ts +1 -0
  427. package/dist/core/tools/index.d.ts.map +1 -1
  428. package/dist/core/tools/index.js +1 -0
  429. package/dist/core/tools/index.js.map +1 -1
  430. package/dist/core/tools/orchestration-panel.d.ts +1 -4
  431. package/dist/core/tools/orchestration-panel.d.ts.map +1 -1
  432. package/dist/core/tools/orchestration-panel.js +0 -44
  433. package/dist/core/tools/orchestration-panel.js.map +1 -1
  434. package/dist/core/tools/output-accumulator.d.ts +11 -0
  435. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  436. package/dist/core/tools/output-accumulator.js +36 -3
  437. package/dist/core/tools/output-accumulator.js.map +1 -1
  438. package/dist/core/tools/python.d.ts +2 -0
  439. package/dist/core/tools/python.d.ts.map +1 -1
  440. package/dist/core/tools/python.js +3 -1
  441. package/dist/core/tools/python.js.map +1 -1
  442. package/dist/core/tools/read.d.ts.map +1 -1
  443. package/dist/core/tools/read.js +1 -1
  444. package/dist/core/tools/read.js.map +1 -1
  445. package/dist/core/tools/run-process.d.ts +1 -1
  446. package/dist/core/tools/run-process.d.ts.map +1 -1
  447. package/dist/core/tools/run-process.js +69 -9
  448. package/dist/core/tools/run-process.js.map +1 -1
  449. package/dist/core/tools/search-command-guard.d.ts +14 -0
  450. package/dist/core/tools/search-command-guard.d.ts.map +1 -0
  451. package/dist/core/tools/search-command-guard.js +333 -0
  452. package/dist/core/tools/search-command-guard.js.map +1 -0
  453. package/dist/core/tools/secret-store.d.ts +38 -0
  454. package/dist/core/tools/secret-store.d.ts.map +1 -0
  455. package/dist/core/tools/secret-store.js +412 -0
  456. package/dist/core/tools/secret-store.js.map +1 -0
  457. package/dist/core/tools/shell-command-parser.d.ts +16 -0
  458. package/dist/core/tools/shell-command-parser.d.ts.map +1 -0
  459. package/dist/core/tools/shell-command-parser.js +113 -0
  460. package/dist/core/tools/shell-command-parser.js.map +1 -0
  461. package/dist/core/tools/shell-contract-router.d.ts.map +1 -1
  462. package/dist/core/tools/shell-contract-router.js +12 -5
  463. package/dist/core/tools/shell-contract-router.js.map +1 -1
  464. package/dist/core/tools/task-steps.d.ts.map +1 -1
  465. package/dist/core/tools/task-steps.js +4 -7
  466. package/dist/core/tools/task-steps.js.map +1 -1
  467. package/dist/core/util/atomic-file.d.ts +6 -2
  468. package/dist/core/util/atomic-file.d.ts.map +1 -1
  469. package/dist/core/util/atomic-file.js +4 -4
  470. package/dist/core/util/atomic-file.js.map +1 -1
  471. package/dist/core/util/bounded-file.d.ts +15 -0
  472. package/dist/core/util/bounded-file.d.ts.map +1 -0
  473. package/dist/core/util/bounded-file.js +120 -0
  474. package/dist/core/util/bounded-file.js.map +1 -0
  475. package/dist/core/util/bounded-jsonl.d.ts.map +1 -1
  476. package/dist/core/util/bounded-jsonl.js +119 -9
  477. package/dist/core/util/bounded-jsonl.js.map +1 -1
  478. package/dist/core/util/bounded-value.d.ts +3 -0
  479. package/dist/core/util/bounded-value.d.ts.map +1 -0
  480. package/dist/core/util/bounded-value.js +12 -0
  481. package/dist/core/util/bounded-value.js.map +1 -0
  482. package/dist/core/util/value-guards.d.ts +2 -0
  483. package/dist/core/util/value-guards.d.ts.map +1 -1
  484. package/dist/core/util/value-guards.js +5 -0
  485. package/dist/core/util/value-guards.js.map +1 -1
  486. package/dist/index.d.ts +3 -2
  487. package/dist/index.d.ts.map +1 -1
  488. package/dist/index.js +2 -1
  489. package/dist/index.js.map +1 -1
  490. package/dist/main.d.ts.map +1 -1
  491. package/dist/main.js +25 -11
  492. package/dist/main.js.map +1 -1
  493. package/dist/modes/interactive/auth-dialogs-controller.d.ts +4 -0
  494. package/dist/modes/interactive/auth-dialogs-controller.d.ts.map +1 -1
  495. package/dist/modes/interactive/auth-dialogs-controller.js +60 -1
  496. package/dist/modes/interactive/auth-dialogs-controller.js.map +1 -1
  497. package/dist/modes/interactive/components/activity-lane.d.ts +55 -0
  498. package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -0
  499. package/dist/modes/interactive/components/activity-lane.js +304 -0
  500. package/dist/modes/interactive/components/activity-lane.js.map +1 -0
  501. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  502. package/dist/modes/interactive/components/assistant-message.js +19 -10
  503. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  504. package/dist/modes/interactive/components/expandable-text.d.ts +12 -0
  505. package/dist/modes/interactive/components/expandable-text.d.ts.map +1 -0
  506. package/dist/modes/interactive/components/expandable-text.js +17 -0
  507. package/dist/modes/interactive/components/expandable-text.js.map +1 -0
  508. package/dist/modes/interactive/components/extension-editor.d.ts +15 -1
  509. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  510. package/dist/modes/interactive/components/extension-editor.js +30 -21
  511. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  512. package/dist/modes/interactive/components/extension-input.d.ts +1 -0
  513. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  514. package/dist/modes/interactive/components/extension-input.js +6 -1
  515. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  516. package/dist/modes/interactive/components/scoped-models-selector.d.ts +2 -2
  517. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  518. package/dist/modes/interactive/components/scoped-models-selector.js +23 -14
  519. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  520. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  521. package/dist/modes/interactive/components/session-selector.js +27 -44
  522. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  523. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  524. package/dist/modes/interactive/components/settings-selector.js +4 -4
  525. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  526. package/dist/modes/interactive/components/tool-execution.d.ts +19 -11
  527. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  528. package/dist/modes/interactive/components/tool-execution.js +53 -20
  529. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  530. package/dist/modes/interactive/components/tool-group.d.ts.map +1 -1
  531. package/dist/modes/interactive/components/tool-group.js +3 -0
  532. package/dist/modes/interactive/components/tool-group.js.map +1 -1
  533. package/dist/modes/interactive/components/usage-action-selector.d.ts +16 -0
  534. package/dist/modes/interactive/components/usage-action-selector.d.ts.map +1 -0
  535. package/dist/modes/interactive/components/usage-action-selector.js +46 -0
  536. package/dist/modes/interactive/components/usage-action-selector.js.map +1 -0
  537. package/dist/modes/interactive/extension-ui-host.d.ts.map +1 -1
  538. package/dist/modes/interactive/extension-ui-host.js +1 -0
  539. package/dist/modes/interactive/extension-ui-host.js.map +1 -1
  540. package/dist/modes/interactive/external-editor.d.ts +15 -0
  541. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  542. package/dist/modes/interactive/external-editor.js +27 -19
  543. package/dist/modes/interactive/external-editor.js.map +1 -1
  544. package/dist/modes/interactive/history-reload-math.d.ts +6 -2
  545. package/dist/modes/interactive/history-reload-math.d.ts.map +1 -1
  546. package/dist/modes/interactive/history-reload-math.js +10 -5
  547. package/dist/modes/interactive/history-reload-math.js.map +1 -1
  548. package/dist/modes/interactive/interactive-event-controller.d.ts +74 -0
  549. package/dist/modes/interactive/interactive-event-controller.d.ts.map +1 -0
  550. package/dist/modes/interactive/interactive-event-controller.js +328 -0
  551. package/dist/modes/interactive/interactive-event-controller.js.map +1 -0
  552. package/dist/modes/interactive/interactive-mode.d.ts +20 -25
  553. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  554. package/dist/modes/interactive/interactive-mode.js +196 -608
  555. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  556. package/dist/modes/interactive/loaded-resources-view.d.ts +20 -0
  557. package/dist/modes/interactive/loaded-resources-view.d.ts.map +1 -0
  558. package/dist/modes/interactive/loaded-resources-view.js +147 -0
  559. package/dist/modes/interactive/loaded-resources-view.js.map +1 -0
  560. package/dist/modes/interactive/resource-display.d.ts.map +1 -1
  561. package/dist/modes/interactive/resource-display.js +8 -2
  562. package/dist/modes/interactive/resource-display.js.map +1 -1
  563. package/dist/modes/interactive/resource-shell-commands.d.ts +1 -5
  564. package/dist/modes/interactive/resource-shell-commands.d.ts.map +1 -1
  565. package/dist/modes/interactive/resource-shell-commands.js +0 -5
  566. package/dist/modes/interactive/resource-shell-commands.js.map +1 -1
  567. package/dist/modes/interactive/session-flow-commands.d.ts +10 -6
  568. package/dist/modes/interactive/session-flow-commands.d.ts.map +1 -1
  569. package/dist/modes/interactive/session-flow-commands.js +123 -70
  570. package/dist/modes/interactive/session-flow-commands.js.map +1 -1
  571. package/dist/modes/interactive/usage-commands.d.ts +34 -0
  572. package/dist/modes/interactive/usage-commands.d.ts.map +1 -0
  573. package/dist/modes/interactive/usage-commands.js +225 -0
  574. package/dist/modes/interactive/usage-commands.js.map +1 -0
  575. package/dist/utils/shell.d.ts.map +1 -1
  576. package/dist/utils/shell.js +5 -3
  577. package/dist/utils/shell.js.map +1 -1
  578. package/dist/utils/version-check.d.ts.map +1 -1
  579. package/dist/utils/version-check.js +3 -1
  580. package/dist/utils/version-check.js.map +1 -1
  581. package/docs/UI_POLISH_ORCHESTRATION.md +25 -31
  582. package/docs/UI_QUALITY_ORCHESTRATION.md +22 -24
  583. package/docs/providers.md +9 -1
  584. package/docs/tool-repair.md +3 -0
  585. package/docs/ui-reference/README.md +6 -6
  586. package/docs/ui-reference/orchestration-after.txt +14 -7
  587. package/docs/ui-reference/orchestration-before.txt +12 -6
  588. package/docs/ui-reference/orchestration-reference.txt +15 -5
  589. package/docs/usage.md +9 -1
  590. package/docs/windows.md +4 -2
  591. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  592. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  593. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  594. package/examples/extensions/sandbox/package-lock.json +2 -2
  595. package/examples/extensions/sandbox/package.json +1 -1
  596. package/examples/extensions/with-deps/package-lock.json +2 -2
  597. package/examples/extensions/with-deps/package.json +1 -1
  598. package/npm-shrinkwrap.json +13 -13
  599. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"work-state-projection.d.ts","sourceRoot":"","sources":["../../../src/core/orchestration/work-state-projection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EACN,KAAK,sBAAsB,EAG3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAErF,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,8BAA8B;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,0BAA0B;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACjD,YAAY,EAAE,SAAS,8BAA8B,EAAE,CAAC;IACxD,uBAAuB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,uBAAuB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,uBAAuB,CAa7E;AAkBD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,SAAS,GAAG,gBAAgB,EAAE,CAiBjF;AAwBD,2GAA2G;AAC3G,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC7C,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;IACjC,cAAc,EAAE,cAAc,GAAG,SAAS,CAAC;IAC3C,WAAW,CAAC,EAAE,qBAAqB,CAAC;CACpC,GAAG,0BAA0B,CAyC7B","sourcesContent":["import { getTrustedRequirementEvidence } from \"../goals/goal-acceptance.ts\";\nimport type { GoalState } from \"../goals/goal-state.ts\";\nimport {\n\ttype OpenTaskStepProjection,\n\tprojectOpenTaskSteps,\n\tresolveTaskStepRequirementIds,\n} from \"../tasks/task-projection.ts\";\nimport type { TaskStepsState } from \"../tasks/task-state.ts\";\nimport type { AcceptanceCriterion, EvidenceContract } from \"./contracts.ts\";\nimport type { CreateObjectiveInput, TaskRuntimeProjection } from \"./task-runtime.ts\";\n\nexport interface GoalObjectiveProjection extends CreateObjectiveInput {\n\tobjectiveId: string;\n\tacceptanceCriteria: readonly AcceptanceCriterion[];\n}\n\nexport interface RequirementExecutionProjection {\n\trequirementId: string;\n\tforegroundStepIds: readonly string[];\n\tdelegatedTaskIds: readonly string[];\n}\n\nexport interface SessionWorkStateProjection {\n\tobjectiveId?: string;\n\topenTaskSteps: readonly OpenTaskStepProjection[];\n\trequirements: readonly RequirementExecutionProjection[];\n\tunlinkedOpenTaskStepIds: readonly string[];\n\tunknownRequirementIds: readonly string[];\n\tunboundDelegatedTaskIds: readonly string[];\n}\n\nexport function goalObjectiveId(goalId: string): string {\n\treturn `goal:${goalId}`;\n}\n\nexport function projectGoalObjective(goal: GoalState): GoalObjectiveProjection {\n\treturn {\n\t\tobjectiveId: goalObjectiveId(goal.goalId),\n\t\ttitle: `Goal ${goal.goalId}`,\n\t\tdescription: goal.userGoal,\n\t\tconstraints: [],\n\t\tacceptanceCriteria: goal.requirements.map((requirement) => ({\n\t\t\tid: requirement.id,\n\t\t\tdescription: requirement.text,\n\t\t\trequired: true,\n\t\t})),\n\t\triskBudget: {},\n\t};\n}\n\nfunction orchestrationEvidenceKind(kind: GoalState[\"evidence\"][number][\"kind\"]): EvidenceContract[\"kind\"] {\n\tswitch (kind) {\n\t\tcase \"test\":\n\t\t\treturn \"test\";\n\t\tcase \"tool\":\n\t\t\treturn \"command\";\n\t\tcase \"worker\":\n\t\t\treturn \"review\";\n\t\tcase \"user\":\n\t\t\treturn \"external\";\n\t\tcase \"file\":\n\t\tcase \"finding\":\n\t\t\treturn \"observation\";\n\t}\n}\n\nexport function projectGoalAcceptanceEvidence(goal: GoalState): EvidenceContract[] {\n\treturn goal.requirements.flatMap((requirement) =>\n\t\tgetTrustedRequirementEvidence(goal, requirement).map((evidence) => ({\n\t\t\tevidenceId: `goal-evidence:${goal.goalId}:${requirement.id}:${evidence.id}`,\n\t\t\tcriterionId: requirement.id,\n\t\t\tkind: orchestrationEvidenceKind(evidence.kind),\n\t\t\tsummary: evidence.summary,\n\t\t\tartifactIds: [],\n\t\t\ttrusted: true,\n\t\t\tcreatedAt: evidence.createdAt,\n\t\t\tmetadata: {\n\t\t\t\tsourceGoalEvidenceId: evidence.id,\n\t\t\t\tsourceKind: evidence.kind,\n\t\t\t\t...(evidence.uri ? { uri: evidence.uri } : {}),\n\t\t\t},\n\t\t})),\n\t);\n}\n\nfunction collectRelatedDelegatedTaskIds(\n\truntime: TaskRuntimeProjection | undefined,\n\tobjectiveId: string,\n\tboundLaneId: string | undefined,\n): string[] {\n\tif (!runtime || !boundLaneId) return [];\n\tconst direct = runtime.tasks[boundLaneId];\n\tif (!direct || direct.task.objectiveId !== objectiveId) return [];\n\tconst related = new Set([boundLaneId]);\n\tlet changed = true;\n\twhile (changed) {\n\t\tchanged = false;\n\t\tfor (const task of Object.values(runtime.tasks)) {\n\t\t\tif (task.task.objectiveId !== objectiveId || !task.task.verificationOfTaskId) continue;\n\t\t\tif (!related.has(task.task.verificationOfTaskId) || related.has(task.task.taskId)) continue;\n\t\t\trelated.add(task.task.taskId);\n\t\t\tchanged = true;\n\t\t}\n\t}\n\treturn [...related];\n}\n\n/** One read model joining outcome criteria, foreground planning, and delegated execution by stable ids. */\nexport function projectSessionWorkState(args: {\n\tgoalState: GoalState | undefined;\n\ttaskStepsState: TaskStepsState | undefined;\n\ttaskRuntime?: TaskRuntimeProjection;\n}): SessionWorkStateProjection {\n\tconst openTaskSteps = projectOpenTaskSteps(args.taskStepsState);\n\tconst goal = args.goalState;\n\tif (!goal) {\n\t\treturn {\n\t\t\topenTaskSteps,\n\t\t\trequirements: [],\n\t\t\tunlinkedOpenTaskStepIds: openTaskSteps.map((step) => step.id),\n\t\t\tunknownRequirementIds: [...new Set(openTaskSteps.flatMap((step) => step.requirementIds ?? []))],\n\t\t\tunboundDelegatedTaskIds: [],\n\t\t};\n\t}\n\n\tconst objectiveId = goalObjectiveId(goal.goalId);\n\tconst foregroundByRequirement = new Map(goal.requirements.map((requirement) => [requirement.id, [] as string[]]));\n\tconst unknownRequirementIds = new Set<string>();\n\tconst unlinkedOpenTaskStepIds: string[] = [];\n\tfor (const step of openTaskSteps) {\n\t\tconst resolved = resolveTaskStepRequirementIds(step, goal.requirements);\n\t\tfor (const unknownId of resolved.unknownIds) unknownRequirementIds.add(unknownId);\n\t\tif (resolved.matchedIds.length === 0) unlinkedOpenTaskStepIds.push(step.id);\n\t\tfor (const requirementId of resolved.matchedIds) foregroundByRequirement.get(requirementId)?.push(step.id);\n\t}\n\n\tconst requirements = goal.requirements.map((requirement) => ({\n\t\trequirementId: requirement.id,\n\t\tforegroundStepIds: foregroundByRequirement.get(requirement.id) ?? [],\n\t\tdelegatedTaskIds: collectRelatedDelegatedTaskIds(args.taskRuntime, objectiveId, requirement.boundLaneId),\n\t}));\n\tconst linkedDelegatedTaskIds = new Set(requirements.flatMap((requirement) => requirement.delegatedTaskIds));\n\tconst unboundDelegatedTaskIds = Object.values(args.taskRuntime?.tasks ?? {})\n\t\t.filter((task) => task.task.objectiveId === objectiveId && !linkedDelegatedTaskIds.has(task.task.taskId))\n\t\t.map((task) => task.task.taskId);\n\treturn {\n\t\tobjectiveId,\n\t\topenTaskSteps,\n\t\trequirements,\n\t\tunlinkedOpenTaskStepIds,\n\t\tunknownRequirementIds: [...unknownRequirementIds],\n\t\tunboundDelegatedTaskIds,\n\t};\n}\n"]}
1
+ {"version":3,"file":"work-state-projection.d.ts","sourceRoot":"","sources":["../../../src/core/orchestration/work-state-projection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EACN,KAAK,sBAAsB,EAG3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAErF,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,8BAA8B;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,0BAA0B;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACjD,YAAY,EAAE,SAAS,8BAA8B,EAAE,CAAC;IACxD,uBAAuB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,uBAAuB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,uBAAuB,CAa7E;AAkBD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,SAAS,GAAG,gBAAgB,EAAE,CAiBjF;AAwBD,2GAA2G;AAC3G,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC7C,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;IACjC,cAAc,EAAE,cAAc,GAAG,SAAS,CAAC;IAC3C,WAAW,CAAC,EAAE,qBAAqB,CAAC;CACpC,GAAG,0BAA0B,CAyC7B","sourcesContent":["import { getTrustedRequirementEvidence } from \"../goals/goal-acceptance.ts\";\nimport type { GoalState } from \"../goals/goal-state.ts\";\nimport {\n\ttype OpenTaskStepProjection,\n\tprojectOpenTaskSteps,\n\tresolveTaskStepRequirementIds,\n} from \"../tasks/task-projection.ts\";\nimport type { TaskStepsState } from \"../tasks/task-state.ts\";\nimport type { AcceptanceCriterion, EvidenceContract } from \"./contracts.ts\";\nimport type { CreateObjectiveInput, TaskRuntimeProjection } from \"./task-runtime.ts\";\n\nexport interface GoalObjectiveProjection extends CreateObjectiveInput {\n\tobjectiveId: string;\n\tacceptanceCriteria: readonly AcceptanceCriterion[];\n}\n\nexport interface RequirementExecutionProjection {\n\trequirementId: string;\n\tforegroundStepIds: readonly string[];\n\tdelegatedTaskIds: readonly string[];\n}\n\nexport interface SessionWorkStateProjection {\n\tobjectiveId?: string;\n\topenTaskSteps: readonly OpenTaskStepProjection[];\n\trequirements: readonly RequirementExecutionProjection[];\n\tunlinkedOpenTaskStepIds: readonly string[];\n\tunknownRequirementIds: readonly string[];\n\tunboundDelegatedTaskIds: readonly string[];\n}\n\nexport function goalObjectiveId(goalId: string): string {\n\treturn `goal:${goalId}`;\n}\n\nexport function projectGoalObjective(goal: GoalState): GoalObjectiveProjection {\n\treturn {\n\t\tobjectiveId: goalObjectiveId(goal.goalId),\n\t\ttitle: `Goal ${goal.goalId}`,\n\t\tdescription: goal.userGoal,\n\t\tconstraints: [],\n\t\tacceptanceCriteria: goal.requirements.map((requirement) => ({\n\t\t\tid: requirement.id,\n\t\t\tdescription: requirement.text,\n\t\t\trequired: true,\n\t\t})),\n\t\triskBudget: goal.tokenBudget !== undefined ? { maxTokens: goal.tokenBudget } : {},\n\t};\n}\n\nfunction orchestrationEvidenceKind(kind: GoalState[\"evidence\"][number][\"kind\"]): EvidenceContract[\"kind\"] {\n\tswitch (kind) {\n\t\tcase \"test\":\n\t\t\treturn \"test\";\n\t\tcase \"tool\":\n\t\t\treturn \"command\";\n\t\tcase \"worker\":\n\t\t\treturn \"review\";\n\t\tcase \"user\":\n\t\t\treturn \"external\";\n\t\tcase \"file\":\n\t\tcase \"finding\":\n\t\t\treturn \"observation\";\n\t}\n}\n\nexport function projectGoalAcceptanceEvidence(goal: GoalState): EvidenceContract[] {\n\treturn goal.requirements.flatMap((requirement) =>\n\t\tgetTrustedRequirementEvidence(goal, requirement).map((evidence) => ({\n\t\t\tevidenceId: `goal-evidence:${goal.goalId}:${requirement.id}:${evidence.id}`,\n\t\t\tcriterionId: requirement.id,\n\t\t\tkind: orchestrationEvidenceKind(evidence.kind),\n\t\t\tsummary: evidence.summary,\n\t\t\tartifactIds: [],\n\t\t\ttrusted: true,\n\t\t\tcreatedAt: evidence.createdAt,\n\t\t\tmetadata: {\n\t\t\t\tsourceGoalEvidenceId: evidence.id,\n\t\t\t\tsourceKind: evidence.kind,\n\t\t\t\t...(evidence.uri ? { uri: evidence.uri } : {}),\n\t\t\t},\n\t\t})),\n\t);\n}\n\nfunction collectRelatedDelegatedTaskIds(\n\truntime: TaskRuntimeProjection | undefined,\n\tobjectiveId: string,\n\tboundLaneId: string | undefined,\n): string[] {\n\tif (!runtime || !boundLaneId) return [];\n\tconst direct = runtime.tasks[boundLaneId];\n\tif (!direct || direct.task.objectiveId !== objectiveId) return [];\n\tconst related = new Set([boundLaneId]);\n\tlet changed = true;\n\twhile (changed) {\n\t\tchanged = false;\n\t\tfor (const task of Object.values(runtime.tasks)) {\n\t\t\tif (task.task.objectiveId !== objectiveId || !task.task.verificationOfTaskId) continue;\n\t\t\tif (!related.has(task.task.verificationOfTaskId) || related.has(task.task.taskId)) continue;\n\t\t\trelated.add(task.task.taskId);\n\t\t\tchanged = true;\n\t\t}\n\t}\n\treturn [...related];\n}\n\n/** One read model joining outcome criteria, foreground planning, and delegated execution by stable ids. */\nexport function projectSessionWorkState(args: {\n\tgoalState: GoalState | undefined;\n\ttaskStepsState: TaskStepsState | undefined;\n\ttaskRuntime?: TaskRuntimeProjection;\n}): SessionWorkStateProjection {\n\tconst openTaskSteps = projectOpenTaskSteps(args.taskStepsState);\n\tconst goal = args.goalState;\n\tif (!goal) {\n\t\treturn {\n\t\t\topenTaskSteps,\n\t\t\trequirements: [],\n\t\t\tunlinkedOpenTaskStepIds: openTaskSteps.map((step) => step.id),\n\t\t\tunknownRequirementIds: [...new Set(openTaskSteps.flatMap((step) => step.requirementIds ?? []))],\n\t\t\tunboundDelegatedTaskIds: [],\n\t\t};\n\t}\n\n\tconst objectiveId = goalObjectiveId(goal.goalId);\n\tconst foregroundByRequirement = new Map(goal.requirements.map((requirement) => [requirement.id, [] as string[]]));\n\tconst unknownRequirementIds = new Set<string>();\n\tconst unlinkedOpenTaskStepIds: string[] = [];\n\tfor (const step of openTaskSteps) {\n\t\tconst resolved = resolveTaskStepRequirementIds(step, goal.requirements);\n\t\tfor (const unknownId of resolved.unknownIds) unknownRequirementIds.add(unknownId);\n\t\tif (resolved.matchedIds.length === 0) unlinkedOpenTaskStepIds.push(step.id);\n\t\tfor (const requirementId of resolved.matchedIds) foregroundByRequirement.get(requirementId)?.push(step.id);\n\t}\n\n\tconst requirements = goal.requirements.map((requirement) => ({\n\t\trequirementId: requirement.id,\n\t\tforegroundStepIds: foregroundByRequirement.get(requirement.id) ?? [],\n\t\tdelegatedTaskIds: collectRelatedDelegatedTaskIds(args.taskRuntime, objectiveId, requirement.boundLaneId),\n\t}));\n\tconst linkedDelegatedTaskIds = new Set(requirements.flatMap((requirement) => requirement.delegatedTaskIds));\n\tconst unboundDelegatedTaskIds = Object.values(args.taskRuntime?.tasks ?? {})\n\t\t.filter((task) => task.task.objectiveId === objectiveId && !linkedDelegatedTaskIds.has(task.task.taskId))\n\t\t.map((task) => task.task.taskId);\n\treturn {\n\t\tobjectiveId,\n\t\topenTaskSteps,\n\t\trequirements,\n\t\tunlinkedOpenTaskStepIds,\n\t\tunknownRequirementIds: [...unknownRequirementIds],\n\t\tunboundDelegatedTaskIds,\n\t};\n}\n"]}
@@ -14,7 +14,7 @@ export function projectGoalObjective(goal) {
14
14
  description: requirement.text,
15
15
  required: true,
16
16
  })),
17
- riskBudget: {},
17
+ riskBudget: goal.tokenBudget !== undefined ? { maxTokens: goal.tokenBudget } : {},
18
18
  };
19
19
  }
20
20
  function orchestrationEvidenceKind(kind) {
@@ -1 +1 @@
1
- {"version":3,"file":"work-state-projection.js","sourceRoot":"","sources":["../../../src/core/orchestration/work-state-projection.ts"],"names":[],"mappings":"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","sourcesContent":["import { getTrustedRequirementEvidence } from \"../goals/goal-acceptance.ts\";\nimport type { GoalState } from \"../goals/goal-state.ts\";\nimport {\n\ttype OpenTaskStepProjection,\n\tprojectOpenTaskSteps,\n\tresolveTaskStepRequirementIds,\n} from \"../tasks/task-projection.ts\";\nimport type { TaskStepsState } from \"../tasks/task-state.ts\";\nimport type { AcceptanceCriterion, EvidenceContract } from \"./contracts.ts\";\nimport type { CreateObjectiveInput, TaskRuntimeProjection } from \"./task-runtime.ts\";\n\nexport interface GoalObjectiveProjection extends CreateObjectiveInput {\n\tobjectiveId: string;\n\tacceptanceCriteria: readonly AcceptanceCriterion[];\n}\n\nexport interface RequirementExecutionProjection {\n\trequirementId: string;\n\tforegroundStepIds: readonly string[];\n\tdelegatedTaskIds: readonly string[];\n}\n\nexport interface SessionWorkStateProjection {\n\tobjectiveId?: string;\n\topenTaskSteps: readonly OpenTaskStepProjection[];\n\trequirements: readonly RequirementExecutionProjection[];\n\tunlinkedOpenTaskStepIds: readonly string[];\n\tunknownRequirementIds: readonly string[];\n\tunboundDelegatedTaskIds: readonly string[];\n}\n\nexport function goalObjectiveId(goalId: string): string {\n\treturn `goal:${goalId}`;\n}\n\nexport function projectGoalObjective(goal: GoalState): GoalObjectiveProjection {\n\treturn {\n\t\tobjectiveId: goalObjectiveId(goal.goalId),\n\t\ttitle: `Goal ${goal.goalId}`,\n\t\tdescription: goal.userGoal,\n\t\tconstraints: [],\n\t\tacceptanceCriteria: goal.requirements.map((requirement) => ({\n\t\t\tid: requirement.id,\n\t\t\tdescription: requirement.text,\n\t\t\trequired: true,\n\t\t})),\n\t\triskBudget: {},\n\t};\n}\n\nfunction orchestrationEvidenceKind(kind: GoalState[\"evidence\"][number][\"kind\"]): EvidenceContract[\"kind\"] {\n\tswitch (kind) {\n\t\tcase \"test\":\n\t\t\treturn \"test\";\n\t\tcase \"tool\":\n\t\t\treturn \"command\";\n\t\tcase \"worker\":\n\t\t\treturn \"review\";\n\t\tcase \"user\":\n\t\t\treturn \"external\";\n\t\tcase \"file\":\n\t\tcase \"finding\":\n\t\t\treturn \"observation\";\n\t}\n}\n\nexport function projectGoalAcceptanceEvidence(goal: GoalState): EvidenceContract[] {\n\treturn goal.requirements.flatMap((requirement) =>\n\t\tgetTrustedRequirementEvidence(goal, requirement).map((evidence) => ({\n\t\t\tevidenceId: `goal-evidence:${goal.goalId}:${requirement.id}:${evidence.id}`,\n\t\t\tcriterionId: requirement.id,\n\t\t\tkind: orchestrationEvidenceKind(evidence.kind),\n\t\t\tsummary: evidence.summary,\n\t\t\tartifactIds: [],\n\t\t\ttrusted: true,\n\t\t\tcreatedAt: evidence.createdAt,\n\t\t\tmetadata: {\n\t\t\t\tsourceGoalEvidenceId: evidence.id,\n\t\t\t\tsourceKind: evidence.kind,\n\t\t\t\t...(evidence.uri ? { uri: evidence.uri } : {}),\n\t\t\t},\n\t\t})),\n\t);\n}\n\nfunction collectRelatedDelegatedTaskIds(\n\truntime: TaskRuntimeProjection | undefined,\n\tobjectiveId: string,\n\tboundLaneId: string | undefined,\n): string[] {\n\tif (!runtime || !boundLaneId) return [];\n\tconst direct = runtime.tasks[boundLaneId];\n\tif (!direct || direct.task.objectiveId !== objectiveId) return [];\n\tconst related = new Set([boundLaneId]);\n\tlet changed = true;\n\twhile (changed) {\n\t\tchanged = false;\n\t\tfor (const task of Object.values(runtime.tasks)) {\n\t\t\tif (task.task.objectiveId !== objectiveId || !task.task.verificationOfTaskId) continue;\n\t\t\tif (!related.has(task.task.verificationOfTaskId) || related.has(task.task.taskId)) continue;\n\t\t\trelated.add(task.task.taskId);\n\t\t\tchanged = true;\n\t\t}\n\t}\n\treturn [...related];\n}\n\n/** One read model joining outcome criteria, foreground planning, and delegated execution by stable ids. */\nexport function projectSessionWorkState(args: {\n\tgoalState: GoalState | undefined;\n\ttaskStepsState: TaskStepsState | undefined;\n\ttaskRuntime?: TaskRuntimeProjection;\n}): SessionWorkStateProjection {\n\tconst openTaskSteps = projectOpenTaskSteps(args.taskStepsState);\n\tconst goal = args.goalState;\n\tif (!goal) {\n\t\treturn {\n\t\t\topenTaskSteps,\n\t\t\trequirements: [],\n\t\t\tunlinkedOpenTaskStepIds: openTaskSteps.map((step) => step.id),\n\t\t\tunknownRequirementIds: [...new Set(openTaskSteps.flatMap((step) => step.requirementIds ?? []))],\n\t\t\tunboundDelegatedTaskIds: [],\n\t\t};\n\t}\n\n\tconst objectiveId = goalObjectiveId(goal.goalId);\n\tconst foregroundByRequirement = new Map(goal.requirements.map((requirement) => [requirement.id, [] as string[]]));\n\tconst unknownRequirementIds = new Set<string>();\n\tconst unlinkedOpenTaskStepIds: string[] = [];\n\tfor (const step of openTaskSteps) {\n\t\tconst resolved = resolveTaskStepRequirementIds(step, goal.requirements);\n\t\tfor (const unknownId of resolved.unknownIds) unknownRequirementIds.add(unknownId);\n\t\tif (resolved.matchedIds.length === 0) unlinkedOpenTaskStepIds.push(step.id);\n\t\tfor (const requirementId of resolved.matchedIds) foregroundByRequirement.get(requirementId)?.push(step.id);\n\t}\n\n\tconst requirements = goal.requirements.map((requirement) => ({\n\t\trequirementId: requirement.id,\n\t\tforegroundStepIds: foregroundByRequirement.get(requirement.id) ?? [],\n\t\tdelegatedTaskIds: collectRelatedDelegatedTaskIds(args.taskRuntime, objectiveId, requirement.boundLaneId),\n\t}));\n\tconst linkedDelegatedTaskIds = new Set(requirements.flatMap((requirement) => requirement.delegatedTaskIds));\n\tconst unboundDelegatedTaskIds = Object.values(args.taskRuntime?.tasks ?? {})\n\t\t.filter((task) => task.task.objectiveId === objectiveId && !linkedDelegatedTaskIds.has(task.task.taskId))\n\t\t.map((task) => task.task.taskId);\n\treturn {\n\t\tobjectiveId,\n\t\topenTaskSteps,\n\t\trequirements,\n\t\tunlinkedOpenTaskStepIds,\n\t\tunknownRequirementIds: [...unknownRequirementIds],\n\t\tunboundDelegatedTaskIds,\n\t};\n}\n"]}
1
+ {"version":3,"file":"work-state-projection.js","sourceRoot":"","sources":["../../../src/core/orchestration/work-state-projection.ts"],"names":[],"mappings":"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","sourcesContent":["import { getTrustedRequirementEvidence } from \"../goals/goal-acceptance.ts\";\nimport type { GoalState } from \"../goals/goal-state.ts\";\nimport {\n\ttype OpenTaskStepProjection,\n\tprojectOpenTaskSteps,\n\tresolveTaskStepRequirementIds,\n} from \"../tasks/task-projection.ts\";\nimport type { TaskStepsState } from \"../tasks/task-state.ts\";\nimport type { AcceptanceCriterion, EvidenceContract } from \"./contracts.ts\";\nimport type { CreateObjectiveInput, TaskRuntimeProjection } from \"./task-runtime.ts\";\n\nexport interface GoalObjectiveProjection extends CreateObjectiveInput {\n\tobjectiveId: string;\n\tacceptanceCriteria: readonly AcceptanceCriterion[];\n}\n\nexport interface RequirementExecutionProjection {\n\trequirementId: string;\n\tforegroundStepIds: readonly string[];\n\tdelegatedTaskIds: readonly string[];\n}\n\nexport interface SessionWorkStateProjection {\n\tobjectiveId?: string;\n\topenTaskSteps: readonly OpenTaskStepProjection[];\n\trequirements: readonly RequirementExecutionProjection[];\n\tunlinkedOpenTaskStepIds: readonly string[];\n\tunknownRequirementIds: readonly string[];\n\tunboundDelegatedTaskIds: readonly string[];\n}\n\nexport function goalObjectiveId(goalId: string): string {\n\treturn `goal:${goalId}`;\n}\n\nexport function projectGoalObjective(goal: GoalState): GoalObjectiveProjection {\n\treturn {\n\t\tobjectiveId: goalObjectiveId(goal.goalId),\n\t\ttitle: `Goal ${goal.goalId}`,\n\t\tdescription: goal.userGoal,\n\t\tconstraints: [],\n\t\tacceptanceCriteria: goal.requirements.map((requirement) => ({\n\t\t\tid: requirement.id,\n\t\t\tdescription: requirement.text,\n\t\t\trequired: true,\n\t\t})),\n\t\triskBudget: goal.tokenBudget !== undefined ? { maxTokens: goal.tokenBudget } : {},\n\t};\n}\n\nfunction orchestrationEvidenceKind(kind: GoalState[\"evidence\"][number][\"kind\"]): EvidenceContract[\"kind\"] {\n\tswitch (kind) {\n\t\tcase \"test\":\n\t\t\treturn \"test\";\n\t\tcase \"tool\":\n\t\t\treturn \"command\";\n\t\tcase \"worker\":\n\t\t\treturn \"review\";\n\t\tcase \"user\":\n\t\t\treturn \"external\";\n\t\tcase \"file\":\n\t\tcase \"finding\":\n\t\t\treturn \"observation\";\n\t}\n}\n\nexport function projectGoalAcceptanceEvidence(goal: GoalState): EvidenceContract[] {\n\treturn goal.requirements.flatMap((requirement) =>\n\t\tgetTrustedRequirementEvidence(goal, requirement).map((evidence) => ({\n\t\t\tevidenceId: `goal-evidence:${goal.goalId}:${requirement.id}:${evidence.id}`,\n\t\t\tcriterionId: requirement.id,\n\t\t\tkind: orchestrationEvidenceKind(evidence.kind),\n\t\t\tsummary: evidence.summary,\n\t\t\tartifactIds: [],\n\t\t\ttrusted: true,\n\t\t\tcreatedAt: evidence.createdAt,\n\t\t\tmetadata: {\n\t\t\t\tsourceGoalEvidenceId: evidence.id,\n\t\t\t\tsourceKind: evidence.kind,\n\t\t\t\t...(evidence.uri ? { uri: evidence.uri } : {}),\n\t\t\t},\n\t\t})),\n\t);\n}\n\nfunction collectRelatedDelegatedTaskIds(\n\truntime: TaskRuntimeProjection | undefined,\n\tobjectiveId: string,\n\tboundLaneId: string | undefined,\n): string[] {\n\tif (!runtime || !boundLaneId) return [];\n\tconst direct = runtime.tasks[boundLaneId];\n\tif (!direct || direct.task.objectiveId !== objectiveId) return [];\n\tconst related = new Set([boundLaneId]);\n\tlet changed = true;\n\twhile (changed) {\n\t\tchanged = false;\n\t\tfor (const task of Object.values(runtime.tasks)) {\n\t\t\tif (task.task.objectiveId !== objectiveId || !task.task.verificationOfTaskId) continue;\n\t\t\tif (!related.has(task.task.verificationOfTaskId) || related.has(task.task.taskId)) continue;\n\t\t\trelated.add(task.task.taskId);\n\t\t\tchanged = true;\n\t\t}\n\t}\n\treturn [...related];\n}\n\n/** One read model joining outcome criteria, foreground planning, and delegated execution by stable ids. */\nexport function projectSessionWorkState(args: {\n\tgoalState: GoalState | undefined;\n\ttaskStepsState: TaskStepsState | undefined;\n\ttaskRuntime?: TaskRuntimeProjection;\n}): SessionWorkStateProjection {\n\tconst openTaskSteps = projectOpenTaskSteps(args.taskStepsState);\n\tconst goal = args.goalState;\n\tif (!goal) {\n\t\treturn {\n\t\t\topenTaskSteps,\n\t\t\trequirements: [],\n\t\t\tunlinkedOpenTaskStepIds: openTaskSteps.map((step) => step.id),\n\t\t\tunknownRequirementIds: [...new Set(openTaskSteps.flatMap((step) => step.requirementIds ?? []))],\n\t\t\tunboundDelegatedTaskIds: [],\n\t\t};\n\t}\n\n\tconst objectiveId = goalObjectiveId(goal.goalId);\n\tconst foregroundByRequirement = new Map(goal.requirements.map((requirement) => [requirement.id, [] as string[]]));\n\tconst unknownRequirementIds = new Set<string>();\n\tconst unlinkedOpenTaskStepIds: string[] = [];\n\tfor (const step of openTaskSteps) {\n\t\tconst resolved = resolveTaskStepRequirementIds(step, goal.requirements);\n\t\tfor (const unknownId of resolved.unknownIds) unknownRequirementIds.add(unknownId);\n\t\tif (resolved.matchedIds.length === 0) unlinkedOpenTaskStepIds.push(step.id);\n\t\tfor (const requirementId of resolved.matchedIds) foregroundByRequirement.get(requirementId)?.push(step.id);\n\t}\n\n\tconst requirements = goal.requirements.map((requirement) => ({\n\t\trequirementId: requirement.id,\n\t\tforegroundStepIds: foregroundByRequirement.get(requirement.id) ?? [],\n\t\tdelegatedTaskIds: collectRelatedDelegatedTaskIds(args.taskRuntime, objectiveId, requirement.boundLaneId),\n\t}));\n\tconst linkedDelegatedTaskIds = new Set(requirements.flatMap((requirement) => requirement.delegatedTaskIds));\n\tconst unboundDelegatedTaskIds = Object.values(args.taskRuntime?.tasks ?? {})\n\t\t.filter((task) => task.task.objectiveId === objectiveId && !linkedDelegatedTaskIds.has(task.task.taskId))\n\t\t.map((task) => task.task.taskId);\n\treturn {\n\t\tobjectiveId,\n\t\topenTaskSteps,\n\t\trequirements,\n\t\tunlinkedOpenTaskStepIds,\n\t\tunknownRequirementIds: [...unknownRequirementIds],\n\t\tunboundDelegatedTaskIds,\n\t};\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { type OrchestrationModelBinding, type OrchestrationProfile, type WorkerExecutionAuthorityContract, type WorkerExecutionContract } from "./contracts.ts";
1
+ import { type OrchestrationModelBinding, type OrchestrationProfile, type ResourcePointer, type WorkerExecutionAuthorityContract, type WorkerExecutionContract } from "./contracts.ts";
2
2
  export declare class WorkerExecutionContractError extends Error {
3
3
  constructor(message: string);
4
4
  }
@@ -8,12 +8,14 @@ export declare function createWorkerExecutionContract(args: {
8
8
  profile: OrchestrationProfile;
9
9
  modelBinding: OrchestrationModelBinding;
10
10
  authority: WorkerExecutionAuthorityContract;
11
+ resourcePointers?: readonly ResourcePointer[];
11
12
  soul?: string;
12
13
  };
13
14
  verifier?: {
14
15
  profile: OrchestrationProfile;
15
16
  modelBinding: OrchestrationModelBinding;
16
17
  authority: WorkerExecutionAuthorityContract;
18
+ resourcePointers?: readonly ResourcePointer[];
17
19
  soul?: string;
18
20
  };
19
21
  }): WorkerExecutionContract;
@@ -1 +1 @@
1
- {"version":3,"file":"worker-execution-contract.d.ts","sourceRoot":"","sources":["../../../src/core/orchestration/worker-execution-contract.ts"],"names":[],"mappings":"AAGA,OAAO,EAIN,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,gCAAgC,EACrC,KAAK,uBAAuB,EAE5B,MAAM,gBAAgB,CAAC;AAIxB,qBAAa,4BAA6B,SAAQ,KAAK;IACtD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD;AAuID,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CA2BpF;AAsBD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IACnD,MAAM,EAAE;QACP,OAAO,EAAE,oBAAoB,CAAC;QAC9B,YAAY,EAAE,yBAAyB,CAAC;QACxC,SAAS,EAAE,gCAAgC,CAAC;QAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,CAAC,EAAE;QACV,OAAO,EAAE,oBAAoB,CAAC;QAC9B,YAAY,EAAE,yBAAyB,CAAC;QACxC,SAAS,EAAE,gCAAgC,CAAC;QAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;CACF,GAAG,uBAAuB,CAM1B;AAED,wBAAgB,+BAA+B,CAC9C,QAAQ,EAAE,uBAAuB,GAC/B,uBAAuB,GAAG,SAAS,CAIrC","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"]}
1
+ {"version":3,"file":"worker-execution-contract.d.ts","sourceRoot":"","sources":["../../../src/core/orchestration/worker-execution-contract.ts"],"names":[],"mappings":"AAGA,OAAO,EAeN,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,eAAe,EAEpB,KAAK,gCAAgC,EACrC,KAAK,uBAAuB,EAE5B,MAAM,gBAAgB,CAAC;AAIxB,qBAAa,4BAA6B,SAAQ,KAAK;IACtD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD;AAwMD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CA2BpF;AAwBD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IACnD,MAAM,EAAE;QACP,OAAO,EAAE,oBAAoB,CAAC;QAC9B,YAAY,EAAE,yBAAyB,CAAC;QACxC,SAAS,EAAE,gCAAgC,CAAC;QAC5C,gBAAgB,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;QAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,CAAC,EAAE;QACV,OAAO,EAAE,oBAAoB,CAAC;QAC9B,YAAY,EAAE,yBAAyB,CAAC;QACxC,SAAS,EAAE,gCAAgC,CAAC;QAC5C,gBAAgB,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;QAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;CACF,GAAG,uBAAuB,CAM1B;AAED,wBAAgB,+BAA+B,CAC9C,QAAQ,EAAE,uBAAuB,GAC/B,uBAAuB,GAAG,SAAS,CAIrC","sourcesContent":["import path from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { hasOnlyKeys, isPlainRecord } from \"../util/value-guards.ts\";\nimport {\n\tisHarnessCapability,\n\tisResourcePointerKind,\n\tMAX_ORCHESTRATION_COLLECTION_LENGTH,\n\tMAX_ORCHESTRATION_IDENTIFIER_LENGTH,\n\tMAX_ORCHESTRATION_MODEL_ID_LENGTH,\n\tMAX_ORCHESTRATION_MODEL_PROVIDER_LENGTH,\n\tMAX_WORKER_AUTHORITY_PATH_LENGTH,\n\tMAX_WORKER_AUTHORITY_PATHS,\n\tMAX_WORKER_RESOURCE_METADATA_NAME_LENGTH,\n\tMAX_WORKER_RESOURCE_PATH_LENGTH,\n\tMAX_WORKER_RESOURCE_POINTERS,\n\tMAX_WORKER_SOUL_LENGTH,\n\tORCHESTRATION_SCHEMA_VERSION,\n\tORCHESTRATION_THINKING_LEVELS,\n\ttype OrchestrationModelBinding,\n\ttype OrchestrationProfile,\n\ttype ResourcePointer,\n\ttype RiskBudget,\n\ttype WorkerExecutionAuthorityContract,\n\ttype WorkerExecutionContract,\n\ttype WorkerProfileExecutionContract,\n} from \"./contracts.ts\";\nimport { OrchestrationProfileError, parseOrchestrationProfile } from \"./profile-registry.ts\";\nimport { intersectRiskBudgets, parseRiskBudget } 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 parseModelBinding(value: unknown, label: string): OrchestrationModelBinding {\n\tif (\n\t\t!isPlainRecord(value) ||\n\t\t!hasOnlyKeys(value, [\"provider\", \"modelId\", \"thinkingLevel\"]) ||\n\t\ttypeof value.provider !== \"string\" ||\n\t\tvalue.provider.length > MAX_ORCHESTRATION_MODEL_PROVIDER_LENGTH ||\n\t\t!value.provider.trim() ||\n\t\ttypeof value.modelId !== \"string\" ||\n\t\tvalue.modelId.length > MAX_ORCHESTRATION_MODEL_ID_LENGTH ||\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(\n\tvalue: unknown,\n\tlabel: string,\n\toptions: { maxEntries?: number; maxLength?: number } = {},\n): string[] {\n\tconst maxEntries = options.maxEntries ?? MAX_ORCHESTRATION_COLLECTION_LENGTH;\n\tconst maxLength = options.maxLength ?? MAX_ORCHESTRATION_IDENTIFIER_LENGTH;\n\tif (\n\t\t!Array.isArray(value) ||\n\t\tvalue.length > maxEntries ||\n\t\t!value.every((entry) => typeof entry === \"string\" && entry.length > 0 && entry.length <= maxLength)\n\t) {\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 parseResourcePointers(value: unknown, label: string): ResourcePointer[] {\n\tif (!Array.isArray(value) || value.length > MAX_WORKER_RESOURCE_POINTERS) {\n\t\tthrow new WorkerExecutionContractError(`${label} resource pointers are invalid.`);\n\t}\n\tconst ids = new Set<string>();\n\treturn value.map((candidate) => {\n\t\tif (\n\t\t\t!isPlainRecord(candidate) ||\n\t\t\t!hasOnlyKeys(candidate, [\"id\", \"kind\", \"uri\", \"readOnly\", \"digest\", \"metadata\"]) ||\n\t\t\ttypeof candidate.id !== \"string\" ||\n\t\t\t!/^(skill|prompt):[a-f0-9]{64}$/i.test(candidate.id) ||\n\t\t\ttypeof candidate.kind !== \"string\" ||\n\t\t\t!isResourcePointerKind(candidate.kind) ||\n\t\t\t(candidate.kind !== \"skill\" && candidate.kind !== \"prompt\") ||\n\t\t\t!candidate.id.startsWith(`${candidate.kind}:`) ||\n\t\t\ttypeof candidate.uri !== \"string\" ||\n\t\t\tcandidate.uri.length === 0 ||\n\t\t\tcandidate.uri.length > MAX_WORKER_RESOURCE_PATH_LENGTH + 16 ||\n\t\t\t!candidate.uri.startsWith(\"file:\") ||\n\t\t\tcandidate.readOnly !== true ||\n\t\t\t(candidate.digest !== undefined &&\n\t\t\t\t(typeof candidate.digest !== \"string\" || !/^[a-f0-9]{64}$/i.test(candidate.digest))) ||\n\t\t\t(candidate.metadata !== undefined &&\n\t\t\t\t(!isPlainRecord(candidate.metadata) ||\n\t\t\t\t\ttypeof candidate.metadata.name !== \"string\" ||\n\t\t\t\t\tcandidate.metadata.name.length === 0 ||\n\t\t\t\t\tcandidate.metadata.name.length > MAX_WORKER_RESOURCE_METADATA_NAME_LENGTH ||\n\t\t\t\t\t!hasOnlyKeys(candidate.metadata, [\"name\"])))\n\t\t) {\n\t\t\tthrow new WorkerExecutionContractError(`${label} resource pointer is invalid.`);\n\t\t}\n\t\tif (ids.has(candidate.id)) {\n\t\t\tthrow new WorkerExecutionContractError(`${label} resource pointers contain duplicates.`);\n\t\t}\n\t\tids.add(candidate.id);\n\t\treturn {\n\t\t\tid: candidate.id,\n\t\t\tkind: candidate.kind,\n\t\t\turi: candidate.uri,\n\t\t\treadOnly: true,\n\t\t\t...(typeof candidate.digest === \"string\" ? { digest: candidate.digest } : {}),\n\t\t\t...(isPlainRecord(candidate.metadata) && typeof candidate.metadata.name === \"string\"\n\t\t\t\t? { metadata: { name: candidate.metadata.name } }\n\t\t\t\t: {}),\n\t\t};\n\t});\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!hasOnlyKeys(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 pathArrayOptions = {\n\t\tmaxEntries: MAX_WORKER_AUTHORITY_PATHS,\n\t\tmaxLength: MAX_WORKER_AUTHORITY_PATH_LENGTH,\n\t};\n\tconst readPaths = stringArray(value.readPaths, `${label} authority readPaths`, pathArrayOptions);\n\tconst writePaths = stringArray(value.writePaths, `${label} authority writePaths`, pathArrayOptions);\n\tconst deniedPaths = stringArray(value.deniedPaths, `${label} authority deniedPaths`, pathArrayOptions);\n\tif (\n\t\t[...readPaths, ...writePaths, ...deniedPaths].some(\n\t\t\t(entry) => !path.isAbsolute(entry) && !path.win32.isAbsolute(entry),\n\t\t)\n\t) {\n\t\tthrow new WorkerExecutionContractError(`${label} authority paths must be absolute.`);\n\t}\n\tlet budget: RiskBudget;\n\ttry {\n\t\tbudget = parseRiskBudget(value.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!hasOnlyKeys(value, [\"schemaVersion\", \"profile\", \"modelBinding\", \"authority\", \"resourcePointers\", \"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 (\n\t\tvalue.soul !== undefined &&\n\t\t(typeof value.soul !== \"string\" || value.soul.length > MAX_WORKER_SOUL_LENGTH || !value.soul.trim())\n\t) {\n\t\tthrow new WorkerExecutionContractError(`${label} soul is invalid.`);\n\t}\n\tconst authority = parseAuthority(value.authority, profile, label);\n\tconst resourcePointers = parseResourcePointers(value.resourcePointers ?? [], label);\n\treturn {\n\t\tschemaVersion: ORCHESTRATION_SCHEMA_VERSION,\n\t\tprofile,\n\t\tmodelBinding,\n\t\tauthority,\n\t\tresourcePointers,\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!hasOnlyKeys(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\tresourcePointers?: readonly ResourcePointer[];\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\tresourcePointers: structuredClone(source.resourcePointers ?? []),\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\tresourcePointers?: readonly ResourcePointer[];\n\t\tsoul?: string;\n\t};\n\tverifier?: {\n\t\tprofile: OrchestrationProfile;\n\t\tmodelBinding: OrchestrationModelBinding;\n\t\tauthority: WorkerExecutionAuthorityContract;\n\t\tresourcePointers?: readonly ResourcePointer[];\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"]}
@@ -1,25 +1,23 @@
1
1
  import path from "node:path";
2
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";
3
+ import { hasOnlyKeys, isPlainRecord } from "../util/value-guards.js";
4
+ import { isHarnessCapability, isResourcePointerKind, MAX_ORCHESTRATION_COLLECTION_LENGTH, MAX_ORCHESTRATION_IDENTIFIER_LENGTH, MAX_ORCHESTRATION_MODEL_ID_LENGTH, MAX_ORCHESTRATION_MODEL_PROVIDER_LENGTH, MAX_WORKER_AUTHORITY_PATH_LENGTH, MAX_WORKER_AUTHORITY_PATHS, MAX_WORKER_RESOURCE_METADATA_NAME_LENGTH, MAX_WORKER_RESOURCE_PATH_LENGTH, MAX_WORKER_RESOURCE_POINTERS, MAX_WORKER_SOUL_LENGTH, ORCHESTRATION_SCHEMA_VERSION, ORCHESTRATION_THINKING_LEVELS, } from "./contracts.js";
5
5
  import { OrchestrationProfileError, parseOrchestrationProfile } from "./profile-registry.js";
6
- import { intersectRiskBudgets, validateRiskBudget } from "./risk-budget.js";
6
+ import { intersectRiskBudgets, parseRiskBudget } from "./risk-budget.js";
7
7
  export class WorkerExecutionContractError extends Error {
8
8
  constructor(message) {
9
9
  super(message);
10
10
  this.name = "WorkerExecutionContractError";
11
11
  }
12
12
  }
13
- function exactKeys(record, allowed) {
14
- const allowedSet = new Set(allowed);
15
- return Object.keys(record).every((key) => allowedSet.has(key));
16
- }
17
13
  function parseModelBinding(value, label) {
18
14
  if (!isPlainRecord(value) ||
19
- !exactKeys(value, ["provider", "modelId", "thinkingLevel"]) ||
15
+ !hasOnlyKeys(value, ["provider", "modelId", "thinkingLevel"]) ||
20
16
  typeof value.provider !== "string" ||
17
+ value.provider.length > MAX_ORCHESTRATION_MODEL_PROVIDER_LENGTH ||
21
18
  !value.provider.trim() ||
22
19
  typeof value.modelId !== "string" ||
20
+ value.modelId.length > MAX_ORCHESTRATION_MODEL_ID_LENGTH ||
23
21
  !value.modelId.trim() ||
24
22
  typeof value.thinkingLevel !== "string" ||
25
23
  !ORCHESTRATION_THINKING_LEVELS.includes(value.thinkingLevel)) {
@@ -31,8 +29,12 @@ function parseModelBinding(value, label) {
31
29
  thinkingLevel: value.thinkingLevel,
32
30
  };
33
31
  }
34
- function stringArray(value, label) {
35
- if (!Array.isArray(value) || !value.every((entry) => typeof entry === "string" && entry.length > 0)) {
32
+ function stringArray(value, label, options = {}) {
33
+ const maxEntries = options.maxEntries ?? MAX_ORCHESTRATION_COLLECTION_LENGTH;
34
+ const maxLength = options.maxLength ?? MAX_ORCHESTRATION_IDENTIFIER_LENGTH;
35
+ if (!Array.isArray(value) ||
36
+ value.length > maxEntries ||
37
+ !value.every((entry) => typeof entry === "string" && entry.length > 0 && entry.length <= maxLength)) {
36
38
  throw new WorkerExecutionContractError(`${label} must be an array of non-empty strings.`);
37
39
  }
38
40
  if (new Set(value).size !== value.length) {
@@ -40,9 +42,54 @@ function stringArray(value, label) {
40
42
  }
41
43
  return [...value];
42
44
  }
45
+ function parseResourcePointers(value, label) {
46
+ if (!Array.isArray(value) || value.length > MAX_WORKER_RESOURCE_POINTERS) {
47
+ throw new WorkerExecutionContractError(`${label} resource pointers are invalid.`);
48
+ }
49
+ const ids = new Set();
50
+ return value.map((candidate) => {
51
+ if (!isPlainRecord(candidate) ||
52
+ !hasOnlyKeys(candidate, ["id", "kind", "uri", "readOnly", "digest", "metadata"]) ||
53
+ typeof candidate.id !== "string" ||
54
+ !/^(skill|prompt):[a-f0-9]{64}$/i.test(candidate.id) ||
55
+ typeof candidate.kind !== "string" ||
56
+ !isResourcePointerKind(candidate.kind) ||
57
+ (candidate.kind !== "skill" && candidate.kind !== "prompt") ||
58
+ !candidate.id.startsWith(`${candidate.kind}:`) ||
59
+ typeof candidate.uri !== "string" ||
60
+ candidate.uri.length === 0 ||
61
+ candidate.uri.length > MAX_WORKER_RESOURCE_PATH_LENGTH + 16 ||
62
+ !candidate.uri.startsWith("file:") ||
63
+ candidate.readOnly !== true ||
64
+ (candidate.digest !== undefined &&
65
+ (typeof candidate.digest !== "string" || !/^[a-f0-9]{64}$/i.test(candidate.digest))) ||
66
+ (candidate.metadata !== undefined &&
67
+ (!isPlainRecord(candidate.metadata) ||
68
+ typeof candidate.metadata.name !== "string" ||
69
+ candidate.metadata.name.length === 0 ||
70
+ candidate.metadata.name.length > MAX_WORKER_RESOURCE_METADATA_NAME_LENGTH ||
71
+ !hasOnlyKeys(candidate.metadata, ["name"])))) {
72
+ throw new WorkerExecutionContractError(`${label} resource pointer is invalid.`);
73
+ }
74
+ if (ids.has(candidate.id)) {
75
+ throw new WorkerExecutionContractError(`${label} resource pointers contain duplicates.`);
76
+ }
77
+ ids.add(candidate.id);
78
+ return {
79
+ id: candidate.id,
80
+ kind: candidate.kind,
81
+ uri: candidate.uri,
82
+ readOnly: true,
83
+ ...(typeof candidate.digest === "string" ? { digest: candidate.digest } : {}),
84
+ ...(isPlainRecord(candidate.metadata) && typeof candidate.metadata.name === "string"
85
+ ? { metadata: { name: candidate.metadata.name } }
86
+ : {}),
87
+ };
88
+ });
89
+ }
43
90
  function parseAuthority(value, profile, label) {
44
91
  if (!isPlainRecord(value) ||
45
- !exactKeys(value, ["capabilities", "toolNames", "readPaths", "writePaths", "deniedPaths", "budget"])) {
92
+ !hasOnlyKeys(value, ["capabilities", "toolNames", "readPaths", "writePaths", "deniedPaths", "budget"])) {
46
93
  throw new WorkerExecutionContractError(`${label} authority is invalid.`);
47
94
  }
48
95
  const capabilities = stringArray(value.capabilities, `${label} authority capabilities`);
@@ -56,18 +103,19 @@ function parseAuthority(value, profile, label) {
56
103
  if (toolNames.some((toolName) => !profile.toolNames.includes(toolName))) {
57
104
  throw new WorkerExecutionContractError(`${label} authority contains a tool outside its profile.`);
58
105
  }
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))) {
106
+ const pathArrayOptions = {
107
+ maxEntries: MAX_WORKER_AUTHORITY_PATHS,
108
+ maxLength: MAX_WORKER_AUTHORITY_PATH_LENGTH,
109
+ };
110
+ const readPaths = stringArray(value.readPaths, `${label} authority readPaths`, pathArrayOptions);
111
+ const writePaths = stringArray(value.writePaths, `${label} authority writePaths`, pathArrayOptions);
112
+ const deniedPaths = stringArray(value.deniedPaths, `${label} authority deniedPaths`, pathArrayOptions);
113
+ if ([...readPaths, ...writePaths, ...deniedPaths].some((entry) => !path.isAbsolute(entry) && !path.win32.isAbsolute(entry))) {
63
114
  throw new WorkerExecutionContractError(`${label} authority paths must be absolute.`);
64
115
  }
65
- if (!isPlainRecord(value.budget)) {
66
- throw new WorkerExecutionContractError(`${label} authority budget is invalid.`);
67
- }
68
- const budget = structuredClone(value.budget);
116
+ let budget;
69
117
  try {
70
- validateRiskBudget(budget, `${label} authority budget`);
118
+ budget = parseRiskBudget(value.budget, `${label} authority budget`);
71
119
  }
72
120
  catch (error) {
73
121
  throw new WorkerExecutionContractError(error instanceof Error ? error.message : String(error));
@@ -94,7 +142,7 @@ function parseAuthority(value, profile, label) {
94
142
  }
95
143
  function parseProfileContract(value, label) {
96
144
  if (!isPlainRecord(value) ||
97
- !exactKeys(value, ["schemaVersion", "profile", "modelBinding", "authority", "soul"]) ||
145
+ !hasOnlyKeys(value, ["schemaVersion", "profile", "modelBinding", "authority", "resourcePointers", "soul"]) ||
98
146
  value.schemaVersion !== ORCHESTRATION_SCHEMA_VERSION) {
99
147
  throw new WorkerExecutionContractError(`${label} is invalid.`);
100
148
  }
@@ -112,21 +160,24 @@ function parseProfileContract(value, label) {
112
160
  if (!profile.modelPolicy.candidates.some((candidate) => isDeepStrictEqual(candidate, modelBinding))) {
113
161
  throw new WorkerExecutionContractError(`${label} model binding is not declared by its profile.`);
114
162
  }
115
- if (value.soul !== undefined && (typeof value.soul !== "string" || !value.soul.trim())) {
163
+ if (value.soul !== undefined &&
164
+ (typeof value.soul !== "string" || value.soul.length > MAX_WORKER_SOUL_LENGTH || !value.soul.trim())) {
116
165
  throw new WorkerExecutionContractError(`${label} soul is invalid.`);
117
166
  }
118
167
  const authority = parseAuthority(value.authority, profile, label);
168
+ const resourcePointers = parseResourcePointers(value.resourcePointers ?? [], label);
119
169
  return {
120
170
  schemaVersion: ORCHESTRATION_SCHEMA_VERSION,
121
171
  profile,
122
172
  modelBinding,
123
173
  authority,
174
+ resourcePointers,
124
175
  ...(typeof value.soul === "string" ? { soul: value.soul } : {}),
125
176
  };
126
177
  }
127
178
  export function parseWorkerExecutionContract(value) {
128
179
  if (!isPlainRecord(value) ||
129
- !exactKeys(value, ["schemaVersion", "worker", "verifier"]) ||
180
+ !hasOnlyKeys(value, ["schemaVersion", "worker", "verifier"]) ||
130
181
  value.schemaVersion !== ORCHESTRATION_SCHEMA_VERSION) {
131
182
  throw new WorkerExecutionContractError("Worker execution contract is invalid.");
132
183
  }
@@ -161,6 +212,7 @@ function snapshotResolvedProfile(source) {
161
212
  profile: snapshotProfile(source.profile),
162
213
  modelBinding: structuredClone(source.modelBinding),
163
214
  authority: structuredClone(source.authority),
215
+ resourcePointers: structuredClone(source.resourcePointers ?? []),
164
216
  ...(source.soul ? { soul: source.soul } : {}),
165
217
  };
166
218
  }
@@ -1 +1 @@
1
- {"version":3,"file":"worker-execution-contract.js","sourceRoot":"","sources":["../../../src/core/orchestration/worker-execution-contract.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EACN,mBAAmB,EACnB,4BAA4B,EAC5B,6BAA6B,GAM7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACtD,YAAY,OAAe,EAAE;QAC5B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAAA,CAC3C;CACD;AAED,SAAS,SAAS,CAAC,MAA+B,EAAE,OAA0B,EAAW;IACxF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAAA,CAC/D;AAED,SAAS,iBAAiB,CAAC,KAAc,EAAE,KAAa,EAA6B;IACpF,IACC,CAAC,aAAa,CAAC,KAAK,CAAC;QACrB,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QAC3D,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAClC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE;QACtB,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;QACrB,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ;QACvC,CAAC,6BAA6B,CAAC,QAAQ,CAAC,KAAK,CAAC,aAA+D,CAAC,EAC7G,CAAC;QACF,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,4BAA4B,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO;QACN,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,aAAa,EAAE,KAAK,CAAC,aAA+D;KACpF,CAAC;AAAA,CACF;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa,EAAY;IAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QACrG,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,yCAAyC,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QAC1C,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,uBAAuB,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AAAA,CAClB;AAED,SAAS,cAAc,CACtB,KAAc,EACd,OAA6B,EAC7B,KAAa,EACsB;IACnC,IACC,CAAC,aAAa,CAAC,KAAK,CAAC;QACrB,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC,EACnG,CAAC;QACF,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,wBAAwB,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,KAAK,yBAAyB,CAAC,CAAC;IACxF,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,4CAA4C,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACxF,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,oDAAoD,CAAC,CAAC;IACtG,CAAC;IACD,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,KAAK,sBAAsB,CAAC,CAAC;IAC/E,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,iDAAiD,CAAC,CAAC;IACnG,CAAC;IACD,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,KAAK,sBAAsB,CAAC,CAAC;IAC/E,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,KAAK,uBAAuB,CAAC,CAAC;IAClF,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,KAAK,wBAAwB,CAAC,CAAC;IACrF,IAAI,CAAC,GAAG,SAAS,EAAE,GAAG,UAAU,EAAE,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAC5F,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,oCAAoC,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,+BAA+B,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC;QACJ,kBAAkB,CAAC,MAAM,EAAE,GAAG,KAAK,mBAAmB,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,4BAA4B,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;QAC9E,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,wCAAwC,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CACpC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,KAAK,iBAAiB,IAAI,UAAU,KAAK,eAAe,CAClF,CAAC;IACF,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CACrC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,KAAK,kBAAkB,IAAI,UAAU,KAAK,iBAAiB,CACrF,CAAC;IACF,IAAI,WAAW,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,8CAA8C,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,YAAY,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,+CAA+C,CAAC,CAAC;IACjG,CAAC;IACD,OAAO;QACN,YAAY,EAAE,YAAgE;QAC9E,SAAS;QACT,SAAS;QACT,UAAU;QACV,WAAW;QACX,MAAM;KACN,CAAC;AAAA,CACF;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAE,KAAa,EAAkC;IAC5F,IACC,CAAC,aAAa,CAAC,KAAK,CAAC;QACrB,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QACpF,KAAK,CAAC,aAAa,KAAK,4BAA4B,EACnD,CAAC;QACF,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,cAAc,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,OAA6B,CAAC;IAClC,IAAI,CAAC;QACJ,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,4BAA4B,CACrC,KAAK,YAAY,yBAAyB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,sBAAsB,CAC3F,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACrC,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,8CAA8C,CAAC,CAAC;IAChG,CAAC;IACD,MAAM,YAAY,GAAG,iBAAiB,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAClE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QACrG,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,gDAAgD,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACxF,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,mBAAmB,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAClE,OAAO;QACN,aAAa,EAAE,4BAA4B;QAC3C,OAAO;QACP,YAAY;QACZ,SAAS;QACT,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/D,CAAC;AAAA,CACF;AAED,MAAM,UAAU,4BAA4B,CAAC,KAAc,EAA2B;IACrF,IACC,CAAC,aAAa,CAAC,KAAK,CAAC;QACrB,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC1D,KAAK,CAAC,aAAa,KAAK,4BAA4B,EACnD,CAAC;QACF,MAAM,IAAI,4BAA4B,CAAC,uCAAuC,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;IAC/E,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ;QAC9B,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,QAAQ,EAAE,oCAAoC,CAAC;QAC5E,CAAC,CAAC,SAAS,CAAC;IACb,IAAI,MAAM,CAAC,OAAO,CAAC,8BAA8B,EAAE,CAAC;QACnD,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,qBAAqB,KAAK,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACtF,MAAM,IAAI,4BAA4B,CAAC,iEAAiE,CAAC,CAAC;QAC3G,CAAC;QACD,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC1C,MAAM,IAAI,4BAA4B,CAAC,qEAAqE,CAAC,CAAC;QAC/G,CAAC;IACF,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,4BAA4B,CAAC,uDAAuD,CAAC,CAAC;IACjG,CAAC;IACD,OAAO;QACN,aAAa,EAAE,4BAA4B;QAC3C,MAAM;QACN,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjC,CAAC;AAAA,CACF;AAED,SAAS,eAAe,CAAC,OAA6B,EAAwB;IAC7E,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,GAAG,OAAO,CAAC;IAC1D,OAAO,eAAe,CAAC,SAAS,CAAyB,CAAC;AAAA,CAC1D;AAED,SAAS,uBAAuB,CAAC,MAKhC,EAAkC;IAClC,OAAO;QACN,aAAa,EAAE,4BAA4B;QAC3C,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC;QACxC,YAAY,EAAE,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC;QAClD,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC;QAC5C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C,CAAC;AAAA,CACF;AAED,MAAM,UAAU,6BAA6B,CAAC,IAa7C,EAA2B;IAC3B,OAAO,4BAA4B,CAAC;QACnC,aAAa,EAAE,4BAA4B;QAC3C,MAAM,EAAE,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9E,CAAC,CAAC;AAAA,CACH;AAED,MAAM,UAAU,+BAA+B,CAC9C,QAAiC,EACK;IACtC,OAAO,QAAQ,CAAC,QAAQ;QACvB,CAAC,CAAC,4BAA4B,CAAC,EAAE,aAAa,EAAE,4BAA4B,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC1G,CAAC,CAAC,SAAS,CAAC;AAAA,CACb","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"]}
1
+ {"version":3,"file":"worker-execution-contract.js","sourceRoot":"","sources":["../../../src/core/orchestration/worker-execution-contract.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EACN,mBAAmB,EACnB,qBAAqB,EACrB,mCAAmC,EACnC,mCAAmC,EACnC,iCAAiC,EACjC,uCAAuC,EACvC,gCAAgC,EAChC,0BAA0B,EAC1B,wCAAwC,EACxC,+BAA+B,EAC/B,4BAA4B,EAC5B,sBAAsB,EACtB,4BAA4B,EAC5B,6BAA6B,GAQ7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEzE,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACtD,YAAY,OAAe,EAAE;QAC5B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAAA,CAC3C;CACD;AAED,SAAS,iBAAiB,CAAC,KAAc,EAAE,KAAa,EAA6B;IACpF,IACC,CAAC,aAAa,CAAC,KAAK,CAAC;QACrB,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAClC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,uCAAuC;QAC/D,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE;QACtB,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,iCAAiC;QACxD,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;QACrB,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ;QACvC,CAAC,6BAA6B,CAAC,QAAQ,CAAC,KAAK,CAAC,aAA+D,CAAC,EAC7G,CAAC;QACF,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,4BAA4B,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO;QACN,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,aAAa,EAAE,KAAK,CAAC,aAA+D;KACpF,CAAC;AAAA,CACF;AAED,SAAS,WAAW,CACnB,KAAc,EACd,KAAa,EACb,OAAO,GAAgD,EAAE,EAC9C;IACX,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,mCAAmC,CAAC;IAC7E,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,mCAAmC,CAAC;IAC3E,IACC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,KAAK,CAAC,MAAM,GAAG,UAAU;QACzB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC,EAClG,CAAC;QACF,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,yCAAyC,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QAC1C,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,uBAAuB,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AAAA,CAClB;AAED,SAAS,qBAAqB,CAAC,KAAc,EAAE,KAAa,EAAqB;IAChF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,4BAA4B,EAAE,CAAC;QAC1E,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,iCAAiC,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;QAC/B,IACC,CAAC,aAAa,CAAC,SAAS,CAAC;YACzB,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;YAChF,OAAO,SAAS,CAAC,EAAE,KAAK,QAAQ;YAChC,CAAC,gCAAgC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACpD,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ;YAClC,CAAC,qBAAqB,CAAC,SAAS,CAAC,IAAI,CAAC;YACtC,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC;YAC3D,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC,IAAI,GAAG,CAAC;YAC9C,OAAO,SAAS,CAAC,GAAG,KAAK,QAAQ;YACjC,SAAS,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;YAC1B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,+BAA+B,GAAG,EAAE;YAC3D,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;YAClC,SAAS,CAAC,QAAQ,KAAK,IAAI;YAC3B,CAAC,SAAS,CAAC,MAAM,KAAK,SAAS;gBAC9B,CAAC,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YACrF,CAAC,SAAS,CAAC,QAAQ,KAAK,SAAS;gBAChC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC;oBAClC,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ;oBAC3C,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;oBACpC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,wCAAwC;oBACzE,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAC7C,CAAC;YACF,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,+BAA+B,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,wCAAwC,CAAC,CAAC;QAC1F,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACtB,OAAO;YACN,EAAE,EAAE,SAAS,CAAC,EAAE;YAChB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,GAAG,EAAE,SAAS,CAAC,GAAG;YAClB,QAAQ,EAAE,IAAI;YACd,GAAG,CAAC,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ;gBACnF,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;gBACjD,CAAC,CAAC,EAAE,CAAC;SACN,CAAC;IAAA,CACF,CAAC,CAAC;AAAA,CACH;AAED,SAAS,cAAc,CACtB,KAAc,EACd,OAA6B,EAC7B,KAAa,EACsB;IACnC,IACC,CAAC,aAAa,CAAC,KAAK,CAAC;QACrB,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC,EACrG,CAAC;QACF,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,wBAAwB,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,KAAK,yBAAyB,CAAC,CAAC;IACxF,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,4CAA4C,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACxF,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,oDAAoD,CAAC,CAAC;IACtG,CAAC;IACD,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,KAAK,sBAAsB,CAAC,CAAC;IAC/E,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,iDAAiD,CAAC,CAAC;IACnG,CAAC;IACD,MAAM,gBAAgB,GAAG;QACxB,UAAU,EAAE,0BAA0B;QACtC,SAAS,EAAE,gCAAgC;KAC3C,CAAC;IACF,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,KAAK,sBAAsB,EAAE,gBAAgB,CAAC,CAAC;IACjG,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,KAAK,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;IACpG,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,KAAK,wBAAwB,EAAE,gBAAgB,CAAC,CAAC;IACvG,IACC,CAAC,GAAG,SAAS,EAAE,GAAG,UAAU,EAAE,GAAG,WAAW,CAAC,CAAC,IAAI,CACjD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CACnE,EACA,CAAC;QACF,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,oCAAoC,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,MAAkB,CAAC;IACvB,IAAI,CAAC;QACJ,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,mBAAmB,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,4BAA4B,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;QAC9E,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,wCAAwC,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CACpC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,KAAK,iBAAiB,IAAI,UAAU,KAAK,eAAe,CAClF,CAAC;IACF,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CACrC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,KAAK,kBAAkB,IAAI,UAAU,KAAK,iBAAiB,CACrF,CAAC;IACF,IAAI,WAAW,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,8CAA8C,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,YAAY,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,+CAA+C,CAAC,CAAC;IACjG,CAAC;IACD,OAAO;QACN,YAAY,EAAE,YAAgE;QAC9E,SAAS;QACT,SAAS;QACT,UAAU;QACV,WAAW;QACX,MAAM;KACN,CAAC;AAAA,CACF;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAE,KAAa,EAAkC;IAC5F,IACC,CAAC,aAAa,CAAC,KAAK,CAAC;QACrB,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;QAC1G,KAAK,CAAC,aAAa,KAAK,4BAA4B,EACnD,CAAC;QACF,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,cAAc,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,OAA6B,CAAC;IAClC,IAAI,CAAC;QACJ,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,4BAA4B,CACrC,KAAK,YAAY,yBAAyB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,sBAAsB,CAC3F,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACrC,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,8CAA8C,CAAC,CAAC;IAChG,CAAC;IACD,MAAM,YAAY,GAAG,iBAAiB,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAClE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QACrG,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,gDAAgD,CAAC,CAAC;IAClG,CAAC;IACD,IACC,KAAK,CAAC,IAAI,KAAK,SAAS;QACxB,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,sBAAsB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EACnG,CAAC;QACF,MAAM,IAAI,4BAA4B,CAAC,GAAG,KAAK,mBAAmB,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAClE,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,KAAK,CAAC,gBAAgB,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;IACpF,OAAO;QACN,aAAa,EAAE,4BAA4B;QAC3C,OAAO;QACP,YAAY;QACZ,SAAS;QACT,gBAAgB;QAChB,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/D,CAAC;AAAA,CACF;AAED,MAAM,UAAU,4BAA4B,CAAC,KAAc,EAA2B;IACrF,IACC,CAAC,aAAa,CAAC,KAAK,CAAC;QACrB,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC5D,KAAK,CAAC,aAAa,KAAK,4BAA4B,EACnD,CAAC;QACF,MAAM,IAAI,4BAA4B,CAAC,uCAAuC,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;IAC/E,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ;QAC9B,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,QAAQ,EAAE,oCAAoC,CAAC;QAC5E,CAAC,CAAC,SAAS,CAAC;IACb,IAAI,MAAM,CAAC,OAAO,CAAC,8BAA8B,EAAE,CAAC;QACnD,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,qBAAqB,KAAK,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACtF,MAAM,IAAI,4BAA4B,CAAC,iEAAiE,CAAC,CAAC;QAC3G,CAAC;QACD,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC1C,MAAM,IAAI,4BAA4B,CAAC,qEAAqE,CAAC,CAAC;QAC/G,CAAC;IACF,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,4BAA4B,CAAC,uDAAuD,CAAC,CAAC;IACjG,CAAC;IACD,OAAO;QACN,aAAa,EAAE,4BAA4B;QAC3C,MAAM;QACN,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjC,CAAC;AAAA,CACF;AAED,SAAS,eAAe,CAAC,OAA6B,EAAwB;IAC7E,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,GAAG,OAAO,CAAC;IAC1D,OAAO,eAAe,CAAC,SAAS,CAAyB,CAAC;AAAA,CAC1D;AAED,SAAS,uBAAuB,CAAC,MAMhC,EAAkC;IAClC,OAAO;QACN,aAAa,EAAE,4BAA4B;QAC3C,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC;QACxC,YAAY,EAAE,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC;QAClD,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC;QAC5C,gBAAgB,EAAE,eAAe,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC;QAChE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C,CAAC;AAAA,CACF;AAED,MAAM,UAAU,6BAA6B,CAAC,IAe7C,EAA2B;IAC3B,OAAO,4BAA4B,CAAC;QACnC,aAAa,EAAE,4BAA4B;QAC3C,MAAM,EAAE,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9E,CAAC,CAAC;AAAA,CACH;AAED,MAAM,UAAU,+BAA+B,CAC9C,QAAiC,EACK;IACtC,OAAO,QAAQ,CAAC,QAAQ;QACvB,CAAC,CAAC,4BAA4B,CAAC,EAAE,aAAa,EAAE,4BAA4B,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC1G,CAAC,CAAC,SAAS,CAAC;AAAA,CACb","sourcesContent":["import path from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { hasOnlyKeys, isPlainRecord } from \"../util/value-guards.ts\";\nimport {\n\tisHarnessCapability,\n\tisResourcePointerKind,\n\tMAX_ORCHESTRATION_COLLECTION_LENGTH,\n\tMAX_ORCHESTRATION_IDENTIFIER_LENGTH,\n\tMAX_ORCHESTRATION_MODEL_ID_LENGTH,\n\tMAX_ORCHESTRATION_MODEL_PROVIDER_LENGTH,\n\tMAX_WORKER_AUTHORITY_PATH_LENGTH,\n\tMAX_WORKER_AUTHORITY_PATHS,\n\tMAX_WORKER_RESOURCE_METADATA_NAME_LENGTH,\n\tMAX_WORKER_RESOURCE_PATH_LENGTH,\n\tMAX_WORKER_RESOURCE_POINTERS,\n\tMAX_WORKER_SOUL_LENGTH,\n\tORCHESTRATION_SCHEMA_VERSION,\n\tORCHESTRATION_THINKING_LEVELS,\n\ttype OrchestrationModelBinding,\n\ttype OrchestrationProfile,\n\ttype ResourcePointer,\n\ttype RiskBudget,\n\ttype WorkerExecutionAuthorityContract,\n\ttype WorkerExecutionContract,\n\ttype WorkerProfileExecutionContract,\n} from \"./contracts.ts\";\nimport { OrchestrationProfileError, parseOrchestrationProfile } from \"./profile-registry.ts\";\nimport { intersectRiskBudgets, parseRiskBudget } 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 parseModelBinding(value: unknown, label: string): OrchestrationModelBinding {\n\tif (\n\t\t!isPlainRecord(value) ||\n\t\t!hasOnlyKeys(value, [\"provider\", \"modelId\", \"thinkingLevel\"]) ||\n\t\ttypeof value.provider !== \"string\" ||\n\t\tvalue.provider.length > MAX_ORCHESTRATION_MODEL_PROVIDER_LENGTH ||\n\t\t!value.provider.trim() ||\n\t\ttypeof value.modelId !== \"string\" ||\n\t\tvalue.modelId.length > MAX_ORCHESTRATION_MODEL_ID_LENGTH ||\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(\n\tvalue: unknown,\n\tlabel: string,\n\toptions: { maxEntries?: number; maxLength?: number } = {},\n): string[] {\n\tconst maxEntries = options.maxEntries ?? MAX_ORCHESTRATION_COLLECTION_LENGTH;\n\tconst maxLength = options.maxLength ?? MAX_ORCHESTRATION_IDENTIFIER_LENGTH;\n\tif (\n\t\t!Array.isArray(value) ||\n\t\tvalue.length > maxEntries ||\n\t\t!value.every((entry) => typeof entry === \"string\" && entry.length > 0 && entry.length <= maxLength)\n\t) {\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 parseResourcePointers(value: unknown, label: string): ResourcePointer[] {\n\tif (!Array.isArray(value) || value.length > MAX_WORKER_RESOURCE_POINTERS) {\n\t\tthrow new WorkerExecutionContractError(`${label} resource pointers are invalid.`);\n\t}\n\tconst ids = new Set<string>();\n\treturn value.map((candidate) => {\n\t\tif (\n\t\t\t!isPlainRecord(candidate) ||\n\t\t\t!hasOnlyKeys(candidate, [\"id\", \"kind\", \"uri\", \"readOnly\", \"digest\", \"metadata\"]) ||\n\t\t\ttypeof candidate.id !== \"string\" ||\n\t\t\t!/^(skill|prompt):[a-f0-9]{64}$/i.test(candidate.id) ||\n\t\t\ttypeof candidate.kind !== \"string\" ||\n\t\t\t!isResourcePointerKind(candidate.kind) ||\n\t\t\t(candidate.kind !== \"skill\" && candidate.kind !== \"prompt\") ||\n\t\t\t!candidate.id.startsWith(`${candidate.kind}:`) ||\n\t\t\ttypeof candidate.uri !== \"string\" ||\n\t\t\tcandidate.uri.length === 0 ||\n\t\t\tcandidate.uri.length > MAX_WORKER_RESOURCE_PATH_LENGTH + 16 ||\n\t\t\t!candidate.uri.startsWith(\"file:\") ||\n\t\t\tcandidate.readOnly !== true ||\n\t\t\t(candidate.digest !== undefined &&\n\t\t\t\t(typeof candidate.digest !== \"string\" || !/^[a-f0-9]{64}$/i.test(candidate.digest))) ||\n\t\t\t(candidate.metadata !== undefined &&\n\t\t\t\t(!isPlainRecord(candidate.metadata) ||\n\t\t\t\t\ttypeof candidate.metadata.name !== \"string\" ||\n\t\t\t\t\tcandidate.metadata.name.length === 0 ||\n\t\t\t\t\tcandidate.metadata.name.length > MAX_WORKER_RESOURCE_METADATA_NAME_LENGTH ||\n\t\t\t\t\t!hasOnlyKeys(candidate.metadata, [\"name\"])))\n\t\t) {\n\t\t\tthrow new WorkerExecutionContractError(`${label} resource pointer is invalid.`);\n\t\t}\n\t\tif (ids.has(candidate.id)) {\n\t\t\tthrow new WorkerExecutionContractError(`${label} resource pointers contain duplicates.`);\n\t\t}\n\t\tids.add(candidate.id);\n\t\treturn {\n\t\t\tid: candidate.id,\n\t\t\tkind: candidate.kind,\n\t\t\turi: candidate.uri,\n\t\t\treadOnly: true,\n\t\t\t...(typeof candidate.digest === \"string\" ? { digest: candidate.digest } : {}),\n\t\t\t...(isPlainRecord(candidate.metadata) && typeof candidate.metadata.name === \"string\"\n\t\t\t\t? { metadata: { name: candidate.metadata.name } }\n\t\t\t\t: {}),\n\t\t};\n\t});\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!hasOnlyKeys(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 pathArrayOptions = {\n\t\tmaxEntries: MAX_WORKER_AUTHORITY_PATHS,\n\t\tmaxLength: MAX_WORKER_AUTHORITY_PATH_LENGTH,\n\t};\n\tconst readPaths = stringArray(value.readPaths, `${label} authority readPaths`, pathArrayOptions);\n\tconst writePaths = stringArray(value.writePaths, `${label} authority writePaths`, pathArrayOptions);\n\tconst deniedPaths = stringArray(value.deniedPaths, `${label} authority deniedPaths`, pathArrayOptions);\n\tif (\n\t\t[...readPaths, ...writePaths, ...deniedPaths].some(\n\t\t\t(entry) => !path.isAbsolute(entry) && !path.win32.isAbsolute(entry),\n\t\t)\n\t) {\n\t\tthrow new WorkerExecutionContractError(`${label} authority paths must be absolute.`);\n\t}\n\tlet budget: RiskBudget;\n\ttry {\n\t\tbudget = parseRiskBudget(value.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!hasOnlyKeys(value, [\"schemaVersion\", \"profile\", \"modelBinding\", \"authority\", \"resourcePointers\", \"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 (\n\t\tvalue.soul !== undefined &&\n\t\t(typeof value.soul !== \"string\" || value.soul.length > MAX_WORKER_SOUL_LENGTH || !value.soul.trim())\n\t) {\n\t\tthrow new WorkerExecutionContractError(`${label} soul is invalid.`);\n\t}\n\tconst authority = parseAuthority(value.authority, profile, label);\n\tconst resourcePointers = parseResourcePointers(value.resourcePointers ?? [], label);\n\treturn {\n\t\tschemaVersion: ORCHESTRATION_SCHEMA_VERSION,\n\t\tprofile,\n\t\tmodelBinding,\n\t\tauthority,\n\t\tresourcePointers,\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!hasOnlyKeys(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\tresourcePointers?: readonly ResourcePointer[];\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\tresourcePointers: structuredClone(source.resourcePointers ?? []),\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\tresourcePointers?: readonly ResourcePointer[];\n\t\tsoul?: string;\n\t};\n\tverifier?: {\n\t\tprofile: OrchestrationProfile;\n\t\tmodelBinding: OrchestrationModelBinding;\n\t\tauthority: WorkerExecutionAuthorityContract;\n\t\tresourcePointers?: readonly ResourcePointer[];\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"]}
@@ -1,8 +1,12 @@
1
1
  import type { WorkerClaim } from "../autonomy/contracts.ts";
2
2
  import { type WorkerResultContract } from "./contracts.ts";
3
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: {
4
+ /** Matches the default text-read ceiling while keeping synchronous result capture bounded. */
5
+ export declare const MAX_WORKER_ARTIFACT_HASH_BYTES: number;
6
+ /** A terminal result may report many files; bound their cumulative synchronous reads too. */
7
+ export declare const MAX_WORKER_ARTIFACT_HASH_TOTAL_BYTES: number;
8
+ /** Inputs shared by every worker terminal path before the durable result is committed. */
9
+ export interface CreateWorkerResultContractInput {
6
10
  handle: StartedDelegationAttempt;
7
11
  claim: WorkerClaim;
8
12
  accepted: boolean;
@@ -17,5 +21,7 @@ export declare function createWorkerResultContract(args: {
17
21
  verificationCriterionIds?: readonly string[];
18
22
  reasonCode?: string;
19
23
  createdAt?: string;
20
- }): WorkerResultContract;
24
+ }
25
+ /** Sole host-owned conversion from an untrusted claim to a fenced durable result. */
26
+ export declare function createWorkerResultContract(args: CreateWorkerResultContractInput): WorkerResultContract;
21
27
  //# sourceMappingURL=worker-result-adapter.d.ts.map
@@ -1 +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"]}
1
+ {"version":3,"file":"worker-result-adapter.d.ts","sourceRoot":"","sources":["../../../src/core/orchestration/worker-result-adapter.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D,OAAO,EAIN,KAAK,oBAAoB,EACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAEvE,8FAA8F;AAC9F,eAAO,MAAM,8BAA8B,QAAmB,CAAC;AAC/D,6FAA6F;AAC7F,eAAO,MAAM,oCAAoC,QAAmB,CAAC;AAqOrE,0FAA0F;AAC1F,MAAM,WAAW,+BAA+B;IAC/C,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;AAED,qFAAqF;AACrF,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,+BAA+B,GAAG,oBAAoB,CAqDtG","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { closeSync, fstatSync, lstatSync, openSync, readSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { WorkerClaim } from \"../autonomy/contracts.ts\";\nimport { normalizeWorkerClaimForHost } from \"../delegation/worker-claim.ts\";\nimport { sameFileVersion } from \"../util/bounded-file.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\n/** Matches the default text-read ceiling while keeping synchronous result capture bounded. */\nexport const MAX_WORKER_ARTIFACT_HASH_BYTES = 16 * 1024 * 1024;\n/** A terminal result may report many files; bound their cumulative synchronous reads too. */\nexport const MAX_WORKER_ARTIFACT_HASH_TOTAL_BYTES = 32 * 1024 * 1024;\nconst WORKER_ARTIFACT_HASH_CHUNK_BYTES = 64 * 1024;\n\ntype HostFileState = \"regular\" | \"missing\" | \"non_regular\" | \"read_error\";\n\ninterface ChangedFileArtifactObservation {\n\tartifact: ArtifactContract;\n\tfileState: HostFileState;\n\tdigestBytesCaptured: number;\n}\n\nfunction metadataForFileState(fileState: HostFileState, digestStatus: string): ArtifactContract[\"metadata\"] {\n\treturn {\n\t\thostObservation: \"file_state_captured\",\n\t\tfileState,\n\t\tdigestStatus,\n\t};\n}\n\nfunction artifactForChangedFile(\n\tcwd: string,\n\tchangedPath: string,\n\tindex: number,\n\tcreatedAt: string,\n\tremainingDigestBytes: number,\n): ChangedFileArtifactObservation {\n\tconst absolutePath = path.isAbsolute(changedPath) ? path.resolve(changedPath) : path.resolve(cwd, changedPath);\n\tconst artifactId = `changed-file-${index + 1}`;\n\tconst base = {\n\t\tartifactId,\n\t\tkind: \"file\" as const,\n\t\turi: pathToFileURL(absolutePath).href,\n\t\tcreatedAt,\n\t};\n\tlet initialStats: ReturnType<typeof lstatSync>;\n\ttry {\n\t\tinitialStats = lstatSync(absolutePath);\n\t} catch (error: unknown) {\n\t\tif (isMissingFileError(error)) {\n\t\t\treturn {\n\t\t\t\tartifact: { ...base, metadata: metadataForFileState(\"missing\", \"not_available\") },\n\t\t\t\tfileState: \"missing\",\n\t\t\t\tdigestBytesCaptured: 0,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tartifact: { ...base, metadata: metadataForFileState(\"read_error\", \"not_available\") },\n\t\t\tfileState: \"read_error\",\n\t\t\tdigestBytesCaptured: 0,\n\t\t};\n\t}\n\n\tif (!initialStats.isFile()) {\n\t\treturn {\n\t\t\tartifact: {\n\t\t\t\t...base,\n\t\t\t\tsizeBytes: initialStats.size,\n\t\t\t\tmetadata: metadataForFileState(\"non_regular\", \"not_applicable\"),\n\t\t\t},\n\t\t\tfileState: \"non_regular\",\n\t\t\tdigestBytesCaptured: 0,\n\t\t};\n\t}\n\n\tlet fileDescriptor: number | undefined;\n\ttry {\n\t\tfileDescriptor = openSync(absolutePath, \"r\");\n\t\tconst stats = fstatSync(fileDescriptor);\n\t\tif (!stats.isFile()) {\n\t\t\treturn {\n\t\t\t\tartifact: {\n\t\t\t\t\t...base,\n\t\t\t\t\tsizeBytes: stats.size,\n\t\t\t\t\tmetadata: metadataForFileState(\"non_regular\", \"not_applicable\"),\n\t\t\t\t},\n\t\t\t\tfileState: \"non_regular\",\n\t\t\t\tdigestBytesCaptured: 0,\n\t\t\t};\n\t\t}\n\t\tif (!sameFileVersion(initialStats, stats)) throw new Error(\"File changed before hashing\");\n\t\tif (stats.size > MAX_WORKER_ARTIFACT_HASH_BYTES) {\n\t\t\treturn {\n\t\t\t\tartifact: {\n\t\t\t\t\t...base,\n\t\t\t\t\tsizeBytes: stats.size,\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t...metadataForFileState(\"regular\", \"omitted_size_limit\"),\n\t\t\t\t\t\tdigestMaxBytes: MAX_WORKER_ARTIFACT_HASH_BYTES,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tfileState: \"regular\",\n\t\t\t\tdigestBytesCaptured: 0,\n\t\t\t};\n\t\t}\n\t\tif (stats.size > remainingDigestBytes) {\n\t\t\treturn {\n\t\t\t\tartifact: {\n\t\t\t\t\t...base,\n\t\t\t\t\tsizeBytes: stats.size,\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t...metadataForFileState(\"regular\", \"omitted_aggregate_limit\"),\n\t\t\t\t\t\tdigestTotalMaxBytes: MAX_WORKER_ARTIFACT_HASH_TOTAL_BYTES,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tfileState: \"regular\",\n\t\t\t\tdigestBytesCaptured: 0,\n\t\t\t};\n\t\t}\n\n\t\tconst hash = createHash(\"sha256\");\n\t\tconst buffer = Buffer.allocUnsafe(Math.min(WORKER_ARTIFACT_HASH_CHUNK_BYTES, Math.max(stats.size, 1)));\n\t\tlet bytesHashed = 0;\n\t\twhile (bytesHashed < stats.size) {\n\t\t\tconst bytesRead = readSync(\n\t\t\t\tfileDescriptor,\n\t\t\t\tbuffer,\n\t\t\t\t0,\n\t\t\t\tMath.min(buffer.length, stats.size - bytesHashed),\n\t\t\t\tbytesHashed,\n\t\t\t);\n\t\t\tif (bytesRead === 0) throw new Error(\"File changed while hashing\");\n\t\t\thash.update(buffer.subarray(0, bytesRead));\n\t\t\tbytesHashed += bytesRead;\n\t\t}\n\t\tif (!sameFileVersion(stats, fstatSync(fileDescriptor))) throw new Error(\"File changed while hashing\");\n\t\treturn {\n\t\t\tartifact: {\n\t\t\t\t...base,\n\t\t\t\tdigest: hash.digest(\"hex\"),\n\t\t\t\tsizeBytes: stats.size,\n\t\t\t\tmetadata: {\n\t\t\t\t\t...metadataForFileState(\"regular\", \"computed\"),\n\t\t\t\t\tdigestAlgorithm: \"sha256\",\n\t\t\t\t\tdigestBytes: bytesHashed,\n\t\t\t\t},\n\t\t\t},\n\t\t\tfileState: \"regular\",\n\t\t\tdigestBytesCaptured: bytesHashed,\n\t\t};\n\t} catch {\n\t\treturn {\n\t\t\tartifact: {\n\t\t\t\t...base,\n\t\t\t\tsizeBytes: initialStats.size,\n\t\t\t\tmetadata: metadataForFileState(\"read_error\", \"not_available\"),\n\t\t\t},\n\t\t\tfileState: \"read_error\",\n\t\t\tdigestBytesCaptured: 0,\n\t\t};\n\t} finally {\n\t\tif (fileDescriptor !== undefined) {\n\t\t\ttry {\n\t\t\t\tcloseSync(fileDescriptor);\n\t\t\t} catch {\n\t\t\t\t// The captured state remains valid even if the descriptor close reports an error.\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n\treturn typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\";\n}\n\nfunction hostFileStateEvidence(\n\tobservations: readonly ChangedFileArtifactObservation[],\n\tcreatedAt: string,\n): EvidenceContract[] {\n\treturn observations.map(({ artifact, fileState }, index) => ({\n\t\tevidenceId: `host-file-state-${index + 1}`,\n\t\tkind: \"observation\",\n\t\tsummary: \"Host captured file state.\",\n\t\tartifactIds: [artifact.artifactId],\n\t\ttrusted: true,\n\t\tcreatedAt,\n\t\tmetadata: { observation: \"file_state_captured\", fileState },\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/** Inputs shared by every worker terminal path before the durable result is committed. */\nexport interface CreateWorkerResultContractInput {\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}\n\n/** Sole host-owned conversion from an untrusted claim to a fenced durable result. */\nexport function createWorkerResultContract(args: CreateWorkerResultContractInput): WorkerResultContract {\n\tconst createdAt = args.createdAt ?? new Date().toISOString();\n\t// Result construction is reachable from recovery/error paths as well as the native runner.\n\t// Normalize first so no claim can expand file iteration, hashing, evidence, or durable results.\n\tconst claim = normalizeWorkerClaimForHost(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 changedFileObservations: ChangedFileArtifactObservation[] = [];\n\tlet remainingDigestBytes = MAX_WORKER_ARTIFACT_HASH_TOTAL_BYTES;\n\tfor (const [index, changedPath] of claim.changedFiles.entries()) {\n\t\tconst observation = artifactForChangedFile(args.cwd, changedPath, index, createdAt, remainingDigestBytes);\n\t\tchangedFileObservations.push(observation);\n\t\tremainingDigestBytes -= observation.digestBytesCaptured;\n\t}\n\tconst artifacts = changedFileObservations.map(({ artifact }) => artifact);\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...hostFileStateEvidence(changedFileObservations, 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"]}