@12ui/design 0.2.81 → 0.2.83

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 (301) hide show
  1. package/README.md +11 -7
  2. package/SKILL.md +1 -1
  3. package/dist/branch-execution.d.ts.map +1 -1
  4. package/dist/branch-execution.js +6 -0
  5. package/dist/branch-execution.js.map +1 -1
  6. package/dist/branch-materialize.d.ts.map +1 -1
  7. package/dist/branch-materialize.js +6 -2
  8. package/dist/branch-materialize.js.map +1 -1
  9. package/dist/cli-capabilities.d.ts +4 -7
  10. package/dist/cli-capabilities.d.ts.map +1 -1
  11. package/dist/cli-capabilities.js +4 -4
  12. package/dist/cli-capabilities.js.map +1 -1
  13. package/dist/cli-help/conversion.d.ts +1 -1
  14. package/dist/cli-help/conversion.js +1 -1
  15. package/dist/cli-help/conversion.js.map +1 -1
  16. package/dist/cli-help/index.d.ts +3 -3
  17. package/dist/cli-help/workflow.d.ts +2 -2
  18. package/dist/cli-help/workflow.js +4 -4
  19. package/dist/cli-help/workflow.js.map +1 -1
  20. package/dist/cli-image-backend.d.ts +6 -1
  21. package/dist/cli-image-backend.d.ts.map +1 -1
  22. package/dist/cli-image-backend.js +8 -3
  23. package/dist/cli-image-backend.js.map +1 -1
  24. package/dist/cli-local-runtime.d.ts +6 -0
  25. package/dist/cli-local-runtime.d.ts.map +1 -1
  26. package/dist/cli-local-runtime.js +14 -1
  27. package/dist/cli-local-runtime.js.map +1 -1
  28. package/dist/cli-usage.d.ts.map +1 -1
  29. package/dist/cli-usage.js +8 -7
  30. package/dist/cli-usage.js.map +1 -1
  31. package/dist/cli-workspace-draw.d.ts.map +1 -1
  32. package/dist/cli-workspace-draw.js +2 -0
  33. package/dist/cli-workspace-draw.js.map +1 -1
  34. package/dist/cli-workspace-runner.d.ts.map +1 -1
  35. package/dist/cli-workspace-runner.js +2 -1
  36. package/dist/cli-workspace-runner.js.map +1 -1
  37. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  38. package/dist/legacy-skill-catalog.js +13 -1
  39. package/dist/legacy-skill-catalog.js.map +1 -1
  40. package/dist/mcp-slate-tool-defs.d.ts.map +1 -1
  41. package/dist/mcp-slate-tool-defs.js +3 -2
  42. package/dist/mcp-slate-tool-defs.js.map +1 -1
  43. package/dist/mcp-slate-ui-copy.d.ts +10 -0
  44. package/dist/mcp-slate-ui-copy.d.ts.map +1 -1
  45. package/dist/mcp-slate-ui-copy.js +9 -0
  46. package/dist/mcp-slate-ui-copy.js.map +1 -1
  47. package/dist/mcp-slate-ui-locales/de-DE.d.ts.map +1 -1
  48. package/dist/mcp-slate-ui-locales/de-DE.js +5 -0
  49. package/dist/mcp-slate-ui-locales/de-DE.js.map +1 -1
  50. package/dist/mcp-slate-ui-locales/es-419.d.ts.map +1 -1
  51. package/dist/mcp-slate-ui-locales/es-419.js +5 -0
  52. package/dist/mcp-slate-ui-locales/es-419.js.map +1 -1
  53. package/dist/mcp-slate-ui-locales/es-ES.d.ts.map +1 -1
  54. package/dist/mcp-slate-ui-locales/es-ES.js +5 -0
  55. package/dist/mcp-slate-ui-locales/es-ES.js.map +1 -1
  56. package/dist/mcp-slate-ui-locales/fr-FR.d.ts.map +1 -1
  57. package/dist/mcp-slate-ui-locales/fr-FR.js +5 -0
  58. package/dist/mcp-slate-ui-locales/fr-FR.js.map +1 -1
  59. package/dist/mcp-slate-ui-locales/hi-IN.d.ts.map +1 -1
  60. package/dist/mcp-slate-ui-locales/hi-IN.js +5 -0
  61. package/dist/mcp-slate-ui-locales/hi-IN.js.map +1 -1
  62. package/dist/mcp-slate-ui-locales/it-IT.d.ts.map +1 -1
  63. package/dist/mcp-slate-ui-locales/it-IT.js +5 -0
  64. package/dist/mcp-slate-ui-locales/it-IT.js.map +1 -1
  65. package/dist/mcp-slate-ui-locales/ja-JP.d.ts.map +1 -1
  66. package/dist/mcp-slate-ui-locales/ja-JP.js +5 -0
  67. package/dist/mcp-slate-ui-locales/ja-JP.js.map +1 -1
  68. package/dist/mcp-slate-ui-locales/ko-KR.d.ts.map +1 -1
  69. package/dist/mcp-slate-ui-locales/ko-KR.js +5 -0
  70. package/dist/mcp-slate-ui-locales/ko-KR.js.map +1 -1
  71. package/dist/mcp-slate-ui-locales/pt-BR.d.ts.map +1 -1
  72. package/dist/mcp-slate-ui-locales/pt-BR.js +5 -0
  73. package/dist/mcp-slate-ui-locales/pt-BR.js.map +1 -1
  74. package/dist/mcp-slate-ui-locales/zh-CN.d.ts.map +1 -1
  75. package/dist/mcp-slate-ui-locales/zh-CN.js +5 -0
  76. package/dist/mcp-slate-ui-locales/zh-CN.js.map +1 -1
  77. package/dist/mcp-slate-ui-locales/zh-TW.d.ts.map +1 -1
  78. package/dist/mcp-slate-ui-locales/zh-TW.js +5 -0
  79. package/dist/mcp-slate-ui-locales/zh-TW.js.map +1 -1
  80. package/dist/mcp-slate-ui-script-board.d.ts +19 -0
  81. package/dist/mcp-slate-ui-script-board.d.ts.map +1 -0
  82. package/dist/mcp-slate-ui-script-board.js +126 -0
  83. package/dist/mcp-slate-ui-script-board.js.map +1 -0
  84. package/dist/mcp-slate-ui-script-designs.d.ts +1 -1
  85. package/dist/mcp-slate-ui-script-designs.d.ts.map +1 -1
  86. package/dist/mcp-slate-ui-script-designs.js +24 -15
  87. package/dist/mcp-slate-ui-script-designs.js.map +1 -1
  88. package/dist/mcp-slate-ui-script-inspiration-collage.d.ts +5 -2
  89. package/dist/mcp-slate-ui-script-inspiration-collage.d.ts.map +1 -1
  90. package/dist/mcp-slate-ui-script-inspiration-collage.js +9 -5
  91. package/dist/mcp-slate-ui-script-inspiration-collage.js.map +1 -1
  92. package/dist/mcp-slate-ui-script-inspiration-gallery.d.ts +7 -4
  93. package/dist/mcp-slate-ui-script-inspiration-gallery.d.ts.map +1 -1
  94. package/dist/mcp-slate-ui-script-inspiration-gallery.js +46 -5
  95. package/dist/mcp-slate-ui-script-inspiration-gallery.js.map +1 -1
  96. package/dist/mcp-slate-ui-script-inspiration-grid.d.ts.map +1 -1
  97. package/dist/mcp-slate-ui-script-inspiration-grid.js +4 -0
  98. package/dist/mcp-slate-ui-script-inspiration-grid.js.map +1 -1
  99. package/dist/mcp-slate-ui-script-pause.d.ts +4 -0
  100. package/dist/mcp-slate-ui-script-pause.d.ts.map +1 -1
  101. package/dist/mcp-slate-ui-script-pause.js +9 -2
  102. package/dist/mcp-slate-ui-script-pause.js.map +1 -1
  103. package/dist/mcp-slate-ui-script-peek.d.ts +16 -0
  104. package/dist/mcp-slate-ui-script-peek.d.ts.map +1 -0
  105. package/dist/mcp-slate-ui-script-peek.js +89 -0
  106. package/dist/mcp-slate-ui-script-peek.js.map +1 -0
  107. package/dist/mcp-slate-ui-script-references.d.ts +4 -2
  108. package/dist/mcp-slate-ui-script-references.d.ts.map +1 -1
  109. package/dist/mcp-slate-ui-script-references.js +39 -7
  110. package/dist/mcp-slate-ui-script-references.js.map +1 -1
  111. package/dist/mcp-slate-ui-script-remote.js +2 -2
  112. package/dist/mcp-slate-ui-script-viewer.d.ts +7 -2
  113. package/dist/mcp-slate-ui-script-viewer.d.ts.map +1 -1
  114. package/dist/mcp-slate-ui-script-viewer.js +183 -50
  115. package/dist/mcp-slate-ui-script-viewer.js.map +1 -1
  116. package/dist/mcp-slate-ui-script.d.ts.map +1 -1
  117. package/dist/mcp-slate-ui-script.js +4 -0
  118. package/dist/mcp-slate-ui-script.js.map +1 -1
  119. package/dist/mcp-slate-ui-styles-board.d.ts +7 -0
  120. package/dist/mcp-slate-ui-styles-board.d.ts.map +1 -0
  121. package/dist/mcp-slate-ui-styles-board.js +30 -0
  122. package/dist/mcp-slate-ui-styles-board.js.map +1 -0
  123. package/dist/mcp-slate-ui-styles-designs.d.ts +2 -1
  124. package/dist/mcp-slate-ui-styles-designs.d.ts.map +1 -1
  125. package/dist/mcp-slate-ui-styles-designs.js +10 -8
  126. package/dist/mcp-slate-ui-styles-designs.js.map +1 -1
  127. package/dist/mcp-slate-ui-styles-inspiration.d.ts.map +1 -1
  128. package/dist/mcp-slate-ui-styles-inspiration.js +13 -2
  129. package/dist/mcp-slate-ui-styles-inspiration.js.map +1 -1
  130. package/dist/mcp-slate-ui-styles-loading.d.ts +18 -0
  131. package/dist/mcp-slate-ui-styles-loading.d.ts.map +1 -0
  132. package/dist/mcp-slate-ui-styles-loading.js +37 -0
  133. package/dist/mcp-slate-ui-styles-loading.js.map +1 -0
  134. package/dist/mcp-slate-ui-styles-peek.d.ts +8 -0
  135. package/dist/mcp-slate-ui-styles-peek.d.ts.map +1 -0
  136. package/dist/mcp-slate-ui-styles-peek.js +13 -0
  137. package/dist/mcp-slate-ui-styles-peek.js.map +1 -0
  138. package/dist/mcp-slate-ui-styles.d.ts.map +1 -1
  139. package/dist/mcp-slate-ui-styles.js +0 -3
  140. package/dist/mcp-slate-ui-styles.js.map +1 -1
  141. package/dist/mcp-slate-ui.d.ts.map +1 -1
  142. package/dist/mcp-slate-ui.js +4 -1
  143. package/dist/mcp-slate-ui.js.map +1 -1
  144. package/dist/mcp-workflow-tools.js +2 -2
  145. package/dist/mcp-workflow-tools.js.map +1 -1
  146. package/dist/prototype-browsers.d.ts +10 -2
  147. package/dist/prototype-browsers.d.ts.map +1 -1
  148. package/dist/prototype-browsers.js +27 -2
  149. package/dist/prototype-browsers.js.map +1 -1
  150. package/dist/review-files-server.d.ts +8 -0
  151. package/dist/review-files-server.d.ts.map +1 -0
  152. package/dist/review-files-server.js +133 -0
  153. package/dist/review-files-server.js.map +1 -0
  154. package/dist/review-page-assets.d.ts +1 -1
  155. package/dist/review-page-assets.d.ts.map +1 -1
  156. package/dist/review-page-assets.js +3 -1
  157. package/dist/review-page-assets.js.map +1 -1
  158. package/dist/review-page.d.ts +8 -1
  159. package/dist/review-page.d.ts.map +1 -1
  160. package/dist/review-page.js +32 -21
  161. package/dist/review-page.js.map +1 -1
  162. package/dist/review-server-guard.d.ts +33 -0
  163. package/dist/review-server-guard.d.ts.map +1 -0
  164. package/dist/review-server-guard.js +65 -0
  165. package/dist/review-server-guard.js.map +1 -0
  166. package/dist/review-server.d.ts +2 -0
  167. package/dist/review-server.d.ts.map +1 -1
  168. package/dist/review-server.js +45 -74
  169. package/dist/review-server.js.map +1 -1
  170. package/dist/server.d.ts.map +1 -1
  171. package/dist/server.js +2 -1
  172. package/dist/server.js.map +1 -1
  173. package/dist/slate-actions.d.ts +6 -7
  174. package/dist/slate-actions.d.ts.map +1 -1
  175. package/dist/slate-actions.js +6 -9
  176. package/dist/slate-actions.js.map +1 -1
  177. package/dist/slate-branch-runner.d.ts +120 -0
  178. package/dist/slate-branch-runner.d.ts.map +1 -0
  179. package/dist/slate-branch-runner.js +312 -0
  180. package/dist/slate-branch-runner.js.map +1 -0
  181. package/dist/slate-captions-local.d.ts +14 -0
  182. package/dist/slate-captions-local.d.ts.map +1 -0
  183. package/dist/slate-captions-local.js +70 -0
  184. package/dist/slate-captions-local.js.map +1 -0
  185. package/dist/slate-captions-remote.d.ts +29 -0
  186. package/dist/slate-captions-remote.d.ts.map +1 -0
  187. package/dist/slate-captions-remote.js +65 -0
  188. package/dist/slate-captions-remote.js.map +1 -0
  189. package/dist/slate-captions.d.ts +41 -0
  190. package/dist/slate-captions.d.ts.map +1 -0
  191. package/dist/slate-captions.js +112 -0
  192. package/dist/slate-captions.js.map +1 -0
  193. package/dist/slate-commit.d.ts.map +1 -1
  194. package/dist/slate-commit.js +8 -6
  195. package/dist/slate-commit.js.map +1 -1
  196. package/dist/slate-image-executor.d.ts +18 -3
  197. package/dist/slate-image-executor.d.ts.map +1 -1
  198. package/dist/slate-image-executor.js +18 -5
  199. package/dist/slate-image-executor.js.map +1 -1
  200. package/dist/slate-paths.d.ts +3 -1
  201. package/dist/slate-paths.d.ts.map +1 -1
  202. package/dist/slate-paths.js +8 -2
  203. package/dist/slate-paths.js.map +1 -1
  204. package/dist/slate-round-prompt.d.ts +0 -12
  205. package/dist/slate-round-prompt.d.ts.map +1 -1
  206. package/dist/slate-round-prompt.js +0 -15
  207. package/dist/slate-round-prompt.js.map +1 -1
  208. package/dist/slate-round-runner.d.ts.map +1 -1
  209. package/dist/slate-round-runner.js +8 -14
  210. package/dist/slate-round-runner.js.map +1 -1
  211. package/dist/slate-runner-context.d.ts +3 -0
  212. package/dist/slate-runner-context.d.ts.map +1 -1
  213. package/dist/slate-runner-context.js.map +1 -1
  214. package/dist/slate-runner-main.d.ts +3 -0
  215. package/dist/slate-runner-main.d.ts.map +1 -1
  216. package/dist/slate-runner-main.js +5 -1
  217. package/dist/slate-runner-main.js.map +1 -1
  218. package/dist/slate-runner-spawn.js +2 -2
  219. package/dist/slate-runner-spawn.js.map +1 -1
  220. package/dist/slate-site-references-capture.d.ts +38 -1
  221. package/dist/slate-site-references-capture.d.ts.map +1 -1
  222. package/dist/slate-site-references-capture.js +25 -7
  223. package/dist/slate-site-references-capture.js.map +1 -1
  224. package/dist/slate-site-references-client.d.ts +13 -1
  225. package/dist/slate-site-references-client.d.ts.map +1 -1
  226. package/dist/slate-site-references-client.js +39 -14
  227. package/dist/slate-site-references-client.js.map +1 -1
  228. package/dist/slate-site-references-local.d.ts +3 -0
  229. package/dist/slate-site-references-local.d.ts.map +1 -1
  230. package/dist/slate-site-references-local.js +20 -1
  231. package/dist/slate-site-references-local.js.map +1 -1
  232. package/dist/slate-site-references-suggest.d.ts +25 -2
  233. package/dist/slate-site-references-suggest.d.ts.map +1 -1
  234. package/dist/slate-site-references-suggest.js +71 -12
  235. package/dist/slate-site-references-suggest.js.map +1 -1
  236. package/dist/slate-site-references.d.ts +11 -0
  237. package/dist/slate-site-references.d.ts.map +1 -1
  238. package/dist/slate-site-references.js +42 -3
  239. package/dist/slate-site-references.js.map +1 -1
  240. package/dist/slate-view-contract.d.ts +39 -1
  241. package/dist/slate-view-contract.d.ts.map +1 -1
  242. package/dist/slate-view.d.ts.map +1 -1
  243. package/dist/slate-view.js +8 -0
  244. package/dist/slate-view.js.map +1 -1
  245. package/dist/slate-workspace-parse.d.ts.map +1 -1
  246. package/dist/slate-workspace-parse.js +35 -0
  247. package/dist/slate-workspace-parse.js.map +1 -1
  248. package/dist/slate-workspace-types.d.ts +31 -2
  249. package/dist/slate-workspace-types.d.ts.map +1 -1
  250. package/dist/workflow/adapter-12ui.js +1 -1
  251. package/dist/workflow/adapter-12ui.js.map +1 -1
  252. package/dist/workflow/adapters.d.ts.map +1 -1
  253. package/dist/workflow/adapters.js +3 -3
  254. package/dist/workflow/adapters.js.map +1 -1
  255. package/dist/workflow/providers.js +2 -2
  256. package/dist/workflow/providers.js.map +1 -1
  257. package/dist/workflow/routing.d.ts +8 -1
  258. package/dist/workflow/routing.d.ts.map +1 -1
  259. package/dist/workflow/routing.js +9 -2
  260. package/dist/workflow/routing.js.map +1 -1
  261. package/dist/workflow/types.d.ts +5 -2
  262. package/dist/workflow/types.d.ts.map +1 -1
  263. package/dist/workflow/types.js.map +1 -1
  264. package/dist/workflow-transport.d.ts.map +1 -1
  265. package/dist/workflow-transport.js +4 -2
  266. package/dist/workflow-transport.js.map +1 -1
  267. package/dist/workspace-draw-branch.d.ts +27 -0
  268. package/dist/workspace-draw-branch.d.ts.map +1 -0
  269. package/dist/workspace-draw-branch.js +101 -0
  270. package/dist/workspace-draw-branch.js.map +1 -0
  271. package/dist/workspace-draw-client.d.ts +27 -0
  272. package/dist/workspace-draw-client.d.ts.map +1 -1
  273. package/dist/workspace-draw-client.js +30 -0
  274. package/dist/workspace-draw-client.js.map +1 -1
  275. package/dist/workspace-draw-codex.d.ts +5 -5
  276. package/dist/workspace-draw-codex.d.ts.map +1 -1
  277. package/dist/workspace-draw-codex.js +4 -3
  278. package/dist/workspace-draw-codex.js.map +1 -1
  279. package/dist/workspace-draw-run.d.ts +19 -3
  280. package/dist/workspace-draw-run.d.ts.map +1 -1
  281. package/dist/workspace-draw-run.js +44 -4
  282. package/dist/workspace-draw-run.js.map +1 -1
  283. package/dist/workspace-draw-types.d.ts +18 -2
  284. package/dist/workspace-draw-types.d.ts.map +1 -1
  285. package/dist/workspace-draw-types.js.map +1 -1
  286. package/dist/workspace-runner-main.d.ts +9 -2
  287. package/dist/workspace-runner-main.d.ts.map +1 -1
  288. package/dist/workspace-runner-main.js +21 -2
  289. package/dist/workspace-runner-main.js.map +1 -1
  290. package/dist/workspace-runner-spawn.js +1 -1
  291. package/dist/workspace-runner-spawn.js.map +1 -1
  292. package/open-design.json +2 -2
  293. package/package.json +1 -1
  294. package/runtime/codex-conversion/bin/convert.mjs +1 -1
  295. package/runtime/codex-conversion/src/codex/caller-home.mjs +95 -0
  296. package/runtime/codex-conversion/src/codex/home.mjs +8 -2
  297. package/runtime/codex-conversion/src/images/execute.mjs +1 -1
  298. package/runtime/codex-conversion/src/images/native-invoke.mjs +21 -13
  299. package/runtime/codex-conversion/src/images/native.mjs +42 -19
  300. package/runtime/codex-conversion/src/run.mjs +2 -1
  301. package/skills/12ui-design/SKILL.md +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-slate-ui-styles-designs.d.ts","sourceRoot":"","sources":["../src/mcp-slate-ui-styles-designs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,QA+GnC,CAAC"}
