@canhta/dsh-autopilot 0.1.0-alpha.1

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 (448) hide show
  1. package/AGENTS.md +41 -0
  2. package/CONTEXT.md +39 -0
  3. package/LICENSE +21 -0
  4. package/README.md +95 -0
  5. package/cordis.patch.yml +13 -0
  6. package/deploy/dsh-autopilot.service +26 -0
  7. package/docs/CONTRIBUTING.md +60 -0
  8. package/docs/README.md +34 -0
  9. package/docs/agents/domain.md +7 -0
  10. package/docs/agents/issue-tracker.md +21 -0
  11. package/docs/agents/triage-labels.md +13 -0
  12. package/docs/assets/banner.png +0 -0
  13. package/docs/deployment.md +138 -0
  14. package/docs/engineering.md +43 -0
  15. package/docs/specs/execution.md +65 -0
  16. package/docs/specs/integrations.md +89 -0
  17. package/docs/specs/lifecycle.md +81 -0
  18. package/docs/specs/operations.md +89 -0
  19. package/docs/specs/plugin.md +49 -0
  20. package/docs/specs/providers.md +62 -0
  21. package/docs/specs/scope.md +35 -0
  22. package/docs/specs/ui-components.md +96 -0
  23. package/docs/specs/web-ui.md +64 -0
  24. package/lib/admission/cancellation-control.d.ts +11 -0
  25. package/lib/admission/cancellation-control.js +72 -0
  26. package/lib/admission/cancellation-control.js.map +1 -0
  27. package/lib/admission/candidates.d.ts +2 -0
  28. package/lib/admission/candidates.js +23 -0
  29. package/lib/admission/candidates.js.map +1 -0
  30. package/lib/admission/composition-claim.d.ts +10 -0
  31. package/lib/admission/composition-claim.js +13 -0
  32. package/lib/admission/composition-claim.js.map +1 -0
  33. package/lib/admission/constants.d.ts +12 -0
  34. package/lib/admission/constants.js +13 -0
  35. package/lib/admission/constants.js.map +1 -0
  36. package/lib/admission/deliveries.d.ts +6 -0
  37. package/lib/admission/deliveries.js +175 -0
  38. package/lib/admission/deliveries.js.map +1 -0
  39. package/lib/admission/delivery-control.d.ts +28 -0
  40. package/lib/admission/delivery-control.js +294 -0
  41. package/lib/admission/delivery-control.js.map +1 -0
  42. package/lib/admission/execution-control.d.ts +29 -0
  43. package/lib/admission/execution-control.js +177 -0
  44. package/lib/admission/execution-control.js.map +1 -0
  45. package/lib/admission/index.d.ts +4 -0
  46. package/lib/admission/index.js +4 -0
  47. package/lib/admission/index.js.map +1 -0
  48. package/lib/admission/model.d.ts +296 -0
  49. package/lib/admission/model.js +13 -0
  50. package/lib/admission/model.js.map +1 -0
  51. package/lib/admission/pause-control.d.ts +44 -0
  52. package/lib/admission/pause-control.js +220 -0
  53. package/lib/admission/pause-control.js.map +1 -0
  54. package/lib/admission/policy.d.ts +39 -0
  55. package/lib/admission/policy.js +238 -0
  56. package/lib/admission/policy.js.map +1 -0
  57. package/lib/admission/ports.d.ts +13 -0
  58. package/lib/admission/ports.js +2 -0
  59. package/lib/admission/ports.js.map +1 -0
  60. package/lib/admission/publication-control.d.ts +16 -0
  61. package/lib/admission/publication-control.js +153 -0
  62. package/lib/admission/publication-control.js.map +1 -0
  63. package/lib/admission/reconciler.d.ts +7 -0
  64. package/lib/admission/reconciler.js +121 -0
  65. package/lib/admission/reconciler.js.map +1 -0
  66. package/lib/admission/resume-control.d.ts +27 -0
  67. package/lib/admission/resume-control.js +213 -0
  68. package/lib/admission/resume-control.js.map +1 -0
  69. package/lib/admission/run-fence.d.ts +11 -0
  70. package/lib/admission/run-fence.js +49 -0
  71. package/lib/admission/run-fence.js.map +1 -0
  72. package/lib/admission/service.d.ts +130 -0
  73. package/lib/admission/service.js +415 -0
  74. package/lib/admission/service.js.map +1 -0
  75. package/lib/admission/state-domain.d.ts +11 -0
  76. package/lib/admission/state-domain.js +33 -0
  77. package/lib/admission/state-domain.js.map +1 -0
  78. package/lib/admission/state-integrity.d.ts +19 -0
  79. package/lib/admission/state-integrity.js +102 -0
  80. package/lib/admission/state-integrity.js.map +1 -0
  81. package/lib/admission/state-migration.d.ts +4 -0
  82. package/lib/admission/state-migration.js +46 -0
  83. package/lib/admission/state-migration.js.map +1 -0
  84. package/lib/admission/state.d.ts +4524 -0
  85. package/lib/admission/state.js +394 -0
  86. package/lib/admission/state.js.map +1 -0
  87. package/lib/admission.d.ts +1 -0
  88. package/lib/admission.js +2 -0
  89. package/lib/admission.js.map +1 -0
  90. package/lib/client-types/client/OperationsAtoms.d.ts +30 -0
  91. package/lib/client-types/client/OperationsPanel.d.ts +34 -0
  92. package/lib/client-types/client/RunsView.d.ts +14 -0
  93. package/lib/client-types/client/SettingsCapabilitySections.d.ts +16 -0
  94. package/lib/client-types/client/SettingsPanel.d.ts +40 -0
  95. package/lib/client-types/client/SettingsPolicySections.d.ts +13 -0
  96. package/lib/client-types/client/SettingsProviderSection.d.ts +21 -0
  97. package/lib/client-types/client/SummaryView.d.ts +10 -0
  98. package/lib/client-types/client/WorktreesView.d.ts +9 -0
  99. package/lib/client-types/client/index.d.ts +9 -0
  100. package/lib/client-types/client/locales/en.d.ts +154 -0
  101. package/lib/client-types/client/locales/index.d.ts +9 -0
  102. package/lib/client-types/client/locales/zh.d.ts +155 -0
  103. package/lib/client-types/client/settings-draft.d.ts +29 -0
  104. package/lib/client-types/client/state.d.ts +63 -0
  105. package/lib/client-types/code-host/index.d.ts +2 -0
  106. package/lib/client-types/code-host/model.d.ts +118 -0
  107. package/lib/client-types/code-host/registry.d.ts +23 -0
  108. package/lib/client-types/code-host/validation.d.ts +51 -0
  109. package/lib/client-types/code-host.d.ts +2 -0
  110. package/lib/client-types/config/index.d.ts +2 -0
  111. package/lib/client-types/config/settings.d.ts +51 -0
  112. package/lib/client-types/config.d.ts +2 -0
  113. package/lib/client-types/notification/index.d.ts +2 -0
  114. package/lib/client-types/notification/model.d.ts +57 -0
  115. package/lib/client-types/notification/registry.d.ts +16 -0
  116. package/lib/client-types/notification.d.ts +2 -0
  117. package/lib/client-types/providers/generation-registry.d.ts +20 -0
  118. package/lib/client-types/remote.d.ts +65 -0
  119. package/lib/client-types/tracker/index.d.ts +2 -0
  120. package/lib/client-types/tracker/model.d.ts +222 -0
  121. package/lib/client-types/tracker/registry.d.ts +49 -0
  122. package/lib/client-types/tracker/validation.d.ts +60 -0
  123. package/lib/client-types/tracker.d.ts +2 -0
  124. package/lib/client-types/web/contract.d.ts +958 -0
  125. package/lib/client.js +7961 -0
  126. package/lib/client.js.map +1 -0
  127. package/lib/code-host/index.d.ts +2 -0
  128. package/lib/code-host/index.js +3 -0
  129. package/lib/code-host/index.js.map +1 -0
  130. package/lib/code-host/model.d.ts +118 -0
  131. package/lib/code-host/model.js +23 -0
  132. package/lib/code-host/model.js.map +1 -0
  133. package/lib/code-host/registry.d.ts +23 -0
  134. package/lib/code-host/registry.js +90 -0
  135. package/lib/code-host/registry.js.map +1 -0
  136. package/lib/code-host/validation.d.ts +51 -0
  137. package/lib/code-host/validation.js +30 -0
  138. package/lib/code-host/validation.js.map +1 -0
  139. package/lib/code-host.d.ts +2 -0
  140. package/lib/code-host.js +3 -0
  141. package/lib/code-host.js.map +1 -0
  142. package/lib/config/index.d.ts +2 -0
  143. package/lib/config/index.js +3 -0
  144. package/lib/config/index.js.map +1 -0
  145. package/lib/config/settings.d.ts +51 -0
  146. package/lib/config/settings.js +195 -0
  147. package/lib/config/settings.js.map +1 -0
  148. package/lib/config.d.ts +2 -0
  149. package/lib/config.js +3 -0
  150. package/lib/config.js.map +1 -0
  151. package/lib/delivery/index.d.ts +1 -0
  152. package/lib/delivery/index.js +2 -0
  153. package/lib/delivery/index.js.map +1 -0
  154. package/lib/delivery/service.d.ts +29 -0
  155. package/lib/delivery/service.js +140 -0
  156. package/lib/delivery/service.js.map +1 -0
  157. package/lib/delivery.d.ts +2 -0
  158. package/lib/delivery.js +3 -0
  159. package/lib/delivery.js.map +1 -0
  160. package/lib/dispatch/composition.d.ts +18 -0
  161. package/lib/dispatch/composition.js +109 -0
  162. package/lib/dispatch/composition.js.map +1 -0
  163. package/lib/dispatch/contract.d.ts +2 -0
  164. package/lib/dispatch/contract.js +2 -0
  165. package/lib/dispatch/contract.js.map +1 -0
  166. package/lib/dispatch/execute.d.ts +10 -0
  167. package/lib/dispatch/execute.js +138 -0
  168. package/lib/dispatch/execute.js.map +1 -0
  169. package/lib/dispatch/execution-state.d.ts +12 -0
  170. package/lib/dispatch/execution-state.js +24 -0
  171. package/lib/dispatch/execution-state.js.map +1 -0
  172. package/lib/dispatch/git.d.ts +5 -0
  173. package/lib/dispatch/git.js +95 -0
  174. package/lib/dispatch/git.js.map +1 -0
  175. package/lib/dispatch/index.d.ts +2 -0
  176. package/lib/dispatch/index.js +2 -0
  177. package/lib/dispatch/index.js.map +1 -0
  178. package/lib/dispatch/report.d.ts +11 -0
  179. package/lib/dispatch/report.js +141 -0
  180. package/lib/dispatch/report.js.map +1 -0
  181. package/lib/dispatch/resume.d.ts +17 -0
  182. package/lib/dispatch/resume.js +89 -0
  183. package/lib/dispatch/resume.js.map +1 -0
  184. package/lib/dispatch/service.d.ts +56 -0
  185. package/lib/dispatch/service.js +231 -0
  186. package/lib/dispatch/service.js.map +1 -0
  187. package/lib/dispatch/usage.d.ts +10 -0
  188. package/lib/dispatch/usage.js +47 -0
  189. package/lib/dispatch/usage.js.map +1 -0
  190. package/lib/dispatch.d.ts +2 -0
  191. package/lib/dispatch.js +3 -0
  192. package/lib/dispatch.js.map +1 -0
  193. package/lib/github-code-host.d.ts +1 -0
  194. package/lib/github-code-host.js +2 -0
  195. package/lib/github-code-host.js.map +1 -0
  196. package/lib/github-issues.d.ts +1 -0
  197. package/lib/github-issues.js +2 -0
  198. package/lib/github-issues.js.map +1 -0
  199. package/lib/index.d.ts +21 -0
  200. package/lib/index.js +48 -0
  201. package/lib/index.js.map +1 -0
  202. package/lib/ingress.d.ts +2 -0
  203. package/lib/ingress.js +3 -0
  204. package/lib/ingress.js.map +1 -0
  205. package/lib/jira.d.ts +1 -0
  206. package/lib/jira.js +2 -0
  207. package/lib/jira.js.map +1 -0
  208. package/lib/mcp/contracts.d.ts +21 -0
  209. package/lib/mcp/contracts.js +33 -0
  210. package/lib/mcp/contracts.js.map +1 -0
  211. package/lib/mcp/cursor.d.ts +10 -0
  212. package/lib/mcp/cursor.js +68 -0
  213. package/lib/mcp/cursor.js.map +1 -0
  214. package/lib/mcp/definition.d.ts +8 -0
  215. package/lib/mcp/definition.js +43 -0
  216. package/lib/mcp/definition.js.map +1 -0
  217. package/lib/mcp/index.d.ts +6 -0
  218. package/lib/mcp/index.js +7 -0
  219. package/lib/mcp/index.js.map +1 -0
  220. package/lib/mcp/json.d.ts +4 -0
  221. package/lib/mcp/json.js +20 -0
  222. package/lib/mcp/json.js.map +1 -0
  223. package/lib/mcp/mount.d.ts +17 -0
  224. package/lib/mcp/mount.js +79 -0
  225. package/lib/mcp/mount.js.map +1 -0
  226. package/lib/mcp/read-tools.d.ts +27 -0
  227. package/lib/mcp/read-tools.js +149 -0
  228. package/lib/mcp/read-tools.js.map +1 -0
  229. package/lib/notification/index.d.ts +2 -0
  230. package/lib/notification/index.js +3 -0
  231. package/lib/notification/index.js.map +1 -0
  232. package/lib/notification/model.d.ts +57 -0
  233. package/lib/notification/model.js +20 -0
  234. package/lib/notification/model.js.map +1 -0
  235. package/lib/notification/registry.d.ts +16 -0
  236. package/lib/notification/registry.js +67 -0
  237. package/lib/notification/registry.js.map +1 -0
  238. package/lib/notification.d.ts +2 -0
  239. package/lib/notification.js +3 -0
  240. package/lib/notification.js.map +1 -0
  241. package/lib/ntfy-notification.d.ts +1 -0
  242. package/lib/ntfy-notification.js +2 -0
  243. package/lib/ntfy-notification.js.map +1 -0
  244. package/lib/operations/cleanup-inspector.d.ts +16 -0
  245. package/lib/operations/cleanup-inspector.js +132 -0
  246. package/lib/operations/cleanup-inspector.js.map +1 -0
  247. package/lib/operations/cleanup.d.ts +25 -0
  248. package/lib/operations/cleanup.js +151 -0
  249. package/lib/operations/cleanup.js.map +1 -0
  250. package/lib/operations/disposition.d.ts +46 -0
  251. package/lib/operations/disposition.js +89 -0
  252. package/lib/operations/disposition.js.map +1 -0
  253. package/lib/operations/health.d.ts +6 -0
  254. package/lib/operations/health.js +41 -0
  255. package/lib/operations/health.js.map +1 -0
  256. package/lib/operations/index.d.ts +6 -0
  257. package/lib/operations/index.js +7 -0
  258. package/lib/operations/index.js.map +1 -0
  259. package/lib/operations/inspection.d.ts +35 -0
  260. package/lib/operations/inspection.js +183 -0
  261. package/lib/operations/inspection.js.map +1 -0
  262. package/lib/operations/model.d.ts +77 -0
  263. package/lib/operations/model.js +2 -0
  264. package/lib/operations/model.js.map +1 -0
  265. package/lib/operations/recovery.d.ts +11 -0
  266. package/lib/operations/recovery.js +101 -0
  267. package/lib/operations/recovery.js.map +1 -0
  268. package/lib/operations/retention.d.ts +28 -0
  269. package/lib/operations/retention.js +105 -0
  270. package/lib/operations/retention.js.map +1 -0
  271. package/lib/operations/runtime-owner.d.ts +54 -0
  272. package/lib/operations/runtime-owner.js +281 -0
  273. package/lib/operations/runtime-owner.js.map +1 -0
  274. package/lib/operations/service.d.ts +55 -0
  275. package/lib/operations/service.js +154 -0
  276. package/lib/operations/service.js.map +1 -0
  277. package/lib/operations/state.d.ts +79 -0
  278. package/lib/operations/state.js +51 -0
  279. package/lib/operations/state.js.map +1 -0
  280. package/lib/operations/storage-composition.d.ts +16 -0
  281. package/lib/operations/storage-composition.js +61 -0
  282. package/lib/operations/storage-composition.js.map +1 -0
  283. package/lib/operations/store.d.ts +16 -0
  284. package/lib/operations/store.js +84 -0
  285. package/lib/operations/store.js.map +1 -0
  286. package/lib/operations.d.ts +2 -0
  287. package/lib/operations.js +3 -0
  288. package/lib/operations.js.map +1 -0
  289. package/lib/providers/generation-registry.d.ts +20 -0
  290. package/lib/providers/generation-registry.js +72 -0
  291. package/lib/providers/generation-registry.js.map +1 -0
  292. package/lib/providers/github-code-host/contracts.d.ts +224 -0
  293. package/lib/providers/github-code-host/contracts.js +144 -0
  294. package/lib/providers/github-code-host/contracts.js.map +1 -0
  295. package/lib/providers/github-code-host/index.d.ts +2 -0
  296. package/lib/providers/github-code-host/index.js +2 -0
  297. package/lib/providers/github-code-host/index.js.map +1 -0
  298. package/lib/providers/github-code-host/provider.d.ts +5 -0
  299. package/lib/providers/github-code-host/provider.js +289 -0
  300. package/lib/providers/github-code-host/provider.js.map +1 -0
  301. package/lib/providers/github-code-host/schemas.d.ts +81 -0
  302. package/lib/providers/github-code-host/schemas.js +39 -0
  303. package/lib/providers/github-code-host/schemas.js.map +1 -0
  304. package/lib/providers/github-code-host/settings.d.ts +16 -0
  305. package/lib/providers/github-code-host/settings.js +65 -0
  306. package/lib/providers/github-code-host/settings.js.map +1 -0
  307. package/lib/providers/github-issues/contracts.d.ts +151 -0
  308. package/lib/providers/github-issues/contracts.js +141 -0
  309. package/lib/providers/github-issues/contracts.js.map +1 -0
  310. package/lib/providers/github-issues/index.d.ts +1 -0
  311. package/lib/providers/github-issues/index.js +2 -0
  312. package/lib/providers/github-issues/index.js.map +1 -0
  313. package/lib/providers/github-issues/ingress.d.ts +8 -0
  314. package/lib/providers/github-issues/ingress.js +80 -0
  315. package/lib/providers/github-issues/ingress.js.map +1 -0
  316. package/lib/providers/github-issues/normalization.d.ts +11 -0
  317. package/lib/providers/github-issues/normalization.js +115 -0
  318. package/lib/providers/github-issues/normalization.js.map +1 -0
  319. package/lib/providers/github-issues/provider.d.ts +6 -0
  320. package/lib/providers/github-issues/provider.js +235 -0
  321. package/lib/providers/github-issues/provider.js.map +1 -0
  322. package/lib/providers/github-issues/schemas.d.ts +123 -0
  323. package/lib/providers/github-issues/schemas.js +58 -0
  324. package/lib/providers/github-issues/schemas.js.map +1 -0
  325. package/lib/providers/github-issues/settings.d.ts +27 -0
  326. package/lib/providers/github-issues/settings.js +154 -0
  327. package/lib/providers/github-issues/settings.js.map +1 -0
  328. package/lib/providers/jira/contracts.d.ts +193 -0
  329. package/lib/providers/jira/contracts.js +133 -0
  330. package/lib/providers/jira/contracts.js.map +1 -0
  331. package/lib/providers/jira/index.d.ts +1 -0
  332. package/lib/providers/jira/index.js +2 -0
  333. package/lib/providers/jira/index.js.map +1 -0
  334. package/lib/providers/jira/ingress.d.ts +4 -0
  335. package/lib/providers/jira/ingress.js +60 -0
  336. package/lib/providers/jira/ingress.js.map +1 -0
  337. package/lib/providers/jira/normalization.d.ts +8 -0
  338. package/lib/providers/jira/normalization.js +121 -0
  339. package/lib/providers/jira/normalization.js.map +1 -0
  340. package/lib/providers/jira/provider.d.ts +6 -0
  341. package/lib/providers/jira/provider.js +317 -0
  342. package/lib/providers/jira/provider.js.map +1 -0
  343. package/lib/providers/jira/schemas.d.ts +134 -0
  344. package/lib/providers/jira/schemas.js +76 -0
  345. package/lib/providers/jira/schemas.js.map +1 -0
  346. package/lib/providers/jira/settings.d.ts +32 -0
  347. package/lib/providers/jira/settings.js +163 -0
  348. package/lib/providers/jira/settings.js.map +1 -0
  349. package/lib/providers/notification-http.d.ts +13 -0
  350. package/lib/providers/notification-http.js +136 -0
  351. package/lib/providers/notification-http.js.map +1 -0
  352. package/lib/providers/ntfy-notification/index.d.ts +2 -0
  353. package/lib/providers/ntfy-notification/index.js +2 -0
  354. package/lib/providers/ntfy-notification/index.js.map +1 -0
  355. package/lib/providers/ntfy-notification/provider.d.ts +4 -0
  356. package/lib/providers/ntfy-notification/provider.js +89 -0
  357. package/lib/providers/ntfy-notification/provider.js.map +1 -0
  358. package/lib/providers/ntfy-notification/settings.d.ts +12 -0
  359. package/lib/providers/ntfy-notification/settings.js +34 -0
  360. package/lib/providers/ntfy-notification/settings.js.map +1 -0
  361. package/lib/providers/webhook-notification/index.d.ts +2 -0
  362. package/lib/providers/webhook-notification/index.js +2 -0
  363. package/lib/providers/webhook-notification/index.js.map +1 -0
  364. package/lib/providers/webhook-notification/provider.d.ts +4 -0
  365. package/lib/providers/webhook-notification/provider.js +57 -0
  366. package/lib/providers/webhook-notification/provider.js.map +1 -0
  367. package/lib/providers/webhook-notification/settings.d.ts +11 -0
  368. package/lib/providers/webhook-notification/settings.js +31 -0
  369. package/lib/providers/webhook-notification/settings.js.map +1 -0
  370. package/lib/publication/git.d.ts +7 -0
  371. package/lib/publication/git.js +154 -0
  372. package/lib/publication/git.js.map +1 -0
  373. package/lib/publication/index.d.ts +1 -0
  374. package/lib/publication/index.js +2 -0
  375. package/lib/publication/index.js.map +1 -0
  376. package/lib/publication/service.d.ts +27 -0
  377. package/lib/publication/service.js +166 -0
  378. package/lib/publication/service.js.map +1 -0
  379. package/lib/publication.d.ts +2 -0
  380. package/lib/publication.js +3 -0
  381. package/lib/publication.js.map +1 -0
  382. package/lib/reconciliation/index.d.ts +3 -0
  383. package/lib/reconciliation/index.js +4 -0
  384. package/lib/reconciliation/index.js.map +1 -0
  385. package/lib/reconciliation/ingress.d.ts +21 -0
  386. package/lib/reconciliation/ingress.js +168 -0
  387. package/lib/reconciliation/ingress.js.map +1 -0
  388. package/lib/reconciliation/service.d.ts +75 -0
  389. package/lib/reconciliation/service.js +228 -0
  390. package/lib/reconciliation/service.js.map +1 -0
  391. package/lib/reconciliation.d.ts +2 -0
  392. package/lib/reconciliation.js +3 -0
  393. package/lib/reconciliation.js.map +1 -0
  394. package/lib/remote.d.ts +65 -0
  395. package/lib/remote.js +135 -0
  396. package/lib/remote.js.map +1 -0
  397. package/lib/tracker/index.d.ts +2 -0
  398. package/lib/tracker/index.js +3 -0
  399. package/lib/tracker/index.js.map +1 -0
  400. package/lib/tracker/model.d.ts +222 -0
  401. package/lib/tracker/model.js +66 -0
  402. package/lib/tracker/model.js.map +1 -0
  403. package/lib/tracker/registry.d.ts +49 -0
  404. package/lib/tracker/registry.js +213 -0
  405. package/lib/tracker/registry.js.map +1 -0
  406. package/lib/tracker/validation.d.ts +60 -0
  407. package/lib/tracker/validation.js +52 -0
  408. package/lib/tracker/validation.js.map +1 -0
  409. package/lib/tracker.d.ts +2 -0
  410. package/lib/tracker.js +3 -0
  411. package/lib/tracker.js.map +1 -0
  412. package/lib/typert.d.ts +1 -0
  413. package/lib/typert.js +2 -0
  414. package/lib/typert.js.map +1 -0
  415. package/lib/web/commands.d.ts +18 -0
  416. package/lib/web/commands.js +231 -0
  417. package/lib/web/commands.js.map +1 -0
  418. package/lib/web/contract.d.ts +958 -0
  419. package/lib/web/contract.js +230 -0
  420. package/lib/web/contract.js.map +1 -0
  421. package/lib/web/contributions.d.ts +41 -0
  422. package/lib/web/contributions.js +61 -0
  423. package/lib/web/contributions.js.map +1 -0
  424. package/lib/web/integrations.d.ts +13 -0
  425. package/lib/web/integrations.js +95 -0
  426. package/lib/web/integrations.js.map +1 -0
  427. package/lib/web/projection.d.ts +10 -0
  428. package/lib/web/projection.js +192 -0
  429. package/lib/web/projection.js.map +1 -0
  430. package/lib/web/service.d.ts +31 -0
  431. package/lib/web/service.js +141 -0
  432. package/lib/web/service.js.map +1 -0
  433. package/lib/web.d.ts +5 -0
  434. package/lib/web.js +6 -0
  435. package/lib/web.js.map +1 -0
  436. package/lib/webhook-notification.d.ts +1 -0
  437. package/lib/webhook-notification.js +2 -0
  438. package/lib/webhook-notification.js.map +1 -0
  439. package/lib/workflow/index.d.ts +1 -0
  440. package/lib/workflow/index.js +2 -0
  441. package/lib/workflow/index.js.map +1 -0
  442. package/lib/workflow/service.d.ts +31 -0
  443. package/lib/workflow/service.js +220 -0
  444. package/lib/workflow/service.js.map +1 -0
  445. package/lib/workflow.d.ts +2 -0
  446. package/lib/workflow.js +3 -0
  447. package/lib/workflow.js.map +1 -0
  448. package/package.json +276 -0
