@12ui/design 0.2.66 → 0.2.67

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 (245) hide show
  1. package/README.md +42 -35
  2. package/SKILL.md +1 -1
  3. package/dist/branch-client.d.ts +4 -2
  4. package/dist/branch-client.d.ts.map +1 -1
  5. package/dist/branch-client.js +36 -21
  6. package/dist/branch-client.js.map +1 -1
  7. package/dist/branch-conversion-engine.d.ts +8 -0
  8. package/dist/branch-conversion-engine.d.ts.map +1 -0
  9. package/dist/branch-conversion-engine.js +43 -0
  10. package/dist/branch-conversion-engine.js.map +1 -0
  11. package/dist/branch-execution.d.ts +12 -0
  12. package/dist/branch-execution.d.ts.map +1 -1
  13. package/dist/branch-execution.js +62 -39
  14. package/dist/branch-execution.js.map +1 -1
  15. package/dist/branch-local-conversion.d.ts +27 -0
  16. package/dist/branch-local-conversion.d.ts.map +1 -0
  17. package/dist/branch-local-conversion.js +80 -0
  18. package/dist/branch-local-conversion.js.map +1 -0
  19. package/dist/branch-local-publication.d.ts +15 -0
  20. package/dist/branch-local-publication.d.ts.map +1 -0
  21. package/dist/branch-local-publication.js +111 -0
  22. package/dist/branch-local-publication.js.map +1 -0
  23. package/dist/branch-page-conversion.d.ts +7 -0
  24. package/dist/branch-page-conversion.d.ts.map +1 -1
  25. package/dist/branch-page-conversion.js +13 -0
  26. package/dist/branch-page-conversion.js.map +1 -1
  27. package/dist/branch-progress.d.ts +2 -0
  28. package/dist/branch-progress.d.ts.map +1 -1
  29. package/dist/branch-progress.js.map +1 -1
  30. package/dist/branch-run-record.d.ts +24 -2
  31. package/dist/branch-run-record.d.ts.map +1 -1
  32. package/dist/branch-run-record.js +3 -2
  33. package/dist/branch-run-record.js.map +1 -1
  34. package/dist/branch-status.d.ts.map +1 -1
  35. package/dist/branch-status.js +21 -3
  36. package/dist/branch-status.js.map +1 -1
  37. package/dist/branch-winner.d.ts.map +1 -1
  38. package/dist/branch-winner.js +1 -2
  39. package/dist/branch-winner.js.map +1 -1
  40. package/dist/cli-arguments.d.ts.map +1 -1
  41. package/dist/cli-arguments.js +1 -0
  42. package/dist/cli-arguments.js.map +1 -1
  43. package/dist/cli-branch-command.d.ts.map +1 -1
  44. package/dist/cli-branch-command.js +7 -2
  45. package/dist/cli-branch-command.js.map +1 -1
  46. package/dist/cli-capabilities.d.ts +29 -15
  47. package/dist/cli-capabilities.d.ts.map +1 -1
  48. package/dist/cli-capabilities.js +30 -23
  49. package/dist/cli-capabilities.js.map +1 -1
  50. package/dist/cli-codex-readiness.d.ts +11 -0
  51. package/dist/cli-codex-readiness.d.ts.map +1 -0
  52. package/dist/cli-codex-readiness.js +72 -0
  53. package/dist/cli-codex-readiness.js.map +1 -0
  54. package/dist/cli-conversion-engine.d.ts +11 -0
  55. package/dist/cli-conversion-engine.d.ts.map +1 -0
  56. package/dist/cli-conversion-engine.js +26 -0
  57. package/dist/cli-conversion-engine.js.map +1 -0
  58. package/dist/cli-conversion-receipt.d.ts +28 -0
  59. package/dist/cli-conversion-receipt.d.ts.map +1 -0
  60. package/dist/cli-conversion-receipt.js +130 -0
  61. package/dist/cli-conversion-receipt.js.map +1 -0
  62. package/dist/cli-convert-command.d.ts.map +1 -1
  63. package/dist/cli-convert-command.js +12 -5
  64. package/dist/cli-convert-command.js.map +1 -1
  65. package/dist/cli-corpus-command.d.ts.map +1 -1
  66. package/dist/cli-corpus-command.js +4 -5
  67. package/dist/cli-corpus-command.js.map +1 -1
  68. package/dist/cli-corpus-evidence.d.ts +0 -1
  69. package/dist/cli-corpus-evidence.d.ts.map +1 -1
  70. package/dist/cli-corpus-evidence.js +9 -50
  71. package/dist/cli-corpus-evidence.js.map +1 -1
  72. package/dist/cli-corpus-manifest.d.ts +18 -0
  73. package/dist/cli-corpus-manifest.d.ts.map +1 -0
  74. package/dist/cli-corpus-manifest.js +83 -0
  75. package/dist/cli-corpus-manifest.js.map +1 -0
  76. package/dist/cli-corpus-reference-downloads.d.ts.map +1 -1
  77. package/dist/cli-corpus-reference-downloads.js +5 -3
  78. package/dist/cli-corpus-reference-downloads.js.map +1 -1
  79. package/dist/cli-corpus-run.d.ts.map +1 -1
  80. package/dist/cli-corpus-run.js +19 -8
  81. package/dist/cli-corpus-run.js.map +1 -1
  82. package/dist/cli-corpus-types.d.ts +6 -6
  83. package/dist/cli-corpus-types.d.ts.map +1 -1
  84. package/dist/cli-engine.d.ts +10 -0
  85. package/dist/cli-engine.d.ts.map +1 -0
  86. package/dist/cli-engine.js +28 -0
  87. package/dist/cli-engine.js.map +1 -0
  88. package/dist/cli-help/conversion.d.ts +10 -3
  89. package/dist/cli-help/conversion.d.ts.map +1 -1
  90. package/dist/cli-help/conversion.js +14 -6
  91. package/dist/cli-help/conversion.js.map +1 -1
  92. package/dist/cli-help/design.d.ts +6 -6
  93. package/dist/cli-help/design.d.ts.map +1 -1
  94. package/dist/cli-help/design.js +8 -7
  95. package/dist/cli-help/design.js.map +1 -1
  96. package/dist/cli-help/index.d.ts +18 -11
  97. package/dist/cli-help/index.d.ts.map +1 -1
  98. package/dist/cli-help/setup.d.ts +2 -2
  99. package/dist/cli-help/setup.js +3 -3
  100. package/dist/cli-help/setup.js.map +1 -1
  101. package/dist/cli-image-backend.d.ts +3 -0
  102. package/dist/cli-image-backend.d.ts.map +1 -0
  103. package/dist/cli-image-backend.js +12 -0
  104. package/dist/cli-image-backend.js.map +1 -0
  105. package/dist/cli-local-conversion.d.ts +17 -0
  106. package/dist/cli-local-conversion.d.ts.map +1 -0
  107. package/dist/cli-local-conversion.js +74 -0
  108. package/dist/cli-local-conversion.js.map +1 -0
  109. package/dist/cli-local-dispatch.d.ts +4 -0
  110. package/dist/cli-local-dispatch.d.ts.map +1 -0
  111. package/dist/cli-local-dispatch.js +102 -0
  112. package/dist/cli-local-dispatch.js.map +1 -0
  113. package/dist/cli-local-export.d.ts +7 -0
  114. package/dist/cli-local-export.d.ts.map +1 -0
  115. package/dist/cli-local-export.js +31 -0
  116. package/dist/cli-local-export.js.map +1 -0
  117. package/dist/cli-local-improve-context.d.ts +3 -0
  118. package/dist/cli-local-improve-context.d.ts.map +1 -0
  119. package/dist/cli-local-improve-context.js +47 -0
  120. package/dist/cli-local-improve-context.js.map +1 -0
  121. package/dist/cli-local-improve.d.ts +16 -0
  122. package/dist/cli-local-improve.d.ts.map +1 -0
  123. package/dist/cli-local-improve.js +214 -0
  124. package/dist/cli-local-improve.js.map +1 -0
  125. package/dist/cli-local-record.d.ts +8 -0
  126. package/dist/cli-local-record.d.ts.map +1 -0
  127. package/dist/cli-local-record.js +67 -0
  128. package/dist/cli-local-record.js.map +1 -0
  129. package/dist/cli-local-runtime.d.ts +7 -0
  130. package/dist/cli-local-runtime.d.ts.map +1 -0
  131. package/dist/cli-local-runtime.js +21 -0
  132. package/dist/cli-local-runtime.js.map +1 -0
  133. package/dist/cli-next-command.d.ts +1 -0
  134. package/dist/cli-next-command.d.ts.map +1 -1
  135. package/dist/cli-next-command.js +12 -9
  136. package/dist/cli-next-command.js.map +1 -1
  137. package/dist/cli-run.d.ts.map +1 -1
  138. package/dist/cli-run.js +3 -0
  139. package/dist/cli-run.js.map +1 -1
  140. package/dist/cli-skill-command.d.ts +0 -3
  141. package/dist/cli-skill-command.d.ts.map +1 -1
  142. package/dist/cli-skill-command.js +9 -24
  143. package/dist/cli-skill-command.js.map +1 -1
  144. package/dist/cli-usage.d.ts.map +1 -1
  145. package/dist/cli-usage.js +20 -11
  146. package/dist/cli-usage.js.map +1 -1
  147. package/dist/concept-input.d.ts +1 -1
  148. package/dist/concept-input.d.ts.map +1 -1
  149. package/dist/concept-input.js +1 -1
  150. package/dist/concept-input.js.map +1 -1
  151. package/dist/conversion-status-contract.d.ts +13 -1
  152. package/dist/conversion-status-contract.d.ts.map +1 -1
  153. package/dist/conversion-status-contract.js +12 -11
  154. package/dist/conversion-status-contract.js.map +1 -1
  155. package/dist/corpus-client.d.ts +7 -6
  156. package/dist/corpus-client.d.ts.map +1 -1
  157. package/dist/corpus-client.js +14 -1
  158. package/dist/corpus-client.js.map +1 -1
  159. package/dist/corpus-inspiration-failure.js +1 -1
  160. package/dist/corpus-inspiration-failure.js.map +1 -1
  161. package/dist/corpus-request-error.d.ts +3 -10
  162. package/dist/corpus-request-error.d.ts.map +1 -1
  163. package/dist/corpus-request-error.js +1 -24
  164. package/dist/corpus-request-error.js.map +1 -1
  165. package/dist/http-response-diagnostic.d.ts +12 -0
  166. package/dist/http-response-diagnostic.d.ts.map +1 -0
  167. package/dist/http-response-diagnostic.js +58 -0
  168. package/dist/http-response-diagnostic.js.map +1 -0
  169. package/dist/improve-branch-stage.d.ts.map +1 -1
  170. package/dist/improve-branch-stage.js +6 -25
  171. package/dist/improve-branch-stage.js.map +1 -1
  172. package/dist/improve-concept.d.ts +1 -1
  173. package/dist/improve-concept.d.ts.map +1 -1
  174. package/dist/improve-concept.js +1 -1
  175. package/dist/improve-concept.js.map +1 -1
  176. package/dist/improve-core/concept-input.d.ts +2 -43
  177. package/dist/improve-core/concept-input.d.ts.map +1 -1
  178. package/dist/improve-core/concept-input.js +3 -53
  179. package/dist/improve-core/concept-input.js.map +1 -1
  180. package/dist/improve-core/improve-concept.d.ts +0 -6
  181. package/dist/improve-core/improve-concept.d.ts.map +1 -1
  182. package/dist/improve-core/improve-concept.js +4 -36
  183. package/dist/improve-core/improve-concept.js.map +1 -1
  184. package/dist/improve-core/improve-page-words.d.ts +2 -2
  185. package/dist/improve-core/improve-page-words.d.ts.map +1 -1
  186. package/dist/improve-core/improve-page-words.js +8 -6
  187. package/dist/improve-core/improve-page-words.js.map +1 -1
  188. package/dist/improve-generation-stages.d.ts.map +1 -1
  189. package/dist/improve-generation-stages.js +6 -24
  190. package/dist/improve-generation-stages.js.map +1 -1
  191. package/dist/improve-kit-readme.d.ts.map +1 -1
  192. package/dist/improve-kit-readme.js +1 -0
  193. package/dist/improve-kit-readme.js.map +1 -1
  194. package/dist/improve-source-words.d.ts +14 -0
  195. package/dist/improve-source-words.d.ts.map +1 -0
  196. package/dist/improve-source-words.js +66 -0
  197. package/dist/improve-source-words.js.map +1 -0
  198. package/dist/improve-workspace.d.ts +3 -0
  199. package/dist/improve-workspace.d.ts.map +1 -1
  200. package/dist/improve-workspace.js.map +1 -1
  201. package/dist/index.d.ts +1 -1
  202. package/dist/index.d.ts.map +1 -1
  203. package/dist/index.js +1 -1
  204. package/dist/index.js.map +1 -1
  205. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  206. package/dist/legacy-skill-catalog.js +36 -5
  207. package/dist/legacy-skill-catalog.js.map +1 -1
  208. package/dist/package-client.d.ts +3 -1
  209. package/dist/package-client.d.ts.map +1 -1
  210. package/dist/package-client.js +34 -11
  211. package/dist/package-client.js.map +1 -1
  212. package/dist/prototype-gates.d.ts.map +1 -1
  213. package/dist/prototype-gates.js +1 -1
  214. package/dist/prototype-gates.js.map +1 -1
  215. package/dist/prototype-poststep.js +1 -1
  216. package/dist/prototype-poststep.js.map +1 -1
  217. package/dist/prototype-requests.d.ts +1 -0
  218. package/dist/prototype-requests.d.ts.map +1 -1
  219. package/dist/prototype-requests.js.map +1 -1
  220. package/dist/prototype-revision.d.ts +1 -1
  221. package/dist/prototype-revision.js +1 -1
  222. package/dist/prototype-runner.d.ts.map +1 -1
  223. package/dist/prototype-runner.js +9 -3
  224. package/dist/prototype-runner.js.map +1 -1
  225. package/dist/review-page.js +2 -2
  226. package/dist/review-page.js.map +1 -1
  227. package/dist/review-prototype-gap.js +1 -1
  228. package/dist/review-prototype-gap.js.map +1 -1
  229. package/dist/run-journal-commands.d.ts.map +1 -1
  230. package/dist/run-journal-commands.js +1 -0
  231. package/dist/run-journal-commands.js.map +1 -1
  232. package/dist/skill-installer.d.ts +2 -1
  233. package/dist/skill-installer.d.ts.map +1 -1
  234. package/dist/skill-installer.js +3 -3
  235. package/dist/skill-installer.js.map +1 -1
  236. package/open-design.json +2 -2
  237. package/package.json +5 -4
  238. package/prototype-kit/analyze.mjs +4 -1
  239. package/prototype-kit/build.mjs +29 -4
  240. package/prototype-kit/inventory.mjs +11 -2
  241. package/prototype-kit/lib/local-page.mjs +50 -0
  242. package/prototype-kit/lib/static-server.mjs +1 -0
  243. package/skills/12ui-design/SKILL.md +34 -32
  244. package/skills/12ui-design/improve.md +48 -155
  245. package/skills/12ui-design/outputs.md +22 -0
