@12ui/design 0.2.75 → 0.2.77

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 (447) hide show
  1. package/README.md +126 -116
  2. package/SKILL.md +33 -28
  3. package/dist/cli-arguments.d.ts.map +1 -1
  4. package/dist/cli-arguments.js +21 -7
  5. package/dist/cli-arguments.js.map +1 -1
  6. package/dist/cli-capabilities.d.ts +3 -2
  7. package/dist/cli-capabilities.d.ts.map +1 -1
  8. package/dist/cli-capabilities.js +2 -1
  9. package/dist/cli-capabilities.js.map +1 -1
  10. package/dist/cli-codex-readiness.d.ts +6 -0
  11. package/dist/cli-codex-readiness.d.ts.map +1 -1
  12. package/dist/cli-codex-readiness.js +12 -12
  13. package/dist/cli-codex-readiness.js.map +1 -1
  14. package/dist/cli-help/design.d.ts +2 -2
  15. package/dist/cli-help/design.d.ts.map +1 -1
  16. package/dist/cli-help/design.js +3 -1
  17. package/dist/cli-help/design.js.map +1 -1
  18. package/dist/cli-help/index.d.ts +19 -9
  19. package/dist/cli-help/index.d.ts.map +1 -1
  20. package/dist/cli-help/scene.d.ts +15 -5
  21. package/dist/cli-help/scene.d.ts.map +1 -1
  22. package/dist/cli-help/scene.js +44 -0
  23. package/dist/cli-help/scene.js.map +1 -1
  24. package/dist/cli-help/workflow.d.ts +2 -2
  25. package/dist/cli-help/workflow.d.ts.map +1 -1
  26. package/dist/cli-help/workflow.js +4 -3
  27. package/dist/cli-help/workflow.js.map +1 -1
  28. package/dist/cli-review-command.d.ts.map +1 -1
  29. package/dist/cli-review-command.js +2 -0
  30. package/dist/cli-review-command.js.map +1 -1
  31. package/dist/cli-run.d.ts.map +1 -1
  32. package/dist/cli-run.js +6 -0
  33. package/dist/cli-run.js.map +1 -1
  34. package/dist/cli-scene-command.d.ts.map +1 -1
  35. package/dist/cli-scene-command.js +39 -6
  36. package/dist/cli-scene-command.js.map +1 -1
  37. package/dist/cli-usage.d.ts.map +1 -1
  38. package/dist/cli-usage.js +8 -6
  39. package/dist/cli-usage.js.map +1 -1
  40. package/dist/cli-workspace-draw.d.ts +1 -11
  41. package/dist/cli-workspace-draw.d.ts.map +1 -1
  42. package/dist/cli-workspace-draw.js +17 -18
  43. package/dist/cli-workspace-draw.js.map +1 -1
  44. package/dist/cli-workspace-runner.d.ts +30 -0
  45. package/dist/cli-workspace-runner.d.ts.map +1 -0
  46. package/dist/cli-workspace-runner.js +105 -0
  47. package/dist/cli-workspace-runner.js.map +1 -0
  48. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  49. package/dist/legacy-skill-catalog.js +26 -2
  50. package/dist/legacy-skill-catalog.js.map +1 -1
  51. package/dist/mcp-slate-command.d.ts +9 -0
  52. package/dist/mcp-slate-command.d.ts.map +1 -1
  53. package/dist/mcp-slate-command.js +19 -5
  54. package/dist/mcp-slate-command.js.map +1 -1
  55. package/dist/mcp-slate-image.js +1 -1
  56. package/dist/mcp-slate-image.js.map +1 -1
  57. package/dist/mcp-slate-tool-defs.js +1 -1
  58. package/dist/mcp-slate-tool-defs.js.map +1 -1
  59. package/dist/mcp-slate-ui-copy.d.ts +403 -33
  60. package/dist/mcp-slate-ui-copy.d.ts.map +1 -1
  61. package/dist/mcp-slate-ui-copy.js +247 -57
  62. package/dist/mcp-slate-ui-copy.js.map +1 -1
  63. package/dist/mcp-slate-ui-icu.d.ts +47 -0
  64. package/dist/mcp-slate-ui-icu.d.ts.map +1 -0
  65. package/dist/mcp-slate-ui-icu.js +229 -0
  66. package/dist/mcp-slate-ui-icu.js.map +1 -0
  67. package/dist/mcp-slate-ui-locale-match.d.ts +12 -0
  68. package/dist/mcp-slate-ui-locale-match.d.ts.map +1 -0
  69. package/dist/mcp-slate-ui-locale-match.js +34 -0
  70. package/dist/mcp-slate-ui-locale-match.js.map +1 -0
  71. package/dist/mcp-slate-ui-locales/de-DE.d.ts +9 -0
  72. package/dist/mcp-slate-ui-locales/de-DE.d.ts.map +1 -0
  73. package/dist/mcp-slate-ui-locales/de-DE.js +217 -0
  74. package/dist/mcp-slate-ui-locales/de-DE.js.map +1 -0
  75. package/dist/mcp-slate-ui-locales/es-419.d.ts +9 -0
  76. package/dist/mcp-slate-ui-locales/es-419.d.ts.map +1 -0
  77. package/dist/mcp-slate-ui-locales/es-419.js +217 -0
  78. package/dist/mcp-slate-ui-locales/es-419.js.map +1 -0
  79. package/dist/mcp-slate-ui-locales/es-ES.d.ts +9 -0
  80. package/dist/mcp-slate-ui-locales/es-ES.d.ts.map +1 -0
  81. package/dist/mcp-slate-ui-locales/es-ES.js +217 -0
  82. package/dist/mcp-slate-ui-locales/es-ES.js.map +1 -0
  83. package/dist/mcp-slate-ui-locales/fr-FR.d.ts +9 -0
  84. package/dist/mcp-slate-ui-locales/fr-FR.d.ts.map +1 -0
  85. package/dist/mcp-slate-ui-locales/fr-FR.js +217 -0
  86. package/dist/mcp-slate-ui-locales/fr-FR.js.map +1 -0
  87. package/dist/mcp-slate-ui-locales/hi-IN.d.ts +9 -0
  88. package/dist/mcp-slate-ui-locales/hi-IN.d.ts.map +1 -0
  89. package/dist/mcp-slate-ui-locales/hi-IN.js +217 -0
  90. package/dist/mcp-slate-ui-locales/hi-IN.js.map +1 -0
  91. package/dist/mcp-slate-ui-locales/index.d.ts +11 -0
  92. package/dist/mcp-slate-ui-locales/index.d.ts.map +1 -0
  93. package/dist/mcp-slate-ui-locales/index.js +34 -0
  94. package/dist/mcp-slate-ui-locales/index.js.map +1 -0
  95. package/dist/mcp-slate-ui-locales/it-IT.d.ts +9 -0
  96. package/dist/mcp-slate-ui-locales/it-IT.d.ts.map +1 -0
  97. package/dist/mcp-slate-ui-locales/it-IT.js +217 -0
  98. package/dist/mcp-slate-ui-locales/it-IT.js.map +1 -0
  99. package/dist/mcp-slate-ui-locales/ja-JP.d.ts +9 -0
  100. package/dist/mcp-slate-ui-locales/ja-JP.d.ts.map +1 -0
  101. package/dist/mcp-slate-ui-locales/ja-JP.js +217 -0
  102. package/dist/mcp-slate-ui-locales/ja-JP.js.map +1 -0
  103. package/dist/mcp-slate-ui-locales/ko-KR.d.ts +9 -0
  104. package/dist/mcp-slate-ui-locales/ko-KR.d.ts.map +1 -0
  105. package/dist/mcp-slate-ui-locales/ko-KR.js +217 -0
  106. package/dist/mcp-slate-ui-locales/ko-KR.js.map +1 -0
  107. package/dist/mcp-slate-ui-locales/pt-BR.d.ts +9 -0
  108. package/dist/mcp-slate-ui-locales/pt-BR.d.ts.map +1 -0
  109. package/dist/mcp-slate-ui-locales/pt-BR.js +217 -0
  110. package/dist/mcp-slate-ui-locales/pt-BR.js.map +1 -0
  111. package/dist/mcp-slate-ui-locales/zh-CN.d.ts +9 -0
  112. package/dist/mcp-slate-ui-locales/zh-CN.d.ts.map +1 -0
  113. package/dist/mcp-slate-ui-locales/zh-CN.js +217 -0
  114. package/dist/mcp-slate-ui-locales/zh-CN.js.map +1 -0
  115. package/dist/mcp-slate-ui-locales/zh-TW.d.ts +9 -0
  116. package/dist/mcp-slate-ui-locales/zh-TW.d.ts.map +1 -0
  117. package/dist/mcp-slate-ui-locales/zh-TW.js +217 -0
  118. package/dist/mcp-slate-ui-locales/zh-TW.js.map +1 -0
  119. package/dist/mcp-slate-ui-script-bridge.d.ts.map +1 -1
  120. package/dist/mcp-slate-ui-script-bridge.js +8 -9
  121. package/dist/mcp-slate-ui-script-bridge.js.map +1 -1
  122. package/dist/mcp-slate-ui-script-dialog.d.ts.map +1 -1
  123. package/dist/mcp-slate-ui-script-dialog.js +60 -30
  124. package/dist/mcp-slate-ui-script-dialog.js.map +1 -1
  125. package/dist/mcp-slate-ui-script-inline.d.ts +9 -6
  126. package/dist/mcp-slate-ui-script-inline.d.ts.map +1 -1
  127. package/dist/mcp-slate-ui-script-inline.js +91 -46
  128. package/dist/mcp-slate-ui-script-inline.js.map +1 -1
  129. package/dist/mcp-slate-ui-script-inspiration-collage.d.ts +20 -0
  130. package/dist/mcp-slate-ui-script-inspiration-collage.d.ts.map +1 -0
  131. package/dist/mcp-slate-ui-script-inspiration-collage.js +68 -0
  132. package/dist/mcp-slate-ui-script-inspiration-collage.js.map +1 -0
  133. package/dist/mcp-slate-ui-script-inspiration-grid.d.ts +26 -0
  134. package/dist/mcp-slate-ui-script-inspiration-grid.d.ts.map +1 -0
  135. package/dist/mcp-slate-ui-script-inspiration-grid.js +246 -0
  136. package/dist/mcp-slate-ui-script-inspiration-grid.js.map +1 -0
  137. package/dist/mcp-slate-ui-script-inspiration.d.ts +10 -9
  138. package/dist/mcp-slate-ui-script-inspiration.d.ts.map +1 -1
  139. package/dist/mcp-slate-ui-script-inspiration.js +161 -120
  140. package/dist/mcp-slate-ui-script-inspiration.js.map +1 -1
  141. package/dist/mcp-slate-ui-script-l10n.d.ts +29 -0
  142. package/dist/mcp-slate-ui-script-l10n.d.ts.map +1 -0
  143. package/dist/mcp-slate-ui-script-l10n.js +135 -0
  144. package/dist/mcp-slate-ui-script-l10n.js.map +1 -0
  145. package/dist/mcp-slate-ui-script-more.d.ts +3 -2
  146. package/dist/mcp-slate-ui-script-more.d.ts.map +1 -1
  147. package/dist/mcp-slate-ui-script-more.js +19 -18
  148. package/dist/mcp-slate-ui-script-more.js.map +1 -1
  149. package/dist/mcp-slate-ui-script-pause.d.ts +33 -0
  150. package/dist/mcp-slate-ui-script-pause.d.ts.map +1 -0
  151. package/dist/mcp-slate-ui-script-pause.js +217 -0
  152. package/dist/mcp-slate-ui-script-pause.js.map +1 -0
  153. package/dist/mcp-slate-ui-script-remote.d.ts +2 -0
  154. package/dist/mcp-slate-ui-script-remote.d.ts.map +1 -1
  155. package/dist/mcp-slate-ui-script-remote.js +39 -6
  156. package/dist/mcp-slate-ui-script-remote.js.map +1 -1
  157. package/dist/mcp-slate-ui-script-scribble.js +1 -1
  158. package/dist/mcp-slate-ui-script-select.js +6 -6
  159. package/dist/mcp-slate-ui-script-stage.d.ts +3 -2
  160. package/dist/mcp-slate-ui-script-stage.d.ts.map +1 -1
  161. package/dist/mcp-slate-ui-script-stage.js +31 -19
  162. package/dist/mcp-slate-ui-script-stage.js.map +1 -1
  163. package/dist/mcp-slate-ui-script-state.d.ts.map +1 -1
  164. package/dist/mcp-slate-ui-script-state.js +77 -57
  165. package/dist/mcp-slate-ui-script-state.js.map +1 -1
  166. package/dist/mcp-slate-ui-script.d.ts +2 -2
  167. package/dist/mcp-slate-ui-script.d.ts.map +1 -1
  168. package/dist/mcp-slate-ui-script.js +21 -7
  169. package/dist/mcp-slate-ui-script.js.map +1 -1
  170. package/dist/mcp-slate-ui-styles-dialog.d.ts +6 -7
  171. package/dist/mcp-slate-ui-styles-dialog.d.ts.map +1 -1
  172. package/dist/mcp-slate-ui-styles-dialog.js +13 -29
  173. package/dist/mcp-slate-ui-styles-dialog.js.map +1 -1
  174. package/dist/mcp-slate-ui-styles-inspiration.d.ts +18 -0
  175. package/dist/mcp-slate-ui-styles-inspiration.d.ts.map +1 -0
  176. package/dist/mcp-slate-ui-styles-inspiration.js +43 -0
  177. package/dist/mcp-slate-ui-styles-inspiration.js.map +1 -0
  178. package/dist/mcp-slate-ui-styles-pause.d.ts +10 -0
  179. package/dist/mcp-slate-ui-styles-pause.d.ts.map +1 -0
  180. package/dist/mcp-slate-ui-styles-pause.js +25 -0
  181. package/dist/mcp-slate-ui-styles-pause.js.map +1 -0
  182. package/dist/mcp-slate-ui-styles-stage.d.ts +10 -6
  183. package/dist/mcp-slate-ui-styles-stage.d.ts.map +1 -1
  184. package/dist/mcp-slate-ui-styles-stage.js +24 -16
  185. package/dist/mcp-slate-ui-styles-stage.js.map +1 -1
  186. package/dist/mcp-slate-ui-styles.d.ts +12 -5
  187. package/dist/mcp-slate-ui-styles.d.ts.map +1 -1
  188. package/dist/mcp-slate-ui-styles.js +38 -21
  189. package/dist/mcp-slate-ui-styles.js.map +1 -1
  190. package/dist/mcp-slate-ui.d.ts +11 -3
  191. package/dist/mcp-slate-ui.d.ts.map +1 -1
  192. package/dist/mcp-slate-ui.js +24 -16
  193. package/dist/mcp-slate-ui.js.map +1 -1
  194. package/dist/mcp-workflow-tools.js +3 -3
  195. package/dist/mcp-workflow-tools.js.map +1 -1
  196. package/dist/mosaic-bands.d.ts +44 -0
  197. package/dist/mosaic-bands.d.ts.map +1 -0
  198. package/dist/mosaic-bands.js +153 -0
  199. package/dist/mosaic-bands.js.map +1 -0
  200. package/dist/review-discovery.d.ts.map +1 -1
  201. package/dist/review-discovery.js +36 -54
  202. package/dist/review-discovery.js.map +1 -1
  203. package/dist/review-page.d.ts.map +1 -1
  204. package/dist/review-page.js +2 -1
  205. package/dist/review-page.js.map +1 -1
  206. package/dist/review-run-roots.d.ts +40 -0
  207. package/dist/review-run-roots.d.ts.map +1 -0
  208. package/dist/review-run-roots.js +94 -0
  209. package/dist/review-run-roots.js.map +1 -0
  210. package/dist/review-server.d.ts +2 -0
  211. package/dist/review-server.d.ts.map +1 -1
  212. package/dist/review-server.js +2 -0
  213. package/dist/review-server.js.map +1 -1
  214. package/dist/review-types.d.ts +10 -0
  215. package/dist/review-types.d.ts.map +1 -1
  216. package/dist/scene/camera-diagnostics.d.ts +61 -0
  217. package/dist/scene/camera-diagnostics.d.ts.map +1 -0
  218. package/dist/scene/camera-diagnostics.js +166 -0
  219. package/dist/scene/camera-diagnostics.js.map +1 -0
  220. package/dist/scene/camera-solve.d.ts +2 -0
  221. package/dist/scene/camera-solve.d.ts.map +1 -1
  222. package/dist/scene/camera-solve.js +59 -42
  223. package/dist/scene/camera-solve.js.map +1 -1
  224. package/dist/scene/capture.d.ts +24 -0
  225. package/dist/scene/capture.d.ts.map +1 -1
  226. package/dist/scene/capture.js +53 -2
  227. package/dist/scene/capture.js.map +1 -1
  228. package/dist/scene/convert-run.d.ts +30 -0
  229. package/dist/scene/convert-run.d.ts.map +1 -0
  230. package/dist/scene/convert-run.js +135 -0
  231. package/dist/scene/convert-run.js.map +1 -0
  232. package/dist/scene/media-query.d.ts +21 -0
  233. package/dist/scene/media-query.d.ts.map +1 -0
  234. package/dist/scene/media-query.js +208 -0
  235. package/dist/scene/media-query.js.map +1 -0
  236. package/dist/scene/page-css.d.ts +38 -0
  237. package/dist/scene/page-css.d.ts.map +1 -0
  238. package/dist/scene/page-css.js +210 -0
  239. package/dist/scene/page-css.js.map +1 -0
  240. package/dist/scene/page-images.d.ts +33 -0
  241. package/dist/scene/page-images.d.ts.map +1 -0
  242. package/dist/scene/page-images.js +53 -0
  243. package/dist/scene/page-images.js.map +1 -0
  244. package/dist/scene/page-merge.d.ts +41 -0
  245. package/dist/scene/page-merge.d.ts.map +1 -0
  246. package/dist/scene/page-merge.js +197 -0
  247. package/dist/scene/page-merge.js.map +1 -0
  248. package/dist/scene/responsive-bands.d.ts +19 -0
  249. package/dist/scene/responsive-bands.d.ts.map +1 -0
  250. package/dist/scene/responsive-bands.js +25 -0
  251. package/dist/scene/responsive-bands.js.map +1 -0
  252. package/dist/scene/scene-index.d.ts +10 -0
  253. package/dist/scene/scene-index.d.ts.map +1 -0
  254. package/dist/scene/scene-index.js +43 -0
  255. package/dist/scene/scene-index.js.map +1 -0
  256. package/dist/scene/scene-merge.d.ts +29 -0
  257. package/dist/scene/scene-merge.d.ts.map +1 -0
  258. package/dist/scene/scene-merge.js +130 -0
  259. package/dist/scene/scene-merge.js.map +1 -0
  260. package/dist/scene/scene-verbs.d.ts +1 -1
  261. package/dist/scene/scene-verbs.d.ts.map +1 -1
  262. package/dist/scene/scene-verbs.js +1 -1
  263. package/dist/scene/scene-verbs.js.map +1 -1
  264. package/dist/scene/serve-detach.d.ts +23 -0
  265. package/dist/scene/serve-detach.d.ts.map +1 -0
  266. package/dist/scene/serve-detach.js +92 -0
  267. package/dist/scene/serve-detach.js.map +1 -0
  268. package/dist/scene/static-server.d.ts +2 -0
  269. package/dist/scene/static-server.d.ts.map +1 -1
  270. package/dist/scene/static-server.js +3 -0
  271. package/dist/scene/static-server.js.map +1 -1
  272. package/dist/scene/symmetric-eigen.d.ts +12 -0
  273. package/dist/scene/symmetric-eigen.d.ts.map +1 -0
  274. package/dist/scene/symmetric-eigen.js +43 -0
  275. package/dist/scene/symmetric-eigen.js.map +1 -0
  276. package/dist/slate-actions.d.ts +3 -3
  277. package/dist/slate-actions.d.ts.map +1 -1
  278. package/dist/slate-actions.js +9 -8
  279. package/dist/slate-actions.js.map +1 -1
  280. package/dist/slate-browser-host-script.d.ts +4 -0
  281. package/dist/slate-browser-host-script.d.ts.map +1 -1
  282. package/dist/slate-browser-host-script.js +25 -6
  283. package/dist/slate-browser-host-script.js.map +1 -1
  284. package/dist/slate-browser-host.d.ts +2 -1
  285. package/dist/slate-browser-host.d.ts.map +1 -1
  286. package/dist/slate-browser-host.js +18 -5
  287. package/dist/slate-browser-host.js.map +1 -1
  288. package/dist/slate-commit.js +7 -7
  289. package/dist/slate-commit.js.map +1 -1
  290. package/dist/slate-corpus.d.ts.map +1 -1
  291. package/dist/slate-corpus.js +3 -2
  292. package/dist/slate-corpus.js.map +1 -1
  293. package/dist/slate-edit-runner.d.ts.map +1 -1
  294. package/dist/slate-edit-runner.js +5 -4
  295. package/dist/slate-edit-runner.js.map +1 -1
  296. package/dist/slate-editability.d.ts +2 -0
  297. package/dist/slate-editability.d.ts.map +1 -1
  298. package/dist/slate-editability.js +1 -1
  299. package/dist/slate-editability.js.map +1 -1
  300. package/dist/slate-errors.d.ts +7 -1
  301. package/dist/slate-errors.d.ts.map +1 -1
  302. package/dist/slate-errors.js +3 -2
  303. package/dist/slate-errors.js.map +1 -1
  304. package/dist/slate-handoff-options.d.ts +2 -1
  305. package/dist/slate-handoff-options.d.ts.map +1 -1
  306. package/dist/slate-handoff-options.js +2 -2
  307. package/dist/slate-handoff-options.js.map +1 -1
  308. package/dist/slate-handoff.js +1 -1
  309. package/dist/slate-handoff.js.map +1 -1
  310. package/dist/slate-image-executor.d.ts +18 -1
  311. package/dist/slate-image-executor.d.ts.map +1 -1
  312. package/dist/slate-image-executor.js +1 -0
  313. package/dist/slate-image-executor.js.map +1 -1
  314. package/dist/slate-inspiration.js +2 -2
  315. package/dist/slate-inspiration.js.map +1 -1
  316. package/dist/slate-local-image.d.ts.map +1 -1
  317. package/dist/slate-local-image.js +4 -1
  318. package/dist/slate-local-image.js.map +1 -1
  319. package/dist/slate-lock.js +1 -1
  320. package/dist/slate-lock.js.map +1 -1
  321. package/dist/slate-resume.js +6 -6
  322. package/dist/slate-resume.js.map +1 -1
  323. package/dist/slate-round-params.d.ts +3 -0
  324. package/dist/slate-round-params.d.ts.map +1 -1
  325. package/dist/slate-round-params.js +5 -0
  326. package/dist/slate-round-params.js.map +1 -1
  327. package/dist/slate-round-queries.d.ts +18 -0
  328. package/dist/slate-round-queries.d.ts.map +1 -0
  329. package/dist/slate-round-queries.js +29 -0
  330. package/dist/slate-round-queries.js.map +1 -0
  331. package/dist/slate-round-runner.d.ts.map +1 -1
  332. package/dist/slate-round-runner.js +12 -9
  333. package/dist/slate-round-runner.js.map +1 -1
  334. package/dist/slate-round-search.js +5 -5
  335. package/dist/slate-round-search.js.map +1 -1
  336. package/dist/slate-run-action.d.ts.map +1 -1
  337. package/dist/slate-run-action.js +2 -1
  338. package/dist/slate-run-action.js.map +1 -1
  339. package/dist/slate-runner-context.d.ts +3 -1
  340. package/dist/slate-runner-context.d.ts.map +1 -1
  341. package/dist/slate-runner-context.js +4 -3
  342. package/dist/slate-runner-context.js.map +1 -1
  343. package/dist/slate-runner-failure.d.ts +7 -1
  344. package/dist/slate-runner-failure.d.ts.map +1 -1
  345. package/dist/slate-runner-failure.js +6 -5
  346. package/dist/slate-runner-failure.js.map +1 -1
  347. package/dist/slate-runtime.d.ts.map +1 -1
  348. package/dist/slate-runtime.js +1 -0
  349. package/dist/slate-runtime.js.map +1 -1
  350. package/dist/slate-versions.js +3 -3
  351. package/dist/slate-versions.js.map +1 -1
  352. package/dist/slate-view-contract.d.ts +62 -1
  353. package/dist/slate-view-contract.d.ts.map +1 -1
  354. package/dist/slate-view-contract.js +30 -0
  355. package/dist/slate-view-contract.js.map +1 -1
  356. package/dist/slate-view.d.ts.map +1 -1
  357. package/dist/slate-view.js +19 -3
  358. package/dist/slate-view.js.map +1 -1
  359. package/dist/slate-workspace-parse.d.ts.map +1 -1
  360. package/dist/slate-workspace-parse.js +22 -0
  361. package/dist/slate-workspace-parse.js.map +1 -1
  362. package/dist/slate-workspace-types.d.ts +2 -0
  363. package/dist/slate-workspace-types.d.ts.map +1 -1
  364. package/dist/workflow/adapter-12ui.d.ts.map +1 -1
  365. package/dist/workflow/adapter-12ui.js +3 -5
  366. package/dist/workflow/adapter-12ui.js.map +1 -1
  367. package/dist/workflow/providers.d.ts.map +1 -1
  368. package/dist/workflow/providers.js +5 -2
  369. package/dist/workflow/providers.js.map +1 -1
  370. package/dist/workflow/recipes.d.ts +1 -2
  371. package/dist/workflow/recipes.d.ts.map +1 -1
  372. package/dist/workflow/recipes.js +6 -18
  373. package/dist/workflow/recipes.js.map +1 -1
  374. package/dist/workflow/routing.d.ts.map +1 -1
  375. package/dist/workflow/routing.js +3 -1
  376. package/dist/workflow/routing.js.map +1 -1
  377. package/dist/workflow/types.d.ts +7 -0
  378. package/dist/workflow/types.d.ts.map +1 -1
  379. package/dist/workflow/types.js +7 -0
  380. package/dist/workflow/types.js.map +1 -1
  381. package/dist/workspace-draw-client.d.ts +42 -1
  382. package/dist/workspace-draw-client.d.ts.map +1 -1
  383. package/dist/workspace-draw-client.js +56 -7
  384. package/dist/workspace-draw-client.js.map +1 -1
  385. package/dist/workspace-draw-codex.d.ts +9 -4
  386. package/dist/workspace-draw-codex.d.ts.map +1 -1
  387. package/dist/workspace-draw-codex.js +17 -3
  388. package/dist/workspace-draw-codex.js.map +1 -1
  389. package/dist/workspace-draw-messages.d.ts +24 -0
  390. package/dist/workspace-draw-messages.d.ts.map +1 -1
  391. package/dist/workspace-draw-messages.js +26 -2
  392. package/dist/workspace-draw-messages.js.map +1 -1
  393. package/dist/workspace-draw-run.d.ts +19 -1
  394. package/dist/workspace-draw-run.d.ts.map +1 -1
  395. package/dist/workspace-draw-run.js +76 -3
  396. package/dist/workspace-draw-run.js.map +1 -1
  397. package/dist/workspace-draw-store.d.ts +2 -0
  398. package/dist/workspace-draw-store.d.ts.map +1 -1
  399. package/dist/workspace-draw-store.js +3 -1
  400. package/dist/workspace-draw-store.js.map +1 -1
  401. package/dist/workspace-draw-types.d.ts +1 -0
  402. package/dist/workspace-draw-types.d.ts.map +1 -1
  403. package/dist/workspace-draw-types.js +1 -0
  404. package/dist/workspace-draw-types.js.map +1 -1
  405. package/dist/workspace-origin.d.ts +15 -0
  406. package/dist/workspace-origin.d.ts.map +1 -0
  407. package/dist/workspace-origin.js +36 -0
  408. package/dist/workspace-origin.js.map +1 -0
  409. package/dist/workspace-runner-children.d.ts +28 -0
  410. package/dist/workspace-runner-children.d.ts.map +1 -0
  411. package/dist/workspace-runner-children.js +112 -0
  412. package/dist/workspace-runner-children.js.map +1 -0
  413. package/dist/workspace-runner-client.d.ts +41 -0
  414. package/dist/workspace-runner-client.d.ts.map +1 -0
  415. package/dist/workspace-runner-client.js +63 -0
  416. package/dist/workspace-runner-client.js.map +1 -0
  417. package/dist/workspace-runner-main.d.ts +56 -0
  418. package/dist/workspace-runner-main.d.ts.map +1 -0
  419. package/dist/workspace-runner-main.js +350 -0
  420. package/dist/workspace-runner-main.js.map +1 -0
  421. package/dist/workspace-runner-policy.d.ts +40 -0
  422. package/dist/workspace-runner-policy.d.ts.map +1 -0
  423. package/dist/workspace-runner-policy.js +47 -0
  424. package/dist/workspace-runner-policy.js.map +1 -0
  425. package/dist/workspace-runner-spawn.d.ts +42 -0
  426. package/dist/workspace-runner-spawn.d.ts.map +1 -0
  427. package/dist/workspace-runner-spawn.js +60 -0
  428. package/dist/workspace-runner-spawn.js.map +1 -0
  429. package/dist/workspace-runner-stop.d.ts +25 -0
  430. package/dist/workspace-runner-stop.d.ts.map +1 -0
  431. package/dist/workspace-runner-stop.js +44 -0
  432. package/dist/workspace-runner-stop.js.map +1 -0
  433. package/dist/workspace-runner-store.d.ts +26 -0
  434. package/dist/workspace-runner-store.d.ts.map +1 -0
  435. package/dist/workspace-runner-store.js +114 -0
  436. package/dist/workspace-runner-store.js.map +1 -0
  437. package/open-design.json +2 -2
  438. package/package.json +2 -2
  439. package/runtime/codex-conversion/src/images/native-invoke.mjs +24 -5
  440. package/runtime/codex-conversion/src/images/native.mjs +3 -2
  441. package/skills/12ui-design/SKILL.md +79 -19
  442. package/skills/12ui-design/agents/openai.yaml +2 -0
  443. package/skills/12ui-design/improve.md +1 -5
  444. package/skills/12ui-design/inspire.md +5 -8
  445. package/skills/12ui-design/outputs.md +2 -23
  446. package/skills/12ui-design/scene.md +27 -156
  447. package/skills/12ui-design/session.md +0 -161