1
+ {"version":3,"file":"mcp-slate-ui-styles-designs.d.ts","sourceRoot":"","sources":["../src/mcp-slate-ui-styles-designs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,QAgHnC,CAAC"}
@@ -1,15 +1,16 @@
1
1
  /**
2
2
  * The Designs tab and the large view. Tiles are large and keep the frame's shape (`--ar` per tile); a grid's columns
3
3
  * are no narrower than `--tile` times the square root of its ratio (`--shape`), so a 3:2 design is about 160 px wide on
4
- * a phone (two across), 220 px in a card (three across) and 300 px in the workspace (four across at 1440 px). Under
4
+ * a phone (two across), 300 px in a card (two across in Codex's inline frame) and 400 px in the workspace (three across
5
+ * at 1440 px). A slot being drawn is the loading surface (mcp-slate-ui-styles-loading.ts). Under
5
6
  * each picture is one row: the code (and where it came from, or its page) at the left, the four icon actions at the
6
7
  * right, so nothing covers the design. The chosen design has the selection's own language: a thick ring in the host's
7
8
  * accent and a filled check on the picture.
8
9
  */
9
10
  export const SLATE_UI_DESIGNS_STYLES = String.raw `
10
11
  .designs { --tile: 130px; display: flex; flex-direction: column; gap: 22px; min-width: 0; }
11
- @container (min-width: 480px) { .designs { --tile: 180px; } }
12
- #stage .designs { --tile: 245px; }
12
+ @container (min-width: 480px) { .designs { --tile: 250px; } }
13
+ #stage .designs { --tile: 330px; }
13
14
  @media (max-width: 639px) { #stage .designs { --tile: 130px; } }
14
15
 
15
16
  /* The bar: how many a round draws, and More. */
@@ -32,13 +33,14 @@ export const SLATE_UI_DESIGNS_STYLES = String.raw `
32
33
  .feedimg:not([src]) { visibility: hidden; }
33
34
  .feedmore { flex: none; font-size: 11px; color: var(--text2); padding-left: 2px; }
34
35
  .dnote { min-width: 0; flex: 0 1 auto; font-size: 12px; color: var(--text2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
36
+ .dcaption { min-width: 0; flex: 1 1 0; font-size: 12px; color: var(--text2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
37
+ .dcaption + .spacer { display: none; }
35
38
  .dstat { display: inline-flex; align-items: center; gap: 6px; flex: none; font-size: 12px; color: var(--text2); font-variant-numeric: tabular-nums; }
36
39
  .dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; }
37
40
  .dot.run { background: var(--ring); animation: pulse 1.2s ease-in-out infinite; }
38
41
  .dot.err { background: var(--danger); }
39
42
  @keyframes pulse { 50% { opacity: .3; } }
40
43
  .earlier { align-self: center; color: var(--text2); }
41
- .dsec.branch .dgrid { padding-left: 14px; border-left: 2px solid var(--ring); margin-left: 10px; }
42
44
 
43
45
  .dgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, calc(var(--tile) * var(--shape, 1.22))), 1fr)); gap: 14px 12px; align-items: start; min-width: 0; }
