@12ui/design 0.2.71 → 0.2.73

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 (680) hide show
  1. package/README.md +248 -55
  2. package/SKILL.md +28 -33
  3. package/dist/cli-arguments.d.ts.map +1 -1
  4. package/dist/cli-arguments.js +3 -0
  5. package/dist/cli-arguments.js.map +1 -1
  6. package/dist/cli-branch-command.d.ts.map +1 -1
  7. package/dist/cli-branch-command.js +4 -0
  8. package/dist/cli-branch-command.js.map +1 -1
  9. package/dist/cli-capabilities.d.ts +35 -1
  10. package/dist/cli-capabilities.d.ts.map +1 -1
  11. package/dist/cli-capabilities.js +36 -1
  12. package/dist/cli-capabilities.js.map +1 -1
  13. package/dist/cli-corpus-command.d.ts +5 -4
  14. package/dist/cli-corpus-command.d.ts.map +1 -1
  15. package/dist/cli-corpus-command.js +17 -26
  16. package/dist/cli-corpus-command.js.map +1 -1
  17. package/dist/cli-corpus-run.js +1 -1
  18. package/dist/cli-corpus-run.js.map +1 -1
  19. package/dist/cli-draft-command.js +1 -1
  20. package/dist/cli-draft-command.js.map +1 -1
  21. package/dist/cli-help/design.d.ts +26 -6
  22. package/dist/cli-help/design.d.ts.map +1 -1
  23. package/dist/cli-help/design.js +39 -7
  24. package/dist/cli-help/design.js.map +1 -1
  25. package/dist/cli-help/index.d.ts +206 -7
  26. package/dist/cli-help/index.d.ts.map +1 -1
  27. package/dist/cli-help/index.js +4 -0
  28. package/dist/cli-help/index.js.map +1 -1
  29. package/dist/cli-help/meta.d.ts +1 -1
  30. package/dist/cli-help/meta.d.ts.map +1 -1
  31. package/dist/cli-help/meta.js +2 -1
  32. package/dist/cli-help/meta.js.map +1 -1
  33. package/dist/cli-help/scene.d.ts +96 -0
  34. package/dist/cli-help/scene.d.ts.map +1 -0
  35. package/dist/cli-help/scene.js +162 -0
  36. package/dist/cli-help/scene.js.map +1 -0
  37. package/dist/cli-help/workflow.d.ts +90 -0
  38. package/dist/cli-help/workflow.d.ts.map +1 -0
  39. package/dist/cli-help/workflow.js +89 -0
  40. package/dist/cli-help/workflow.js.map +1 -0
  41. package/dist/cli-open-browser.d.ts +7 -0
  42. package/dist/cli-open-browser.d.ts.map +1 -0
  43. package/dist/cli-open-browser.js +25 -0
  44. package/dist/cli-open-browser.js.map +1 -0
  45. package/dist/cli-prototype-command.d.ts +3 -1
  46. package/dist/cli-prototype-command.d.ts.map +1 -1
  47. package/dist/cli-prototype-command.js +33 -7
  48. package/dist/cli-prototype-command.js.map +1 -1
  49. package/dist/cli-review-command.d.ts.map +1 -1
  50. package/dist/cli-review-command.js +1 -16
  51. package/dist/cli-review-command.js.map +1 -1
  52. package/dist/cli-run.d.ts.map +1 -1
  53. package/dist/cli-run.js +41 -3
  54. package/dist/cli-run.js.map +1 -1
  55. package/dist/cli-scene-command.d.ts +3 -0
  56. package/dist/cli-scene-command.d.ts.map +1 -0
  57. package/dist/cli-scene-command.js +292 -0
  58. package/dist/cli-scene-command.js.map +1 -0
  59. package/dist/cli-usage.d.ts +8 -0
  60. package/dist/cli-usage.d.ts.map +1 -1
  61. package/dist/cli-usage.js +65 -6
  62. package/dist/cli-usage.js.map +1 -1
  63. package/dist/cli-workflow-command.d.ts +8 -0
  64. package/dist/cli-workflow-command.d.ts.map +1 -0
  65. package/dist/cli-workflow-command.js +97 -0
  66. package/dist/cli-workflow-command.js.map +1 -0
  67. package/dist/cli-workspace-command.d.ts +25 -0
  68. package/dist/cli-workspace-command.d.ts.map +1 -0
  69. package/dist/cli-workspace-command.js +95 -0
  70. package/dist/cli-workspace-command.js.map +1 -0
  71. package/dist/config.d.ts +6 -0
  72. package/dist/config.d.ts.map +1 -1
  73. package/dist/config.js +12 -4
  74. package/dist/config.js.map +1 -1
  75. package/dist/corpus-access.d.ts +11 -0
  76. package/dist/corpus-access.d.ts.map +1 -0
  77. package/dist/corpus-access.js +18 -0
  78. package/dist/corpus-access.js.map +1 -0
  79. package/dist/corpus-client.d.ts +11 -11
  80. package/dist/corpus-client.d.ts.map +1 -1
  81. package/dist/corpus-client.js +17 -6
  82. package/dist/corpus-client.js.map +1 -1
  83. package/dist/corpus-inspiration-failure.d.ts +1 -1
  84. package/dist/corpus-inspiration-failure.js +2 -2
  85. package/dist/corpus-inspiration-failure.js.map +1 -1
  86. package/dist/corpus-reference-download-retry.d.ts.map +1 -1
  87. package/dist/corpus-reference-download-retry.js +11 -1
  88. package/dist/corpus-reference-download-retry.js.map +1 -1
  89. package/dist/corpus-request-error.d.ts +2 -0
  90. package/dist/corpus-request-error.d.ts.map +1 -1
  91. package/dist/corpus-request-error.js +2 -0
  92. package/dist/corpus-request-error.js.map +1 -1
  93. package/dist/corpus-retry-guidance.d.ts +5 -0
  94. package/dist/corpus-retry-guidance.d.ts.map +1 -0
  95. package/dist/corpus-retry-guidance.js +18 -0
  96. package/dist/corpus-retry-guidance.js.map +1 -0
  97. package/dist/improve-pricing-plan.d.ts.map +1 -1
  98. package/dist/improve-pricing-plan.js +2 -4
  99. package/dist/improve-pricing-plan.js.map +1 -1
  100. package/dist/index.d.ts +10 -1
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js +10 -1
  103. package/dist/index.js.map +1 -1
  104. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  105. package/dist/legacy-skill-catalog.js +52 -0
  106. package/dist/legacy-skill-catalog.js.map +1 -1
  107. package/dist/mcp-slate-command.d.ts +31 -0
  108. package/dist/mcp-slate-command.d.ts.map +1 -0
  109. package/dist/mcp-slate-command.js +118 -0
  110. package/dist/mcp-slate-command.js.map +1 -0
  111. package/dist/mcp-slate-image.d.ts +22 -0
  112. package/dist/mcp-slate-image.d.ts.map +1 -0
  113. package/dist/mcp-slate-image.js +28 -0
  114. package/dist/mcp-slate-image.js.map +1 -0
  115. package/dist/mcp-slate-latest.d.ts +13 -0
  116. package/dist/mcp-slate-latest.d.ts.map +1 -0
  117. package/dist/mcp-slate-latest.js +34 -0
  118. package/dist/mcp-slate-latest.js.map +1 -0
  119. package/dist/mcp-slate-names.d.ts +25 -0
  120. package/dist/mcp-slate-names.d.ts.map +1 -0
  121. package/dist/mcp-slate-names.js +49 -0
  122. package/dist/mcp-slate-names.js.map +1 -0
  123. package/dist/mcp-slate-resource.d.ts +5 -0
  124. package/dist/mcp-slate-resource.d.ts.map +1 -0
  125. package/dist/mcp-slate-resource.js +37 -0
  126. package/dist/mcp-slate-resource.js.map +1 -0
  127. package/dist/mcp-slate-run.d.ts +41 -0
  128. package/dist/mcp-slate-run.d.ts.map +1 -0
  129. package/dist/mcp-slate-run.js +88 -0
  130. package/dist/mcp-slate-run.js.map +1 -0
  131. package/dist/mcp-slate-tool-defs.d.ts +61 -0
  132. package/dist/mcp-slate-tool-defs.d.ts.map +1 -0
  133. package/dist/mcp-slate-tool-defs.js +247 -0
  134. package/dist/mcp-slate-tool-defs.js.map +1 -0
  135. package/dist/mcp-slate-tools.d.ts +8 -0
  136. package/dist/mcp-slate-tools.d.ts.map +1 -0
  137. package/dist/mcp-slate-tools.js +45 -0
  138. package/dist/mcp-slate-tools.js.map +1 -0
  139. package/dist/mcp-slate-ui-copy.d.ts +134 -0
  140. package/dist/mcp-slate-ui-copy.d.ts.map +1 -0
  141. package/dist/mcp-slate-ui-copy.js +136 -0
  142. package/dist/mcp-slate-ui-copy.js.map +1 -0
  143. package/dist/mcp-slate-ui-script-bridge.d.ts +18 -0
  144. package/dist/mcp-slate-ui-script-bridge.d.ts.map +1 -0
  145. package/dist/mcp-slate-ui-script-bridge.js +137 -0
  146. package/dist/mcp-slate-ui-script-bridge.js.map +1 -0
  147. package/dist/mcp-slate-ui-script-browser.d.ts +12 -0
  148. package/dist/mcp-slate-ui-script-browser.d.ts.map +1 -0
  149. package/dist/mcp-slate-ui-script-browser.js +19 -0
  150. package/dist/mcp-slate-ui-script-browser.js.map +1 -0
  151. package/dist/mcp-slate-ui-script-dialog.d.ts +20 -0
  152. package/dist/mcp-slate-ui-script-dialog.d.ts.map +1 -0
  153. package/dist/mcp-slate-ui-script-dialog.js +332 -0
  154. package/dist/mcp-slate-ui-script-dialog.js.map +1 -0
  155. package/dist/mcp-slate-ui-script-inline.d.ts +10 -0
  156. package/dist/mcp-slate-ui-script-inline.d.ts.map +1 -0
  157. package/dist/mcp-slate-ui-script-inline.js +221 -0
  158. package/dist/mcp-slate-ui-script-inline.js.map +1 -0
  159. package/dist/mcp-slate-ui-script-inspiration.d.ts +12 -0
  160. package/dist/mcp-slate-ui-script-inspiration.d.ts.map +1 -0
  161. package/dist/mcp-slate-ui-script-inspiration.js +216 -0
  162. package/dist/mcp-slate-ui-script-inspiration.js.map +1 -0
  163. package/dist/mcp-slate-ui-script-more.d.ts +30 -0
  164. package/dist/mcp-slate-ui-script-more.d.ts.map +1 -0
  165. package/dist/mcp-slate-ui-script-more.js +225 -0
  166. package/dist/mcp-slate-ui-script-more.js.map +1 -0
  167. package/dist/mcp-slate-ui-script-progress.d.ts +7 -0
  168. package/dist/mcp-slate-ui-script-progress.d.ts.map +1 -0
  169. package/dist/mcp-slate-ui-script-progress.js +9 -0
  170. package/dist/mcp-slate-ui-script-progress.js.map +1 -0
  171. package/dist/mcp-slate-ui-script-remote.d.ts +28 -0
  172. package/dist/mcp-slate-ui-script-remote.d.ts.map +1 -0
  173. package/dist/mcp-slate-ui-script-remote.js +147 -0
  174. package/dist/mcp-slate-ui-script-remote.js.map +1 -0
  175. package/dist/mcp-slate-ui-script-scribble.d.ts +19 -0
  176. package/dist/mcp-slate-ui-script-scribble.d.ts.map +1 -0
  177. package/dist/mcp-slate-ui-script-scribble.js +114 -0
  178. package/dist/mcp-slate-ui-script-scribble.js.map +1 -0
  179. package/dist/mcp-slate-ui-script-select.d.ts +16 -0
  180. package/dist/mcp-slate-ui-script-select.d.ts.map +1 -0
  181. package/dist/mcp-slate-ui-script-select.js +73 -0
  182. package/dist/mcp-slate-ui-script-select.js.map +1 -0
  183. package/dist/mcp-slate-ui-script-stage.d.ts +11 -0
  184. package/dist/mcp-slate-ui-script-stage.d.ts.map +1 -0
  185. package/dist/mcp-slate-ui-script-stage.js +181 -0
  186. package/dist/mcp-slate-ui-script-stage.js.map +1 -0
  187. package/dist/mcp-slate-ui-script-state.d.ts +13 -0
  188. package/dist/mcp-slate-ui-script-state.d.ts.map +1 -0
  189. package/dist/mcp-slate-ui-script-state.js +306 -0
  190. package/dist/mcp-slate-ui-script-state.js.map +1 -0
  191. package/dist/mcp-slate-ui-script-thumbtools.d.ts +23 -0
  192. package/dist/mcp-slate-ui-script-thumbtools.d.ts.map +1 -0
  193. package/dist/mcp-slate-ui-script-thumbtools.js +103 -0
  194. package/dist/mcp-slate-ui-script-thumbtools.js.map +1 -0
  195. package/dist/mcp-slate-ui-script.d.ts +28 -0
  196. package/dist/mcp-slate-ui-script.d.ts.map +1 -0
  197. package/dist/mcp-slate-ui-script.js +58 -0
  198. package/dist/mcp-slate-ui-script.js.map +1 -0
  199. package/dist/mcp-slate-ui-styles-dialog.d.ts +17 -0
  200. package/dist/mcp-slate-ui-styles-dialog.d.ts.map +1 -0
  201. package/dist/mcp-slate-ui-styles-dialog.js +73 -0
  202. package/dist/mcp-slate-ui-styles-dialog.js.map +1 -0
  203. package/dist/mcp-slate-ui-styles-stage.d.ts +12 -0
  204. package/dist/mcp-slate-ui-styles-stage.d.ts.map +1 -0
  205. package/dist/mcp-slate-ui-styles-stage.js +53 -0
  206. package/dist/mcp-slate-ui-styles-stage.js.map +1 -0
  207. package/dist/mcp-slate-ui-styles-thumbtools.d.ts +10 -0
  208. package/dist/mcp-slate-ui-styles-thumbtools.d.ts.map +1 -0
  209. package/dist/mcp-slate-ui-styles-thumbtools.js +25 -0
  210. package/dist/mcp-slate-ui-styles-thumbtools.js.map +1 -0
  211. package/dist/mcp-slate-ui-styles.d.ts +13 -0
  212. package/dist/mcp-slate-ui-styles.d.ts.map +1 -0
  213. package/dist/mcp-slate-ui-styles.js +117 -0
  214. package/dist/mcp-slate-ui-styles.js.map +1 -0
  215. package/dist/mcp-slate-ui.d.ts +16 -0
  216. package/dist/mcp-slate-ui.d.ts.map +1 -0
  217. package/dist/mcp-slate-ui.js +58 -0
  218. package/dist/mcp-slate-ui.js.map +1 -0
  219. package/dist/mcp-slate-workspace-tools.d.ts +15 -0
  220. package/dist/mcp-slate-workspace-tools.d.ts.map +1 -0
  221. package/dist/mcp-slate-workspace-tools.js +155 -0
  222. package/dist/mcp-slate-workspace-tools.js.map +1 -0
  223. package/dist/mcp-tool-definitions.d.ts.map +1 -1
  224. package/dist/mcp-tool-definitions.js +9 -7
  225. package/dist/mcp-tool-definitions.js.map +1 -1
  226. package/dist/mcp-tool-handler.d.ts +8 -2
  227. package/dist/mcp-tool-handler.d.ts.map +1 -1
  228. package/dist/mcp-tool-handler.js +34 -13
  229. package/dist/mcp-tool-handler.js.map +1 -1
  230. package/dist/mcp-workflow-tools.d.ts +6 -0
  231. package/dist/mcp-workflow-tools.d.ts.map +1 -0
  232. package/dist/mcp-workflow-tools.js +108 -0
  233. package/dist/mcp-workflow-tools.js.map +1 -0
  234. package/dist/prototype-browsers.d.ts +8 -2
  235. package/dist/prototype-browsers.d.ts.map +1 -1
  236. package/dist/prototype-browsers.js +8 -3
  237. package/dist/prototype-browsers.js.map +1 -1
  238. package/dist/prototype-label-client.d.ts +5 -0
  239. package/dist/prototype-label-client.d.ts.map +1 -1
  240. package/dist/prototype-label-client.js.map +1 -1
  241. package/dist/prototype-poststep.d.ts +2 -2
  242. package/dist/prototype-poststep.d.ts.map +1 -1
  243. package/dist/prototype-poststep.js +3 -0
  244. package/dist/prototype-poststep.js.map +1 -1
  245. package/dist/prototype-process.js +1 -1
  246. package/dist/prototype-process.js.map +1 -1
  247. package/dist/prototype-run-record.d.ts +6 -2
  248. package/dist/prototype-run-record.d.ts.map +1 -1
  249. package/dist/prototype-run-record.js +6 -0
  250. package/dist/prototype-run-record.js.map +1 -1
  251. package/dist/prototype-runner.d.ts +2 -2
  252. package/dist/prototype-runner.d.ts.map +1 -1
  253. package/dist/prototype-runner.js +5 -2
  254. package/dist/prototype-runner.js.map +1 -1
  255. package/dist/prototype-workflow-contract.d.ts +13 -0
  256. package/dist/prototype-workflow-contract.d.ts.map +1 -0
  257. package/dist/prototype-workflow-contract.js +82 -0
  258. package/dist/prototype-workflow-contract.js.map +1 -0
  259. package/dist/prototype-workflow-labels.d.ts +29 -0
  260. package/dist/prototype-workflow-labels.d.ts.map +1 -0
  261. package/dist/prototype-workflow-labels.js +93 -0
  262. package/dist/prototype-workflow-labels.js.map +1 -0
  263. package/dist/run-journal-commands.d.ts.map +1 -1
  264. package/dist/run-journal-commands.js +24 -5
  265. package/dist/run-journal-commands.js.map +1 -1
  266. package/dist/scene/camera-model.d.ts +48 -0
  267. package/dist/scene/camera-model.d.ts.map +1 -0
  268. package/dist/scene/camera-model.js +89 -0
  269. package/dist/scene/camera-model.js.map +1 -0
  270. package/dist/scene/camera-solve.d.ts +58 -0
  271. package/dist/scene/camera-solve.d.ts.map +1 -0
  272. package/dist/scene/camera-solve.js +288 -0
  273. package/dist/scene/camera-solve.js.map +1 -0
  274. package/dist/scene/capture-plan.d.ts +28 -0
  275. package/dist/scene/capture-plan.d.ts.map +1 -0
  276. package/dist/scene/capture-plan.js +79 -0
  277. package/dist/scene/capture-plan.js.map +1 -0
  278. package/dist/scene/capture.d.ts +21 -0
  279. package/dist/scene/capture.d.ts.map +1 -0
  280. package/dist/scene/capture.js +118 -0
  281. package/dist/scene/capture.js.map +1 -0
  282. package/dist/scene/image-colors.d.ts +25 -0
  283. package/dist/scene/image-colors.d.ts.map +1 -0
  284. package/dist/scene/image-colors.js +110 -0
  285. package/dist/scene/image-colors.js.map +1 -0
  286. package/dist/scene/image-rectify.d.ts +25 -0
  287. package/dist/scene/image-rectify.d.ts.map +1 -0
  288. package/dist/scene/image-rectify.js +82 -0
  289. package/dist/scene/image-rectify.js.map +1 -0
  290. package/dist/scene/image-sheet.d.ts +19 -0
  291. package/dist/scene/image-sheet.d.ts.map +1 -0
  292. package/dist/scene/image-sheet.js +118 -0
  293. package/dist/scene/image-sheet.js.map +1 -0
  294. package/dist/scene/least-squares.d.ts +31 -0
  295. package/dist/scene/least-squares.d.ts.map +1 -0
  296. package/dist/scene/least-squares.js +173 -0
  297. package/dist/scene/least-squares.js.map +1 -0
  298. package/dist/scene/numbers.d.ts +17 -0
  299. package/dist/scene/numbers.d.ts.map +1 -0
  300. package/dist/scene/numbers.js +39 -0
  301. package/dist/scene/numbers.js.map +1 -0
  302. package/dist/scene/placement.d.ts +43 -0
  303. package/dist/scene/placement.d.ts.map +1 -0
  304. package/dist/scene/placement.js +107 -0
  305. package/dist/scene/placement.js.map +1 -0
  306. package/dist/scene/raster.d.ts +18 -0
  307. package/dist/scene/raster.d.ts.map +1 -0
  308. package/dist/scene/raster.js +31 -0
  309. package/dist/scene/raster.js.map +1 -0
  310. package/dist/scene/scene-kit.d.ts +20 -0
  311. package/dist/scene/scene-kit.d.ts.map +1 -0
  312. package/dist/scene/scene-kit.js +74 -0
  313. package/dist/scene/scene-kit.js.map +1 -0
  314. package/dist/scene/scene-verbs.d.ts +4 -0
  315. package/dist/scene/scene-verbs.d.ts.map +1 -0
  316. package/dist/scene/scene-verbs.js +5 -0
  317. package/dist/scene/scene-verbs.js.map +1 -0
  318. package/dist/scene/seeded-random.d.ts +20 -0
  319. package/dist/scene/seeded-random.d.ts.map +1 -0
  320. package/dist/scene/seeded-random.js +42 -0
  321. package/dist/scene/seeded-random.js.map +1 -0
  322. package/dist/scene/spec-expression.d.ts +25 -0
  323. package/dist/scene/spec-expression.d.ts.map +1 -0
  324. package/dist/scene/spec-expression.js +234 -0
  325. package/dist/scene/spec-expression.js.map +1 -0
  326. package/dist/scene/static-server.d.ts +13 -0
  327. package/dist/scene/static-server.d.ts.map +1 -0
  328. package/dist/scene/static-server.js +99 -0
  329. package/dist/scene/static-server.js.map +1 -0
  330. package/dist/server.d.ts +22 -2
  331. package/dist/server.d.ts.map +1 -1
  332. package/dist/server.js +44 -8
  333. package/dist/server.js.map +1 -1
  334. package/dist/slate-actions.d.ts +38 -0
  335. package/dist/slate-actions.d.ts.map +1 -0
  336. package/dist/slate-actions.js +102 -0
  337. package/dist/slate-actions.js.map +1 -0
  338. package/dist/slate-annotate.d.ts +36 -0
  339. package/dist/slate-annotate.d.ts.map +1 -0
  340. package/dist/slate-annotate.js +71 -0
  341. package/dist/slate-annotate.js.map +1 -0
  342. package/dist/slate-approvals.d.ts +61 -0
  343. package/dist/slate-approvals.d.ts.map +1 -0
  344. package/dist/slate-approvals.js +153 -0
  345. package/dist/slate-approvals.js.map +1 -0
  346. package/dist/slate-browser-decision.d.ts +30 -0
  347. package/dist/slate-browser-decision.d.ts.map +1 -0
  348. package/dist/slate-browser-decision.js +24 -0
  349. package/dist/slate-browser-decision.js.map +1 -0
  350. package/dist/slate-browser-host-script.d.ts +14 -0
  351. package/dist/slate-browser-host-script.d.ts.map +1 -0
  352. package/dist/slate-browser-host-script.js +125 -0
  353. package/dist/slate-browser-host-script.js.map +1 -0
  354. package/dist/slate-browser-host.d.ts +9 -0
  355. package/dist/slate-browser-host.d.ts.map +1 -0
  356. package/dist/slate-browser-host.js +37 -0
  357. package/dist/slate-browser-host.js.map +1 -0
  358. package/dist/slate-browser-server.d.ts +37 -0
  359. package/dist/slate-browser-server.d.ts.map +1 -0
  360. package/dist/slate-browser-server.js +186 -0
  361. package/dist/slate-browser-server.js.map +1 -0
  362. package/dist/slate-commit.d.ts +28 -0
  363. package/dist/slate-commit.d.ts.map +1 -0
  364. package/dist/slate-commit.js +218 -0
  365. package/dist/slate-commit.js.map +1 -0
  366. package/dist/slate-corpus.d.ts +14 -0
  367. package/dist/slate-corpus.d.ts.map +1 -0
  368. package/dist/slate-corpus.js +32 -0
  369. package/dist/slate-corpus.js.map +1 -0
  370. package/dist/slate-edit-prompt.d.ts +18 -0
  371. package/dist/slate-edit-prompt.d.ts.map +1 -0
  372. package/dist/slate-edit-prompt.js +41 -0
  373. package/dist/slate-edit-prompt.js.map +1 -0
  374. package/dist/slate-edit-runner.d.ts +4 -0
  375. package/dist/slate-edit-runner.d.ts.map +1 -0
  376. package/dist/slate-edit-runner.js +90 -0
  377. package/dist/slate-edit-runner.js.map +1 -0
  378. package/dist/slate-editability.d.ts +20 -0
  379. package/dist/slate-editability.d.ts.map +1 -0
  380. package/dist/slate-editability.js +19 -0
  381. package/dist/slate-editability.js.map +1 -0
  382. package/dist/slate-errors.d.ts +15 -0
  383. package/dist/slate-errors.d.ts.map +1 -0
  384. package/dist/slate-errors.js +21 -0
  385. package/dist/slate-errors.js.map +1 -0
  386. package/dist/slate-handoff-options.d.ts +40 -0
  387. package/dist/slate-handoff-options.d.ts.map +1 -0
  388. package/dist/slate-handoff-options.js +127 -0
  389. package/dist/slate-handoff-options.js.map +1 -0
  390. package/dist/slate-handoff.d.ts +11 -0
  391. package/dist/slate-handoff.d.ts.map +1 -0
  392. package/dist/slate-handoff.js +56 -0
  393. package/dist/slate-handoff.js.map +1 -0
  394. package/dist/slate-ids.d.ts +33 -0
  395. package/dist/slate-ids.d.ts.map +1 -0
  396. package/dist/slate-ids.js +47 -0
  397. package/dist/slate-ids.js.map +1 -0
  398. package/dist/slate-image-executor.d.ts +39 -0
  399. package/dist/slate-image-executor.d.ts.map +1 -0
  400. package/dist/slate-image-executor.js +52 -0
  401. package/dist/slate-image-executor.js.map +1 -0
  402. package/dist/slate-inspiration.d.ts +22 -0
  403. package/dist/slate-inspiration.d.ts.map +1 -0
  404. package/dist/slate-inspiration.js +112 -0
  405. package/dist/slate-inspiration.js.map +1 -0
  406. package/dist/slate-labels.d.ts +11 -0
  407. package/dist/slate-labels.d.ts.map +1 -0
  408. package/dist/slate-labels.js +32 -0
  409. package/dist/slate-labels.js.map +1 -0
  410. package/dist/slate-ledger.d.ts +29 -0
  411. package/dist/slate-ledger.d.ts.map +1 -0
  412. package/dist/slate-ledger.js +65 -0
  413. package/dist/slate-ledger.js.map +1 -0
  414. package/dist/slate-liveness.d.ts +26 -0
  415. package/dist/slate-liveness.d.ts.map +1 -0
  416. package/dist/slate-liveness.js +49 -0
  417. package/dist/slate-liveness.js.map +1 -0
  418. package/dist/slate-local-image.d.ts +19 -0
  419. package/dist/slate-local-image.d.ts.map +1 -0
  420. package/dist/slate-local-image.js +36 -0
  421. package/dist/slate-local-image.js.map +1 -0
  422. package/dist/slate-lock.d.ts +64 -0
  423. package/dist/slate-lock.d.ts.map +1 -0
  424. package/dist/slate-lock.js +178 -0
  425. package/dist/slate-lock.js.map +1 -0
  426. package/dist/slate-paths.d.ts +45 -0
  427. package/dist/slate-paths.d.ts.map +1 -0
  428. package/dist/slate-paths.js +132 -0
  429. package/dist/slate-paths.js.map +1 -0
  430. package/dist/slate-pick.d.ts +29 -0
  431. package/dist/slate-pick.d.ts.map +1 -0
  432. package/dist/slate-pick.js +55 -0
  433. package/dist/slate-pick.js.map +1 -0
  434. package/dist/slate-reference-ids.d.ts +6 -0
  435. package/dist/slate-reference-ids.d.ts.map +1 -0
  436. package/dist/slate-reference-ids.js +17 -0
  437. package/dist/slate-reference-ids.js.map +1 -0
  438. package/dist/slate-reference-store.d.ts +23 -0
  439. package/dist/slate-reference-store.d.ts.map +1 -0
  440. package/dist/slate-reference-store.js +46 -0
  441. package/dist/slate-reference-store.js.map +1 -0
  442. package/dist/slate-resume.d.ts +19 -0
  443. package/dist/slate-resume.d.ts.map +1 -0
  444. package/dist/slate-resume.js +94 -0
  445. package/dist/slate-resume.js.map +1 -0
  446. package/dist/slate-round-params.d.ts +20 -0
  447. package/dist/slate-round-params.d.ts.map +1 -0
  448. package/dist/slate-round-params.js +32 -0
  449. package/dist/slate-round-params.js.map +1 -0
  450. package/dist/slate-round-prompt.d.ts +18 -0
  451. package/dist/slate-round-prompt.d.ts.map +1 -0
  452. package/dist/slate-round-prompt.js +20 -0
  453. package/dist/slate-round-prompt.js.map +1 -0
  454. package/dist/slate-round-runner.d.ts +4 -0
  455. package/dist/slate-round-runner.d.ts.map +1 -0
  456. package/dist/slate-round-runner.js +125 -0
  457. package/dist/slate-round-runner.js.map +1 -0
  458. package/dist/slate-round-search.d.ts +7 -0
  459. package/dist/slate-round-search.d.ts.map +1 -0
  460. package/dist/slate-round-search.js +77 -0
  461. package/dist/slate-round-search.js.map +1 -0
  462. package/dist/slate-run-action.d.ts +14 -0
  463. package/dist/slate-run-action.d.ts.map +1 -0
  464. package/dist/slate-run-action.js +81 -0
  465. package/dist/slate-run-action.js.map +1 -0
  466. package/dist/slate-runner-context.d.ts +57 -0
  467. package/dist/slate-runner-context.d.ts.map +1 -0
  468. package/dist/slate-runner-context.js +79 -0
  469. package/dist/slate-runner-context.js.map +1 -0
  470. package/dist/slate-runner-failure.d.ts +8 -0
  471. package/dist/slate-runner-failure.d.ts.map +1 -0
  472. package/dist/slate-runner-failure.js +17 -0
  473. package/dist/slate-runner-failure.js.map +1 -0
  474. package/dist/slate-runner-flag.d.ts +3 -0
  475. package/dist/slate-runner-flag.d.ts.map +1 -0
  476. package/dist/slate-runner-flag.js +3 -0
  477. package/dist/slate-runner-flag.js.map +1 -0
  478. package/dist/slate-runner-main.d.ts +31 -0
  479. package/dist/slate-runner-main.d.ts.map +1 -0
  480. package/dist/slate-runner-main.js +132 -0
  481. package/dist/slate-runner-main.js.map +1 -0
  482. package/dist/slate-runner-spawn.d.ts +23 -0
  483. package/dist/slate-runner-spawn.d.ts.map +1 -0
  484. package/dist/slate-runner-spawn.js +27 -0
  485. package/dist/slate-runner-spawn.js.map +1 -0
  486. package/dist/slate-runtime.d.ts +38 -0
  487. package/dist/slate-runtime.d.ts.map +1 -0
  488. package/dist/slate-runtime.js +48 -0
  489. package/dist/slate-runtime.js.map +1 -0
  490. package/dist/slate-versions.d.ts +26 -0
  491. package/dist/slate-versions.d.ts.map +1 -0
  492. package/dist/slate-versions.js +110 -0
  493. package/dist/slate-versions.js.map +1 -0
  494. package/dist/slate-view-contract.d.ts +233 -0
  495. package/dist/slate-view-contract.d.ts.map +1 -0
  496. package/dist/slate-view-contract.js +17 -0
  497. package/dist/slate-view-contract.js.map +1 -0
  498. package/dist/slate-view-types.d.ts +2 -0
  499. package/dist/slate-view-types.d.ts.map +1 -0
  500. package/dist/slate-view-types.js +2 -0
  501. package/dist/slate-view-types.js.map +1 -0
  502. package/dist/slate-view.d.ts +19 -0
  503. package/dist/slate-view.d.ts.map +1 -0
  504. package/dist/slate-view.js +184 -0
  505. package/dist/slate-view.js.map +1 -0
  506. package/dist/slate-workspace-parse.d.ts +20 -0
  507. package/dist/slate-workspace-parse.d.ts.map +1 -0
  508. package/dist/slate-workspace-parse.js +437 -0
  509. package/dist/slate-workspace-parse.js.map +1 -0
  510. package/dist/slate-workspace-store.d.ts +44 -0
  511. package/dist/slate-workspace-store.d.ts.map +1 -0
  512. package/dist/slate-workspace-store.js +270 -0
  513. package/dist/slate-workspace-store.js.map +1 -0
  514. package/dist/slate-workspace-types.d.ts +176 -0
  515. package/dist/slate-workspace-types.d.ts.map +1 -0
  516. package/dist/slate-workspace-types.js +13 -0
  517. package/dist/slate-workspace-types.js.map +1 -0
  518. package/dist/workflow/adapter-12ui.d.ts +4 -0
  519. package/dist/workflow/adapter-12ui.d.ts.map +1 -0
  520. package/dist/workflow/adapter-12ui.js +147 -0
  521. package/dist/workflow/adapter-12ui.js.map +1 -0
  522. package/dist/workflow/adapter-layerdoc.d.ts +16 -0
  523. package/dist/workflow/adapter-layerdoc.d.ts.map +1 -0
  524. package/dist/workflow/adapter-layerdoc.js +116 -0
  525. package/dist/workflow/adapter-layerdoc.js.map +1 -0
  526. package/dist/workflow/adapter-openai.d.ts +4 -0
  527. package/dist/workflow/adapter-openai.d.ts.map +1 -0
  528. package/dist/workflow/adapter-openai.js +166 -0
  529. package/dist/workflow/adapter-openai.js.map +1 -0
  530. package/dist/workflow/adapter-process.d.ts +7 -0
  531. package/dist/workflow/adapter-process.d.ts.map +1 -0
  532. package/dist/workflow/adapter-process.js +174 -0
  533. package/dist/workflow/adapter-process.js.map +1 -0
  534. package/dist/workflow/adapter-prototype-labels.d.ts +15 -0
  535. package/dist/workflow/adapter-prototype-labels.d.ts.map +1 -0
  536. package/dist/workflow/adapter-prototype-labels.js +71 -0
  537. package/dist/workflow/adapter-prototype-labels.js.map +1 -0
  538. package/dist/workflow/adapter-types.d.ts +40 -0
  539. package/dist/workflow/adapter-types.d.ts.map +1 -0
  540. package/dist/workflow/adapter-types.js +2 -0
  541. package/dist/workflow/adapter-types.js.map +1 -0
  542. package/dist/workflow/adapter-utils.d.ts +11 -0
  543. package/dist/workflow/adapter-utils.d.ts.map +1 -0
  544. package/dist/workflow/adapter-utils.js +72 -0
  545. package/dist/workflow/adapter-utils.js.map +1 -0
  546. package/dist/workflow/adapters.d.ts +6 -0
  547. package/dist/workflow/adapters.d.ts.map +1 -0
  548. package/dist/workflow/adapters.js +25 -0
  549. package/dist/workflow/adapters.js.map +1 -0
  550. package/dist/workflow/artifact.d.ts +11 -0
  551. package/dist/workflow/artifact.d.ts.map +1 -0
  552. package/dist/workflow/artifact.js +94 -0
  553. package/dist/workflow/artifact.js.map +1 -0
  554. package/dist/workflow/bundle-collect.d.ts +8 -0
  555. package/dist/workflow/bundle-collect.d.ts.map +1 -0
  556. package/dist/workflow/bundle-collect.js +56 -0
  557. package/dist/workflow/bundle-collect.js.map +1 -0
  558. package/dist/workflow/bundle-export.d.ts +16 -0
  559. package/dist/workflow/bundle-export.d.ts.map +1 -0
  560. package/dist/workflow/bundle-export.js +174 -0
  561. package/dist/workflow/bundle-export.js.map +1 -0
  562. package/dist/workflow/bundle-paths.d.ts +7 -0
  563. package/dist/workflow/bundle-paths.d.ts.map +1 -0
  564. package/dist/workflow/bundle-paths.js +35 -0
  565. package/dist/workflow/bundle-paths.js.map +1 -0
  566. package/dist/workflow/bundle.d.ts +4 -0
  567. package/dist/workflow/bundle.d.ts.map +1 -0
  568. package/dist/workflow/bundle.js +4 -0
  569. package/dist/workflow/bundle.js.map +1 -0
  570. package/dist/workflow/capture.d.ts +36 -0
  571. package/dist/workflow/capture.d.ts.map +1 -0
  572. package/dist/workflow/capture.js +81 -0
  573. package/dist/workflow/capture.js.map +1 -0
  574. package/dist/workflow/continuation-branch.d.ts +15 -0
  575. package/dist/workflow/continuation-branch.d.ts.map +1 -0
  576. package/dist/workflow/continuation-branch.js +103 -0
  577. package/dist/workflow/continuation-branch.js.map +1 -0
  578. package/dist/workflow/continuation-plans.d.ts +38 -0
  579. package/dist/workflow/continuation-plans.d.ts.map +1 -0
  580. package/dist/workflow/continuation-plans.js +78 -0
  581. package/dist/workflow/continuation-plans.js.map +1 -0
  582. package/dist/workflow/continuation.d.ts +25 -0
  583. package/dist/workflow/continuation.d.ts.map +1 -0
  584. package/dist/workflow/continuation.js +89 -0
  585. package/dist/workflow/continuation.js.map +1 -0
  586. package/dist/workflow/layerdoc-reader.d.ts +27 -0
  587. package/dist/workflow/layerdoc-reader.d.ts.map +1 -0
  588. package/dist/workflow/layerdoc-reader.js +81 -0
  589. package/dist/workflow/layerdoc-reader.js.map +1 -0
  590. package/dist/workflow/project-evidence.d.ts +48 -0
  591. package/dist/workflow/project-evidence.d.ts.map +1 -0
  592. package/dist/workflow/project-evidence.js +200 -0
  593. package/dist/workflow/project-evidence.js.map +1 -0
  594. package/dist/workflow/providers.d.ts +35 -0
  595. package/dist/workflow/providers.d.ts.map +1 -0
  596. package/dist/workflow/providers.js +110 -0
  597. package/dist/workflow/providers.js.map +1 -0
  598. package/dist/workflow/recipes-layerdoc-validation.d.ts +4 -0
  599. package/dist/workflow/recipes-layerdoc-validation.d.ts.map +1 -0
  600. package/dist/workflow/recipes-layerdoc-validation.js +98 -0
  601. package/dist/workflow/recipes-layerdoc-validation.js.map +1 -0
  602. package/dist/workflow/recipes-result-validation.d.ts +6 -0
  603. package/dist/workflow/recipes-result-validation.d.ts.map +1 -0
  604. package/dist/workflow/recipes-result-validation.js +38 -0
  605. package/dist/workflow/recipes-result-validation.js.map +1 -0
  606. package/dist/workflow/recipes-schemas.d.ts +7 -0
  607. package/dist/workflow/recipes-schemas.d.ts.map +1 -0
  608. package/dist/workflow/recipes-schemas.js +67 -0
  609. package/dist/workflow/recipes-schemas.js.map +1 -0
  610. package/dist/workflow/recipes-validation.d.ts +14 -0
  611. package/dist/workflow/recipes-validation.d.ts.map +1 -0
  612. package/dist/workflow/recipes-validation.js +68 -0
  613. package/dist/workflow/recipes-validation.js.map +1 -0
  614. package/dist/workflow/recipes.d.ts +20 -0
  615. package/dist/workflow/recipes.d.ts.map +1 -0
  616. package/dist/workflow/recipes.js +167 -0
  617. package/dist/workflow/recipes.js.map +1 -0
  618. package/dist/workflow/routing.d.ts +4 -0
  619. package/dist/workflow/routing.d.ts.map +1 -0
  620. package/dist/workflow/routing.js +28 -0
  621. package/dist/workflow/routing.js.map +1 -0
  622. package/dist/workflow/schema.d.ts +5 -0
  623. package/dist/workflow/schema.d.ts.map +1 -0
  624. package/dist/workflow/schema.js +29 -0
  625. package/dist/workflow/schema.js.map +1 -0
  626. package/dist/workflow/service.d.ts +59 -0
  627. package/dist/workflow/service.d.ts.map +1 -0
  628. package/dist/workflow/service.js +170 -0
  629. package/dist/workflow/service.js.map +1 -0
  630. package/dist/workflow/store-json.d.ts +5 -0
  631. package/dist/workflow/store-json.d.ts.map +1 -0
  632. package/dist/workflow/store-json.js +35 -0
  633. package/dist/workflow/store-json.js.map +1 -0
  634. package/dist/workflow/store-lock.d.ts +3 -0
  635. package/dist/workflow/store-lock.d.ts.map +1 -0
  636. package/dist/workflow/store-lock.js +85 -0
  637. package/dist/workflow/store-lock.js.map +1 -0
  638. package/dist/workflow/store-paths.d.ts +17 -0
  639. package/dist/workflow/store-paths.d.ts.map +1 -0
  640. package/dist/workflow/store-paths.js +67 -0
  641. package/dist/workflow/store-paths.js.map +1 -0
  642. package/dist/workflow/store-validation.d.ts +7 -0
  643. package/dist/workflow/store-validation.d.ts.map +1 -0
  644. package/dist/workflow/store-validation.js +119 -0
  645. package/dist/workflow/store-validation.js.map +1 -0
  646. package/dist/workflow/store.d.ts +10 -0
  647. package/dist/workflow/store.d.ts.map +1 -0
  648. package/dist/workflow/store.js +193 -0
  649. package/dist/workflow/store.js.map +1 -0
  650. package/dist/workflow/types.d.ts +120 -0
  651. package/dist/workflow/types.d.ts.map +1 -0
  652. package/dist/workflow/types.js +15 -0
  653. package/dist/workflow/types.js.map +1 -0
  654. package/dist/workflow-transport.d.ts +28 -0
  655. package/dist/workflow-transport.d.ts.map +1 -0
  656. package/dist/workflow-transport.js +184 -0
  657. package/dist/workflow-transport.js.map +1 -0
  658. package/open-design.json +2 -2
  659. package/package.json +4 -1
  660. package/prototype-kit/tests/rules-check.mjs +9 -0
  661. package/runtime/codex-conversion/src/images/native-invoke.mjs +1 -1
  662. package/runtime/codex-conversion/src/images/native.mjs +8 -4
  663. package/runtime/layerdoc-validator.mjs +1860 -0
  664. package/scene-kit/starter/camera.js +10 -0
  665. package/scene-kit/starter/gobo.js +60 -0
  666. package/scene-kit/starter/index.html +23 -0
  667. package/scene-kit/starter/lib.js +84 -0
  668. package/scene-kit/starter/main.js +78 -0
  669. package/scene-kit/starter/scene.js +33 -0
  670. package/scene-kit/vendor/LICENSE +21 -0
  671. package/scene-kit/vendor/addons/geometries/RoundedBoxGeometry.js +216 -0
  672. package/scene-kit/vendor/addons/renderers/CSS3DRenderer.js +454 -0
  673. package/scene-kit/vendor/three.core.js +60586 -0
  674. package/scene-kit/vendor/three.module.js +19719 -0
  675. package/skills/12ui-design/SKILL.md +21 -61
  676. package/skills/12ui-design/improve.md +5 -1
  677. package/skills/12ui-design/inspire.md +8 -5
  678. package/skills/12ui-design/outputs.md +23 -2
  679. package/skills/12ui-design/scene.md +172 -0
  680. package/skills/12ui-design/session.md +161 -0
