@12ui/design 0.2.74 → 0.2.76

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 (180) hide show
  1. package/README.md +126 -116
  2. package/SKILL.md +33 -28
  3. package/dist/cli-arguments.d.ts.map +1 -1
  4. package/dist/cli-arguments.js +21 -7
  5. package/dist/cli-arguments.js.map +1 -1
  6. package/dist/cli-capabilities.d.ts +3 -2
  7. package/dist/cli-capabilities.d.ts.map +1 -1
  8. package/dist/cli-capabilities.js +2 -1
  9. package/dist/cli-capabilities.js.map +1 -1
  10. package/dist/cli-codex-readiness.d.ts +19 -6
  11. package/dist/cli-codex-readiness.d.ts.map +1 -1
  12. package/dist/cli-codex-readiness.js +36 -16
  13. package/dist/cli-codex-readiness.js.map +1 -1
  14. package/dist/cli-help/design.d.ts +9 -2
  15. package/dist/cli-help/design.d.ts.map +1 -1
  16. package/dist/cli-help/design.js +17 -2
  17. package/dist/cli-help/design.js.map +1 -1
  18. package/dist/cli-help/index.d.ts +26 -9
  19. package/dist/cli-help/index.d.ts.map +1 -1
  20. package/dist/cli-help/scene.d.ts +15 -5
  21. package/dist/cli-help/scene.d.ts.map +1 -1
  22. package/dist/cli-help/scene.js +44 -0
  23. package/dist/cli-help/scene.js.map +1 -1
  24. package/dist/cli-help/workflow.d.ts +2 -2
  25. package/dist/cli-help/workflow.d.ts.map +1 -1
  26. package/dist/cli-help/workflow.js +4 -3
  27. package/dist/cli-help/workflow.js.map +1 -1
  28. package/dist/cli-run.d.ts.map +1 -1
  29. package/dist/cli-run.js +6 -0
  30. package/dist/cli-run.js.map +1 -1
  31. package/dist/cli-scene-command.d.ts.map +1 -1
  32. package/dist/cli-scene-command.js +39 -6
  33. package/dist/cli-scene-command.js.map +1 -1
  34. package/dist/cli-usage.d.ts.map +1 -1
  35. package/dist/cli-usage.js +9 -6
  36. package/dist/cli-usage.js.map +1 -1
  37. package/dist/cli-workspace-command.js +1 -1
  38. package/dist/cli-workspace-command.js.map +1 -1
  39. package/dist/cli-workspace-draw.d.ts +23 -0
  40. package/dist/cli-workspace-draw.d.ts.map +1 -0
  41. package/dist/cli-workspace-draw.js +97 -0
  42. package/dist/cli-workspace-draw.js.map +1 -0
  43. package/dist/codex-binary.d.ts +20 -0
  44. package/dist/codex-binary.d.ts.map +1 -0
  45. package/dist/codex-binary.js +46 -0
  46. package/dist/codex-binary.js.map +1 -0
  47. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  48. package/dist/legacy-skill-catalog.js +26 -2
  49. package/dist/legacy-skill-catalog.js.map +1 -1
  50. package/dist/mcp-slate-command.d.ts +9 -0
  51. package/dist/mcp-slate-command.d.ts.map +1 -1
  52. package/dist/mcp-slate-command.js +19 -5
  53. package/dist/mcp-slate-command.js.map +1 -1
  54. package/dist/mcp-workflow-tools.js +3 -3
  55. package/dist/mcp-workflow-tools.js.map +1 -1
  56. package/dist/scene/camera-diagnostics.d.ts +61 -0
  57. package/dist/scene/camera-diagnostics.d.ts.map +1 -0
  58. package/dist/scene/camera-diagnostics.js +166 -0
  59. package/dist/scene/camera-diagnostics.js.map +1 -0
  60. package/dist/scene/camera-solve.d.ts +2 -0
  61. package/dist/scene/camera-solve.d.ts.map +1 -1
  62. package/dist/scene/camera-solve.js +59 -42
  63. package/dist/scene/camera-solve.js.map +1 -1
  64. package/dist/scene/capture.d.ts +24 -0
  65. package/dist/scene/capture.d.ts.map +1 -1
  66. package/dist/scene/capture.js +53 -2
  67. package/dist/scene/capture.js.map +1 -1
  68. package/dist/scene/convert-run.d.ts +30 -0
  69. package/dist/scene/convert-run.d.ts.map +1 -0
  70. package/dist/scene/convert-run.js +135 -0
  71. package/dist/scene/convert-run.js.map +1 -0
  72. package/dist/scene/media-query.d.ts +21 -0
  73. package/dist/scene/media-query.d.ts.map +1 -0
  74. package/dist/scene/media-query.js +208 -0
  75. package/dist/scene/media-query.js.map +1 -0
  76. package/dist/scene/page-css.d.ts +38 -0
  77. package/dist/scene/page-css.d.ts.map +1 -0
  78. package/dist/scene/page-css.js +210 -0
  79. package/dist/scene/page-css.js.map +1 -0
  80. package/dist/scene/page-images.d.ts +33 -0
  81. package/dist/scene/page-images.d.ts.map +1 -0
  82. package/dist/scene/page-images.js +53 -0
  83. package/dist/scene/page-images.js.map +1 -0
  84. package/dist/scene/page-merge.d.ts +41 -0
  85. package/dist/scene/page-merge.d.ts.map +1 -0
  86. package/dist/scene/page-merge.js +197 -0
  87. package/dist/scene/page-merge.js.map +1 -0
  88. package/dist/scene/responsive-bands.d.ts +19 -0
  89. package/dist/scene/responsive-bands.d.ts.map +1 -0
  90. package/dist/scene/responsive-bands.js +25 -0
  91. package/dist/scene/responsive-bands.js.map +1 -0
  92. package/dist/scene/scene-index.d.ts +10 -0
  93. package/dist/scene/scene-index.d.ts.map +1 -0
  94. package/dist/scene/scene-index.js +43 -0
  95. package/dist/scene/scene-index.js.map +1 -0
  96. package/dist/scene/scene-merge.d.ts +29 -0
  97. package/dist/scene/scene-merge.d.ts.map +1 -0
  98. package/dist/scene/scene-merge.js +130 -0
  99. package/dist/scene/scene-merge.js.map +1 -0
  100. package/dist/scene/scene-verbs.d.ts +1 -1
  101. package/dist/scene/scene-verbs.d.ts.map +1 -1
  102. package/dist/scene/scene-verbs.js +1 -1
  103. package/dist/scene/scene-verbs.js.map +1 -1
  104. package/dist/scene/serve-detach.d.ts +23 -0
  105. package/dist/scene/serve-detach.d.ts.map +1 -0
  106. package/dist/scene/serve-detach.js +92 -0
  107. package/dist/scene/serve-detach.js.map +1 -0
  108. package/dist/scene/static-server.d.ts +2 -0
  109. package/dist/scene/static-server.d.ts.map +1 -1
  110. package/dist/scene/static-server.js +3 -0
  111. package/dist/scene/static-server.js.map +1 -1
  112. package/dist/scene/symmetric-eigen.d.ts +12 -0
  113. package/dist/scene/symmetric-eigen.d.ts.map +1 -0
  114. package/dist/scene/symmetric-eigen.js +43 -0
  115. package/dist/scene/symmetric-eigen.js.map +1 -0
  116. package/dist/slate-image-executor.js +1 -1
  117. package/dist/slate-image-executor.js.map +1 -1
  118. package/dist/slate-local-image.d.ts +3 -6
  119. package/dist/slate-local-image.d.ts.map +1 -1
  120. package/dist/slate-local-image.js +2 -18
  121. package/dist/slate-local-image.js.map +1 -1
  122. package/dist/workflow/adapter-12ui.d.ts.map +1 -1
  123. package/dist/workflow/adapter-12ui.js +3 -5
  124. package/dist/workflow/adapter-12ui.js.map +1 -1
  125. package/dist/workflow/providers.d.ts.map +1 -1
  126. package/dist/workflow/providers.js +5 -2
  127. package/dist/workflow/providers.js.map +1 -1
  128. package/dist/workflow/recipes.d.ts +1 -2
  129. package/dist/workflow/recipes.d.ts.map +1 -1
  130. package/dist/workflow/recipes.js +6 -18
  131. package/dist/workflow/recipes.js.map +1 -1
  132. package/dist/workflow/routing.d.ts.map +1 -1
  133. package/dist/workflow/routing.js +3 -1
  134. package/dist/workflow/routing.js.map +1 -1
  135. package/dist/workflow/types.d.ts +7 -0
  136. package/dist/workflow/types.d.ts.map +1 -1
  137. package/dist/workflow/types.js +7 -0
  138. package/dist/workflow/types.js.map +1 -1
  139. package/dist/workspace-draw-client.d.ts +69 -0
  140. package/dist/workspace-draw-client.d.ts.map +1 -0
  141. package/dist/workspace-draw-client.js +193 -0
  142. package/dist/workspace-draw-client.js.map +1 -0
  143. package/dist/workspace-draw-codex.d.ts +49 -0
  144. package/dist/workspace-draw-codex.d.ts.map +1 -0
  145. package/dist/workspace-draw-codex.js +89 -0
  146. package/dist/workspace-draw-codex.js.map +1 -0
  147. package/dist/workspace-draw-engine.d.ts +39 -0
  148. package/dist/workspace-draw-engine.d.ts.map +1 -0
  149. package/dist/workspace-draw-engine.js +72 -0
  150. package/dist/workspace-draw-engine.js.map +1 -0
  151. package/dist/workspace-draw-messages.d.ts +45 -0
  152. package/dist/workspace-draw-messages.d.ts.map +1 -0
  153. package/dist/workspace-draw-messages.js +47 -0
  154. package/dist/workspace-draw-messages.js.map +1 -0
  155. package/dist/workspace-draw-run.d.ts +43 -0
  156. package/dist/workspace-draw-run.d.ts.map +1 -0
  157. package/dist/workspace-draw-run.js +328 -0
  158. package/dist/workspace-draw-run.js.map +1 -0
  159. package/dist/workspace-draw-store.d.ts +23 -0
  160. package/dist/workspace-draw-store.d.ts.map +1 -0
  161. package/dist/workspace-draw-store.js +65 -0
  162. package/dist/workspace-draw-store.js.map +1 -0
  163. package/dist/workspace-draw-types.d.ts +121 -0
  164. package/dist/workspace-draw-types.d.ts.map +1 -0
  165. package/dist/workspace-draw-types.js +21 -0
  166. package/dist/workspace-draw-types.js.map +1 -0
  167. package/open-design.json +2 -2
  168. package/package.json +2 -2
  169. package/runtime/codex-conversion/src/codex/home.mjs +43 -14
  170. package/runtime/codex-conversion/src/images/native-files.mjs +20 -0
  171. package/runtime/codex-conversion/src/images/native-invoke.mjs +5 -2
  172. package/runtime/codex-conversion/src/images/native-records.mjs +75 -3
  173. package/runtime/codex-conversion/src/images/native.mjs +7 -4
  174. package/skills/12ui-design/SKILL.md +79 -19
  175. package/skills/12ui-design/agents/openai.yaml +2 -0
  176. package/skills/12ui-design/improve.md +1 -5
  177. package/skills/12ui-design/inspire.md +5 -8
  178. package/skills/12ui-design/outputs.md +2 -23
  179. package/skills/12ui-design/scene.md +27 -156
  180. package/skills/12ui-design/session.md +0 -161