44
46
  #stage .dgrid { gap: 20px 16px; }
@@ -57,11 +59,9 @@ export const SLATE_UI_DESIGNS_STYLES = String.raw `
57
59
  /* Under the picture: its letter and, where there is one, where it came from; the words shorten with an ellipsis (the full words are the tag's title). */
58
60
  .dmeta { display: flex; flex-wrap: nowrap; align-items: center; gap: 0 4px; min-width: 0; min-height: 28px; margin-top: 4px; }
59
61
  .dtag { display: inline-flex; align-items: baseline; gap: 6px; min-width: 0; max-width: 100%; flex: 1 1 auto; overflow: hidden; white-space: nowrap; }
60
- .dtag .code { position: static; flex: none; padding: 0 7px; border-radius: 999px; background: var(--fill); color: var(--text); font-size: 12px; font-weight: 600; line-height: 20px; }
62
+ .dtag .code, .bchead .code { position: static; flex: none; padding: 0 7px; border-radius: 999px; background: var(--fill); color: var(--text); font-size: 12px; font-weight: 600; line-height: 20px; }
61
63
  .dfrom { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; font-size: 12px; color: var(--text2); }
62
64
  .dpage { min-width: 0; font-size: 12px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; }
63
- .spin { position: absolute; left: 50%; top: 50%; width: 26px; height: 26px; margin: -13px 0 0 -13px; border: 2.5px solid var(--border); border-top-color: var(--text2); border-radius: 50%; animation: spin .9s linear infinite; }
64
- @keyframes spin { to { transform: rotate(360deg); } }
65
65
  .dtile.loading .dtag .code { background: transparent; box-shadow: inset 0 0 0 1px var(--border); color: var(--text2); }
66
66
  /* The tile's one action: a labelled pill over the picture's top right, on hover or keyboard focus, always on a touch screen. */
67
67
  .dpick { position: absolute; right: 8px; top: 8px; z-index: 2; padding: 5px 12px; border: 0; border-radius: 999px; background: var(--bg); color: var(--text); font-size: 12px; font-weight: 600; box-shadow: var(--elev); opacity: 0; transition: opacity .12s; }
@@ -111,10 +111,12 @@ export const SLATE_UI_DESIGNS_STYLES = String.raw `
111
111
  .lvacts { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; }
