@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,39 @@
1
+ /**
2
+ * How the runner draws an image: one call to the local Codex CLI's native
3
+ * image tool, through the repo's own headless executor
4
+ * (`packages/codex-conversion/src/images/native.mjs`, shipped in the CLI's
5
+ * `runtime/`). It runs on the user's ChatGPT plan, never with an API key, in an
6
+ * isolated `CODEX_HOME` that links only `auth.json`.
7
+ *
8
+ * The call store makes each call id a durable identity: an id whose call
9
+ * already produced an image returns it without another call, and an id whose
10
+ * call died after dispatch is recovered from its own rollout or refused, never
11
+ * dispatched twice. The runner names calls `slate-<opId>-<slot>` and
12
+ * `slate-<opId>`, so a resumed op replays the same ids.
13
+ */
14
+ export type SlateImageCall = {
15
+ callId: string;
16
+ /** The image prompt, sent verbatim. */
17
+ prompt: string;
18
+ /** Attached images in order; the first is the primary. */
19
+ images: Buffer[];
20
+ /** The frame the result is stretched to exactly. */
21
+ expected: {
22
+ width: number;
23
+ height: number;
24
+ };
25
+ };
26
+ export type SlateImageResult = {
27
+ png: Buffer;
28
+ reused: boolean;
29
+ };
30
+ export type SlateImageExecutor = {
31
+ generate: (call: SlateImageCall) => Promise<SlateImageResult>;
32
+ };
33
+ /** One image call may run this long before it is stopped. */
34
+ export declare const IMAGE_CALL_TIMEOUT_MS: number;
35
+ export declare const createNativeImageExecutor: (args: {
36
+ root: string;
37
+ env?: NodeJS.ProcessEnv;
38
+ }) => SlateImageExecutor;
39
+ //# sourceMappingURL=slate-image-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slate-image-executor.d.ts","sourceRoot":"","sources":["../src/slate-image-executor.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,oDAAoD;IACpD,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAChE,MAAM,MAAM,kBAAkB,GAAG;IAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAA;CAAE,CAAC;AAEnG,6DAA6D;AAC7D,eAAO,MAAM,qBAAqB,QAAc,CAAC;AAmBjD,eAAO,MAAM,yBAAyB,GAAI,MAAM;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAAG,kBAoC3F,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { createHash } from 'node:crypto';
2
+ import path from 'node:path';
3
+ import { fileURLToPath, pathToFileURL } from 'node:url';
4
+ import { resolveCodexBinary } from './slate-local-image.js';
5
+ /** One image call may run this long before it is stopped. */
6
+ export const IMAGE_CALL_TIMEOUT_MS = 15 * 60_000;
7
+ const importRuntime = async () => {
8
+ const base = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', 'runtime', 'codex-conversion', 'src');
9
+ const load = async (file) => await import(pathToFileURL(path.join(base, file)).href);
10
+ const [store, native] = await Promise.all([load('run-store.mjs'), load('images/native.mjs')]);
11
+ return { ...store, ...native };
12
+ };
13
+ const sha256 = (bytes) => createHash('sha256').update(bytes).digest('hex');
14
+ export const createNativeImageExecutor = (args) => {
15
+ const env = args.env ?? process.env;
16
+ return {
17
+ generate: async (call) => {
18
+ const runtime = await importRuntime();
19
+ // The store keeps one folder per call id under `<root>/calls/`.
20
+ const store = runtime.createStore(args.root);
21
+ const request = {
22
+ backend: 'native',
23
+ model: 'gpt-6-astra',
24
+ effort: 'medium',
25
+ imageModel: null,
26
+ normalization: 'exact-stretch-lanczos3',
27
+ expected: call.expected,
28
+ prompt: call.prompt,
29
+ inputSha256: call.images.map(sha256),
30
+ };
31
+ const result = await runtime.executeNativeCall({
32
+ request,
33
+ input: call.images,
34
+ callId: call.callId,
35
+ store,
36
+ codexBinary: resolveCodexBinary(env),
37
+ ...(env.CODEX_HOME?.trim() ? { codexHome: env.CODEX_HOME.trim() } : {}),
38
+ timeoutMs: IMAGE_CALL_TIMEOUT_MS,
39
+ });
40
+ try {
41
+ const decoded = await runtime.decodeNativeResponse(result.bytes);
42
+ return { png: decoded.png, reused: result.reused };
43
+ }
44
+ catch (cause) {
45
+ // The call ended without one usable image. The store already holds its outcome, so a replay
46
+ // answers the same way: the id needs a person's inspection, never a second dispatch.
47
+ throw Object.assign(new Error(`Call ${call.callId} returned no usable image and needs reconciliation`), { code: 'NEEDS_RECONCILIATION', cause });
48
+ }
49
+ },
50
+ };
51
+ };
52
+ //# sourceMappingURL=slate-image-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slate-image-executor.js","sourceRoot":"","sources":["../src/slate-image-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { SlateRuntime } from './slate-runtime.js';
2
+ import type { SlateSearch } from './slate-workspace-types.js';
3
+ /**
4
+ * Inspiration: a free corpus search and a local selection. The search asks the
5
+ * public tier (balanced mode, at most 24 references, no account); the
6
+ * selection is a list of at most eight reference ids the next Design round is
7
+ * drawn from. Neither starts any work.
8
+ */
9
+ export declare const DEFAULT_SEARCH_COUNT = 12;
10
+ export declare const runSearch: (args: {
11
+ runtime: SlateRuntime;
12
+ root: string;
13
+ query: unknown;
14
+ count: unknown;
15
+ }) => Promise<SlateSearch>;
16
+ /** Replace the whole selection: two views can never diverge by racing toggles. */
17
+ export declare const setSelection: (args: {
18
+ runtime: SlateRuntime;
19
+ root: string;
20
+ referenceIds: unknown;
21
+ }) => Promise<string[]>;
22
+ //# sourceMappingURL=slate-inspiration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slate-inspiration.d.ts","sourceRoot":"","sources":["../src/slate-inspiration.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAOvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D;;;;;GAKG;AAEH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAyBvC,eAAO,MAAM,SAAS,GAAU,MAAM;IACpC,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB,KAAG,OAAO,CAAC,WAAW,CAiDtB,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,YAAY,GAAU,MAAM;IACvC,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;CACvB,KAAG,OAAO,CAAC,MAAM,EAAE,CAmBnB,CAAC"}
@@ -0,0 +1,112 @@
1
+ import { PUBLIC_CORPUS_MAX_COUNT } from './corpus-access.js';
2
+ import { cleanUserText } from './slate-actions.js';
3
+ import { corpusFailure } from './slate-corpus.js';
4
+ import { SlateError } from './slate-errors.js';
5
+ import { REFERENCE_ID_PATTERN, sha256Hex } from './slate-ids.js';
6
+ import { appendLedger } from './slate-ledger.js';
7
+ import { namedReferenceIds } from './slate-reference-ids.js';
8
+ import { metaFromItem } from './slate-round-search.js';
9
+ import { SEARCH_QUERY_MAX_CHARACTERS, WORKSPACE_MAX_SEARCHES, WORKSPACE_MAX_SELECTED, } from './slate-workspace-parse.js';
10
+ import { NoWrite, loadWorkspaceAt, mutateWorkspace } from './slate-workspace-store.js';
11
+ /**
12
+ * Inspiration: a free corpus search and a local selection. The search asks the
13
+ * public tier (balanced mode, at most 24 references, no account); the
14
+ * selection is a list of at most eight reference ids the next Design round is
15
+ * drawn from. Neither starts any work.
16
+ */
17
+ export const DEFAULT_SEARCH_COUNT = 12;
18
+ const normalizeQuery = (value) => {
19
+ if (typeof value !== 'string')
20
+ throw new SlateError('invalid_input', 'query must be text');
21
+ const query = cleanUserText(value).replace(/\s+/gu, ' ');
22
+ if (!query)
23
+ throw new SlateError('invalid_input', 'Type something to search for.');
24
+ if ([...query].length > SEARCH_QUERY_MAX_CHARACTERS) {
25
+ throw new SlateError('invalid_input', `A search can be at most ${SEARCH_QUERY_MAX_CHARACTERS} characters.`);
26
+ }
27
+ return query;
28
+ };
29
+ const normalizeCount = (value) => {
30
+ if (value === undefined || value === null)
31
+ return DEFAULT_SEARCH_COUNT;
32
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 1 || value > PUBLIC_CORPUS_MAX_COUNT) {
33
+ throw new SlateError('invalid_input', `count must be an integer from 1 to ${PUBLIC_CORPUS_MAX_COUNT}`);
34
+ }
35
+ return value;
36
+ };
37
+ /** One identical search is one corpus query: its key is derived from the workspace, the words and the count. */
38
+ const searchDigest = (workspaceId, query, count) => (sha256Hex(`${workspaceId}|${query.toLowerCase()}|${count}`));
39
+ export const runSearch = async (args) => {
40
+ const query = normalizeQuery(args.query);
41
+ const count = normalizeCount(args.count);
42
+ const { workspace } = await loadWorkspaceAt(args.root, args.runtime.now);
43
+ const digest = searchDigest(workspace.workspaceId, query, count);
44
+ const searchId = digest.slice(0, 16);
45
+ // An identical search is answered from the record: no request, none of the daily allowance.
46
+ const stored = workspace.inspiration.searches.find((entry) => entry.searchId === searchId);
47
+ if (stored) {
48
+ if (workspace.inspiration.searches.at(-1)?.searchId !== searchId) {
49
+ await mutateWorkspace(args.root, (ws) => {
50
+ const index = ws.inspiration.searches.findIndex((entry) => entry.searchId === searchId);
51
+ if (index < 0 || index === ws.inspiration.searches.length - 1)
52
+ return new NoWrite(undefined);
53
+ ws.inspiration.searches.push(...ws.inspiration.searches.splice(index, 1));
54
+ return undefined;
55
+ }, { now: args.runtime.now });
56
+ }
57
+ return stored;
58
+ }
59
+ let items;
60
+ try {
61
+ items = (await args.runtime.corpus().inspire({ q: query, mode: 'balanced', k: count }, { idempotencyKey: `slate-search-${digest}` })).items;
62
+ }
63
+ catch (error) {
64
+ throw corpusFailure(error);
65
+ }
66
+ const usable = items.filter((item, index) => REFERENCE_ID_PATTERN.test(item.id) && items.findIndex((other) => other.id === item.id) === index);
67
+ return mutateWorkspace(args.root, async (ws, context) => {
68
+ const existing = ws.inspiration.searches.find((entry) => entry.searchId === searchId);
69
+ if (existing)
70
+ return new NoWrite(existing);
71
+ const search = {
72
+ searchId,
73
+ query,
74
+ mode: 'balanced',
75
+ at: context.now.toISOString(),
76
+ referenceIds: usable.map((item) => item.id),
77
+ };
78
+ ws.inspiration.searches.push(search);
79
+ if (ws.inspiration.searches.length > WORKSPACE_MAX_SEARCHES) {
80
+ ws.inspiration.searches.splice(0, ws.inspiration.searches.length - WORKSPACE_MAX_SEARCHES);
81
+ }
82
+ for (const item of usable)
83
+ ws.references[item.id] = metaFromItem(item);
84
+ await appendLedger(args.root, { event: 'search', searchId, count, found: usable.length, at: search.at });
85
+ return search;
86
+ }, { now: args.runtime.now });
87
+ };
88
+ /** Replace the whole selection: two views can never diverge by racing toggles. */
89
+ export const setSelection = async (args) => {
90
+ const ids = args.referenceIds;
91
+ if (!Array.isArray(ids) || ids.some((id) => typeof id !== 'string' || !REFERENCE_ID_PATTERN.test(id))) {
92
+ throw new SlateError('invalid_input', 'referenceIds must be a list of reference ids');
93
+ }
94
+ const wanted = ids;
95
+ if (new Set(wanted).size !== wanted.length)
96
+ throw new SlateError('invalid_input', 'referenceIds must not repeat');
97
+ if (wanted.length > WORKSPACE_MAX_SELECTED)
98
+ throw new SlateError('invalid_input', `At most ${WORKSPACE_MAX_SELECTED} references can be selected.`);
99
+ return mutateWorkspace(args.root, async (ws, context) => {
100
+ const named = new Set(namedReferenceIds(ws));
101
+ const unknown = wanted.find((id) => !named.has(id));
102
+ if (unknown)
103
+ throw new SlateError('unknown_reference', `${unknown} is not in a round, a search or the selection of this workspace.`);
104
+ if (ws.inspiration.selected.length === wanted.length && ws.inspiration.selected.every((id, index) => id === wanted[index])) {
105
+ return new NoWrite([...ws.inspiration.selected]);
106
+ }
107
+ ws.inspiration.selected = wanted;
108
+ await appendLedger(args.root, { event: 'inspiration', selected: wanted.length, at: context.now.toISOString() });
109
+ return [...wanted];
110
+ }, { now: args.runtime.now });
111
+ };
112
+ //# sourceMappingURL=slate-inspiration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slate-inspiration.js","sourceRoot":"","sources":["../src/slate-inspiration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Option and version labels. Options are lettered in allocation order across
3
+ * rounds, A to Z and then AA, AB, ... (spreadsheet column order); labels are
4
+ * never reused. A version label is the option label plus its number above 1.
5
+ */
6
+ export declare const optionLabelFor: (index: number) => string;
7
+ export declare const optionIndexOf: (label: string) => number;
8
+ /** The next `count` labels after the highest one ever allocated. */
9
+ export declare const nextOptionLabels: (existing: readonly string[], count: number) => string[];
10
+ export declare const versionLabelFor: (optionLabel: string, n: number) => string;
11
+ //# sourceMappingURL=slate-labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slate-labels.d.ts","sourceRoot":"","sources":["../src/slate-labels.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,KAAG,MAU9C,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,MAK7C,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,gBAAgB,GAAI,UAAU,SAAS,MAAM,EAAE,EAAE,OAAO,MAAM,KAAG,MAAM,EAGnF,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,aAAa,MAAM,EAAE,GAAG,MAAM,KAAG,MAEhE,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Option and version labels. Options are lettered in allocation order across
3
+ * rounds, A to Z and then AA, AB, ... (spreadsheet column order); labels are
4
+ * never reused. A version label is the option label plus its number above 1.
5
+ */
6
+ export const optionLabelFor = (index) => {
7
+ if (!Number.isInteger(index) || index < 0)
8
+ throw new Error(`option index ${index} is not a non-negative integer`);
9
+ let remaining = index + 1;
10
+ let label = '';
11
+ while (remaining > 0) {
12
+ const digit = (remaining - 1) % 26;
13
+ label = String.fromCharCode(65 + digit) + label;
14
+ remaining = Math.floor((remaining - 1) / 26);
15
+ }
16
+ return label;
17
+ };
18
+ export const optionIndexOf = (label) => {
19
+ if (!/^[A-Z]{1,3}$/u.test(label))
20
+ throw new Error(`${JSON.stringify(label)} is not an option label`);
21
+ let value = 0;
22
+ for (const character of label)
23
+ value = value * 26 + (character.charCodeAt(0) - 64);
24
+ return value - 1;
25
+ };
26
+ /** The next `count` labels after the highest one ever allocated. */
27
+ export const nextOptionLabels = (existing, count) => {
28
+ const next = existing.reduce((highest, label) => Math.max(highest, optionIndexOf(label) + 1), 0);
29
+ return Array.from({ length: count }, (_unused, offset) => optionLabelFor(next + offset));
30
+ };
31
+ export const versionLabelFor = (optionLabel, n) => (n > 1 ? `${optionLabel}${n}` : optionLabel);
32
+ //# sourceMappingURL=slate-labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slate-labels.js","sourceRoot":"","sources":["../src/slate-labels.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAa,EAAU,EAAE;IACtD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,KAAK,gCAAgC,CAAC,CAAC;IAClH,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;IAC1B,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,OAAO,SAAS,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACnC,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;QAChD,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAa,EAAU,EAAE;IACrD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACrG,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,SAAS,IAAI,KAAK;QAAE,KAAK,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACnF,OAAO,KAAK,GAAG,CAAC,CAAC;AACnB,CAAC,CAAC;AAEF,oEAAoE;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAA2B,EAAE,KAAa,EAAY,EAAE;IACvF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjG,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;AAC3F,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,WAAmB,EAAE,CAAS,EAAU,EAAE,CAAC,CACzE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAC3C,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * `ledger.jsonl`: an append-only audit of the workspace's boundaries, one JSON
3
+ * line per event, written BEFORE the step it names. The record in
4
+ * `workspace.json` is the resumable artifact; this file is what an operator
5
+ * reads to see what was started and what finished. It holds no money events:
6
+ * the workspace costs nothing. Lines are at most 4 KiB and are never edited.
7
+ */
8
+ export declare const LEDGER_MAX_LINE_BYTES = 4096;
9
+ export type LedgerEvent = 'approved' | 'resumed' | 'search' | 'call_started' | 'call_finished' | 'settled' | 'failed' | 'superseded' | 'runner_started' | 'pick' | 'handoff' | 'inspiration';
10
+ export type LedgerEntry = {
11
+ at: string;
12
+ event: LedgerEvent;
13
+ opId?: string;
14
+ runId?: string;
15
+ [detail: string]: unknown;
16
+ };
17
+ export type LedgerInput = {
18
+ at?: string;
19
+ event: LedgerEvent;
20
+ opId?: string;
21
+ runId?: string;
22
+ [detail: string]: unknown;
23
+ };
24
+ export declare const appendLedger: (root: string, entry: LedgerInput) => Promise<void>;
25
+ export declare const readLedger: (root: string) => Promise<{
26
+ entries: LedgerEntry[];
27
+ tornFinalLine: boolean;
28
+ }>;
29
+ //# sourceMappingURL=slate-ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slate-ledger.d.ts","sourceRoot":"","sources":["../src/slate-ledger.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,MAAM,MAAM,WAAW,GACnB,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,GAAG,eAAe,GACpE,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,gBAAgB,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,CAAC;AAEhG,MAAM,MAAM,WAAW,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AACvH,MAAM,MAAM,WAAW,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAExH,eAAO,MAAM,YAAY,GAAU,MAAM,MAAM,EAAE,OAAO,WAAW,KAAG,OAAO,CAAC,IAAI,CAiBjF,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,aAAa,EAAE,OAAO,CAAA;CAAE,CA6BzG,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { open, readFile } from 'node:fs/promises';
2
+ import { ledgerFile } from './slate-paths.js';
3
+ /**
4
+ * `ledger.jsonl`: an append-only audit of the workspace's boundaries, one JSON
5
+ * line per event, written BEFORE the step it names. The record in
6
+ * `workspace.json` is the resumable artifact; this file is what an operator
7
+ * reads to see what was started and what finished. It holds no money events:
8
+ * the workspace costs nothing. Lines are at most 4 KiB and are never edited.
9
+ */
10
+ export const LEDGER_MAX_LINE_BYTES = 4096;
11
+ export const appendLedger = async (root, entry) => {
12
+ const full = { ...entry, at: entry.at ?? new Date().toISOString() };
13
+ let line = JSON.stringify(full);
14
+ if (Buffer.byteLength(line) > LEDGER_MAX_LINE_BYTES - 1) {
15
+ const message = typeof full.message === 'string' ? full.message.slice(0, 300) : undefined;
16
+ line = JSON.stringify({ ...full, ...(message === undefined ? {} : { message }), truncated: true });
17
+ }
18
+ if (Buffer.byteLength(line) > LEDGER_MAX_LINE_BYTES - 1) {
19
+ line = JSON.stringify({ at: full.at, event: full.event, opId: full.opId, truncated: true });
20
+ }
21
+ // O_APPEND and one write per line keep concurrent writers from interleaving.
22
+ const handle = await open(ledgerFile(root), 'a', 0o600);
23
+ try {
24
+ await handle.write(`${line}\n`);
25
+ }
26
+ finally {
27
+ await handle.close();
28
+ }
29
+ };
30
+ export const readLedger = async (root) => {
31
+ const file = ledgerFile(root);
32
+ let raw;
33
+ try {
34
+ raw = await readFile(file, 'utf8');
35
+ }
36
+ catch (error) {
37
+ if (error.code === 'ENOENT')
38
+ return { entries: [], tornFinalLine: false };
39
+ throw error;
40
+ }
41
+ const endsCleanly = raw.endsWith('\n');
42
+ const lines = raw.split('\n');
43
+ if (lines.at(-1) === '')
44
+ lines.pop();
45
+ const entries = [];
46
+ let tornFinalLine = false;
47
+ lines.forEach((line, index) => {
48
+ try {
49
+ const parsed = JSON.parse(line);
50
+ if (typeof parsed?.event !== 'string')
51
+ throw new Error('no event');
52
+ entries.push(parsed);
53
+ }
54
+ catch {
55
+ if (index === lines.length - 1 && !endsCleanly) {
56
+ // A crash mid-append leaves an unterminated final line: ignored and reported.
57
+ tornFinalLine = true;
58
+ return;
59
+ }
60
+ throw new Error(`${file} line ${index + 1} is not a ledger entry`);
61
+ }
62
+ });
63
+ return { entries, tornFinalLine };
64
+ };
65
+ //# sourceMappingURL=slate-ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slate-ledger.js","sourceRoot":"","sources":["../src/slate-ledger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { RUNNER_ALIVE_WINDOW_MS, RUNNER_HEARTBEAT_INTERVAL_MS } from './slate-lock.js';
2
+ import type { SlateOp, SlateWorkspace } from './slate-workspace-types.js';
3
+ /**
4
+ * What is actually running, derived from the per-op lock file and the clock.
5
+ * `starting` and `interrupted` are never written to `workspace.json`: a record
6
+ * written by a process that has since died must not claim it is still working.
7
+ */
8
+ export declare const RUNNER_START_GRACE_MS = 30000;
9
+ export { RUNNER_ALIVE_WINDOW_MS, RUNNER_HEARTBEAT_INTERVAL_MS };
10
+ export type RunnerState = {
11
+ alive: boolean;
12
+ pid: number | null;
13
+ heartbeatAgeMs: number | null;
14
+ };
15
+ export type DerivedOpState = 'starting' | 'running' | 'succeeded' | 'failed' | 'interrupted' | 'superseded';
16
+ /** Read-only: never creates or removes the lock. */
17
+ export declare const readRunnerState: (root: string, opId: string, now?: number) => Promise<RunnerState>;
18
+ export declare const deriveOpState: (op: SlateOp, runner: RunnerState, now?: number) => DerivedOpState;
19
+ export type Liveness = {
20
+ runners: Map<string, RunnerState>;
21
+ states: Map<string, DerivedOpState>;
22
+ digest: string;
23
+ };
24
+ /** Liveness of every non-terminal op, plus the digest that goes into the view's `stamp`. */
25
+ export declare const readLiveness: (root: string, workspace: SlateWorkspace, now?: number) => Promise<Liveness>;
26
+ //# sourceMappingURL=slate-liveness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slate-liveness.d.ts","sourceRoot":"","sources":["../src/slate-liveness.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAG7B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE1E;;;;GAIG;AAEH,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,CAAC;AAEhE,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAChG,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,aAAa,GAAG,YAAY,CAAC;AAE5G,oDAAoD;AACpD,eAAO,MAAM,eAAe,GAAU,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,YAAgB,KAAG,OAAO,CAAC,WAAW,CAYvG,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,IAAI,OAAO,EAAE,QAAQ,WAAW,EAAE,YAAgB,KAAG,cAKlF,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElH,4FAA4F;AAC5F,eAAO,MAAM,YAAY,GAAU,MAAM,MAAM,EAAE,WAAW,cAAc,EAAE,YAAgB,KAAG,OAAO,CAAC,QAAQ,CAU9G,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { readFile, stat } from 'node:fs/promises';
2
+ import { sha256Hex } from './slate-ids.js';
3
+ import { RUNNER_ALIVE_WINDOW_MS, RUNNER_HEARTBEAT_INTERVAL_MS, parseHolder, processIsAlive, } from './slate-lock.js';
4
+ import { opLockFile } from './slate-paths.js';
5
+ /**
6
+ * What is actually running, derived from the per-op lock file and the clock.
7
+ * `starting` and `interrupted` are never written to `workspace.json`: a record
8
+ * written by a process that has since died must not claim it is still working.
9
+ */
10
+ export const RUNNER_START_GRACE_MS = 30_000;
11
+ export { RUNNER_ALIVE_WINDOW_MS, RUNNER_HEARTBEAT_INTERVAL_MS };
12
+ /** Read-only: never creates or removes the lock. */
13
+ export const readRunnerState = async (root, opId, now = Date.now()) => {
14
+ const file = opLockFile(root, opId);
15
+ try {
16
+ const [raw, entry] = await Promise.all([readFile(file, 'utf8'), stat(file)]);
17
+ const holder = parseHolder(raw);
18
+ if (!holder)
19
+ return { alive: false, pid: null, heartbeatAgeMs: Math.round(Math.max(0, now - entry.mtimeMs)) };
20
+ const age = Math.round(Math.max(0, now - entry.mtimeMs));
21
+ return { alive: processIsAlive(holder.pid) && age <= RUNNER_ALIVE_WINDOW_MS, pid: holder.pid, heartbeatAgeMs: age };
22
+ }
23
+ catch (error) {
24
+ if (error.code === 'ENOENT')
25
+ return { alive: false, pid: null, heartbeatAgeMs: null };
26
+ throw error;
27
+ }
28
+ };
29
+ export const deriveOpState = (op, runner, now = Date.now()) => {
30
+ if (op.state !== 'running')
31
+ return op.state;
32
+ if (runner.alive)
33
+ return 'running';
34
+ const lastSpawn = Date.parse(op.spawnedAt ?? op.startedAt);
35
+ return now - lastSpawn < RUNNER_START_GRACE_MS ? 'starting' : 'interrupted';
36
+ };
37
+ /** Liveness of every non-terminal op, plus the digest that goes into the view's `stamp`. */
38
+ export const readLiveness = async (root, workspace, now = Date.now()) => {
39
+ const runners = new Map();
40
+ const states = new Map();
41
+ for (const op of workspace.ops) {
42
+ const runner = op.state === 'running' ? await readRunnerState(root, op.opId, now) : { alive: false, pid: null, heartbeatAgeMs: null };
43
+ runners.set(op.opId, runner);
44
+ states.set(op.opId, deriveOpState(op, runner, now));
45
+ }
46
+ const digest = sha256Hex([...states.entries()].map(([id, state]) => `${id}:${state}`).join('|')).slice(0, 8);
47
+ return { runners, states, digest };
48
+ };
49
+ //# sourceMappingURL=slate-liveness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slate-liveness.js","sourceRoot":"","sources":["../src/slate-liveness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { LocalImageState } from './slate-view.js';
2
+ /**
3
+ * Whether Design and Edit can run on this Mac: the local Codex CLI, signed in
4
+ * with ChatGPT, with the image model available. It reads only the readiness
5
+ * probe (`codex --version`, `codex login status`, `codex exec --help` and the
6
+ * model cache), which runs no inference, and is asked at most once a minute
7
+ * per server. The workspace never buys an alternative: when this says not
8
+ * ready, the dialogs show the reason and stay disabled.
9
+ */
10
+ export type SlateImageProbe = () => Promise<LocalImageState>;
11
+ export declare const LOCAL_IMAGE_PROBE_TTL_MS = 60000;
12
+ /** The Codex desktop app ships its own CLI; it is the last place looked. */
13
+ export declare const CODEX_APP_BINARY = "/Applications/Codex.app/Contents/Resources/codex";
14
+ /** `TWELVE_UI_CODEX_BIN`, then `codex` on `PATH`, then the Codex app bundle if it is installed. */
15
+ export declare const resolveCodexBinary: (env?: NodeJS.ProcessEnv, exists?: (file: string) => boolean) => string;
16
+ export declare const codexReadinessProbe: (env?: NodeJS.ProcessEnv) => SlateImageProbe;
17
+ /** The probe's answer, kept for a minute. A not-ready reason is passed through verbatim. */
18
+ export declare const cachedImageProbe: (probe: SlateImageProbe, now: () => Date) => SlateImageProbe;
19
+ //# sourceMappingURL=slate-local-image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slate-local-image.d.ts","sourceRoot":"","sources":["../src/slate-local-image.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD;;;;;;;GAOG;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;AAE7D,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAE/C,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,qDAAqD,CAAC;AAEnF,mGAAmG;AACnG,eAAO,MAAM,kBAAkB,GAC7B,MAAK,MAAM,CAAC,UAAwB,EACpC,SAAQ,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,KAC7C,MAMF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,MAAK,MAAM,CAAC,UAAwB,KAAG,eAM1E,CAAC;AAEF,4FAA4F;AAC5F,eAAO,MAAM,gBAAgB,GAAI,OAAO,eAAe,EAAE,KAAK,MAAM,IAAI,KAAG,eAS1E,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { existsSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { probeCodexReadiness } from './cli-codex-readiness.js';
4
+ export const LOCAL_IMAGE_PROBE_TTL_MS = 60_000;
5
+ /** The Codex desktop app ships its own CLI; it is the last place looked. */
6
+ export const CODEX_APP_BINARY = '/Applications/Codex.app/Contents/Resources/codex';
7
+ /** `TWELVE_UI_CODEX_BIN`, then `codex` on `PATH`, then the Codex app bundle if it is installed. */
8
+ export const resolveCodexBinary = (env = process.env, exists = existsSync) => {
9
+ const explicit = env.TWELVE_UI_CODEX_BIN?.trim();
10
+ if (explicit)
11
+ return explicit;
12
+ const onPath = (env.PATH ?? '').split(path.delimiter).some((directory) => directory !== '' && exists(path.join(directory, 'codex')));
13
+ if (onPath)
14
+ return 'codex';
15
+ return exists(CODEX_APP_BINARY) ? CODEX_APP_BINARY : 'codex';
16
+ };
17
+ export const codexReadinessProbe = (env = process.env) => async () => {
18
+ const result = await probeCodexReadiness({
19
+ codexBin: resolveCodexBinary(env),
20
+ ...(env.CODEX_HOME?.trim() ? { codexHome: env.CODEX_HOME.trim() } : {}),
21
+ });
22
+ return { ready: result.ready, reason: result.ready ? null : result.reason };
23
+ };
24
+ /** The probe's answer, kept for a minute. A not-ready reason is passed through verbatim. */
25
+ export const cachedImageProbe = (probe, now) => {
26
+ let cached;
27
+ return async () => {
28
+ const at = now().getTime();
29
+ if (cached && at - cached.at < LOCAL_IMAGE_PROBE_TTL_MS && at >= cached.at)
30
+ return cached.state;
31
+ const state = await probe();
32
+ cached = { at, state };
33
+ return state;
34
+ };
35
+ };
36
+ //# sourceMappingURL=slate-local-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slate-local-image.js","sourceRoot":"","sources":["../src/slate-local-image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAc/D,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAE/C,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG,kDAAkD,CAAC;AAEnF,mGAAmG;AACnG,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,MAAyB,OAAO,CAAC,GAAG,EACpC,SAAoC,UAAU,EACtC,EAAE;IACV,MAAM,QAAQ,GAAG,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC;IACjD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACrI,IAAI,MAAM;QAAE,OAAO,OAAO,CAAC;IAC3B,OAAO,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC;AAC/D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAyB,OAAO,CAAC,GAAG,EAAmB,EAAE,CAAC,KAAK,IAAI,EAAE;IACvG,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC;QACvC,QAAQ,EAAE,kBAAkB,CAAC,GAAG,CAAC;QACjC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxE,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;AAC9E,CAAC,CAAC;AAEF,4FAA4F;AAC5F,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAsB,EAAE,GAAe,EAAmB,EAAE;IAC3F,IAAI,MAA0D,CAAC;IAC/D,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAC3B,IAAI,MAAM,IAAI,EAAE,GAAG,MAAM,CAAC,EAAE,GAAG,wBAAwB,IAAI,EAAE,IAAI,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC;QAChG,MAAM,KAAK,GAAG,MAAM,KAAK,EAAE,CAAC;QAC5B,MAAM,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC,CAAC"}