@12ui/design 0.2.72 → 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 +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 +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-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 +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 +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,200 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { lstat, mkdir, open, readdir, realpath } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { validateBundlePath } from './bundle-paths.js';
|
|
5
|
+
import { canonicalJson } from './store-json.js';
|
|
6
|
+
import { errorCode, readRegularFile, syncDirectory } from './store-paths.js';
|
|
7
|
+
import { WorkflowError } from './types.js';
|
|
8
|
+
const MAX_FILES = 10_000, MAX_BYTES = 256 * 1024 * 1024, MAX_FILE_BYTES = 32 * 1024 * 1024;
|
|
9
|
+
const excludedDirectories = new Set(['node_modules', 'vendor', 'dist', 'build', 'out', 'target', 'coverage', '__pycache__', 'venv']);
|
|
10
|
+
const sourceExtensions = new Set([
|
|
11
|
+
'.html', '.htm', '.js', '.mjs', '.cjs', '.ts', '.mts', '.cts', '.jsx', '.tsx', '.css', '.scss', '.sass', '.less',
|
|
12
|
+
'.vue', '.svelte', '.astro', '.mdx', '.json', '.yaml', '.yml', '.toml', '.xml', '.graphql', '.gql',
|
|
13
|
+
'.py', '.go', '.rs', '.swift', '.kt', '.kts', '.dart', '.java', '.c', '.cpp', '.cc', '.h', '.hpp', '.m', '.mm',
|
|
14
|
+
'.php', '.rb', '.erb', '.eex', '.heex', '.ex', '.exs', '.cs', '.fs', '.razor', '.sql',
|
|
15
|
+
'.svg', '.png', '.jpg', '.jpeg', '.webp', '.avif', '.gif', '.ico', '.woff', '.woff2', '.ttf', '.otf',
|
|
16
|
+
]);
|
|
17
|
+
const credentialConfigExtensions = new Set(['.json', '.yaml', '.yml', '.toml', '.xml', '.ini', '.conf', '.cfg']);
|
|
18
|
+
const credentialConfigName = /^(?:(?:credentials?|secrets?|tokens?|passwords?|auth)(?:[._-]|$)|(?:service[-_]account|google[-_]credentials)(?:[._-]|$))|(?:[._-](?:secrets?|credentials?|tokens?|private-key))\./i;
|
|
19
|
+
// These are credential/config files, not broad module or directory names:
|
|
20
|
+
// src/auth/login.tsx and src/tokens.css are ordinary implementation evidence.
|
|
21
|
+
const credentialFile = (name) => credentialConfigExtensions.has(path.extname(name).toLowerCase()) && credentialConfigName.test(name);
|
|
22
|
+
const hash = (value) => createHash('sha256').update(value).digest('hex');
|
|
23
|
+
const fail = (message) => { throw new WorkflowError('project_evidence_invalid', message, 'terminal-stop'); };
|
|
24
|
+
const object = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
|
|
25
|
+
/** This is an explicit bounded source/asset inventory, not a claim to snapshot every project file.
|
|
26
|
+
* Hidden files, narrative receipts, dependencies, generated output and common credential names are excluded.
|
|
27
|
+
* Symlinks are never followed. Limits fail explicitly rather than silently weakening coverage.
|
|
28
|
+
*/
|
|
29
|
+
export async function snapshotProject(projectDir) {
|
|
30
|
+
const root = await realpath(projectDir);
|
|
31
|
+
if (!(await lstat(root)).isDirectory())
|
|
32
|
+
fail('The implementation target must be a directory.');
|
|
33
|
+
const files = [];
|
|
34
|
+
let totalBytes = 0;
|
|
35
|
+
const walk = async (directory, prefix) => {
|
|
36
|
+
for (const entry of (await readdir(directory, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name, 'en'))) {
|
|
37
|
+
if (entry.name.startsWith('.'))
|
|
38
|
+
continue;
|
|
39
|
+
const file = path.join(directory, entry.name), relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
40
|
+
const info = await lstat(file);
|
|
41
|
+
if (info.isSymbolicLink())
|
|
42
|
+
continue;
|
|
43
|
+
if (info.isDirectory()) {
|
|
44
|
+
if (!excludedDirectories.has(entry.name))
|
|
45
|
+
await walk(file, relativePath);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (!info.isFile() || credentialFile(entry.name) || !sourceExtensions.has(path.extname(entry.name).toLowerCase()))
|
|
49
|
+
continue;
|
|
50
|
+
validateBundlePath(relativePath);
|
|
51
|
+
if (files.length >= MAX_FILES || info.size > MAX_FILE_BYTES || totalBytes + info.size > MAX_BYTES) {
|
|
52
|
+
throw new WorkflowError('project_snapshot_limit', 'Project evidence exceeds the bounded source inventory (10,000 files, 32 MiB per file, 256 MiB total). Select a narrower project.', 'terminal-stop');
|
|
53
|
+
}
|
|
54
|
+
const bytes = await readRegularFile(file);
|
|
55
|
+
if (bytes.length > MAX_FILE_BYTES || totalBytes + bytes.length > MAX_BYTES)
|
|
56
|
+
throw new WorkflowError('project_snapshot_limit', 'Project files exceeded the evidence byte limit while being read.', 'terminal-stop');
|
|
57
|
+
files.push({ relativePath, sha256: hash(bytes), bytes: bytes.length });
|
|
58
|
+
totalBytes += bytes.length;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
await walk(root, '');
|
|
62
|
+
files.sort((a, b) => a.relativePath.localeCompare(b.relativePath, 'en'));
|
|
63
|
+
const snapshot = { schema: '12ui.project-snapshot/1', policy: 'source-files-v1', projectDir: root, files };
|
|
64
|
+
return { ...snapshot, digest: hash(canonicalJson(snapshot)) };
|
|
65
|
+
}
|
|
66
|
+
const validateSnapshot = (value) => {
|
|
67
|
+
if (!object(value) || value.schema !== '12ui.project-snapshot/1' || value.policy !== 'source-files-v1'
|
|
68
|
+
|| typeof value.projectDir !== 'string' || !path.isAbsolute(value.projectDir) || !Array.isArray(value.files)
|
|
69
|
+
|| value.files.length > MAX_FILES || typeof value.digest !== 'string'
|
|
70
|
+
|| Object.keys(value).some(key => !['schema', 'policy', 'projectDir', 'files', 'digest'].includes(key)))
|
|
71
|
+
return fail('Project evidence has an invalid snapshot.');
|
|
72
|
+
const files = [];
|
|
73
|
+
let bytes = 0;
|
|
74
|
+
for (const file of value.files) {
|
|
75
|
+
if (!object(file) || typeof file.relativePath !== 'string' || typeof file.sha256 !== 'string' || !/^[a-f0-9]{64}$/.test(file.sha256)
|
|
76
|
+
|| !Number.isSafeInteger(file.bytes) || file.bytes < 0 || file.bytes > MAX_FILE_BYTES
|
|
77
|
+
|| Object.keys(file).some(key => !['relativePath', 'sha256', 'bytes'].includes(key)))
|
|
78
|
+
return fail('Project snapshot file metadata is invalid.');
|
|
79
|
+
validateBundlePath(file.relativePath);
|
|
80
|
+
const parts = file.relativePath.split('/');
|
|
81
|
+
if (parts.some(part => part.startsWith('.')) || credentialFile(parts.at(-1)) || parts.slice(0, -1).some(part => excludedDirectories.has(part))
|
|
82
|
+
|| !sourceExtensions.has(path.extname(file.relativePath).toLowerCase()))
|
|
83
|
+
return fail('Project snapshot includes a file outside its declared coverage policy.');
|
|
84
|
+
bytes += file.bytes;
|
|
85
|
+
files.push(file);
|
|
86
|
+
}
|
|
87
|
+
if (bytes > MAX_BYTES || new Set(files.map(file => file.relativePath)).size !== files.length
|
|
88
|
+
|| canonicalJson(files) !== canonicalJson([...files].sort((a, b) => a.relativePath.localeCompare(b.relativePath, 'en'))))
|
|
89
|
+
return fail('Project snapshot files are duplicated, unordered or too large.');
|
|
90
|
+
const { digest, ...snapshot } = value;
|
|
91
|
+
if (hash(canonicalJson(snapshot)) !== digest)
|
|
92
|
+
return fail('Project snapshot digest does not match its actual metadata.');
|
|
93
|
+
return value;
|
|
94
|
+
};
|
|
95
|
+
const changesBetween = (before, after) => {
|
|
96
|
+
const left = new Map(before.files.map(file => [file.relativePath, file])), right = new Map(after.files.map(file => [file.relativePath, file]));
|
|
97
|
+
return [...new Set([...left.keys(), ...right.keys()])].sort((a, b) => a.localeCompare(b, 'en')).flatMap(relativePath => {
|
|
98
|
+
const prior = left.get(relativePath), current = right.get(relativePath);
|
|
99
|
+
if (prior?.sha256 === current?.sha256 && prior?.bytes === current?.bytes)
|
|
100
|
+
return [];
|
|
101
|
+
return [{ relativePath, kind: !prior ? 'added' : !current ? 'deleted' : 'modified', ...(prior ? { before: prior } : {}), ...(current ? { after: current } : {}) }];
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
async function writeOnce(file, contents) {
|
|
105
|
+
const handle = await open(file, 'wx', 0o600);
|
|
106
|
+
try {
|
|
107
|
+
await handle.writeFile(contents);
|
|
108
|
+
await handle.sync();
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
await handle.close();
|
|
112
|
+
}
|
|
113
|
+
await syncDirectory(path.dirname(file));
|
|
114
|
+
}
|
|
115
|
+
/** Baseline is immutable within an attempt. Repeated registration uses these original bytes. */
|
|
116
|
+
export async function persistProjectBaseline(args) {
|
|
117
|
+
await mkdir(args.evidenceDir, { recursive: true });
|
|
118
|
+
const file = path.join(args.evidenceDir, 'project-before.json');
|
|
119
|
+
try {
|
|
120
|
+
await lstat(file);
|
|
121
|
+
return await readProjectBaseline(args);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
if (errorCode(error) !== 'ENOENT')
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
const baseline = await snapshotProject(args.projectDir);
|
|
128
|
+
try {
|
|
129
|
+
await writeOnce(file, `${canonicalJson(baseline)}\n`);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
if (errorCode(error) !== 'EEXIST')
|
|
133
|
+
throw error;
|
|
134
|
+
return readProjectBaseline(args);
|
|
135
|
+
}
|
|
136
|
+
return baseline;
|
|
137
|
+
}
|
|
138
|
+
export async function readProjectBaseline(args) {
|
|
139
|
+
try {
|
|
140
|
+
const baseline = validateSnapshot(JSON.parse((await readRegularFile(path.join(args.evidenceDir, 'project-before.json'))).toString('utf8')));
|
|
141
|
+
if (baseline.projectDir !== await realpath(args.projectDir))
|
|
142
|
+
fail('Project baseline belongs to a different target directory.');
|
|
143
|
+
return baseline;
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
throw new WorkflowError('project_baseline_unavailable', 'Original project baseline is unavailable or invalid; preserve the attempt and reconcile its existing files.', 'ambiguous');
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export async function collectProjectEvidence(args) {
|
|
150
|
+
const before = validateSnapshot(args.baseline), after = await snapshotProject(args.projectDir);
|
|
151
|
+
if (before.projectDir !== after.projectDir)
|
|
152
|
+
fail('Project baseline belongs to a different target directory.');
|
|
153
|
+
const changes = changesBetween(before, after);
|
|
154
|
+
if (!changes.length)
|
|
155
|
+
throw new WorkflowError('project_no_changes', 'No source or asset changes were observed in the selected project. A provider receipt or claimed no-op does not prove implementation.', 'terminal-stop');
|
|
156
|
+
const evidence = { schema: '12ui.project-evidence/1', projectDir: after.projectDir, before, after, changes };
|
|
157
|
+
const contents = `${canonicalJson(evidence)}\n`, file = path.join(args.evidenceDir, `project-evidence-${hash(contents)}.json`);
|
|
158
|
+
await mkdir(args.evidenceDir, { recursive: true });
|
|
159
|
+
try {
|
|
160
|
+
await writeOnce(file, contents);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
if (errorCode(error) !== 'EEXIST')
|
|
164
|
+
throw error;
|
|
165
|
+
if ((await readRegularFile(file)).toString('utf8') !== contents)
|
|
166
|
+
fail('Existing project evidence does not match its identity.');
|
|
167
|
+
}
|
|
168
|
+
return [
|
|
169
|
+
{ path: file, mediaType: 'application/json', role: 'project-evidence' },
|
|
170
|
+
...changes.filter(change => change.after).map(change => ({ path: path.join(after.projectDir, change.relativePath), mediaType: sourceMediaType(change.relativePath), role: 'project-change', relativePath: change.relativePath })),
|
|
171
|
+
];
|
|
172
|
+
}
|
|
173
|
+
const sourceMediaType = (file) => {
|
|
174
|
+
const extension = path.extname(file).toLowerCase();
|
|
175
|
+
return { '.html': 'text/html', '.htm': 'text/html', '.css': 'text/css', '.json': 'application/json', '.svg': 'image/svg+xml', '.png': 'image/png', '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg', '.webp': 'image/webp', '.avif': 'image/avif', '.gif': 'image/gif' }[extension] ?? 'application/octet-stream';
|
|
176
|
+
};
|
|
177
|
+
/** Validate observed changes against already imported output bytes, not executor prose. */
|
|
178
|
+
export async function validateProjectEvidence(request, value, artifacts) {
|
|
179
|
+
if (request.output.kind !== 'project' || typeof request.parameters?.projectCwd !== 'string')
|
|
180
|
+
fail('Project output requires an explicit projectCwd and project evidence.');
|
|
181
|
+
if (!object(value) || value.schema !== '12ui.project-evidence/1' || typeof value.projectDir !== 'string' || !Array.isArray(value.changes)
|
|
182
|
+
|| Object.keys(value).some(key => !['schema', 'projectDir', 'before', 'after', 'changes'].includes(key)))
|
|
183
|
+
fail('Project output requires a structured project evidence artifact.');
|
|
184
|
+
const evidence = value, before = validateSnapshot(evidence.before), after = validateSnapshot(evidence.after);
|
|
185
|
+
if (evidence.projectDir !== await realpath(request.parameters.projectCwd) || before.projectDir !== evidence.projectDir || after.projectDir !== evidence.projectDir)
|
|
186
|
+
fail('Project evidence belongs to a different target directory.');
|
|
187
|
+
const changes = changesBetween(before, after);
|
|
188
|
+
if (!changes.length || canonicalJson(changes) !== canonicalJson(evidence.changes))
|
|
189
|
+
fail('Project evidence must describe actual nonempty changes between its snapshots.');
|
|
190
|
+
const outputs = artifacts.filter(artifact => artifact.role === 'project-change');
|
|
191
|
+
const changedFiles = changes.filter(change => change.after);
|
|
192
|
+
if (outputs.length !== changedFiles.length)
|
|
193
|
+
fail('Project output files do not match the observed changes.');
|
|
194
|
+
for (const change of changedFiles) {
|
|
195
|
+
const matches = outputs.filter(artifact => artifact.relativePath === change.relativePath);
|
|
196
|
+
if (matches.length !== 1 || matches[0].sha256 !== change.after.sha256 || matches[0].bytes !== change.after.bytes)
|
|
197
|
+
fail('A changed project file is missing or differs from its evidence.');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=project-evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-evidence.js","sourceRoot":"","sources":["../../src/workflow/project-evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type Capability, type ProviderCapability } from './types.js';
|
|
2
|
+
export type ProviderProbeRequest = {
|
|
3
|
+
binary: string;
|
|
4
|
+
args: readonly string[];
|
|
5
|
+
env: NodeJS.ProcessEnv;
|
|
6
|
+
timeoutMs: number;
|
|
7
|
+
};
|
|
8
|
+
export type ProviderProbeResult = {
|
|
9
|
+
exitCode: number | null;
|
|
10
|
+
stdout?: string;
|
|
11
|
+
stderr?: string;
|
|
12
|
+
};
|
|
13
|
+
export type ProviderProbe = (request: ProviderProbeRequest) => Promise<ProviderProbeResult>;
|
|
14
|
+
export type DiscoverProvidersOptions = {
|
|
15
|
+
env?: NodeJS.ProcessEnv;
|
|
16
|
+
/** The host must explicitly declare usable tools; environment markers do not prove availability. */
|
|
17
|
+
session?: {
|
|
18
|
+
capabilities: Capability[];
|
|
19
|
+
};
|
|
20
|
+
binaries?: {
|
|
21
|
+
codex?: string;
|
|
22
|
+
claude?: string;
|
|
23
|
+
};
|
|
24
|
+
/** Explicit caller attestations of authenticated subscription access, useful for embedded hosts. */
|
|
25
|
+
availability?: Partial<Record<'codex' | 'claude', boolean>>;
|
|
26
|
+
probe?: ProviderProbe;
|
|
27
|
+
timeoutMs?: number;
|
|
28
|
+
/** Trust normal user Codex config, including configured MCP tools and hooks. Not spending authorization. */
|
|
29
|
+
trustCodexConfig?: boolean;
|
|
30
|
+
};
|
|
31
|
+
/** Keep user-selected homes, but never forward API credentials or provider overrides to a plan route. */
|
|
32
|
+
export declare function nativeProviderEnvironment(env?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
33
|
+
/** Harmless readiness discovery only: no inference, auth-file reads, model-cache reads or login attempts. */
|
|
34
|
+
export declare function discoverProviders(options?: DiscoverProvidersOptions): Promise<ProviderCapability[]>;
|
|
35
|
+
//# sourceMappingURL=providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/workflow/providers.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEnG,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAChG,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAE5F,MAAM,MAAM,wBAAwB,GAAG;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,oGAAoG;IACpG,OAAO,CAAC,EAAE;QAAE,YAAY,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;IACzC,QAAQ,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,oGAAoG;IACpG,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4GAA4G;IAC5G,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAQF,yGAAyG;AACzG,wBAAgB,yBAAyB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,UAAU,CAIjG;AA4DD,6GAA6G;AAC7G,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAuB7G"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { CAPABILITIES, WorkflowError } from './types.js';
|
|
3
|
+
const NATIVE_ENVIRONMENT_KEYS = [
|
|
4
|
+
'PATH', 'PATHEXT', 'SystemRoot', 'SYSTEMROOT', 'WINDIR', 'COMSPEC',
|
|
5
|
+
'HOME', 'USERPROFILE', 'HOMEDRIVE', 'HOMEPATH', 'TMPDIR', 'TMP', 'TEMP',
|
|
6
|
+
'LANG', 'LC_ALL', 'LC_CTYPE', 'CODEX_HOME', 'CLAUDE_CONFIG_DIR',
|
|
7
|
+
];
|
|
8
|
+
/** Keep user-selected homes, but never forward API credentials or provider overrides to a plan route. */
|
|
9
|
+
export function nativeProviderEnvironment(env = process.env) {
|
|
10
|
+
const result = {};
|
|
11
|
+
for (const key of NATIVE_ENVIRONMENT_KEYS)
|
|
12
|
+
if (env[key] !== undefined)
|
|
13
|
+
result[key] = env[key];
|
|
14
|
+
return result;
|
|
15
|
+
}
|
|
16
|
+
const processProbe = ({ binary, args, env, timeoutMs }) => new Promise(resolve => {
|
|
17
|
+
execFile(binary, [...args], { env, timeout: timeoutMs, maxBuffer: 32 * 1024, shell: false, killSignal: 'SIGKILL' }, (error, stdout, stderr) => {
|
|
18
|
+
resolve({ exitCode: error ? (typeof error.code === 'number' ? error.code : null) : 0, stdout, stderr });
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
function isClaudeSubscriptionStatus(output) {
|
|
22
|
+
let status;
|
|
23
|
+
try {
|
|
24
|
+
status = JSON.parse(output);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
if (!status || typeof status !== 'object' || Array.isArray(status))
|
|
30
|
+
return false;
|
|
31
|
+
const data = status;
|
|
32
|
+
if (data.loggedIn !== true && data.authenticated !== true)
|
|
33
|
+
return false;
|
|
34
|
+
const method = typeof data.authMethod === 'string' ? data.authMethod.toLowerCase() : '';
|
|
35
|
+
const provider = typeof data.apiProvider === 'string' ? data.apiProvider.toLowerCase() : '';
|
|
36
|
+
if (/api[ _-]?key|anthropic[ _-]?api|bedrock|vertex|foundry/.test(method))
|
|
37
|
+
return false;
|
|
38
|
+
if (provider && provider !== 'firstparty' && provider !== 'first-party')
|
|
39
|
+
return false;
|
|
40
|
+
return ['claude.ai', 'oauth', 'subscription'].includes(method);
|
|
41
|
+
}
|
|
42
|
+
function hasFlags(output, flags) {
|
|
43
|
+
const words = new Set(output.split(/[^a-zA-Z0-9-]+/));
|
|
44
|
+
return flags.every(flag => words.has(flag));
|
|
45
|
+
}
|
|
46
|
+
async function nativeProvider(id, options, env, timeoutMs) {
|
|
47
|
+
const base = { id, capabilities: ['text', 'code'], execution: 'process', funding: 'user-plan' };
|
|
48
|
+
if (id === 'codex' && options.trustCodexConfig !== true)
|
|
49
|
+
return { ...base, available: false, reason: 'Codex requires explicit trustCodexConfig opt-in: normal user configuration may expose tools and hooks beyond the command sandbox' };
|
|
50
|
+
const declared = options.availability?.[id];
|
|
51
|
+
if (declared !== undefined)
|
|
52
|
+
return { ...base, available: declared, reason: declared ? 'Subscription access explicitly declared by caller' : 'Unavailable by caller declaration' };
|
|
53
|
+
const probe = options.probe ?? processProbe;
|
|
54
|
+
const binary = options.binaries?.[id] ?? id;
|
|
55
|
+
try {
|
|
56
|
+
const version = await probe({ binary, args: ['--version'], env, timeoutMs });
|
|
57
|
+
if (version.exitCode !== 0)
|
|
58
|
+
return { ...base, available: false, reason: 'CLI version probe failed or executable unavailable' };
|
|
59
|
+
const auth = await probe({ binary, args: id === 'codex' ? ['login', 'status'] : ['auth', 'status'], env, timeoutMs });
|
|
60
|
+
if (auth.exitCode !== 0)
|
|
61
|
+
return { ...base, available: false, reason: 'CLI authentication status is unavailable' };
|
|
62
|
+
// Codex reports login status on stderr in some versions. Never return the raw status or user identity.
|
|
63
|
+
const authenticated = id === 'codex'
|
|
64
|
+
? /logged in using chatgpt\b/i.test(`${auth.stdout ?? ''}\n${auth.stderr ?? ''}`)
|
|
65
|
+
&& !/logged in using (?:an? )?api key\b/i.test(`${auth.stdout ?? ''}\n${auth.stderr ?? ''}`)
|
|
66
|
+
: isClaudeSubscriptionStatus(auth.stdout ?? '');
|
|
67
|
+
if (!authenticated)
|
|
68
|
+
return { ...base, available: false, reason: 'CLI does not report supported subscription authentication' };
|
|
69
|
+
const help = await probe({ binary, args: id === 'codex' ? ['exec', '--help'] : ['--help'], env, timeoutMs });
|
|
70
|
+
if (help.exitCode !== 0)
|
|
71
|
+
return { ...base, available: false, reason: 'CLI execution capability probe failed' };
|
|
72
|
+
if (id === 'codex') {
|
|
73
|
+
const compatible = hasFlags(help.stdout ?? '', ['--json', '--output-schema', '--sandbox']);
|
|
74
|
+
return { ...base, available: compatible, reason: compatible ? 'CLI reports subscription authentication and required flags; configured tools and hooks are explicitly trusted, not isolated' : 'CLI lacks required execution flags' };
|
|
75
|
+
}
|
|
76
|
+
const compatible = hasFlags(help.stdout ?? '', ['--print', '--output-format', '--tools', '--allowedTools', '--disallowedTools', '--strict-mcp-config', '--mcp-config', '--json-schema', '--permission-mode', '--max-turns', '--safe-mode']);
|
|
77
|
+
if (!compatible)
|
|
78
|
+
return { ...base, available: false, reason: 'CLI lacks required execution flags' };
|
|
79
|
+
return { ...base, available: true, reason: 'CLI reports subscription authentication and safe-mode flags; code edits files but cannot execute test commands' };
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return { ...base, available: false, reason: 'CLI discovery probe failed' };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** Harmless readiness discovery only: no inference, auth-file reads, model-cache reads or login attempts. */
|
|
86
|
+
export async function discoverProviders(options = {}) {
|
|
87
|
+
const env = options.env ?? process.env;
|
|
88
|
+
const timeoutMs = options.timeoutMs ?? 5000;
|
|
89
|
+
if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 30_000) {
|
|
90
|
+
throw new WorkflowError('invalid-discovery-timeout', 'Provider discovery timeout must be an integer from 1 to 30000 milliseconds');
|
|
91
|
+
}
|
|
92
|
+
const sessionCapabilities = [...new Set(options.session?.capabilities ?? [])];
|
|
93
|
+
if (sessionCapabilities.some(capability => !CAPABILITIES.includes(capability))) {
|
|
94
|
+
throw new WorkflowError('invalid-session-capability', 'The host declared an unsupported session capability');
|
|
95
|
+
}
|
|
96
|
+
const [codex, claude] = await Promise.all([
|
|
97
|
+
nativeProvider('codex', options, nativeProviderEnvironment(env), timeoutMs),
|
|
98
|
+
nativeProvider('claude', options, nativeProviderEnvironment(env), timeoutMs),
|
|
99
|
+
]);
|
|
100
|
+
const openaiAvailable = Boolean(env.OPENAI_API_KEY?.trim());
|
|
101
|
+
const twelveUiAvailable = Boolean(env.TWELVE_UI_API_KEY?.trim());
|
|
102
|
+
return [
|
|
103
|
+
{ id: 'session', available: sessionCapabilities.length > 0, capabilities: sessionCapabilities, execution: 'session', funding: 'user-plan', reason: sessionCapabilities.length ? 'Capabilities explicitly declared by host session' : 'No host session capabilities declared' },
|
|
104
|
+
codex,
|
|
105
|
+
claude,
|
|
106
|
+
{ id: 'openai', available: openaiAvailable, capabilities: ['text', 'code', 'image', 'image-edit'], execution: 'http', funding: 'openai-key', reason: openaiAvailable ? 'API key configured; code supports generated HTML only, no project execution; models and paid authorization required' : 'OPENAI_API_KEY is not configured' },
|
|
107
|
+
{ id: '12ui', available: twelveUiAvailable, capabilities: ['text', 'code', 'image', 'image-edit', 'convert'], execution: 'http', funding: '12ui-credits', reason: twelveUiAvailable ? 'API key configured; text supports exact prototype-labels for existing hosted branches only, never generic text or native local pages; code supports convert-to-HTML only; image edits support single-reference redraw only. 12ui-credits is a coarse route category: prototype labels are service-sponsored; exact funding evidence comes from the service. Explicit paid-provider authorization is required.' : 'TWELVE_UI_API_KEY is not configured' },
|
|
108
|
+
];
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/workflow/providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type ExecutionResult } from './types.js';
|
|
2
|
+
/** Validate the actual canonical document plus every local dependency, not provider metadata. */
|
|
3
|
+
export declare function validateNativeLayerDocResult(result: ExecutionResult, workspace?: string): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=recipes-layerdoc-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipes-layerdoc-validation.d.ts","sourceRoot":"","sources":["../../src/workflow/recipes-layerdoc-validation.ts"],"names":[],"mappings":"AAMA,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAUjE,iGAAiG;AACjG,wBAAsB,4BAA4B,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6D7G"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import sharp from 'sharp';
|
|
4
|
+
import { validateBundleMappings, validateBundlePath } from './bundle-paths.js';
|
|
5
|
+
import { readRegularFile } from './store-paths.js';
|
|
6
|
+
import { objectAt } from './recipes-validation.js';
|
|
7
|
+
import { WorkflowError } from './types.js';
|
|
8
|
+
const invalid = (message) => { throw new WorkflowError('invalid_layerdoc_result', message, 'terminal-stop'); };
|
|
9
|
+
const readOutput = (file, workspace) => readRegularFile(path.resolve(workspace ?? process.cwd(), file.path));
|
|
10
|
+
const json = async (file, workspace) => {
|
|
11
|
+
try {
|
|
12
|
+
return objectAt(JSON.parse((await readOutput(file, workspace)).toString('utf8')), 'LayerDoc output');
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
return invalid(`LayerDoc output is not a readable JSON object: ${error instanceof Error ? error.message : String(error)}`);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
/** Validate the actual canonical document plus every local dependency, not provider metadata. */
|
|
19
|
+
export async function validateNativeLayerDocResult(result, workspace) {
|
|
20
|
+
const receiptRoles = ['provider-response', 'execution-receipt', 'provider-receipt', 'project-evidence'];
|
|
21
|
+
const files = (result.files ?? []).filter(file => !receiptRoles.includes(file.role ?? ''));
|
|
22
|
+
validateBundleMappings(files);
|
|
23
|
+
const documents = files.filter(file => file.role === 'layerdoc');
|
|
24
|
+
const manifests = files.filter(file => file.role === 'layerdoc-assets');
|
|
25
|
+
if (documents.length !== 1 || manifests.length !== 1)
|
|
26
|
+
invalid('Native LayerDoc requires one actual document and one local asset manifest.');
|
|
27
|
+
if (files.some(file => file.relativePath === undefined)
|
|
28
|
+
|| documents[0].relativePath !== 'document.layerdoc.json'
|
|
29
|
+
|| manifests[0].relativePath !== 'layerdoc-assets.json') {
|
|
30
|
+
invalid('Every native LayerDoc output requires a portable relativePath; document and manifest must map to document.layerdoc.json and layerdoc-assets.json.');
|
|
31
|
+
}
|
|
32
|
+
const document = await json(documents[0], workspace);
|
|
33
|
+
const moduleUrl = new URL('../../runtime/layerdoc-validator.mjs', import.meta.url).href;
|
|
34
|
+
const { parsePublicLayerDocV2 } = await import(moduleUrl);
|
|
35
|
+
try {
|
|
36
|
+
parsePublicLayerDocV2(document);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
invalid(`Native LayerDoc validation failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
40
|
+
}
|
|
41
|
+
const manifest = await json(manifests[0], workspace);
|
|
42
|
+
if (manifest.schema !== '12ui.layerdoc-assets.v1')
|
|
43
|
+
invalid('LayerDoc asset manifest has an unsupported schema.');
|
|
44
|
+
const assets = objectAt(manifest.assets, 'LayerDoc manifest assets');
|
|
45
|
+
const refs = [objectAt(document.source, 'LayerDoc source')];
|
|
46
|
+
const walk = (nodes) => {
|
|
47
|
+
for (const value of nodes) {
|
|
48
|
+
const node = objectAt(value, 'LayerDoc node');
|
|
49
|
+
if (Array.isArray(node.children))
|
|
50
|
+
walk(node.children);
|
|
51
|
+
else if (node.artifacts)
|
|
52
|
+
refs.push(...Object.values(objectAt(node.artifacts, 'LayerDoc artifacts')).map(value => objectAt(value, 'LayerDoc reference')));
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
walk(document.layers);
|
|
56
|
+
const ids = new Set(refs.map(ref => String(ref.artifactId)));
|
|
57
|
+
if (Object.keys(assets).length !== ids.size || Object.keys(assets).some(id => !ids.has(id)))
|
|
58
|
+
invalid('LayerDoc manifest must map exactly the declared artifact identities.');
|
|
59
|
+
const decoded = new Map();
|
|
60
|
+
for (const ref of refs) {
|
|
61
|
+
if (ref.url !== undefined || ref.expiresAt !== undefined)
|
|
62
|
+
invalid('Portable LayerDoc must use canonical unhydrated references and its local asset manifest.');
|
|
63
|
+
const entry = objectAt(assets[String(ref.artifactId)], 'LayerDoc asset mapping');
|
|
64
|
+
const relativePath = validateBundlePath(entry.path);
|
|
65
|
+
if (typeof entry.sha256 !== 'string' || !/^[a-f0-9]{64}$/u.test(entry.sha256))
|
|
66
|
+
invalid('LayerDoc asset mapping requires a SHA-256 digest.');
|
|
67
|
+
const outputs = files.filter(file => file.role === 'asset' && file.relativePath === relativePath);
|
|
68
|
+
if (outputs.length !== 1)
|
|
69
|
+
invalid(`LayerDoc asset ${String(ref.artifactId)} does not resolve to one registered local file.`);
|
|
70
|
+
const file = outputs[0];
|
|
71
|
+
if (typeof entry.mediaType !== 'string' || entry.mediaType !== file.mediaType
|
|
72
|
+
|| (ref.mediaType !== undefined && ref.mediaType !== file.mediaType))
|
|
73
|
+
invalid('LayerDoc asset media types do not agree.');
|
|
74
|
+
let image = decoded.get(file.path);
|
|
75
|
+
if (!image) {
|
|
76
|
+
image = (async () => {
|
|
77
|
+
const bytes = await readOutput(file, workspace);
|
|
78
|
+
const metadata = await sharp(bytes).metadata().catch(() => invalid('LayerDoc raster bytes cannot be decoded.'));
|
|
79
|
+
if (!metadata.width || !metadata.height)
|
|
80
|
+
return invalid('LayerDoc raster bytes have no usable pixel dimensions.');
|
|
81
|
+
const mediaType = { png: 'image/png', jpeg: 'image/jpeg', webp: 'image/webp', svg: 'image/svg+xml' }[metadata.format ?? ''];
|
|
82
|
+
if (!mediaType)
|
|
83
|
+
return invalid('LayerDoc raster bytes use an unsupported image format.');
|
|
84
|
+
return { sha256: createHash('sha256').update(bytes).digest('hex'), width: metadata.width, height: metadata.height, mediaType };
|
|
85
|
+
})();
|
|
86
|
+
decoded.set(file.path, image);
|
|
87
|
+
}
|
|
88
|
+
const actual = await image;
|
|
89
|
+
if (actual.mediaType !== file.mediaType)
|
|
90
|
+
invalid('LayerDoc asset media type does not match its actual raster bytes.');
|
|
91
|
+
if (actual.sha256 !== entry.sha256)
|
|
92
|
+
invalid('LayerDoc asset bytes do not match their manifest digest.');
|
|
93
|
+
if ((ref.width !== undefined && ref.width !== actual.width)
|
|
94
|
+
|| (ref.height !== undefined && ref.height !== actual.height))
|
|
95
|
+
invalid('LayerDoc declared pixel dimensions do not match its actual raster bytes.');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=recipes-layerdoc-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipes-layerdoc-validation.js","sourceRoot":"","sources":["../../src/workflow/recipes-layerdoc-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ExecutionResult, WorkflowRequest } from './types.js';
|
|
2
|
+
/** Validate semantic contracts before success becomes immutable. No inference or side effects. */
|
|
3
|
+
export declare function validateRecipeResult(request: WorkflowRequest, result: ExecutionResult, options?: {
|
|
4
|
+
workspace?: string;
|
|
5
|
+
}): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=recipes-result-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipes-result-validation.d.ts","sourceRoot":"","sources":["../../src/workflow/recipes-result-validation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAKnE,kGAAkG;AAClG,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { parseBranchRecipePlan, parseDraftRecipePlan } from './continuation-plans.js';
|
|
2
|
+
import { validateNativeLayerDocResult } from './recipes-layerdoc-validation.js';
|
|
3
|
+
import { assertRetentionUnchanged, enumAt, integerAt, invalidRecipe, objectAt, onlyKeys, parseRecipeRetain, textAt } from './recipes-validation.js';
|
|
4
|
+
import { validatePrototypeWorkflowResult } from '../prototype-workflow-contract.js';
|
|
5
|
+
import { resolveArtifactPath } from './artifact.js';
|
|
6
|
+
/** Validate semantic contracts before success becomes immutable. No inference or side effects. */
|
|
7
|
+
export async function validateRecipeResult(request, result, options = {}) {
|
|
8
|
+
const parameters = request.parameters ?? {};
|
|
9
|
+
if (parameters.recipe === 'prototype-labels') {
|
|
10
|
+
validatePrototypeWorkflowResult(request, result.value);
|
|
11
|
+
if (parameters.sourceEvidence !== undefined) {
|
|
12
|
+
if (!options.workspace || !Array.isArray(parameters.sourceEvidence))
|
|
13
|
+
invalidRecipe('Prototype source evidence requires its local workflow workspace.');
|
|
14
|
+
await Promise.all(parameters.sourceEvidence.map(artifact => resolveArtifactPath(options.workspace, artifact)));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
if (parameters.phase === 'plan') {
|
|
18
|
+
if (parameters.recipe === 'draft') {
|
|
19
|
+
const plan = parseDraftRecipePlan(result.value, integerAt(parameters.candidates, 'candidates', 1, 16));
|
|
20
|
+
assertRetentionUnchanged(parameters.retain, plan.retain);
|
|
21
|
+
}
|
|
22
|
+
if (parameters.recipe === 'branch') {
|
|
23
|
+
parseBranchRecipePlan(result.value, integerAt(parameters.maxScreens, 'maxScreens', 1, 16), enumAt(parameters.scope, ['page', 'site'], 'scope'));
|
|
24
|
+
}
|
|
25
|
+
if (parameters.recipe === 'redesign') {
|
|
26
|
+
const plan = objectAt(result.value, 'redesign plan');
|
|
27
|
+
onlyKeys(plan, ['concept', 'retain', 'corpusQuery'], 'redesign plan');
|
|
28
|
+
textAt(plan.concept, 'concept');
|
|
29
|
+
textAt(plan.corpusQuery, 'corpusQuery');
|
|
30
|
+
if (parseRecipeRetain(plan.retain).source !== 'subject')
|
|
31
|
+
invalidRecipe('Redesign retention must describe the existing product as subject.');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (parameters.output === 'layerdoc' || (request.capability === 'convert' && request.output.kind === 'json')) {
|
|
35
|
+
await validateNativeLayerDocResult(result, options.workspace);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=recipes-result-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipes-result-validation.js","sourceRoot":"","sources":["../../src/workflow/recipes-result-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const retainSchema: Record<string, unknown>;
|
|
2
|
+
export declare const draftPlanSchema: (count: number) => Record<string, unknown>;
|
|
3
|
+
export declare const redesignPlanSchema: Record<string, unknown>;
|
|
4
|
+
export declare const branchPlanSchema: (maxScreens: number) => Record<string, unknown>;
|
|
5
|
+
export declare const interactionLabelsSchema: Record<string, unknown>;
|
|
6
|
+
export declare const visualReviewSchema: Record<string, unknown>;
|
|
7
|
+
//# sourceMappingURL=recipes-schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipes-schemas.d.ts","sourceRoot":"","sources":["../../src/workflow/recipes-schemas.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,YAAY,yBAGvB,CAAC;AAEH,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAMpE,CAAC;AAEH,eAAO,MAAM,kBAAkB,yBAAqE,CAAC;AAErG,eAAO,MAAM,gBAAgB,GAAI,YAAY,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAmB1E,CAAC;AAGH,eAAO,MAAM,uBAAuB,yBAUlC,CAAC;AAEH,eAAO,MAAM,kBAAkB,yBAe7B,CAAC"}
|