@@ -0,0 +1,170 @@
1
+ import { lstat, mkdir, realpath, stat } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { replaceFileAtomically } from '../atomic-file-replace.js';
4
+ import { importArtifact, resolveArtifactPath } from './artifact.js';
5
+ import { discoverProviders } from './providers.js';
6
+ import { selectProvider } from './routing.js';
7
+ import { executeProvider } from './adapters.js';
8
+ import { completeOperation, dispatchOperation, failOperation, listOperations, prepareOperation, readOperation } from './store.js';
9
+ import { validateOutputSchema } from './schema.js';
10
+ import { workflowPaths, errorCode } from './store-paths.js';
11
+ import { canonicalJson, digest } from './store-json.js';
12
+ import { collectProjectEvidence, persistProjectBaseline, readProjectBaseline } from './project-evidence.js';
13
+ import { WorkflowError } from './types.js';
14
+ export async function discoverWorkflowProviders(options = {}) {
15
+ return discoverProviders({
16
+ env: options.env,
17
+ binaries: options.binaries,
18
+ timeoutMs: Math.min(options.timeoutMs ?? 5000, 5000),
19
+ trustCodexConfig: options.trustCodexConfig,
20
+ ...(options.sessionCapabilities ? { session: { capabilities: options.sessionCapabilities } } : {}),
21
+ });
22
+ }
23
+ export async function importWorkflowArtifact(args) {
24
+ return importArtifact(args.workspace, args.file, { mediaType: args.mediaType, role: args.role });
25
+ }
26
+ export async function prepareWorkflow(args) {
27
+ validateOutputSchema(args.request);
28
+ return prepareOperation(args.workspace, args.request, args.key);
29
+ }
30
+ export async function workflowStatus(args) {
31
+ return args.operationId ? readOperation(args.workspace, args.operationId) : listOperations(args.workspace);
32
+ }
33
+ export async function registerWorkflow(args) {
34
+ const operation = await readOperation(args.workspace, args.operationId);
35
+ if (operation.attempts.at(-1)?.number !== args.attemptNumber)
36
+ throw new WorkflowError('attempt_conflict', 'The result belongs to a different dispatch attempt.');
37
+ if (!['dispatched', 'reconcile', 'succeeded'].includes(operation.state))
38
+ throw new WorkflowError('operation_not_dispatched', 'Only the response to an active dispatch can be registered.');
39
+ const directories = await executionDirectories(await executionRoot(args.workspace, operation), args.attemptNumber);
40
+ const contents = canonicalJson(args.result);
41
+ await replaceFileAtomically({ file: path.join(directories.evidenceDir, `registration-${digest(contents)}.json`), contents });
42
+ const result = await withProjectEvidence(operation.request, args.result, directories);
43
+ return completeOperation(args.workspace, args.operationId, result, args.attemptNumber);
44
+ }
45
+ /** Explicit evidence about an attempt, never inferred from elapsed time. */
46
+ export async function recordWorkflowFailure(args) {
47
+ return failOperation(args.workspace, args.operationId, args.failure, args.attemptNumber);
48
+ }
49
+ const fallbackSafe = (failure) => failure.disposition === 'not-dispatched' || failure.disposition === 'terminal-no-output';
50
+ async function checkedDirectory(directory) {
51
+ await mkdir(directory).catch((error) => { if (errorCode(error) !== 'EEXIST')
52
+ throw error; });
53
+ const info = await lstat(directory);
54
+ if (!info.isDirectory() || info.isSymbolicLink())
55
+ throw new WorkflowError('unsafe_workspace', 'Execution directories must be real directories within the workspace.');
56
+ return directory;
57
+ }
58
+ /** Validate shared custody and the selected project before claiming an attempt. */
59
+ async function executionRoot(workspace, operation) {
60
+ const { base } = await workflowPaths(workspace);
61
+ const executions = await checkedDirectory(path.join(base, 'executions'));
62
+ const directory = await checkedDirectory(path.join(executions, operation.id));
63
+ const projectCwd = operation.request.parameters?.projectCwd;
64
+ if (operation.request.output.kind === 'project' && projectCwd === undefined) {
65
+ throw new WorkflowError('project_directory_invalid', 'Project output requires an explicitly selected projectCwd before dispatch.');
66
+ }
67
+ if (projectCwd !== undefined) {
68
+ if (operation.request.capability !== 'code' || typeof projectCwd !== 'string' || !path.isAbsolute(projectCwd)) {
69
+ throw new WorkflowError('project_directory_invalid', 'Project execution requires an explicit absolute projectCwd and the code capability.');
70
+ }
71
+ const workDir = await realpath(projectCwd);
72
+ if (!(await stat(workDir)).isDirectory())
73
+ throw new WorkflowError('project_directory_invalid', 'projectCwd must be a directory.');
74
+ return { directory, projectDir: workDir };
75
+ }
76
+ return { directory, projectDir: undefined };
77
+ }
78
+ /** Bind evidence to the attempt returned by the locked dispatch, never an earlier snapshot. */
79
+ async function executionDirectories(root, attemptNumber) {
80
+ const evidenceDir = await checkedDirectory(path.join(root.directory, String(attemptNumber)));
81
+ const workDir = root.projectDir ?? await checkedDirectory(path.join(evidenceDir, 'work'));
82
+ return { workDir, evidenceDir };
83
+ }
84
+ async function withProjectEvidence(request, result, directories) {
85
+ if (request.output.kind !== 'project')
86
+ return result;
87
+ const baseline = await readProjectBaseline({ projectDir: directories.workDir, evidenceDir: directories.evidenceDir });
88
+ const evidence = await collectProjectEvidence({ projectDir: directories.workDir, baseline, evidenceDir: directories.evidenceDir });
89
+ return { ...result, files: [...(result.files ?? []).filter(file => !['project-evidence', 'project-change'].includes(file.role ?? '')), ...evidence] };
90
+ }
91
+ /** CLI and MCP share this dispatcher. Route selection happens before a durable dispatch. */
92
+ export async function executeWorkflow(args, dependencies = {}) {
93
+ let operation = await readOperation(args.workspace, args.operationId);
94
+ if (operation.state === 'succeeded')
95
+ return { operation };
96
+ if (operation.state === 'dispatched' || operation.state === 'reconcile') {
97
+ throw new WorkflowError('reconciliation_required', 'This operation has already been handed off or dispatched. Inspect its existing output and register that result; execution will not repeat or switch providers.', 'ambiguous');
98
+ }
99
+ if (operation.failure && !fallbackSafe(operation.failure)) {
100
+ throw new WorkflowError(operation.failure.code, operation.failure.message, operation.failure.disposition);
101
+ }
102
+ validateOutputSchema(operation.request);
103
+ const inputs = await Promise.all(operation.request.inputs.map(async (artifact) => ({ ...artifact, path: await resolveArtifactPath(args.workspace, artifact) })));
104
+ const providers = await (dependencies.discover ?? discoverWorkflowProviders)({ ...args, trustCodexConfig: args.policy?.trustCodexConfig });
105
+ const attempted = new Set();
106
+ while (true) {
107
+ const candidates = providers.map(provider => attempted.has(provider.id)
108
+ ? { ...provider, available: false, reason: 'This invocation already attempted this provider without output.' }
109
+ : provider);
110
+ const route = selectProvider(operation.request.capability, candidates, args.policy ?? {});
111
+ const root = await executionRoot(args.workspace, operation);
112
+ operation = await dispatchOperation(args.workspace, operation.id, route);
113
+ const attemptNumber = operation.attempts.at(-1).number;
114
+ let directories;
115
+ try {
116
+ directories = await executionDirectories(root, attemptNumber);
117
+ if (operation.request.output.kind === 'project')
118
+ await persistProjectBaseline({ projectDir: directories.workDir, evidenceDir: directories.evidenceDir });
119
+ }
120
+ catch (error) {
121
+ const failure = { code: error instanceof WorkflowError ? error.code : 'execution_setup_failed', message: error instanceof WorkflowError ? error.message : 'The attempt workspace could not be prepared; no provider was invoked.', disposition: 'not-dispatched' };
122
+ await failOperation(args.workspace, operation.id, failure, attemptNumber);
123
+ throw new WorkflowError(failure.code, failure.message);
124
+ }
125
+ if (route.execution === 'session') {
126
+ return {
127
+ operation,
128
+ handoff: {
129
+ operationId: operation.id,
130
+ attemptNumber,
131
+ requestHash: operation.requestHash,
132
+ capability: operation.request.capability,
133
+ prompt: operation.request.prompt,
134
+ inputs,
135
+ output: operation.request.output,
136
+ parameters: operation.request.parameters,
137
+ ...directories,
138
+ instruction: 'Use the declared native session capability for this frozen request exactly once. Save the actual result and register it with this operation ID. If interrupted or uncertain, reconcile existing output; do not execute again or switch providers. Report a refusal or permission denial as a terminal stop.',
139
+ },
140
+ };
141
+ }
142
+ let responseReceived = false;
143
+ try {
144
+ let result = await (dependencies.execute ?? executeProvider)(route, { ...operation.request, inputs }, {
145
+ ...directories,
146
+ policy: args.policy,
147
+ env: args.env,
148
+ binaries: args.binaries,
149
+ models: args.models,
150
+ timeoutMs: args.timeoutMs,
151
+ apiOrigin: args.apiOrigin,
152
+ idempotencyKey: `workflow-${digest(`${operation.id}:${operation.requestHash}`)}`,
153
+ });
154
+ responseReceived = true;
155
+ await replaceFileAtomically({ file: path.join(directories.evidenceDir, 'provider-result.json'), contents: JSON.stringify(result) });
156
+ result = await withProjectEvidence(operation.request, result, directories);
157
+ return { operation: await completeOperation(args.workspace, operation.id, result, attemptNumber) };
158
+ }
159
+ catch (error) {
160
+ const failure = error instanceof WorkflowError
161
+ ? { code: error.code, message: error.message, disposition: responseReceived ? 'ambiguous' : error.disposition }
162
+ : { code: 'execution_outcome_unknown', message: 'Provider execution did not yield a durable result. Reconcile its retained evidence before doing more work.', disposition: 'ambiguous' };
163
+ operation = await failOperation(args.workspace, operation.id, failure, attemptNumber);
164
+ if (!fallbackSafe(failure) || args.policy?.provider)
165
+ throw new WorkflowError(failure.code, failure.message, failure.disposition);
166
+ attempted.add(route.provider);
167
+ }
168
+ }
169
+ }
170
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/workflow/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Stable JSON for identity and persistence. Reject values JSON.stringify would silently change. */
2
+ export declare const canonicalJson: (value: unknown) => string;
3
+ export declare const digest: (bytes: string | Uint8Array) => string;
4
+ export declare const cloneJson: <T>(value: T) => T;
5
+ //# sourceMappingURL=store-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-json.d.ts","sourceRoot":"","sources":["../../src/workflow/store-json.ts"],"names":[],"mappings":"AAGA,oGAAoG;AACpG,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,MAmB9C,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,OAAO,MAAM,GAAG,UAAU,KAAG,MAA0D,CAAC;AAC/G,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,CAA0C,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { WorkflowError } from './types.js';
3
+ /** Stable JSON for identity and persistence. Reject values JSON.stringify would silently change. */
4
+ export const canonicalJson = (value) => {
5
+ const ancestors = new Set();
6
+ const normalize = (item) => {
7
+ if (item === null || typeof item === 'string' || typeof item === 'boolean')
8
+ return item;
9
+ if (typeof item === 'number' && Number.isFinite(item))
10
+ return item;
11
+ if (typeof item !== 'object' || item === null || ancestors.has(item))
12
+ throw new WorkflowError('invalid_json', 'Workflow data must be finite, acyclic JSON.');
13
+ if (!Array.isArray(item) && Object.getPrototypeOf(item) !== Object.prototype && Object.getPrototypeOf(item) !== null)
14
+ throw new WorkflowError('invalid_json', 'Workflow data must contain only plain JSON objects.');
15
+ ancestors.add(item);
16
+ try {
17
+ if (Array.isArray(item))
18
+ return item.map(normalize);
19
+ const result = Object.create(null);
20
+ for (const key of Object.keys(item).sort()) {
21
+ const next = item[key];
22
+ if (next !== undefined)
23
+ result[key] = normalize(next);
24
+ }
25
+ return result;
26
+ }
27
+ finally {
28
+ ancestors.delete(item);
29
+ }
30
+ };
31
+ return JSON.stringify(normalize(value));
32
+ };
33
+ export const digest = (bytes) => createHash('sha256').update(bytes).digest('hex');
34
+ export const cloneJson = (value) => JSON.parse(canonicalJson(value));
35
+ //# sourceMappingURL=store-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-json.js","sourceRoot":"","sources":["../../src/workflow/store-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,oGAAoG;AACpG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAU,EAAE;IACtD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,SAAS,GAAG,CAAC,IAAa,EAAW,EAAE;QAC3C,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACxF,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACnE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,aAAa,CAAC,cAAc,EAAE,6CAA6C,CAAC,CAAC;QAC7J,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,IAAI;YAAE,MAAM,IAAI,aAAa,CAAC,cAAc,EAAE,qDAAqD,CAAC,CAAC;QACrN,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC;YACH,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACpD,MAAM,MAAM,GAA4B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC3C,MAAM,IAAI,GAAI,IAAgC,CAAC,GAAG,CAAC,CAAC;gBACpD,IAAI,IAAI,KAAK,SAAS;oBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YACxD,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;gBAAS,CAAC;YAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;IACvC,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAA0B,EAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/G,MAAM,CAAC,MAAM,SAAS,GAAG,CAAI,KAAQ,EAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAM,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Short critical sections only. Missing ownership/foreign hosts fail closed; age proves nothing. */
2
+ export declare const withStoreLock: <T>(locks: string, key: string, action: () => Promise<T>) => Promise<T>;
3
+ //# sourceMappingURL=store-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-lock.d.ts","sourceRoot":"","sources":["../../src/workflow/store-lock.ts"],"names":[],"mappings":"AAoCA,qGAAqG;AACrG,eAAO,MAAM,aAAa,GAAU,CAAC,EAAE,OAAO,MAAM,EAAE,KAAK,MAAM,EAAE,QAAQ,MAAM,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAmBtG,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { hostname } from 'node:os';
3
+ import { mkdir, readFile, rename, rm } from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { replaceFileAtomically } from '../atomic-file-replace.js';
6
+ import { errorCode } from './store-paths.js';
7
+ import { WorkflowError } from './types.js';
8
+ const readOwner = async (directory) => {
9
+ try {
10
+ const value = JSON.parse(await readFile(path.join(directory, 'owner.json'), 'utf8'));
11
+ return Number.isInteger(value.pid) && value.pid > 0 && typeof value.host === 'string' && typeof value.nonce === 'string'
12
+ ? value : null;
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ };
18
+ const dead = (owner) => {
19
+ if (owner.host !== hostname())
20
+ return false;
21
+ try {
22
+ process.kill(owner.pid, 0);
23
+ return false;
24
+ }
25
+ catch (error) {
26
+ return errorCode(error) === 'ESRCH';
27
+ }
28
+ };
29
+ /** Serialize stale-owner reclaim so two reclaimers cannot remove a newly acquired lock. */
30
+ const reclaim = async (directory) => {
31
+ const recovery = `${directory}.recovery`;
32
+ try {
33
+ await mkdir(recovery);
34
+ }
35
+ catch (error) {
36
+ if (errorCode(error) === 'EEXIST')
37
+ return;
38
+ throw error;
39
+ }
40
+ try {
41
+ const owner = await readOwner(directory);
42
+ if (!owner || !dead(owner))
43
+ return;
44
+ // No new owner can acquire the canonical path until this rename. After it,
45
+ // this reclaimer touches only the abandoned directory, never the new lock.
46
+ const abandoned = `${directory}.abandoned-${randomUUID()}`;
47
+ await rename(directory, abandoned).catch((error) => { if (errorCode(error) !== 'ENOENT')
48
+ throw error; });
49
+ await rm(abandoned, { recursive: true, force: true });
50
+ }
51
+ finally {
52
+ await rm(recovery, { recursive: true, force: true });
53
+ }
54
+ };
55
+ /** Short critical sections only. Missing ownership/foreign hosts fail closed; age proves nothing. */
56
+ export const withStoreLock = async (locks, key, action) => {
57
+ if (!/^[a-z0-9-]+$/u.test(key))
58
+ throw new WorkflowError('invalid_lock', 'Invalid workflow lock key.');
59
+ const directory = path.join(locks, key);
60
+ const owner = { pid: process.pid, host: hostname(), nonce: randomUUID() };
61
+ for (let attempt = 0;; attempt += 1) {
62
+ try {
63
+ await mkdir(directory);
64
+ break;
65
+ }
66
+ catch (error) {
67
+ if (errorCode(error) !== 'EEXIST')
68
+ throw error;
69
+ await reclaim(directory);
70
+ if (attempt >= 199)
71
+ throw new WorkflowError('workflow_busy', 'Another writer owns this operation. A lock with missing or uncertain ownership requires inspection before recovery.');
72
+ await new Promise((resolve) => setTimeout(resolve, 10));
73
+ }
74
+ }
75
+ try {
76
+ await replaceFileAtomically({ file: path.join(directory, 'owner.json'), contents: JSON.stringify(owner) });
77
+ return await action();
78
+ }
79
+ finally {
80
+ const current = await readOwner(directory);
81
+ if (current?.nonce === owner.nonce)
82
+ await rm(directory, { recursive: true });
83
+ }
84
+ };
85
+ //# sourceMappingURL=store-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-lock.js","sourceRoot":"","sources":["../../src/workflow/store-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,MAAM,SAAS,GAAG,KAAK,EAAE,SAAiB,EAAyB,EAAE;IACnE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAmB,CAAC;QACvG,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAI,GAAG,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YACvH,CAAC,CAAC,KAAc,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC1B,CAAC,CAAC;AACF,MAAM,IAAI,GAAG,CAAC,KAAY,EAAW,EAAE;IACrC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC;IAAC,CAAC;AAC1G,CAAC,CAAC;AAEF,2FAA2F;AAC3F,MAAM,OAAO,GAAG,KAAK,EAAE,SAAiB,EAAiB,EAAE;IACzD,MAAM,QAAQ,GAAG,GAAG,SAAS,WAAW,CAAC;IACzC,IAAI,CAAC;QAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;IAAC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,OAAO;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;IACxG,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO;QACnC,2EAA2E;QAC3E,2EAA2E;QAC3E,MAAM,SAAS,GAAG,GAAG,SAAS,cAAc,UAAU,EAAE,EAAE,CAAC;QAC3D,MAAM,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClH,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;YAAS,CAAC;QAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;AACrE,CAAC,CAAC;AAEF,qGAAqG;AACrG,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAK,KAAa,EAAE,GAAW,EAAE,MAAwB,EAAc,EAAE;IACzG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,cAAc,EAAE,4BAA4B,CAAC,CAAC;IACtG,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACxC,MAAM,KAAK,GAAU,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC;IACjF,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC;YAAC,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;YAAC,MAAM;QAAC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACpD,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;YAC/C,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;YACzB,IAAI,OAAO,IAAI,GAAG;gBAAE,MAAM,IAAI,aAAa,CAAC,eAAe,EAAE,qHAAqH,CAAC,CAAC;YACpL,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,MAAM,qBAAqB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3G,OAAO,MAAM,MAAM,EAAE,CAAC;IACxB,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE,KAAK,KAAK,KAAK,CAAC,KAAK;YAAE,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ export declare const WORKFLOW_DIRECTORY = ".12ui/workflow";
2
+ export declare const operationIdPattern: RegExp;
3
+ export declare const errorCode: (error: unknown) => string | undefined;
4
+ export declare const inside: (root: string, candidate: string) => boolean;
5
+ /** Resolve the caller's workspace once; internal directories may never be symlinks. */
6
+ export declare const workflowPaths: (workspace: string) => Promise<{
7
+ operations: string;
8
+ artifacts: string;
9
+ locks: string;
10
+ root: string;
11
+ base: string;
12
+ }>;
13
+ export declare const operationFile: (directory: string, id: string) => string;
14
+ /** Open the inode without following a final symlink, then validate that same inode. */
15
+ export declare const readRegularFile: (file: string) => Promise<Buffer>;
16
+ export declare const syncDirectory: (directory: string) => Promise<void>;
17
+ //# sourceMappingURL=store-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-paths.d.ts","sourceRoot":"","sources":["../../src/workflow/store-paths.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AACnD,eAAO,MAAM,kBAAkB,QAAuB,CAAC;AAEvD,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAAmD,CAAC;AAExG,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,EAAE,WAAW,MAAM,KAAG,OAGxD,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,aAAa,GAAU,WAAW,MAAM;;;;;;EAmBpD,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,WAAW,MAAM,EAAE,IAAI,MAAM,KAAG,MAG7D,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,eAAe,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,MAAM,CAQlE,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,IAAI,CAGnE,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { constants } from 'node:fs';
2
+ import { lstat, mkdir, open, realpath } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { WorkflowError } from './types.js';
5
+ export const WORKFLOW_DIRECTORY = '.12ui/workflow';
6
+ export const operationIdPattern = /^op-[a-f0-9]{64}$/u;
7
+ export const errorCode = (error) => error?.code;
8
+ export const inside = (root, candidate) => {
9
+ const relative = path.relative(root, candidate);
10
+ return relative !== '' && relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
11
+ };
12
+ /** Resolve the caller's workspace once; internal directories may never be symlinks. */
13
+ export const workflowPaths = async (workspace) => {
14
+ await mkdir(path.resolve(workspace), { recursive: true });
15
+ const root = await realpath(path.resolve(workspace));
16
+ const parts = ['.12ui', 'workflow'];
17
+ let current = root;
18
+ for (const part of parts) {
19
+ current = path.join(current, part);
20
+ await mkdir(current).catch((error) => { if (errorCode(error) !== 'EEXIST')
21
+ throw error; });
22
+ const stat = await lstat(current);
23
+ if (!stat.isDirectory() || stat.isSymbolicLink())
24
+ throw new WorkflowError('unsafe_workspace', 'Workflow directories must be real directories inside the workspace.');
25
+ }
26
+ const base = current;
27
+ const directories = { operations: path.join(base, 'operations'), artifacts: path.join(base, 'artifacts'), locks: path.join(base, 'locks') };
28
+ for (const directory of Object.values(directories)) {
29
+ await mkdir(directory).catch((error) => { if (errorCode(error) !== 'EEXIST')
30
+ throw error; });
31
+ const stat = await lstat(directory);
32
+ if (!stat.isDirectory() || stat.isSymbolicLink())
33
+ throw new WorkflowError('unsafe_workspace', 'Workflow directories must not follow symlinks.');
34
+ }
35
+ return { root, base, ...directories };
36
+ };
37
+ export const operationFile = (directory, id) => {
38
+ if (!operationIdPattern.test(id))
39
+ throw new WorkflowError('invalid_operation_id', 'Operation ID is invalid.');
40
+ return path.join(directory, `${id}.json`);
41
+ };
42
+ /** Open the inode without following a final symlink, then validate that same inode. */
43
+ export const readRegularFile = async (file) => {
44
+ const handle = await open(file, constants.O_RDONLY | constants.O_NOFOLLOW);
45
+ try {
46
+ if (!(await handle.stat()).isFile())
47
+ throw new WorkflowError('invalid_artifact', 'Artifacts and records must be regular files.');
48
+ return await handle.readFile();
49
+ }
50
+ finally {
51
+ await handle.close();
52
+ }
53
+ };
54
+ export const syncDirectory = async (directory) => {
55
+ const handle = await open(directory, 'r');
56
+ try {
57
+ await handle.sync();
58
+ }
59
+ catch (error) {
60
+ if (errorCode(error) !== 'EINVAL')
61
+ throw error;
62
+ }
63
+ finally {
64
+ await handle.close();
65
+ }
66
+ };
67
+ //# sourceMappingURL=store-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-paths.js","sourceRoot":"","sources":["../../src/workflow/store-paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type Artifact, type ExecutionResult, type OperationFailure, type RoutingDecision, type WorkflowOperation, type WorkflowRequest } from './types.js';
2
+ export declare const validateRequest: (request: WorkflowRequest) => void;
3
+ export declare const validateRoute: (route: RoutingDecision, request: WorkflowRequest) => void;
4
+ export declare const validateFailure: (failure: OperationFailure) => void;
5
+ export declare const validateOperation: (value: unknown, expectedId: string) => WorkflowOperation;
6
+ export declare const validateResult: (workspace: string, request: WorkflowRequest, result: ExecutionResult, artifacts: Artifact[]) => Promise<void>;
7
+ //# sourceMappingURL=store-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-validation.d.ts","sourceRoot":"","sources":["../../src/workflow/store-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2D,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAoBrN,eAAO,MAAM,eAAe,GAAI,SAAS,eAAe,KAAG,IAS1D,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,eAAe,EAAE,SAAS,eAAe,KAAG,IAUhF,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,SAAS,gBAAgB,KAAG,IAI3D,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,OAAO,OAAO,EAAE,YAAY,MAAM,KAAG,iBAqBtE,CAAC;AAEF,eAAO,MAAM,cAAc,GAAU,WAAW,MAAM,EAAE,SAAS,eAAe,EAAE,QAAQ,eAAe,EAAE,WAAW,QAAQ,EAAE,KAAG,OAAO,CAAC,IAAI,CAsB9I,CAAC"}
@@ -0,0 +1,119 @@
1
+ import { CAPABILITIES, PROVIDERS, WORKFLOW_SCHEMA, WorkflowError } from './types.js';
2
+ import { canonicalJson, digest } from './store-json.js';
3
+ import { validateBundleMappings } from './bundle-paths.js';
4
+ import { resolveArtifactPath } from './artifact.js';
5
+ import { readRegularFile } from './store-paths.js';
6
+ import { validateProjectEvidence } from './project-evidence.js';
7
+ const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
8
+ const forbidden = /^(?:env|environment|headers|authorization|credentials?|secrets?|api[_-]?key|access[_-]?token|refresh[_-]?token|password|bearer[_-]?token)$/iu;
9
+ /** Provider configuration belongs in adapters, never in a persistent request. */
10
+ const validatePublicParameters = (value) => {
11
+ if (Array.isArray(value)) {
12
+ value.forEach(validatePublicParameters);
13
+ return;
14
+ }
15
+ if (!object(value))
16
+ return;
17
+ for (const [key, child] of Object.entries(value)) {
18
+ if (forbidden.test(key))
19
+ throw new WorkflowError('private_configuration', 'Workflow parameters must not include credentials, headers or environment configuration.');
20
+ validatePublicParameters(child);
21
+ }
22
+ };
23
+ export const validateRequest = (request) => {
24
+ canonicalJson(request);
25
+ if (!object(request) || !CAPABILITIES.includes(request.capability) || typeof request.prompt !== 'string'
26
+ || !Array.isArray(request.inputs) || !object(request.output) || !['json', 'image', 'html', 'project'].includes(request.output.kind)
27
+ || (request.output.schema !== undefined && !object(request.output.schema))
28
+ || (request.parameters !== undefined && !object(request.parameters)))
29
+ throw new WorkflowError('invalid_request', 'Workflow request does not match the public workflow contract.');
30
+ if (Object.keys(request).some((key) => !['capability', 'prompt', 'inputs', 'output', 'parameters'].includes(key)))
31
+ throw new WorkflowError('invalid_request', 'Unsupported workflow request field.');
32
+ if (Object.keys(request.output).some((key) => !['kind', 'schema'].includes(key)))
33
+ throw new WorkflowError('invalid_request', 'Unsupported output contract field.');
34
+ validatePublicParameters(request.parameters);
35
+ };
36
+ export const validateRoute = (route, request) => {
37
+ canonicalJson(route);
38
+ const funding = { session: 'user-plan', codex: 'user-plan', claude: 'user-plan', openai: 'openai-key', '12ui': '12ui-credits' };
39
+ const execution = { session: 'session', codex: 'process', claude: 'process', openai: 'http', '12ui': 'http' };
40
+ if (!route || !PROVIDERS.includes(route.provider) || route.capability !== request.capability
41
+ || route.funding !== funding[route.provider] || route.execution !== execution[route.provider]
42
+ || !Array.isArray(route.considered)
43
+ || Object.keys(route).some((key) => !['provider', 'capability', 'funding', 'execution', 'considered'].includes(key))
44
+ || route.considered.some((item) => !item || !PROVIDERS.includes(item.provider) || typeof item.eligible !== 'boolean' || typeof item.reason !== 'string'
45
+ || Object.keys(item).some((key) => !['provider', 'eligible', 'reason'].includes(key))))
46
+ throw new WorkflowError('invalid_route', 'Dispatch route does not match the requested capability and provider.');
47
+ };
48
+ export const validateFailure = (failure) => {
49
+ canonicalJson(failure);
50
+ if (!failure || typeof failure.code !== 'string' || !failure.code || typeof failure.message !== 'string'
51
+ || !['not-dispatched', 'terminal-no-output', 'terminal-stop', 'ambiguous'].includes(failure.disposition))
52
+ throw new WorkflowError('invalid_failure', 'Operation failure must declare its dispatch disposition.');
53
+ };
54
+ export const validateOperation = (value, expectedId) => {
55
+ if (!object(value))
56
+ throw new WorkflowError('operation_corrupt', 'Workflow operation is not an object.');
57
+ const operation = value;
58
+ validateRequest(operation.request);
59
+ if (operation.schema !== WORKFLOW_SCHEMA || operation.id !== expectedId || typeof operation.idempotencyKey !== 'string'
60
+ || operation.id !== `op-${digest(operation.idempotencyKey)}` || operation.requestHash !== digest(canonicalJson(operation.request))
61
+ || !['prepared', 'dispatched', 'succeeded', 'failed', 'reconcile'].includes(operation.state)
62
+ || !Array.isArray(operation.attempts) || !Number.isFinite(Date.parse(operation.createdAt)) || !Number.isFinite(Date.parse(operation.updatedAt)))
63
+ throw new WorkflowError('operation_corrupt', 'Workflow operation identity or state is invalid.');
64
+ operation.attempts.forEach((attempt, index) => {
65
+ if (!attempt || attempt.number !== index + 1 || !Number.isFinite(Date.parse(attempt.dispatchedAt)))
66
+ throw new WorkflowError('operation_corrupt', 'Operation attempt history is invalid.');
67
+ validateRoute(attempt.route, operation.request);
68
+ if (attempt.failure)
69
+ validateFailure(attempt.failure);
70
+ });
71
+ if (operation.failure)
72
+ validateFailure(operation.failure);
73
+ if ((operation.state === 'prepared' && operation.attempts.length !== 0)
74
+ || (['dispatched', 'reconcile', 'succeeded'].includes(operation.state) && operation.attempts.length === 0)
75
+ || (operation.state === 'reconcile' && operation.failure?.disposition !== 'ambiguous')
76
+ || (operation.state === 'failed' && (!operation.failure || operation.failure.disposition === 'ambiguous'))
77
+ || (operation.state === 'succeeded' && (!operation.result || !Array.isArray(operation.result.artifacts))))
78
+ throw new WorkflowError('operation_corrupt', 'Operation state contradicts its durable history.');
79
+ if (operation.result)
80
+ validateBundleMappings(operation.result.artifacts);
81
+ return operation;
82
+ };
83
+ export const validateResult = async (workspace, request, result, artifacts) => {
84
+ if (!object(result))
85
+ throw new WorkflowError('invalid_result', 'Execution result must be an object.');
86
+ if (result.providerRequestId !== undefined && (typeof result.providerRequestId !== 'string' || !result.providerRequestId))
87
+ throw new WorkflowError('invalid_result', 'Provider request identity must be a non-empty string.');
88
+ if (result.usage !== undefined) {
89
+ if (!object(result.usage))
90
+ throw new WorkflowError('invalid_result', 'Usage evidence must be a JSON object.');
91
+ canonicalJson(result.usage);
92
+ validatePublicParameters(result.usage);
93
+ }
94
+ const kind = request.output.kind;
95
+ if (kind === 'json') {
96
+ if (result.value === undefined)
97
+ throw new WorkflowError('invalid_output', 'A JSON operation requires a JSON value.');
98
+ canonicalJson(result.value);
99
+ }
100
+ if (kind === 'image' && !artifacts.some((artifact) => artifact.mediaType.startsWith('image/') && artifact.width && artifact.height))
101
+ throw new WorkflowError('invalid_output', 'An image operation requires a verified image artifact.');
102
+ if (kind === 'html' && !artifacts.some((artifact) => artifact.mediaType === 'text/html' && artifact.bytes > 0))
103
+ throw new WorkflowError('invalid_output', 'An HTML operation requires a verified, non-empty HTML file artifact.');
104
+ if (kind === 'project') {
105
+ const evidenceFiles = artifacts.filter((artifact) => artifact.role === 'project-evidence');
106
+ if (evidenceFiles.length !== 1 || evidenceFiles[0].mediaType !== 'application/json')
107
+ throw new WorkflowError('invalid_output', 'A project operation requires one verified project-evidence JSON artifact documenting actual changes.');
108
+ const bytes = await readRegularFile(await resolveArtifactPath(workspace, evidenceFiles[0]));
109
+ let evidence;
110
+ try {
111
+ evidence = JSON.parse(bytes.toString('utf8'));
112
+ }
113
+ catch {
114
+ throw new WorkflowError('invalid_output', 'Project evidence must be valid JSON.');
115
+ }
116
+ await validateProjectEvidence(request, evidence, artifacts);
117
+ }
118
+ };
119
+ //# sourceMappingURL=store-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-validation.js","sourceRoot":"","sources":["../../src/workflow/store-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type ExecutionResult, type OperationFailure, type RoutingDecision, type WorkflowOperation, type WorkflowRequest } from './types.js';
2
+ export { importArtifact, resolveArtifactPath, verifyArtifact } from './artifact.js';
3
+ export declare const operationIdForKey: (idempotencyKey: string) => string;
4
+ export declare const prepareOperation: (workspace: string, request: WorkflowRequest, idempotencyKey: string) => Promise<WorkflowOperation>;
5
+ export declare const readOperation: (workspace: string, id: string) => Promise<WorkflowOperation>;
6
+ export declare const listOperations: (workspace: string) => Promise<WorkflowOperation[]>;
7
+ export declare const dispatchOperation: (workspace: string, id: string, route: RoutingDecision) => Promise<WorkflowOperation>;
8
+ export declare const completeOperation: (workspace: string, id: string, result: ExecutionResult, attemptNumber: number) => Promise<WorkflowOperation>;
9
+ export declare const failOperation: (workspace: string, id: string, failure: OperationFailure, attemptNumber: number) => Promise<WorkflowOperation>;
10
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/workflow/store.ts"],"names":[],"mappings":"AAUA,OAAO,EAAkC,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7K,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpF,eAAO,MAAM,iBAAiB,GAAI,gBAAgB,MAAM,KAAG,MAG1D,CAAC;AAuBF,eAAO,MAAM,gBAAgB,GAAU,WAAW,MAAM,EAAE,SAAS,eAAe,EAAE,gBAAgB,MAAM,KAAG,OAAO,CAAC,iBAAiB,CAoBrI,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,WAAW,MAAM,EAAE,IAAI,MAAM,KAAG,OAAO,CAAC,iBAAiB,CAM5F,CAAC;AAEF,eAAO,MAAM,cAAc,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,iBAAiB,EAAE,CAInF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,WAAW,MAAM,EAAE,IAAI,MAAM,EAAE,OAAO,eAAe,KAAG,OAAO,CAAC,iBAAiB,CAiBxH,CAAC;AASF,eAAO,MAAM,iBAAiB,GAAU,WAAW,MAAM,EAAE,IAAI,MAAM,EAAE,QAAQ,eAAe,EAAE,eAAe,MAAM,KAAG,OAAO,CAAC,iBAAiB,CA2ChJ,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,WAAW,MAAM,EAAE,IAAI,MAAM,EAAE,SAAS,gBAAgB,EAAE,eAAe,MAAM,KAAG,OAAO,CAAC,iBAAiB,CA6B9I,CAAC"}