@12ui/design 0.2.80 → 0.2.82

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 (324) hide show
  1. package/README.md +8 -9
  2. package/SKILL.md +2 -8
  3. package/dist/cli-capabilities.d.ts +2 -2
  4. package/dist/cli-capabilities.js +2 -2
  5. package/dist/cli-capabilities.js.map +1 -1
  6. package/dist/cli-help/design.d.ts +1 -1
  7. package/dist/cli-help/design.d.ts.map +1 -1
  8. package/dist/cli-help/design.js +0 -1
  9. package/dist/cli-help/design.js.map +1 -1
  10. package/dist/cli-help/index.d.ts +3 -3
  11. package/dist/cli-help/workflow.d.ts +2 -2
  12. package/dist/cli-help/workflow.js +4 -4
  13. package/dist/cli-help/workflow.js.map +1 -1
  14. package/dist/cli-usage.d.ts.map +1 -1
  15. package/dist/cli-usage.js +5 -4
  16. package/dist/cli-usage.js.map +1 -1
  17. package/dist/cli-workspace-draw.d.ts.map +1 -1
  18. package/dist/cli-workspace-draw.js +2 -0
  19. package/dist/cli-workspace-draw.js.map +1 -1
  20. package/dist/cli-workspace-runner.d.ts.map +1 -1
  21. package/dist/cli-workspace-runner.js +2 -1
  22. package/dist/cli-workspace-runner.js.map +1 -1
  23. package/dist/corpus-client.d.ts +3 -0
  24. package/dist/corpus-client.d.ts.map +1 -1
  25. package/dist/corpus-client.js +2 -0
  26. package/dist/corpus-client.js.map +1 -1
  27. package/dist/corpus-public-renditions.d.ts +33 -0
  28. package/dist/corpus-public-renditions.d.ts.map +1 -0
  29. package/dist/corpus-public-renditions.js +55 -0
  30. package/dist/corpus-public-renditions.js.map +1 -0
  31. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  32. package/dist/legacy-skill-catalog.js +11 -0
  33. package/dist/legacy-skill-catalog.js.map +1 -1
  34. package/dist/mcp-slate-command.d.ts +0 -2
  35. package/dist/mcp-slate-command.d.ts.map +1 -1
  36. package/dist/mcp-slate-command.js +0 -4
  37. package/dist/mcp-slate-command.js.map +1 -1
  38. package/dist/mcp-slate-resource.d.ts.map +1 -1
  39. package/dist/mcp-slate-resource.js +6 -4
  40. package/dist/mcp-slate-resource.js.map +1 -1
  41. package/dist/mcp-slate-tool-defs.d.ts.map +1 -1
  42. package/dist/mcp-slate-tool-defs.js +8 -6
  43. package/dist/mcp-slate-tool-defs.js.map +1 -1
  44. package/dist/mcp-slate-tools.d.ts.map +1 -1
  45. package/dist/mcp-slate-tools.js +8 -1
  46. package/dist/mcp-slate-tools.js.map +1 -1
  47. package/dist/mcp-slate-ui-copy.d.ts +88 -208
  48. package/dist/mcp-slate-ui-copy.d.ts.map +1 -1
  49. package/dist/mcp-slate-ui-copy.js +58 -159
  50. package/dist/mcp-slate-ui-copy.js.map +1 -1
  51. package/dist/mcp-slate-ui-locales/de-DE.d.ts.map +1 -1
  52. package/dist/mcp-slate-ui-locales/de-DE.js +44 -83
  53. package/dist/mcp-slate-ui-locales/de-DE.js.map +1 -1
  54. package/dist/mcp-slate-ui-locales/es-419.d.ts.map +1 -1
  55. package/dist/mcp-slate-ui-locales/es-419.js +44 -83
  56. package/dist/mcp-slate-ui-locales/es-419.js.map +1 -1
  57. package/dist/mcp-slate-ui-locales/es-ES.d.ts.map +1 -1
  58. package/dist/mcp-slate-ui-locales/es-ES.js +44 -83
  59. package/dist/mcp-slate-ui-locales/es-ES.js.map +1 -1
  60. package/dist/mcp-slate-ui-locales/fr-FR.d.ts.map +1 -1
  61. package/dist/mcp-slate-ui-locales/fr-FR.js +44 -83
  62. package/dist/mcp-slate-ui-locales/fr-FR.js.map +1 -1
  63. package/dist/mcp-slate-ui-locales/hi-IN.d.ts.map +1 -1
  64. package/dist/mcp-slate-ui-locales/hi-IN.js +44 -83
  65. package/dist/mcp-slate-ui-locales/hi-IN.js.map +1 -1
  66. package/dist/mcp-slate-ui-locales/it-IT.d.ts.map +1 -1
  67. package/dist/mcp-slate-ui-locales/it-IT.js +44 -83
  68. package/dist/mcp-slate-ui-locales/it-IT.js.map +1 -1
  69. package/dist/mcp-slate-ui-locales/ja-JP.d.ts.map +1 -1
  70. package/dist/mcp-slate-ui-locales/ja-JP.js +44 -83
  71. package/dist/mcp-slate-ui-locales/ja-JP.js.map +1 -1
  72. package/dist/mcp-slate-ui-locales/ko-KR.d.ts.map +1 -1
  73. package/dist/mcp-slate-ui-locales/ko-KR.js +44 -83
  74. package/dist/mcp-slate-ui-locales/ko-KR.js.map +1 -1
  75. package/dist/mcp-slate-ui-locales/pt-BR.d.ts.map +1 -1
  76. package/dist/mcp-slate-ui-locales/pt-BR.js +44 -83
  77. package/dist/mcp-slate-ui-locales/pt-BR.js.map +1 -1
  78. package/dist/mcp-slate-ui-locales/zh-CN.d.ts.map +1 -1
  79. package/dist/mcp-slate-ui-locales/zh-CN.js +44 -83
  80. package/dist/mcp-slate-ui-locales/zh-CN.js.map +1 -1
  81. package/dist/mcp-slate-ui-locales/zh-TW.d.ts.map +1 -1
  82. package/dist/mcp-slate-ui-locales/zh-TW.js +44 -83
  83. package/dist/mcp-slate-ui-locales/zh-TW.js.map +1 -1
  84. package/dist/mcp-slate-ui-script-bridge.d.ts.map +1 -1
  85. package/dist/mcp-slate-ui-script-bridge.js +19 -7
  86. package/dist/mcp-slate-ui-script-bridge.js.map +1 -1
  87. package/dist/mcp-slate-ui-script-browser.d.ts.map +1 -1
  88. package/dist/mcp-slate-ui-script-browser.js +0 -3
  89. package/dist/mcp-slate-ui-script-browser.js.map +1 -1
  90. package/dist/mcp-slate-ui-script-designs.d.ts +17 -0
  91. package/dist/mcp-slate-ui-script-designs.d.ts.map +1 -0
  92. package/dist/mcp-slate-ui-script-designs.js +365 -0
  93. package/dist/mcp-slate-ui-script-designs.js.map +1 -0
  94. package/dist/mcp-slate-ui-script-edit.d.ts +9 -0
  95. package/dist/mcp-slate-ui-script-edit.d.ts.map +1 -0
  96. package/dist/mcp-slate-ui-script-edit.js +71 -0
  97. package/dist/mcp-slate-ui-script-edit.js.map +1 -0
  98. package/dist/mcp-slate-ui-script-inline.d.ts +3 -9
  99. package/dist/mcp-slate-ui-script-inline.d.ts.map +1 -1
  100. package/dist/mcp-slate-ui-script-inline.js +28 -155
  101. package/dist/mcp-slate-ui-script-inline.js.map +1 -1
  102. package/dist/mcp-slate-ui-script-inspiration-collage.d.ts +13 -12
  103. package/dist/mcp-slate-ui-script-inspiration-collage.d.ts.map +1 -1
  104. package/dist/mcp-slate-ui-script-inspiration-collage.js +24 -24
  105. package/dist/mcp-slate-ui-script-inspiration-collage.js.map +1 -1
  106. package/dist/mcp-slate-ui-script-inspiration-gallery.d.ts +23 -0
  107. package/dist/mcp-slate-ui-script-inspiration-gallery.d.ts.map +1 -0
  108. package/dist/mcp-slate-ui-script-inspiration-gallery.js +221 -0
  109. package/dist/mcp-slate-ui-script-inspiration-gallery.js.map +1 -0
  110. package/dist/mcp-slate-ui-script-inspiration-grid.d.ts +14 -21
  111. package/dist/mcp-slate-ui-script-inspiration-grid.d.ts.map +1 -1
  112. package/dist/mcp-slate-ui-script-inspiration-grid.js +124 -196
  113. package/dist/mcp-slate-ui-script-inspiration-grid.js.map +1 -1
  114. package/dist/mcp-slate-ui-script-inspiration.d.ts +8 -9
  115. package/dist/mcp-slate-ui-script-inspiration.d.ts.map +1 -1
  116. package/dist/mcp-slate-ui-script-inspiration.js +213 -130
  117. package/dist/mcp-slate-ui-script-inspiration.js.map +1 -1
  118. package/dist/mcp-slate-ui-script-l10n.d.ts.map +1 -1
  119. package/dist/mcp-slate-ui-script-l10n.js +2 -0
  120. package/dist/mcp-slate-ui-script-l10n.js.map +1 -1
  121. package/dist/mcp-slate-ui-script-more.d.ts +4 -33
  122. package/dist/mcp-slate-ui-script-more.d.ts.map +1 -1
  123. package/dist/mcp-slate-ui-script-more.js +6 -279
  124. package/dist/mcp-slate-ui-script-more.js.map +1 -1
  125. package/dist/mcp-slate-ui-script-pause.d.ts +10 -6
  126. package/dist/mcp-slate-ui-script-pause.d.ts.map +1 -1
  127. package/dist/mcp-slate-ui-script-pause.js +45 -30
  128. package/dist/mcp-slate-ui-script-pause.js.map +1 -1
  129. package/dist/mcp-slate-ui-script-references.d.ts +19 -0
  130. package/dist/mcp-slate-ui-script-references.d.ts.map +1 -0
  131. package/dist/mcp-slate-ui-script-references.js +102 -0
  132. package/dist/mcp-slate-ui-script-references.js.map +1 -0
  133. package/dist/mcp-slate-ui-script-remote.d.ts +13 -12
  134. package/dist/mcp-slate-ui-script-remote.d.ts.map +1 -1
  135. package/dist/mcp-slate-ui-script-remote.js +46 -27
  136. package/dist/mcp-slate-ui-script-remote.js.map +1 -1
  137. package/dist/mcp-slate-ui-script-scribble.d.ts +2 -2
  138. package/dist/mcp-slate-ui-script-scribble.js +7 -7
  139. package/dist/mcp-slate-ui-script-select.d.ts +4 -9
  140. package/dist/mcp-slate-ui-script-select.d.ts.map +1 -1
  141. package/dist/mcp-slate-ui-script-select.js +13 -37
  142. package/dist/mcp-slate-ui-script-select.js.map +1 -1
  143. package/dist/mcp-slate-ui-script-stage.d.ts +4 -10
  144. package/dist/mcp-slate-ui-script-stage.d.ts.map +1 -1
  145. package/dist/mcp-slate-ui-script-stage.js +28 -141
  146. package/dist/mcp-slate-ui-script-stage.js.map +1 -1
  147. package/dist/mcp-slate-ui-script-state.d.ts +1 -1
  148. package/dist/mcp-slate-ui-script-state.d.ts.map +1 -1
  149. package/dist/mcp-slate-ui-script-state.js +9 -4
  150. package/dist/mcp-slate-ui-script-state.js.map +1 -1
  151. package/dist/mcp-slate-ui-script-viewer.d.ts +18 -0
  152. package/dist/mcp-slate-ui-script-viewer.d.ts.map +1 -0
  153. package/dist/mcp-slate-ui-script-viewer.js +405 -0
  154. package/dist/mcp-slate-ui-script-viewer.js.map +1 -0
  155. package/dist/mcp-slate-ui-script.d.ts +4 -5
  156. package/dist/mcp-slate-ui-script.d.ts.map +1 -1
  157. package/dist/mcp-slate-ui-script.js +12 -13
  158. package/dist/mcp-slate-ui-script.js.map +1 -1
  159. package/dist/mcp-slate-ui-styles-designs.d.ts +10 -0
  160. package/dist/mcp-slate-ui-styles-designs.d.ts.map +1 -0
  161. package/dist/mcp-slate-ui-styles-designs.js +121 -0
  162. package/dist/mcp-slate-ui-styles-designs.js.map +1 -0
  163. package/dist/mcp-slate-ui-styles-inspiration.d.ts +13 -13
  164. package/dist/mcp-slate-ui-styles-inspiration.d.ts.map +1 -1
  165. package/dist/mcp-slate-ui-styles-inspiration.js +67 -33
  166. package/dist/mcp-slate-ui-styles-inspiration.js.map +1 -1
  167. package/dist/mcp-slate-ui-styles-pause.d.ts +2 -2
  168. package/dist/mcp-slate-ui-styles-pause.d.ts.map +1 -1
  169. package/dist/mcp-slate-ui-styles-pause.js +4 -8
  170. package/dist/mcp-slate-ui-styles-pause.js.map +1 -1
  171. package/dist/mcp-slate-ui-styles-stage.d.ts +3 -22
  172. package/dist/mcp-slate-ui-styles-stage.d.ts.map +1 -1
  173. package/dist/mcp-slate-ui-styles-stage.js +6 -74
  174. package/dist/mcp-slate-ui-styles-stage.js.map +1 -1
  175. package/dist/mcp-slate-ui-styles.d.ts +12 -19
  176. package/dist/mcp-slate-ui-styles.d.ts.map +1 -1
  177. package/dist/mcp-slate-ui-styles.js +97 -100
  178. package/dist/mcp-slate-ui-styles.js.map +1 -1
  179. package/dist/mcp-slate-ui.d.ts +12 -12
  180. package/dist/mcp-slate-ui.d.ts.map +1 -1
  181. package/dist/mcp-slate-ui.js +24 -23
  182. package/dist/mcp-slate-ui.js.map +1 -1
  183. package/dist/mcp-workflow-tools.js +2 -2
  184. package/dist/mcp-workflow-tools.js.map +1 -1
  185. package/dist/review-files-server.d.ts +8 -0
  186. package/dist/review-files-server.d.ts.map +1 -0
  187. package/dist/review-files-server.js +133 -0
  188. package/dist/review-files-server.js.map +1 -0
  189. package/dist/review-page-assets.d.ts +1 -1
  190. package/dist/review-page-assets.d.ts.map +1 -1
  191. package/dist/review-page-assets.js +3 -1
  192. package/dist/review-page-assets.js.map +1 -1
  193. package/dist/review-page.d.ts +8 -1
  194. package/dist/review-page.d.ts.map +1 -1
  195. package/dist/review-page.js +32 -21
  196. package/dist/review-page.js.map +1 -1
  197. package/dist/review-server-guard.d.ts +33 -0
  198. package/dist/review-server-guard.d.ts.map +1 -0
  199. package/dist/review-server-guard.js +65 -0
  200. package/dist/review-server-guard.js.map +1 -0
  201. package/dist/review-server.d.ts +2 -0
  202. package/dist/review-server.d.ts.map +1 -1
  203. package/dist/review-server.js +45 -74
  204. package/dist/review-server.js.map +1 -1
  205. package/dist/server.d.ts.map +1 -1
  206. package/dist/server.js +2 -0
  207. package/dist/server.js.map +1 -1
  208. package/dist/slate-actions.d.ts +22 -1
  209. package/dist/slate-actions.d.ts.map +1 -1
  210. package/dist/slate-actions.js +46 -2
  211. package/dist/slate-actions.js.map +1 -1
  212. package/dist/slate-browser-host.d.ts +8 -7
  213. package/dist/slate-browser-host.d.ts.map +1 -1
  214. package/dist/slate-browser-host.js +13 -10
  215. package/dist/slate-browser-host.js.map +1 -1
  216. package/dist/slate-browser-server.d.ts.map +1 -1
  217. package/dist/slate-browser-server.js +10 -4
  218. package/dist/slate-browser-server.js.map +1 -1
  219. package/dist/slate-commit.d.ts.map +1 -1
  220. package/dist/slate-commit.js +12 -5
  221. package/dist/slate-commit.js.map +1 -1
  222. package/dist/slate-handoff.d.ts.map +1 -1
  223. package/dist/slate-handoff.js +2 -3
  224. package/dist/slate-handoff.js.map +1 -1
  225. package/dist/slate-ids.d.ts +2 -1
  226. package/dist/slate-ids.d.ts.map +1 -1
  227. package/dist/slate-ids.js +3 -2
  228. package/dist/slate-ids.js.map +1 -1
  229. package/dist/slate-reference-ids.d.ts.map +1 -1
  230. package/dist/slate-reference-ids.js +1 -0
  231. package/dist/slate-reference-ids.js.map +1 -1
  232. package/dist/slate-round-prompt.d.ts +19 -0
  233. package/dist/slate-round-prompt.d.ts.map +1 -1
  234. package/dist/slate-round-prompt.js +22 -0
  235. package/dist/slate-round-prompt.js.map +1 -1
  236. package/dist/slate-round-runner.d.ts.map +1 -1
  237. package/dist/slate-round-runner.js +16 -12
  238. package/dist/slate-round-runner.js.map +1 -1
  239. package/dist/slate-round-search.d.ts.map +1 -1
  240. package/dist/slate-round-search.js +2 -0
  241. package/dist/slate-round-search.js.map +1 -1
  242. package/dist/slate-runtime.d.ts +3 -0
  243. package/dist/slate-runtime.d.ts.map +1 -1
  244. package/dist/slate-runtime.js +1 -0
  245. package/dist/slate-runtime.js.map +1 -1
  246. package/dist/slate-site-references-capture.d.ts +20 -0
  247. package/dist/slate-site-references-capture.d.ts.map +1 -0
  248. package/dist/slate-site-references-capture.js +119 -0
  249. package/dist/slate-site-references-capture.js.map +1 -0
  250. package/dist/slate-site-references-client.d.ts +35 -0
  251. package/dist/slate-site-references-client.d.ts.map +1 -0
  252. package/dist/slate-site-references-client.js +36 -0
  253. package/dist/slate-site-references-client.js.map +1 -0
  254. package/dist/slate-site-references-local.d.ts +6 -0
  255. package/dist/slate-site-references-local.d.ts.map +1 -0
  256. package/dist/slate-site-references-local.js +63 -0
  257. package/dist/slate-site-references-local.js.map +1 -0
  258. package/dist/slate-site-references-suggest.d.ts +36 -0
  259. package/dist/slate-site-references-suggest.d.ts.map +1 -0
  260. package/dist/slate-site-references-suggest.js +144 -0
  261. package/dist/slate-site-references-suggest.js.map +1 -0
  262. package/dist/slate-site-references.d.ts +57 -0
  263. package/dist/slate-site-references.d.ts.map +1 -0
  264. package/dist/slate-site-references.js +129 -0
  265. package/dist/slate-site-references.js.map +1 -0
  266. package/dist/slate-view-contract.d.ts +29 -1
  267. package/dist/slate-view-contract.d.ts.map +1 -1
  268. package/dist/slate-view.d.ts.map +1 -1
  269. package/dist/slate-view.js +5 -0
  270. package/dist/slate-view.js.map +1 -1
  271. package/dist/slate-workspace-parse.d.ts +2 -0
  272. package/dist/slate-workspace-parse.d.ts.map +1 -1
  273. package/dist/slate-workspace-parse.js +20 -3
  274. package/dist/slate-workspace-parse.js.map +1 -1
  275. package/dist/slate-workspace-types.d.ts +17 -2
  276. package/dist/slate-workspace-types.d.ts.map +1 -1
  277. package/dist/workflow/adapter-12ui.js +1 -1
  278. package/dist/workflow/adapter-12ui.js.map +1 -1
  279. package/dist/workflow/adapters.d.ts.map +1 -1
  280. package/dist/workflow/adapters.js +3 -3
  281. package/dist/workflow/adapters.js.map +1 -1
  282. package/dist/workflow/providers.js +2 -2
  283. package/dist/workflow/providers.js.map +1 -1
  284. package/dist/workflow/routing.d.ts +8 -1
  285. package/dist/workflow/routing.d.ts.map +1 -1
  286. package/dist/workflow/routing.js +9 -2
  287. package/dist/workflow/routing.js.map +1 -1
  288. package/dist/workflow/types.d.ts +5 -2
  289. package/dist/workflow/types.d.ts.map +1 -1
  290. package/dist/workflow/types.js.map +1 -1
  291. package/dist/workflow-transport.d.ts.map +1 -1
  292. package/dist/workflow-transport.js +4 -2
  293. package/dist/workflow-transport.js.map +1 -1
  294. package/dist/workspace-draw-messages.d.ts +27 -5
  295. package/dist/workspace-draw-messages.d.ts.map +1 -1
  296. package/dist/workspace-draw-messages.js +29 -3
  297. package/dist/workspace-draw-messages.js.map +1 -1
  298. package/dist/workspace-draw-run.d.ts +12 -0
  299. package/dist/workspace-draw-run.d.ts.map +1 -1
  300. package/dist/workspace-draw-run.js +47 -18
  301. package/dist/workspace-draw-run.js.map +1 -1
  302. package/dist/workspace-draw-types.d.ts +2 -1
  303. package/dist/workspace-draw-types.d.ts.map +1 -1
  304. package/dist/workspace-draw-types.js +1 -0
  305. package/dist/workspace-draw-types.js.map +1 -1
  306. package/dist/workspace-runner-main.d.ts +5 -0
  307. package/dist/workspace-runner-main.d.ts.map +1 -1
  308. package/dist/workspace-runner-main.js +15 -3
  309. package/dist/workspace-runner-main.js.map +1 -1
  310. package/open-design.json +2 -13
  311. package/package.json +1 -1
  312. package/skills/12ui-design/SKILL.md +7 -8
  313. package/dist/mcp-slate-ui-script-dialog.d.ts +0 -21
  314. package/dist/mcp-slate-ui-script-dialog.d.ts.map +0 -1
  315. package/dist/mcp-slate-ui-script-dialog.js +0 -351
  316. package/dist/mcp-slate-ui-script-dialog.js.map +0 -1
  317. package/dist/mcp-slate-ui-script-progress.d.ts +0 -7
  318. package/dist/mcp-slate-ui-script-progress.d.ts.map +0 -1
  319. package/dist/mcp-slate-ui-script-progress.js +0 -9
  320. package/dist/mcp-slate-ui-script-progress.js.map +0 -1
  321. package/dist/mcp-slate-ui-styles-dialog.d.ts +0 -20
  322. package/dist/mcp-slate-ui-styles-dialog.d.ts.map +0 -1
  323. package/dist/mcp-slate-ui-styles-dialog.js +0 -87
  324. package/dist/mcp-slate-ui-styles-dialog.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-files-server.js","sourceRoot":"","sources":["../src/review-files-server.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  export declare const REVIEW_PAGE_STYLES = "\n :root{color-scheme:light;--paper:#f7f3ed;--panel:#fffdf8;--ink:#143b33;--text:#202523;--muted:#6a706c;--line:#d9d4ca;--signal:#ef6b22;--soft:#e8eee9;--shadow:0 18px 50px rgba(31,45,39,.08)}\n *{box-sizing:border-box}html{background:var(--paper);scroll-behavior:smooth}body{margin:0;color:var(--text);font:15px/1.45 Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;background:radial-gradient(circle at 8% 16%,rgba(239,107,34,.08),transparent 24rem),var(--paper)}\n button,textarea{font:inherit}button,a{touch-action:manipulation}.mast{padding:28px clamp(20px,4vw,64px);border-bottom:1px solid var(--line);background:rgba(247,243,237,.92);backdrop-filter:blur(12px);position:sticky;top:0;z-index:20;display:flex;align-items:flex-end;justify-content:space-between;gap:24px}.brand{display:flex;align-items:center;gap:14px}.brand-mark{width:42px;height:42px;border-radius:50%;background:var(--ink);color:var(--paper);display:grid;place-items:center;font:700 18px Georgia,serif}.mast h1,.run h2{font-family:Georgia,\"Times New Roman\",serif;color:var(--ink);margin:0;font-weight:500}.mast h1{font-size:clamp(28px,4vw,46px);line-height:1}.mast p{margin:6px 0 0;color:var(--muted)}.summary{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end}.summary span,.count,.mark-chip,.edit-mode{border:1px solid var(--line);border-radius:999px;padding:7px 11px;background:var(--panel);white-space:nowrap}.mark-chip{text-transform:capitalize;color:var(--ink);border-color:#9fb5a8;background:var(--soft);font-size:12px}.shell{width:min(1760px,100%);margin:0 auto;padding:36px clamp(16px,3vw,48px) 100px}.empty{max-width:680px;margin:14vh auto;padding:48px;border:1px solid var(--line);border-radius:22px;background:var(--panel);box-shadow:var(--shadow)}.empty h2{font:500 38px/1.1 Georgia,serif;color:var(--ink);margin:0 0 12px}.run{margin-bottom:64px}.run-head{display:flex;justify-content:space-between;align-items:flex-start;gap:24px;padding:0 4px 20px;border-bottom:1px solid var(--ink)}.run h2{font-size:clamp(28px,3vw,42px);line-height:1.05;max-width:1080px}.run-head p{margin:8px 0 0;color:var(--muted);overflow-wrap:anywhere}.run-purpose{max-width:920px;color:var(--text)!important}.eyebrow{margin:0 0 7px!important;color:var(--signal)!important;letter-spacing:.08em;font-size:11px;font-weight:800}.site-nav{display:flex;gap:8px;overflow:auto;padding:14px 2px 0}.site-nav a{flex:0 0 auto;color:var(--ink);text-decoration:none;border:1px solid var(--line);border-radius:999px;padding:7px 12px;background:var(--panel);font-size:12px;font-weight:750}.group{padding-top:26px}.group>h3{font:500 22px Georgia,serif;color:var(--ink);margin:0 0 14px}.items{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,360px),1fr));gap:18px}.group--pages .items,.group--conversions .items{grid-template-columns:repeat(auto-fit,minmax(min(100%,580px),1fr))}.group--branch-pages .items{display:grid;grid-template-columns:1fr;gap:28px}.item{min-width:0;border:1px solid var(--line);border-radius:18px;background:rgba(255,253,248,.92);overflow:hidden;box-shadow:0 6px 24px rgba(31,45,39,.04);scroll-margin-top:130px}.item-head{min-height:80px;padding:18px 20px 14px;display:flex;justify-content:space-between;gap:14px;align-items:flex-start}.item-head h4{font:500 21px/1.15 Georgia,serif;color:var(--ink);margin:0}.item-head p{margin:6px 0 0;color:var(--muted);font-size:13px}.item-badges{display:flex;align-items:center;gap:7px;flex-wrap:wrap;justify-content:flex-end}.edit-mode{padding:5px 9px;font-size:11px;color:var(--muted)}.preview{position:relative;display:block;width:100%;background:#e7e4dc;border-block:1px solid var(--line)}.preview--image{aspect-ratio:16/10;overflow:hidden}.preview--image img{display:block;width:100%;height:100%;object-fit:contain}.preview--html{height:520px;min-height:280px;max-height:1100px;resize:vertical;overflow:auto}.preview--html iframe{display:block;width:100%;height:100%;border:0;background:white}.open{position:absolute;right:10px;top:10px;border:1px solid rgba(20,59,51,.28);border-radius:999px;padding:7px 12px;background:rgba(255,253,248,.93);color:var(--ink);text-decoration:none;font-size:12px;font-weight:700}.preview--layerdoc{min-height:250px;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--muted);gap:8px}.preview--layerdoc strong{font:500 24px Georgia,serif;color:var(--ink)}.layerdoc-mark{font:500 38px Georgia,serif;color:var(--signal)}.published-page>p{padding:12px 16px;margin:0!important;background:#f3f0e9}.screen-sequence{padding:18px 0;border-block:1px solid var(--line);background:#f0eee8}.screen-sequence>p{padding:0 20px}.sequence-track{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(min(82vw,420px),1fr);gap:14px;overflow-x:auto;padding:0 20px 8px;scroll-snap-type:x proximity}.screen{margin:0;border:1px solid var(--line);border-radius:13px;overflow:hidden;background:var(--panel);scroll-snap-align:start}.screen .preview{border-top:0}.screen figcaption{padding:13px 15px 15px}.screen h5{font:500 17px/1.2 Georgia,serif;margin:0;color:var(--ink)}.screen figcaption p{font-size:12px;color:var(--muted);margin:7px 0 0}.comparison{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--line);border-block:1px solid var(--line)}.comparison section{background:var(--panel);min-width:0}.comparison .eyebrow{padding:10px 14px;margin:0!important}.comparison .preview{border-bottom:0}.edit-receipt{padding:10px 18px;margin:0;color:var(--muted);font-size:12px;border-bottom:1px solid var(--line)}.diff-strip{display:flex;gap:10px;overflow-x:auto;padding:12px 18px;border-bottom:1px solid var(--line);background:#fff8ef}.diff-region{flex:0 0 min(340px,82vw);border-left:3px solid var(--signal);padding:8px 10px;background:var(--panel)}.diff-region strong{display:block;color:var(--ink);font-size:12px}.diff-region span{display:block;color:var(--muted);font-size:11px;margin-top:3px}.diff-region del,.diff-region ins{display:block;font-size:12px;text-decoration:none;margin-top:5px}.diff-region del{color:#8f3a2f}.diff-region ins{color:#1f6955}.controls{display:grid;grid-template-columns:minmax(0,1fr);gap:0}.feedback,.edit{padding:18px 20px}.edit{border-top:1px solid var(--line);background:#f3f4ef}.edit--disabled p,.edit-note{margin:0;color:var(--muted)}label{display:grid;gap:7px;color:var(--ink);font-weight:700;font-size:13px}textarea{width:100%;min-height:82px;resize:vertical;border:1px solid #bbb9b1;border-radius:10px;padding:11px 12px;background:#fff;color:var(--text);outline:none}textarea:focus{border-color:var(--ink);box-shadow:0 0 0 3px rgba(20,59,51,.12)}.mark-row,.save-row{display:flex;align-items:center;gap:8px}.mark-row{margin-bottom:14px;flex-wrap:wrap}.mark-row button,.save,.apply{border:1px solid var(--ink);border-radius:999px;background:transparent;color:var(--ink);padding:8px 13px;font-weight:750;cursor:pointer}.mark-row button.active,.save,.apply{background:var(--ink);color:white}.mark-row .clear{border-color:transparent;color:var(--muted)}.save-row{margin-top:11px;min-height:36px}.save,.apply{border-radius:9px;padding:9px 18px}.apply{background:var(--signal);border-color:var(--signal)}button:disabled{cursor:wait;opacity:.55}.status{font-size:12px;color:var(--muted)}.cost{margin:10px 0 0;color:var(--muted);font-size:12px}.cost strong{color:var(--signal)}.history{border-top:1px solid var(--line);padding:12px 20px}.history summary{cursor:pointer;color:var(--ink);font-weight:750}.history ol{margin:10px 0 0;padding-left:22px}.history li{padding:5px 0;color:var(--muted);font-size:12px}.history a{color:var(--ink)}code{font:12px ui-monospace,SFMono-Regular,Menlo,monospace;background:#e9e5dc;padding:2px 5px;border-radius:4px}\n .prototype-panel{margin-top:24px;border:1px solid var(--line);border-radius:18px;background:rgba(255,253,248,.92);overflow:hidden;box-shadow:0 6px 24px rgba(31,45,39,.04)}.prototype-panel--empty,.prototype-copy{padding:20px;display:flex;align-items:flex-end;justify-content:space-between;gap:22px}.prototype-panel h3{font:500 24px Georgia,serif;color:var(--ink);margin:0}.prototype-panel p{margin:7px 0 0;color:var(--muted);max-width:880px}.prototype-action{display:flex;align-items:center;gap:10px;flex:0 0 auto}.prototype-action--disabled{font-size:12px}.prototype-panel>.preview--html{height:680px;border-bottom:0}.prototype-holdings{padding:24px;border-top:1px solid var(--line);background:#f3f0e9}.prototype-holdings>header{margin-bottom:16px}.holding-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,440px),1fr));gap:16px}.holding-card{min-width:0;background:var(--panel);border:1px solid var(--line);border-radius:15px;overflow:hidden}.holding-card .preview--html{height:360px}.holding-card .edit{border-top:0}\n @media(max-width:760px){.mast{position:static;align-items:flex-start;flex-direction:column}.summary{justify-content:flex-start}.shell{padding-top:24px}.run-head,.prototype-panel--empty,.prototype-copy{flex-direction:column;align-items:flex-start}.comparison{grid-template-columns:1fr}.preview--html{height:400px}.item-head{min-height:0}.screen{flex-basis:86vw}}\n";
