@12ui/design 0.2.71 → 0.2.73
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/README.md +248 -55
- package/SKILL.md +28 -33
- package/dist/cli-arguments.d.ts.map +1 -1
- package/dist/cli-arguments.js +3 -0
- package/dist/cli-arguments.js.map +1 -1
- package/dist/cli-branch-command.d.ts.map +1 -1
- package/dist/cli-branch-command.js +4 -0
- package/dist/cli-branch-command.js.map +1 -1
- package/dist/cli-capabilities.d.ts +35 -1
- package/dist/cli-capabilities.d.ts.map +1 -1
- package/dist/cli-capabilities.js +36 -1
- package/dist/cli-capabilities.js.map +1 -1
- package/dist/cli-corpus-command.d.ts +5 -4
- package/dist/cli-corpus-command.d.ts.map +1 -1
- package/dist/cli-corpus-command.js +17 -26
- package/dist/cli-corpus-command.js.map +1 -1
- package/dist/cli-corpus-run.js +1 -1
- package/dist/cli-corpus-run.js.map +1 -1
- package/dist/cli-draft-command.js +1 -1
- package/dist/cli-draft-command.js.map +1 -1
- package/dist/cli-help/design.d.ts +26 -6
- package/dist/cli-help/design.d.ts.map +1 -1
- package/dist/cli-help/design.js +39 -7
- package/dist/cli-help/design.js.map +1 -1
- package/dist/cli-help/index.d.ts +206 -7
- package/dist/cli-help/index.d.ts.map +1 -1
- package/dist/cli-help/index.js +4 -0
- package/dist/cli-help/index.js.map +1 -1
- package/dist/cli-help/meta.d.ts +1 -1
- package/dist/cli-help/meta.d.ts.map +1 -1
- package/dist/cli-help/meta.js +2 -1
- package/dist/cli-help/meta.js.map +1 -1
- package/dist/cli-help/scene.d.ts +96 -0
- package/dist/cli-help/scene.d.ts.map +1 -0
- package/dist/cli-help/scene.js +162 -0
- package/dist/cli-help/scene.js.map +1 -0
- package/dist/cli-help/workflow.d.ts +90 -0
- package/dist/cli-help/workflow.d.ts.map +1 -0
- package/dist/cli-help/workflow.js +89 -0
- package/dist/cli-help/workflow.js.map +1 -0
- package/dist/cli-open-browser.d.ts +7 -0
- package/dist/cli-open-browser.d.ts.map +1 -0
- package/dist/cli-open-browser.js +25 -0
- package/dist/cli-open-browser.js.map +1 -0
- package/dist/cli-prototype-command.d.ts +3 -1
- package/dist/cli-prototype-command.d.ts.map +1 -1
- package/dist/cli-prototype-command.js +33 -7
- package/dist/cli-prototype-command.js.map +1 -1
- package/dist/cli-review-command.d.ts.map +1 -1
- package/dist/cli-review-command.js +1 -16
- package/dist/cli-review-command.js.map +1 -1
- package/dist/cli-run.d.ts.map +1 -1
- package/dist/cli-run.js +41 -3
- package/dist/cli-run.js.map +1 -1
- package/dist/cli-scene-command.d.ts +3 -0
- package/dist/cli-scene-command.d.ts.map +1 -0
- package/dist/cli-scene-command.js +292 -0
- package/dist/cli-scene-command.js.map +1 -0
- package/dist/cli-usage.d.ts +8 -0
- package/dist/cli-usage.d.ts.map +1 -1
- package/dist/cli-usage.js +65 -6
- package/dist/cli-usage.js.map +1 -1
- package/dist/cli-workflow-command.d.ts +8 -0
- package/dist/cli-workflow-command.d.ts.map +1 -0
- package/dist/cli-workflow-command.js +97 -0
- package/dist/cli-workflow-command.js.map +1 -0
- package/dist/cli-workspace-command.d.ts +25 -0
- package/dist/cli-workspace-command.d.ts.map +1 -0
- package/dist/cli-workspace-command.js +95 -0
- package/dist/cli-workspace-command.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +12 -4
- package/dist/config.js.map +1 -1
- package/dist/corpus-access.d.ts +11 -0
- package/dist/corpus-access.d.ts.map +1 -0
- package/dist/corpus-access.js +18 -0
- package/dist/corpus-access.js.map +1 -0
- package/dist/corpus-client.d.ts +11 -11
- package/dist/corpus-client.d.ts.map +1 -1
- package/dist/corpus-client.js +17 -6
- package/dist/corpus-client.js.map +1 -1
- package/dist/corpus-inspiration-failure.d.ts +1 -1
- package/dist/corpus-inspiration-failure.js +2 -2
- package/dist/corpus-inspiration-failure.js.map +1 -1
- package/dist/corpus-reference-download-retry.d.ts.map +1 -1
- package/dist/corpus-reference-download-retry.js +11 -1
- package/dist/corpus-reference-download-retry.js.map +1 -1
- package/dist/corpus-request-error.d.ts +2 -0
- package/dist/corpus-request-error.d.ts.map +1 -1
- package/dist/corpus-request-error.js +2 -0
- package/dist/corpus-request-error.js.map +1 -1
- package/dist/corpus-retry-guidance.d.ts +5 -0
- package/dist/corpus-retry-guidance.d.ts.map +1 -0
- package/dist/corpus-retry-guidance.js +18 -0
- package/dist/corpus-retry-guidance.js.map +1 -0
- package/dist/improve-pricing-plan.d.ts.map +1 -1
- package/dist/improve-pricing-plan.js +2 -4
- package/dist/improve-pricing-plan.js.map +1 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/legacy-skill-catalog.d.ts.map +1 -1
- package/dist/legacy-skill-catalog.js +52 -0
- package/dist/legacy-skill-catalog.js.map +1 -1
- package/dist/mcp-slate-command.d.ts +31 -0
- package/dist/mcp-slate-command.d.ts.map +1 -0
- package/dist/mcp-slate-command.js +118 -0
- package/dist/mcp-slate-command.js.map +1 -0
- package/dist/mcp-slate-image.d.ts +22 -0
- package/dist/mcp-slate-image.d.ts.map +1 -0
- package/dist/mcp-slate-image.js +28 -0
- package/dist/mcp-slate-image.js.map +1 -0
- package/dist/mcp-slate-latest.d.ts +13 -0
- package/dist/mcp-slate-latest.d.ts.map +1 -0
- package/dist/mcp-slate-latest.js +34 -0
- package/dist/mcp-slate-latest.js.map +1 -0
- package/dist/mcp-slate-names.d.ts +25 -0
- package/dist/mcp-slate-names.d.ts.map +1 -0
- package/dist/mcp-slate-names.js +49 -0
- package/dist/mcp-slate-names.js.map +1 -0
- package/dist/mcp-slate-resource.d.ts +5 -0
- package/dist/mcp-slate-resource.d.ts.map +1 -0
- package/dist/mcp-slate-resource.js +37 -0
- package/dist/mcp-slate-resource.js.map +1 -0
- package/dist/mcp-slate-run.d.ts +41 -0
- package/dist/mcp-slate-run.d.ts.map +1 -0
- package/dist/mcp-slate-run.js +88 -0
- package/dist/mcp-slate-run.js.map +1 -0
- package/dist/mcp-slate-tool-defs.d.ts +61 -0
- package/dist/mcp-slate-tool-defs.d.ts.map +1 -0
- package/dist/mcp-slate-tool-defs.js +247 -0
- package/dist/mcp-slate-tool-defs.js.map +1 -0
- package/dist/mcp-slate-tools.d.ts +8 -0
- package/dist/mcp-slate-tools.d.ts.map +1 -0
- package/dist/mcp-slate-tools.js +45 -0
- package/dist/mcp-slate-tools.js.map +1 -0
- package/dist/mcp-slate-ui-copy.d.ts +134 -0
- package/dist/mcp-slate-ui-copy.d.ts.map +1 -0
- package/dist/mcp-slate-ui-copy.js +136 -0
- package/dist/mcp-slate-ui-copy.js.map +1 -0
- package/dist/mcp-slate-ui-script-bridge.d.ts +18 -0
- package/dist/mcp-slate-ui-script-bridge.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-bridge.js +137 -0
- package/dist/mcp-slate-ui-script-bridge.js.map +1 -0
- package/dist/mcp-slate-ui-script-browser.d.ts +12 -0
- package/dist/mcp-slate-ui-script-browser.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-browser.js +19 -0
- package/dist/mcp-slate-ui-script-browser.js.map +1 -0
- package/dist/mcp-slate-ui-script-dialog.d.ts +20 -0
- package/dist/mcp-slate-ui-script-dialog.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-dialog.js +332 -0
- package/dist/mcp-slate-ui-script-dialog.js.map +1 -0
- package/dist/mcp-slate-ui-script-inline.d.ts +10 -0
- package/dist/mcp-slate-ui-script-inline.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-inline.js +221 -0
- package/dist/mcp-slate-ui-script-inline.js.map +1 -0
- package/dist/mcp-slate-ui-script-inspiration.d.ts +12 -0
- package/dist/mcp-slate-ui-script-inspiration.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-inspiration.js +216 -0
- package/dist/mcp-slate-ui-script-inspiration.js.map +1 -0
- package/dist/mcp-slate-ui-script-more.d.ts +30 -0
- package/dist/mcp-slate-ui-script-more.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-more.js +225 -0
- package/dist/mcp-slate-ui-script-more.js.map +1 -0
- package/dist/mcp-slate-ui-script-progress.d.ts +7 -0
- package/dist/mcp-slate-ui-script-progress.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-progress.js +9 -0
- package/dist/mcp-slate-ui-script-progress.js.map +1 -0
- package/dist/mcp-slate-ui-script-remote.d.ts +28 -0
- package/dist/mcp-slate-ui-script-remote.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-remote.js +147 -0
- package/dist/mcp-slate-ui-script-remote.js.map +1 -0
- package/dist/mcp-slate-ui-script-scribble.d.ts +19 -0
- package/dist/mcp-slate-ui-script-scribble.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-scribble.js +114 -0
- package/dist/mcp-slate-ui-script-scribble.js.map +1 -0
- package/dist/mcp-slate-ui-script-select.d.ts +16 -0
- package/dist/mcp-slate-ui-script-select.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-select.js +73 -0
- package/dist/mcp-slate-ui-script-select.js.map +1 -0
- package/dist/mcp-slate-ui-script-stage.d.ts +11 -0
- package/dist/mcp-slate-ui-script-stage.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-stage.js +181 -0
- package/dist/mcp-slate-ui-script-stage.js.map +1 -0
- package/dist/mcp-slate-ui-script-state.d.ts +13 -0
- package/dist/mcp-slate-ui-script-state.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-state.js +306 -0
- package/dist/mcp-slate-ui-script-state.js.map +1 -0
- package/dist/mcp-slate-ui-script-thumbtools.d.ts +23 -0
- package/dist/mcp-slate-ui-script-thumbtools.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-thumbtools.js +103 -0
- package/dist/mcp-slate-ui-script-thumbtools.js.map +1 -0
- package/dist/mcp-slate-ui-script.d.ts +28 -0
- package/dist/mcp-slate-ui-script.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script.js +58 -0
- package/dist/mcp-slate-ui-script.js.map +1 -0
- package/dist/mcp-slate-ui-styles-dialog.d.ts +17 -0
- package/dist/mcp-slate-ui-styles-dialog.d.ts.map +1 -0
- package/dist/mcp-slate-ui-styles-dialog.js +73 -0
- package/dist/mcp-slate-ui-styles-dialog.js.map +1 -0
- package/dist/mcp-slate-ui-styles-stage.d.ts +12 -0
- package/dist/mcp-slate-ui-styles-stage.d.ts.map +1 -0
- package/dist/mcp-slate-ui-styles-stage.js +53 -0
- package/dist/mcp-slate-ui-styles-stage.js.map +1 -0
- package/dist/mcp-slate-ui-styles-thumbtools.d.ts +10 -0
- package/dist/mcp-slate-ui-styles-thumbtools.d.ts.map +1 -0
- package/dist/mcp-slate-ui-styles-thumbtools.js +25 -0
- package/dist/mcp-slate-ui-styles-thumbtools.js.map +1 -0
- package/dist/mcp-slate-ui-styles.d.ts +13 -0
- package/dist/mcp-slate-ui-styles.d.ts.map +1 -0
- package/dist/mcp-slate-ui-styles.js +117 -0
- package/dist/mcp-slate-ui-styles.js.map +1 -0
- package/dist/mcp-slate-ui.d.ts +16 -0
- package/dist/mcp-slate-ui.d.ts.map +1 -0
- package/dist/mcp-slate-ui.js +58 -0
- package/dist/mcp-slate-ui.js.map +1 -0
- package/dist/mcp-slate-workspace-tools.d.ts +15 -0
- package/dist/mcp-slate-workspace-tools.d.ts.map +1 -0
- package/dist/mcp-slate-workspace-tools.js +155 -0
- package/dist/mcp-slate-workspace-tools.js.map +1 -0
- package/dist/mcp-tool-definitions.d.ts.map +1 -1
- package/dist/mcp-tool-definitions.js +9 -7
- package/dist/mcp-tool-definitions.js.map +1 -1
- package/dist/mcp-tool-handler.d.ts +8 -2
- package/dist/mcp-tool-handler.d.ts.map +1 -1
- package/dist/mcp-tool-handler.js +34 -13
- package/dist/mcp-tool-handler.js.map +1 -1
- package/dist/mcp-workflow-tools.d.ts +6 -0
- package/dist/mcp-workflow-tools.d.ts.map +1 -0
- package/dist/mcp-workflow-tools.js +108 -0
- package/dist/mcp-workflow-tools.js.map +1 -0
- package/dist/prototype-browsers.d.ts +8 -2
- package/dist/prototype-browsers.d.ts.map +1 -1
- package/dist/prototype-browsers.js +8 -3
- package/dist/prototype-browsers.js.map +1 -1
- package/dist/prototype-label-client.d.ts +5 -0
- package/dist/prototype-label-client.d.ts.map +1 -1
- package/dist/prototype-label-client.js.map +1 -1
- package/dist/prototype-poststep.d.ts +2 -2
- package/dist/prototype-poststep.d.ts.map +1 -1
- package/dist/prototype-poststep.js +3 -0
- package/dist/prototype-poststep.js.map +1 -1
- package/dist/prototype-process.js +1 -1
- package/dist/prototype-process.js.map +1 -1
- package/dist/prototype-run-record.d.ts +6 -2
- package/dist/prototype-run-record.d.ts.map +1 -1
- package/dist/prototype-run-record.js +6 -0
- package/dist/prototype-run-record.js.map +1 -1
- package/dist/prototype-runner.d.ts +2 -2
- package/dist/prototype-runner.d.ts.map +1 -1
- package/dist/prototype-runner.js +5 -2
- package/dist/prototype-runner.js.map +1 -1
- package/dist/prototype-workflow-contract.d.ts +13 -0
- package/dist/prototype-workflow-contract.d.ts.map +1 -0
- package/dist/prototype-workflow-contract.js +82 -0
- package/dist/prototype-workflow-contract.js.map +1 -0
- package/dist/prototype-workflow-labels.d.ts +29 -0
- package/dist/prototype-workflow-labels.d.ts.map +1 -0
- package/dist/prototype-workflow-labels.js +93 -0
- package/dist/prototype-workflow-labels.js.map +1 -0
- package/dist/run-journal-commands.d.ts.map +1 -1
- package/dist/run-journal-commands.js +24 -5
- package/dist/run-journal-commands.js.map +1 -1
- package/dist/scene/camera-model.d.ts +48 -0
- package/dist/scene/camera-model.d.ts.map +1 -0
- package/dist/scene/camera-model.js +89 -0
- package/dist/scene/camera-model.js.map +1 -0
- package/dist/scene/camera-solve.d.ts +58 -0
- package/dist/scene/camera-solve.d.ts.map +1 -0
- package/dist/scene/camera-solve.js +288 -0
- package/dist/scene/camera-solve.js.map +1 -0
- package/dist/scene/capture-plan.d.ts +28 -0
- package/dist/scene/capture-plan.d.ts.map +1 -0
- package/dist/scene/capture-plan.js +79 -0
- package/dist/scene/capture-plan.js.map +1 -0
- package/dist/scene/capture.d.ts +21 -0
- package/dist/scene/capture.d.ts.map +1 -0
- package/dist/scene/capture.js +118 -0
- package/dist/scene/capture.js.map +1 -0
- package/dist/scene/image-colors.d.ts +25 -0
- package/dist/scene/image-colors.d.ts.map +1 -0
- package/dist/scene/image-colors.js +110 -0
- package/dist/scene/image-colors.js.map +1 -0
- package/dist/scene/image-rectify.d.ts +25 -0
- package/dist/scene/image-rectify.d.ts.map +1 -0
- package/dist/scene/image-rectify.js +82 -0
- package/dist/scene/image-rectify.js.map +1 -0
- package/dist/scene/image-sheet.d.ts +19 -0
- package/dist/scene/image-sheet.d.ts.map +1 -0
- package/dist/scene/image-sheet.js +118 -0
- package/dist/scene/image-sheet.js.map +1 -0
- package/dist/scene/least-squares.d.ts +31 -0
- package/dist/scene/least-squares.d.ts.map +1 -0
- package/dist/scene/least-squares.js +173 -0
- package/dist/scene/least-squares.js.map +1 -0
- package/dist/scene/numbers.d.ts +17 -0
- package/dist/scene/numbers.d.ts.map +1 -0
- package/dist/scene/numbers.js +39 -0
- package/dist/scene/numbers.js.map +1 -0
- package/dist/scene/placement.d.ts +43 -0
- package/dist/scene/placement.d.ts.map +1 -0
- package/dist/scene/placement.js +107 -0
- package/dist/scene/placement.js.map +1 -0
- package/dist/scene/raster.d.ts +18 -0
- package/dist/scene/raster.d.ts.map +1 -0
- package/dist/scene/raster.js +31 -0
- package/dist/scene/raster.js.map +1 -0
- package/dist/scene/scene-kit.d.ts +20 -0
- package/dist/scene/scene-kit.d.ts.map +1 -0
- package/dist/scene/scene-kit.js +74 -0
- package/dist/scene/scene-kit.js.map +1 -0
- package/dist/scene/scene-verbs.d.ts +4 -0
- package/dist/scene/scene-verbs.d.ts.map +1 -0
- package/dist/scene/scene-verbs.js +5 -0
- package/dist/scene/scene-verbs.js.map +1 -0
- package/dist/scene/seeded-random.d.ts +20 -0
- package/dist/scene/seeded-random.d.ts.map +1 -0
- package/dist/scene/seeded-random.js +42 -0
- package/dist/scene/seeded-random.js.map +1 -0
- package/dist/scene/spec-expression.d.ts +25 -0
- package/dist/scene/spec-expression.d.ts.map +1 -0
- package/dist/scene/spec-expression.js +234 -0
- package/dist/scene/spec-expression.js.map +1 -0
- package/dist/scene/static-server.d.ts +13 -0
- package/dist/scene/static-server.d.ts.map +1 -0
- package/dist/scene/static-server.js +99 -0
- package/dist/scene/static-server.js.map +1 -0
- package/dist/server.d.ts +22 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +44 -8
- package/dist/server.js.map +1 -1
- package/dist/slate-actions.d.ts +38 -0
- package/dist/slate-actions.d.ts.map +1 -0
- package/dist/slate-actions.js +102 -0
- package/dist/slate-actions.js.map +1 -0
- package/dist/slate-annotate.d.ts +36 -0
- package/dist/slate-annotate.d.ts.map +1 -0
- package/dist/slate-annotate.js +71 -0
- package/dist/slate-annotate.js.map +1 -0
- package/dist/slate-approvals.d.ts +61 -0
- package/dist/slate-approvals.d.ts.map +1 -0
- package/dist/slate-approvals.js +153 -0
- package/dist/slate-approvals.js.map +1 -0
- package/dist/slate-browser-decision.d.ts +30 -0
- package/dist/slate-browser-decision.d.ts.map +1 -0
- package/dist/slate-browser-decision.js +24 -0
- package/dist/slate-browser-decision.js.map +1 -0
- package/dist/slate-browser-host-script.d.ts +14 -0
- package/dist/slate-browser-host-script.d.ts.map +1 -0
- package/dist/slate-browser-host-script.js +125 -0
- package/dist/slate-browser-host-script.js.map +1 -0
- package/dist/slate-browser-host.d.ts +9 -0
- package/dist/slate-browser-host.d.ts.map +1 -0
- package/dist/slate-browser-host.js +37 -0
- package/dist/slate-browser-host.js.map +1 -0
- package/dist/slate-browser-server.d.ts +37 -0
- package/dist/slate-browser-server.d.ts.map +1 -0
- package/dist/slate-browser-server.js +186 -0
- package/dist/slate-browser-server.js.map +1 -0
- package/dist/slate-commit.d.ts +28 -0
- package/dist/slate-commit.d.ts.map +1 -0
- package/dist/slate-commit.js +218 -0
- package/dist/slate-commit.js.map +1 -0
- package/dist/slate-corpus.d.ts +14 -0
- package/dist/slate-corpus.d.ts.map +1 -0
- package/dist/slate-corpus.js +32 -0
- package/dist/slate-corpus.js.map +1 -0
- package/dist/slate-edit-prompt.d.ts +18 -0
- package/dist/slate-edit-prompt.d.ts.map +1 -0
- package/dist/slate-edit-prompt.js +41 -0
- package/dist/slate-edit-prompt.js.map +1 -0
- package/dist/slate-edit-runner.d.ts +4 -0
- package/dist/slate-edit-runner.d.ts.map +1 -0
- package/dist/slate-edit-runner.js +90 -0
- package/dist/slate-edit-runner.js.map +1 -0
- package/dist/slate-editability.d.ts +20 -0
- package/dist/slate-editability.d.ts.map +1 -0
- package/dist/slate-editability.js +19 -0
- package/dist/slate-editability.js.map +1 -0
- package/dist/slate-errors.d.ts +15 -0
- package/dist/slate-errors.d.ts.map +1 -0
- package/dist/slate-errors.js +21 -0
- package/dist/slate-errors.js.map +1 -0
- package/dist/slate-handoff-options.d.ts +40 -0
- package/dist/slate-handoff-options.d.ts.map +1 -0
- package/dist/slate-handoff-options.js +127 -0
- package/dist/slate-handoff-options.js.map +1 -0
- package/dist/slate-handoff.d.ts +11 -0
- package/dist/slate-handoff.d.ts.map +1 -0
- package/dist/slate-handoff.js +56 -0
- package/dist/slate-handoff.js.map +1 -0
- package/dist/slate-ids.d.ts +33 -0
- package/dist/slate-ids.d.ts.map +1 -0
- package/dist/slate-ids.js +47 -0
- package/dist/slate-ids.js.map +1 -0
- package/dist/slate-image-executor.d.ts +39 -0
- package/dist/slate-image-executor.d.ts.map +1 -0
- package/dist/slate-image-executor.js +52 -0
- package/dist/slate-image-executor.js.map +1 -0
- package/dist/slate-inspiration.d.ts +22 -0
- package/dist/slate-inspiration.d.ts.map +1 -0
- package/dist/slate-inspiration.js +112 -0
- package/dist/slate-inspiration.js.map +1 -0
- package/dist/slate-labels.d.ts +11 -0
- package/dist/slate-labels.d.ts.map +1 -0
- package/dist/slate-labels.js +32 -0
- package/dist/slate-labels.js.map +1 -0
- package/dist/slate-ledger.d.ts +29 -0
- package/dist/slate-ledger.d.ts.map +1 -0
- package/dist/slate-ledger.js +65 -0
- package/dist/slate-ledger.js.map +1 -0
- package/dist/slate-liveness.d.ts +26 -0
- package/dist/slate-liveness.d.ts.map +1 -0
- package/dist/slate-liveness.js +49 -0
- package/dist/slate-liveness.js.map +1 -0
- package/dist/slate-local-image.d.ts +19 -0
- package/dist/slate-local-image.d.ts.map +1 -0
- package/dist/slate-local-image.js +36 -0
- package/dist/slate-local-image.js.map +1 -0
- package/dist/slate-lock.d.ts +64 -0
- package/dist/slate-lock.d.ts.map +1 -0
- package/dist/slate-lock.js +178 -0
- package/dist/slate-lock.js.map +1 -0
- package/dist/slate-paths.d.ts +45 -0
- package/dist/slate-paths.d.ts.map +1 -0
- package/dist/slate-paths.js +132 -0
- package/dist/slate-paths.js.map +1 -0
- package/dist/slate-pick.d.ts +29 -0
- package/dist/slate-pick.d.ts.map +1 -0
- package/dist/slate-pick.js +55 -0
- package/dist/slate-pick.js.map +1 -0
- package/dist/slate-reference-ids.d.ts +6 -0
- package/dist/slate-reference-ids.d.ts.map +1 -0
- package/dist/slate-reference-ids.js +17 -0
- package/dist/slate-reference-ids.js.map +1 -0
- package/dist/slate-reference-store.d.ts +23 -0
- package/dist/slate-reference-store.d.ts.map +1 -0
- package/dist/slate-reference-store.js +46 -0
- package/dist/slate-reference-store.js.map +1 -0
- package/dist/slate-resume.d.ts +19 -0
- package/dist/slate-resume.d.ts.map +1 -0
- package/dist/slate-resume.js +94 -0
- package/dist/slate-resume.js.map +1 -0
- package/dist/slate-round-params.d.ts +20 -0
- package/dist/slate-round-params.d.ts.map +1 -0
- package/dist/slate-round-params.js +32 -0
- package/dist/slate-round-params.js.map +1 -0
- package/dist/slate-round-prompt.d.ts +18 -0
- package/dist/slate-round-prompt.d.ts.map +1 -0
- package/dist/slate-round-prompt.js +20 -0
- package/dist/slate-round-prompt.js.map +1 -0
- package/dist/slate-round-runner.d.ts +4 -0
- package/dist/slate-round-runner.d.ts.map +1 -0
- package/dist/slate-round-runner.js +125 -0
- package/dist/slate-round-runner.js.map +1 -0
- package/dist/slate-round-search.d.ts +7 -0
- package/dist/slate-round-search.d.ts.map +1 -0
- package/dist/slate-round-search.js +77 -0
- package/dist/slate-round-search.js.map +1 -0
- package/dist/slate-run-action.d.ts +14 -0
- package/dist/slate-run-action.d.ts.map +1 -0
- package/dist/slate-run-action.js +81 -0
- package/dist/slate-run-action.js.map +1 -0
- package/dist/slate-runner-context.d.ts +57 -0
- package/dist/slate-runner-context.d.ts.map +1 -0
- package/dist/slate-runner-context.js +79 -0
- package/dist/slate-runner-context.js.map +1 -0
- package/dist/slate-runner-failure.d.ts +8 -0
- package/dist/slate-runner-failure.d.ts.map +1 -0
- package/dist/slate-runner-failure.js +17 -0
- package/dist/slate-runner-failure.js.map +1 -0
- package/dist/slate-runner-flag.d.ts +3 -0
- package/dist/slate-runner-flag.d.ts.map +1 -0
- package/dist/slate-runner-flag.js +3 -0
- package/dist/slate-runner-flag.js.map +1 -0
- package/dist/slate-runner-main.d.ts +31 -0
- package/dist/slate-runner-main.d.ts.map +1 -0
- package/dist/slate-runner-main.js +132 -0
- package/dist/slate-runner-main.js.map +1 -0
- package/dist/slate-runner-spawn.d.ts +23 -0
- package/dist/slate-runner-spawn.d.ts.map +1 -0
- package/dist/slate-runner-spawn.js +27 -0
- package/dist/slate-runner-spawn.js.map +1 -0
- package/dist/slate-runtime.d.ts +38 -0
- package/dist/slate-runtime.d.ts.map +1 -0
- package/dist/slate-runtime.js +48 -0
- package/dist/slate-runtime.js.map +1 -0
- package/dist/slate-versions.d.ts +26 -0
- package/dist/slate-versions.d.ts.map +1 -0
- package/dist/slate-versions.js +110 -0
- package/dist/slate-versions.js.map +1 -0
- package/dist/slate-view-contract.d.ts +233 -0
- package/dist/slate-view-contract.d.ts.map +1 -0
- package/dist/slate-view-contract.js +17 -0
- package/dist/slate-view-contract.js.map +1 -0
- package/dist/slate-view-types.d.ts +2 -0
- package/dist/slate-view-types.d.ts.map +1 -0
- package/dist/slate-view-types.js +2 -0
- package/dist/slate-view-types.js.map +1 -0
- package/dist/slate-view.d.ts +19 -0
- package/dist/slate-view.d.ts.map +1 -0
- package/dist/slate-view.js +184 -0
- package/dist/slate-view.js.map +1 -0
- package/dist/slate-workspace-parse.d.ts +20 -0
- package/dist/slate-workspace-parse.d.ts.map +1 -0
- package/dist/slate-workspace-parse.js +437 -0
- package/dist/slate-workspace-parse.js.map +1 -0
- package/dist/slate-workspace-store.d.ts +44 -0
- package/dist/slate-workspace-store.d.ts.map +1 -0
- package/dist/slate-workspace-store.js +270 -0
- package/dist/slate-workspace-store.js.map +1 -0
- package/dist/slate-workspace-types.d.ts +176 -0
- package/dist/slate-workspace-types.d.ts.map +1 -0
- package/dist/slate-workspace-types.js +13 -0
- package/dist/slate-workspace-types.js.map +1 -0
- package/dist/workflow/adapter-12ui.d.ts +4 -0
- package/dist/workflow/adapter-12ui.d.ts.map +1 -0
- package/dist/workflow/adapter-12ui.js +147 -0
- package/dist/workflow/adapter-12ui.js.map +1 -0
- package/dist/workflow/adapter-layerdoc.d.ts +16 -0
- package/dist/workflow/adapter-layerdoc.d.ts.map +1 -0
- package/dist/workflow/adapter-layerdoc.js +116 -0
- package/dist/workflow/adapter-layerdoc.js.map +1 -0
- package/dist/workflow/adapter-openai.d.ts +4 -0
- package/dist/workflow/adapter-openai.d.ts.map +1 -0
- package/dist/workflow/adapter-openai.js +166 -0
- package/dist/workflow/adapter-openai.js.map +1 -0
- package/dist/workflow/adapter-process.d.ts +7 -0
- package/dist/workflow/adapter-process.d.ts.map +1 -0
- package/dist/workflow/adapter-process.js +174 -0
- package/dist/workflow/adapter-process.js.map +1 -0
- package/dist/workflow/adapter-prototype-labels.d.ts +15 -0
- package/dist/workflow/adapter-prototype-labels.d.ts.map +1 -0
- package/dist/workflow/adapter-prototype-labels.js +71 -0
- package/dist/workflow/adapter-prototype-labels.js.map +1 -0
- package/dist/workflow/adapter-types.d.ts +40 -0
- package/dist/workflow/adapter-types.d.ts.map +1 -0
- package/dist/workflow/adapter-types.js +2 -0
- package/dist/workflow/adapter-types.js.map +1 -0
- package/dist/workflow/adapter-utils.d.ts +11 -0
- package/dist/workflow/adapter-utils.d.ts.map +1 -0
- package/dist/workflow/adapter-utils.js +72 -0
- package/dist/workflow/adapter-utils.js.map +1 -0
- package/dist/workflow/adapters.d.ts +6 -0
- package/dist/workflow/adapters.d.ts.map +1 -0
- package/dist/workflow/adapters.js +25 -0
- package/dist/workflow/adapters.js.map +1 -0
- package/dist/workflow/artifact.d.ts +11 -0
- package/dist/workflow/artifact.d.ts.map +1 -0
- package/dist/workflow/artifact.js +94 -0
- package/dist/workflow/artifact.js.map +1 -0
- package/dist/workflow/bundle-collect.d.ts +8 -0
- package/dist/workflow/bundle-collect.d.ts.map +1 -0
- package/dist/workflow/bundle-collect.js +56 -0
- package/dist/workflow/bundle-collect.js.map +1 -0
- package/dist/workflow/bundle-export.d.ts +16 -0
- package/dist/workflow/bundle-export.d.ts.map +1 -0
- package/dist/workflow/bundle-export.js +174 -0
- package/dist/workflow/bundle-export.js.map +1 -0
- package/dist/workflow/bundle-paths.d.ts +7 -0
- package/dist/workflow/bundle-paths.d.ts.map +1 -0
- package/dist/workflow/bundle-paths.js +35 -0
- package/dist/workflow/bundle-paths.js.map +1 -0
- package/dist/workflow/bundle.d.ts +4 -0
- package/dist/workflow/bundle.d.ts.map +1 -0
- package/dist/workflow/bundle.js +4 -0
- package/dist/workflow/bundle.js.map +1 -0
- package/dist/workflow/capture.d.ts +36 -0
- package/dist/workflow/capture.d.ts.map +1 -0
- package/dist/workflow/capture.js +81 -0
- package/dist/workflow/capture.js.map +1 -0
- package/dist/workflow/continuation-branch.d.ts +15 -0
- package/dist/workflow/continuation-branch.d.ts.map +1 -0
- package/dist/workflow/continuation-branch.js +103 -0
- package/dist/workflow/continuation-branch.js.map +1 -0
- package/dist/workflow/continuation-plans.d.ts +38 -0
- package/dist/workflow/continuation-plans.d.ts.map +1 -0
- package/dist/workflow/continuation-plans.js +78 -0
- package/dist/workflow/continuation-plans.js.map +1 -0
- package/dist/workflow/continuation.d.ts +25 -0
- package/dist/workflow/continuation.d.ts.map +1 -0
- package/dist/workflow/continuation.js +89 -0
- package/dist/workflow/continuation.js.map +1 -0
- package/dist/workflow/layerdoc-reader.d.ts +27 -0
- package/dist/workflow/layerdoc-reader.d.ts.map +1 -0
- package/dist/workflow/layerdoc-reader.js +81 -0
- package/dist/workflow/layerdoc-reader.js.map +1 -0
- package/dist/workflow/project-evidence.d.ts +48 -0
- package/dist/workflow/project-evidence.d.ts.map +1 -0
- package/dist/workflow/project-evidence.js +200 -0
- package/dist/workflow/project-evidence.js.map +1 -0
- package/dist/workflow/providers.d.ts +35 -0
- package/dist/workflow/providers.d.ts.map +1 -0
- package/dist/workflow/providers.js +110 -0
- package/dist/workflow/providers.js.map +1 -0
- package/dist/workflow/recipes-layerdoc-validation.d.ts +4 -0
- package/dist/workflow/recipes-layerdoc-validation.d.ts.map +1 -0
- package/dist/workflow/recipes-layerdoc-validation.js +98 -0
- package/dist/workflow/recipes-layerdoc-validation.js.map +1 -0
- package/dist/workflow/recipes-result-validation.d.ts +6 -0
- package/dist/workflow/recipes-result-validation.d.ts.map +1 -0
- package/dist/workflow/recipes-result-validation.js +38 -0
- package/dist/workflow/recipes-result-validation.js.map +1 -0
- package/dist/workflow/recipes-schemas.d.ts +7 -0
- package/dist/workflow/recipes-schemas.d.ts.map +1 -0
- package/dist/workflow/recipes-schemas.js +67 -0
- package/dist/workflow/recipes-schemas.js.map +1 -0
- package/dist/workflow/recipes-validation.d.ts +14 -0
- package/dist/workflow/recipes-validation.d.ts.map +1 -0
- package/dist/workflow/recipes-validation.js +68 -0
- package/dist/workflow/recipes-validation.js.map +1 -0
- package/dist/workflow/recipes.d.ts +20 -0
- package/dist/workflow/recipes.d.ts.map +1 -0
- package/dist/workflow/recipes.js +167 -0
- package/dist/workflow/recipes.js.map +1 -0
- package/dist/workflow/routing.d.ts +4 -0
- package/dist/workflow/routing.d.ts.map +1 -0
- package/dist/workflow/routing.js +28 -0
- package/dist/workflow/routing.js.map +1 -0
- package/dist/workflow/schema.d.ts +5 -0
- package/dist/workflow/schema.d.ts.map +1 -0
- package/dist/workflow/schema.js +29 -0
- package/dist/workflow/schema.js.map +1 -0
- package/dist/workflow/service.d.ts +59 -0
- package/dist/workflow/service.d.ts.map +1 -0
- package/dist/workflow/service.js +170 -0
- package/dist/workflow/service.js.map +1 -0
- package/dist/workflow/store-json.d.ts +5 -0
- package/dist/workflow/store-json.d.ts.map +1 -0
- package/dist/workflow/store-json.js +35 -0
- package/dist/workflow/store-json.js.map +1 -0
- package/dist/workflow/store-lock.d.ts +3 -0
- package/dist/workflow/store-lock.d.ts.map +1 -0
- package/dist/workflow/store-lock.js +85 -0
- package/dist/workflow/store-lock.js.map +1 -0
- package/dist/workflow/store-paths.d.ts +17 -0
- package/dist/workflow/store-paths.d.ts.map +1 -0
- package/dist/workflow/store-paths.js +67 -0
- package/dist/workflow/store-paths.js.map +1 -0
- package/dist/workflow/store-validation.d.ts +7 -0
- package/dist/workflow/store-validation.d.ts.map +1 -0
- package/dist/workflow/store-validation.js +119 -0
- package/dist/workflow/store-validation.js.map +1 -0
- package/dist/workflow/store.d.ts +10 -0
- package/dist/workflow/store.d.ts.map +1 -0
- package/dist/workflow/store.js +193 -0
- package/dist/workflow/store.js.map +1 -0
- package/dist/workflow/types.d.ts +120 -0
- package/dist/workflow/types.d.ts.map +1 -0
- package/dist/workflow/types.js +15 -0
- package/dist/workflow/types.js.map +1 -0
- package/dist/workflow-transport.d.ts +28 -0
- package/dist/workflow-transport.d.ts.map +1 -0
- package/dist/workflow-transport.js +184 -0
- package/dist/workflow-transport.js.map +1 -0
- package/open-design.json +2 -2
- package/package.json +4 -1
- package/prototype-kit/tests/rules-check.mjs +9 -0
- package/runtime/codex-conversion/src/images/native-invoke.mjs +1 -1
- package/runtime/codex-conversion/src/images/native.mjs +8 -4
- package/runtime/layerdoc-validator.mjs +1860 -0
- package/scene-kit/starter/camera.js +10 -0
- package/scene-kit/starter/gobo.js +60 -0
- package/scene-kit/starter/index.html +23 -0
- package/scene-kit/starter/lib.js +84 -0
- package/scene-kit/starter/main.js +78 -0
- package/scene-kit/starter/scene.js +33 -0
- package/scene-kit/vendor/LICENSE +21 -0
- package/scene-kit/vendor/addons/geometries/RoundedBoxGeometry.js +216 -0
- package/scene-kit/vendor/addons/renderers/CSS3DRenderer.js +454 -0
- package/scene-kit/vendor/three.core.js +60586 -0
- package/scene-kit/vendor/three.module.js +19719 -0
- package/skills/12ui-design/SKILL.md +21 -61
- package/skills/12ui-design/improve.md +5 -1
- package/skills/12ui-design/inspire.md +8 -5
- package/skills/12ui-design/outputs.md +23 -2
- package/skills/12ui-design/scene.md +172 -0
- package/skills/12ui-design/session.md +161 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { sha256Hex } from './slate-ids.js';
|
|
2
|
+
/**
|
|
3
|
+
* Turn an edit instruction and the strokes' bounding box into the text the
|
|
4
|
+
* local image call gets. No path takes a mask, so the box is words, and the
|
|
5
|
+
* strokes themselves travel as a second image (`slate-annotate.ts`) that the
|
|
6
|
+
* prompt tells the model to use only to locate the change.
|
|
7
|
+
*/
|
|
8
|
+
const ZONE_ROWS = ['top', 'middle', 'bottom'];
|
|
9
|
+
const ZONE_COLUMNS = ['left', 'center', 'right'];
|
|
10
|
+
const third = (permille) => (permille < 334 ? 0 : permille < 667 ? 1 : 2);
|
|
11
|
+
export const regionZone = (region) => {
|
|
12
|
+
const row = third(region.y + region.h / 2);
|
|
13
|
+
const column = third(region.x + region.w / 2);
|
|
14
|
+
if (row === 1 && column === 1)
|
|
15
|
+
return 'center';
|
|
16
|
+
if (row === 1)
|
|
17
|
+
return ZONE_COLUMNS[column];
|
|
18
|
+
if (column === 1)
|
|
19
|
+
return ZONE_ROWS[row];
|
|
20
|
+
return `${ZONE_ROWS[row]} ${ZONE_COLUMNS[column]}`;
|
|
21
|
+
};
|
|
22
|
+
const percent = (permille) => Math.round(permille / 10);
|
|
23
|
+
export const regionRanges = (region) => ({
|
|
24
|
+
left: percent(region.x),
|
|
25
|
+
right: percent(region.x + region.w),
|
|
26
|
+
top: percent(region.y),
|
|
27
|
+
bottom: percent(region.y + region.h),
|
|
28
|
+
});
|
|
29
|
+
export const assembleEditPrompt = (args) => {
|
|
30
|
+
const parts = ['Edit the first attached image. Preserve everything else exactly: layout, text, colours, identity.'];
|
|
31
|
+
if (args.region && args.colorName) {
|
|
32
|
+
const ranges = regionRanges(args.region);
|
|
33
|
+
parts.push(`The second attached image is the same design with the requested area marked by freehand ${args.colorName} strokes. `
|
|
34
|
+
+ 'Use the marks only to locate the change; do not draw them in the result. '
|
|
35
|
+
+ `The change belongs in the ${regionZone(args.region)} area, roughly ${ranges.left}% to ${ranges.right}% across and ${ranges.top}% to ${ranges.bottom}% down.`);
|
|
36
|
+
}
|
|
37
|
+
parts.push('Return the complete edited image at the original size.', `Requested change: ${args.prompt}`);
|
|
38
|
+
const sentPrompt = parts.join(' ');
|
|
39
|
+
return { sentPrompt, sentPromptSha256: sha256Hex(sentPrompt) };
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=slate-edit-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-edit-prompt.js","sourceRoot":"","sources":["../src/slate-edit-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C;;;;;GAKG;AAEH,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC;AACvD,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AAE1D,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAa,EAAE,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7F,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAmB,EAAU,EAAE;IACxD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,IAAI,GAAG,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC/C,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC,MAAM,CAAE,CAAC;IAC5C,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC,GAAG,CAAE,CAAC;IACzC,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;AACrD,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,QAAgB,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;AAExE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAmB,EAAgE,EAAE,CAAC,CAAC;IAClH,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IACnC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;CACrC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAKlC,EAAoD,EAAE;IACrD,MAAM,KAAK,GAAG,CAAC,mGAAmG,CAAC,CAAC;IACpH,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,CACR,2FAA2F,IAAI,CAAC,SAAS,YAAY;cACnH,2EAA2E;cAC3E,6BAA6B,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,KAAK,gBAAgB,MAAM,CAAC,GAAG,QAAQ,MAAM,CAAC,MAAM,SAAS,CAChK,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,wDAAwD,EAAE,qBAAqB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACzG,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;AACjE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-edit-runner.d.ts","sourceRoot":"","sources":["../src/slate-edit-runner.ts"],"names":[],"mappings":"AAIA,OAAO,EAML,KAAK,OAAO,EACZ,KAAK,SAAS,EACf,MAAM,2BAA2B,CAAC;AAInC,OAAO,KAAK,EAAmB,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAe3E,eAAO,MAAM,OAAO,GAAU,KAAK,SAAS,EAAE,IAAI,OAAO,KAAG,OAAO,CAAC,OAAO,CAmE1E,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import sharp from 'sharp';
|
|
2
|
+
import { sha256Hex } from './slate-ids.js';
|
|
3
|
+
import { editAnnotatedFile, editSourceFile, readWorkspaceFile, versionImageFile } from './slate-paths.js';
|
|
4
|
+
import { errorFromRunner, failure, ledger, patchOp, setPhase, } from './slate-runner-context.js';
|
|
5
|
+
import { imageFailureMessage } from './slate-runner-failure.js';
|
|
6
|
+
import { writeImageOnce } from './slate-versions.js';
|
|
7
|
+
import { findCandidate } from './slate-workspace-store.js';
|
|
8
|
+
/**
|
|
9
|
+
* Edit: one native image call with the parent and, when the user drew, the
|
|
10
|
+
* annotated copy, both read from the files the click committed and checked
|
|
11
|
+
* against the digests frozen in `op.params`. The parent version is never
|
|
12
|
+
* touched; the new image is written once under `versions/` and registered as
|
|
13
|
+
* the option's next version. The call id is `slate-<opId>`.
|
|
14
|
+
*/
|
|
15
|
+
const readFrozen = async (env, file, sha256) => {
|
|
16
|
+
const read = await readWorkspaceFile(env.root, file);
|
|
17
|
+
return read.state === 'ok' && read.sha256 === sha256 ? read.bytes : null;
|
|
18
|
+
};
|
|
19
|
+
export const runEdit = async (env, op) => {
|
|
20
|
+
const params = op.params;
|
|
21
|
+
const source = await readFrozen(env, editSourceFile(env.root, env.opId), params.sourceSha256);
|
|
22
|
+
if (!source)
|
|
23
|
+
return failure('source_changed', 'The image this edit was started from is missing or changed.');
|
|
24
|
+
let annotated = null;
|
|
25
|
+
if (params.annotatedSha256) {
|
|
26
|
+
annotated = await readFrozen(env, editAnnotatedFile(env.root, env.opId), params.annotatedSha256);
|
|
27
|
+
if (!annotated)
|
|
28
|
+
return failure('source_changed', 'The marked copy of the image is missing or changed.');
|
|
29
|
+
}
|
|
30
|
+
const callId = `slate-${env.opId}`;
|
|
31
|
+
await setPhase(env, 'drawing');
|
|
32
|
+
let png;
|
|
33
|
+
let reused;
|
|
34
|
+
try {
|
|
35
|
+
await ledger(env, { event: 'call_started', callId });
|
|
36
|
+
const result = await env.executor.generate({
|
|
37
|
+
callId,
|
|
38
|
+
prompt: params.sentPrompt,
|
|
39
|
+
images: annotated ? [source, annotated] : [source],
|
|
40
|
+
expected: { width: params.width, height: params.height },
|
|
41
|
+
});
|
|
42
|
+
png = await sharp(result.png, { animated: false, failOn: 'warning' }).png().toBuffer();
|
|
43
|
+
reused = result.reused;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
const cause = error?.cause;
|
|
47
|
+
await env.log({
|
|
48
|
+
event: 'call_failed',
|
|
49
|
+
code: error?.code ?? null,
|
|
50
|
+
message: error instanceof Error ? error.message.slice(0, 300) : String(error).slice(0, 300),
|
|
51
|
+
...(cause instanceof Error ? { cause: cause.message.slice(0, 300) } : {}),
|
|
52
|
+
});
|
|
53
|
+
return failure('edit_failed', imageFailureMessage(error), { retryable: true });
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const facts = await sharp(png).metadata();
|
|
57
|
+
const sha256 = sha256Hex(png);
|
|
58
|
+
await writeImageOnce(versionImageFile(env.root, params.newVersionId), png, sha256);
|
|
59
|
+
await ledger(env, { event: 'call_finished', callId, sha256, reused });
|
|
60
|
+
await patchOp(env, (current, workspace) => {
|
|
61
|
+
if (workspace.versions.some((entry) => entry.versionId === params.newVersionId))
|
|
62
|
+
return;
|
|
63
|
+
const candidate = findCandidate(workspace, params.candidateId);
|
|
64
|
+
workspace.versions.push({
|
|
65
|
+
versionId: params.newVersionId,
|
|
66
|
+
candidateId: params.candidateId,
|
|
67
|
+
n: params.n,
|
|
68
|
+
kind: 'edit',
|
|
69
|
+
parentVersionId: params.parentVersionId,
|
|
70
|
+
opId: env.opId,
|
|
71
|
+
prompt: params.prompt,
|
|
72
|
+
sentPromptSha256: params.sentPromptSha256,
|
|
73
|
+
marks: params.region ? { strokes: params.strokeCount, region: params.region } : null,
|
|
74
|
+
sha256,
|
|
75
|
+
width: facts.width ?? params.width,
|
|
76
|
+
height: facts.height ?? params.height,
|
|
77
|
+
createdAt: env.clock.now().toISOString(),
|
|
78
|
+
});
|
|
79
|
+
candidate.versionIds.push(params.newVersionId);
|
|
80
|
+
current.resultVersionIds = [params.newVersionId];
|
|
81
|
+
});
|
|
82
|
+
await env.log({ event: 'collected', sha256, reused });
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
// The image is on disk (or the record write failed): a Resume registers it without another call.
|
|
86
|
+
return { state: 'failed', error: { ...errorFromRunner(error), resumable: true } };
|
|
87
|
+
}
|
|
88
|
+
return { state: 'succeeded' };
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=slate-edit-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-edit-runner.js","sourceRoot":"","sources":["../src/slate-edit-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SlateErrorCode } from './slate-errors.js';
|
|
2
|
+
import type { SlateCandidate, SlateOp, SlateRound, SlateWorkspace } from './slate-workspace-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Whether an option can take another action, decided from the record alone
|
|
5
|
+
* (no file reads, no network), so the view and `run` agree.
|
|
6
|
+
*/
|
|
7
|
+
export type Blocker = {
|
|
8
|
+
code: SlateErrorCode;
|
|
9
|
+
message: string;
|
|
10
|
+
};
|
|
11
|
+
/** An op keeps its option busy while it runs, is interrupted, or ended in a state a free Resume continues. */
|
|
12
|
+
export declare const opHoldsOption: (op: SlateOp) => boolean;
|
|
13
|
+
export declare const optionOf: (workspace: SlateWorkspace, candidateId: string) => {
|
|
14
|
+
candidate: SlateCandidate;
|
|
15
|
+
round: SlateRound;
|
|
16
|
+
} | undefined;
|
|
17
|
+
export declare const busyOp: (workspace: SlateWorkspace, candidate: SlateCandidate) => SlateOp | undefined;
|
|
18
|
+
/** `null` when the option can take an edit now. */
|
|
19
|
+
export declare const editBlocker: (workspace: SlateWorkspace, candidate: SlateCandidate) => Blocker | null;
|
|
20
|
+
//# sourceMappingURL=slate-editability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-editability.d.ts","sourceRoot":"","sources":["../src/slate-editability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEtG;;;GAGG;AAEH,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,8GAA8G;AAC9G,eAAO,MAAM,aAAa,GAAI,IAAI,OAAO,KAAG,OAE3C,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,WAAW,cAAc,EAAE,aAAa,MAAM,KAAG;IACxE,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,UAAU,CAAC;CACnB,GAAG,SAIH,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,WAAW,cAAc,EAAE,WAAW,cAAc,KAAG,OAAO,GAAG,SAMvF,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,WAAW,GAAI,WAAW,cAAc,EAAE,WAAW,cAAc,KAAG,OAAO,GAAG,IAI5F,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** An op keeps its option busy while it runs, is interrupted, or ended in a state a free Resume continues. */
|
|
2
|
+
export const opHoldsOption = (op) => (op.state === 'running' || (op.state === 'failed' && op.error?.resumable === true));
|
|
3
|
+
export const optionOf = (workspace, candidateId) => {
|
|
4
|
+
const candidate = workspace.candidates.find((entry) => entry.candidateId === candidateId);
|
|
5
|
+
const round = candidate && workspace.rounds.find((entry) => entry.roundId === candidate.roundId);
|
|
6
|
+
return candidate && round ? { candidate, round } : undefined;
|
|
7
|
+
};
|
|
8
|
+
export const busyOp = (workspace, candidate) => (workspace.ops.find((op) => {
|
|
9
|
+
if (!opHoldsOption(op))
|
|
10
|
+
return false;
|
|
11
|
+
if (op.params.kind === 'round')
|
|
12
|
+
return op.params.candidateIds.includes(candidate.candidateId);
|
|
13
|
+
return op.target.candidateId === candidate.candidateId;
|
|
14
|
+
}));
|
|
15
|
+
/** `null` when the option can take an edit now. */
|
|
16
|
+
export const editBlocker = (workspace, candidate) => (busyOp(workspace, candidate)
|
|
17
|
+
? { code: 'candidate_busy', message: `${candidate.label} is busy with work that has not finished.` }
|
|
18
|
+
: null);
|
|
19
|
+
//# sourceMappingURL=slate-editability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-editability.js","sourceRoot":"","sources":["../src/slate-editability.ts"],"names":[],"mappings":"AAUA,8GAA8G;AAC9G,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAW,EAAW,EAAE,CAAC,CACrD,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,QAAQ,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC,CAClF,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,SAAyB,EAAE,WAAmB,EAGzD,EAAE;IACd,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,SAAS,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC;IACjG,OAAO,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,SAAyB,EAAE,SAAyB,EAAuB,EAAE,CAAC,CACnG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;IACxB,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC9F,OAAO,EAAE,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,WAAW,CAAC;AACzD,CAAC,CAAC,CACH,CAAC;AAEF,mDAAmD;AACnD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAyB,EAAE,SAAyB,EAAkB,EAAE,CAAC,CACnG,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC;IAC1B,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,KAAK,2CAA2C,EAAE;IACpG,CAAC,CAAC,IAAI,CACT,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Errors the design workspace tools return as `{ code, message, retryable }`. */
|
|
2
|
+
export type SlateErrorCode = 'intent_conflict' | 'candidate_busy' | 'no_fresh_references' | 'local_unavailable' | 'source_missing' | 'invalid_input' | 'workspace_busy' | 'state_invalid' | 'approval_missing' | 'approval_mismatch' | 'not_resumable' | 'superseded' | 'file_missing' | 'file_changed' | 'not_found' | 'unknown_reference' | 'rate_limited' | 'corpus_unavailable' | 'too_large';
|
|
3
|
+
export declare class SlateError extends Error {
|
|
4
|
+
readonly code: SlateErrorCode;
|
|
5
|
+
readonly retryable: boolean;
|
|
6
|
+
readonly retryAfterSeconds: number | undefined;
|
|
7
|
+
constructor(code: SlateErrorCode, message: string, options?: {
|
|
8
|
+
retryAfterSeconds?: number;
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
/** A record on disk failed strict validation. Never repaired silently. */
|
|
12
|
+
export declare class SlateStateInvalidError extends SlateError {
|
|
13
|
+
constructor(file: string, detail: string);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=slate-errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-errors.d.ts","sourceRoot":"","sources":["../src/slate-errors.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,MAAM,MAAM,cAAc,GACtB,iBAAiB,GACjB,gBAAgB,GAChB,qBAAqB,GACrB,mBAAmB,GACnB,gBAAgB,GAChB,eAAe,GACf,gBAAgB,GAChB,eAAe,GACf,kBAAkB,GAClB,mBAAmB,GACnB,eAAe,GACf,YAAY,GACZ,cAAc,GACd,cAAc,GACd,WAAW,GACX,mBAAmB,GACnB,cAAc,GACd,oBAAoB,GACpB,WAAW,CAAC;AAIhB,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;gBAEnC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAO;CAOhG;AAED,0EAA0E;AAC1E,qBAAa,sBAAuB,SAAQ,UAAU;gBACxC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAGzC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Errors the design workspace tools return as `{ code, message, retryable }`. */
|
|
2
|
+
const RETRYABLE = new Set(['workspace_busy', 'rate_limited', 'corpus_unavailable']);
|
|
3
|
+
export class SlateError extends Error {
|
|
4
|
+
code;
|
|
5
|
+
retryable;
|
|
6
|
+
retryAfterSeconds;
|
|
7
|
+
constructor(code, message, options = {}) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = 'SlateError';
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.retryable = RETRYABLE.has(code);
|
|
12
|
+
this.retryAfterSeconds = options.retryAfterSeconds;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** A record on disk failed strict validation. Never repaired silently. */
|
|
16
|
+
export class SlateStateInvalidError extends SlateError {
|
|
17
|
+
constructor(file, detail) {
|
|
18
|
+
super('state_invalid', `${file} is not a valid 12ui workspace record: ${detail}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=slate-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-errors.js","sourceRoot":"","sources":["../src/slate-errors.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAuBlF,MAAM,SAAS,GAAgC,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE,cAAc,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAEjH,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,IAAI,CAAiB;IACrB,SAAS,CAAU;IACnB,iBAAiB,CAAqB;IAE/C,YAAY,IAAoB,EAAE,OAAe,EAAE,UAA0C,EAAE;QAC7F,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACrD,CAAC;CACF;AAED,0EAA0E;AAC1E,MAAM,OAAO,sBAAuB,SAAQ,UAAU;IACpD,YAAY,IAAY,EAAE,MAAc;QACtC,KAAK,CAAC,eAAe,EAAE,GAAG,IAAI,0CAA0C,MAAM,EAAE,CAAC,CAAC;IACpF,CAAC;CACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { SlateHandoffRecord } from './slate-view-contract.js';
|
|
2
|
+
/**
|
|
3
|
+
* What a Branch or Convert hand-off may carry, decided in one place: the
|
|
4
|
+
* record parser, the `handoff` tool and the text the agent reads all use it.
|
|
5
|
+
* The combinations are the CLI's own (`12ui convert`): local formats are HTML,
|
|
6
|
+
* React and Assets with `--clean-assets`; every other format is the 12ui
|
|
7
|
+
* service and takes `--model`, `--width` and, for responsive HTML only,
|
|
8
|
+
* `--responsive-quality`.
|
|
9
|
+
*/
|
|
10
|
+
export declare const BRANCH_EXPLANATION_MAX_CHARACTERS = 2000;
|
|
11
|
+
export declare const LOCAL_CONVERT_OUTPUTS: readonly ["html", "react", "assets"];
|
|
12
|
+
export declare const SERVICE_CONVERT_OUTPUTS: readonly ["html", "layerdoc", "html_fixed", "svg", "png", "jpg", "webp", "pdf", "psd", "pptx", "sketch"];
|
|
13
|
+
type BranchOptions = Extract<SlateHandoffRecord, {
|
|
14
|
+
kind: 'branch';
|
|
15
|
+
}>['options'];
|
|
16
|
+
type ConvertOptions = Extract<SlateHandoffRecord, {
|
|
17
|
+
kind: 'convert';
|
|
18
|
+
}>['options'];
|
|
19
|
+
export type HandoffOptionsResult<T> = {
|
|
20
|
+
ok: true;
|
|
21
|
+
options: T;
|
|
22
|
+
} | {
|
|
23
|
+
ok: false;
|
|
24
|
+
message: string;
|
|
25
|
+
};
|
|
26
|
+
/** Control characters are stripped except tab and newline; the rest is the user's text, verbatim. */
|
|
27
|
+
export declare const cleanExplanation: (value: string) => string;
|
|
28
|
+
export declare const parseBranchOptions: (value: unknown) => HandoffOptionsResult<BranchOptions>;
|
|
29
|
+
export declare const parseConvertOptions: (value: unknown) => HandoffOptionsResult<ConvertOptions>;
|
|
30
|
+
export declare const parseHandoffOptions: (kind: unknown, value: unknown) => HandoffOptionsResult<SlateHandoffRecord["options"]>;
|
|
31
|
+
/** The command lines an agent runs for a recorded Convert, with the image path filled in. */
|
|
32
|
+
export declare const convertCommands: (options: ConvertOptions, imagePath: string) => string[];
|
|
33
|
+
/**
|
|
34
|
+
* The choice in words an agent maps to the commands above: a local format is
|
|
35
|
+
* the free Codex engine's HTML run, and React and Assets are derived from that
|
|
36
|
+
* run by `12ui export`; a service format is one `12ui convert --engine api`.
|
|
37
|
+
*/
|
|
38
|
+
export declare const convertChoiceWords: (options: ConvertOptions) => string;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=slate-handoff-options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-handoff-options.d.ts","sourceRoot":"","sources":["../src/slate-handoff-options.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAsB,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEvF;;;;;;;GAOG;AAEH,eAAO,MAAM,iCAAiC,OAAQ,CAAC;AAEvD,eAAO,MAAM,qBAAqB,sCAAuC,CAAC;AAC1E,eAAO,MAAM,uBAAuB,0GAEc,CAAC;AAEnD,KAAK,aAAa,GAAG,OAAO,CAAC,kBAAkB,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CAAC,SAAS,CAAC,CAAC;AAChF,KAAK,cAAc,GAAG,OAAO,CAAC,kBAAkB,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC,SAAS,CAAC,CAAC;AAClF,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAShG,qGAAqG;AACrG,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,KAAG,MAGhD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,OAAO,OAAO,KAAG,oBAAoB,CAAC,aAAa,CAWrF,CAAC;AAIF,eAAO,MAAM,mBAAmB,GAAI,OAAO,OAAO,KAAG,oBAAoB,CAAC,cAAc,CAoCvF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,MAAM,OAAO,EAAE,OAAO,OAAO,KAAG,oBAAoB,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAIrH,CAAC;AAEF,6FAA6F;AAC7F,eAAO,MAAM,eAAe,GAAI,SAAS,cAAc,EAAE,WAAW,MAAM,KAAG,MAAM,EAelF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,cAAc,KAAG,MAM5D,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { CONVERSION_OUTPUT_FORMATS } from './conversion-outputs.js';
|
|
2
|
+
import { MAX_IMAGE_OUTPUT_WIDTH } from './image-output-width.js';
|
|
3
|
+
/**
|
|
4
|
+
* What a Branch or Convert hand-off may carry, decided in one place: the
|
|
5
|
+
* record parser, the `handoff` tool and the text the agent reads all use it.
|
|
6
|
+
* The combinations are the CLI's own (`12ui convert`): local formats are HTML,
|
|
7
|
+
* React and Assets with `--clean-assets`; every other format is the 12ui
|
|
8
|
+
* service and takes `--model`, `--width` and, for responsive HTML only,
|
|
9
|
+
* `--responsive-quality`.
|
|
10
|
+
*/
|
|
11
|
+
export const BRANCH_EXPLANATION_MAX_CHARACTERS = 2_000;
|
|
12
|
+
export const LOCAL_CONVERT_OUTPUTS = ['html', 'react', 'assets'];
|
|
13
|
+
export const SERVICE_CONVERT_OUTPUTS = [
|
|
14
|
+
'html', 'layerdoc', 'html_fixed', 'svg', 'png', 'jpg', 'webp', 'pdf', 'psd', 'pptx', 'sketch',
|
|
15
|
+
];
|
|
16
|
+
const isRecord = (value) => (!!value && typeof value === 'object' && !Array.isArray(value));
|
|
17
|
+
const ok = (options) => ({ ok: true, options });
|
|
18
|
+
const no = (message) => ({ ok: false, message });
|
|
19
|
+
/** Control characters are stripped except tab and newline; the rest is the user's text, verbatim. */
|
|
20
|
+
export const cleanExplanation = (value) => (
|
|
21
|
+
// eslint-disable-next-line no-control-regex
|
|
22
|
+
value.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/gu, '').trim());
|
|
23
|
+
export const parseBranchOptions = (value) => {
|
|
24
|
+
if (!isRecord(value))
|
|
25
|
+
return no('options must be an object');
|
|
26
|
+
const extra = Object.keys(value).filter((key) => key !== 'explanation');
|
|
27
|
+
if (extra.length > 0)
|
|
28
|
+
return no(`Branch takes only an explanation, not ${extra.join(', ')}.`);
|
|
29
|
+
if (typeof value.explanation !== 'string')
|
|
30
|
+
return no('options.explanation must be text');
|
|
31
|
+
const explanation = cleanExplanation(value.explanation);
|
|
32
|
+
if (!explanation)
|
|
33
|
+
return no('Say what should be built.');
|
|
34
|
+
if ([...explanation].length > BRANCH_EXPLANATION_MAX_CHARACTERS) {
|
|
35
|
+
return no(`An explanation can be at most ${BRANCH_EXPLANATION_MAX_CHARACTERS} characters.`);
|
|
36
|
+
}
|
|
37
|
+
return ok({ explanation });
|
|
38
|
+
};
|
|
39
|
+
const CONVERT_KEYS = new Set(['engine', 'output', 'cleanAssets', 'model', 'width', 'responsiveQuality']);
|
|
40
|
+
export const parseConvertOptions = (value) => {
|
|
41
|
+
if (!isRecord(value))
|
|
42
|
+
return no('options must be an object');
|
|
43
|
+
const extra = Object.keys(value).filter((key) => !CONVERT_KEYS.has(key));
|
|
44
|
+
if (extra.length > 0)
|
|
45
|
+
return no(`Convert does not take ${extra.join(', ')}.`);
|
|
46
|
+
const { engine, output } = value;
|
|
47
|
+
if (engine !== 'local' && engine !== 'service')
|
|
48
|
+
return no('engine must be local or service');
|
|
49
|
+
const allowed = engine === 'local' ? LOCAL_CONVERT_OUTPUTS : SERVICE_CONVERT_OUTPUTS;
|
|
50
|
+
if (typeof output !== 'string' || !allowed.includes(output)) {
|
|
51
|
+
return no(`${engine === 'local' ? 'A local' : 'A service'} conversion outputs one of ${allowed.join(', ')}.`);
|
|
52
|
+
}
|
|
53
|
+
const options = { engine, output: output };
|
|
54
|
+
const present = (key) => value[key] !== undefined && value[key] !== null;
|
|
55
|
+
if (present('cleanAssets')) {
|
|
56
|
+
if (engine !== 'local')
|
|
57
|
+
return no('cleanAssets applies only to a local conversion.');
|
|
58
|
+
if (value.cleanAssets !== 'crop' && value.cleanAssets !== 'enhance')
|
|
59
|
+
return no('cleanAssets must be crop or enhance');
|
|
60
|
+
options.cleanAssets = value.cleanAssets;
|
|
61
|
+
}
|
|
62
|
+
if (present('model')) {
|
|
63
|
+
if (engine !== 'service')
|
|
64
|
+
return no('model applies only to a service conversion.');
|
|
65
|
+
if (value.model !== 'fast' && value.model !== 'standard' && value.model !== 'pro')
|
|
66
|
+
return no('model must be fast, standard or pro');
|
|
67
|
+
options.model = value.model;
|
|
68
|
+
}
|
|
69
|
+
if (present('width')) {
|
|
70
|
+
if (engine !== 'service')
|
|
71
|
+
return no('width applies only to a service conversion.');
|
|
72
|
+
const width = value.width;
|
|
73
|
+
if (typeof width !== 'number' || !Number.isSafeInteger(width) || width < 1 || width > MAX_IMAGE_OUTPUT_WIDTH) {
|
|
74
|
+
return no(`width must be an integer from 1 to ${MAX_IMAGE_OUTPUT_WIDTH}`);
|
|
75
|
+
}
|
|
76
|
+
options.width = width;
|
|
77
|
+
}
|
|
78
|
+
if (present('responsiveQuality')) {
|
|
79
|
+
if (engine !== 'service' || output !== 'html')
|
|
80
|
+
return no('responsiveQuality applies only to Responsive HTML.');
|
|
81
|
+
if (value.responsiveQuality !== 'standard' && value.responsiveQuality !== 'pro')
|
|
82
|
+
return no('responsiveQuality must be standard or pro');
|
|
83
|
+
options.responsiveQuality = value.responsiveQuality;
|
|
84
|
+
}
|
|
85
|
+
return ok(options);
|
|
86
|
+
};
|
|
87
|
+
export const parseHandoffOptions = (kind, value) => {
|
|
88
|
+
if (kind === 'branch')
|
|
89
|
+
return parseBranchOptions(value);
|
|
90
|
+
if (kind === 'convert')
|
|
91
|
+
return parseConvertOptions(value);
|
|
92
|
+
return no('kind must be convert or branch');
|
|
93
|
+
};
|
|
94
|
+
/** The command lines an agent runs for a recorded Convert, with the image path filled in. */
|
|
95
|
+
export const convertCommands = (options, imagePath) => {
|
|
96
|
+
const image = JSON.stringify(imagePath);
|
|
97
|
+
if (options.engine === 'service') {
|
|
98
|
+
const flags = [
|
|
99
|
+
`--output ${options.output}`,
|
|
100
|
+
'--engine api',
|
|
101
|
+
...(options.model ? [`--model ${options.model}`] : []),
|
|
102
|
+
...(options.width ? [`--width ${options.width}`] : []),
|
|
103
|
+
...(options.responsiveQuality ? [`--responsive-quality ${options.responsiveQuality}`] : []),
|
|
104
|
+
];
|
|
105
|
+
return [`12ui convert ${image} ${flags.join(' ')}`];
|
|
106
|
+
}
|
|
107
|
+
const local = `12ui convert ${image} --output html --engine codex --image-backend native --clean-assets ${options.cleanAssets ?? 'enhance'}`;
|
|
108
|
+
if (options.output === 'html')
|
|
109
|
+
return [local];
|
|
110
|
+
return [local, `12ui export <the local run directory the convert printed> --output ${options.output} --out-dir <directory>`];
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* The choice in words an agent maps to the commands above: a local format is
|
|
114
|
+
* the free Codex engine's HTML run, and React and Assets are derived from that
|
|
115
|
+
* run by `12ui export`; a service format is one `12ui convert --engine api`.
|
|
116
|
+
*/
|
|
117
|
+
export const convertChoiceWords = (options) => {
|
|
118
|
+
if (options.engine === 'service')
|
|
119
|
+
return `${CONVERSION_OUTPUT_FORMATS[options.output]?.label ?? options.output} from the 12ui service`;
|
|
120
|
+
const clean = `asset cleanup ${options.cleanAssets ?? 'enhance'}`;
|
|
121
|
+
if (options.output === 'react')
|
|
122
|
+
return `React (whole-page JSX and CSS) from the local Codex engine, ${clean}`;
|
|
123
|
+
if (options.output === 'assets')
|
|
124
|
+
return `image assets (the cut-out files) from the local Codex engine, ${clean}`;
|
|
125
|
+
return `HTML from the local Codex engine, ${clean}`;
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=slate-handoff-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-handoff-options.js","sourceRoot":"","sources":["../src/slate-handoff-options.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SlateRuntime } from './slate-runtime.js';
|
|
2
|
+
import type { SlateHandoffRecord } from './slate-workspace-types.js';
|
|
3
|
+
export declare const recordHandoff: (args: {
|
|
4
|
+
runtime: SlateRuntime;
|
|
5
|
+
root: string;
|
|
6
|
+
handoffId: unknown;
|
|
7
|
+
kind: unknown;
|
|
8
|
+
versionId: unknown;
|
|
9
|
+
options: unknown;
|
|
10
|
+
}) => Promise<SlateHandoffRecord>;
|
|
11
|
+
//# sourceMappingURL=slate-handoff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-handoff.d.ts","sourceRoot":"","sources":["../src/slate-handoff.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAerE,eAAO,MAAM,aAAa,GAAU,MAAM;IACxC,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB,KAAG,OAAO,CAAC,kBAAkB,CAkC7B,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { SlateError } from './slate-errors.js';
|
|
2
|
+
import { parseHandoffOptions } from './slate-handoff-options.js';
|
|
3
|
+
import { HANDOFF_ID_PATTERN, VERSION_ID_PATTERN, digestOf } from './slate-ids.js';
|
|
4
|
+
import { appendLedger } from './slate-ledger.js';
|
|
5
|
+
import { handoffImagePath } from './slate-view.js';
|
|
6
|
+
import { readVersionBytes, writeImageOnce } from './slate-versions.js';
|
|
7
|
+
import { WORKSPACE_MAX_HANDOFFS } from './slate-workspace-parse.js';
|
|
8
|
+
import { NoWrite, findVersion, mutateWorkspace } from './slate-workspace-store.js';
|
|
9
|
+
/**
|
|
10
|
+
* Branch and Convert hand-offs: a durable record of what the user asked the
|
|
11
|
+
* agent to do, with a verified copy of the image it is about. Nothing here
|
|
12
|
+
* starts work or changes the pick; the agent reads the record through
|
|
13
|
+
* `design.slate.data` and carries it out (asking before anything that costs
|
|
14
|
+
* money). The user's own words are stored verbatim and never put in the
|
|
15
|
+
* message the app sends.
|
|
16
|
+
*/
|
|
17
|
+
const contentDigest = (record) => (digestOf({ kind: record.kind, versionId: record.versionId, sha256: record.sha256, options: record.options }));
|
|
18
|
+
export const recordHandoff = async (args) => {
|
|
19
|
+
if (typeof args.handoffId !== 'string' || !HANDOFF_ID_PATTERN.test(args.handoffId)) {
|
|
20
|
+
throw new SlateError('invalid_input', 'handoffId must be a UUID v4 minted when the dialog opened.');
|
|
21
|
+
}
|
|
22
|
+
if (typeof args.versionId !== 'string' || !VERSION_ID_PATTERN.test(args.versionId)) {
|
|
23
|
+
throw new SlateError('invalid_input', 'versionId is not a version id');
|
|
24
|
+
}
|
|
25
|
+
const kind = args.kind;
|
|
26
|
+
if (kind !== 'convert' && kind !== 'branch')
|
|
27
|
+
throw new SlateError('invalid_input', 'kind must be convert or branch');
|
|
28
|
+
const options = parseHandoffOptions(kind, args.options);
|
|
29
|
+
if (!options.ok)
|
|
30
|
+
throw new SlateError('invalid_input', options.message);
|
|
31
|
+
const { handoffId, versionId } = args;
|
|
32
|
+
return mutateWorkspace(args.root, async (ws, context) => {
|
|
33
|
+
const version = findVersion(ws, versionId);
|
|
34
|
+
const existing = ws.handoffs.find((entry) => entry.handoffId === handoffId);
|
|
35
|
+
const wanted = { kind, versionId: version.versionId, sha256: version.sha256, options: options.options };
|
|
36
|
+
if (existing) {
|
|
37
|
+
if (contentDigest(existing) !== contentDigest(wanted)) {
|
|
38
|
+
throw new SlateError('intent_conflict', 'This hand-off id was already used for a different request.');
|
|
39
|
+
}
|
|
40
|
+
return new NoWrite(existing);
|
|
41
|
+
}
|
|
42
|
+
// Explicit errors for a missing or changed file: only a verified image is handed off.
|
|
43
|
+
const bytes = await readVersionBytes(args.root, ws, version);
|
|
44
|
+
const newest = ws.handoffs.at(-1);
|
|
45
|
+
if (newest && contentDigest(newest) === contentDigest(wanted))
|
|
46
|
+
return new NoWrite(newest);
|
|
47
|
+
await writeImageOnce(handoffImagePath(args.runtime.stateRoot, ws.workspaceId, handoffId, version.sha256), bytes, version.sha256);
|
|
48
|
+
const record = { ...wanted, handoffId, requestedAt: context.now.toISOString() };
|
|
49
|
+
ws.handoffs.push(record);
|
|
50
|
+
if (ws.handoffs.length > WORKSPACE_MAX_HANDOFFS)
|
|
51
|
+
ws.handoffs.splice(0, ws.handoffs.length - WORKSPACE_MAX_HANDOFFS);
|
|
52
|
+
await appendLedger(args.root, { event: 'handoff', kind, versionId: version.versionId, handoffId, at: context.now.toISOString() });
|
|
53
|
+
return record;
|
|
54
|
+
}, { now: args.runtime.now });
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=slate-handoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-handoff.js","sourceRoot":"","sources":["../src/slate-handoff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGnF;;;;;;;GAOG;AAEH,MAAM,aAAa,GAAG,CAAC,MAA6E,EAAU,EAAE,CAAC,CAC/G,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAC7G,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,IAOnC,EAA+B,EAAE;IAChC,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,UAAU,CAAC,eAAe,EAAE,4DAA4D,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,UAAU,CAAC,eAAe,EAAE,+BAA+B,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ;QAAE,MAAM,IAAI,UAAU,CAAC,eAAe,EAAE,gCAAgC,CAAC,CAAC;IACrH,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,IAAI,UAAU,CAAC,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACxE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAgD,CAAC;IAElF,OAAO,eAAe,CAAqB,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE;QAC1E,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAwB,CAAC;QAC9H,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,UAAU,CAAC,iBAAiB,EAAE,4DAA4D,CAAC,CAAC;YACxG,CAAC;YACD,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QACD,sFAAsF;QACtF,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1F,MAAM,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACjI,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,EAAwB,CAAC;QACtG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,sBAAsB;YAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,sBAAsB,CAAC,CAAC;QACpH,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAClI,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAChC,CAAC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Id grammar for the design workspace. Every id read from `workspace.json` is
|
|
3
|
+
* matched against these patterns before it is used to build a path or a
|
|
4
|
+
* request: the file is untrusted input (see `slate-workspace-parse.ts`).
|
|
5
|
+
*/
|
|
6
|
+
export declare const OP_ID_PATTERN: RegExp;
|
|
7
|
+
export declare const ROUND_ID_PATTERN: RegExp;
|
|
8
|
+
export declare const SLOT_PATTERN: RegExp;
|
|
9
|
+
export declare const LOCAL_SLOT_PATTERN: RegExp;
|
|
10
|
+
export declare const CANDIDATE_ID_PATTERN: RegExp;
|
|
11
|
+
export declare const VERSION_ID_PATTERN: RegExp;
|
|
12
|
+
/** A UUID v4 minted by the app: hand-off ids use the same grammar as op ids. */
|
|
13
|
+
export declare const HANDOFF_ID_PATTERN: RegExp;
|
|
14
|
+
/** A corpus reference id (`PR6:corpus-client.ts` `download`). */
|
|
15
|
+
export declare const REFERENCE_ID_PATTERN: RegExp;
|
|
16
|
+
export declare const SEARCH_ID_PATTERN: RegExp;
|
|
17
|
+
export declare const WORKSPACE_ID_PATTERN: RegExp;
|
|
18
|
+
export declare const SHA256_PATTERN: RegExp;
|
|
19
|
+
export declare const sha256Hex: (value: string | Uint8Array) => string;
|
|
20
|
+
/** The workspace id: stable across restarts, not a secret and not an authority. */
|
|
21
|
+
export declare const workspaceIdFor: (rootRunId: string) => string;
|
|
22
|
+
export declare const roundIdFor: (index: number) => string;
|
|
23
|
+
export declare const candidateIdFor: (roundId: string, slot: string) => string;
|
|
24
|
+
export declare const generationVersionId: (roundId: string, slot: string) => string;
|
|
25
|
+
/** The slot letter an option id ends with: `r3_c` is slot `c`. */
|
|
26
|
+
export declare const slotOfCandidate: (candidateId: string) => string;
|
|
27
|
+
/** An edit version id is derived from its op, so a resumed op recomputes the same id and file name. */
|
|
28
|
+
export declare const editVersionId: (opId: string) => string;
|
|
29
|
+
export declare const slotFor: (index: number) => string;
|
|
30
|
+
/** Canonical JSON: sorted keys, so a digest does not depend on property order. */
|
|
31
|
+
export declare const canonicalJson: (value: unknown) => string;
|
|
32
|
+
export declare const digestOf: (value: unknown) => string;
|
|
33
|
+
//# sourceMappingURL=slate-ids.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-ids.d.ts","sourceRoot":"","sources":["../src/slate-ids.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,eAAO,MAAM,aAAa,QAA2E,CAAC;AACtG,eAAO,MAAM,gBAAgB,QAAwB,CAAC;AACtD,eAAO,MAAM,YAAY,QAAa,CAAC;AACvC,eAAO,MAAM,kBAAkB,QAAa,CAAC;AAC7C,eAAO,MAAM,oBAAoB,QAA8B,CAAC;AAChE,eAAO,MAAM,kBAAkB,QAAkD,CAAC;AAClF,gFAAgF;AAChF,eAAO,MAAM,kBAAkB,QAAgB,CAAC;AAChD,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,QAA8C,CAAC;AAChF,eAAO,MAAM,iBAAiB,QAAoB,CAAC;AACnD,eAAO,MAAM,oBAAoB,QAAoB,CAAC;AACtD,eAAO,MAAM,cAAc,QAAoB,CAAC;AAEhD,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,GAAG,UAAU,KAAG,MAEtD,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,cAAc,GAAI,WAAW,MAAM,KAAG,MAA2C,CAAC;AAE/F,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,MAAqB,CAAC;AACjE,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,EAAE,MAAM,MAAM,KAAG,MAA8B,CAAC;AAC9F,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,EAAE,MAAM,MAAM,KAAG,MAAgC,CAAC;AACrG,kEAAkE;AAClE,eAAO,MAAM,eAAe,GAAI,aAAa,MAAM,KAAG,MAA6D,CAAC;AACpH,uGAAuG;AACvG,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAA8C,CAAC;AAE5F,eAAO,MAAM,OAAO,GAAI,OAAO,MAAM,KAAG,MAAwD,CAAC;AAEjG,kFAAkF;AAClF,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,MAc9C,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,MAAyC,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Id grammar for the design workspace. Every id read from `workspace.json` is
|
|
4
|
+
* matched against these patterns before it is used to build a path or a
|
|
5
|
+
* request: the file is untrusted input (see `slate-workspace-parse.ts`).
|
|
6
|
+
*/
|
|
7
|
+
export const OP_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/u;
|
|
8
|
+
export const ROUND_ID_PATTERN = /^r[1-9][0-9]{0,2}$/u;
|
|
9
|
+
export const SLOT_PATTERN = /^[a-p]$/u;
|
|
10
|
+
export const LOCAL_SLOT_PATTERN = /^[A-P]$/u;
|
|
11
|
+
export const CANDIDATE_ID_PATTERN = /^r[1-9][0-9]{0,2}_[a-p]$/u;
|
|
12
|
+
export const VERSION_ID_PATTERN = /^v_(?:r[1-9][0-9]{0,2}_[a-p]|e[0-9a-f]{12})$/u;
|
|
13
|
+
/** A UUID v4 minted by the app: hand-off ids use the same grammar as op ids. */
|
|
14
|
+
export const HANDOFF_ID_PATTERN = OP_ID_PATTERN;
|
|
15
|
+
/** A corpus reference id (`PR6:corpus-client.ts` `download`). */
|
|
16
|
+
export const REFERENCE_ID_PATTERN = /^(?:gen|logo-gen)-[A-Za-z0-9._-]{1,120}$/u;
|
|
17
|
+
export const SEARCH_ID_PATTERN = /^[0-9a-f]{16}$/u;
|
|
18
|
+
export const WORKSPACE_ID_PATTERN = /^[0-9a-f]{16}$/u;
|
|
19
|
+
export const SHA256_PATTERN = /^[0-9a-f]{64}$/u;
|
|
20
|
+
export const sha256Hex = (value) => (createHash('sha256').update(value).digest('hex'));
|
|
21
|
+
/** The workspace id: stable across restarts, not a secret and not an authority. */
|
|
22
|
+
export const workspaceIdFor = (rootRunId) => sha256Hex(rootRunId).slice(0, 16);
|
|
23
|
+
export const roundIdFor = (index) => `r${index}`;
|
|
24
|
+
export const candidateIdFor = (roundId, slot) => `${roundId}_${slot}`;
|
|
25
|
+
export const generationVersionId = (roundId, slot) => `v_${roundId}_${slot}`;
|
|
26
|
+
/** The slot letter an option id ends with: `r3_c` is slot `c`. */
|
|
27
|
+
export const slotOfCandidate = (candidateId) => candidateId.slice(candidateId.lastIndexOf('_') + 1);
|
|
28
|
+
/** An edit version id is derived from its op, so a resumed op recomputes the same id and file name. */
|
|
29
|
+
export const editVersionId = (opId) => `v_e${sha256Hex(opId).slice(0, 12)}`;
|
|
30
|
+
export const slotFor = (index) => String.fromCharCode('a'.charCodeAt(0) + index);
|
|
31
|
+
/** Canonical JSON: sorted keys, so a digest does not depend on property order. */
|
|
32
|
+
export const canonicalJson = (value) => {
|
|
33
|
+
const visit = (node) => {
|
|
34
|
+
if (Array.isArray(node))
|
|
35
|
+
return node.map(visit);
|
|
36
|
+
if (node && typeof node === 'object') {
|
|
37
|
+
return Object.fromEntries(Object.entries(node)
|
|
38
|
+
.filter(([, entry]) => entry !== undefined)
|
|
39
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
|
|
40
|
+
.map(([key, entry]) => [key, visit(entry)]));
|
|
41
|
+
}
|
|
42
|
+
return node;
|
|
43
|
+
};
|
|
44
|
+
return JSON.stringify(visit(value));
|
|
45
|
+
};
|
|
46
|
+
export const digestOf = (value) => sha256Hex(canonicalJson(value));
|
|
47
|
+
//# sourceMappingURL=slate-ids.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-ids.js","sourceRoot":"","sources":["../src/slate-ids.ts"],"names":[],"mappings":"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"}
|