112
112
  .lvform { display: flex; align-items: center; gap: 4px; width: min(720px, 100%); padding: 4px 4px 4px 6px; border: 1px solid var(--border); border-radius: 999px; background: var(--bg); }
113
113
  .lvform:focus-within { border-color: var(--ring); }
114
+ .seg.lvscope { display: inline-flex; flex: none; padding: 2px; border-radius: 999px; background: var(--fill); }
115
+ .lvscope button.segbtn { white-space: nowrap; }
114
116
  .lvmode { display: inline-grid; place-items: center; flex: none; width: 30px; height: 30px; border-radius: 50%; background: var(--accent-solid); color: var(--inverse-text); }
115
117
  input.lvinput { flex: 1 1 auto; min-width: 0; padding: 8px 6px; border: 0; background: transparent; color: var(--text); font: inherit; }
116
118
  input.lvinput:focus-visible { outline: none; }
117
- @media (prefers-reduced-motion: reduce) { .dot.run { animation: none; } button.dface { transition: none; } .dpick { transition: none; } .spin { animation-duration: 2.4s; } }
119
+ @media (prefers-reduced-motion: reduce) { .dot.run { animation: none; } button.dface { transition: none; } .dpick { transition: none; } }
118
120
  /* The scribble layer of the large view's edit lies exactly over the picture. */
119
121
  .scribble { position: absolute; inset: 0; width: 100%; height: 100%; cursor: crosshair; touch-action: none; }
120
122
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-slate-ui-styles-designs.js","sourceRoot":"","sources":["../src/mcp-slate-ui-styles-designs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+GhD,CAAC"}
1
+ {"version":3,"file":"mcp-slate-ui-styles-designs.js","sourceRoot":"","sources":["../src/mcp-slate-ui-styles-designs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgHhD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-slate-ui-styles-inspiration.d.ts","sourceRoot":"","sources":["../src/mcp-slate-ui-styles-inspiration.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,2BAA2B,QA2DvC,CAAC"}
1
+ {"version":3,"file":"mcp-slate-ui-styles-inspiration.d.ts","sourceRoot":"","sources":["../src/mcp-slate-ui-styles-inspiration.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,2BAA2B,QAsEvC,CAAC"}
@@ -18,6 +18,8 @@ export const SLATE_UI_INSPIRATION_STYLES = String.raw `
18
18
  .insp { container-type: inline-size; }
19
19
  .refs { container-type: inline-size; }
20
20
  .insp > .status { margin: 0 0 10px; }
21
+ /* One quiet sentence on what the tab is doing for this brief: no icon, no box. */
22
+ .tabcaption { margin: 0 0 8px; font-size: var(--fs-sm); line-height: 1.35; color: var(--text2); overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
21
23
  .results { min-width: 0; }
22
24
  /* The gutter is kept, so the scroll bar coming and going never changes the collage's width. */
23
25
  .insp.card .results { max-height: max(360px, 72cqw); overflow-y: auto; scrollbar-gutter: stable; padding: 2px; }
@@ -40,8 +42,17 @@ export const SLATE_UI_INSPIRATION_STYLES = String.raw `
40
42
  .zoombtn svg { width: 15px; height: 15px; }
41
43
  @media (hover: hover) { .gtile .zoombtn { opacity: 0; transition: opacity .12s; } .gtile:hover .zoombtn, .gtile .zoombtn:focus-visible { opacity: 1; } }
42
44
  .skelgrid:empty { display: none; }
43
- .skelgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 220px), 1fr)); gap: 16px; }
44
- .skelgrid > .skeleton { height: 160px; border-radius: var(--radius); }
45
+ .skelgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 300px), 1fr)); gap: 16px; }
46
+ .skelgrid > .skeleton { height: 200px; border-radius: var(--radius); }
47
+ /* A captioned grid (References): the picture, then its name and its site's domain (a link) in the reserved strip. */
48
+ .captioned .refbtn { bottom: auto; height: calc(100% - 42px); }
49
+ .gcap { position: absolute; left: 2px; right: 2px; bottom: 0; height: 42px; display: flex; flex-direction: column; justify-content: center; gap: 1px; min-width: 0; line-height: 16px; }
50
+ .gname { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-size: var(--fs-sm); font-weight: 600; color: var(--text); }
51
+ .gdomain { align-self: flex-start; max-width: 100%; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-size: var(--fs-sm); color: var(--text2); text-decoration: none; }
52
+ .gdomain:hover { color: var(--ring); text-decoration: underline; }
53
+ .gdomain:focus-visible { outline: 2px solid var(--ring); outline-offset: 1px; border-radius: 3px; }
54
+ .gtile.pending .refbtn { cursor: default; background: var(--fill); }
55
+ .gtile.pending .refbtn:disabled { opacity: 1; }
45
56
  .placeholder { display: grid; place-items: center; min-height: 160px; border-radius: var(--radius); background: var(--fill); color: var(--text2); padding: 16px; text-align: center; font-size: var(--fs-sm); }