2
- export declare const REVIEW_PAGE_SCRIPT = "\n const post = async (url, body) => {\n const response = await fetch(url, {method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify(body)});\n const payload = await response.json().catch(() => ({error:'The server returned no detail.'}));\n if (!response.ok) throw new Error(payload.error || 'The request failed.');\n return payload;\n };\n for (const form of document.querySelectorAll('[data-feedback]')) {\n const status = form.querySelector('.status');\n const save = async () => {\n status.textContent = 'Saving\u2026';\n try {\n await post('/api/feedback', {runId:form.dataset.run,itemId:form.dataset.item,note:form.elements.note.value,mark:form.dataset.mark || null});\n status.textContent = 'Saved';\n } catch (error) { status.textContent = error.message; }\n };\n form.addEventListener('submit', (event) => { event.preventDefault(); save(); });\n for (const button of form.querySelectorAll('[data-mark]')) button.addEventListener('click', () => {\n form.dataset.mark = button.dataset.mark;\n for (const peer of form.querySelectorAll('[data-mark]')) {\n const active = Boolean(peer.dataset.mark) && peer.dataset.mark === form.dataset.mark;\n peer.classList.toggle('active', active); peer.setAttribute('aria-pressed', String(active));\n }\n save();\n });\n }\n for (const form of document.querySelectorAll('[data-edit]')) form.addEventListener('submit', async (event) => {\n event.preventDefault();\n const button = form.querySelector('.apply'); const status = form.querySelector('.status');\n button.disabled = true; status.textContent = form.dataset.mode === 'convert-then-edit' ? 'Converting, then editing\u2026' : 'Applying\u2026';\n try {\n await post('/api/edit', {runId:form.dataset.run,itemId:form.dataset.item,prompt:form.elements.prompt.value});\n status.textContent = 'Applied'; window.location.reload();\n } catch (error) { status.textContent = error.message; button.disabled = false; }\n });\n for (const form of document.querySelectorAll('[data-prototype]')) form.addEventListener('submit', async (event) => {\n event.preventDefault();\n const button = form.querySelector('.apply'); const status = form.querySelector('.status');\n button.disabled = true; status.textContent = 'Building prototype\u2026';\n try {\n await post('/api/prototype', {runId:form.dataset.run});\n status.textContent = 'Built'; window.location.reload();\n } catch (error) { status.textContent = error.message; button.disabled = false; }\n });\n for (const form of document.querySelectorAll('[data-fill-gap]')) form.addEventListener('submit', async (event) => {\n event.preventDefault();\n const button = form.querySelector('.apply'); const status = form.querySelector('.status');\n button.disabled = true; status.textContent = 'Generating, converting, then rebuilding\u2026';\n try {\n await post('/api/prototype/fill', {runId:form.dataset.run,holding:form.dataset.holding});\n status.textContent = 'Filled'; window.location.reload();\n } catch (error) { status.textContent = error.message; button.disabled = false; }\n });\n";
2
+ export declare const REVIEW_PAGE_SCRIPT = "\n const token = document.querySelector('meta[name=\"12ui-review-token\"]').content;\n const post = async (url, body) => {\n const response = await fetch(url, {method:'POST',headers:{'content-type':'application/json','x-12ui-token':token},body:JSON.stringify(body)});\n const payload = await response.json().catch(() => ({error:'The server returned no detail.'}));\n if (!response.ok) throw new Error(payload.error || 'The request failed.');\n return payload;\n };\n for (const form of document.querySelectorAll('[data-feedback]')) {\n const status = form.querySelector('.status');\n const save = async () => {\n status.textContent = 'Saving\u2026';\n try {\n await post('/api/feedback', {runId:form.dataset.run,itemId:form.dataset.item,note:form.elements.note.value,mark:form.dataset.mark || null});\n status.textContent = 'Saved';\n } catch (error) { status.textContent = error.message; }\n };\n form.addEventListener('submit', (event) => { event.preventDefault(); save(); });\n for (const button of form.querySelectorAll('[data-mark]')) button.addEventListener('click', () => {\n form.dataset.mark = button.dataset.mark;\n for (const peer of form.querySelectorAll('[data-mark]')) {\n const active = Boolean(peer.dataset.mark) && peer.dataset.mark === form.dataset.mark;\n peer.classList.toggle('active', active); peer.setAttribute('aria-pressed', String(active));\n }\n save();\n });\n }\n for (const form of document.querySelectorAll('[data-edit]')) form.addEventListener('submit', async (event) => {\n event.preventDefault();\n const button = form.querySelector('.apply'); const status = form.querySelector('.status');\n button.disabled = true; status.textContent = form.dataset.mode === 'convert-then-edit' ? 'Converting, then editing\u2026' : 'Applying\u2026';\n try {\n await post('/api/edit', {runId:form.dataset.run,itemId:form.dataset.item,prompt:form.elements.prompt.value});\n status.textContent = 'Applied'; window.location.reload();\n } catch (error) { status.textContent = error.message; button.disabled = false; }\n });\n for (const form of document.querySelectorAll('[data-prototype]')) form.addEventListener('submit', async (event) => {\n event.preventDefault();\n const button = form.querySelector('.apply'); const status = form.querySelector('.status');\n button.disabled = true; status.textContent = 'Building prototype\u2026';\n try {\n await post('/api/prototype', {runId:form.dataset.run});\n status.textContent = 'Built'; window.location.reload();\n } catch (error) { status.textContent = error.message; button.disabled = false; }\n });\n for (const form of document.querySelectorAll('[data-fill-gap]')) form.addEventListener('submit', async (event) => {\n event.preventDefault();\n const button = form.querySelector('.apply'); const status = form.querySelector('.status');\n button.disabled = true; status.textContent = 'Generating, converting, then rebuilding\u2026';\n try {\n await post('/api/prototype/fill', {runId:form.dataset.run,holding:form.dataset.holding});\n status.textContent = 'Filled'; window.location.reload();\n } catch (error) { status.textContent = error.message; button.disabled = false; }\n });\n";
3
3
  //# sourceMappingURL=review-page-assets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"review-page-assets.d.ts","sourceRoot":"","sources":["../src/review-page-assets.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,m7RAM9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,upGAqD9B,CAAC"}