@@ -1 +1 @@
1
- {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/workflow/routing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAuG,MAAM,YAAY,CAAC;AAEzK,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,UAAsB,EAAE,SAA+B,EAAE,SAAwB,EAAE;IAChH,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,oBAAoB,EAAE,iCAAiC,CAAC,CAAC;IACzH,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;IACjG,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,EAAE,+BAA+B,CAAC,CAAC;IAC5H,MAAM,UAAU,GAAkC,EAAE,CAAC;IACrD,KAAK,MAAM,EAAE,IAAI,IAAI,GAAG,CAAa,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,IAAI,MAA0B,CAAC;QAC/B,IAAI,CAAC,QAAQ;YAAE,MAAM,GAAG,6BAA6B,CAAC;aACjD,IAAI,CAAC,QAAQ,CAAC,SAAS;YAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;aAClD,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,MAAM,GAAG,6BAA6B,UAAU,EAAE,CAAC;aACpG,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;YAAE,MAAM,GAAG,8CAA8C,CAAC;QACxI,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,SAAS,EAAE,MAAM,EAAE,MAAM,IAAI,mDAAmD,EAAE,CAAC,CAAC;QACzI,IAAI,QAAQ,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;IAClJ,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtF,MAAM,IAAI,aAAa,CAAC,sBAAsB,EAAE,4BAA4B,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7H,CAAC"}
1
+ {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/workflow/routing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,SAAS,EAAE,aAAa,EAAuG,MAAM,YAAY,CAAC;AAEjM,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,UAAsB,EAAE,SAA+B,EAAE,SAAwB,EAAE;IAChH,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,oBAAoB,EAAE,iCAAiC,CAAC,CAAC;IACzH,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;IACjG,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,EAAE,+BAA+B,CAAC,CAAC;IAC5H,MAAM,UAAU,GAAkC,EAAE,CAAC;IACrD,KAAK,MAAM,EAAE,IAAI,IAAI,GAAG,CAAa,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,IAAI,MAA0B,CAAC;QAC/B,IAAI,CAAC,QAAQ;YAAE,MAAM,GAAG,6BAA6B,CAAC;aACjD,IAAI,CAAC,QAAQ,CAAC,SAAS;YAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;aAClD,IAAI,EAAE,KAAK,SAAS,IAAI,sBAAsB,CAAC,UAAU,CAAC;YAAE,MAAM,GAAG,sEAAsE,CAAC;aAC5I,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,MAAM,GAAG,6BAA6B,UAAU,EAAE,CAAC;aACpG,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;YAAE,MAAM,GAAG,8CAA8C,CAAC;QACxI,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,SAAS,EAAE,MAAM,EAAE,MAAM,IAAI,mDAAmD,EAAE,CAAC,CAAC;QACzI,IAAI,QAAQ,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;IAClJ,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtF,MAAM,IAAI,aAAa,CAAC,sBAAsB,EAAE,4BAA4B,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7H,CAAC"}
@@ -4,6 +4,13 @@ export declare const PROVIDERS: readonly ["session", "codex", "claude", "openai"
4
4
  export type ProviderId = typeof PROVIDERS[number];
5
5
  export declare const CAPABILITIES: readonly ["text", "image", "image-edit", "code", "convert"];
6
6
  export type Capability = typeof CAPABILITIES[number];
7
+ /**
8
+ * Image generation, image edits and conversion run only through the 12ui CLI's own providers, never the agent's own
9
+ * thread (owner rule, 2026-10-01), so a host session can declare only text or code.
10
+ */
11
+ export declare const GENERATION_CAPABILITIES: readonly ["image", "image-edit", "convert"];
12
+ export declare const SESSION_CAPABILITIES: readonly ["text", "code"];
13
+ export declare const isGenerationCapability: (capability: Capability) => boolean;
7
14
  export type Funding = 'user-plan' | 'openai-key' | '12ui-credits';
8
15
  export type ProviderCapability = {
9
16
  id: ProviderId;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/workflow/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/workflow/types.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,eAAO,MAAM,eAAe,EAAG,iBAA0B,CAAC;AAC1D,eAAO,MAAM,SAAS,2DAA4D,CAAC;AACnF,MAAM,MAAM,UAAU,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;AAClD,eAAO,MAAM,YAAY,6DAA8D,CAAC;AACxF,MAAM,MAAM,UAAU,GAAG,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AACrD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,6CAA8E,CAAC;AACnH,eAAO,MAAM,oBAAoB,2BAA4D,CAAC;AAC9F,eAAO,MAAM,sBAAsB,GAAI,YAAY,UAAU,KAAG,OAAkF,CAAC;AACnJ,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,cAAc,CAAC;AAElE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,UAAU,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,oFAAoF;IACpF,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,uFAAuF;IACvF,SAAS,CAAC,EAAE,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;IACrC,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,UAAU,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC3C,UAAU,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChF,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAC1F,0FAA0F;IAC1F,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wFAAwF;IACxF,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,WAAW,EAAE,gBAAgB,GAAG,oBAAoB,GAAG,eAAe,GAAG,WAAW,CAAC;CACtF,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,eAAe,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,OAAO,eAAe,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,eAAe,CAAC;IACzB,KAAK,EAAE,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IACxE,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IACjH,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,qBAAa,aAAc,SAAQ,KAAK;IACnB,IAAI,EAAE,MAAM;IAA0B,WAAW,EAAE,gBAAgB,CAAC,aAAa,CAAC;gBAAlF,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAS,WAAW,GAAE,gBAAgB,CAAC,aAAa,CAAoB;CAIzH"}
@@ -2,6 +2,13 @@
2
2
  export const WORKFLOW_SCHEMA = '12ui.workflow/1';
3
3
  export const PROVIDERS = ['session', 'codex', 'claude', 'openai', '12ui'];
4
4
  export const CAPABILITIES = ['text', 'image', 'image-edit', 'code', 'convert'];
5
+ /**
6
+ * Image generation, image edits and conversion run only through the 12ui CLI's own providers, never the agent's own
7
+ * thread (owner rule, 2026-10-01), so a host session can declare only text or code.
8
+ */
9
+ export const GENERATION_CAPABILITIES = ['image', 'image-edit', 'convert'];
10
+ export const SESSION_CAPABILITIES = ['text', 'code'];
11
+ export const isGenerationCapability = (capability) => GENERATION_CAPABILITIES.includes(capability);
5
12
  export class WorkflowError extends Error {
6
13
  code;
7
14
  disposition;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/workflow/types.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,MAAM,CAAC,MAAM,eAAe,GAAG,iBAA0B,CAAC;AAC1D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AAEnF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AAwGxF,MAAM,OAAO,aAAc,SAAQ,KAAK;IACnB;IAAsC;IAAzD,YAAmB,IAAY,EAAE,OAAe,EAAS,cAA+C,gBAAgB;QACtH,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,SAAI,GAAJ,IAAI,CAAQ;QAA0B,gBAAW,GAAX,WAAW,CAAoD;QAEtH,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/workflow/types.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,MAAM,CAAC,MAAM,eAAe,GAAG,iBAA0B,CAAC;AAC1D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AAEnF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AAExF;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,CAA0C,CAAC;AACnH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,MAAM,CAA0C,CAAC;AAC9F,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,UAAsB,EAAW,EAAE,CAAE,uBAAiD,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAuGnJ,MAAM,OAAO,aAAc,SAAQ,KAAK;IACnB;IAAsC;IAAzD,YAAmB,IAAY,EAAE,OAAe,EAAS,cAA+C,gBAAgB;QACtH,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,SAAI,GAAJ,IAAI,CAAQ;QAA0B,gBAAW,GAAX,WAAW,CAAoD;QAEtH,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,69 @@
1
+ import { type PlanImageName, type SlateDrawPlan } from './workspace-draw-types.js';
2
+ /**
3
+ * The CLI's side of interface I1: the three `/api/v1/slate/` routes `12ui workspace draw` calls on
4
+ * design.12ui.com, authenticated by the push token alone. Every route is idempotent, so a `429` (and a retryable
5
+ * `503`) is retried after the seconds the server gives, up to three times per request.
6
+ */
7
+ export declare const PUSH_HEADER = "X-12ui-Push";
8
+ export declare const CLI_HEADER = "X-12ui-Cli";
9
+ export declare const MAX_RETRIES = 3;
10
+ /** How long a plan may stay `plan_pending` (its direction call in flight) before the run gives up on it. */
11
+ export declare const PLAN_PENDING_LIMIT_MS = 180000;
12
+ /** The server answered with an error (`{ok:false,error:{code,...}}`, or the flat `{error:"code"}` form). */
13
+ export declare class DrawHttpError extends Error {
14
+ readonly status: number;
15
+ readonly code: string;
16
+ readonly retryAfterSeconds: number | null;
17
+ readonly body: unknown;
18
+ constructor(status: number, code: string, retryAfterSeconds: number | null, body: unknown);
19
+ }
20
+ /**
21
+ * The server could not be reached (`unreachable`), bytes arrived other than declared (`corrupt`), or its answer was
22
+ * not what I1 says (`malformed`: a server this CLI is too old to read).
23
+ */
24
+ export declare class DrawTransportError extends Error {
25
+ readonly kind: 'unreachable' | 'corrupt' | 'malformed';
26
+ constructor(kind: 'unreachable' | 'corrupt' | 'malformed', message: string, options?: {
27
+ cause?: unknown;
28
+ });
29
+ }
30
+ export type DrawFetch = (url: string, init: RequestInit) => Promise<Response>;
31
+ export type PlanImage = {
32
+ bytes: Buffer;
33
+ mimeType: string;
34
+ sha256: string;
35
+ referenceId: string | null;
36
+ };
37
+ export type PushOutcome = {
38
+ state: 'filled' | 'failed';
39
+ label: string | null;
40
+ versionId: string | null;
41
+ replayed: boolean;
42
+ opState: string | null;
43
+ };
44
+ /** The error code in either error shape the server uses. */
45
+ export declare const errorCodeOf: (body: unknown) => string | null;
46
+ /** Check the plan against I1 before anything is drawn from it; a plan this CLI cannot read is never guessed at. */
47
+ export declare const validatePlan: (value: unknown, opId: string) => SlateDrawPlan;
48
+ export declare const createDrawClient: (args: {
49
+ origin: string;
50
+ token: string;
51
+ opId: string;
52
+ cliVersion: string;
53
+ fetch?: DrawFetch;
54
+ sleep?: (milliseconds: number) => Promise<void>;
55
+ now?: () => number;
56
+ }) => {
57
+ /** The frozen plan (2.1), waiting out `plan_pending` while the round's direction call finishes. */
58
+ plan: () => Promise<SlateDrawPlan>;
59
+ /** The exact bytes every engine attaches (2.2), checked against the server's sha256. */
60
+ image: (name: PlanImageName) => Promise<PlanImage>;
61
+ /** One option's image or failure reason (2.3). */
62
+ push: (key: string, part: {
63
+ png: Buffer;
64
+ } | {
65
+ reason: string;
66
+ }) => Promise<PushOutcome>;
67
+ };
68
+ export type DrawClient = ReturnType<typeof createDrawClient>;
69
+ //# sourceMappingURL=workspace-draw-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-draw-client.d.ts","sourceRoot":"","sources":["../src/workspace-draw-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAEhG;;;;GAIG;AAEH,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,eAAO,MAAM,UAAU,eAAe,CAAC;AACvC,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,4GAA4G;AAC5G,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAE7C,4GAA4G;AAC5G,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;gBACX,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO;CAO1F;AAED;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,GAAG,WAAW,CAAC;gBAC3C,IAAI,EAAE,aAAa,GAAG,SAAS,GAAG,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAI1G;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE9E,MAAM,MAAM,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAExG,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAOF,4DAA4D;AAC5D,eAAO,MAAM,WAAW,GAAI,MAAM,OAAO,KAAG,MAAM,GAAG,IAKpD,CAAC;AAkBF,mHAAmH;AACnH,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,EAAE,MAAM,MAAM,KAAG,aA0B3D,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,MAAM;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;IAmCG,mGAAmG;gBACnF,OAAO,CAAC,aAAa,CAAC;IAYtC,wFAAwF;kBACpE,aAAa,KAAG,OAAO,CAAC,SAAS,CAAC;IActD,kDAAkD;gBAChC,MAAM,QAAQ;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,KAAG,OAAO,CAAC,WAAW,CAAC;CAgB9F,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,193 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { PLAN_SCHEMA } from './workspace-draw-types.js';
3
+ /**
4
+ * The CLI's side of interface I1: the three `/api/v1/slate/` routes `12ui workspace draw` calls on
5
+ * design.12ui.com, authenticated by the push token alone. Every route is idempotent, so a `429` (and a retryable
6
+ * `503`) is retried after the seconds the server gives, up to three times per request.
7
+ */
8
+ export const PUSH_HEADER = 'X-12ui-Push';
9
+ export const CLI_HEADER = 'X-12ui-Cli';
10
+ export const MAX_RETRIES = 3;
11
+ /** How long a plan may stay `plan_pending` (its direction call in flight) before the run gives up on it. */
12
+ export const PLAN_PENDING_LIMIT_MS = 180_000;
13
+ /** The server answered with an error (`{ok:false,error:{code,...}}`, or the flat `{error:"code"}` form). */
14
+ export class DrawHttpError extends Error {
15
+ status;
16
+ code;
17
+ retryAfterSeconds;
18
+ body;
19
+ constructor(status, code, retryAfterSeconds, body) {
20
+ super(`design.12ui.com answered ${status} ${code}`);
21
+ this.status = status;
22
+ this.code = code;
23
+ this.retryAfterSeconds = retryAfterSeconds;
24
+ this.body = body;
25
+ }
26
+ }
27
+ /**
28
+ * The server could not be reached (`unreachable`), bytes arrived other than declared (`corrupt`), or its answer was
29
+ * not what I1 says (`malformed`: a server this CLI is too old to read).
30
+ */
31
+ export class DrawTransportError extends Error {
32
+ kind;
33
+ constructor(kind, message, options) {
34
+ super(message, options);
35
+ this.kind = kind;
36
+ }
37
+ }
38
+ const sha256 = (bytes) => createHash('sha256').update(bytes).digest('hex');
39
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
40
+ const stringOrNull = (value) => (typeof value === 'string' ? value : null);
41
+ /** The error code in either error shape the server uses. */
42
+ export const errorCodeOf = (body) => {
43
+ if (!isRecord(body))
44
+ return null;
45
+ if (typeof body.error === 'string')
46
+ return body.error;
47
+ if (isRecord(body.error) && typeof body.error.code === 'string')
48
+ return body.error.code;
49
+ return null;
50
+ };
51
+ const retryAfterOf = (response, body) => {
52
+ const fromBody = isRecord(body) ? (body.retryAfterSeconds ?? (isRecord(body.error) ? body.error.retryAfterSeconds : undefined)) : undefined;
53
+ if (typeof fromBody === 'number' && Number.isFinite(fromBody) && fromBody >= 0)
54
+ return fromBody;
55
+ const header = Number(response.headers.get('retry-after'));
56
+ return Number.isFinite(header) && header >= 0 && response.headers.get('retry-after') !== null ? header : null;
57
+ };
58
+ const readBody = async (response) => {
59
+ const text = await response.text();
60
+ try {
61
+ return JSON.parse(text);
62
+ }
63
+ catch {
64
+ return text;
65
+ }
66
+ };
67
+ /** Check the plan against I1 before anything is drawn from it; a plan this CLI cannot read is never guessed at. */
68
+ export const validatePlan = (value, opId) => {
69
+ const fail = (what) => { throw new DrawTransportError('malformed', `The plan for ${opId} is not one this command can read: ${what}.`); };
70
+ if (!isRecord(value))
71
+ return fail('not an object');
72
+ if (value.schema !== PLAN_SCHEMA)
73
+ return fail(`schema ${JSON.stringify(value.schema)}`);
74
+ if (value.opId !== opId)
75
+ return fail('it names another request');
76
+ if (!Array.isArray(value.options))
77
+ return fail('no options');
78
+ for (const field of ['workspace', 'kind', 'mode', 'promptRevision', 'planDigest', 'state']) {
79
+ if (typeof value[field] !== 'string')
80
+ fail(`no ${field}`);
81
+ }
82
+ const keys = new Set();
83
+ for (const option of value.options) {
84
+ if (!isRecord(option))
85
+ return fail('an option is not an object');
86
+ const key = option.key;
87
+ if (typeof key !== 'string' || key === '' || keys.has(key))
88
+ return fail('an option key is missing or repeated');
89
+ keys.add(key);
90
+ if (typeof option.callId !== 'string' || typeof option.prompt !== 'string' || typeof option.promptSha256 !== 'string')
91
+ fail(`option ${key} has no call id or prompt`);
92
+ if (sha256(option.prompt) !== option.promptSha256)
93
+ fail(`option ${key}'s prompt does not match its sha256`);
94
+ if (!['pending', 'filled', 'failed'].includes(option.state))
95
+ fail(`option ${key} has state ${JSON.stringify(option.state)}`);
96
+ const frame = option.frame;
97
+ if (!isRecord(frame) || !Number.isSafeInteger(frame.width) || !Number.isSafeInteger(frame.height) || frame.width < 1 || frame.height < 1)
98
+ fail(`option ${key} has no frame`);
99
+ if (!Array.isArray(option.images))
100
+ return fail(`option ${key} has no image list`);
101
+ for (const image of option.images) {
102
+ if (!isRecord(image) || typeof image.name !== 'string' || !/^(parent|annotated|ref-[1-9]\d*)$/u.test(image.name))
103
+ fail(`option ${key} names an unknown image`);
104
+ }
105
+ }
106
+ return value;
107
+ };
108
+ export const createDrawClient = (args) => {
109
+ const fetcher = args.fetch ?? ((url, init) => fetch(url, init));
110
+ const sleep = args.sleep ?? ((milliseconds) => new Promise((resolve) => { setTimeout(resolve, milliseconds); }));
111
+ const now = args.now ?? Date.now;
112
+ const opPath = `${args.origin}/api/v1/slate/ops/${encodeURIComponent(args.opId)}`;
113
+ /** One request, with the 429/503 retry policy; resolves only on a 2xx. */
114
+ const request = async (url, init = {}) => {
115
+ for (let attempt = 0;; attempt += 1) {
116
+ let response;
117
+ try {
118
+ response = await fetcher(url, { ...init, headers: { [PUSH_HEADER]: args.token, [CLI_HEADER]: args.cliVersion, ...init.headers } });
119
+ }
120
+ catch (cause) {
121
+ throw new DrawTransportError('unreachable', `${new URL(url).host} could not be reached`, { cause });
122
+ }
123
+ if (response.ok)
124
+ return response;
125
+ const body = await readBody(response);
126
+ const code = errorCodeOf(body) ?? `http_${response.status}`;
127
+ const retryAfter = retryAfterOf(response, body);
128
+ const retryable = response.status === 429 || (response.status === 503 && code === 'service_unavailable');
129
+ if (retryable && attempt < MAX_RETRIES) {
130
+ await sleep((retryAfter ?? 5) * 1000);
131
+ continue;
132
+ }
133
+ throw new DrawHttpError(response.status, code, retryAfter, body);
134
+ }
135
+ };
136
+ const json = async (response) => {
137
+ const body = await readBody(response);
138
+ if (!isRecord(body))
139
+ throw new DrawTransportError('malformed', `${new URL(response.url || args.origin).pathname} did not answer JSON`);
140
+ return body;
141
+ };
142
+ return {
143
+ /** The frozen plan (2.1), waiting out `plan_pending` while the round's direction call finishes. */
144
+ plan: async () => {
145
+ const started = now();
146
+ for (;;) {
147
+ try {
148
+ return validatePlan(await json(await request(`${opPath}/plan`)), args.opId);
149
+ }
150
+ catch (error) {
151
+ if (!(error instanceof DrawHttpError) || error.code !== 'plan_pending' || now() - started >= PLAN_PENDING_LIMIT_MS)
152
+ throw error;
153
+ await sleep(Math.max(1, error.retryAfterSeconds ?? 2) * 1000);
154
+ }
155
+ }
156
+ },
157
+ /** The exact bytes every engine attaches (2.2), checked against the server's sha256. */
158
+ image: async (name) => {
159
+ const response = await request(`${opPath}/images/${encodeURIComponent(name)}`);
160
+ const bytes = Buffer.from(await response.arrayBuffer());
161
+ const declared = response.headers.get('x-12ui-sha256');
162
+ const actual = sha256(bytes);
163
+ if (declared !== actual)
164
+ throw new DrawTransportError('corrupt', `Image ${name} arrived with sha256 ${actual}, not the ${declared ?? 'missing'} the server declared`);
165
+ return {
166
+ bytes,
167
+ mimeType: (response.headers.get('content-type') ?? 'application/octet-stream').split(';')[0].trim(),
168
+ sha256: actual,
169
+ referenceId: response.headers.get('x-12ui-reference-id'),
170
+ };
171
+ },
172
+ /** One option's image or failure reason (2.3). */
173
+ push: async (key, part) => {
174
+ const form = new FormData();
175
+ if ('png' in part)
176
+ form.append('file', new Blob([new Uint8Array(part.png)], { type: 'image/png' }), `${key}.png`);
177
+ else
178
+ form.append('reason', part.reason);
179
+ const url = `${args.origin}/api/v1/slate/push?op=${encodeURIComponent(args.opId)}&option=${encodeURIComponent(key)}`;
180
+ const body = await json(await request(url, { method: 'POST', body: form }));
181
+ if (body.state !== 'filled' && body.state !== 'failed')
182
+ throw new DrawTransportError('malformed', `The push of ${key} answered state ${JSON.stringify(body.state)}`);
183
+ return {
184
+ state: body.state,
185
+ label: stringOrNull(body.label),
186
+ versionId: stringOrNull(body.versionId),
187
+ replayed: body.replayed === true,
188
+ opState: stringOrNull(body.opState),
189
+ };
190
+ },
191
+ };
192
+ };
193
+ //# sourceMappingURL=workspace-draw-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-draw-client.js","sourceRoot":"","sources":["../src/workspace-draw-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { type SlateImageExecutor } from './slate-image-executor.js';
2
+ import type { DrawOptionCodex, SlatePlanOption } from './workspace-draw-types.js';
3
+ /**
4
+ * The codex engine for one option (design section 6): one native `codex exec` image call through the repo's own
5
+ * executor, in its own temp `CODEX_HOME` linked to the agent's `auth.json`, under the call id the plan names. The
6
+ * executor's call store makes that id durable: a rerun returns a drawn image without a second call, and an id
7
+ * whose call ended without an image answers the same way again, never re-dispatched.
8
+ *
9
+ * After the call this reads the call directory back for the run record: the temp home (and whether it is gone),
10
+ * the rollouts kept in `native-custody/`, how many image calls the nested driver made, and whether the prompt it
11
+ * sent was the plan's prompt byte for byte.
12
+ */
13
+ export type CodexOptionResult = {
14
+ kind: 'drawn';
15
+ png: Buffer;
16
+ reused: boolean;
17
+ details: DrawOptionCodex;
18
+ }
19
+ /** A model-class failure: pushed to the screen with this fixed sentence. */
20
+ | {
21
+ kind: 'failed';
22
+ failure: string;
23
+ details: DrawOptionCodex;
24
+ }
25
+ /** An environment-class failure (signed out, binary gone, store locked): not pushed, so a rerun can fix it. */
26
+ | {
27
+ kind: 'environment';
28
+ error: string;
29
+ details: DrawOptionCodex;
30
+ };
31
+ export type ExecutorFactory = (args: {
32
+ root: string;
33
+ env: NodeJS.ProcessEnv;
34
+ }) => SlateImageExecutor;
35
+ /** The executor's call store keeps one folder per call id at `<root>/calls/<sha256(id)>`. */
36
+ export declare const callDirectoryOf: (root: string, callId: string) => string;
37
+ /** What the call directory says about the call, for the record. */
38
+ export declare const readCallDetails: (callDir: string, prompt: string) => Promise<DrawOptionCodex & {
39
+ receiptState: string | null;
40
+ timedOut: boolean;
41
+ }>;
42
+ export declare const drawOptionWithCodex: (args: {
43
+ root: string;
44
+ env: NodeJS.ProcessEnv;
45
+ option: SlatePlanOption;
46
+ images: Buffer[];
47
+ executorFactory?: ExecutorFactory;
48
+ }) => Promise<CodexOptionResult>;
49
+ //# sourceMappingURL=workspace-draw-codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-draw-codex.d.ts","sourceRoot":"","sources":["../src/workspace-draw-codex.ts"],"names":[],"mappings":"AAKA,OAAO,EAA6B,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/F,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAElF;;;;;;;;;GASG;AAEH,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE;AAC3E,4EAA4E;GAC1E;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE;AAC/D,+GAA+G;GAC7G;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAAK,kBAAkB,CAAC;AAIrG,6FAA6F;AAC7F,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,KAAG,MAAkD,CAAC;AAWlH,mEAAmE;AACnE,eAAO,MAAM,eAAe,GAAU,SAAS,MAAM,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,eAAe,GAAG;IAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAgCnJ,CAAC;AAQF,eAAO,MAAM,mBAAmB,GAAU,MAAM;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC,KAAG,OAAO,CAAC,iBAAiB,CAsB5B,CAAC"}
@@ -0,0 +1,89 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync } from 'node:fs';
3
+ import { readdir, readFile } from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { createNativeImageExecutor } from './slate-image-executor.js';
6
+ import { OPTION_FAILURES } from './workspace-draw-messages.js';
7
+ const sha256 = (value) => createHash('sha256').update(value).digest('hex');
8
+ /** The executor's call store keeps one folder per call id at `<root>/calls/<sha256(id)>`. */
9
+ export const callDirectoryOf = (root, callId) => path.join(root, 'calls', sha256(callId));
10
+ const readJson = async (file) => {
11
+ try {
12
+ return JSON.parse(await readFile(file, 'utf8'));
13
+ }
14
+ catch (error) {
15
+ if (error.code === 'ENOENT')
16
+ return null;
17
+ throw error;
18
+ }
19
+ };
20
+ /** What the call directory says about the call, for the record. */
21
+ export const readCallDetails = async (callDir, prompt) => {
22
+ const [state, receipt, completion] = await Promise.all([
23
+ readJson(path.join(callDir, 'state.json')),
24
+ readJson(path.join(callDir, 'native-custody', 'receipt.json')),
25
+ readJson(path.join(callDir, 'completion.json')),
26
+ ]);
27
+ const tempHome = typeof state?.metadata?.home === 'string' ? state.metadata.home : '';
28
+ let rollouts = [];
29
+ try {
30
+ rollouts = (await readdir(path.join(callDir, 'native-custody')))
31
+ .filter((name) => /^rollout-.*\.jsonl$/u.test(name))
32
+ .sort()
33
+ .map((name) => path.join(callDir, 'native-custody', name));
34
+ }
35
+ catch (error) {
36
+ if (error.code !== 'ENOENT')
37
+ throw error;
38
+ }
39
+ const calls = Array.isArray(receipt?.calls) ? receipt.calls : [];
40
+ const literals = calls.flatMap((call) => call.prompts ?? [null]);
41
+ const generations = Array.isArray(receipt?.generations) ? receipt.generations : [];
42
+ const revised = generations[0]?.revisedPrompt;
43
+ return {
44
+ callDir,
45
+ tempHome,
46
+ tempHomeRemoved: tempHome !== '' && !existsSync(tempHome),
47
+ rollouts,
48
+ imageGenCalls: typeof receipt?.invocationCount === 'number' ? receipt.invocationCount : 0,
49
+ // Measured, never assumed: true only when exactly one call's literal is the plan prompt byte for byte.
50
+ promptVerbatim: literals.length === 1 && literals[0] !== null && literals[0] !== undefined ? literals[0] === prompt : null,
51
+ revisedPrompt: typeof revised === 'string' ? revised : null,
52
+ receiptState: typeof receipt?.state === 'string' ? receipt.state : null,
53
+ timedOut: completion?.timedOut === true,
54
+ };
55
+ };
56
+ const failureSentence = (details) => {
57
+ if (details.timedOut)
58
+ return OPTION_FAILURES.timeout;
59
+ if (details.receiptState === 'protocol-violation-multiple-calls')
60
+ return OPTION_FAILURES.protocol;
61
+ return OPTION_FAILURES.noImage;
62
+ };
63
+ export const drawOptionWithCodex = async (args) => {
64
+ const executor = (args.executorFactory ?? createNativeImageExecutor)({ root: args.root, env: args.env });
65
+ const callDir = callDirectoryOf(args.root, args.option.callId);
66
+ const details = async () => {
67
+ const { receiptState, timedOut, ...record } = await readCallDetails(callDir, args.option.prompt);
68
+ return { record, receiptState, timedOut };
69
+ };
70
+ try {
71
+ const result = await executor.generate({
72
+ callId: args.option.callId,
73
+ prompt: args.option.prompt,
74
+ images: args.images,
75
+ expected: args.option.frame,
76
+ });
77
+ return { kind: 'drawn', png: result.png, reused: result.reused, details: (await details()).record };
78
+ }
79
+ catch (error) {
80
+ const code = error.code;
81
+ const read = await details();
82
+ if (code === 'NEEDS_RECONCILIATION')
83
+ return { kind: 'failed', failure: failureSentence(read), details: read.record };
84
+ if (code === 'REQUEST_CHANGED')
85
+ return { kind: 'failed', failure: OPTION_FAILURES.changed, details: read.record };
86
+ return { kind: 'environment', error: error instanceof Error ? error.message : String(error), details: read.record };
87
+ }
88
+ };
89
+ //# sourceMappingURL=workspace-draw-codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-draw-codex.js","sourceRoot":"","sources":["../src/workspace-draw-codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { type CodexReadiness, type CodexReadinessCheck } from './cli-codex-readiness.js';
2
+ import type { DrawEngine, DrawRecordCodex } from './workspace-draw-types.js';
3
+ /**
4
+ * Whether Codex can draw a request, decided once per op and recorded with its reason (design section 3, step 4):
5
+ * Codex when the readiness probe passes in the agent's own Codex home. There is no other engine in this release
6
+ * (decision D2-B: drawing on 12ui needs a 12ui sign-in), so a probe that fails is a reason, never a fallback.
7
+ */
8
+ export type RequestedEngine = 'auto' | DrawEngine;
9
+ export type EngineChoice = {
10
+ ok: true;
11
+ engine: DrawEngine;
12
+ reason: string;
13
+ codex: DrawRecordCodex;
14
+ } | {
15
+ ok: false;
16
+ reason: string;
17
+ check: Exclude<CodexReadinessCheck, 'ready'>;
18
+ };
19
+ export type ReadinessProbe = (options: {
20
+ env: NodeJS.ProcessEnv;
21
+ }) => Promise<CodexReadiness>;
22
+ /** "The same home": the calling agent's `CODEX_HOME`, else `~/.codex`. */
23
+ export declare const codexHomeOf: (env: NodeJS.ProcessEnv) => string;
24
+ /**
25
+ * `<home>/sessions/**\/rollout-*-<threadId>.jsonl`: the calling agent's own rollout, cheap proof that the drawing
26
+ * account is the caller's. Null when the thread id is unset or no such file exists.
27
+ */
28
+ export declare const findSameHomeRollout: (home: string, threadId: string | null) => Promise<string | null>;
29
+ /**
30
+ * `--engine` is strict: anything but auto or codex is a usage error. `TWELVE_UI_ENGINE` is shared with conversion,
31
+ * where `api` is a valid choice, so for this verb it counts only when it names auto or codex; any other value
32
+ * leaves the default, and a conversion setting never stops a workspace request from drawing.
33
+ */
34
+ export declare const parseRequestedEngine: (flag: string | undefined, env: NodeJS.ProcessEnv) => RequestedEngine | null;
35
+ export declare const chooseEngine: (args: {
36
+ env: NodeJS.ProcessEnv;
37
+ probe?: ReadinessProbe;
38
+ }) => Promise<EngineChoice>;
39
+ //# sourceMappingURL=workspace-draw-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-draw-engine.d.ts","sourceRoot":"","sources":["../src/workspace-draw-engine.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuB,KAAK,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE9G,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE7E;;;;GAIG;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,UAAU,CAAC;AAElD,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,GACxE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAE9F,0EAA0E;AAC1E,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,CAAC,UAAU,KAAG,MAAgF,CAAC;AAEtI;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAU,MAAM,MAAM,EAAE,UAAU,MAAM,GAAG,IAAI,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAYtG,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,GAAG,SAAS,EAAE,KAAK,MAAM,CAAC,UAAU,KAAG,eAAe,GAAG,IAOzG,CAAC;AAEF,eAAO,MAAM,YAAY,GAAU,MAAM;IACvC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB,KAAG,OAAO,CAAC,YAAY,CA6BvB,CAAC"}
@@ -0,0 +1,72 @@
1
+ import { readdir } from 'node:fs/promises';
2
+ import { homedir } from 'node:os';
3
+ import path from 'node:path';
4
+ import { probeCodexReadiness } from './cli-codex-readiness.js';
5
+ import { locateCodexBinary, NO_CODEX_BINARY_REASON } from './codex-binary.js';
6
+ /** "The same home": the calling agent's `CODEX_HOME`, else `~/.codex`. */
7
+ export const codexHomeOf = (env) => path.resolve(env.CODEX_HOME?.trim() || path.join(homedir(), '.codex'));
8
+ /**
9
+ * `<home>/sessions/**\/rollout-*-<threadId>.jsonl`: the calling agent's own rollout, cheap proof that the drawing
10
+ * account is the caller's. Null when the thread id is unset or no such file exists.
11
+ */
12
+ export const findSameHomeRollout = async (home, threadId) => {
13
+ if (!threadId)
14
+ return null;
15
+ let entries;
16
+ try {
17
+ entries = await readdir(path.join(home, 'sessions'), { recursive: true });
18
+ }
19
+ catch (error) {
20
+ if (error.code === 'ENOENT')
21
+ return null;
22
+ throw error;
23
+ }
24
+ const suffix = `-${threadId}.jsonl`;
25
+ const match = entries.filter((entry) => path.basename(entry).startsWith('rollout-') && entry.endsWith(suffix)).sort()[0];
26
+ return match ? path.join(home, 'sessions', match) : null;
27
+ };
28
+ const isRequestedEngine = (value) => value === 'auto' || value === 'codex';
29
+ /**
30
+ * `--engine` is strict: anything but auto or codex is a usage error. `TWELVE_UI_ENGINE` is shared with conversion,
31
+ * where `api` is a valid choice, so for this verb it counts only when it names auto or codex; any other value
32
+ * leaves the default, and a conversion setting never stops a workspace request from drawing.
33
+ */
34
+ export const parseRequestedEngine = (flag, env) => {
35
+ if (flag !== undefined) {
36
+ const value = flag.trim();
37
+ return isRequestedEngine(value) ? value : null;
38
+ }
39
+ const fromEnv = env.TWELVE_UI_ENGINE?.trim() ?? '';
40
+ return isRequestedEngine(fromEnv) ? fromEnv : 'auto';
41
+ };
42
+ export const chooseEngine = async (args) => {
43
+ const home = codexHomeOf(args.env);
44
+ const located = locateCodexBinary(args.env);
45
+ const readiness = located
46
+ ? await (args.probe ?? probeCodexReadiness)({ env: args.env })
47
+ : { ready: false, reason: NO_CODEX_BINARY_REASON, check: 'no_binary', codexBin: '', codexHome: home };
48
+ if (readiness.ready) {
49
+ const version = readiness.version ?? 'unknown';
50
+ const threadId = args.env.CODEX_THREAD_ID?.trim() || null;
51
+ return {
52
+ ok: true,
53
+ engine: 'codex',
54
+ reason: `Codex ${version} signed in with ChatGPT in ${readiness.codexHome}`,
55
+ codex: {
56
+ binary: readiness.codexBin,
57
+ version,
58
+ home: readiness.codexHome,
59
+ threadId,
60
+ sameHomeRollout: await findSameHomeRollout(readiness.codexHome, threadId),
61
+ },
62
+ };
63
+ }
64
+ return {
65
+ ok: false,
66
+ check: readiness.check === 'ready' ? 'binary' : readiness.check,
67
+ reason: located
68
+ ? `Codex at ${located.binary} (from ${located.source}) cannot draw here: ${readiness.reason}`
69
+ : `Codex cannot draw here: ${readiness.reason}`,
70
+ };
71
+ };
72
+ //# sourceMappingURL=workspace-draw-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-draw-engine.js","sourceRoot":"","sources":["../src/workspace-draw-engine.ts"],"names":[],"mappings":"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"}