@12ui/design 0.2.72 → 0.2.74
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 +242 -54
- 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 +26 -1
- package/dist/cli-capabilities.d.ts.map +1 -1
- package/dist/cli-capabilities.js +26 -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 +113 -7
- package/dist/cli-help/index.d.ts.map +1 -1
- package/dist/cli-help/index.js +2 -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/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 +35 -3
- package/dist/cli-run.js.map +1 -1
- package/dist/cli-usage.d.ts.map +1 -1
- package/dist/cli-usage.js +39 -5
- 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 +41 -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 +123 -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 +145 -0
- package/dist/mcp-slate-ui-copy.d.ts.map +1 -0
- package/dist/mcp-slate-ui-copy.js +164 -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 +21 -0
- package/dist/mcp-slate-ui-script-dialog.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-dialog.js +321 -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 +224 -0
- package/dist/mcp-slate-ui-script-inline.js.map +1 -0
- package/dist/mcp-slate-ui-script-inspiration.d.ts +13 -0
- package/dist/mcp-slate-ui-script-inspiration.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-inspiration.js +236 -0
- package/dist/mcp-slate-ui-script-inspiration.js.map +1 -0
- package/dist/mcp-slate-ui-script-more.d.ts +32 -0
- package/dist/mcp-slate-ui-script-more.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-more.js +289 -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 +12 -0
- package/dist/mcp-slate-ui-script-stage.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-stage.js +180 -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.d.ts +27 -0
- package/dist/mcp-slate-ui-script.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script.js +60 -0
- package/dist/mcp-slate-ui-script.js.map +1 -0
- package/dist/mcp-slate-ui-styles-dialog.d.ts +20 -0
- package/dist/mcp-slate-ui-styles-dialog.d.ts.map +1 -0
- package/dist/mcp-slate-ui-styles-dialog.js +95 -0
- package/dist/mcp-slate-ui-styles-dialog.js.map +1 -0
- package/dist/mcp-slate-ui-styles-stage.d.ts +19 -0
- package/dist/mcp-slate-ui-styles-stage.d.ts.map +1 -0
- package/dist/mcp-slate-ui-styles-stage.js +67 -0
- package/dist/mcp-slate-ui-styles-stage.js.map +1 -0
- package/dist/mcp-slate-ui-styles.d.ts +18 -0
- package/dist/mcp-slate-ui-styles.d.ts.map +1 -0
- package/dist/mcp-slate-ui-styles.js +132 -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 +59 -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-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-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 +18 -5
- package/dist/run-journal-commands.js.map +1 -1
- 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 +43 -0
- package/dist/slate-actions.d.ts.map +1 -0
- package/dist/slate-actions.js +108 -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 +117 -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 +232 -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 +442 -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 +2 -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/skills/12ui-design/SKILL.md +17 -63
- 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/session.md +161 -0
|
@@ -0,0 +1,117 @@
|
|
|
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; 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 (value.explanation !== undefined && value.explanation !== null && typeof value.explanation !== 'string')
|
|
30
|
+
return no('options.explanation must be text');
|
|
31
|
+
const explanation = cleanExplanation(value.explanation ?? '');
|
|
32
|
+
if ([...explanation].length > BRANCH_EXPLANATION_MAX_CHARACTERS) {
|
|
33
|
+
return no(`An explanation can be at most ${BRANCH_EXPLANATION_MAX_CHARACTERS} characters.`);
|
|
34
|
+
}
|
|
35
|
+
return ok({ explanation });
|
|
36
|
+
};
|
|
37
|
+
const CONVERT_KEYS = new Set(['engine', 'output', 'model', 'width', 'responsiveQuality']);
|
|
38
|
+
export const parseConvertOptions = (value) => {
|
|
39
|
+
if (!isRecord(value))
|
|
40
|
+
return no('options must be an object');
|
|
41
|
+
const extra = Object.keys(value).filter((key) => !CONVERT_KEYS.has(key));
|
|
42
|
+
if (extra.length > 0)
|
|
43
|
+
return no(`Convert does not take ${extra.join(', ')}.`);
|
|
44
|
+
const { engine, output } = value;
|
|
45
|
+
if (engine !== 'local' && engine !== 'service')
|
|
46
|
+
return no('engine must be local or service');
|
|
47
|
+
const allowed = engine === 'local' ? LOCAL_CONVERT_OUTPUTS : SERVICE_CONVERT_OUTPUTS;
|
|
48
|
+
if (typeof output !== 'string' || !allowed.includes(output)) {
|
|
49
|
+
return no(`${engine === 'local' ? 'A local' : 'A service'} conversion outputs one of ${allowed.join(', ')}.`);
|
|
50
|
+
}
|
|
51
|
+
const options = { engine, output: output };
|
|
52
|
+
const present = (key) => value[key] !== undefined && value[key] !== null;
|
|
53
|
+
if (present('model')) {
|
|
54
|
+
if (engine !== 'service')
|
|
55
|
+
return no('model applies only to a service conversion.');
|
|
56
|
+
if (value.model !== 'fast' && value.model !== 'standard' && value.model !== 'pro')
|
|
57
|
+
return no('model must be fast, standard or pro');
|
|
58
|
+
options.model = value.model;
|
|
59
|
+
}
|
|
60
|
+
if (present('width')) {
|
|
61
|
+
if (engine !== 'service')
|
|
62
|
+
return no('width applies only to a service conversion.');
|
|
63
|
+
const width = value.width;
|
|
64
|
+
if (typeof width !== 'number' || !Number.isSafeInteger(width) || width < 1 || width > MAX_IMAGE_OUTPUT_WIDTH) {
|
|
65
|
+
return no(`width must be an integer from 1 to ${MAX_IMAGE_OUTPUT_WIDTH}`);
|
|
66
|
+
}
|
|
67
|
+
options.width = width;
|
|
68
|
+
}
|
|
69
|
+
if (present('responsiveQuality')) {
|
|
70
|
+
if (engine !== 'service' || output !== 'html')
|
|
71
|
+
return no('responsiveQuality applies only to Responsive HTML.');
|
|
72
|
+
if (value.responsiveQuality !== 'standard' && value.responsiveQuality !== 'pro')
|
|
73
|
+
return no('responsiveQuality must be standard or pro');
|
|
74
|
+
options.responsiveQuality = value.responsiveQuality;
|
|
75
|
+
}
|
|
76
|
+
return ok(options);
|
|
77
|
+
};
|
|
78
|
+
export const parseHandoffOptions = (kind, value) => {
|
|
79
|
+
if (kind === 'branch')
|
|
80
|
+
return parseBranchOptions(value);
|
|
81
|
+
if (kind === 'convert')
|
|
82
|
+
return parseConvertOptions(value);
|
|
83
|
+
return no('kind must be convert or branch');
|
|
84
|
+
};
|
|
85
|
+
/** The command lines an agent runs for a recorded Convert, with the image path filled in. */
|
|
86
|
+
export const convertCommands = (options, imagePath) => {
|
|
87
|
+
const image = JSON.stringify(imagePath);
|
|
88
|
+
if (options.engine === 'service') {
|
|
89
|
+
const flags = [
|
|
90
|
+
`--output ${options.output}`,
|
|
91
|
+
'--engine api',
|
|
92
|
+
...(options.model ? [`--model ${options.model}`] : []),
|
|
93
|
+
...(options.width ? [`--width ${options.width}`] : []),
|
|
94
|
+
...(options.responsiveQuality ? [`--responsive-quality ${options.responsiveQuality}`] : []),
|
|
95
|
+
];
|
|
96
|
+
return [`12ui convert ${image} ${flags.join(' ')}`];
|
|
97
|
+
}
|
|
98
|
+
const local = `12ui convert ${image} --output html --engine codex --image-backend native`;
|
|
99
|
+
if (options.output === 'html')
|
|
100
|
+
return [local];
|
|
101
|
+
return [local, `12ui export <the local run directory the convert printed> --output ${options.output} --out-dir <directory>`];
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* The choice in words an agent maps to the commands above: a local format is
|
|
105
|
+
* the free Codex engine's HTML run, and React and Assets are derived from that
|
|
106
|
+
* run by `12ui export`; a service format is one `12ui convert --engine api`.
|
|
107
|
+
*/
|
|
108
|
+
export const convertChoiceWords = (options) => {
|
|
109
|
+
if (options.engine === 'service')
|
|
110
|
+
return `${CONVERSION_OUTPUT_FORMATS[options.output]?.label ?? options.output} from the 12ui service`;
|
|
111
|
+
if (options.output === 'react')
|
|
112
|
+
return 'React (whole-page JSX and CSS) from the local Codex engine';
|
|
113
|
+
if (options.output === 'assets')
|
|
114
|
+
return 'image assets (the cut-out files) from the local Codex engine';
|
|
115
|
+
return 'HTML from the local Codex engine';
|
|
116
|
+
};
|
|
117
|
+
//# 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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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How the runner draws an image: one call to the local Codex CLI's native
|
|
3
|
+
* image tool, through the repo's own headless executor
|
|
4
|
+
* (`packages/codex-conversion/src/images/native.mjs`, shipped in the CLI's
|
|
5
|
+
* `runtime/`). It runs on the user's ChatGPT plan, never with an API key, in an
|
|
6
|
+
* isolated `CODEX_HOME` that links only `auth.json`.
|
|
7
|
+
*
|
|
8
|
+
* The call store makes each call id a durable identity: an id whose call
|
|
9
|
+
* already produced an image returns it without another call, and an id whose
|
|
10
|
+
* call died after dispatch is recovered from its own rollout or refused, never
|
|
11
|
+
* dispatched twice. The runner names calls `slate-<opId>-<slot>` and
|
|
12
|
+
* `slate-<opId>`, so a resumed op replays the same ids.
|
|
13
|
+
*/
|
|
14
|
+
export type SlateImageCall = {
|
|
15
|
+
callId: string;
|
|
16
|
+
/** The image prompt, sent verbatim. */
|
|
17
|
+
prompt: string;
|
|
18
|
+
/** Attached images in order; the first is the primary. */
|
|
19
|
+
images: Buffer[];
|
|
20
|
+
/** The frame the result is stretched to exactly. */
|
|
21
|
+
expected: {
|
|
22
|
+
width: number;
|
|
23
|
+
height: number;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export type SlateImageResult = {
|
|
27
|
+
png: Buffer;
|
|
28
|
+
reused: boolean;
|
|
29
|
+
};
|
|
30
|
+
export type SlateImageExecutor = {
|
|
31
|
+
generate: (call: SlateImageCall) => Promise<SlateImageResult>;
|
|
32
|
+
};
|
|
33
|
+
/** One image call may run this long before it is stopped. */
|
|
34
|
+
export declare const IMAGE_CALL_TIMEOUT_MS: number;
|
|
35
|
+
export declare const createNativeImageExecutor: (args: {
|
|
36
|
+
root: string;
|
|
37
|
+
env?: NodeJS.ProcessEnv;
|
|
38
|
+
}) => SlateImageExecutor;
|
|
39
|
+
//# sourceMappingURL=slate-image-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-image-executor.d.ts","sourceRoot":"","sources":["../src/slate-image-executor.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,oDAAoD;IACpD,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAChE,MAAM,MAAM,kBAAkB,GAAG;IAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAA;CAAE,CAAC;AAEnG,6DAA6D;AAC7D,eAAO,MAAM,qBAAqB,QAAc,CAAC;AAmBjD,eAAO,MAAM,yBAAyB,GAAI,MAAM;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAAG,kBAoC3F,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
4
|
+
import { resolveCodexBinary } from './slate-local-image.js';
|
|
5
|
+
/** One image call may run this long before it is stopped. */
|
|
6
|
+
export const IMAGE_CALL_TIMEOUT_MS = 15 * 60_000;
|
|
7
|
+
const importRuntime = async () => {
|
|
8
|
+
const base = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', 'runtime', 'codex-conversion', 'src');
|
|
9
|
+
const load = async (file) => await import(pathToFileURL(path.join(base, file)).href);
|
|
10
|
+
const [store, native] = await Promise.all([load('run-store.mjs'), load('images/native.mjs')]);
|
|
11
|
+
return { ...store, ...native };
|
|
12
|
+
};
|
|
13
|
+
const sha256 = (bytes) => createHash('sha256').update(bytes).digest('hex');
|
|
14
|
+
export const createNativeImageExecutor = (args) => {
|
|
15
|
+
const env = args.env ?? process.env;
|
|
16
|
+
return {
|
|
17
|
+
generate: async (call) => {
|
|
18
|
+
const runtime = await importRuntime();
|
|
19
|
+
// The store keeps one folder per call id under `<root>/calls/`.
|
|
20
|
+
const store = runtime.createStore(args.root);
|
|
21
|
+
const request = {
|
|
22
|
+
backend: 'native',
|
|
23
|
+
model: 'gpt-6-astra',
|
|
24
|
+
effort: 'medium',
|
|
25
|
+
imageModel: null,
|
|
26
|
+
normalization: 'exact-stretch-lanczos3',
|
|
27
|
+
expected: call.expected,
|
|
28
|
+
prompt: call.prompt,
|
|
29
|
+
inputSha256: call.images.map(sha256),
|
|
30
|
+
};
|
|
31
|
+
const result = await runtime.executeNativeCall({
|
|
32
|
+
request,
|
|
33
|
+
input: call.images,
|
|
34
|
+
callId: call.callId,
|
|
35
|
+
store,
|
|
36
|
+
codexBinary: resolveCodexBinary(env),
|
|
37
|
+
...(env.CODEX_HOME?.trim() ? { codexHome: env.CODEX_HOME.trim() } : {}),
|
|
38
|
+
timeoutMs: IMAGE_CALL_TIMEOUT_MS,
|
|
39
|
+
});
|
|
40
|
+
try {
|
|
41
|
+
const decoded = await runtime.decodeNativeResponse(result.bytes);
|
|
42
|
+
return { png: decoded.png, reused: result.reused };
|
|
43
|
+
}
|
|
44
|
+
catch (cause) {
|
|
45
|
+
// The call ended without one usable image. The store already holds its outcome, so a replay
|
|
46
|
+
// answers the same way: the id needs a person's inspection, never a second dispatch.
|
|
47
|
+
throw Object.assign(new Error(`Call ${call.callId} returned no usable image and needs reconciliation`), { code: 'NEEDS_RECONCILIATION', cause });
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=slate-image-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-image-executor.js","sourceRoot":"","sources":["../src/slate-image-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { SlateRuntime } from './slate-runtime.js';
|
|
2
|
+
import type { SlateSearch } from './slate-workspace-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Inspiration: a free corpus search and a local selection. The search asks the
|
|
5
|
+
* public tier (balanced mode, at most 24 references, no account); the
|
|
6
|
+
* selection is a list of at most eight reference ids the next round is
|
|
7
|
+
* drawn from. Neither starts any work.
|
|
8
|
+
*/
|
|
9
|
+
export declare const DEFAULT_SEARCH_COUNT = 12;
|
|
10
|
+
export declare const runSearch: (args: {
|
|
11
|
+
runtime: SlateRuntime;
|
|
12
|
+
root: string;
|
|
13
|
+
query: unknown;
|
|
14
|
+
count: unknown;
|
|
15
|
+
}) => Promise<SlateSearch>;
|
|
16
|
+
/** Replace the whole selection: two views can never diverge by racing toggles. */
|
|
17
|
+
export declare const setSelection: (args: {
|
|
18
|
+
runtime: SlateRuntime;
|
|
19
|
+
root: string;
|
|
20
|
+
referenceIds: unknown;
|
|
21
|
+
}) => Promise<string[]>;
|
|
22
|
+
//# sourceMappingURL=slate-inspiration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-inspiration.d.ts","sourceRoot":"","sources":["../src/slate-inspiration.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAOvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D;;;;;GAKG;AAEH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAyBvC,eAAO,MAAM,SAAS,GAAU,MAAM;IACpC,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB,KAAG,OAAO,CAAC,WAAW,CAiDtB,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,YAAY,GAAU,MAAM;IACvC,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;CACvB,KAAG,OAAO,CAAC,MAAM,EAAE,CAmBnB,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { PUBLIC_CORPUS_MAX_COUNT } from './corpus-access.js';
|
|
2
|
+
import { cleanUserText } from './slate-actions.js';
|
|
3
|
+
import { corpusFailure } from './slate-corpus.js';
|
|
4
|
+
import { SlateError } from './slate-errors.js';
|
|
5
|
+
import { REFERENCE_ID_PATTERN, sha256Hex } from './slate-ids.js';
|
|
6
|
+
import { appendLedger } from './slate-ledger.js';
|
|
7
|
+
import { namedReferenceIds } from './slate-reference-ids.js';
|
|
8
|
+
import { metaFromItem } from './slate-round-search.js';
|
|
9
|
+
import { SEARCH_QUERY_MAX_CHARACTERS, WORKSPACE_MAX_SEARCHES, WORKSPACE_MAX_SELECTED, } from './slate-workspace-parse.js';
|
|
10
|
+
import { NoWrite, loadWorkspaceAt, mutateWorkspace } from './slate-workspace-store.js';
|
|
11
|
+
/**
|
|
12
|
+
* Inspiration: a free corpus search and a local selection. The search asks the
|
|
13
|
+
* public tier (balanced mode, at most 24 references, no account); the
|
|
14
|
+
* selection is a list of at most eight reference ids the next round is
|
|
15
|
+
* drawn from. Neither starts any work.
|
|
16
|
+
*/
|
|
17
|
+
export const DEFAULT_SEARCH_COUNT = 12;
|
|
18
|
+
const normalizeQuery = (value) => {
|
|
19
|
+
if (typeof value !== 'string')
|
|
20
|
+
throw new SlateError('invalid_input', 'query must be text');
|
|
21
|
+
const query = cleanUserText(value).replace(/\s+/gu, ' ');
|
|
22
|
+
if (!query)
|
|
23
|
+
throw new SlateError('invalid_input', 'Type something to search for.');
|
|
24
|
+
if ([...query].length > SEARCH_QUERY_MAX_CHARACTERS) {
|
|
25
|
+
throw new SlateError('invalid_input', `A search can be at most ${SEARCH_QUERY_MAX_CHARACTERS} characters.`);
|
|
26
|
+
}
|
|
27
|
+
return query;
|
|
28
|
+
};
|
|
29
|
+
const normalizeCount = (value) => {
|
|
30
|
+
if (value === undefined || value === null)
|
|
31
|
+
return DEFAULT_SEARCH_COUNT;
|
|
32
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 1 || value > PUBLIC_CORPUS_MAX_COUNT) {
|
|
33
|
+
throw new SlateError('invalid_input', `count must be an integer from 1 to ${PUBLIC_CORPUS_MAX_COUNT}`);
|
|
34
|
+
}
|
|
35
|
+
return value;
|
|
36
|
+
};
|
|
37
|
+
/** One identical search is one corpus query: its key is derived from the workspace, the words and the count. */
|
|
38
|
+
const searchDigest = (workspaceId, query, count) => (sha256Hex(`${workspaceId}|${query.toLowerCase()}|${count}`));
|
|
39
|
+
export const runSearch = async (args) => {
|
|
40
|
+
const query = normalizeQuery(args.query);
|
|
41
|
+
const count = normalizeCount(args.count);
|
|
42
|
+
const { workspace } = await loadWorkspaceAt(args.root, args.runtime.now);
|
|
43
|
+
const digest = searchDigest(workspace.workspaceId, query, count);
|
|
44
|
+
const searchId = digest.slice(0, 16);
|
|
45
|
+
// An identical search is answered from the record: no request, none of the daily allowance.
|
|
46
|
+
const stored = workspace.inspiration.searches.find((entry) => entry.searchId === searchId);
|
|
47
|
+
if (stored) {
|
|
48
|
+
if (workspace.inspiration.searches.at(-1)?.searchId !== searchId) {
|
|
49
|
+
await mutateWorkspace(args.root, (ws) => {
|
|
50
|
+
const index = ws.inspiration.searches.findIndex((entry) => entry.searchId === searchId);
|
|
51
|
+
if (index < 0 || index === ws.inspiration.searches.length - 1)
|
|
52
|
+
return new NoWrite(undefined);
|
|
53
|
+
ws.inspiration.searches.push(...ws.inspiration.searches.splice(index, 1));
|
|
54
|
+
return undefined;
|
|
55
|
+
}, { now: args.runtime.now });
|
|
56
|
+
}
|
|
57
|
+
return stored;
|
|
58
|
+
}
|
|
59
|
+
let items;
|
|
60
|
+
try {
|
|
61
|
+
items = (await args.runtime.corpus().inspire({ q: query, mode: 'balanced', k: count }, { idempotencyKey: `slate-search-${digest}` })).items;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
throw corpusFailure(error);
|
|
65
|
+
}
|
|
66
|
+
const usable = items.filter((item, index) => REFERENCE_ID_PATTERN.test(item.id) && items.findIndex((other) => other.id === item.id) === index);
|
|
67
|
+
return mutateWorkspace(args.root, async (ws, context) => {
|
|
68
|
+
const existing = ws.inspiration.searches.find((entry) => entry.searchId === searchId);
|
|
69
|
+
if (existing)
|
|
70
|
+
return new NoWrite(existing);
|
|
71
|
+
const search = {
|
|
72
|
+
searchId,
|
|
73
|
+
query,
|
|
74
|
+
mode: 'balanced',
|
|
75
|
+
at: context.now.toISOString(),
|
|
76
|
+
referenceIds: usable.map((item) => item.id),
|
|
77
|
+
};
|
|
78
|
+
ws.inspiration.searches.push(search);
|
|
79
|
+
if (ws.inspiration.searches.length > WORKSPACE_MAX_SEARCHES) {
|
|
80
|
+
ws.inspiration.searches.splice(0, ws.inspiration.searches.length - WORKSPACE_MAX_SEARCHES);
|
|
81
|
+
}
|
|
82
|
+
for (const item of usable)
|
|
83
|
+
ws.references[item.id] = metaFromItem(item);
|
|
84
|
+
await appendLedger(args.root, { event: 'search', searchId, count, found: usable.length, at: search.at });
|
|
85
|
+
return search;
|
|
86
|
+
}, { now: args.runtime.now });
|
|
87
|
+
};
|
|
88
|
+
/** Replace the whole selection: two views can never diverge by racing toggles. */
|
|
89
|
+
export const setSelection = async (args) => {
|
|
90
|
+
const ids = args.referenceIds;
|
|
91
|
+
if (!Array.isArray(ids) || ids.some((id) => typeof id !== 'string' || !REFERENCE_ID_PATTERN.test(id))) {
|
|
92
|
+
throw new SlateError('invalid_input', 'referenceIds must be a list of reference ids');
|
|
93
|
+
}
|
|
94
|
+
const wanted = ids;
|
|
95
|
+
if (new Set(wanted).size !== wanted.length)
|
|
96
|
+
throw new SlateError('invalid_input', 'referenceIds must not repeat');
|
|
97
|
+
if (wanted.length > WORKSPACE_MAX_SELECTED)
|
|
98
|
+
throw new SlateError('invalid_input', `At most ${WORKSPACE_MAX_SELECTED} references can be selected.`);
|
|
99
|
+
return mutateWorkspace(args.root, async (ws, context) => {
|
|
100
|
+
const named = new Set(namedReferenceIds(ws));
|
|
101
|
+
const unknown = wanted.find((id) => !named.has(id));
|
|
102
|
+
if (unknown)
|
|
103
|
+
throw new SlateError('unknown_reference', `${unknown} is not in a round, a search or the selection of this workspace.`);
|
|
104
|
+
if (ws.inspiration.selected.length === wanted.length && ws.inspiration.selected.every((id, index) => id === wanted[index])) {
|
|
105
|
+
return new NoWrite([...ws.inspiration.selected]);
|
|
106
|
+
}
|
|
107
|
+
ws.inspiration.selected = wanted;
|
|
108
|
+
await appendLedger(args.root, { event: 'inspiration', selected: wanted.length, at: context.now.toISOString() });
|
|
109
|
+
return [...wanted];
|
|
110
|
+
}, { now: args.runtime.now });
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=slate-inspiration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-inspiration.js","sourceRoot":"","sources":["../src/slate-inspiration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Option and version labels. Options are lettered in allocation order across
|
|
3
|
+
* rounds, A to Z and then AA, AB, ... (spreadsheet column order); labels are
|
|
4
|
+
* never reused. A version label is the option label plus its number above 1.
|
|
5
|
+
*/
|
|
6
|
+
export declare const optionLabelFor: (index: number) => string;
|
|
7
|
+
export declare const optionIndexOf: (label: string) => number;
|
|
8
|
+
/** The next `count` labels after the highest one ever allocated. */
|
|
9
|
+
export declare const nextOptionLabels: (existing: readonly string[], count: number) => string[];
|
|
10
|
+
export declare const versionLabelFor: (optionLabel: string, n: number) => string;
|
|
11
|
+
//# sourceMappingURL=slate-labels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-labels.d.ts","sourceRoot":"","sources":["../src/slate-labels.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,KAAG,MAU9C,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,MAK7C,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,gBAAgB,GAAI,UAAU,SAAS,MAAM,EAAE,EAAE,OAAO,MAAM,KAAG,MAAM,EAGnF,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,aAAa,MAAM,EAAE,GAAG,MAAM,KAAG,MAEhE,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Option and version labels. Options are lettered in allocation order across
|
|
3
|
+
* rounds, A to Z and then AA, AB, ... (spreadsheet column order); labels are
|
|
4
|
+
* never reused. A version label is the option label plus its number above 1.
|
|
5
|
+
*/
|
|
6
|
+
export const optionLabelFor = (index) => {
|
|
7
|
+
if (!Number.isInteger(index) || index < 0)
|
|
8
|
+
throw new Error(`option index ${index} is not a non-negative integer`);
|
|
9
|
+
let remaining = index + 1;
|
|
10
|
+
let label = '';
|
|
11
|
+
while (remaining > 0) {
|
|
12
|
+
const digit = (remaining - 1) % 26;
|
|
13
|
+
label = String.fromCharCode(65 + digit) + label;
|
|
14
|
+
remaining = Math.floor((remaining - 1) / 26);
|
|
15
|
+
}
|
|
16
|
+
return label;
|
|
17
|
+
};
|
|
18
|
+
export const optionIndexOf = (label) => {
|
|
19
|
+
if (!/^[A-Z]{1,3}$/u.test(label))
|
|
20
|
+
throw new Error(`${JSON.stringify(label)} is not an option label`);
|
|
21
|
+
let value = 0;
|
|
22
|
+
for (const character of label)
|
|
23
|
+
value = value * 26 + (character.charCodeAt(0) - 64);
|
|
24
|
+
return value - 1;
|
|
25
|
+
};
|
|
26
|
+
/** The next `count` labels after the highest one ever allocated. */
|
|
27
|
+
export const nextOptionLabels = (existing, count) => {
|
|
28
|
+
const next = existing.reduce((highest, label) => Math.max(highest, optionIndexOf(label) + 1), 0);
|
|
29
|
+
return Array.from({ length: count }, (_unused, offset) => optionLabelFor(next + offset));
|
|
30
|
+
};
|
|
31
|
+
export const versionLabelFor = (optionLabel, n) => (n > 1 ? `${optionLabel}${n}` : optionLabel);
|
|
32
|
+
//# sourceMappingURL=slate-labels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-labels.js","sourceRoot":"","sources":["../src/slate-labels.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAa,EAAU,EAAE;IACtD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,KAAK,gCAAgC,CAAC,CAAC;IAClH,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;IAC1B,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,OAAO,SAAS,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACnC,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;QAChD,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAa,EAAU,EAAE;IACrD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACrG,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,SAAS,IAAI,KAAK;QAAE,KAAK,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACnF,OAAO,KAAK,GAAG,CAAC,CAAC;AACnB,CAAC,CAAC;AAEF,oEAAoE;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAA2B,EAAE,KAAa,EAAY,EAAE;IACvF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjG,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;AAC3F,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,WAAmB,EAAE,CAAS,EAAU,EAAE,CAAC,CACzE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAC3C,CAAC"}
|