1
+ {"version":3,"file":"review-page-assets.d.ts","sourceRoot":"","sources":["../src/review-page-assets.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,kBAAkB,m7RAM9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,iwGAsD9B,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { REVIEW_TOKEN_HEADER } from './review-server-guard.js';
1
2
  export const REVIEW_PAGE_STYLES = `
2
3
  :root{color-scheme:light;--paper:#f7f3ed;--panel:#fffdf8;--ink:#143b33;--text:#202523;--muted:#6a706c;--line:#d9d4ca;--signal:#ef6b22;--soft:#e8eee9;--shadow:0 18px 50px rgba(31,45,39,.08)}
3
4
  *{box-sizing:border-box}html{background:var(--paper);scroll-behavior:smooth}body{margin:0;color:var(--text);font:15px/1.45 Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;background:radial-gradient(circle at 8% 16%,rgba(239,107,34,.08),transparent 24rem),var(--paper)}
@@ -6,8 +7,9 @@ export const REVIEW_PAGE_STYLES = `
6
7
  @media(max-width:760px){.mast{position:static;align-items:flex-start;flex-direction:column}.summary{justify-content:flex-start}.shell{padding-top:24px}.run-head,.prototype-panel--empty,.prototype-copy{flex-direction:column;align-items:flex-start}.comparison{grid-template-columns:1fr}.preview--html{height:400px}.item-head{min-height:0}.screen{flex-basis:86vw}}
7
8
  `;
8
9
  export const REVIEW_PAGE_SCRIPT = `
10
+ const token = document.querySelector('meta[name="12ui-review-token"]').content;
9
11
  const post = async (url, body) => {
10
- const response = await fetch(url, {method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify(body)});
12
+ const response = await fetch(url, {method:'POST',headers:{'content-type':'application/json','${REVIEW_TOKEN_HEADER}':token},body:JSON.stringify(body)});
11
13
  const payload = await response.json().catch(() => ({error:'The server returned no detail.'}));
12
14
  if (!response.ok) throw new Error(payload.error || 'The request failed.');
13
15
  return payload;
@@ -1 +1 @@
1
- {"version":3,"file":"review-page-assets.js","sourceRoot":"","sources":["../src/review-page-assets.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;CAMjC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDjC,CAAC"}
1
+ {"version":3,"file":"review-page-assets.js","sourceRoot":"","sources":["../src/review-page-assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;CAMjC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;mGAGiE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDrH,CAAC"}
@@ -1,3 +1,10 @@
1
1
  import type { ReviewModel } from './review-types.js';
2
- export declare const renderReviewPage: (model: ReviewModel) => string;
2
+ /**
3
+ * `token` is the serving session's secret (`review-server-guard.ts`): the page's actions send it with every POST.
4
+ * `files` is the origin the run files are served from (`review-files-server.ts`), never this page's own.
5
+ */
6
+ export declare const renderReviewPage: (model: ReviewModel, session: {
7
+ token: string;
8
+ files: string;
9
+ }) => string;
3
10
  //# sourceMappingURL=review-page.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"review-page.d.ts","sourceRoot":"","sources":["../src/review-page.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAIV,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAyQ3B,eAAO,MAAM,gBAAgB,GAAI,OAAO,WAAW,KAAG,MAoBrD,CAAC"}
1
+ {"version":3,"file":"review-page.d.ts","sourceRoot":"","sources":["../src/review-page.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAIV,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAiR3B;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,WAAW,EAAE,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,KAAG,MAoBhG,CAAC"}
@@ -25,8 +25,13 @@ const mediaAt = (file) => {
25
25
  return 'image';
26
26
  return 'layerdoc';
27
27
  };
28
+ /**
29
+ * A run's own files are served from the review's second origin (`review-files-server.ts`), which holds no session
30
+ * token and takes no POST, so a run's HTML runs normally there (module scripts, its own fetches and fonts, storage)
31
+ * and still cannot read this page or act as it. `files` is that origin, e.g. `http://127.0.0.1:52011`.
32
+ */
28
33
  const mediaFrame = (args) => {
29
- const url = reviewFileUrl(args.run, args.media.path);
34
+ const url = `${args.files}${reviewFileUrl(args.run, args.media.path)}`;
30
35
  if (args.media.kind === 'image') {
31
36
  return `<a class="preview preview--image" href="${url}" target="_blank" rel="noreferrer">
32
37
  <img src="${url}" alt="${escapeHtml(args.label)}">
@@ -34,7 +39,7 @@ const mediaFrame = (args) => {
34
39
  }
35
40
  if (args.media.kind === 'html') {
36
41
  return `<div class="preview preview--html">
37
- <iframe src="${url}" title="${escapeHtml(args.label)}" loading="lazy" sandbox="allow-scripts"></iframe>
42
+ <iframe src="${url}" title="${escapeHtml(args.label)}" loading="lazy" sandbox="allow-scripts allow-same-origin"></iframe>
38
43
  <a class="open" href="${url}" target="_blank" rel="noreferrer">Open</a>
39
44
  </div>`;
40
45
  }
@@ -60,7 +65,7 @@ const changedRegionStrip = (edit) => {
60
65
  </div>`;
61
66
  }).join('')}</div>`;
62
67
  };
63
- const comparison = (run, item) => {
68
+ const comparison = (files, run, item) => {
64
69
  if (!item.latestEdit)
65
70
  return '';
66
71
  const originalPath = path.resolve(run.root, item.latestEdit.original);
@@ -71,6 +76,7 @@ const comparison = (run, item) => {
71
76
  <section>
72
77
  <p class="eyebrow">Original</p>
73
78
  ${mediaFrame({
79
+ files,
74
80
  run,
75
81
  media: { kind: mediaAt(originalPath), path: originalPath },
76
82
  label: `${item.title}, original`,
@@ -79,6 +85,7 @@ const comparison = (run, item) => {
79
85
  <section>
80
86
  <p class="eyebrow">Edited</p>
81
87
  ${mediaFrame({
88
+ files,
82
89
  run,
83
90
  media: { kind: 'html', path: editedPath },
84
91
  label: `${item.title}, edited`,
@@ -88,13 +95,13 @@ const comparison = (run, item) => {
88
95
  ${changedRegionStrip(item.latestEdit)}
89
96
  <p class="edit-receipt">Applied “${escapeHtml(item.latestEdit.prompt)}” · ${escapeHtml(cost)} base · ${operations.length} ${operations.length === 1 ? 'edit' : 'edits'}${operations.length > 0 ? ` · ${escapeHtml(operations.join(', '))}` : ''}</p>`;
90
97
  };
91
- const branchSequence = (run, item) => {
98
+ const branchSequence = (files, run, item) => {
92
99
  if (!item.branchPage || item.branchPage.screens.length === 0)
93
100
  return '';
94
101
  return `<section class="screen-sequence">
95
102
  <p class="eyebrow">Plan sequence</p>
96
103
  <div class="sequence-track">${item.branchPage.screens.map((screen) => `<figure class="screen">
97
- ${mediaFrame({ run, media: screen.media, label: `${item.title}, ${screen.label}` })}
104
+ ${mediaFrame({ files, run, media: screen.media, label: `${item.title}, ${screen.label}` })}
98
105
  <figcaption>
99
106
  <p class="eyebrow">${screen.winner ? 'Winner' : escapeHtml(screen.label)}</p>
100
107
  <h5>${escapeHtml(screen.direction)}</h5>
@@ -151,7 +158,7 @@ const editPanel = (model, run, item) => {
151
158
  </div>
152
159
  </form>`;
153
160
  };
154
- const historyPanel = (run, item) => {
161
+ const historyPanel = (files, run, item) => {
155
162
  const history = item.editHistory ?? [];
156
163
  if (history.length === 0)
157
164
  return '';
@@ -159,11 +166,11 @@ const historyPanel = (run, item) => {
159
166
  <ol>${history.map((edit) => {
160
167
  const result = path.resolve(run.root, edit.resultPath ?? edit.html);
161
168
  const cost = edit.cost ? usd(edit.cost.baseUsd) : 'price not recorded';
162
- return `<li>“${escapeHtml(edit.prompt)}” · ${escapeHtml(cost)} · <a href="${reviewFileUrl(run, result)}" target="_blank" rel="noreferrer">Open result</a></li>`;
169
+ return `<li>“${escapeHtml(edit.prompt)}” · ${escapeHtml(cost)} · <a href="${files}${reviewFileUrl(run, result)}" target="_blank" rel="noreferrer">Open result</a></li>`;
163
170
  }).join('')}</ol>
164
171
  </details>`;
165
172
  };
166
- const itemCard = (model, run, item) => {
173
+ const itemCard = (files, model, run, item) => {
167
174
  const branch = item.group === 'branch-pages';
168
175
  const mode = item.editQuote?.mode === 'convert-then-edit' ? 'Converts first' : item.editSource ? 'Edits directly' : '';
169
176
  return `<article class="item ${branch || item.group === 'pages' || item.group === 'conversions' ? 'item--wide' : ''}" id="${escapeHtml(item.id)}">
@@ -178,14 +185,14 @@ const itemCard = (model, run, item) => {
178
185
  ${item.feedback?.mark ? `<span class="mark-chip">${escapeHtml(item.feedback.mark)}</span>` : ''}
179
186
  </div>
180
187
  </header>
181
- ${branchSequence(run, item)}
188
+ ${branchSequence(files, run, item)}
182
189
  ${branch
183
- ? `<section class="published-page"><p class="eyebrow">Exported page · drag the lower edge to resize</p>${mediaFrame({ run, media: item.media, label: item.title })}</section>${comparison(run, item)}`
184
- : item.latestEdit ? comparison(run, item) : mediaFrame({ run, media: item.media, label: item.title })}
190
+ ? `<section class="published-page"><p class="eyebrow">Exported page · drag the lower edge to resize</p>${mediaFrame({ files, run, media: item.media, label: item.title })}</section>${comparison(files, run, item)}`
191
+ : item.latestEdit ? comparison(files, run, item) : mediaFrame({ files, run, media: item.media, label: item.title })}
185
192
  <div class="controls">
186
193
  ${feedbackPanel(run, item)}
187
194
  ${editPanel(model, run, item)}
188
- ${historyPanel(run, item)}
195
+ ${historyPanel(files, run, item)}
189
196
  </div>
190
197
  </article>`;
191
198
  };
@@ -206,7 +213,7 @@ const prototypeAction = (model, run, label) => {
206
213
  <span class="status" role="status"></span>
207
214
  </form>`;
208
215
  };
209
- const prototypePanel = (model, run) => {
216
+ const prototypePanel = (files, model, run) => {
210
217
  if (!run.branch)
211
218
  return '';
212
219
  const prototype = run.branch.prototype;
@@ -220,7 +227,7 @@ const prototypePanel = (model, run) => {
220
227
  <header><p class="eyebrow">Missing destinations</p><h3>${prototype.holdings.length} ${prototype.holdings.length === 1 ? 'gap' : 'gaps'} surfaced by navigation</h3><p>Each action is explicit. It claims one matching draft, converts it with Standard, adds the real page, then rebuilds the prototype.</p></header>
221
228
  <div class="holding-grid">${prototype.holdings.map((holding) => `<article class="holding-card">
222
229
  <div class="item-head"><div><p class="eyebrow">Holding page</p><h4>${escapeHtml(holding.title)}</h4></div></div>
223
- ${mediaFrame({ run, media: { kind: 'html', path: holding.path }, label: `${holding.title} holding page` })}
230
+ ${mediaFrame({ files, run, media: { kind: 'html', path: holding.path }, label: `${holding.title} holding page` })}
224
231
  ${model.prototypeAvailable ? `<form class="edit" data-fill-gap data-run="${escapeHtml(run.id)}" data-holding="${escapeHtml(holding.slug)}">
225
232
  <p class="edit-note">Generates this destination from the approved winner, converts it, and rebuilds the prototype. Nothing runs until you press the button.</p>
226
233
  <div class="save-row"><button type="submit" class="apply">Fill this gap · ${escapeHtml(usd(REVIEW_PROTOTYPE_GAP_BASE_USD))}+</button><span class="status" role="status"></span></div>
@@ -229,11 +236,11 @@ const prototypePanel = (model, run) => {
229
236
  </section>`;
230
237
  return `<section class="prototype-panel">
231
238
  <div class="prototype-copy"><p class="eyebrow">Interactive branch</p><h3>Prototype</h3><p>Open it, resize it, and follow the real navigation. The manifest records deterministic precedence, model labels, gates, and warnings.</p>${prototypeAction(model, run, 'Rebuild prototype')}</div>
232
- ${mediaFrame({ run, media: prototype.index, label: `${run.label} prototype` })}
239
+ ${mediaFrame({ files, run, media: prototype.index, label: `${run.label} prototype` })}
233
240
  ${holdings}
234
241
  </section>`;
235
242
  };
236
- const runSection = (model, run) => {
243
+ const runSection = (files, model, run) => {
237
244
  const groups = [...new Set(run.items.map((item) => item.group))];
238
245
  return `<section class="run" id="${escapeHtml(run.id)}">
239
246
  <header class="run-head">
@@ -247,22 +254,26 @@ const runSection = (model, run) => {
247
254
  </div>
248
255
  <span class="count">${run.items.length} ${run.items.length === 1 ? 'item' : 'items'}</span>
249
256
  </header>
250
- ${prototypePanel(model, run)}
257
+ ${prototypePanel(files, model, run)}
251
258
  ${groups.map((group) => `<section class="group group--${group}">
252
259
  <h3>${groupLabels[group]}</h3>
253
- <div class="items">${run.items.filter((item) => item.group === group).map((item) => itemCard(model, run, item)).join('')}</div>
260
+ <div class="items">${run.items.filter((item) => item.group === group).map((item) => itemCard(files, model, run, item)).join('')}</div>
254
261
  </section>`).join('')}
255
262
  </section>`;
256
263
  };
257
- export const renderReviewPage = (model) => {
264
+ /**
265
+ * `token` is the serving session's secret (`review-server-guard.ts`): the page's actions send it with every POST.
266
+ * `files` is the origin the run files are served from (`review-files-server.ts`), never this page's own.
267
+ */
268
+ export const renderReviewPage = (model, session) => {
258
269
  const itemCount = model.runs.reduce((total, run) => total + run.items.length, 0);
259
270
  const marked = model.runs.reduce((total, run) => (total + run.items.filter((item) => item.feedback?.mark).length), 0);
260
271
  const body = model.runs.length > 0
261
- ? model.runs.map((run) => runSection(model, run)).join('')
272
+ ? model.runs.map((run) => runSection(session.files, model, run)).join('')
262
273
  : '<section class="empty"><h2>No stored runs found</h2><p>Pass a run directory, or use <code>12ui review --all</code> from the project that owns its <code>.12ui</code> runs.</p></section>';
263
274
  return `<!doctype html>
264
275
  <html lang="en">
265
- <head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>12ui review</title><style>${REVIEW_PAGE_STYLES}</style></head>
276
+ <head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="12ui-review-token" content="${escapeHtml(session.token)}"><title>12ui review</title><style>${REVIEW_PAGE_STYLES}</style></head>
266
277
  <body>
267
278
  <header class="mast">
268
279
  <div class="brand"><span class="brand-mark">12</span><div><h1>12ui review</h1><p>Review the design, edit what is structured, and leave exact feedback.</p></div></div>
@@ -1 +1 @@
1
- {"version":3,"file":"review-page.js","sourceRoot":"","sources":["../src/review-page.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review-page.js","sourceRoot":"","sources":["../src/review-page.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { IncomingMessage } from 'node:http';
2
+ /**
3
+ * WHO MAY CALL THE REVIEW SERVER. `12ui review` listens on loopback, and its POST routes write feedback and spend
4
+ * 12ui credits (edits, prototype labels, gap fills), so any web page the user visits could otherwise POST to it, and a
5
+ * DNS-rebound page could read its own copy of the review page (gate 0.2.80). Every request must name this server's
6
+ * own host, a request that carries an Origin must come from that host, and every POST must carry this session's
7
+ * token and be JSON (which a cross-origin page cannot send without a preflight this server never answers). The token
8
+ * is generated when the server starts and reaches only the page this server serves. The workspace server
9
+ * (`slate-browser-server.ts`) holds the same line.
10
+ */
11
+ export declare const REVIEW_TOKEN_HEADER = "x-12ui-token";
12
+ /** One session's secret: 24 random bytes, base64url, safe to place in an HTML attribute. */
13
+ export declare const newReviewToken: () => string;
14
+ export declare class ReviewAccessError extends Error {
15
+ readonly status: number;
16
+ readonly code: string;
17
+ constructor(status: number, code: string, message: string);
18
+ }
19
+ /** Refuses a request that is not this server's own page talking to it; returns nothing when it is. */
20
+ export declare const assertReviewAccess: (request: IncomingMessage, args: {
21
+ port: number;
22
+ token: string;
23
+ }) => void;
24
+ /**
25
+ * WHO MAY READ A RUN'S FILES. They are served from a second loopback origin (`review-files-server.ts`) that holds no
26
+ * token and changes nothing, so a run's own HTML runs there as a normal page and still cannot read the review page or
27
+ * act as it. Every request must name that origin's own host (a DNS-rebound name cannot read the user's files), and
28
+ * only reads are taken.
29
+ */
30
+ export declare const assertReviewFileAccess: (request: IncomingMessage, args: {
31
+ port: number;
32
+ }) => void;
33
+ //# sourceMappingURL=review-server-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-server-guard.d.ts","sourceRoot":"","sources":["../src/review-server-guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD;;;;;;;;GAQG;AAEH,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAElD,4FAA4F;AAC5F,eAAO,MAAM,cAAc,QAAO,MAA+C,CAAC;AAElF,qBAAa,iBAAkB,SAAQ,KAAK;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAArC,MAAM,EAAE,MAAM,EAAW,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAG5E;AASD,sGAAsG;AACtG,eAAO,MAAM,kBAAkB,GAAI,SAAS,eAAe,EAAE,MAAM;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,KAAG,IAiBpG,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GAAI,SAAS,eAAe,EAAE,MAAM;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,KAAG,IAQzF,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { randomBytes, timingSafeEqual } from 'node:crypto';
2
+ /**
3
+ * WHO MAY CALL THE REVIEW SERVER. `12ui review` listens on loopback, and its POST routes write feedback and spend
4
+ * 12ui credits (edits, prototype labels, gap fills), so any web page the user visits could otherwise POST to it, and a
5
+ * DNS-rebound page could read its own copy of the review page (gate 0.2.80). Every request must name this server's
6
+ * own host, a request that carries an Origin must come from that host, and every POST must carry this session's
7
+ * token and be JSON (which a cross-origin page cannot send without a preflight this server never answers). The token
8
+ * is generated when the server starts and reaches only the page this server serves. The workspace server
9
+ * (`slate-browser-server.ts`) holds the same line.
10
+ */
11
+ export const REVIEW_TOKEN_HEADER = 'x-12ui-token';
12
+ /** One session's secret: 24 random bytes, base64url, safe to place in an HTML attribute. */
13
+ export const newReviewToken = () => randomBytes(24).toString('base64url');
14
+ export class ReviewAccessError extends Error {
15
+ status;
16
+ code;
17
+ constructor(status, code, message) {
18
+ super(message);
19
+ this.status = status;
20
+ this.code = code;
21
+ }
22
+ }
23
+ const sameToken = (given, token) => {
24
+ if (given === undefined)
25
+ return false;
26
+ const a = Buffer.from(given);
27
+ const b = Buffer.from(token);
28
+ return a.length === b.length && timingSafeEqual(a, b);
29
+ };
30
+ /** Refuses a request that is not this server's own page talking to it; returns nothing when it is. */
31
+ export const assertReviewAccess = (request, args) => {
32
+ const host = request.headers.host;
33
+ if (host !== `127.0.0.1:${args.port}` && host !== `localhost:${args.port}`) {
34
+ throw new ReviewAccessError(403, 'host_refused', 'This review is only served to the address 12ui review printed.');
35
+ }
36
+ const origin = request.headers.origin;
37
+ if (origin !== undefined && origin !== `http://${host}`) {
38
+ throw new ReviewAccessError(403, 'origin_refused', 'Cross-origin requests are refused.');
39
+ }
40
+ if (request.method !== 'POST')
41
+ return;
42
+ const given = request.headers[REVIEW_TOKEN_HEADER];
43
+ if (!sameToken(typeof given === 'string' ? given : undefined, args.token)) {
44
+ throw new ReviewAccessError(401, 'token_required', 'Reload the review page that 12ui review opened: its actions carry this session\'s token.');
45
+ }
46
+ if (!/^application\/json(\s*;.*)?$/iu.test(request.headers['content-type'] ?? '')) {
47
+ throw new ReviewAccessError(415, 'json_required', 'The request must be JSON.');
48
+ }
49
+ };
50
+ /**
51
+ * WHO MAY READ A RUN'S FILES. They are served from a second loopback origin (`review-files-server.ts`) that holds no
52
+ * token and changes nothing, so a run's own HTML runs there as a normal page and still cannot read the review page or
53
+ * act as it. Every request must name that origin's own host (a DNS-rebound name cannot read the user's files), and
54
+ * only reads are taken.
55
+ */
56
+ export const assertReviewFileAccess = (request, args) => {
57
+ const host = request.headers.host;
58
+ if (host !== `127.0.0.1:${args.port}` && host !== `localhost:${args.port}`) {
59
+ throw new ReviewAccessError(403, 'host_refused', 'These run files are only served to the address the review page links.');
60
+ }
61
+ if (request.method !== 'GET' && request.method !== 'HEAD') {
62
+ throw new ReviewAccessError(405, 'read_only', 'Run files are read-only.');
63
+ }
64
+ };
65
+ //# sourceMappingURL=review-server-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-server-guard.js","sourceRoot":"","sources":["../src/review-server-guard.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,8 @@ export type ReviewPrototypeRunner = (args: {
7
7
  export type ReviewServer = {
8
8
  url: string;
9
9
  port: number;
10
+ /** The run files' own origin (`review-files-server.ts`), e.g. `http://127.0.0.1:52011`; it holds no token. */
11
+ filesUrl: string;
10
12
  /** Set when the first discovery trimmed ("showing N of M ...") or skipped unreadable runs. */
11
13
  notice?: string;
12
14
  close: () => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"review-server.d.ts","sourceRoot":"","sources":["../src/review-server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AA6E1E,MAAM,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AA+CvB,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,SAAS;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;CAC/C,KAAG,OAAO,CAAC,YAAY,CAqJvB,CAAC"}
1
+ {"version":3,"file":"review-server.d.ts","sourceRoot":"","sources":["../src/review-server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AA8D1E,MAAM,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEvB,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,8GAA8G;IAC9G,QAAQ,EAAE,MAAM,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,SAAS;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;CAC/C,KAAG,OAAO,CAAC,YAAY,CA8KvB,CAAC"}