@@ -0,0 +1,197 @@
1
+ import { parseHTML } from 'linkedom';
2
+ import { mediaQueryMatchesFrame } from './media-query.js';
3
+ import { SceneArgumentError } from './numbers.js';
4
+ import { emptyMediaDecisions, resolveMediaAtFrame, viewportUnitsToPx } from './page-css.js';
5
+ import { classifyRef, cssImageRefs, cssImageRefsInRules, dropCssImages, isImageRef, srcsetUrls, } from './page-images.js';
6
+ import { bandsShownAtFrame } from './responsive-bands.js';
7
+ const GOOGLE_FONTS_STYLESHEET = /^https:\/\/fonts\.googleapis\.com\//iu;
8
+ const REMOTE_URL = /^(?:[a-z][a-z0-9+.-]*:)?\/\//iu;
9
+ /** Attributes that load a resource, per element; `srcset` lists several. */
10
+ const RESOURCE_ATTRIBUTES = [
11
+ ['img[src]', 'src'], ['img[srcset]', 'srcset'], ['source[src]', 'src'], ['source[srcset]', 'srcset'],
12
+ ['video[poster]', 'poster'], ['input[src]', 'src'], ['image[href]', 'href'], ['use[href]', 'href'],
13
+ ];
14
+ const isStylesheetLink = (element) => (element.tagName.toLowerCase() === 'link'
15
+ && (element.getAttribute('rel') ?? '').toLowerCase().split(/\s+/u).includes('stylesheet'));
16
+ const describe = (element) => {
17
+ const tag = element.tagName.toLowerCase();
18
+ const id = element.getAttribute('id');
19
+ const className = (element.getAttribute('class') ?? '').trim().split(/\s+/u)[0];
20
+ const alt = element.getAttribute('alt')?.trim();
21
+ const name = id ? `<${tag}#${id}>` : className ? `<${tag}.${className}>` : `<${tag}>`;
22
+ return alt ? `${name} "${alt.length > 48 ? `${alt.slice(0, 47)}…` : alt}"` : name;
23
+ };
24
+ const elementRefs = (element, attribute) => {
25
+ const value = element.getAttribute(attribute) ?? '';
26
+ const values = attribute === 'srcset' ? srcsetUrls(value) : [value];
27
+ return values.map(classifyRef).filter((ref) => ref !== undefined);
28
+ };
29
+ /** Decides a `media` attribute at the frame: false removes the element, true drops the attribute. */
30
+ const decideMediaAttribute = (element, frame, media) => {
31
+ const query = element.getAttribute('media');
32
+ if (query === null)
33
+ return;
34
+ const label = `<${element.tagName.toLowerCase()} media="${query}">`;
35
+ const applies = mediaQueryMatchesFrame(query, frame);
36
+ if (applies === true) {
37
+ media.applied.push(label);
38
+ element.removeAttribute('media');
39
+ }
40
+ else if (applies === false) {
41
+ media.removed.push(label);
42
+ element.remove();
43
+ }
44
+ else {
45
+ media.undecided.push(label);
46
+ }
47
+ };
48
+ export const mergePage = (input) => {
49
+ const { document } = parseHTML(input.html);
50
+ const all = (selector) => Array.from(document.querySelectorAll(selector));
51
+ const media = emptyMediaDecisions();
52
+ for (const element of all('style[media], link[media], picture > source[media]')) {
53
+ decideMediaAttribute(element, input.frame, media);
54
+ }
55
+ for (const style of all('style')) {
56
+ style.textContent = viewportUnitsToPx(resolveMediaAtFrame(style.textContent ?? '', input.frame, media), input.frame);
57
+ }
58
+ for (const element of all('[style]')) {
59
+ element.setAttribute('style', viewportUnitsToPx(element.getAttribute('style') ?? '', input.frame));
60
+ }
61
+ let bands;
62
+ if (input.engine === 'api') {
63
+ const decision = bandsShownAtFrame(all('style').map((style) => style.textContent ?? ''));
64
+ if (decision) {
65
+ const removed = [];
66
+ for (const band of all('.ly-band[data-ly-band]')) {
67
+ const name = band.getAttribute('data-ly-band') ?? '';
68
+ if (decision.removable(name)) {
69
+ removed.push(name);
70
+ band.remove();
71
+ }
72
+ }
73
+ bands = { shown: decision.shown, removed };
74
+ }
75
+ }
76
+ const removedScripts = [];
77
+ for (const script of all('body script[src]')) {
78
+ const source = script.getAttribute('src') ?? '';
79
+ if (REMOTE_URL.test(source.trim())) {
80
+ removedScripts.push(source);
81
+ script.remove();
82
+ }
83
+ }
84
+ const collectImages = () => {
85
+ const images = new Map();
86
+ const note = (ref, usedBy) => {
87
+ if (!isImageRef(ref))
88
+ return;
89
+ const entry = images.get(ref.ref) ?? {
90
+ ref: ref.ref, kind: ref.kind, value: ref.value, usedBy: [],
91
+ ...(input.boxes.has(ref.ref) ? { box: input.boxes.get(ref.ref) } : {}),
92
+ };
93
+ if (!entry.usedBy.includes(usedBy))
94
+ entry.usedBy.push(usedBy);
95
+ images.set(ref.ref, entry);
96
+ };
97
+ for (const [selector, attribute] of RESOURCE_ATTRIBUTES) {
98
+ for (const element of all(selector))
99
+ for (const ref of elementRefs(element, attribute))
100
+ note(ref, describe(element));
101
+ }
102
+ for (const style of all('style')) {
103
+ for (const ref of cssImageRefsInRules(style.textContent ?? ''))
104
+ note(ref, ref.rule ? `css ${ref.rule}` : 'css');
105
+ }
106
+ for (const element of all('[style]')) {
107
+ for (const ref of cssImageRefs(element.getAttribute('style') ?? ''))
108
+ note(ref, `style of ${describe(element)}`);
109
+ }
110
+ return [...images.values()];
111
+ };
112
+ const before = collectImages();
113
+ const known = new Set(before.map((image) => image.ref));
114
+ const unknown = input.drop.filter((ref) => !known.has(ref));
115
+ if (unknown.length) {
116
+ throw new SceneArgumentError(`--drop names ${unknown.join(', ')}, which ${unknown.length === 1 ? 'is' : 'are'} not`
117
+ + ` an image of this page. Its images are: ${before.map((image) => image.ref).join(', ') || 'none'}.`);
118
+ }
119
+ const dropped = new Set(input.drop);
120
+ if (dropped.size) {
121
+ for (const [selector, attribute] of RESOURCE_ATTRIBUTES) {
122
+ for (const element of all(selector)) {
123
+ if (elementRefs(element, attribute).some((ref) => dropped.has(ref.ref)))
124
+ element.remove();
125
+ }
126
+ }
127
+ for (const style of all('style'))
128
+ style.textContent = dropCssImages(style.textContent ?? '', dropped);
129
+ for (const element of all('[style]'))
130
+ element.setAttribute('style', dropCssImages(element.getAttribute('style') ?? '', dropped));
131
+ }
132
+ const images = collectImages();
133
+ const fonts = [];
134
+ const remote = new Set();
135
+ const files = new Set();
136
+ const headParts = [];
137
+ const notCarried = [];
138
+ for (const element of Array.from(document.head.children)) {
139
+ const tag = element.tagName.toLowerCase();
140
+ if (tag === 'style' || isStylesheetLink(element)) {
141
+ headParts.push(element.outerHTML);
142
+ continue;
143
+ }
144
+ if (tag === 'meta' || tag === 'title')
145
+ continue;
146
+ if (tag === 'link' && /preconnect|dns-prefetch/iu.test(element.getAttribute('rel') ?? ''))
147
+ continue;
148
+ notCarried.push(element.outerHTML.length > 120 ? `${element.outerHTML.slice(0, 119)}…` : element.outerHTML);
149
+ }
150
+ for (const link of all('link[href]').filter(isStylesheetLink)) {
151
+ const ref = classifyRef(link.getAttribute('href') ?? '');
152
+ if (ref?.kind === 'file')
153
+ files.add(ref.ref);
154
+ else if (ref?.kind === 'remote')
155
+ (GOOGLE_FONTS_STYLESHEET.test(ref.value) ? fonts.push(ref.value) : remote.add(ref.value));
156
+ }
157
+ for (const script of all('body script[src]')) {
158
+ const ref = classifyRef(script.getAttribute('src') ?? '');
159
+ if (ref?.kind === 'file')
160
+ files.add(ref.ref);
161
+ }
162
+ for (const [selector, attribute] of RESOURCE_ATTRIBUTES) {
163
+ for (const element of all(selector)) {
164
+ for (const ref of elementRefs(element, attribute)) {
165
+ if (ref.kind === 'file')
166
+ files.add(ref.ref);
167
+ if (ref.kind === 'remote')
168
+ remote.add(ref.value);
169
+ }
170
+ }
171
+ }
172
+ const cssTexts = [...all('style').map((style) => style.textContent ?? ''), ...all('[style]').map((element) => element.getAttribute('style') ?? '')];
173
+ for (const ref of cssTexts.flatMap(cssImageRefs)) {
174
+ if (ref.kind === 'file')
175
+ files.add(ref.ref);
176
+ if (ref.kind === 'remote')
177
+ remote.add(ref.value);
178
+ }
179
+ const bodyAttributes = Array.from(document.body.attributes);
180
+ if (bodyAttributes.length) {
181
+ notCarried.push(`<body ${bodyAttributes.map((attribute) => `${attribute.name}="${attribute.value}"`).join(' ')}>`);
182
+ }
183
+ return {
184
+ head: headParts.join('\n'),
185
+ body: document.body.innerHTML,
186
+ images,
187
+ dropped: [...dropped],
188
+ files: [...files],
189
+ fonts,
190
+ remote: [...remote],
191
+ removedScripts,
192
+ media,
193
+ ...(bands ? { bands } : {}),
194
+ notCarried,
195
+ };
196
+ };
197
+ //# sourceMappingURL=page-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-merge.js","sourceRoot":"","sources":["../../src/scene/page-merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * The API engine's responsive page (`<meta name="responsive-band-assembly">`)
3
+ * carries one complete layout per band, `<div class="ly-band" data-ly-band=NAME>`.
4
+ * Its CSS hides every band (`.ly-band{display:none}`) and shows one per
5
+ * `@media` block (`.ly-band[data-ly-band="NAME"]{display:block}`). Once those
6
+ * blocks are decided at the source frame, the show rules that survive name the
7
+ * bands that paint at that frame; the rest can never paint in the scene.
8
+ *
9
+ * Removing a band needs both declared facts: the hide rule, and at least one
10
+ * surviving show rule. Without them every band stays (a band that is kept but
11
+ * hidden costs bytes; a band removed in error is a hole).
12
+ */
13
+ export type BandDecision = {
14
+ shown: string[];
15
+ removable: (band: string) => boolean;
16
+ };
17
+ /** The bands the frame-decided CSS shows, or null when it does not prove which bands are hidden. */
18
+ export declare const bandsShownAtFrame: (resolvedCss: readonly string[]) => BandDecision | null;
19
+ //# sourceMappingURL=responsive-bands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responsive-bands.d.ts","sourceRoot":"","sources":["../../src/scene/responsive-bands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE,CAAC;AAErF,oGAAoG;AACpG,eAAO,MAAM,iBAAiB,GAAI,aAAa,SAAS,MAAM,EAAE,KAAG,YAAY,GAAG,IAMjF,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The API engine's responsive page (`<meta name="responsive-band-assembly">`)
3
+ * carries one complete layout per band, `<div class="ly-band" data-ly-band=NAME>`.
4
+ * Its CSS hides every band (`.ly-band{display:none}`) and shows one per
5
+ * `@media` block (`.ly-band[data-ly-band="NAME"]{display:block}`). Once those
6
+ * blocks are decided at the source frame, the show rules that survive name the
7
+ * bands that paint at that frame; the rest can never paint in the scene.
8
+ *
9
+ * Removing a band needs both declared facts: the hide rule, and at least one
10
+ * surviving show rule. Without them every band stays (a band that is kept but
11
+ * hidden costs bytes; a band removed in error is a hole).
12
+ */
13
+ const HIDE_RULE = /\.ly-band\s*\{\s*display\s*:\s*none\b/iu;
14
+ const SHOW_RULE = /\.ly-band\[data-ly-band\s*=\s*(["']?)([^"'\]\s]+)\1\s*\]\s*\{\s*display\s*:\s*(?!none\b)[a-z-]+/giu;
15
+ /** The bands the frame-decided CSS shows, or null when it does not prove which bands are hidden. */
16
+ export const bandsShownAtFrame = (resolvedCss) => {
17
+ const css = resolvedCss.join('\n');
18
+ if (!HIDE_RULE.test(css))
19
+ return null;
20
+ const shown = [...new Set([...css.matchAll(SHOW_RULE)].map((match) => match[2]))];
21
+ if (shown.length === 0)
22
+ return null;
23
+ return { shown, removable: (band) => !shown.includes(band) };
24
+ };
25
+ //# sourceMappingURL=responsive-bands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responsive-bands.js","sourceRoot":"","sources":["../../src/scene/responsive-bands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,SAAS,GAAG,yCAAyC,CAAC;AAC5D,MAAM,SAAS,GAAG,oGAAoG,CAAC;AAIvH,oGAAoG;AACpG,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,WAA8B,EAAuB,EAAE;IACvF,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;IACnF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/D,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type StarterInsertion = {
2
+ html: string;
3
+ replaced: boolean;
4
+ };
5
+ export declare const insertIntoStarter: (starter: string, page: {
6
+ head: string;
7
+ body: string;
8
+ label: string;
9
+ }, file: string) => StarterInsertion;
10
+ //# sourceMappingURL=scene-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-index.d.ts","sourceRoot":"","sources":["../../src/scene/scene-index.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAEnE,eAAO,MAAM,iBAAiB,GAAI,SAAS,MAAM,EAAE,MAAM;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,MAAM,KAAG,gBAyBtH,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { SceneArgumentError } from './numbers.js';
2
+ /**
3
+ * Puts a merged page into the scene's index.html as text, so nothing else in
4
+ * the starter is re-serialized: the page's styles go into <head> just before
5
+ * the starter's first <style> (so the starter's rules win where they overlap),
6
+ * and its body goes inside the empty `#stage`. Both are fenced with comments,
7
+ * and a later merge replaces exactly what an earlier one wrote.
8
+ */
9
+ const HEAD_BEGIN = '<!-- 12ui scene merge: page head';
10
+ const BODY_BEGIN = '<!-- 12ui scene merge: page body';
11
+ const END = '<!-- 12ui scene merge: end -->';
12
+ const escapeRegExp = (text) => text.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
13
+ const fenced = (begin) => new RegExp(`${escapeRegExp(begin)}[^>]*-->[\\s\\S]*?${escapeRegExp(END)}`, 'u');
14
+ const STAGE = new RegExp(`(<div\\b[^>]*\\bid\\s*=\\s*(["']?)stage\\2(?=[\\s>/])[^>]*>)(\\s*(?:${escapeRegExp(BODY_BEGIN)}[^>]*-->[\\s\\S]*?${escapeRegExp(END)})?\\s*)</div>`, 'u');
15
+ export const insertIntoStarter = (starter, page, file) => {
16
+ const stage = STAGE.exec(starter);
17
+ if (!stage) {
18
+ const hasStage = /\bid\s*=\s*["']?stage\b/u.test(starter);
19
+ throw new SceneArgumentError(hasStage
20
+ ? `#stage in ${file} already holds content that 12ui scene merge did not write. Merge into a fresh starter`
21
+ + ' (12ui scene init <new-dir>), or move that content out of #stage first.'
22
+ : `${file} has no <div id="stage">: merge needs the starter index.html from 12ui scene init.`);
23
+ }
24
+ const replaced = stage[3].includes(BODY_BEGIN);
25
+ const bodyBlock = `${BODY_BEGIN} from ${page.label} -->\n${page.body}\n${END}`;
26
+ const headBlock = `${HEAD_BEGIN} from ${page.label} -->\n${page.head}\n${END}\n`;
27
+ let html = `${starter.slice(0, stage.index)}${stage[1]}${bodyBlock}</div>${starter.slice(stage.index + stage[0].length)}`;
28
+ const previousHead = fenced(HEAD_BEGIN).exec(html);
29
+ if (previousHead) {
30
+ html = `${html.slice(0, previousHead.index)}${headBlock.trimEnd()}${html.slice(previousHead.index + previousHead[0].length)}`;
31
+ }
32
+ else {
33
+ const headEnd = html.search(/<\/head\s*>/iu);
34
+ const headStart = html.search(/<head\b[^>]*>/iu);
35
+ if (headEnd < 0 || headStart < 0)
36
+ throw new SceneArgumentError(`${file} has no <head>: merge needs the starter index.html from 12ui scene init.`);
37
+ const style = html.slice(headStart, headEnd).search(/<style\b/iu);
38
+ const at = style >= 0 ? headStart + style : headEnd;
39
+ html = `${html.slice(0, at)}${headBlock}${html.slice(at)}`;
40
+ }
41
+ return { html, replaced };
42
+ };
43
+ //# sourceMappingURL=scene-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-index.js","sourceRoot":"","sources":["../../src/scene/scene-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type ConvertRunPage } from './convert-run.js';
2
+ import { type MergedPage } from './page-merge.js';
3
+ /**
4
+ * `12ui scene merge <convert-run> <scene-dir>`: joins the page a `12ui convert`
5
+ * run built to the scene. It reads the run by its recorded engine
6
+ * (convert-run.ts), makes the page ready for `#stage` (page-merge.ts), writes
7
+ * it into the scene's index.html (scene-index.ts) and copies the files the page
8
+ * loads beside it, keeping their paths. Every check runs before the first write.
9
+ */
10
+ export type MergeReport = {
11
+ run: ConvertRunPage;
12
+ merged: MergedPage;
13
+ indexFile: string;
14
+ replaced: boolean;
15
+ copied: string[];
16
+ alreadyThere: string[];
17
+ missing: string[];
18
+ };
19
+ export declare const mergeConvertRun: (args: {
20
+ runDir: string;
21
+ sceneDir: string;
22
+ drop: readonly string[];
23
+ }) => Promise<MergeReport>;
24
+ /** The report printed by the verb: what was merged, the images to choose from, what is left to do. */
25
+ export declare const formatMergeReport: (report: MergeReport, shown: {
26
+ run: string;
27
+ scene: string;
28
+ }) => string[];
29
+ //# sourceMappingURL=scene-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-merge.d.ts","sourceRoot":"","sources":["../../src/scene/scene-merge.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGvE,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7D;;;;;;GAMG;AAEH,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AA8BF,eAAO,MAAM,eAAe,GAAU,MAAM;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,KAAG,OAAO,CAAC,WAAW,CAoD9H,CAAC;AAIF,sGAAsG;AACtG,eAAO,MAAM,iBAAiB,GAAI,QAAQ,WAAW,EAAE,OAAO;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,KAAG,MAAM,EA6BpG,CAAC"}
@@ -0,0 +1,130 @@
1
+ import { copyFile, mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { readConvertRun } from './convert-run.js';
4
+ import { SceneArgumentError } from './numbers.js';
5
+ import { cssImageRefs, formatBox } from './page-images.js';
6
+ import { mergePage } from './page-merge.js';
7
+ import { insertIntoStarter } from './scene-index.js';
8
+ const readBytes = async (file) => {
9
+ try {
10
+ return await readFile(file);
11
+ }
12
+ catch (error) {
13
+ if (['ENOENT', 'ENOTDIR', 'EISDIR'].includes(error.code ?? ''))
14
+ return undefined;
15
+ throw error;
16
+ }
17
+ };
18
+ const inside = (root, relative) => {
19
+ const resolved = path.resolve(root, relative);
20
+ return resolved.startsWith(`${path.resolve(root)}${path.sep}`) ? resolved : undefined;
21
+ };
22
+ /** The page's local files plus the files its local stylesheets load, as page-relative paths. */
23
+ const filesToCopy = async (pageDir, files) => {
24
+ const all = new Set(files);
25
+ for (const file of files.filter((name) => name.toLowerCase().endsWith('.css'))) {
26
+ const source = inside(pageDir, file);
27
+ const css = source ? await readBytes(source) : undefined;
28
+ if (!css)
29
+ continue;
30
+ for (const ref of cssImageRefs(css.toString('utf8'))) {
31
+ if (ref.kind === 'file')
32
+ all.add(path.posix.normalize(path.posix.join(path.posix.dirname(file), ref.ref)));
33
+ }
34
+ }
35
+ return [...all];
36
+ };
37
+ export const mergeConvertRun = async (args) => {
38
+ const run = await readConvertRun(args.runDir);
39
+ const indexFile = path.join(path.resolve(args.sceneDir), 'index.html');
40
+ const starter = await readBytes(indexFile);
41
+ if (!starter)
42
+ throw new SceneArgumentError(`${indexFile} is missing: run 12ui scene init ${args.sceneDir} first.`);
43
+ const merged = mergePage({
44
+ html: await readFile(run.page, 'utf8'),
45
+ frame: run.frame,
46
+ engine: run.engine,
47
+ boxes: run.boxes,
48
+ drop: args.drop,
49
+ });
50
+ const label = `${path.relative(path.dirname(indexFile), run.page) || run.page} (${run.engine} engine)`;
51
+ const inserted = insertIntoStarter(starter.toString('utf8'), { head: merged.head, body: merged.body, label }, indexFile);
52
+ const pageDir = path.dirname(run.page);
53
+ const plan = [];
54
+ const alreadyThere = [];
55
+ const missing = [];
56
+ for (const relative of await filesToCopy(pageDir, merged.files)) {
57
+ const source = inside(pageDir, relative);
58
+ const target = inside(path.dirname(indexFile), relative);
59
+ const bytes = source ? await readBytes(source) : undefined;
60
+ if (!source || !target || !bytes) {
61
+ missing.push(relative);
62
+ continue;
63
+ }
64
+ const existing = await readBytes(target);
65
+ if (existing?.equals(bytes)) {
66
+ alreadyThere.push(relative);
67
+ continue;
68
+ }
69
+ if (existing) {
70
+ throw new SceneArgumentError(`The page loads ${relative}, and ${target} already exists with different content.`
71
+ + ' Merge writes nothing over a scene file: rename or move that file, then merge again.');
72
+ }
73
+ plan.push({ relative, source, target, bytes });
74
+ }
75
+ for (const file of plan) {
76
+ await mkdir(path.dirname(file.target), { recursive: true });
77
+ await copyFile(file.source, file.target);
78
+ }
79
+ await writeFile(indexFile, inserted.html);
80
+ return {
81
+ run,
82
+ merged,
83
+ indexFile,
84
+ replaced: inserted.replaced,
85
+ copied: plan.map((file) => file.relative),
86
+ alreadyThere,
87
+ missing,
88
+ };
89
+ };
90
+ const list = (values) => values.join(', ');
91
+ /** The report printed by the verb: what was merged, the images to choose from, what is left to do. */
92
+ export const formatMergeReport = (report, shown) => {
93
+ const { run, merged } = report;
94
+ const lines = [
95
+ `merged ${path.join(shown.run, path.relative(run.runDir, run.page))} (${run.engine} engine, ${run.frame.width}x${run.frame.height}`
96
+ + ` source frame) into ${path.join(shown.scene, 'index.html')}${report.replaced ? ', replacing the earlier merge' : ''}`,
97
+ ];
98
+ const { applied, removed, undecided } = merged.media;
99
+ if (applied.length || removed.length || undecided.length) {
100
+ lines.push(` @media at ${run.frame.width}x${run.frame.height}: ${applied.length} apply (rules kept), ${removed.length} do not (removed)`
101
+ + `${undecided.length ? `, ${undecided.length} depend on the viewer (kept as written: ${list(undecided)})` : ''}`);
102
+ }
103
+ if (merged.bands) {
104
+ lines.push(` responsive bands: kept ${list(merged.bands.shown)}${merged.bands.removed.length ? `, removed ${list(merged.bands.removed)}` : ''}`);
105
+ }
106
+ for (const script of merged.removedScripts)
107
+ lines.push(` removed remote script ${script}`);
108
+ if (report.copied.length)
109
+ lines.push(` copied beside index.html: ${list(report.copied)}`);
110
+ if (report.alreadyThere.length)
111
+ lines.push(` already beside index.html: ${list(report.alreadyThere)}`);
112
+ if (report.missing.length)
113
+ lines.push(` warning: the page loads files that are not in the run: ${list(report.missing)}`);
114
+ for (const element of merged.notCarried)
115
+ lines.push(` not carried into the scene: ${element}`);
116
+ if (merged.dropped.length)
117
+ lines.push(`dropped: ${list(merged.dropped)}`);
118
+ lines.push(merged.images.length
119
+ ? `images (drop the ones the 3D scene replaces with --drop <image>,...; box is x0,y0,x1,y1 where the run declares it):`
120
+ : 'images: none');
121
+ for (const image of merged.images) {
122
+ lines.push(` ${image.ref}${image.box ? ` box ${formatBox(image.box)}` : ''} ${list(image.usedBy)}`);
123
+ }
124
+ for (const url of merged.fonts)
125
+ lines.push(`fonts: ${url}`);
126
+ for (const url of merged.remote)
127
+ lines.push(`remote (capture blocks it): ${url}`);
128
+ return lines;
129
+ };
130
+ //# sourceMappingURL=scene-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-merge.js","sourceRoot":"","sources":["../../src/scene/scene-merge.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  /** The `12ui scene` verbs, named once for the dispatcher and the capability record. */
2
- export declare const SCENE_VERBS: readonly ["init", "solve", "ray", "project", "rect", "serve", "capture", "sheet", "blend", "colors", "rectify"];
2
+ export declare const SCENE_VERBS: readonly ["init", "solve", "ray", "project", "rect", "serve", "capture", "sheet", "blend", "colors", "rectify", "merge"];
3
3
  export type SceneVerb = typeof SCENE_VERBS[number];
4
4
  //# sourceMappingURL=scene-verbs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scene-verbs.d.ts","sourceRoot":"","sources":["../../src/scene/scene-verbs.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,eAAO,MAAM,WAAW,iHAEd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"scene-verbs.d.ts","sourceRoot":"","sources":["../../src/scene/scene-verbs.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,eAAO,MAAM,WAAW,0HAEd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /** The `12ui scene` verbs, named once for the dispatcher and the capability record. */
2
2
  export const SCENE_VERBS = [
3
- 'init', 'solve', 'ray', 'project', 'rect', 'serve', 'capture', 'sheet', 'blend', 'colors', 'rectify',
3
+ 'init', 'solve', 'ray', 'project', 'rect', 'serve', 'capture', 'sheet', 'blend', 'colors', 'rectify', 'merge',
4
4
  ];
5
5
  //# sourceMappingURL=scene-verbs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scene-verbs.js","sourceRoot":"","sources":["../../src/scene/scene-verbs.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS;CAC5F,CAAC"}
1
+ {"version":3,"file":"scene-verbs.js","sourceRoot":"","sources":["../../src/scene/scene-verbs.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO;CACrG,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `12ui scene serve --detach`: the server as its own detached process (a new
3
+ * session, no terminal, stdio in a log file), so it outlives the shell that
4
+ * launched it. An agent's tool shell ends, or kills its process group, when
5
+ * the command returns; a plain `serve ... &` died with it and the next capture
6
+ * met ERR_CONNECTION_REFUSED. The launcher returns only once the port answers
7
+ * with this child's pid, so a printed URL is a working URL.
8
+ */
9
+ export type DetachedServer = {
10
+ url: string;
11
+ port: number;
12
+ pid: number;
13
+ logFile: string;
14
+ };
15
+ export type DetachOptions = {
16
+ directory: string;
17
+ port: number;
18
+ /** The command that runs a foreground server on `--port <port>`; argv[0] is the executable. */
19
+ command: (port: number) => string[];
20
+ readyTimeoutMs?: number;
21
+ };
22
+ export declare const startDetachedServer: (options: DetachOptions) => Promise<DetachedServer>;
23
+ //# sourceMappingURL=serve-detach.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve-detach.d.ts","sourceRoot":"","sources":["../../src/scene/serve-detach.ts"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AAEH,MAAM,MAAM,cAAc,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzF,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAqCF,eAAO,MAAM,mBAAmB,GAAU,SAAS,aAAa,KAAG,OAAO,CAAC,cAAc,CA4CxF,CAAC"}