46
57
  /* The tray: the picks, the countdown while a round waits, and the one action. */
47
58
  .tray { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; margin-top: 16px; padding-top: 12px; border-top: 1px solid var(--border2); background: var(--bg); min-width: 0; }
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-slate-ui-styles-inspiration.js","sourceRoot":"","sources":["../src/mcp-slate-ui-styles-inspiration.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2DpD,CAAC"}
1
+ {"version":3,"file":"mcp-slate-ui-styles-inspiration.js","sourceRoot":"","sources":["../src/mcp-slate-ui-styles-inspiration.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsEpD,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The loading surface, everywhere a picture is on its way (`.shimmer`): an Inspiration or References tile until its
3
+ * picture lands, the skeleton tiles of a first search, a reference site whose screenshot is still being captured, and a
4
+ * design slot while it is drawn.
5
+ *
6
+ * A field of fine dots in the host's ink whose brightness ripples across the frame: one soft crest with a faint echo,
7
+ * travelling diagonally. The wave is fixed to the frame (`background-attachment: fixed`), so every loading tile on
8
+ * screen is a window onto the same wave and a grid of them reads as one calm surface rather than many blinking boxes.
9
+ *
10
+ * - On a picture (`img.shimmer`, no pixels yet) the dots are the picture's own mask, so its tile's ground shows between
11
+ * them; on anything else they are an overlay (`::before`) over the element's own ground, under its content.
12
+ * - The colours are the host's ink (`--text`) mixed into transparency, so Codex's light and dark themes drive it.
13
+ * - Reduced motion: still dots, no wave.
14
+ * - Chosen over the web's light band (apps/web generatedDesignPromptEdit.css) side by side in light and dark (evidence
15
+ * 12ui/slate-ui-polish/loading): the band must stay faint not to glare in light, and then all but vanishes on dark.
16
+ */
17
+ export declare const SLATE_UI_LOADING_STYLES: string;
18
+ //# sourceMappingURL=mcp-slate-ui-styles-loading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-slate-ui-styles-loading.d.ts","sourceRoot":"","sources":["../src/mcp-slate-ui-styles-loading.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,uBAAuB,QAmBnC,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * The loading surface, everywhere a picture is on its way (`.shimmer`): an Inspiration or References tile until its
3
+ * picture lands, the skeleton tiles of a first search, a reference site whose screenshot is still being captured, and a
4
+ * design slot while it is drawn.
5
+ *
6
+ * A field of fine dots in the host's ink whose brightness ripples across the frame: one soft crest with a faint echo,
7
+ * travelling diagonally. The wave is fixed to the frame (`background-attachment: fixed`), so every loading tile on
8
+ * screen is a window onto the same wave and a grid of them reads as one calm surface rather than many blinking boxes.
9
+ *
10
+ * - On a picture (`img.shimmer`, no pixels yet) the dots are the picture's own mask, so its tile's ground shows between
11
+ * them; on anything else they are an overlay (`::before`) over the element's own ground, under its content.
12
+ * - The colours are the host's ink (`--text`) mixed into transparency, so Codex's light and dark themes drive it.
13
+ * - Reduced motion: still dots, no wave.
14
+ * - Chosen over the web's light band (apps/web generatedDesignPromptEdit.css) side by side in light and dark (evidence
15
+ * 12ui/slate-ui-polish/loading): the band must stay faint not to glare in light, and then all but vanishes on dark.
16
+ */
17
+ export const SLATE_UI_LOADING_STYLES = String.raw `
18
+ .shimmer, .shimmer:not(img)::before {
19
+ --dot: color-mix(in srgb, var(--text) 15%, transparent);
20
+ --dot-mid: color-mix(in srgb, var(--text) 28%, transparent);
21
+ --dot-hi: color-mix(in srgb, var(--text) 56%, transparent);
22
+ }
23
+ img.shimmer, .shimmer:not(img)::before {
24
+ background-color: transparent;
25
+ background-image: linear-gradient(118deg, var(--dot) 34%, var(--dot-mid) 39%, var(--dot) 42.5%, var(--dot-mid) 45.5%, var(--dot-hi) 50%, var(--dot-mid) 54%, var(--dot) 59%);
26
+ background-size: 200vw 200vh;
27
+ background-attachment: fixed;
28
+ -webkit-mask: radial-gradient(circle, #000 1.15px, transparent 1.75px) 0 0 / 9px 9px;
29
+ mask: radial-gradient(circle, #000 1.15px, transparent 1.75px) 0 0 / 9px 9px;
30
+ animation: dotwave 2.4s cubic-bezier(.45, .05, .55, .95) infinite;
31
+ }
32
+ .shimmer:not(img)::before { content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; }
33
+ .skelgrid > .skeleton { position: relative; overflow: hidden; background: var(--fill); }
34
+ @keyframes dotwave { from { background-position: -135vw -135vh; } to { background-position: 35vw 35vh; } }
35
+ @media (prefers-reduced-motion: reduce) { .shimmer { animation: none; } .shimmer:not(img)::before { animation: none; background-image: none; background-color: var(--dot-mid); } img.shimmer { background-image: none; background-color: var(--dot-mid); } }
36
+ `;
37
+ //# sourceMappingURL=mcp-slate-ui-styles-loading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-slate-ui-styles-loading.js","sourceRoot":"","sources":["../src/mcp-slate-ui-styles-loading.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;CAmBhD,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The hover peek (mcp-slate-ui-script-peek.ts): a larger copy of a tile's picture floating over the grid, fixed to the
3
+ * frame, never taking the pointer. It appears at its full size after the hover delay, with no entry animation (a
4
+ * scale-in was measured frozen at the tile's size in headless Chromium), and a soft shadow in either theme; a selected
5
+ * or chosen tile's copy keeps its ring.
6
+ */
7
+ export declare const SLATE_UI_PEEK_STYLES: string;
8
+ //# sourceMappingURL=mcp-slate-ui-styles-peek.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-slate-ui-styles-peek.d.ts","sourceRoot":"","sources":["../src/mcp-slate-ui-styles-peek.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QAKhC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * The hover peek (mcp-slate-ui-script-peek.ts): a larger copy of a tile's picture floating over the grid, fixed to the
3
+ * frame, never taking the pointer. It appears at its full size after the hover delay, with no entry animation (a
4
+ * scale-in was measured frozen at the tile's size in headless Chromium), and a soft shadow in either theme; a selected
5
+ * or chosen tile's copy keeps its ring.
6
+ */
7
+ export const SLATE_UI_PEEK_STYLES = String.raw `
8
+ .peek { position: fixed; z-index: 30; pointer-events: none; overflow: hidden; border-radius: var(--radius-lg); background: var(--fill);
9
+ box-shadow: 0 0 0 1px var(--border2), 0 2px 6px light-dark(rgb(0 0 0 / .06), rgb(0 0 0 / .3)), 0 18px 44px -8px light-dark(rgb(0 0 0 / .28), rgb(0 0 0 / .62)); }
10
+ .peek.on { box-shadow: 0 0 0 3px var(--ring), 0 2px 6px light-dark(rgb(0 0 0 / .06), rgb(0 0 0 / .3)), 0 18px 44px -8px light-dark(rgb(0 0 0 / .28), rgb(0 0 0 / .62)); }
11
+ .peek img { display: block; width: 100%; height: 100%; object-fit: contain; }
12
+ `;
13
+ //# sourceMappingURL=mcp-slate-ui-styles-peek.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-slate-ui-styles-peek.js","sourceRoot":"","sources":["../src/mcp-slate-ui-styles-peek.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;CAK7C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-slate-ui-styles.d.ts","sourceRoot":"","sources":["../src/mcp-slate-ui-styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,eAAe,QAgI3B,CAAC"}
1
+ {"version":3,"file":"mcp-slate-ui-styles.d.ts","sourceRoot":"","sources":["../src/mcp-slate-ui-styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,eAAe,QA6H3B,CAAC"}
@@ -117,8 +117,6 @@ export const SLATE_UI_STYLES = String.raw `
117
117
  .thumb { display: block; width: 100%; height: 100%; background: var(--fill); object-fit: contain; object-position: center; }
118
118
  .tilenote { position: absolute; left: 8px; right: 8px; top: 6px; bottom: 6px; display: flex; align-items: center; justify-content: center; font-size: var(--fs-sm); font-weight: 500; line-height: 1.35; text-align: center; color: var(--text2); }
119
119
  .tilenote > span { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4; overflow: hidden; overflow-wrap: anywhere; }
120
- .shimmer { background: linear-gradient(100deg, var(--fill) 30%, var(--fill-hover) 50%, var(--fill) 70%); background-size: 200% 100%; animation: shimmer 1.4s linear infinite; }
121
- @keyframes shimmer { from { background-position: 100% 0; } to { background-position: -100% 0; } }
122
120
  input[type="text"] {
123
121
  width: 100%; padding: 8px 10px; font: inherit; color: var(--text); background: var(--bg);
124
122
  border: 1px solid var(--border); border-radius: var(--radius);
@@ -135,7 +133,6 @@ export const SLATE_UI_STYLES = String.raw `
135
133
  button:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }
136
134
  button:disabled { opacity: .45; cursor: default; }
137
135
  .note { margin: 10px 0 0; font-size: var(--fs-sm); color: var(--text2); }
138
- @media (prefers-reduced-motion: reduce) { .shimmer { animation: none; } }
139
136
  .status { min-height: 18px; margin: 8px 0 0; font-size: var(--fs-sm); overflow-wrap: anywhere; }
140
137
  .status:empty { display: none; }
141
138
  .status.ok { color: var(--ok); }
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-slate-ui-styles.js","sourceRoot":"","sources":["../src/mcp-slate-ui-styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgIxC,CAAC"}
1
+ {"version":3,"file":"mcp-slate-ui-styles.js","sourceRoot":"","sources":["../src/mcp-slate-ui-styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6HxC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-slate-ui.d.ts","sourceRoot":"","sources":["../src/mcp-slate-ui.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAOlF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,gBAAgB,GAAI,YAAY;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,KAAG,MAwCxE,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,aAAa,QAAwC,CAAC"}
1
+ {"version":3,"file":"mcp-slate-ui.d.ts","sourceRoot":"","sources":["../src/mcp-slate-ui.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAUlF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,gBAAgB,GAAI,YAAY;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,KAAG,MAwCxE,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,aAAa,QAAwC,CAAC"}
@@ -1,9 +1,12 @@
1
1
  import { SLATE_UI_COPY as COPY } from './mcp-slate-ui-copy.js';
2
2
  import { buildSlateUiScript } from './mcp-slate-ui-script.js';
3
3
  import { SLATE_UI_STYLES } from './mcp-slate-ui-styles.js';
4
+ import { SLATE_UI_LOADING_STYLES } from './mcp-slate-ui-styles-loading.js';
5
+ import { SLATE_UI_PEEK_STYLES } from './mcp-slate-ui-styles-peek.js';
4
6
  import { SLATE_UI_INSPIRATION_STYLES } from './mcp-slate-ui-styles-inspiration.js';
5
7
  import { SLATE_UI_PAUSE_STYLES } from './mcp-slate-ui-styles-pause.js';
6
8
  import { SLATE_UI_STAGE_STYLES } from './mcp-slate-ui-styles-stage.js';
9
+ import { SLATE_UI_BOARD_STYLES } from './mcp-slate-ui-styles-board.js';
7
10
  import { SLATE_UI_DESIGNS_STYLES } from './mcp-slate-ui-styles-designs.js';
8
11
  /**
9
12
  * The workspace view for one target, as one self-contained HTML document: no external script, stylesheet or font, so
@@ -28,7 +31,7 @@ export const buildSlateUiHtml = ({ target }) => `<!doctype html>
28
31
  <meta charset="utf-8">
29
32
  <meta name="viewport" content="width=device-width, initial-scale=1">${target === 'local' ? '' : `\n<meta name="slate-target" content="${target}">`}
30
33
  <title>${COPY.title}</title>
31
- <style>${SLATE_UI_STYLES}${SLATE_UI_STAGE_STYLES}${SLATE_UI_DESIGNS_STYLES}${SLATE_UI_INSPIRATION_STYLES}${SLATE_UI_PAUSE_STYLES}</style>
34
+ <style>${SLATE_UI_STYLES}${SLATE_UI_LOADING_STYLES}${SLATE_UI_STAGE_STYLES}${SLATE_UI_DESIGNS_STYLES}${SLATE_UI_BOARD_STYLES}${SLATE_UI_INSPIRATION_STYLES}${SLATE_UI_PAUSE_STYLES}${SLATE_UI_PEEK_STYLES}</style>
32
35
  </head>
33
36
  <body>
34
37
  <div id="fatal" class="hidden" role="alert"></div>
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-slate-ui.js","sourceRoot":"","sources":["../src/mcp-slate-ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,IAAI,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAsB,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAE3E;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,MAAM,EAA6B,EAAU,EAAE,CAAC;;;;sEAIb,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,wCAAwC,MAAM,IAAI;SACzI,IAAI,CAAC,KAAK;SACV,eAAe,GAAG,qBAAqB,GAAG,uBAAuB,GAAG,2BAA2B,GAAG,qBAAqB;;;;;qCAK3F,IAAI,CAAC,KAAK;wDACS,IAAI,CAAC,KAAK;;wGAEsC,IAAI,CAAC,UAAU,kBAAkB,IAAI,CAAC,gBAAgB,oKAAoK,IAAI,CAAC,MAAM;;qDAExR,IAAI,CAAC,KAAK;+HACgE,IAAI,CAAC,cAAc;6HACrB,IAAI,CAAC,aAAa;sHACzB,IAAI,CAAC,UAAU;;;sEAG/D,IAAI,CAAC,aAAa,YAAY,IAAI,CAAC,aAAa;;;;;;;;;;;;;;;UAe5G,kBAAkB,CAAC,MAAM,CAAC;;;CAGnC,CAAC;AAEF,yDAAyD;AACzD,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"mcp-slate-ui.js","sourceRoot":"","sources":["../src/mcp-slate-ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,IAAI,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAsB,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAE3E;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,MAAM,EAA6B,EAAU,EAAE,CAAC;;;;sEAIb,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,wCAAwC,MAAM,IAAI;SACzI,IAAI,CAAC,KAAK;SACV,eAAe,GAAG,uBAAuB,GAAG,qBAAqB,GAAG,uBAAuB,GAAG,qBAAqB,GAAG,2BAA2B,GAAG,qBAAqB,GAAG,oBAAoB;;;;;qCAKpK,IAAI,CAAC,KAAK;wDACS,IAAI,CAAC,KAAK;;wGAEsC,IAAI,CAAC,UAAU,kBAAkB,IAAI,CAAC,gBAAgB,oKAAoK,IAAI,CAAC,MAAM;;qDAExR,IAAI,CAAC,KAAK;+HACgE,IAAI,CAAC,cAAc;6HACrB,IAAI,CAAC,aAAa;sHACzB,IAAI,CAAC,UAAU;;;sEAG/D,IAAI,CAAC,aAAa,YAAY,IAAI,CAAC,aAAa;;;;;;;;;;;;;;;UAe5G,kBAAkB,CAAC,MAAM,CAAC;;;CAGnC,CAAC;AAEF,yDAAyD;AACzD,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC"}
@@ -34,11 +34,11 @@ export const MCP_WORKFLOW_TOOL_DEFINITIONS = [
34
34
  },
35
35
  {
36
36
  name: 'design.workflow.execute',
37
- description: 'Route a prepared operation. Image, image-edit and convert work runs only through the 12ui CLI\'s own providers (the 12ui API, or the OpenAI API for images, each with explicit allowPaid), never a host session. Text and code may go to a declared session (a handoff to complete with host tools, then register), a local CLI, or an explicitly authorized paid provider. Ambiguous dispatched work is not retried on another provider.',
37
+ description: 'Route a prepared operation. Image, image-edit and convert work runs only through the 12ui CLI\'s own providers (the 12ui API on the 12ui sign-in, or the OpenAI API for images when the user opts in with allowPaid), never a host session. Text and code may go to a declared session (a handoff to complete with host tools, then register), a local CLI, the 12ui API, or the OpenAI API under allowPaid. Ambiguous dispatched work is not retried on another provider.',
38
38
  inputSchema: object({
39
39
  workspace, operationId: string,
40
40
  providers: { type: 'array', minItems: 1, uniqueItems: true, items: { enum: [...PROVIDERS] }, description: 'Provider preference order. A session is eligible only for explicitly declared capabilities.' },
41
- allowPaid: { type: 'array', uniqueItems: true, items: { enum: ['openai', '12ui'] }, description: 'Explicit permission for providers funded by API keys or 12ui credits. Key presence is not permission.' },
41
+ allowPaid: { type: 'array', uniqueItems: true, items: { enum: ['openai', '12ui'] }, description: 'The user\'s opt-in to spend on their own OpenAI API key ("openai"). Key presence is not that opt-in. 12ui credit use needs no permission; a "12ui" entry changes nothing.' },
42
42
  sessionCapabilities: capabilityList,
43
43
  trustCodexConfig,
44
44
  }, ['workspace', 'operationId']),
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-workflow-tools.js","sourceRoot":"","sources":["../src/mcp-workflow-tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-workflow-tools.js","sourceRoot":"","sources":["../src/mcp-workflow-tools.ts"],"names":[],"mappings":"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"}
@@ -17,10 +17,18 @@ export declare const resolvePrototypeBrowserProvisioning: (args?: {
17
17
  playwrightCli?: string;
18
18
  }) => Promise<PrototypeBrowserProvisioning>;
19
19
  export declare const isMissingPrototypeBrowserOutput: (output: string) => boolean;
20
+ /**
21
+ * Installs Chromium into the managed browsers path, the same install the command
22
+ * above names. Only the References tab's capture calls it: that capture runs
23
+ * unattended (the workspace runner, or the draw command while the person
24
+ * chooses), so nobody would read the command, and a fresh home has no browser.
25
+ */
26
+ export declare const installPrototypeBrowser: (provisioning: Pick<PrototypeBrowserProvisioning, "environment">, playwrightCli?: string) => Promise<void>;
20
27
  /**
21
28
  * The one statement of a missing managed browser, shared by every command that
22
- * drives Chromium (prototype stages, scene capture). The CLI never downloads a
23
- * browser on its own; it names the exact install command for this environment.
29
+ * drives Chromium (prototype stages, scene capture). Those commands never
30
+ * download a browser on their own; they name the exact install command for this
31
+ * environment (the References capture installs it, above).
24
32
  */
25
33
  export declare const missingPrototypeBrowserMessage: (args: {
26
34
  /** What cannot start, e.g. `Prototype runtime` or `Scene capture`. */
@@ -1 +1 @@
1
- {"version":3,"file":"prototype-browsers.d.ts","sourceRoot":"","sources":["../src/prototype-browsers.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,4BAA4B,GAAG;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAmCF;;;;;GAKG;AACH,eAAO,MAAM,mCAAmC,GAAU,OAAM;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,KAAG,OAAO,CAAC,4BAA4B,CAmB5C,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAAI,QAAQ,MAAM,KAAG,OAGhE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,GAAI,MAAM;IACnD,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC,4BAA4B,EAAE,cAAc,GAAG,gBAAgB,CAAC,CAAC;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,KAAG,MAMH,CAAC"}
1
+ {"version":3,"file":"prototype-browsers.d.ts","sourceRoot":"","sources":["../src/prototype-browsers.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,4BAA4B,GAAG;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAmCF;;;;;GAKG;AACH,eAAO,MAAM,mCAAmC,GAAU,OAAM;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,KAAG,OAAO,CAAC,4BAA4B,CAmB5C,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAAI,QAAQ,MAAM,KAAG,OAGhE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,GAClC,cAAc,IAAI,CAAC,4BAA4B,EAAE,aAAa,CAAC,EAC/D,gBAAe,MAAiC,KAC/C,OAAO,CAAC,IAAI,CAcd,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,GAAI,MAAM;IACnD,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC,4BAA4B,EAAE,cAAc,GAAG,gBAAgB,CAAC,CAAC;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,KAAG,MAMH,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { spawn } from 'node:child_process';
1
2
  import { createRequire } from 'node:module';
2
3
  import os from 'node:os';
3
4
  import path from 'node:path';
@@ -44,10 +45,34 @@ export const resolvePrototypeBrowserProvisioning = async (args = {}) => {
44
45
  };
45
46
  export const isMissingPrototypeBrowserOutput = (output) => (/Executable doesn't exist at/u.test(output)
46
47
  && /playwright install/u.test(output));
48
+ /**
49
+ * Installs Chromium into the managed browsers path, the same install the command
50
+ * above names. Only the References tab's capture calls it: that capture runs
51
+ * unattended (the workspace runner, or the draw command while the person
52
+ * chooses), so nobody would read the command, and a fresh home has no browser.
53
+ */
54
+ export const installPrototypeBrowser = async (provisioning, playwrightCli = installedPlaywrightCli()) => {
55
+ await new Promise((resolve, reject) => {
56
+ const child = spawn(process.execPath, [playwrightCli, 'install', 'chromium'], {
57
+ env: provisioning.environment,
58
+ stdio: ['ignore', 'ignore', 'pipe'],
59
+ });
60
+ let stderr = '';
61
+ child.stderr.setEncoding('utf8').on('data', (chunk) => { stderr = (stderr + chunk).slice(-2000); });
62
+ child.on('error', reject);
63
+ child.on('close', (code) => {
64
+ if (code === 0)
65
+ resolve();
66
+ else
67
+ reject(new Error(`Chromium install exited with ${code}: ${stderr.trim()}`));
68
+ });
69
+ });
70
+ };
47
71
  /**
48
72
  * The one statement of a missing managed browser, shared by every command that
49
- * drives Chromium (prototype stages, scene capture). The CLI never downloads a
50
- * browser on its own; it names the exact install command for this environment.
73
+ * drives Chromium (prototype stages, scene capture). Those commands never
74
+ * download a browser on their own; they name the exact install command for this
75
+ * environment (the References capture installs it, above).
51
76
  */
52
77
  export const missingPrototypeBrowserMessage = (args) => (`${args.subject} cannot start because Chromium is not installed in the managed`
53
78
  + ` 12ui browser directory at ${args.provisioning.browsersPath}.\n`
@@ -1 +1 @@
1
- {"version":3,"file":"prototype-browsers.js","sourceRoot":"","sources":["../src/prototype-browsers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prototype-browsers.js","sourceRoot":"","sources":["../src/prototype-browsers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ReviewModel } from './review-types.js';
2
+ export type ReviewFilesServer = {
3
+ port: number;
4
+ close: () => Promise<void>;
5
+ };
6
+ /** Serves `/files/<run>/<path>` for the runs `model()` currently lists, read-only, on its own loopback port. */
7
+ export declare const startReviewFilesServer: (model: () => ReviewModel) => Promise<ReviewFilesServer>;
8
+ //# sourceMappingURL=review-files-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-files-server.d.ts","sourceRoot":"","sources":["../src/review-files-server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAkFrD,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC;AAE7E,gHAAgH;AAChH,eAAO,MAAM,sBAAsB,GAAU,OAAO,MAAM,WAAW,KAAG,OAAO,CAAC,iBAAiB,CA6ChG,CAAC"}
@@ -0,0 +1,133 @@
1
+ import { createReadStream } from 'node:fs';
2
+ import { realpath, stat } from 'node:fs/promises';
3
+ import http from 'node:http';
4
+ import path from 'node:path';
5
+ import { assertReviewFileAccess } from './review-server-guard.js';
6
+ /**
7
+ * THE RUN FILES' OWN ORIGIN. `12ui review` serves a run's files (its HTML, scripts, fonts, images) from a second
8
+ * loopback port, not the review page's: a run's HTML opened from the page, or framed in it, is then a normal page at
9
+ * an origin that holds no session token and takes no request that changes anything (`assertReviewFileAccess`). It
10
+ * runs as it would anywhere (module scripts, fetches of its own files, local `@font-face`, storage), and the browser's
11
+ * same-origin policy keeps it from reading the review page, whose server refuses its requests by Origin
12
+ * (`assertReviewAccess`).
13
+ */
14
+ const CONTENT_TYPES = {
15
+ '.avif': 'image/avif',
16
+ '.css': 'text/css; charset=utf-8',
17
+ '.gif': 'image/gif',
18
+ '.htm': 'text/html; charset=utf-8',
19
+ '.html': 'text/html; charset=utf-8',
20
+ '.ico': 'image/x-icon',
21
+ '.jpeg': 'image/jpeg',
22
+ '.jpg': 'image/jpeg',
23
+ '.js': 'text/javascript; charset=utf-8',
24
+ '.json': 'application/json; charset=utf-8',
25
+ '.map': 'application/json; charset=utf-8',
26
+ '.mjs': 'text/javascript; charset=utf-8',
27
+ '.otf': 'font/otf',
28
+ '.png': 'image/png',
29
+ '.svg': 'image/svg+xml',
30
+ '.ttf': 'font/ttf',
31
+ '.txt': 'text/plain; charset=utf-8',
32
+ '.wasm': 'application/wasm',
33
+ '.webmanifest': 'application/manifest+json',
34
+ '.webp': 'image/webp',
35
+ '.woff': 'font/woff',
36
+ '.woff2': 'font/woff2',
37
+ };
38
+ const serveRunFile = async (args) => {
39
+ const segments = args.pathname.split('/').slice(2).map((segment) => decodeURIComponent(segment));
40
+ const runId = segments.shift();
41
+ const run = args.model.runs.find((candidate) => candidate.id === runId);
42
+ if (!run || segments.length === 0 || segments.some((segment) => (!segment
43
+ || segment === '.'
44
+ || segment === '..'
45
+ || segment.startsWith('.')
46
+ || segment.includes('/')
47
+ || segment.includes('\\')))) {
48
+ args.response.writeHead(404).end('not found');
49
+ return;
50
+ }
51
+ const root = await realpath(run.root).catch(() => null);
52
+ const candidate = path.resolve(run.root, ...segments);
53
+ const file = await realpath(candidate).catch(() => null);
54
+ if (!root || !file || (file !== root && !file.startsWith(`${root}${path.sep}`))) {
55
+ args.response.writeHead(403).end('forbidden');
56
+ return;
57
+ }
58
+ if (path.relative(root, file).split(path.sep).some((segment) => segment.startsWith('.'))) {
59
+ args.response.writeHead(404).end('not found');
60
+ return;
61
+ }
62
+ const details = await stat(file).catch(() => null);
63
+ if (!details?.isFile()) {
64
+ args.response.writeHead(404).end('not found');
65
+ return;
66
+ }
67
+ args.response.writeHead(200, {
68
+ 'content-type': CONTENT_TYPES[path.extname(file).toLowerCase()] ?? 'application/octet-stream',
69
+ 'content-length': details.size,
70
+ 'cache-control': 'no-store',
71
+ 'x-content-type-options': 'nosniff',
72
+ });
73
+ if (args.method === 'HEAD')
74
+ args.response.end();
75
+ else
76
+ createReadStream(file).pipe(args.response);
77
+ };
78
+ /** Serves `/files/<run>/<path>` for the runs `model()` currently lists, read-only, on its own loopback port. */
79
+ export const startReviewFilesServer = async (model) => {
80
+ let port = 0;
81
+ const server = http.createServer(async (request, response) => {
82
+ const method = request.method ?? 'GET';
83
+ try {
84
+ assertReviewFileAccess(request, { port });
85
+ }
86
+ catch (error) {
87
+ const refused = error;
88
+ response.writeHead(refused.status, { 'content-type': 'text/plain; charset=utf-8', allow: 'GET, HEAD' }).end(refused.message);
89
+ return;
90
+ }
91
+ let pathname;
92
+ try {
93
+ pathname = new URL(request.url ?? '/', 'http://127.0.0.1').pathname;
94
+ }
95
+ catch {
96
+ response.writeHead(400).end('bad request');
97
+ return;
98
+ }
99
+ if (!pathname.startsWith('/files/')) {
100
+ response.writeHead(404).end('not found');
101
+ return;
102
+ }
103
+ try {
104
+ await serveRunFile({ model: model(), pathname, method, response });
105
+ }
106
+ catch {
107
+ if (!response.headersSent)
108
+ response.writeHead(400).end('bad request');
109
+ else
110
+ response.destroy();
111
+ }
112
+ });
113
+ await new Promise((resolve, reject) => {
114
+ server.once('error', reject);
115
+ server.listen(0, '127.0.0.1', () => resolve());
116
+ });
117
+ const address = server.address();
118
+ if (!address || typeof address === 'string') {
119
+ await new Promise((resolve) => server.close(() => resolve()));
120
+ throw new Error('Review file server did not bind a local TCP port');
121
+ }
122
+ port = address.port;
123
+ return {
124
+ port,
125
+ close: () => new Promise((resolve, reject) => {
126
+ server.close((error) => { if (error)
127
+ reject(error);
128
+ else
129
+ resolve(); });
130
+ }),
131
+ };
132
+ };
133
+ //# sourceMappingURL=review-files-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-files-server.js","sourceRoot":"","sources":["../src/review-files-server.ts"],"names":[],"mappings":"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"}