@@ -1,6 +1,5 @@
1
- import { HEDGE_QUERY_LENGTH_LIMIT } from './reference-search-mode.js';
2
1
  import { BRANCH_PAGE_CONCURRENCY_DEFAULT, CONVERSION_DURATION_HINTS, OPERATION_DURATION_HINTS, } from './cli-progress.js';
3
- import { MAX_CONCEPT_CHARACTERS } from './concept-input.js';
2
+ import { HEDGE_QUERY_LENGTH_LIMIT } from './reference-search-mode.js';
4
3
  import { CONVERSION_MODELS } from './conversion-models.js';
5
4
  import { CLI_CONVERSION_OUTPUTS, CONVERSION_OUTPUT_MEDIA_TYPES, } from './conversion-outputs.js';
6
5
  import { MAX_IMAGE_OUTPUT_WIDTH } from './image-output-width.js';
@@ -14,9 +13,32 @@ export const CLI_CAPABILITIES = {
14
13
  CONVERSION_OUTPUT_MEDIA_TYPES.layerdoc,
15
14
  ],
16
15
  outputs: CLI_CONVERSION_OUTPUTS,
17
- outputDescription: '`12ui convert <image> --output html` writes both LayerDoc and responsive HTML through the'
18
- + ' fused conversion path. `12ui convert <conversion-id> --output <comma-separated-formats>`'
19
- + ' derives requested formats concurrently into --out-dir; only responsive html is metered.',
16
+ outputDescription: 'convert --output html selects local Codex or hosted API before dispatch. Local HTML has no LayerDoc;'
17
+ + ' API HTML writes LayerDoc and responsive HTML. Hosted conversion IDs derive comma-separated formats.',
18
+ conversionEngines: {
19
+ values: ['auto', 'codex', 'api'],
20
+ default: 'auto',
21
+ environment: 'TWELVE_UI_ENGINE',
22
+ localOutputs: ['html'],
23
+ failurePolicy: 'Never silently retry a local failure through API; resume uses the recorded engine.',
24
+ },
25
+ localConversion: {
26
+ command: '12ui convert <image> --output html --engine codex',
27
+ imageBackends: ['external', 'native'],
28
+ defaultImageBackend: { withNonblankOpenaiApiKey: 'external', otherwise: 'native' },
29
+ imageBackendPolicy: 'Choose once for a new run; explicit choices and saved runs remain fixed. Explicit external requires OPENAI_API_KEY before planner execution.',
30
+ nativeLayerDoc: false,
31
+ },
32
+ projectApply: {
33
+ command: '12ui improve <url> --target <image> --repo <directory> --apply',
34
+ withoutTarget: 'Draft candidates, require an explicit pick, then edit the actual project locally.',
35
+ withoutApply: 'Hosted implementation kit; does not edit project source.',
36
+ },
37
+ localExport: {
38
+ command: '12ui export <run-dir|output-dir> --output <format> --out-dir <directory>',
39
+ outputs: ['assets', 'png', 'jpg', 'webp', 'pdf', 'react'],
40
+ react: 'Whole-page JSX, CSS, and assets; not a functional application.',
41
+ },
20
42
  imageModels: CONVERSION_MODELS,