@@ -0,0 +1,294 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { MAX_AUTOMATIC_EXTERNAL_ATTEMPTS, STATE_KEY } from './constants.js';
3
+ import { sanitizeDeliveryError } from './deliveries.js';
4
+ import { boundedExternalRetry } from './policy.js';
5
+ import { stateSchema } from './state.js';
6
+ export class DeliveryControl {
7
+ dependencies;
8
+ constructor(dependencies) {
9
+ this.dependencies = dependencies;
10
+ }
11
+ async claim(deliveryId) {
12
+ const owner = crypto.randomUUID();
13
+ let claimed;
14
+ let superseded;
15
+ await this.dependencies.table().update(STATE_KEY, (current) => {
16
+ const located = locate(current.runs, deliveryId);
17
+ if (located === undefined)
18
+ throw new Error(`delivery "${deliveryId}" does not exist`);
19
+ const { run, delivery } = located;
20
+ if (delivery.kind === 'tracker-projection' && delivery.status === 'retired') {
21
+ throw new SupersededProjectionError(delivery);
22
+ }
23
+ if (delivery.status === 'succeeded' ||
24
+ delivery.status === 'retired' ||
25
+ delivery.status === 'exhausted' ||
26
+ delivery.status === 'permanent-failure') {
27
+ throw new Error(`delivery "${deliveryId}" is not retryable`);
28
+ }
29
+ if (delivery.status === 'in-flight')
30
+ throw new Error(`delivery "${deliveryId}" already has an owner`);
31
+ if (delivery.nextRetryAt !== undefined && Date.parse(delivery.nextRetryAt) > Date.now()) {
32
+ throw new Error(`delivery "${deliveryId}" retry is not due`);
33
+ }
34
+ const next = structuredClone(current);
35
+ const nextRun = next.runs[located.runIndex];
36
+ const nextDelivery = nextRun?.deliveries[located.deliveryIndex];
37
+ if (nextRun === undefined || nextDelivery === undefined)
38
+ throw new Error('delivery disappeared during claim');
39
+ if (nextDelivery.kind === 'tracker-projection') {
40
+ if (isSupersededProjection(current.runs, nextDelivery)) {
41
+ const retired = retireProjection(nextDelivery);
42
+ nextRun.deliveries = nextRun.deliveries.map((candidate, index) => index === located.deliveryIndex ? retired : candidate);
43
+ next.revision += 1;
44
+ superseded = retired;
45
+ return stateSchema.parse(next);
46
+ }
47
+ if (hasOlderInFlightProjection(current.runs, nextDelivery)) {
48
+ throw new Error(`delivery "${deliveryId}" is waiting for an older issue projection to settle`);
49
+ }
50
+ retireOlderProjections(next.runs, nextDelivery);
51
+ }
52
+ const claimRun = next.runs[located.runIndex];
53
+ const claimDelivery = claimRun?.deliveries[located.deliveryIndex];
54
+ if (claimRun === undefined || claimDelivery === undefined)
55
+ throw new Error('delivery disappeared before claim');
56
+ const updated = {
57
+ ...claimDelivery,
58
+ revision: claimDelivery.revision + 1,
59
+ status: 'in-flight',
60
+ attempts: claimDelivery.attempts + 1,
61
+ owner,
62
+ nextRetryAt: undefined,
63
+ exhaustedFrom: undefined,
64
+ lastError: undefined,
65
+ };
66
+ claimRun.deliveries = claimRun.deliveries.map((candidate, index) => index === located.deliveryIndex ? updated : candidate);
67
+ next.revision += 1;
68
+ stateSchema.parse(next);
69
+ claimed = { runId: run.runId, delivery: updated, owner };
70
+ return next;
71
+ });
72
+ if (superseded !== undefined)
73
+ throw new SupersededProjectionError(superseded);
74
+ if (claimed === undefined)
75
+ throw new Error(`delivery "${deliveryId}" was not claimed`);
76
+ return structuredClone(claimed);
77
+ }
78
+ assertOwner(runId, deliveryId, owner) {
79
+ const run = this.dependencies.state().runs.find((candidate) => candidate.runId === runId);
80
+ const delivery = run?.deliveries.find((candidate) => candidate.id === deliveryId);
81
+ if (delivery?.status !== 'in-flight' || delivery.owner !== owner) {
82
+ throw new Error(`delivery "${deliveryId}" owner is retired`);
83
+ }
84
+ }
85
+ succeed(runId, deliveryId, owner, receipt) {
86
+ return this.updateOwned(runId, deliveryId, owner, (delivery) => ({
87
+ ...delivery,
88
+ revision: delivery.revision + 1,
89
+ status: 'succeeded',
90
+ owner: undefined,
91
+ receiptId: receipt.receiptId,
92
+ receivedAt: receipt.receivedAt,
93
+ }));
94
+ }
95
+ fail(runId, deliveryId, owner, error, status, retryAfterMs) {
96
+ return this.updateOwned(runId, deliveryId, owner, (delivery) => {
97
+ const exhausted = status !== 'permanent-failure' && delivery.attempts >= MAX_AUTOMATIC_EXTERNAL_ATTEMPTS;
98
+ return {
99
+ ...delivery,
100
+ revision: delivery.revision + 1,
101
+ status: exhausted ? 'exhausted' : status,
102
+ owner: undefined,
103
+ lastError: sanitizeDeliveryError(error),
104
+ nextRetryAt: !exhausted && status === 'retryable-failure'
105
+ ? new Date(Date.now() + boundedExternalRetry(retryAfterMs, delivery.attempts)).toISOString()
106
+ : undefined,
107
+ exhaustedFrom: exhausted ? status : undefined,
108
+ };
109
+ });
110
+ }
111
+ async retry(deliveryId) {
112
+ let updated;
113
+ await this.dependencies.table().update(STATE_KEY, (current) => {
114
+ const located = locate(current.runs, deliveryId);
115
+ if (located === undefined)
116
+ throw new Error(`delivery "${deliveryId}" does not exist`);
117
+ if (located.delivery.status === 'succeeded' || located.delivery.status === 'retired') {
118
+ throw new Error(`delivery "${deliveryId}" cannot be retried`);
119
+ }
120
+ if (located.delivery.status === 'in-flight')
121
+ throw new Error(`delivery "${deliveryId}" already has an owner`);
122
+ const next = structuredClone(current);
123
+ const nextRun = next.runs[located.runIndex];
124
+ if (nextRun === undefined)
125
+ throw new Error('delivery run disappeared during retry');
126
+ updated = {
127
+ ...located.delivery,
128
+ revision: located.delivery.revision + 1,
129
+ status: 'pending',
130
+ nextRetryAt: undefined,
131
+ exhaustedFrom: undefined,
132
+ lastError: undefined,
133
+ };
134
+ nextRun.deliveries = nextRun.deliveries.map((candidate, index) => index === located.deliveryIndex ? updated : candidate);
135
+ next.revision += 1;
136
+ return stateSchema.parse(next);
137
+ });
138
+ if (updated === undefined)
139
+ throw new Error(`delivery "${deliveryId}" retry was not committed`);
140
+ return structuredClone(updated);
141
+ }
142
+ /** Retire one failed mutable projection and atomically persist a revisioned replacement for current lifecycle state. */
143
+ async repairProjection(deliveryId) {
144
+ let replacement;
145
+ await this.dependencies.table().update(STATE_KEY, (current) => {
146
+ const located = locate(current.runs, deliveryId);
147
+ if (located?.delivery.kind !== 'tracker-projection') {
148
+ throw new Error(`delivery "${deliveryId}" is not a tracker projection`);
149
+ }
150
+ if (!['permanent-failure', 'retryable-failure', 'exhausted'].includes(located.delivery.status)) {
151
+ throw new Error(`delivery "${deliveryId}" is not a settled failed projection`);
152
+ }
153
+ const target = located.delivery;
154
+ const issueProjections = current.runs.flatMap((run) => run.deliveries.filter((candidate) => candidate.kind === 'tracker-projection' && sameProjectionTarget(candidate, target)));
155
+ if (issueProjections.some((candidate) => candidate.status === 'in-flight') ||
156
+ issueProjections.some((candidate) => candidate.payload.runRevision > target.payload.runRevision)) {
157
+ throw new Error(`delivery "${deliveryId}" was superseded or still has an in-flight issue projection`);
158
+ }
159
+ const next = structuredClone(current);
160
+ const run = next.runs[located.runIndex];
161
+ const obsolete = run?.deliveries[located.deliveryIndex];
162
+ if (run === undefined || obsolete?.kind !== 'tracker-projection') {
163
+ throw new Error('tracker projection disappeared during repair');
164
+ }
165
+ const desiredState = projectionStateFor(run.state);
166
+ const trackerDeliveryId = `tracker:${createHash('sha256')
167
+ .update(`${obsolete.payload.deliveryId}\0repair\0${String(current.revision + 1)}`)
168
+ .digest('hex')
169
+ .slice(0, 40)}`;
170
+ replacement = {
171
+ id: `delivery:${createHash('sha256').update(trackerDeliveryId).digest('hex').slice(0, 40)}`,
172
+ eventId: obsolete.eventId,
173
+ revision: 1,
174
+ status: 'pending',
175
+ attempts: 0,
176
+ kind: 'tracker-projection',
177
+ providerId: obsolete.providerId,
178
+ payload: {
179
+ ...obsolete.payload,
180
+ deliveryId: trackerDeliveryId,
181
+ runRevision: current.revision + 1,
182
+ desiredState,
183
+ },
184
+ };
185
+ run.deliveries = run.deliveries.map((candidate, index) => index === located.deliveryIndex
186
+ ? {
187
+ ...obsolete,
188
+ revision: obsolete.revision + 1,
189
+ status: 'retired',
190
+ nextRetryAt: undefined,
191
+ exhaustedFrom: undefined,
192
+ }
193
+ : candidate);
194
+ run.deliveries.push(replacement);
195
+ next.revision += 1;
196
+ return stateSchema.parse(next);
197
+ });
198
+ if (replacement === undefined)
199
+ throw new Error(`delivery "${deliveryId}" repair was not committed`);
200
+ return structuredClone(replacement);
201
+ }
202
+ async updateOwned(runId, deliveryId, owner, mutate) {
203
+ let updated;
204
+ await this.dependencies.table().update(STATE_KEY, (current) => {
205
+ const next = structuredClone(current);
206
+ const run = next.runs.find((candidate) => candidate.runId === runId);
207
+ const index = run?.deliveries.findIndex((candidate) => candidate.id === deliveryId) ?? -1;
208
+ const delivery = run?.deliveries[index];
209
+ if (run === undefined || delivery?.status !== 'in-flight' || delivery.owner !== owner) {
210
+ throw new Error(`delivery "${deliveryId}" owner is retired`);
211
+ }
212
+ updated = mutate(delivery);
213
+ run.deliveries = run.deliveries.map((candidate, candidateIndex) => candidateIndex === index ? updated : candidate);
214
+ next.revision += 1;
215
+ return stateSchema.parse(next);
216
+ });
217
+ if (updated === undefined)
218
+ throw new Error(`delivery "${deliveryId}" update was not committed`);
219
+ return structuredClone(updated);
220
+ }
221
+ }
222
+ export class SupersededProjectionError extends Error {
223
+ delivery;
224
+ constructor(delivery) {
225
+ super(`delivery "${delivery.id}" was superseded before dispatch`);
226
+ this.delivery = delivery;
227
+ this.name = 'SupersededProjectionError';
228
+ }
229
+ }
230
+ function isSupersededProjection(runs, target) {
231
+ return runs.some((run) => run.deliveries.some((candidate) => candidate.kind === 'tracker-projection' &&
232
+ candidate.id !== target.id &&
233
+ sameProjectionTarget(candidate, target) &&
234
+ candidate.payload.runRevision > target.payload.runRevision));
235
+ }
236
+ function hasOlderInFlightProjection(runs, target) {
237
+ return runs.some((run) => run.deliveries.some((candidate) => candidate.kind === 'tracker-projection' &&
238
+ candidate.id !== target.id &&
239
+ sameProjectionTarget(candidate, target) &&
240
+ candidate.payload.runRevision < target.payload.runRevision &&
241
+ candidate.status === 'in-flight'));
242
+ }
243
+ function retireOlderProjections(runs, target) {
244
+ for (const [index, run] of runs.entries()) {
245
+ runs[index] = {
246
+ ...run,
247
+ deliveries: run.deliveries.map((candidate) => candidate.kind === 'tracker-projection' &&
248
+ sameProjectionTarget(candidate, target) &&
249
+ candidate.payload.runRevision < target.payload.runRevision &&
250
+ !['succeeded', 'retired'].includes(candidate.status)
251
+ ? retireProjection(candidate)
252
+ : candidate),
253
+ };
254
+ }
255
+ }
256
+ function retireProjection(projection) {
257
+ const { exhaustedFrom: _exhaustedFrom, lastError: _lastError, nextRetryAt: _nextRetryAt, owner: _owner, ...retained } = projection;
258
+ return { ...retained, revision: projection.revision + 1, status: 'retired' };
259
+ }
260
+ function sameProjectionTarget(left, right) {
261
+ return (left.providerId === right.providerId &&
262
+ left.payload.bindingId === right.payload.bindingId &&
263
+ left.payload.issueId === right.payload.issueId);
264
+ }
265
+ function projectionStateFor(state) {
266
+ switch (state) {
267
+ case 'queued':
268
+ return 'queued';
269
+ case 'implementing':
270
+ case 'pausing':
271
+ case 'publishing':
272
+ return 'implementing';
273
+ case 'paused':
274
+ return 'paused';
275
+ case 'blocked':
276
+ return 'blocked';
277
+ case 'failed':
278
+ return 'failed';
279
+ case 'completed':
280
+ return 'completed';
281
+ case 'cancelled':
282
+ throw new Error('cancelled runs have no default tracker projection');
283
+ }
284
+ }
285
+ function locate(runs, deliveryId) {
286
+ for (const [runIndex, run] of runs.entries()) {
287
+ const deliveryIndex = run.deliveries.findIndex((candidate) => candidate.id === deliveryId);
288
+ const delivery = run.deliveries[deliveryIndex];
289
+ if (delivery !== undefined)
290
+ return { run, delivery, runIndex, deliveryIndex };
291
+ }
292
+ return undefined;
293
+ }
294
+ //# sourceMappingURL=delivery-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-control.js","sourceRoot":"","sources":["../../src/admission/delivery-control.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { AgentExecutionComposition, ExecutionOutcome, GitExecutionSnapshot, ImplementingRun, PausingRun, RunId, RunUsageSettlement, TerminalRun } from './model.js';
2
+ import type { AdmissionDependencies } from './ports.js';
3
+ export declare class ExecutionControl {
4
+ private readonly dependencies;
5
+ constructor(dependencies: AdmissionDependencies);
6
+ /**
7
+ * Atomically claim the highest-priority queued run and reserve its configured allowance.
8
+ * Returns undefined when the scheduler is not enabled or the queue is empty. Otherwise, explicit execution paths,
9
+ * positive caps, and the selected native DSH composition are required. The claim stores immutable
10
+ * run/Session/worktree/composition identities and its reservation
11
+ * together; disabled execution, uncertain usage, insufficient capacity, invalid configuration, or durable-write
12
+ * failure rejects without a partial claim. The method accepts no cancellation signal and does not start external work.
13
+ */
14
+ claimNext(agent: AgentExecutionComposition, expectedRunId?: RunId): Promise<ImplementingRun | undefined>;
15
+ /**
16
+ * Persist exact Git facts for an implementing or pausing run before Agent creation and again after execution.
17
+ * The run must exist, remain allocated, and not require recovery. Invalid evidence or durable-write failure
18
+ * rejects without changing the prior snapshot. The atomic record update accepts no cancellation signal.
19
+ */
20
+ recordWorktree(runId: RunId, git: GitExecutionSnapshot): Promise<ImplementingRun | PausingRun>;
21
+ /**
22
+ * Atomically transition an implementing run to its structured terminal state and settle its reservation.
23
+ * Verified outcomes require recorded Git facts. Known usage within both retained limits releases the reservation and
24
+ * increments settled usage; missing, invalid, or excessive usage produces a failed outcome, retains the obligation,
25
+ * and stops later authorization. Validation or durable-write failure leaves the prior snapshot unchanged. The method
26
+ * accepts no cancellation signal.
27
+ */
28
+ settle(runId: RunId, outcome: ExecutionOutcome, usage: RunUsageSettlement): Promise<TerminalRun>;
29
+ }
@@ -0,0 +1,177 @@
1
+ import { codeHostProviderId } from '../code-host.js';
2
+ import { validateExecutionSettings } from '../config.js';
3
+ import { MAX_OUTCOME_TEXT_BYTES, STATE_KEY } from './constants.js';
4
+ import { appendLifecycleDeliveries, publicationIntent } from './deliveries.js';
5
+ import { assertStateSize, compareQueuedRuns, executionFor, truncateUtf8, usageUncertaintyReason, validUsageSettlement, } from './policy.js';
6
+ import { executionSchema, outcomeSchema, stateSchema } from './state.js';
7
+ export class ExecutionControl {
8
+ dependencies;
9
+ constructor(dependencies) {
10
+ this.dependencies = dependencies;
11
+ }
12
+ /**
13
+ * Atomically claim the highest-priority queued run and reserve its configured allowance.
14
+ * Returns undefined when the scheduler is not enabled or the queue is empty. Otherwise, explicit execution paths,
15
+ * positive caps, and the selected native DSH composition are required. The claim stores immutable
16
+ * run/Session/worktree/composition identities and its reservation
17
+ * together; disabled execution, uncertain usage, insufficient capacity, invalid configuration, or durable-write
18
+ * failure rejects without a partial claim. The method accepts no cancellation signal and does not start external work.
19
+ */
20
+ async claimNext(agent, expectedRunId) {
21
+ const settings = this.dependencies.settings();
22
+ let claimed;
23
+ await this.dependencies.table().update(STATE_KEY, (current) => {
24
+ if (current.scheduler.mode !== 'enabled')
25
+ return current;
26
+ validateExecutionSettings(settings);
27
+ if (current.budget.usageUncertain) {
28
+ throw new Error('deployment token usage is uncertain; reconcile it before dispatch');
29
+ }
30
+ const queued = current.runs.filter((run) => run.state === 'queued').sort(compareQueuedRuns)[0];
31
+ if (queued === undefined)
32
+ return current;
33
+ if (expectedRunId !== undefined && queued.runId !== expectedRunId)
34
+ return current;
35
+ const codeHost = this.dependencies.codeHost;
36
+ if (codeHost === undefined)
37
+ throw new Error('code-host binding registry is unavailable');
38
+ const codeHostBinding = codeHost.binding(codeHostProviderId(settings.codeHostProvider));
39
+ if (current.budget.settledTokens + current.budget.reservedTokens + settings.runTokenAllowance >
40
+ settings.deploymentTokenCap) {
41
+ throw new Error('deployment token cap cannot cover the configured run allowance');
42
+ }
43
+ const next = structuredClone(current);
44
+ const index = next.runs.findIndex((run) => run.runId === queued.runId);
45
+ if (index < 0)
46
+ throw new Error('queued run disappeared during its atomic claim');
47
+ const claimedWithoutDeliveries = {
48
+ ...queued,
49
+ state: 'implementing',
50
+ execution: executionFor(queued, settings, codeHostBinding, agent),
51
+ budget: {
52
+ capTokens: settings.perRunTokenCap,
53
+ allowanceTokens: settings.runTokenAllowance,
54
+ reservedTokens: settings.runTokenAllowance,
55
+ settledTokens: 0,
56
+ usageUncertain: false,
57
+ },
58
+ };
59
+ claimed = {
60
+ ...claimedWithoutDeliveries,
61
+ deliveries: appendLifecycleDeliveries(claimedWithoutDeliveries, settings, 'started', current.revision + 1, claimedWithoutDeliveries.execution.startedAt),
62
+ };
63
+ next.runs[index] = claimed;
64
+ next.budget.reservedTokens += settings.runTokenAllowance;
65
+ next.revision += 1;
66
+ const parsed = stateSchema.parse(next);
67
+ assertStateSize(parsed);
68
+ return parsed;
69
+ });
70
+ return claimed === undefined ? undefined : structuredClone(claimed);
71
+ }
72
+ /**
73
+ * Persist exact Git facts for an implementing or pausing run before Agent creation and again after execution.
74
+ * The run must exist, remain allocated, and not require recovery. Invalid evidence or durable-write failure
75
+ * rejects without changing the prior snapshot. The atomic record update accepts no cancellation signal.
76
+ */
77
+ async recordWorktree(runId, git) {
78
+ const parsedGit = executionSchema.shape.git.unwrap().parse(git);
79
+ let recorded;
80
+ await this.dependencies.table().update(STATE_KEY, (current) => {
81
+ const next = structuredClone(current);
82
+ const index = next.runs.findIndex((run) => run.runId === runId);
83
+ const run = next.runs[index];
84
+ if (run?.state !== 'implementing' && run?.state !== 'pausing') {
85
+ throw new Error(`run "${runId}" is not implementing or pausing`);
86
+ }
87
+ if (run.execution.recovery !== undefined)
88
+ throw new Error(`run "${runId}" requires explicit recovery`);
89
+ const nextRun = {
90
+ ...run,
91
+ execution: { ...run.execution, git: parsedGit },
92
+ };
93
+ recorded = nextRun;
94
+ next.runs[index] = nextRun;
95
+ next.revision += 1;
96
+ return stateSchema.parse(next);
97
+ });
98
+ if (recorded === undefined)
99
+ throw new Error(`run "${runId}" worktree facts were not recorded`);
100
+ return structuredClone(recorded);
101
+ }
102
+ /**
103
+ * Atomically transition an implementing run to its structured terminal state and settle its reservation.
104
+ * Verified outcomes require recorded Git facts. Known usage within both retained limits releases the reservation and
105
+ * increments settled usage; missing, invalid, or excessive usage produces a failed outcome, retains the obligation,
106
+ * and stops later authorization. Validation or durable-write failure leaves the prior snapshot unchanged. The method
107
+ * accepts no cancellation signal.
108
+ */
109
+ async settle(runId, outcome, usage) {
110
+ const parsedOutcome = outcomeSchema.parse(outcome);
111
+ let settled;
112
+ await this.dependencies.table().update(STATE_KEY, (current) => {
113
+ const next = structuredClone(current);
114
+ const index = next.runs.findIndex((run) => run.runId === runId);
115
+ const run = next.runs[index];
116
+ if (run?.state !== 'implementing')
117
+ throw new Error(`run "${runId}" is not implementing`);
118
+ if (run.execution.git === undefined && parsedOutcome.kind === 'verified') {
119
+ throw new Error(`verified run "${runId}" has no recorded worktree facts`);
120
+ }
121
+ const usageKnown = validUsageSettlement(run, usage);
122
+ const reservedTokens = usageKnown ? 0 : run.budget.reservedTokens;
123
+ const settledTokens = usageKnown ? run.budget.settledTokens + usage.tokens : run.budget.settledTokens;
124
+ const terminalOutcome = usageKnown
125
+ ? parsedOutcome
126
+ : {
127
+ kind: 'failed',
128
+ summary: 'Provider token usage could not be settled safely.',
129
+ evidence: [
130
+ usage.kind === 'uncertain'
131
+ ? truncateUtf8(usage.reason, MAX_OUTCOME_TEXT_BYTES) ||
132
+ 'provider did not supply a usage uncertainty reason'
133
+ : 'reported usage exceeded the reserved allowance',
134
+ ],
135
+ };
136
+ const settledWithoutDeliveries = {
137
+ ...run,
138
+ state: terminalOutcome.kind === 'verified' ? 'publishing' : terminalOutcome.kind,
139
+ execution: structuredClone(run.execution),
140
+ budget: {
141
+ ...run.budget,
142
+ reservedTokens,
143
+ settledTokens,
144
+ usageUncertain: !usageKnown,
145
+ ...(usageKnown ? {} : { usageUncertaintyReason: usageUncertaintyReason(run, usage) }),
146
+ },
147
+ outcome: terminalOutcome,
148
+ completedAt: new Date().toISOString(),
149
+ deliveries: run.deliveries,
150
+ };
151
+ const settledWithoutPublication = terminalOutcome.kind === 'verified'
152
+ ? settledWithoutDeliveries
153
+ : {
154
+ ...settledWithoutDeliveries,
155
+ deliveries: appendLifecycleDeliveries(settledWithoutDeliveries, this.dependencies.settings(), terminalOutcome.kind, current.revision + 1, new Date().toISOString()),
156
+ };
157
+ const terminalRun = terminalOutcome.kind === 'verified'
158
+ ? { ...settledWithoutPublication, publication: publicationIntent(settledWithoutPublication) }
159
+ : settledWithoutPublication;
160
+ settled = terminalRun;
161
+ next.runs[index] = terminalRun;
162
+ if (usageKnown) {
163
+ next.budget.reservedTokens -= run.budget.reservedTokens;
164
+ next.budget.settledTokens += usage.tokens;
165
+ }
166
+ else {
167
+ next.budget.usageUncertain = true;
168
+ }
169
+ next.revision += 1;
170
+ return stateSchema.parse(next);
171
+ });
172
+ if (settled === undefined)
173
+ throw new Error(`run "${runId}" was not settled`);
174
+ return structuredClone(settled);
175
+ }
176
+ }
177
+ //# sourceMappingURL=execution-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-control.js","sourceRoot":"","sources":["../../src/admission/execution-control.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './model.js';
2
+ export * from './run-fence.js';
3
+ export * from './service.js';
4
+ export type { OperatorCommandKind, OperatorCommandRecord } from './state.js';
@@ -0,0 +1,4 @@
1
+ export * from './model.js';
2
+ export * from './run-fence.js';
3
+ export * from './service.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admission/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA"}