@12ui/design 0.2.57 → 0.2.59
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.
- package/SKILL.md +1 -1
- package/dist/artifact-materializer.d.ts.map +1 -1
- package/dist/artifact-materializer.js +4 -1
- package/dist/artifact-materializer.js.map +1 -1
- package/dist/atomic-file-replace.d.ts +21 -0
- package/dist/atomic-file-replace.d.ts.map +1 -0
- package/dist/atomic-file-replace.js +48 -0
- package/dist/atomic-file-replace.js.map +1 -0
- package/dist/branch-client.d.ts +84 -2
- package/dist/branch-client.d.ts.map +1 -1
- package/dist/branch-client.js +30 -0
- package/dist/branch-client.js.map +1 -1
- package/dist/cli-arguments.d.ts.map +1 -1
- package/dist/cli-arguments.js +2 -1
- package/dist/cli-arguments.js.map +1 -1
- package/dist/cli-capabilities.d.ts +1 -1
- package/dist/cli-conversion-derivation.d.ts +14 -1
- package/dist/cli-conversion-derivation.d.ts.map +1 -1
- package/dist/cli-conversion-derivation.js +14 -7
- package/dist/cli-conversion-derivation.js.map +1 -1
- package/dist/cli-convert-command.d.ts +2 -0
- package/dist/cli-convert-command.d.ts.map +1 -1
- package/dist/cli-convert-command.js +86 -34
- package/dist/cli-convert-command.js.map +1 -1
- package/dist/cli-corpus-command.d.ts.map +1 -1
- package/dist/cli-corpus-command.js +0 -3
- package/dist/cli-corpus-command.js.map +1 -1
- package/dist/cli-draft-command.d.ts +16 -0
- package/dist/cli-draft-command.d.ts.map +1 -1
- package/dist/cli-draft-command.js +47 -9
- package/dist/cli-draft-command.js.map +1 -1
- package/dist/cli-help/design.d.ts +7 -4
- package/dist/cli-help/design.d.ts.map +1 -1
- package/dist/cli-help/design.js +20 -7
- package/dist/cli-help/design.js.map +1 -1
- package/dist/cli-help/index.d.ts +9 -6
- package/dist/cli-help/index.d.ts.map +1 -1
- package/dist/cli-help/meta.d.ts +2 -2
- package/dist/cli-help/meta.d.ts.map +1 -1
- package/dist/cli-help/meta.js +4 -1
- package/dist/cli-help/meta.js.map +1 -1
- package/dist/cli-improve-command.d.ts.map +1 -1
- package/dist/cli-improve-command.js +215 -33
- package/dist/cli-improve-command.js.map +1 -1
- package/dist/cli-redesign-command.d.ts.map +1 -1
- package/dist/cli-redesign-command.js +268 -156
- package/dist/cli-redesign-command.js.map +1 -1
- package/dist/cli-run.d.ts.map +1 -1
- package/dist/cli-run.js +13 -3
- package/dist/cli-run.js.map +1 -1
- package/dist/cli-spend-command.d.ts +12 -1
- package/dist/cli-spend-command.d.ts.map +1 -1
- package/dist/cli-spend-command.js +94 -2
- package/dist/cli-spend-command.js.map +1 -1
- package/dist/cli-usage.js +5 -5
- package/dist/cli-usage.js.map +1 -1
- package/dist/concept-input.d.ts +6 -77
- package/dist/concept-input.d.ts.map +1 -1
- package/dist/concept-input.js +6 -87
- package/dist/concept-input.js.map +1 -1
- package/dist/conversion-client.d.ts +106 -17
- package/dist/conversion-client.d.ts.map +1 -1
- package/dist/conversion-client.js +244 -80
- package/dist/conversion-client.js.map +1 -1
- package/dist/corpus-client.d.ts.map +1 -1
- package/dist/corpus-client.js +0 -3
- package/dist/corpus-client.js.map +1 -1
- package/dist/draft-identity.d.ts +7 -0
- package/dist/draft-identity.d.ts.map +1 -1
- package/dist/draft-identity.js +4 -0
- package/dist/draft-identity.js.map +1 -1
- package/dist/draft-run.d.ts +13 -0
- package/dist/draft-run.d.ts.map +1 -1
- package/dist/draft-run.js +20 -2
- package/dist/draft-run.js.map +1 -1
- package/dist/draft-workspace.d.ts +4 -0
- package/dist/draft-workspace.d.ts.map +1 -1
- package/dist/draft-workspace.js.map +1 -1
- package/dist/hosted-draft-identity.d.ts +18 -0
- package/dist/hosted-draft-identity.d.ts.map +1 -1
- package/dist/hosted-draft-identity.js +8 -0
- package/dist/hosted-draft-identity.js.map +1 -1
- package/dist/hosted-draft-run.d.ts +15 -0
- package/dist/hosted-draft-run.d.ts.map +1 -1
- package/dist/hosted-draft-run.js +27 -0
- package/dist/hosted-draft-run.js.map +1 -1
- package/dist/improve-added-specs.d.ts +12 -40
- package/dist/improve-added-specs.d.ts.map +1 -1
- package/dist/improve-added-specs.js +63 -172
- package/dist/improve-added-specs.js.map +1 -1
- package/dist/improve-artifact-writer.d.ts +13 -0
- package/dist/improve-artifact-writer.d.ts.map +1 -0
- package/dist/improve-artifact-writer.js +27 -0
- package/dist/improve-artifact-writer.js.map +1 -0
- package/dist/improve-bootstrap-history.d.ts +21 -0
- package/dist/improve-bootstrap-history.d.ts.map +1 -0
- package/dist/improve-bootstrap-history.js +43 -0
- package/dist/improve-bootstrap-history.js.map +1 -0
- package/dist/improve-branch-stage.d.ts +10 -0
- package/dist/improve-branch-stage.d.ts.map +1 -0
- package/dist/improve-branch-stage.js +325 -0
- package/dist/improve-branch-stage.js.map +1 -0
- package/dist/improve-capture-redirect.d.ts +19 -0
- package/dist/improve-capture-redirect.d.ts.map +1 -1
- package/dist/improve-capture-redirect.js +18 -1
- package/dist/improve-capture-redirect.js.map +1 -1
- package/dist/improve-capture-words.d.ts +43 -0
- package/dist/improve-capture-words.d.ts.map +1 -0
- package/dist/improve-capture-words.js +25 -0
- package/dist/improve-capture-words.js.map +1 -0
- package/dist/improve-concept.d.ts +6 -20
- package/dist/improve-concept.d.ts.map +1 -1
- package/dist/improve-concept.js +12 -59
- package/dist/improve-concept.js.map +1 -1
- package/dist/improve-conversion-attempts.d.ts +12 -4
- package/dist/improve-conversion-attempts.d.ts.map +1 -1
- package/dist/improve-conversion-attempts.js.map +1 -1
- package/dist/improve-conversion-stage.d.ts +13 -2
- package/dist/improve-conversion-stage.d.ts.map +1 -1
- package/dist/improve-conversion-stage.js +211 -20
- package/dist/improve-conversion-stage.js.map +1 -1
- package/dist/improve-convert-progress.d.ts +10 -2
- package/dist/improve-convert-progress.d.ts.map +1 -1
- package/dist/improve-convert-progress.js +7 -3
- package/dist/improve-convert-progress.js.map +1 -1
- package/dist/improve-convert-resilience.d.ts +60 -13
- package/dist/improve-convert-resilience.d.ts.map +1 -1
- package/dist/improve-convert-resilience.js +85 -22
- package/dist/improve-convert-resilience.js.map +1 -1
- package/dist/improve-core/concept-input.d.ts +80 -0
- package/dist/improve-core/concept-input.d.ts.map +1 -0
- package/dist/improve-core/concept-input.js +92 -0
- package/dist/improve-core/concept-input.js.map +1 -0
- package/dist/improve-core/improve-added-specs.d.ts +62 -0
- package/dist/improve-core/improve-added-specs.d.ts.map +1 -0
- package/dist/improve-core/improve-added-specs.js +160 -0
- package/dist/improve-core/improve-added-specs.js.map +1 -0
- package/dist/improve-core/improve-artifacts.d.ts +18 -0
- package/dist/improve-core/improve-artifacts.d.ts.map +1 -0
- package/dist/improve-core/improve-artifacts.js +4 -0
- package/dist/improve-core/improve-artifacts.js.map +1 -0
- package/dist/improve-core/improve-concept.d.ts +11 -0
- package/dist/improve-core/improve-concept.d.ts.map +1 -0
- package/dist/improve-core/improve-concept.js +190 -0
- package/dist/improve-core/improve-concept.js.map +1 -0
- package/dist/improve-core/improve-discovery.d.ts +84 -0
- package/dist/improve-core/improve-discovery.d.ts.map +1 -0
- package/dist/improve-core/improve-discovery.js +154 -0
- package/dist/improve-core/improve-discovery.js.map +1 -0
- package/dist/improve-core/improve-dom-anchor.d.ts.map +1 -0
- package/dist/{improve-dom-anchor.js → improve-core/improve-dom-anchor.js} +2 -0
- package/dist/improve-core/improve-dom-anchor.js.map +1 -0
- package/dist/improve-core/improve-dom-diff.d.ts +59 -0
- package/dist/improve-core/improve-dom-diff.d.ts.map +1 -0
- package/dist/improve-core/improve-dom-diff.js +151 -0
- package/dist/improve-core/improve-dom-diff.js.map +1 -0
- package/dist/improve-core/improve-dom-extract.d.ts.map +1 -0
- package/dist/{improve-dom-extract.js → improve-core/improve-dom-extract.js} +2 -0
- package/dist/improve-core/improve-dom-extract.js.map +1 -0
- package/dist/improve-core/improve-dom-gate.d.ts +49 -0
- package/dist/improve-core/improve-dom-gate.d.ts.map +1 -0
- package/dist/improve-core/improve-dom-gate.js +99 -0
- package/dist/improve-core/improve-dom-gate.js.map +1 -0
- package/dist/improve-core/improve-dom-neighbour.d.ts.map +1 -0
- package/dist/{improve-dom-neighbour.js → improve-core/improve-dom-neighbour.js} +2 -0
- package/dist/improve-core/improve-dom-neighbour.js.map +1 -0
- package/dist/improve-core/improve-dom-scale.d.ts.map +1 -0
- package/dist/{improve-dom-scale.js → improve-core/improve-dom-scale.js} +2 -0
- package/dist/improve-core/improve-dom-scale.js.map +1 -0
- package/dist/improve-core/improve-icon-svg.d.ts +29 -0
- package/dist/improve-core/improve-icon-svg.d.ts.map +1 -0
- package/dist/{improve-icon-svg.js → improve-core/improve-icon-svg.js} +2 -0
- package/dist/improve-core/improve-icon-svg.js.map +1 -0
- package/dist/improve-core/improve-kit-asset-model.d.ts +177 -0
- package/dist/improve-core/improve-kit-asset-model.d.ts.map +1 -0
- package/dist/improve-core/improve-kit-asset-model.js +269 -0
- package/dist/improve-core/improve-kit-asset-model.js.map +1 -0
- package/dist/improve-core/improve-layerdoc-diff.d.ts.map +1 -0
- package/dist/{improve-layerdoc-diff.js → improve-core/improve-layerdoc-diff.js} +2 -0
- package/dist/improve-core/improve-layerdoc-diff.js.map +1 -0
- package/dist/{improve-layerdoc-types.d.ts → improve-core/improve-layerdoc-types.d.ts} +9 -0
- package/dist/improve-core/improve-layerdoc-types.d.ts.map +1 -0
- package/dist/improve-core/improve-layerdoc-types.js +4 -0
- package/dist/improve-core/improve-layerdoc-types.js.map +1 -0
- package/dist/improve-core/improve-page-words.d.ts +180 -0
- package/dist/improve-core/improve-page-words.d.ts.map +1 -0
- package/dist/improve-core/improve-page-words.js +303 -0
- package/dist/improve-core/improve-page-words.js.map +1 -0
- package/dist/{improve-plan-annotated-render.d.ts → improve-core/improve-plan-annotated-render.d.ts} +6 -1
- package/dist/improve-core/improve-plan-annotated-render.d.ts.map +1 -0
- package/dist/{improve-plan-annotated-render.js → improve-core/improve-plan-annotated-render.js} +56 -28
- package/dist/{improve-plan-annotated-render.js.map → improve-core/improve-plan-annotated-render.js.map} +1 -1
- package/dist/improve-core/improve-plan-annotator.d.ts +34 -0
- package/dist/improve-core/improve-plan-annotator.d.ts.map +1 -0
- package/dist/improve-core/improve-plan-annotator.js +52 -0
- package/dist/improve-core/improve-plan-annotator.js.map +1 -0
- package/dist/{improve-plan-render.d.ts → improve-core/improve-plan-render.d.ts} +2 -1
- package/dist/improve-core/improve-plan-render.d.ts.map +1 -0
- package/dist/{improve-plan-render.js → improve-core/improve-plan-render.js} +7 -1
- package/dist/improve-core/improve-plan-render.js.map +1 -0
- package/dist/improve-core/improve-plan-vector-keep.d.ts +29 -0
- package/dist/improve-core/improve-plan-vector-keep.d.ts.map +1 -0
- package/dist/improve-core/improve-plan-vector-keep.js +68 -0
- package/dist/improve-core/improve-plan-vector-keep.js.map +1 -0
- package/dist/{improve-raster-layers-section.d.ts → improve-core/improve-raster-layers-section.d.ts} +9 -1
- package/dist/improve-core/improve-raster-layers-section.d.ts.map +1 -0
- package/dist/{improve-raster-layers-section.js → improve-core/improve-raster-layers-section.js} +5 -2
- package/dist/improve-core/improve-raster-layers-section.js.map +1 -0
- package/dist/improve-core/improve-refusal.d.ts +6 -0
- package/dist/improve-core/improve-refusal.d.ts.map +1 -0
- package/dist/improve-core/improve-refusal.js +27 -0
- package/dist/improve-core/improve-refusal.js.map +1 -0
- package/dist/improve-core/improve-retain.d.ts +121 -0
- package/dist/improve-core/improve-retain.d.ts.map +1 -0
- package/dist/improve-core/improve-retain.js +115 -0
- package/dist/improve-core/improve-retain.js.map +1 -0
- package/dist/improve-core/improve-site-plan.d.ts +75 -0
- package/dist/improve-core/improve-site-plan.d.ts.map +1 -0
- package/dist/improve-core/improve-site-plan.js +135 -0
- package/dist/improve-core/improve-site-plan.js.map +1 -0
- package/dist/improve-core/improve-site-shell.d.ts +56 -0
- package/dist/improve-core/improve-site-shell.d.ts.map +1 -0
- package/dist/improve-core/improve-site-shell.js +152 -0
- package/dist/improve-core/improve-site-shell.js.map +1 -0
- package/dist/improve-core/improve-site-tokens.d.ts +44 -0
- package/dist/improve-core/improve-site-tokens.d.ts.map +1 -0
- package/dist/improve-core/improve-site-tokens.js +87 -0
- package/dist/improve-core/improve-site-tokens.js.map +1 -0
- package/dist/improve-core/improve-source-hints.d.ts +25 -0
- package/dist/improve-core/improve-source-hints.d.ts.map +1 -0
- package/dist/improve-core/improve-source-hints.js +17 -0
- package/dist/improve-core/improve-source-hints.js.map +1 -0
- package/dist/improve-core/improve-token-patch.d.ts.map +1 -0
- package/dist/{improve-token-patch.js → improve-core/improve-token-patch.js} +2 -0
- package/dist/improve-core/improve-token-patch.js.map +1 -0
- package/dist/improve-core/index.d.ts +47 -0
- package/dist/improve-core/index.d.ts.map +1 -0
- package/dist/improve-core/index.js +49 -0
- package/dist/improve-core/index.js.map +1 -0
- package/dist/improve-delivery-stages.d.ts +6 -0
- package/dist/improve-delivery-stages.d.ts.map +1 -1
- package/dist/improve-delivery-stages.js +87 -6
- package/dist/improve-delivery-stages.js.map +1 -1
- package/dist/improve-dom-diff.d.ts +8 -24
- package/dist/improve-dom-diff.d.ts.map +1 -1
- package/dist/improve-dom-diff.js +23 -123
- package/dist/improve-dom-diff.js.map +1 -1
- package/dist/improve-dom-gate.d.ts +1 -18
- package/dist/improve-dom-gate.d.ts.map +1 -1
- package/dist/improve-dom-gate.js +1 -46
- package/dist/improve-dom-gate.js.map +1 -1
- package/dist/improve-generation-stages.d.ts +0 -2
- package/dist/improve-generation-stages.d.ts.map +1 -1
- package/dist/improve-generation-stages.js +162 -15
- package/dist/improve-generation-stages.js.map +1 -1
- package/dist/improve-kit-assets.d.ts +8 -116
- package/dist/improve-kit-assets.d.ts.map +1 -1
- package/dist/improve-kit-assets.js +9 -229
- package/dist/improve-kit-assets.js.map +1 -1
- package/dist/improve-kit-readme.d.ts +4 -0
- package/dist/improve-kit-readme.d.ts.map +1 -1
- package/dist/improve-kit-readme.js +57 -16
- package/dist/improve-kit-readme.js.map +1 -1
- package/dist/improve-kit-stall.d.ts +3 -1
- package/dist/improve-kit-stall.d.ts.map +1 -1
- package/dist/improve-kit-stall.js +46 -14
- package/dist/improve-kit-stall.js.map +1 -1
- package/dist/improve-kit-status.d.ts.map +1 -1
- package/dist/improve-kit-status.js +8 -3
- package/dist/improve-kit-status.js.map +1 -1
- package/dist/improve-options.d.ts +8 -0
- package/dist/improve-options.d.ts.map +1 -1
- package/dist/improve-options.js +92 -12
- package/dist/improve-options.js.map +1 -1
- package/dist/improve-passthrough-flags.d.ts +8 -0
- package/dist/improve-passthrough-flags.d.ts.map +1 -0
- package/dist/improve-passthrough-flags.js +11 -0
- package/dist/improve-passthrough-flags.js.map +1 -0
- package/dist/improve-plan-annotator.d.ts +8 -2
- package/dist/improve-plan-annotator.d.ts.map +1 -1
- package/dist/improve-plan-annotator.js +35 -38
- package/dist/improve-plan-annotator.js.map +1 -1
- package/dist/improve-pricing-plan.d.ts +3 -0
- package/dist/improve-pricing-plan.d.ts.map +1 -1
- package/dist/improve-pricing-plan.js +33 -5
- package/dist/improve-pricing-plan.js.map +1 -1
- package/dist/improve-recheck.d.ts +9 -0
- package/dist/improve-recheck.d.ts.map +1 -0
- package/dist/improve-recheck.js +200 -0
- package/dist/improve-recheck.js.map +1 -0
- package/dist/improve-reset.d.ts.map +1 -1
- package/dist/improve-reset.js +11 -0
- package/dist/improve-reset.js.map +1 -1
- package/dist/improve-run-summary.d.ts +6 -0
- package/dist/improve-run-summary.d.ts.map +1 -1
- package/dist/improve-run-summary.js +29 -5
- package/dist/improve-run-summary.js.map +1 -1
- package/dist/improve-site-plan.d.ts +57 -0
- package/dist/improve-site-plan.d.ts.map +1 -0
- package/dist/improve-site-plan.js +79 -0
- package/dist/improve-site-plan.js.map +1 -0
- package/dist/improve-site-shell.d.ts +11 -0
- package/dist/improve-site-shell.d.ts.map +1 -0
- package/dist/improve-site-shell.js +24 -0
- package/dist/improve-site-shell.js.map +1 -0
- package/dist/improve-site-stage.d.ts +10 -0
- package/dist/improve-site-stage.d.ts.map +1 -0
- package/dist/improve-site-stage.js +84 -0
- package/dist/improve-site-stage.js.map +1 -0
- package/dist/improve-site-tokens.d.ts +9 -0
- package/dist/improve-site-tokens.d.ts.map +1 -0
- package/dist/improve-site-tokens.js +17 -0
- package/dist/improve-site-tokens.js.map +1 -0
- package/dist/improve-source-hints.d.ts +3 -12
- package/dist/improve-source-hints.d.ts.map +1 -1
- package/dist/improve-source-hints.js +4 -5
- package/dist/improve-source-hints.js.map +1 -1
- package/dist/improve-spend-ledger.d.ts +69 -0
- package/dist/improve-spend-ledger.d.ts.map +1 -0
- package/dist/improve-spend-ledger.js +118 -0
- package/dist/improve-spend-ledger.js.map +1 -0
- package/dist/improve-stage-runners.d.ts +5 -2
- package/dist/improve-stage-runners.d.ts.map +1 -1
- package/dist/improve-stage-runners.js +5 -2
- package/dist/improve-stage-runners.js.map +1 -1
- package/dist/improve-stage-shared.d.ts +10 -1
- package/dist/improve-stage-shared.d.ts.map +1 -1
- package/dist/improve-stage-shared.js.map +1 -1
- package/dist/improve-stop-handler.d.ts +15 -0
- package/dist/improve-stop-handler.d.ts.map +1 -1
- package/dist/improve-stop-handler.js +74 -3
- package/dist/improve-stop-handler.js.map +1 -1
- package/dist/improve-terminal-event.d.ts.map +1 -1
- package/dist/improve-terminal-event.js +7 -4
- package/dist/improve-terminal-event.js.map +1 -1
- package/dist/improve-workspace.d.ts +198 -2
- package/dist/improve-workspace.d.ts.map +1 -1
- package/dist/improve-workspace.js +249 -92
- package/dist/improve-workspace.js.map +1 -1
- package/dist/legacy-skill-catalog.d.ts.map +1 -1
- package/dist/legacy-skill-catalog.js +79 -0
- package/dist/legacy-skill-catalog.js.map +1 -1
- package/dist/mcp-convert.js +1 -1
- package/dist/mcp-convert.js.map +1 -1
- package/dist/mcp-tool-definitions.js +1 -1
- package/dist/mcp-tool-definitions.js.map +1 -1
- package/dist/mcp-tool-handler.d.ts.map +1 -1
- package/dist/mcp-tool-handler.js +0 -3
- package/dist/mcp-tool-handler.js.map +1 -1
- package/dist/redesign-branch-adoption.d.ts +29 -0
- package/dist/redesign-branch-adoption.d.ts.map +1 -0
- package/dist/redesign-branch-adoption.js +183 -0
- package/dist/redesign-branch-adoption.js.map +1 -0
- package/dist/redesign-branch-identity.d.ts +23 -0
- package/dist/redesign-branch-identity.d.ts.map +1 -0
- package/dist/redesign-branch-identity.js +27 -0
- package/dist/redesign-branch-identity.js.map +1 -0
- package/dist/redesign-branch-record-verification.d.ts +51 -0
- package/dist/redesign-branch-record-verification.d.ts.map +1 -0
- package/dist/redesign-branch-record-verification.js +127 -0
- package/dist/redesign-branch-record-verification.js.map +1 -0
- package/dist/redesign-branch-stage.d.ts +17 -0
- package/dist/redesign-branch-stage.d.ts.map +1 -0
- package/dist/redesign-branch-stage.js +218 -0
- package/dist/redesign-branch-stage.js.map +1 -0
- package/dist/redesign-capture.d.ts +145 -15
- package/dist/redesign-capture.d.ts.map +1 -1
- package/dist/redesign-capture.js +182 -71
- package/dist/redesign-capture.js.map +1 -1
- package/dist/redesign-page-candidates.d.ts +40 -0
- package/dist/redesign-page-candidates.d.ts.map +1 -0
- package/dist/redesign-page-candidates.js +131 -0
- package/dist/redesign-page-candidates.js.map +1 -0
- package/dist/redesign-page-ownership.d.ts +36 -0
- package/dist/redesign-page-ownership.d.ts.map +1 -0
- package/dist/redesign-page-ownership.js +174 -0
- package/dist/redesign-page-ownership.js.map +1 -0
- package/dist/redesign-plan-identity.d.ts +3 -1
- package/dist/redesign-plan-identity.d.ts.map +1 -1
- package/dist/redesign-plan-identity.js +4 -1
- package/dist/redesign-plan-identity.js.map +1 -1
- package/dist/redesign-plan.d.ts.map +1 -1
- package/dist/redesign-plan.js +12 -6
- package/dist/redesign-plan.js.map +1 -1
- package/dist/redesign-record-validation.d.ts +4 -0
- package/dist/redesign-record-validation.d.ts.map +1 -0
- package/dist/redesign-record-validation.js +210 -0
- package/dist/redesign-record-validation.js.map +1 -0
- package/dist/redesign-workspace.d.ts +43 -5
- package/dist/redesign-workspace.d.ts.map +1 -1
- package/dist/redesign-workspace.js +66 -7
- package/dist/redesign-workspace.js.map +1 -1
- package/dist/responsive-alternative-materializer.d.ts +8 -3
- package/dist/responsive-alternative-materializer.d.ts.map +1 -1
- package/dist/responsive-alternative-materializer.js +68 -51
- package/dist/responsive-alternative-materializer.js.map +1 -1
- package/dist/result-integrity.d.ts +38 -0
- package/dist/result-integrity.d.ts.map +1 -0
- package/dist/result-integrity.js +46 -0
- package/dist/result-integrity.js.map +1 -0
- package/dist/review-edit-source.d.ts.map +1 -1
- package/dist/review-edit-source.js +6 -2
- package/dist/review-edit-source.js.map +1 -1
- package/dist/review-edit.js +2 -2
- package/dist/review-edit.js.map +1 -1
- package/dist/review-prototype-gap.js +1 -1
- package/dist/review-prototype-gap.js.map +1 -1
- package/dist/run-journal.d.ts +3 -1
- package/dist/run-journal.d.ts.map +1 -1
- package/dist/run-journal.js +7 -1
- package/dist/run-journal.js.map +1 -1
- package/dist/spend-run-filter.d.ts +21 -0
- package/dist/spend-run-filter.d.ts.map +1 -0
- package/dist/spend-run-filter.js +67 -0
- package/dist/spend-run-filter.js.map +1 -0
- package/dist/spend-scoped-report-lines.d.ts +4 -0
- package/dist/spend-scoped-report-lines.d.ts.map +1 -0
- package/dist/spend-scoped-report-lines.js +46 -0
- package/dist/spend-scoped-report-lines.js.map +1 -0
- package/dist/spend-scoped-report.d.ts +28 -0
- package/dist/spend-scoped-report.d.ts.map +1 -0
- package/dist/spend-scoped-report.js +45 -0
- package/dist/spend-scoped-report.js.map +1 -0
- package/open-design.json +2 -2
- package/package.json +5 -5
- package/skills/12ui-design/SKILL.md +8 -4
- package/skills/12ui-design/improve.md +50 -3
- package/dist/improve-dom-anchor.d.ts.map +0 -1
- package/dist/improve-dom-anchor.js.map +0 -1
- package/dist/improve-dom-extract.d.ts.map +0 -1
- package/dist/improve-dom-extract.js.map +0 -1
- package/dist/improve-dom-neighbour.d.ts.map +0 -1
- package/dist/improve-dom-neighbour.js.map +0 -1
- package/dist/improve-dom-scale.d.ts.map +0 -1
- package/dist/improve-dom-scale.js.map +0 -1
- package/dist/improve-icon-svg.d.ts +0 -47
- package/dist/improve-icon-svg.d.ts.map +0 -1
- package/dist/improve-icon-svg.js.map +0 -1
- package/dist/improve-layerdoc-diff.d.ts.map +0 -1
- package/dist/improve-layerdoc-diff.js.map +0 -1
- package/dist/improve-layerdoc-types.d.ts.map +0 -1
- package/dist/improve-layerdoc-types.js +0 -2
- package/dist/improve-layerdoc-types.js.map +0 -1
- package/dist/improve-plan-annotated-render.d.ts.map +0 -1
- package/dist/improve-plan-render.d.ts.map +0 -1
- package/dist/improve-plan-render.js.map +0 -1
- package/dist/improve-raster-layers-section.d.ts.map +0 -1
- package/dist/improve-raster-layers-section.js.map +0 -1
- package/dist/improve-token-patch.d.ts.map +0 -1
- package/dist/improve-token-patch.js.map +0 -1
- /package/dist/{improve-dom-anchor.d.ts → improve-core/improve-dom-anchor.d.ts} +0 -0
- /package/dist/{improve-dom-extract.d.ts → improve-core/improve-dom-extract.d.ts} +0 -0
- /package/dist/{improve-dom-neighbour.d.ts → improve-core/improve-dom-neighbour.d.ts} +0 -0
- /package/dist/{improve-dom-scale.d.ts → improve-core/improve-dom-scale.d.ts} +0 -0
- /package/dist/{improve-layerdoc-diff.d.ts → improve-core/improve-layerdoc-diff.d.ts} +0 -0
- /package/dist/{improve-token-patch.d.ts → improve-core/improve-token-patch.d.ts} +0 -0
|
@@ -7,6 +7,33 @@ export type { ConversionOutput } from './conversion-outputs.js';
|
|
|
7
7
|
export type ConversionStatus = 'queued' | 'running' | 'succeeded' | 'failed' | 'expired';
|
|
8
8
|
export declare const LAYERDOC_V2_MEDIA_TYPE: "application/vnd.12ui.layerdoc+json;version=2";
|
|
9
9
|
export declare const MAX_LAYERDOC_INPUT_BYTES: number;
|
|
10
|
+
/**
|
|
11
|
+
* How long a running operation's published heartbeat may lag before the client
|
|
12
|
+
* DESCRIBES the wait that just ended as stalled rather than merely unfinished.
|
|
13
|
+
*
|
|
14
|
+
* This is a sentence, never a deadline. It was a deadline until 2026-09-04, on
|
|
15
|
+
* the premise stated here — that it matched the deployed watchdog — and that
|
|
16
|
+
* premise is false in both directions:
|
|
17
|
+
*
|
|
18
|
+
* - The server's reclaim window for a stage holding an in-flight paid effect
|
|
19
|
+
* is `max(image timeout, text timeout) + STAGE_SILENCE_CEILING_MS`
|
|
20
|
+
* (`workers/api/src/conversion/stageLeaseRecovery.ts`), which is 515s in
|
|
21
|
+
* production. `CONVERSION_STAGE_STALE_MS = 180000` stopped deciding that
|
|
22
|
+
* window on 2026-08-06. Three minutes is inside the window, not at it.
|
|
23
|
+
* - A parent awaiting child conversions publishes no heartbeat at all:
|
|
24
|
+
* `deferStageForDependencies` parks its stage `queued`, so
|
|
25
|
+
* `heartbeatStageLease`'s `status = 'running'` guard stops matching the run
|
|
26
|
+
* row for the whole dependency wait. The measured median child conversion
|
|
27
|
+
* is 243s, so more than half of those waits look silent for longer than
|
|
28
|
+
* three minutes while the run is perfectly healthy.
|
|
29
|
+
*
|
|
30
|
+
* Both windows are also env-derived per deployment, so no constant compiled
|
|
31
|
+
* into a client can track them. `updated_at` age therefore cannot tell a dead
|
|
32
|
+
* run from a healthy quiet one, and this module no longer asks it to: the
|
|
33
|
+
* caller's own bound ends the wait, and this threshold only decides which true
|
|
34
|
+
* sentence the caller is handed when it does.
|
|
35
|
+
*/
|
|
36
|
+
export declare const CONVERSION_RUNNING_STALE_MS: number;
|
|
10
37
|
export type ConversionRevisionBoundary = {
|
|
11
38
|
kind: 'pipeline' | 'package';
|
|
12
39
|
admitted_pipeline_revision?: string;
|
|
@@ -36,7 +63,6 @@ export type ConversionArtifact = {
|
|
|
36
63
|
width?: number;
|
|
37
64
|
height?: number;
|
|
38
65
|
};
|
|
39
|
-
export declare const RESPONSIVE_PARTIAL_HTML_MANIFEST_MEDIA_TYPE: "application/vnd.12ui.responsive-html-band-manifest+json;version=1";
|
|
40
66
|
export type ResponsiveArtifactCoverageBand = {
|
|
41
67
|
anchor_id: 'mobile' | 'tablet' | 'compact-desktop';
|
|
42
68
|
viewport_width: number;
|
|
@@ -46,19 +72,28 @@ export type ResponsiveArtifactCoverage = {
|
|
|
46
72
|
landed: ResponsiveArtifactCoverageBand[];
|
|
47
73
|
missing: ResponsiveArtifactCoverageBand[];
|
|
48
74
|
};
|
|
75
|
+
/**
|
|
76
|
+
* The verified fixed page a responsive run falls back to when NO planned band
|
|
77
|
+
* landed. A run that landed at least one band ships degraded instead and
|
|
78
|
+
* carries `responsive_coverage`, so there is no partial variant here.
|
|
79
|
+
*/
|
|
49
80
|
export type ResponsiveHtmlAlternative = {
|
|
50
|
-
disposition: 'partial_responsive';
|
|
51
|
-
media_type: typeof RESPONSIVE_PARTIAL_HTML_MANIFEST_MEDIA_TYPE;
|
|
52
|
-
coverage: ResponsiveArtifactCoverage;
|
|
53
|
-
bands: Array<ResponsiveArtifactCoverageBand & {
|
|
54
|
-
artifact: ConversionArtifact;
|
|
55
|
-
}>;
|
|
56
|
-
} | {
|
|
57
81
|
disposition: 'fixed_html_alternative';
|
|
58
82
|
media_type: typeof CONVERSION_OUTPUT_MEDIA_TYPES.html_fixed;
|
|
59
83
|
coverage: ResponsiveArtifactCoverage;
|
|
60
84
|
artifact: ConversionArtifact;
|
|
61
85
|
};
|
|
86
|
+
/** What a SUCCEEDED responsive export says about itself when it shipped with
|
|
87
|
+
* fewer layouts than planned. Absent means every planned layout landed. */
|
|
88
|
+
export type ResponsiveCoverageDisclosure = {
|
|
89
|
+
revision: 'responsive-coverage-disclosure-v1';
|
|
90
|
+
complete: false;
|
|
91
|
+
planned: ResponsiveArtifactCoverageBand[];
|
|
92
|
+
landed: ResponsiveArtifactCoverageBand[];
|
|
93
|
+
missing: ResponsiveArtifactCoverageBand[];
|
|
94
|
+
headline: string;
|
|
95
|
+
detail: string;
|
|
96
|
+
};
|
|
62
97
|
export type ResponsiveConversionPreviewFrame = {
|
|
63
98
|
id: 'mobile' | 'tablet' | 'compact-desktop';
|
|
64
99
|
viewport_width: number;
|
|
@@ -100,6 +135,13 @@ export type ConversionHistory = {
|
|
|
100
135
|
type ConversionResultBase = {
|
|
101
136
|
media_type: string;
|
|
102
137
|
artifacts: ConversionArtifact[];
|
|
138
|
+
/**
|
|
139
|
+
* SHA-256 and byte length of the exact body the result `href` serves. Both
|
|
140
|
+
* are absent together on a service deployed before result digests existed;
|
|
141
|
+
* `publishedResultIntegrity` is the one reader of the pair.
|
|
142
|
+
*/
|
|
143
|
+
sha256?: string;
|
|
144
|
+
size_bytes?: number;
|
|
103
145
|
[key: string]: unknown;
|
|
104
146
|
};
|
|
105
147
|
export type ConversionResult = ConversionResultBase & ({
|
|
@@ -185,6 +227,8 @@ export type ConversionOperation = {
|
|
|
185
227
|
error?: ConversionProblem;
|
|
186
228
|
result?: ConversionResult;
|
|
187
229
|
responsive_alternative?: ResponsiveHtmlAlternative;
|
|
230
|
+
/** Present exactly when a succeeded responsive export shipped degraded. */
|
|
231
|
+
responsive_coverage?: ResponsiveCoverageDisclosure;
|
|
188
232
|
};
|
|
189
233
|
export type ConversionClientOptions = {
|
|
190
234
|
origin: string;
|
|
@@ -193,7 +237,29 @@ export type ConversionClientOptions = {
|
|
|
193
237
|
};
|
|
194
238
|
export type ConversionWaitOptions = {
|
|
195
239
|
intervalMs?: number;
|
|
240
|
+
/**
|
|
241
|
+
* An overall client-side wall clock. This is deliberately distinct from the
|
|
242
|
+
* liveness policy below: callers that know a conversion remains live can
|
|
243
|
+
* keep collecting it without treating a healthy long wall as a failed
|
|
244
|
+
* purchase. Absent, and with no `stallTimeoutMs` either, the wait runs the
|
|
245
|
+
* default wall below.
|
|
246
|
+
*/
|
|
196
247
|
timeoutMs?: number;
|
|
248
|
+
/**
|
|
249
|
+
* The optional no-progress portion of this client's single wait policy:
|
|
250
|
+
* terminal results settle immediately; each fresh non-304 running stage or
|
|
251
|
+
* active-lane observation resets this bound. Queued work has no liveness
|
|
252
|
+
* fact, so it expires at this bound. A caller that sets it is saying it will
|
|
253
|
+
* wait for as long as the service keeps showing progress, so it takes no
|
|
254
|
+
* default wall — only `expiresAt` caps it.
|
|
255
|
+
*/
|
|
256
|
+
stallTimeoutMs?: number;
|
|
257
|
+
/**
|
|
258
|
+
* When the operation's result stops being collectable. It CAPS the wall; it
|
|
259
|
+
* never supplies one. It is a seven-day artifact retention horizon, not a
|
|
260
|
+
* measure of anyone's patience, and reading it as a wall left every caller
|
|
261
|
+
* that passes it — which is all of them — with no effective wall at all.
|
|
262
|
+
*/
|
|
197
263
|
expiresAt?: string;
|
|
198
264
|
signal?: AbortSignal;
|
|
199
265
|
/**
|
|
@@ -299,13 +365,6 @@ export type ConversionDownload = {
|
|
|
299
365
|
mediaType: string;
|
|
300
366
|
};
|
|
301
367
|
export type DownloadedResponsiveHtmlAlternative = {
|
|
302
|
-
disposition: 'partial_responsive';
|
|
303
|
-
coverage: ResponsiveArtifactCoverage;
|
|
304
|
-
bands: Array<ResponsiveArtifactCoverageBand & {
|
|
305
|
-
artifact: ConversionArtifact;
|
|
306
|
-
download: ConversionDownload;
|
|
307
|
-
}>;
|
|
308
|
-
} | {
|
|
309
368
|
disposition: 'fixed_html_alternative';
|
|
310
369
|
coverage: ResponsiveArtifactCoverage;
|
|
311
370
|
artifact: ConversionArtifact;
|
|
@@ -317,6 +376,26 @@ export declare class ConversionClientError extends Error {
|
|
|
317
376
|
readonly retryAfterMs: number | null;
|
|
318
377
|
constructor(message: string, status: number, problem: ConversionProblem, retryAfterMs: number | null);
|
|
319
378
|
}
|
|
379
|
+
/**
|
|
380
|
+
* The caller's wait ended while the operation was still running and quiet.
|
|
381
|
+
*
|
|
382
|
+
* This is a description of the wait, not a verdict on the run. The run is
|
|
383
|
+
* recoverable from its own durable record, and callers must not create another
|
|
384
|
+
* paid conversion to escape it. The previous wording promised the reader that
|
|
385
|
+
* "the server watchdog" would "record recovery"; on the 2026-09-03 population
|
|
386
|
+
* there was nothing to recover — the runs were mid-dependency-wait and settled
|
|
387
|
+
* on their own — and the client exiting was the only thing that stopped anyone
|
|
388
|
+
* collecting them.
|
|
389
|
+
*/
|
|
390
|
+
export declare class ConversionStalledError extends Error {
|
|
391
|
+
readonly operation: ConversionOperation;
|
|
392
|
+
readonly heartbeatAgeMs: number;
|
|
393
|
+
constructor(operation: ConversionOperation, heartbeatAgeMs: number);
|
|
394
|
+
}
|
|
395
|
+
/** Only a running operation owns a heartbeat. Queued work is admission state,
|
|
396
|
+
* not evidence that a stage isolate disappeared. */
|
|
397
|
+
export declare const runningConversionHeartbeatAgeMs: (operation: ConversionOperation, observedAt?: number) => number | null;
|
|
398
|
+
export declare const isRunningConversionStalled: (operation: ConversionOperation, observedAt?: number) => boolean;
|
|
320
399
|
export declare class TwelveUiConversionClient {
|
|
321
400
|
readonly origin: string;
|
|
322
401
|
private readonly apiKey;
|
|
@@ -331,8 +410,18 @@ export declare class TwelveUiConversionClient {
|
|
|
331
410
|
waitForConversion(id: string, options?: ConversionWaitOptions): Promise<ConversionOperation>;
|
|
332
411
|
waitForEdit(id: string, options?: ConversionWaitOptions): Promise<ConversionOperation>;
|
|
333
412
|
private waitForOperation;
|
|
334
|
-
|
|
335
|
-
|
|
413
|
+
/**
|
|
414
|
+
* Downloads a settled operation's result body and verifies it.
|
|
415
|
+
*
|
|
416
|
+
* Takes the OPERATION rather than its id, matching `downloadArtifact` and
|
|
417
|
+
* `downloadResponsiveAlternative`: the digest that says whether the bytes
|
|
418
|
+
* arrived intact travels on the payload, so the download and the thing it is
|
|
419
|
+
* checked against cannot be separated by a caller who did not think about
|
|
420
|
+
* it. An operation whose result publishes no digest — an older service —
|
|
421
|
+
* downloads exactly as it always did.
|
|
422
|
+
*/
|
|
423
|
+
downloadResult(operation: ConversionOperation, output: ConversionOutput, signal?: AbortSignal): Promise<ConversionDownload>;
|
|
424
|
+
downloadEditResult(operation: ConversionOperation, output: ConversionOutput, signal?: AbortSignal): Promise<ConversionDownload>;
|
|
336
425
|
private downloadOperationResult;
|
|
337
426
|
downloadArtifact(artifact: ConversionArtifact, signal?: AbortSignal): Promise<ConversionDownload>;
|
|
338
427
|
downloadResponsiveAlternative(operation: ConversionOperation, signal?: AbortSignal): Promise<DownloadedResponsiveHtmlAlternative>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversion-client.d.ts","sourceRoot":"","sources":["../src/conversion-client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conversion-client.d.ts","sourceRoot":"","sources":["../src/conversion-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,9 +7,67 @@ import { CONVERSION_OUTPUT_MEDIA_TYPES, isConversionOutput, isLayerDocInputOutpu
|
|
|
7
7
|
import { NO_POLL_FAILURES, annotatePollFailure, decidePollFailure, } from './operation-poll-policy.js';
|
|
8
8
|
import { isResponsiveConversionQuality, parseResponsiveConversionPlan, } from './responsive-quality.js';
|
|
9
9
|
import { canonicalConversionOutputProfileJson, isProjectConversionOutput, parseConversionOutputProfile, } from './project-profiles.js';
|
|
10
|
+
import { assertResultDigest, publishedResultIntegrity, } from './result-integrity.js';
|
|
10
11
|
export const LAYERDOC_V2_MEDIA_TYPE = CONVERSION_OUTPUT_MEDIA_TYPES.layerdoc;
|
|
11
12
|
export const MAX_LAYERDOC_INPUT_BYTES = 5 * 1024 * 1024;
|
|
12
|
-
|
|
13
|
+
/**
|
|
14
|
+
* How long a running operation's published heartbeat may lag before the client
|
|
15
|
+
* DESCRIBES the wait that just ended as stalled rather than merely unfinished.
|
|
16
|
+
*
|
|
17
|
+
* This is a sentence, never a deadline. It was a deadline until 2026-09-04, on
|
|
18
|
+
* the premise stated here — that it matched the deployed watchdog — and that
|
|
19
|
+
* premise is false in both directions:
|
|
20
|
+
*
|
|
21
|
+
* - The server's reclaim window for a stage holding an in-flight paid effect
|
|
22
|
+
* is `max(image timeout, text timeout) + STAGE_SILENCE_CEILING_MS`
|
|
23
|
+
* (`workers/api/src/conversion/stageLeaseRecovery.ts`), which is 515s in
|
|
24
|
+
* production. `CONVERSION_STAGE_STALE_MS = 180000` stopped deciding that
|
|
25
|
+
* window on 2026-08-06. Three minutes is inside the window, not at it.
|
|
26
|
+
* - A parent awaiting child conversions publishes no heartbeat at all:
|
|
27
|
+
* `deferStageForDependencies` parks its stage `queued`, so
|
|
28
|
+
* `heartbeatStageLease`'s `status = 'running'` guard stops matching the run
|
|
29
|
+
* row for the whole dependency wait. The measured median child conversion
|
|
30
|
+
* is 243s, so more than half of those waits look silent for longer than
|
|
31
|
+
* three minutes while the run is perfectly healthy.
|
|
32
|
+
*
|
|
33
|
+
* Both windows are also env-derived per deployment, so no constant compiled
|
|
34
|
+
* into a client can track them. `updated_at` age therefore cannot tell a dead
|
|
35
|
+
* run from a healthy quiet one, and this module no longer asks it to: the
|
|
36
|
+
* caller's own bound ends the wait, and this threshold only decides which true
|
|
37
|
+
* sentence the caller is handed when it does.
|
|
38
|
+
*/
|
|
39
|
+
export const CONVERSION_RUNNING_STALE_MS = 3 * 60_000;
|
|
40
|
+
/**
|
|
41
|
+
* The wall a caller that declared no bound of its own gets.
|
|
42
|
+
*
|
|
43
|
+
* It is the documented default and it is now reachable: it used to be dead
|
|
44
|
+
* code, because every caller passes `expiresAt` and `expiresAt` was read as a
|
|
45
|
+
* wall. The longest healthy conversion this repo has measured is a 796s tall
|
|
46
|
+
* standard landing (`improve-convert-resilience.ts`), so twenty minutes clears
|
|
47
|
+
* the measured envelope with room and still ends the same day.
|
|
48
|
+
*/
|
|
49
|
+
const DEFAULT_CONVERSION_WAIT_MS = 20 * 60_000;
|
|
50
|
+
/**
|
|
51
|
+
* The longest delay `setTimeout` can hold. Past it Node overflows its 32-bit
|
|
52
|
+
* delay, silently rewrites the delay to 1ms, and the timer fires AT ONCE — so
|
|
53
|
+
* an unclamped far-future bound does not mean "wait a long time", it means
|
|
54
|
+
* "abort immediately". Any wall derived from a caller's `expiresAt` has to be
|
|
55
|
+
* clamped before it reaches a timer.
|
|
56
|
+
*/
|
|
57
|
+
const MAX_TIMER_DELAY_MS = 2_147_483_647;
|
|
58
|
+
/**
|
|
59
|
+
* A no-progress bound is allowed to expire only when the service has stopped
|
|
60
|
+
* giving us a live fact. Percent alone is intentionally not used: the service
|
|
61
|
+
* publishes reliable stage and lane facts even when its aggregate percent is
|
|
62
|
+
* unchanged for a long extraction or responsive-reference pass.
|
|
63
|
+
*/
|
|
64
|
+
const conversionShowsLiveProgress = (operation) => {
|
|
65
|
+
if (operation.status !== 'running')
|
|
66
|
+
return false;
|
|
67
|
+
if (operation.progress?.stage)
|
|
68
|
+
return true;
|
|
69
|
+
return operation.progress?.active?.some((lane) => (lane.status === 'running' || lane.status === 'retrying')) ?? false;
|
|
70
|
+
};
|
|
13
71
|
export class ConversionClientError extends Error {
|
|
14
72
|
status;
|
|
15
73
|
problem;
|
|
@@ -22,7 +80,80 @@ export class ConversionClientError extends Error {
|
|
|
22
80
|
this.name = 'ConversionClientError';
|
|
23
81
|
}
|
|
24
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* The caller's wait ended while the operation was still running and quiet.
|
|
85
|
+
*
|
|
86
|
+
* This is a description of the wait, not a verdict on the run. The run is
|
|
87
|
+
* recoverable from its own durable record, and callers must not create another
|
|
88
|
+
* paid conversion to escape it. The previous wording promised the reader that
|
|
89
|
+
* "the server watchdog" would "record recovery"; on the 2026-09-03 population
|
|
90
|
+
* there was nothing to recover — the runs were mid-dependency-wait and settled
|
|
91
|
+
* on their own — and the client exiting was the only thing that stopped anyone
|
|
92
|
+
* collecting them.
|
|
93
|
+
*/
|
|
94
|
+
export class ConversionStalledError extends Error {
|
|
95
|
+
operation;
|
|
96
|
+
heartbeatAgeMs;
|
|
97
|
+
constructor(operation, heartbeatAgeMs) {
|
|
98
|
+
super(`Conversion ${operation.id} did not settle before this wait ended, and is recoverable: `
|
|
99
|
+
+ 'it is still running server-side and last published an update '
|
|
100
|
+
+ `${Math.floor(heartbeatAgeMs / 1_000)} seconds ago. `
|
|
101
|
+
+ 'No new conversion was started; the same purchase is still collectable.');
|
|
102
|
+
this.operation = operation;
|
|
103
|
+
this.heartbeatAgeMs = heartbeatAgeMs;
|
|
104
|
+
this.name = 'ConversionStalledError';
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Only a running operation owns a heartbeat. Queued work is admission state,
|
|
108
|
+
* not evidence that a stage isolate disappeared. */
|
|
109
|
+
export const runningConversionHeartbeatAgeMs = (operation, observedAt = Date.now()) => {
|
|
110
|
+
if (operation.status !== 'running')
|
|
111
|
+
return null;
|
|
112
|
+
const heartbeatAt = Date.parse(operation.updated_at);
|
|
113
|
+
if (!Number.isFinite(heartbeatAt))
|
|
114
|
+
return null;
|
|
115
|
+
return Math.max(0, observedAt - heartbeatAt);
|
|
116
|
+
};
|
|
117
|
+
export const isRunningConversionStalled = (operation, observedAt = Date.now()) => {
|
|
118
|
+
const heartbeatAgeMs = runningConversionHeartbeatAgeMs(operation, observedAt);
|
|
119
|
+
return heartbeatAgeMs !== null && heartbeatAgeMs >= CONVERSION_RUNNING_STALE_MS;
|
|
120
|
+
};
|
|
25
121
|
const resultAccept = (output) => CONVERSION_OUTPUT_MEDIA_TYPES[output];
|
|
122
|
+
/**
|
|
123
|
+
* Artifact bytes are asked for as bytes, never as a document.
|
|
124
|
+
*
|
|
125
|
+
* The artifact route ignores `Accept` entirely and always answers with the
|
|
126
|
+
* artifact's own recorded media type, so this header decides nothing about
|
|
127
|
+
* what is served. What it does decide is how the CDN in front of the API
|
|
128
|
+
* classifies the response: a request whose `Accept` begins with `text/html`
|
|
129
|
+
* is treated as a page navigation, and an HTML payload returned to a
|
|
130
|
+
* navigation is rewritten in flight — the edge appends its analytics beacon
|
|
131
|
+
* script. Those extra bytes are invisible to the API and fatal to the caller,
|
|
132
|
+
* because every HTML artifact carries a SHA-256 that can then never match
|
|
133
|
+
* (`docs/analysis/f44-alternative-digest-2026-09-03.md`). Downloading bytes as
|
|
134
|
+
* bytes is both the honest description of a digest-verified transfer and what
|
|
135
|
+
* keeps the payload byte-exact.
|
|
136
|
+
*/
|
|
137
|
+
const ARTIFACT_DOWNLOAD_ACCEPT = 'application/octet-stream';
|
|
138
|
+
/**
|
|
139
|
+
* A result body is asked for as bytes too, for the same reason and one more.
|
|
140
|
+
*
|
|
141
|
+
* `application/octet-stream` is an alias the operation route publishes for the
|
|
142
|
+
* run's own output: it answers with the identical body under that output's own
|
|
143
|
+
* `content-type`, so nothing about the representation changes. What changes is
|
|
144
|
+
* that the request no longer looks like a page navigation, which is the only
|
|
145
|
+
* way to receive an HTML result unrewritten — asking for it as
|
|
146
|
+
* `text/html;profile=…` is what invited the beacon in the first place, and
|
|
147
|
+
* unlike an artifact there was previously no other header that named it.
|
|
148
|
+
* Verification below then has bytes worth verifying.
|
|
149
|
+
*
|
|
150
|
+
* Sent only when the result payload publishes a digest, because the alias and
|
|
151
|
+
* the digest shipped together: a service old enough to publish neither has no
|
|
152
|
+
* `application/octet-stream` in its negotiation table and answers 406. So the
|
|
153
|
+
* presence of `result.sha256` is read as "this service speaks bytes", and its
|
|
154
|
+
* absence keeps both the old header and the old unverified download.
|
|
155
|
+
*/
|
|
156
|
+
const RESULT_DOWNLOAD_ACCEPT = 'application/octet-stream';
|
|
26
157
|
const CONVERSION_POLL_BOOTSTRAP_VALIDATOR = 'W/"conversion-operation-bootstrap-v1"';
|
|
27
158
|
const bytesAsArrayBuffer = (bytes) => bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
|
|
28
159
|
const layerDocBytes = (value) => {
|
|
@@ -190,48 +321,6 @@ const parseResponsiveAlternative = (record) => {
|
|
|
190
321
|
const alternative = operationRecord(record.responsive_alternative);
|
|
191
322
|
if (!alternative)
|
|
192
323
|
throw new Error('Conversion operation has an invalid responsive alternative');
|
|
193
|
-
if (alternative.disposition === 'partial_responsive') {
|
|
194
|
-
assertExactRuntimeKeys(alternative, ['disposition', 'media_type', 'coverage', 'bands'], 'Responsive partial alternative');
|
|
195
|
-
const coverage = parseAlternativeCoverage(alternative.coverage);
|
|
196
|
-
if (alternative.media_type !== RESPONSIVE_PARTIAL_HTML_MANIFEST_MEDIA_TYPE
|
|
197
|
-
|| !Array.isArray(alternative.bands)
|
|
198
|
-
|| alternative.bands.length !== coverage.landed.length
|
|
199
|
-
|| coverage.landed.length === 0) {
|
|
200
|
-
throw new Error('Conversion operation has an invalid partial responsive alternative');
|
|
201
|
-
}
|
|
202
|
-
const landed = new Map(coverage.landed.map((band) => [`${band.anchor_id}:${band.viewport_width}`, band]));
|
|
203
|
-
const bands = alternative.bands.map((value, index) => {
|
|
204
|
-
const band = operationRecord(value);
|
|
205
|
-
if (!band)
|
|
206
|
-
throw new Error('Conversion operation partial responsive bands do not match coverage');
|
|
207
|
-
assertExactRuntimeKeys(band, ['anchor_id', 'viewport_width', 'artifact'], `Responsive alternative band ${index}`);
|
|
208
|
-
const identity = parseAlternativeBandIdentity({ anchor_id: band.anchor_id, viewport_width: band.viewport_width }, `Responsive alternative band ${index}`);
|
|
209
|
-
const key = `${identity.anchor_id}:${identity.viewport_width}`;
|
|
210
|
-
const coverageBand = landed.get(key);
|
|
211
|
-
if (!coverageBand) {
|
|
212
|
-
throw new Error('Conversion operation partial responsive bands do not match coverage');
|
|
213
|
-
}
|
|
214
|
-
landed.delete(key);
|
|
215
|
-
const artifact = parseAlternativeArtifact(band.artifact, `Responsive alternative band ${index}`);
|
|
216
|
-
if (artifact.role !== 'responsive-partial-band'
|
|
217
|
-
|| artifact.width !== identity.viewport_width) {
|
|
218
|
-
throw new Error(`Responsive alternative band ${index} artifact does not match its wrapper`);
|
|
219
|
-
}
|
|
220
|
-
return {
|
|
221
|
-
...coverageBand,
|
|
222
|
-
artifact,
|
|
223
|
-
};
|
|
224
|
-
});
|
|
225
|
-
if (landed.size !== 0) {
|
|
226
|
-
throw new Error('Conversion operation partial responsive bands do not match coverage');
|
|
227
|
-
}
|
|
228
|
-
return {
|
|
229
|
-
disposition: 'partial_responsive',
|
|
230
|
-
media_type: RESPONSIVE_PARTIAL_HTML_MANIFEST_MEDIA_TYPE,
|
|
231
|
-
coverage,
|
|
232
|
-
bands,
|
|
233
|
-
};
|
|
234
|
-
}
|
|
235
324
|
if (alternative.disposition === 'fixed_html_alternative') {
|
|
236
325
|
assertExactRuntimeKeys(alternative, ['disposition', 'media_type', 'coverage', 'artifact'], 'Responsive fixed HTML alternative');
|
|
237
326
|
const coverage = parseAlternativeCoverage(alternative.coverage);
|
|
@@ -547,18 +636,65 @@ export class TwelveUiConversionClient {
|
|
|
547
636
|
}
|
|
548
637
|
const intervalMs = Math.max(250, options.intervalMs ?? 2_000);
|
|
549
638
|
const expiresAt = options.expiresAt ? Date.parse(options.expiresAt) : NaN;
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
639
|
+
// A caller that declared neither bound gets the default wall. A caller that
|
|
640
|
+
// declared a no-progress bound is deliberately unwalled: it is saying it
|
|
641
|
+
// will keep collecting for as long as the service keeps showing progress.
|
|
642
|
+
const declaredTimeoutMs = options.timeoutMs
|
|
643
|
+
?? (options.stallTimeoutMs === undefined ? DEFAULT_CONVERSION_WAIT_MS : undefined);
|
|
644
|
+
// `expires_at` only ever shortens a wait. Waiting past the moment the result
|
|
645
|
+
// stops being collectable buys nothing, and a seven-day retention horizon is
|
|
646
|
+
// not a wall — reading it as one is what left every CLI caller unwalled.
|
|
647
|
+
const timeoutMs = Number.isFinite(expiresAt)
|
|
648
|
+
? Math.min(declaredTimeoutMs ?? Number.POSITIVE_INFINITY, expiresAt - Date.now())
|
|
649
|
+
: declaredTimeoutMs;
|
|
650
|
+
const boundedTimeoutMs = timeoutMs === undefined || !Number.isFinite(timeoutMs)
|
|
651
|
+
? undefined
|
|
652
|
+
: Math.max(1_000, Math.min(MAX_TIMER_DELAY_MS, timeoutMs));
|
|
653
|
+
const deadline = boundedTimeoutMs === undefined ? undefined : Date.now() + boundedTimeoutMs;
|
|
553
654
|
const timeoutError = new Error(`Timed out waiting for conversion ${id}`);
|
|
655
|
+
const stallTimeoutMs = options.stallTimeoutMs === undefined
|
|
656
|
+
? undefined
|
|
657
|
+
: Math.max(1_000, options.stallTimeoutMs);
|
|
658
|
+
const stallError = stallTimeoutMs === undefined
|
|
659
|
+
? undefined
|
|
660
|
+
: new Error(`Timed out waiting for conversion ${id}: no live status or progress for ${stallTimeoutMs}ms`);
|
|
554
661
|
const controller = new AbortController();
|
|
555
662
|
const onAbort = () => controller.abort(options.signal?.reason ?? new Error('Conversion wait aborted'));
|
|
556
663
|
options.signal?.addEventListener('abort', onAbort, { once: true });
|
|
557
|
-
const timer =
|
|
664
|
+
const timer = boundedTimeoutMs === undefined
|
|
665
|
+
? undefined
|
|
666
|
+
: setTimeout(() => controller.abort(timeoutError), boundedTimeoutMs);
|
|
667
|
+
let stallTimer;
|
|
668
|
+
const noteLiveProgress = () => {
|
|
669
|
+
if (stallTimeoutMs === undefined || stallError === undefined)
|
|
670
|
+
return;
|
|
671
|
+
if (stallTimer !== undefined)
|
|
672
|
+
clearTimeout(stallTimer);
|
|
673
|
+
stallTimer = setTimeout(() => controller.abort(stallError), stallTimeoutMs);
|
|
674
|
+
};
|
|
675
|
+
noteLiveProgress();
|
|
558
676
|
let retained = { validator: CONVERSION_POLL_BOOTSTRAP_VALIDATOR };
|
|
559
677
|
let failures = NO_POLL_FAILURES;
|
|
678
|
+
/**
|
|
679
|
+
* What one of THIS wait's own bounds expiring means, said in the caller's
|
|
680
|
+
* terms. A caller cancel and a read failure keep their own reason: only the
|
|
681
|
+
* two errors this loop raises are re-described. A running operation that
|
|
682
|
+
* had gone quiet is recoverable and must not be re-bought, so it is named
|
|
683
|
+
* as such rather than reported as a bare timeout.
|
|
684
|
+
*/
|
|
685
|
+
const endOfWait = (reason) => {
|
|
686
|
+
if (reason !== timeoutError && reason !== stallError)
|
|
687
|
+
return reason;
|
|
688
|
+
const operation = retained.operation;
|
|
689
|
+
if (!operation)
|
|
690
|
+
return reason;
|
|
691
|
+
const heartbeatAgeMs = runningConversionHeartbeatAgeMs(operation);
|
|
692
|
+
if (heartbeatAgeMs === null || heartbeatAgeMs < CONVERSION_RUNNING_STALE_MS)
|
|
693
|
+
return reason;
|
|
694
|
+
return new ConversionStalledError(operation, heartbeatAgeMs);
|
|
695
|
+
};
|
|
560
696
|
try {
|
|
561
|
-
while (Date.now() < deadline) {
|
|
697
|
+
while (deadline === undefined || Date.now() < deadline) {
|
|
562
698
|
let response;
|
|
563
699
|
try {
|
|
564
700
|
response = await this.readConversion(id, controller.signal, retained, operationKind);
|
|
@@ -577,7 +713,9 @@ export class TwelveUiConversionClient {
|
|
|
577
713
|
budget: failures,
|
|
578
714
|
now: Date.now(),
|
|
579
715
|
intervalMs,
|
|
580
|
-
remainingMs:
|
|
716
|
+
remainingMs: deadline === undefined
|
|
717
|
+
? Number.MAX_SAFE_INTEGER
|
|
718
|
+
: Math.max(0, deadline - Date.now()),
|
|
581
719
|
});
|
|
582
720
|
if (verdict.kind === 'exhausted')
|
|
583
721
|
throw annotatePollFailure(error, verdict.reason);
|
|
@@ -593,46 +731,82 @@ export class TwelveUiConversionClient {
|
|
|
593
731
|
operation,
|
|
594
732
|
validator: response.validator ?? CONVERSION_POLL_BOOTSTRAP_VALIDATOR,
|
|
595
733
|
};
|
|
596
|
-
|
|
597
|
-
|
|
734
|
+
if (operation.status === 'succeeded' || operation.responsive_alternative) {
|
|
735
|
+
options.onProgress?.(operation);
|
|
598
736
|
return operation;
|
|
737
|
+
}
|
|
599
738
|
if (operation.status === 'failed' || operation.status === 'expired') {
|
|
739
|
+
options.onProgress?.(operation);
|
|
600
740
|
throw new Error(operation.error?.detail || `Conversion ${operation.status}`);
|
|
601
741
|
}
|
|
602
|
-
|
|
742
|
+
options.onProgress?.(operation);
|
|
743
|
+
// A fresh live projection proves this purchase still has a server-side
|
|
744
|
+
// path. A 304 merely repeats retained state, so it cannot reset the
|
|
745
|
+
// no-progress timer.
|
|
746
|
+
if (!response.notModified && conversionShowsLiveProgress(operation))
|
|
747
|
+
noteLiveProgress();
|
|
748
|
+
const remaining = deadline === undefined ? Number.POSITIVE_INFINITY : Math.max(0, deadline - Date.now());
|
|
603
749
|
await wait(Math.min(remaining, Math.max(intervalMs, response.retryAfterMs ?? 0)), controller.signal);
|
|
604
750
|
}
|
|
605
|
-
throw timeoutError;
|
|
751
|
+
throw endOfWait(timeoutError);
|
|
606
752
|
}
|
|
607
753
|
catch (error) {
|
|
608
754
|
if (controller.signal.aborted)
|
|
609
|
-
throw controller.signal.reason ?? error;
|
|
755
|
+
throw endOfWait(controller.signal.reason ?? error);
|
|
610
756
|
throw error;
|
|
611
757
|
}
|
|
612
758
|
finally {
|
|
613
|
-
|
|
759
|
+
if (timer !== undefined)
|
|
760
|
+
clearTimeout(timer);
|
|
761
|
+
if (stallTimer !== undefined)
|
|
762
|
+
clearTimeout(stallTimer);
|
|
614
763
|
options.signal?.removeEventListener('abort', onAbort);
|
|
615
764
|
}
|
|
616
765
|
}
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
766
|
+
/**
|
|
767
|
+
* Downloads a settled operation's result body and verifies it.
|
|
768
|
+
*
|
|
769
|
+
* Takes the OPERATION rather than its id, matching `downloadArtifact` and
|
|
770
|
+
* `downloadResponsiveAlternative`: the digest that says whether the bytes
|
|
771
|
+
* arrived intact travels on the payload, so the download and the thing it is
|
|
772
|
+
* checked against cannot be separated by a caller who did not think about
|
|
773
|
+
* it. An operation whose result publishes no digest — an older service —
|
|
774
|
+
* downloads exactly as it always did.
|
|
775
|
+
*/
|
|
776
|
+
async downloadResult(operation, output, signal) {
|
|
777
|
+
return await this.downloadOperationResult(operation, output, signal, 'convert');
|
|
778
|
+
}
|
|
779
|
+
async downloadEditResult(operation, output, signal) {
|
|
780
|
+
return await this.downloadOperationResult(operation, output, signal, 'edit');
|
|
781
|
+
}
|
|
782
|
+
async downloadOperationResult(operation, output, signal, operationKind) {
|
|
783
|
+
// The payload IS the version signal, so no probe request is needed and no
|
|
784
|
+
// fallback exists to get wrong. A service that publishes a result digest
|
|
785
|
+
// is by construction one that answers `application/octet-stream`; a
|
|
786
|
+
// service that publishes none predates the alias and would 406 on it, so
|
|
787
|
+
// it is asked exactly as it always was and its bytes go unverified —
|
|
788
|
+
// which is no worse than the day before, and the only thing this client
|
|
789
|
+
// can honestly do with bytes nobody described.
|
|
790
|
+
const expected = publishedResultIntegrity(operation.result);
|
|
791
|
+
const response = await abortable(this.fetchImpl(this.operationUrl(operation.id, operationKind), {
|
|
792
|
+
headers: this.headers({ Accept: expected ? RESULT_DOWNLOAD_ACCEPT : resultAccept(output) }),
|
|
626
793
|
signal,
|
|
627
794
|
}), signal);
|
|
628
795
|
if (response.status === 202) {
|
|
629
|
-
const
|
|
630
|
-
throw new Error(`Conversion is not ready (${
|
|
796
|
+
const pending = parseOperation(await abortable(response.json(), signal));
|
|
797
|
+
throw new Error(`Conversion is not ready (${pending.status})`);
|
|
631
798
|
}
|
|
632
799
|
if (!response.ok)
|
|
633
800
|
throw await responseError('Conversion result failed', response, signal);
|
|
801
|
+
const bytes = new Uint8Array(await abortable(response.arrayBuffer(), signal));
|
|
802
|
+
// Verified before the bytes leave this method, so no caller downstream can
|
|
803
|
+
// write a rewritten or truncated body: on a mismatch there are no bytes to
|
|
804
|
+
// write, only the named failure.
|
|
805
|
+
if (expected) {
|
|
806
|
+
assertResultDigest({ conversionId: operation.id, output, expected, bytes });
|
|
807
|
+
}
|
|
634
808
|
return {
|
|
635
|
-
bytes
|
|
809
|
+
bytes,
|
|
636
810
|
mediaType: response.headers.get('content-type') || resultAccept(output),
|
|
637
811
|
};
|
|
638
812
|
}
|
|
@@ -642,7 +816,7 @@ export class TwelveUiConversionClient {
|
|
|
642
816
|
throw new Error(`Conversion artifact ${artifact.id} has an untrusted href`);
|
|
643
817
|
}
|
|
644
818
|
const response = await abortable(this.fetchImpl(url, {
|
|
645
|
-
headers: { Accept:
|
|
819
|
+
headers: { Accept: ARTIFACT_DOWNLOAD_ACCEPT },
|
|
646
820
|
signal,
|
|
647
821
|
}), signal);
|
|
648
822
|
if (!response.ok) {
|
|
@@ -658,21 +832,11 @@ export class TwelveUiConversionClient {
|
|
|
658
832
|
if (!alternative || operation.status !== 'failed' || operation.result) {
|
|
659
833
|
throw new Error(`Conversion ${operation.id} has no responsive HTML alternative`);
|
|
660
834
|
}
|
|
661
|
-
if (alternative.disposition === 'fixed_html_alternative') {
|
|
662
|
-
return {
|
|
663
|
-
disposition: alternative.disposition,
|
|
664
|
-
coverage: alternative.coverage,
|
|
665
|
-
artifact: alternative.artifact,
|
|
666
|
-
download: await this.downloadArtifact(alternative.artifact, signal),
|
|
667
|
-
};
|
|
668
|
-
}
|
|
669
835
|
return {
|
|
670
836
|
disposition: alternative.disposition,
|
|
671
837
|
coverage: alternative.coverage,
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
download: await this.downloadArtifact(band.artifact, signal),
|
|
675
|
-
}))),
|
|
838
|
+
artifact: alternative.artifact,
|
|
839
|
+
download: await this.downloadArtifact(alternative.artifact, signal),
|
|
676
840
|
};
|
|
677
841
|
}
|
|
678
842
|
operationUrl(id, operationKind = 'convert') {
|