21
43
  imageOutputWidth: {
22
44
  flag: '--width',
@@ -24,28 +46,13 @@ export const CLI_CAPABILITIES = {
24
46
  maximum: MAX_IMAGE_OUTPUT_WIDTH,
25
47
  description: 'Set the native output canvas width by proportionally resizing image input up or down.',
26
48
  },
27
- /**
28
- * The one input limit a caller hits before it can spend anything, and the one
29
- * that has to be knowable BEFORE the value is written: `draft` and `branch
30
- * execute` measure the brief with the service's own normalization and
31
- * refuse over-length text locally, having bought nothing.
32
- *
33
- * This entry used to carry a `whyItIsShort` field asserting that long concepts
34
- * produce worse screens. The 2026-08-16 blind A/B behind the 1200 raise
35
- * (`labs/concept-cap-2026-08-16`) measured no such effect, so the field is gone
36
- * rather than reworded — a capabilities payload is read by agents as fact, and
37
- * a refuted claim there is worse than no claim.
38
- */
49
+ // User briefs retain their complete normalized text.
39
50
  concept: {
40
51
  flags: ['--concept', '--concept-file'],
41
52
  commands: ['12ui draft', '12ui branch execute'],
42
53
  minimumCharacters: 1,
43
- maximumCharacters: MAX_CONCEPT_CHARACTERS,
44
54
  counted: 'code points, after every run of whitespace collapses to one space',
45
- description: 'The brief: product, audience, and what the surface must cover. Measured client-side against'
46
- + ' the same limit the service enforces, so an over-length brief is refused before any call'
47
- + ' and nothing is bought. Say what the surface must cover and leave the visual decisions'
48
- + ' to the model.',
55
+ description: 'The brief: product, audience, and what the surface must cover. Concept text has no character limit.'
49
56
  },
50
57
  draftCorpusQuery: {
51
58
  flag: '--corpus-query',
@@ -164,7 +171,7 @@ export const CLI_CAPABILITIES = {
164
171
  labelSchema: ['navigate', 'dropdown', 'modal', 'none'],
165
172
  labelSpend: 'one low-effort product-provider call per screen',
166
173
  precedence: 'deterministic navigation applies; dropdowns bind only from three or more distinct labeled options',
167
- hardGates: ['branch.plan.json', 'semantic viewport section ids'],
174
+ hardGates: ['branch.plan.json', 'semantic viewport section ids or verified local-page identity'],
168
175
  },
169
176
  };
170
177
  //# sourceMappingURL=cli-capabilities.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-capabilities.js","sourceRoot":"","sources":["../src/cli-capabilities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-capabilities.js","sourceRoot":"","sources":["../src/cli-capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** Non-inference checks against only the selected binary and authentication home. */
2
+ export declare function probeCodexReadiness(options?: {
3
+ codexBin?: string;
4
+ codexHome?: string;
5
+ }): Promise<{
6
+ ready: boolean;
7
+ reason: string;
8
+ codexBin: string;
9
+ codexHome: string;
10
+ }>;
11
+ //# sourceMappingURL=cli-codex-readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-codex-readiness.d.ts","sourceRoot":"","sources":["../src/cli-codex-readiness.ts"],"names":[],"mappings":"AAoBA,qFAAqF;AACrF,wBAAsB,mBAAmB,CAAC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC;IAC1G,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;CACrE,CAAC,CAiCD"}
@@ -0,0 +1,72 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { constants } from 'node:fs';
3
+ import { access, readFile } from 'node:fs/promises';
4
+ import { homedir } from 'node:os';
5
+ import path from 'node:path';
6
+ // Keep aligned with codex-conversion/src/codex/arguments.mjs.
7
+ const requiredExecFlags = [
8
+ '--ignore-user-config', '--ignore-rules', '--strict-config', '--cd',
9
+ '--skip-git-repo-check', '--sandbox', '--model', '--config', '--enable',
10
+ '--disable', '--json', '--color', '--output-last-message', '--image', '--output-schema',
11
+ ];
12
+ function inspect(binary, args, env) {
13
+ return new Promise((resolve, reject) => {
14
+ execFile(binary, args, { env, encoding: 'utf8', timeout: 30_000, maxBuffer: 1024 * 1024 }, (error, stdout, stderr) => error ? reject(error) : resolve(`${stdout}\n${stderr}`));
15
+ });
16
+ }
17
+ /** Non-inference checks against only the selected binary and authentication home. */
18
+ export async function probeCodexReadiness(options = {}) {
19
+ const codexBin = options.codexBin ?? 'codex';
20
+ const codexHome = path.resolve(options.codexHome ?? process.env.CODEX_HOME ?? path.join(homedir(), '.codex'));
21
+ const result = (ready, reason) => ({ ready, reason, codexBin, codexHome });
22
+ // Match the runtime's subscription environment: no provider API credentials.
23
+ const env = { CODEX_HOME: codexHome };
24
+ for (const key of ['PATH', 'HOME', 'TMPDIR', 'TEMP', 'TMP', 'LANG', 'LC_ALL', 'SYSTEMROOT']) {
25
+ if (process.env[key])
26
+ env[key] = process.env[key];
27
+ }
28
+ try {
29
+ await inspect(codexBin, ['--version'], env);
30
+ }
31
+ catch {
32
+ return result(false, 'Codex CLI could not run. Install Codex on PATH or pass --codex-bin with a working executable.');
33
+ }
34
+ try {
35
+ await access(path.join(codexHome, 'auth.json'), constants.R_OK);
36
+ }
37
+ catch {
38
+ return result(false, 'Selected Codex home has no readable auth.json. Run codex login with this CODEX_HOME, or select your authenticated home with --codex-home.');
39
+ }
40
+ try {
41
+ const login = await inspect(codexBin, ['login', 'status'], env);
42
+ if (!login.includes('Logged in using ChatGPT')) {
43
+ return result(false, 'Codex conversion requires ChatGPT authentication. Run codex login with the selected CODEX_HOME; API-key login is not supported.');
44
+ }
45
+ }
46
+ catch {
47
+ return result(false, 'Codex login status failed. Run codex login with the selected CODEX_HOME and retry.');
48
+ }
49
+ try {
50
+ const help = await inspect(codexBin, ['exec', '--help'], env);
51
+ const missing = requiredExecFlags.filter(flag => !new RegExp(`${flag}(?=[\\s=,]|$)`).test(help));
52
+ if (missing.length)
53
+ return result(false, `Codex CLI lacks required conversion flags: ${missing.join(', ')}. Update Codex or select a compatible executable with --codex-bin.`);
54
+ }
55
+ catch {
56
+ return result(false, 'Codex exec --help failed. Update Codex or select a compatible executable with --codex-bin.');
57
+ }
58
+ try {
59
+ const cache = JSON.parse(await readFile(path.join(codexHome, 'models_cache.json'), 'utf8'));
60
+ const models = cache?.models;
61
+ const available = Array.isArray(models) && models.some(model => model?.slug === 'gpt-6-astra'
62
+ && Array.isArray(model.supported_reasoning_levels)
63
+ && model.supported_reasoning_levels.some((level) => level?.effort === 'low'));
64
+ if (!available)
65
+ return result(false, 'The selected Codex model cache does not list gpt-6-astra with low reasoning. Refresh Codex model availability for this ChatGPT account, then retry.');
66
+ }
67
+ catch {
68
+ return result(false, 'Selected Codex home has no readable, valid models_cache.json. Open Codex with this CODEX_HOME to refresh its model cache, then retry.');
69
+ }
70
+ return result(true, 'Codex CLI, ChatGPT login, required flags, and cached gpt-6-astra low availability are ready.');
71
+ }
72
+ //# sourceMappingURL=cli-codex-readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-codex-readiness.js","sourceRoot":"","sources":["../src/cli-codex-readiness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type CliFlags } from './cli-arguments.js';
2
+ export declare const LOCAL_CONVERSION_FLAGS: Set<string>;
3
+ export declare const localConversionDirectory: (source: string, flags: CliFlags) => string;
4
+ /** Only explicitly requested options belong in flags; defaults must not imply hosted intent. */
5
+ export declare function chooseConversionEngine({ source, flags, runDir }: {
6
+ source: string;
7
+ flags: CliFlags;
8
+ runDir?: string;
9
+ }): Promise<import("./cli-engine.js").EngineSelection>;
10
+ export declare function assertApiConversionFlags(flags: CliFlags): void;
11
+ //# sourceMappingURL=cli-conversion-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-conversion-engine.d.ts","sourceRoot":"","sources":["../src/cli-conversion-engine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAI/D,eAAO,MAAM,sBAAsB,aAAyI,CAAC;AAC7K,eAAO,MAAM,wBAAwB,GAAI,QAAQ,MAAM,EAAE,OAAO,QAAQ,KAAG,MAAoI,CAAC;AAChN,gGAAgG;AAChG,wBAAsB,sBAAsB,CAAC,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,EAAE;IAAC,MAAM,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,QAAQ,CAAC;IAAA,MAAM,CAAC,EAAC,MAAM,CAAA;CAAC,sDAShH;AACD,wBAAgB,wBAAwB,CAAC,KAAK,EAAC,QAAQ,GAAG,IAAI,CAG7D"}
@@ -0,0 +1,26 @@
1
+ import path from 'node:path';
2
+ import { stat } from 'node:fs/promises';
3
+ import { stringFlag } from './cli-arguments.js';
4
+ import { selectEngine } from './cli-engine.js';
5
+ import { readLocalRecord } from './cli-local-record.js';
6
+ import { CliRefusal } from './cli-refusal.js';
7
+ export const LOCAL_CONVERSION_FLAGS = new Set(['engine', 'codex-bin', 'codex-home', 'output', 'out-dir', 'image-backend', 'clean-assets', 'timeout-ms', 'reasoning', 'json', 'quiet']);
8
+ export const localConversionDirectory = (source, flags) => path.resolve(stringFlag(flags, 'out-dir') ?? path.join(path.dirname(path.resolve(source)), path.parse(source).name + '-12ui'));
9
+ /** Only explicitly requested options belong in flags; defaults must not imply hosted intent. */
10
+ export async function chooseConversionEngine({ source, flags, runDir }) {
11
+ const directory = runDir ?? localConversionDirectory(source, flags);
12
+ const saved = await readLocalRecord(directory);
13
+ const hosted = !saved && await stat(path.join(directory, 'journal.jsonl')).catch(() => null);
14
+ const image = /\.(png|jpe?g|webp)$/iu.test(source) && (await stat(source).catch(() => null))?.isFile();
15
+ const supported = Boolean(image && stringFlag(flags, 'output') === 'html' && Object.keys(flags).every(key => LOCAL_CONVERSION_FLAGS.has(key)));
16
+ const selection = await selectEngine(flags, supported, saved ? 'codex' : hosted ? 'api' : undefined);
17
+ if (selection.engine === 'api')
18
+ assertApiConversionFlags(flags);
19
+ return selection;
20
+ }
21
+ export function assertApiConversionFlags(flags) {
22
+ const unsupported = ['image-backend', 'clean-assets', 'reasoning'].filter(key => flags[key] !== undefined);
23
+ if (unsupported.length)
24
+ throw new CliRefusal(`${unsupported.map(key => '--' + key).join(', ')} require the Codex engine. Remove these options for API work or configure Codex and use --engine codex.`, 'local_arguments');
25
+ }
26
+ //# sourceMappingURL=cli-conversion-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-conversion-engine.js","sourceRoot":"","sources":["../src/cli-conversion-engine.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAiB,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,YAAY,EAAC,QAAQ,EAAC,SAAS,EAAC,eAAe,EAAC,cAAc,EAAC,YAAY,EAAC,WAAW,EAAC,MAAM,EAAC,OAAO,CAAC,CAAC,CAAC;AAC7K,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,MAAc,EAAE,KAAe,EAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,EAAC,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,GAAC,OAAO,CAAC,CAAC,CAAC;AAChN,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAgD;IAChH,MAAM,SAAS,GAAC,MAAM,IAAI,wBAAwB,CAAC,MAAM,EAAC,KAAK,CAAC,CAAC;IACjE,MAAM,KAAK,GAAC,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAC,CAAC,KAAK,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,GAAE,EAAE,CAAA,IAAI,CAAC,CAAC;IACxF,MAAM,KAAK,GAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAE,EAAE,CAAA,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IACnG,MAAM,SAAS,GAAC,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,EAAC,QAAQ,CAAC,KAAG,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAA,EAAE,CAAA,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxI,MAAM,SAAS,GAAC,MAAM,YAAY,CAAC,KAAK,EAAC,SAAS,EAAC,KAAK,CAAA,CAAC,CAAA,OAAO,CAAA,CAAC,CAAA,MAAM,CAAA,CAAC,CAAA,KAAK,CAAA,CAAC,CAAA,SAAS,CAAC,CAAC;IACzF,IAAG,SAAS,CAAC,MAAM,KAAG,KAAK;QAAE,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAC7D,OAAO,SAAS,CAAC;AAClB,CAAC;AACD,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACtD,MAAM,WAAW,GAAC,CAAC,eAAe,EAAC,cAAc,EAAC,WAAW,CAAC,CAAC,MAAM,CAAC,GAAG,CAAA,EAAE,CAAA,KAAK,CAAC,GAAG,CAAC,KAAG,SAAS,CAAC,CAAC;IACnG,IAAG,WAAW,CAAC,MAAM;QAAC,MAAM,IAAI,UAAU,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAA,EAAE,CAAA,IAAI,GAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,yGAAyG,EAAC,iBAAiB,CAAC,CAAC;AACrN,CAAC"}
@@ -0,0 +1,28 @@
1
+ export interface LocalConversionReceipt {
2
+ schemaVersion: 1;
3
+ engine: 'codex';
4
+ status: string;
5
+ runDir: string;
6
+ source: {
7
+ path: string;
8
+ sha256: string;
9
+ };
10
+ settings: Record<string, string>;
11
+ artifacts: Array<{
12
+ path: string;
13
+ sha256?: string;
14
+ }>;
15
+ entrypoint?: string;
16
+ manifest?: string;
17
+ availableOutputs: string[];
18
+ nativeLayerDoc: false;
19
+ }
20
+ export declare const receiptPath: (runDir: string) => string;
21
+ export declare function prepareConversionReceipt(args: {
22
+ source: string;
23
+ runDir: string;
24
+ settings: Record<string, string>;
25
+ }): Promise<LocalConversionReceipt>;
26
+ export declare function readConversionReceipt(runDir: string): Promise<LocalConversionReceipt | undefined>;
27
+ export declare function updateConversionReceipt(runDir: string, status?: string): Promise<LocalConversionReceipt | undefined>;
28
+ //# sourceMappingURL=cli-conversion-receipt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-conversion-receipt.d.ts","sourceRoot":"","sources":["../src/cli-conversion-receipt.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAClE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3E,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,EAAE,KAAK,CAAC;CAC3F;AAKD,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,KAAG,MAAwD,CAAC;AAEtG,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAQ1J;AACD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAavG;AAWD,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CA0C1H"}
@@ -0,0 +1,130 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { readFile, realpath, rename, stat, unlink, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ const hash = (bytes) => createHash('sha256').update(bytes).digest('hex');
5
+ const digest = (v) => typeof v === 'string' && /^[a-f0-9]{64}$/u.test(v);
6
+ const object = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);
7
+ const missing = (e) => object(e) && ['ENOENT', 'ENOTDIR'].includes(String(e.code));
8
+ export const receiptPath = (runDir) => `${path.resolve(runDir)}.12ui-conversion.json`;
9
+ export async function prepareConversionReceipt(args) {
10
+ const receipt = {
11
+ schemaVersion: 1, engine: 'codex', status: 'prepared', runDir: path.resolve(args.runDir),
12
+ source: { path: path.resolve(args.source), sha256: hash(await readFile(args.source)) },
13
+ settings: { ...args.settings }, artifacts: [], availableOutputs: [], nativeLayerDoc: false,
14
+ };
15
+ await writeFile(receiptPath(args.runDir), `${JSON.stringify(receipt, null, 2)}\n`, { flag: 'wx', mode: 0o600 });
16
+ return receipt;
17
+ }
18
+ export async function readConversionReceipt(runDir) {
19
+ let v;
20
+ try {
21
+ v = JSON.parse(await readFile(receiptPath(runDir), 'utf8'));
22
+ }
23
+ catch (e) {
24
+ if (missing(e))
25
+ return undefined;
26
+ throw e;
27
+ }
28
+ if (!object(v) || v.schemaVersion !== 1 || v.engine !== 'codex' || v.runDir !== path.resolve(runDir)
29
+ || typeof v.status !== 'string' || v.nativeLayerDoc !== false || !object(v.source)
30
+ || typeof v.source.path !== 'string' || !digest(v.source.sha256) || !object(v.settings)
31
+ || !Object.values(v.settings).every(x => typeof x === 'string') || !Array.isArray(v.artifacts)
32
+ || !v.artifacts.every(x => object(x) && typeof x.path === 'string' && (x.sha256 === undefined || digest(x.sha256)))
33
+ || !Array.isArray(v.availableOutputs) || !v.availableOutputs.every(x => typeof x === 'string')
34
+ || (v.entrypoint !== undefined && typeof v.entrypoint !== 'string')
35
+ || (v.manifest !== undefined && typeof v.manifest !== 'string'))
36
+ throw new Error('Invalid local conversion receipt');
37
+ return v;
38
+ }
39
+ function relativeFile(v) {
40
+ if (typeof v !== 'string' || !v || path.isAbsolute(v) || v.includes('\\') || v.includes('\0')
41
+ || v.includes(':') || v.split('/').some(x => !x || x === '..' || x === '.'))
42
+ throw new Error('Unsafe conversion manifest path');
43
+ return v;
44
+ }
45
+ async function containedFile(root, relative) {
46
+ const file = path.join(root, relative);
47
+ const actual = await realpath(file);
48
+ if (!actual.startsWith(`${root}${path.sep}`) || !(await stat(actual)).isFile())
49
+ throw new Error('Unsafe conversion manifest file');
50
+ return file;
51
+ }
52
+ export async function updateConversionReceipt(runDir, status) {
53
+ const existing = await readConversionReceipt(runDir);
54
+ if (!existing)
55
+ return undefined;
56
+ const receipt = { ...existing, artifacts: [], availableOutputs: [] };
57
+ delete receipt.entrypoint;
58
+ delete receipt.manifest;
59
+ if (status === undefined) {
60
+ try {
61
+ const result = JSON.parse(await readFile(path.join(runDir, 'result.json'), 'utf8'));
62
+ if (object(result) && typeof result.status === 'string')
63
+ status = result.status;
64
+ }
65
+ catch (e) {
66
+ if (!missing(e))
67
+ throw e;
68
+ }
69
+ }
70
+ receipt.status = status ?? existing.status;
71
+ const manifestPath = path.resolve(runDir, 'output/manifest.json');
72
+ let bytes;
73
+ try {
74
+ bytes = await readFile(manifestPath);
75
+ }
76
+ catch (e) {
77
+ if (!missing(e))
78
+ throw e;
79
+ }
80
+ if (bytes) {
81
+ const manifest = JSON.parse(bytes.toString('utf8'));
82
+ if (!object(manifest) || !Array.isArray(manifest.files))
83
+ throw new Error('Invalid conversion manifest');
84
+ if (!object(manifest.source) || !digest(manifest.source.sha256)
85
+ || manifest.source.sha256 !== receipt.source.sha256)
86
+ throw new Error('Conversion manifest source hash mismatch');
87
+ const entrypoint = relativeFile(manifest.entrypoint);
88
+ if (!/\.html?$/iu.test(entrypoint))
89
+ throw new Error('Conversion manifest requires an HTML entrypoint');
90
+ const root = await realpath(path.resolve(runDir));
91
+ const outputRoot = await realpath(path.join(root, 'output'));
92
+ if (!outputRoot.startsWith(`${root}${path.sep}`))
93
+ throw new Error('Unsafe conversion output directory');
94
+ await containedFile(outputRoot, 'manifest.json');
95
+ const seen = new Set();
96
+ for (const item of manifest.files) {
97
+ if (!object(item) || !digest(item.sha256))
98
+ throw new Error('Invalid conversion manifest file hash');
99
+ const relative = relativeFile(item.path);
100
+ if (seen.has(relative))
101
+ throw new Error('Duplicate conversion manifest file');
102
+ seen.add(relative);
103
+ const file = await containedFile(outputRoot, relative);
104
+ const sha256 = hash(await readFile(file));
105
+ if (sha256 !== item.sha256)
106
+ throw new Error(`Conversion artifact hash mismatch: ${relative}`);
107
+ receipt.artifacts.push({ path: path.resolve(runDir, 'output', relative), sha256 });
108
+ }
109
+ if (!seen.has(entrypoint))
110
+ throw new Error('Conversion entrypoint missing from manifest files');
111
+ receipt.entrypoint = path.resolve(runDir, 'output', entrypoint);
112
+ receipt.manifest = manifestPath;
113
+ receipt.artifacts.push({ path: manifestPath, sha256: hash(bytes) });
114
+ receipt.availableOutputs = ['html', 'assets', 'png', 'jpg', 'webp', 'pdf', 'react'];
115
+ }
116
+ const destination = receiptPath(runDir);
117
+ const temporary = `${destination}.${randomUUID()}.tmp`;
118
+ try {
119
+ await writeFile(temporary, `${JSON.stringify(receipt, null, 2)}\n`, { flag: 'wx', mode: 0o600 });
120
+ await rename(temporary, destination);
121
+ }
122
+ catch {
123
+ console.error('Warning: could not persist the updated conversion receipt. Verified artifacts remain available.');
124
+ }
125
+ finally {
126
+ await unlink(temporary).catch(() => undefined);
127
+ }
128
+ return receipt;
129
+ }
130
+ //# sourceMappingURL=cli-conversion-receipt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-conversion-receipt.js","sourceRoot":"","sources":["../src/cli-conversion-receipt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvF,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,MAAM,IAAI,GAAG,CAAC,KAAiB,EAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7F,MAAM,MAAM,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC/F,MAAM,MAAM,GAAG,CAAC,CAAU,EAAgC,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACtH,MAAM,OAAO,GAAG,CAAC,CAAU,EAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACrG,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAC;AAEtG,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAA0E;IACvH,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;QACxF,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;QACtF,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK;KAC3F,CAAC;IACF,MAAM,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChH,OAAO,OAAO,CAAC;AACjB,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAc;IACxD,IAAI,CAAU,CAAC;IACf,IAAI,CAAC;QAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAAC,CAAC;IACpE,OAAO,CAAC,EAAE,CAAC;QAAC,IAAI,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QAAC,MAAM,CAAC,CAAC;IAAC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;WAC/F,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,cAAc,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;WAC/E,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;WACpF,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;WAC3F,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;WAChH,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;WAC3F,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC;WAChE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACvH,OAAO,CAAsC,CAAC;AAChD,CAAC;AACD,SAAS,YAAY,CAAC,CAAU;IAC9B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;WACxF,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAClI,OAAO,CAAC,CAAC;AACX,CAAC;AACD,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,QAAgB;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAAC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5E,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACnI,OAAO,IAAI,CAAC;AACd,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,MAAc,EAAE,MAAe;IAC3E,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAAC,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IACtF,MAAM,OAAO,GAA2B,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;IAC7F,OAAO,OAAO,CAAC,UAAU,CAAC;IAAC,OAAO,OAAO,CAAC,QAAQ,CAAC;IACnD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC;YAAC,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YACjG,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;gBAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAClF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBAAE,MAAM,CAAC,CAAC;QAAC,CAAC;IAC3C,CAAC;IACD,OAAO,CAAC,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAAC,IAAI,KAAyB,CAAC;IACjG,IAAI,CAAC;QAAC,KAAK,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;IAAC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,CAAC;IAAC,CAAC;IACrF,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,QAAQ,GAAY,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACxG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;eAC1D,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QACnH,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACvG,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAAC,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QAChH,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxG,MAAM,aAAa,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAAC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QACjF,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;YACpG,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAClG,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAAC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAClG,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;YAC9F,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAChG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAAC,OAAO,CAAC,QAAQ,GAAG,YAAY,CAAC;QACjG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,gBAAgB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAAC,MAAM,SAAS,GAAG,GAAG,WAAW,IAAI,UAAU,EAAE,MAAM,CAAC;IAChG,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACjG,MAAM,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,iGAAiG,CAAC,CAAC;IAAC,CAAC;YACrH,CAAC;QAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAAC,CAAC;IAC3D,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli-convert-command.d.ts","sourceRoot":"","sources":["../src/cli-convert-command.ts"],"names":[],"mappings":"AAKA,OAAO,EAA2B,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AA8B5E,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAgBzC,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;;GAIG;AAEH,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,SAOxD,CAAC;AAqHF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,MAAM,KAAG,MAIpD,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,MAAM;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE;QACb,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,wBAAwB,CAAC;QACjC,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,KAAG,MAYH,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,sBAAsB,GAAI,MAAM;IAC3C,MAAM,EAAE,wBAAwB,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB,KAAG,MAMH,CAAC;AAsLF,eAAO,MAAM,oBAAoB,GAC/B,SAAS,SAAS,MAAM,EAAE,EAC1B,OAAO,QAAQ,EACf,SAAS,eAAe,EACxB,eAAc;IACZ,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,2FAA2F;IAC3F,cAAc,CAAC,EAAE,MAAM,CAAC;CACpB,KACL,OAAO,CAAC,IAAI,CAuqBd,CAAC"}
1
+ {"version":3,"file":"cli-convert-command.d.ts","sourceRoot":"","sources":["../src/cli-convert-command.ts"],"names":[],"mappings":"AAKA,OAAO,EAA2B,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AA8B5E,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAgBzC,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;;GAIG;AAEH,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,SAOxD,CAAC;AAqHF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,MAAM,KAAG,MAIpD,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,MAAM;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE;QACb,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,wBAAwB,CAAC;QACjC,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,KAAG,MAYH,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,sBAAsB,GAAI,MAAM;IAC3C,MAAM,EAAE,wBAAwB,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB,KAAG,MAMH,CAAC;AAsLF,eAAO,MAAM,oBAAoB,GAC/B,SAAS,SAAS,MAAM,EAAE,EAC1B,OAAO,QAAQ,EACf,SAAS,eAAe,EACxB,eAAc;IACZ,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,2FAA2F;IAC3F,cAAc,CAAC,EAAE,MAAM,CAAC;CACpB,KACL,OAAO,CAAC,IAAI,CA8qBd,CAAC"}
@@ -14,7 +14,7 @@ import { isCliConversionOutput, } from './conversion-outputs.js';
14
14
  import { recordConvertedImageReceipt } from './conversion-receipt.js';
15
15
  import { materializeResponsiveAlternative } from './responsive-alternative-materializer.js';
16
16
  import { readConversionRecovery, writeConversionRecovery, } from './conversion-recovery.js';
17
- import { isPendingConversionStatus, readConversionStatus, wrongConversionOutputRefusal, } from './conversion-status-contract.js';
17
+ import { isPendingConversionStatus, readConversionStatusObservation, wrongConversionOutputRefusal, } from './conversion-status-contract.js';
18
18
  import { normalizeOptionalIdempotencyKey } from './idempotency-key.js';
19
19
  import { classifyLocalConversionInput, createInputForLocalFile, defaultConversionOutputPath, } from './local-conversion-input.js';
20
20
  import { normalizeImageOutputWidth, parseImageOutputWidth, } from './image-output-width.js';
@@ -870,9 +870,13 @@ export const runConversionCommand = async (command, flags, journal, dependencies
870
870
  const exportDisposition = exportResult
871
871
  ? responsiveAlternativeDisposition(exportResult)
872
872
  : null;
873
+ const exportObservation = exportResult ? null : await readConversionStatusObservation(client, exportOperationId);
873
874
  const exportStatus = exportResult
874
875
  ? exportDisposition ? 'failed' : 'succeeded'
875
- : await readConversionStatus(client, exportOperationId);
876
+ : exportObservation.status;
877
+ const exportReadDetail = exportObservation?.readError
878
+ ? `Status read ${exportObservation.readError.kind === 'http' ? `returned HTTP ${exportObservation.readError.status}` : 'was unavailable'}: ${exportObservation.readError.message}`
879
+ : undefined;
876
880
  const pending = isPendingConversionStatus(exportStatus);
877
881
  const collect = `12ui resume ${exportOperationId} --output html --out <file>`;
878
882
  const report = {
@@ -891,6 +895,7 @@ export const runConversionCommand = async (command, flags, journal, dependencies
891
895
  id: exportOperationId,
892
896
  output: 'html',
893
897
  status: exportStatus,
898
+ ...(exportObservation?.readError ? { readError: exportObservation.readError } : {}),
894
899
  ...(pending ? { nextAction: collect } : { error: exportError }),
895
900
  },
896
901
  };
@@ -958,7 +963,7 @@ export const runConversionCommand = async (command, flags, journal, dependencies
958
963
  {
959
964
  name: 'responsive html',
960
965
  state: exportStatus,
961
- ...(exportError ? { note: exportError } : {}),
966
+ ...((exportObservation?.readError?.message || exportError) ? { note: exportObservation?.readError?.message || exportError || undefined } : {}),
962
967
  },
963
968
  ],
964
969
  spend: spendLine,
@@ -975,8 +980,10 @@ export const runConversionCommand = async (command, flags, journal, dependencies
975
980
  ? `Conversion ${created.id} succeeded and was written to ${outFile}, but responsive export`
976
981
  + ` ${exportOperationId} failed with ${responsiveAlternativeLabel(exportDisposition)};`
977
982
  + ` coverage is recorded in ${exportResult.artifactManifest.manifestFile}.`
978
- : `Conversion ${created.id} succeeded and was written to ${outFile}, but its responsive HTML`
979
- + ` export ${exportOperationId} did not: ${exportError}`);
983
+ : exportStatus === 'unknown'
984
+ ? `Conversion ${created.id} succeeded and was written to ${outFile}. Responsive HTML export ${exportOperationId} has an unknown state. ${exportReadDetail ?? exportError}. Keep this purchase and collect the same export when the read issue is resolved: ${collect}.`
985
+ : `Conversion ${created.id} succeeded and was written to ${outFile}, but its responsive HTML`
986
+ + ` export ${exportOperationId} did not: ${exportError}`);
980
987
  }
981
988
  };
982
989
  //# sourceMappingURL=cli-convert-command.js.map