@tangle-network/browser-agent-driver 0.33.2 → 0.34.0
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 +42 -1
- package/discovery/llms.txt +27 -0
- package/discovery/tangle-agent.json +36 -0
- package/dist/brain/action-parse.d.ts +16 -0
- package/dist/brain/action-parse.d.ts.map +1 -0
- package/dist/brain/action-parse.js +191 -0
- package/dist/brain/action-parse.js.map +1 -0
- package/dist/brain/decide.d.ts +58 -0
- package/dist/brain/decide.d.ts.map +1 -0
- package/dist/brain/decide.js +418 -0
- package/dist/brain/decide.js.map +1 -0
- package/dist/brain/history-compact.d.ts +19 -0
- package/dist/brain/history-compact.d.ts.map +1 -0
- package/dist/brain/history-compact.js +153 -0
- package/dist/brain/history-compact.js.map +1 -0
- package/dist/brain/index.d.ts +78 -152
- package/dist/brain/index.d.ts.map +1 -1
- package/dist/brain/index.js +62 -2268
- package/dist/brain/index.js.map +1 -1
- package/dist/brain/model-client.d.ts +101 -0
- package/dist/brain/model-client.d.ts.map +1 -0
- package/dist/brain/model-client.js +391 -0
- package/dist/brain/model-client.js.map +1 -0
- package/dist/brain/plan.d.ts +57 -0
- package/dist/brain/plan.d.ts.map +1 -0
- package/dist/brain/plan.js +194 -0
- package/dist/brain/plan.js.map +1 -0
- package/dist/brain/prompts.d.ts +37 -0
- package/dist/brain/prompts.d.ts.map +1 -0
- package/dist/brain/prompts.js +455 -0
- package/dist/brain/prompts.js.map +1 -0
- package/dist/brain/provider-fetch.d.ts +26 -0
- package/dist/brain/provider-fetch.d.ts.map +1 -0
- package/dist/brain/provider-fetch.js +45 -0
- package/dist/brain/provider-fetch.js.map +1 -0
- package/dist/brain/snapshot-budget.d.ts +20 -0
- package/dist/brain/snapshot-budget.d.ts.map +1 -0
- package/dist/brain/snapshot-budget.js +202 -0
- package/dist/brain/snapshot-budget.js.map +1 -0
- package/dist/brain/system-prompt.d.ts +67 -0
- package/dist/brain/system-prompt.d.ts.map +1 -0
- package/dist/brain/system-prompt.js +128 -0
- package/dist/brain/system-prompt.js.map +1 -0
- package/dist/brain/tasks/design-audit.d.ts +33 -0
- package/dist/brain/tasks/design-audit.d.ts.map +1 -0
- package/dist/brain/tasks/design-audit.js +100 -0
- package/dist/brain/tasks/design-audit.js.map +1 -0
- package/dist/brain/tasks/evaluate.d.ts +25 -0
- package/dist/brain/tasks/evaluate.d.ts.map +1 -0
- package/dist/brain/tasks/evaluate.js +55 -0
- package/dist/brain/tasks/evaluate.js.map +1 -0
- package/dist/brain/tasks/goal-verification.d.ts +32 -0
- package/dist/brain/tasks/goal-verification.d.ts.map +1 -0
- package/dist/brain/tasks/goal-verification.js +68 -0
- package/dist/brain/tasks/goal-verification.js.map +1 -0
- package/dist/brain/tasks/knowledge.d.ts +26 -0
- package/dist/brain/tasks/knowledge.d.ts.map +1 -0
- package/dist/brain/tasks/knowledge.js +56 -0
- package/dist/brain/tasks/knowledge.js.map +1 -0
- package/dist/brain/tasks/link-scout.d.ts +37 -0
- package/dist/brain/tasks/link-scout.d.ts.map +1 -0
- package/dist/brain/tasks/link-scout.js +69 -0
- package/dist/brain/tasks/link-scout.js.map +1 -0
- package/dist/brain/types.d.ts +55 -0
- package/dist/brain/types.d.ts.map +1 -0
- package/dist/brain/types.js +7 -0
- package/dist/brain/types.js.map +1 -0
- package/dist/browser/stealth-init-script.d.ts +9 -0
- package/dist/browser/stealth-init-script.d.ts.map +1 -0
- package/dist/browser/stealth-init-script.js +128 -0
- package/dist/browser/stealth-init-script.js.map +1 -0
- package/dist/browser/storage-state.d.ts +29 -0
- package/dist/browser/storage-state.d.ts.map +1 -0
- package/dist/browser/storage-state.js +47 -0
- package/dist/browser/storage-state.js.map +1 -0
- package/dist/cli/args.d.ts +141 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +167 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/benchmark-sync.d.ts +9 -0
- package/dist/cli/benchmark-sync.d.ts.map +1 -0
- package/dist/cli/benchmark-sync.js +43 -0
- package/dist/cli/benchmark-sync.js.map +1 -0
- package/dist/cli/build-config.d.ts +11 -0
- package/dist/cli/build-config.d.ts.map +1 -0
- package/dist/cli/build-config.js +355 -0
- package/dist/cli/build-config.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +3 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +36 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/chrome-debug.d.ts +7 -0
- package/dist/cli/commands/chrome-debug.d.ts.map +1 -0
- package/dist/cli/commands/chrome-debug.js +11 -0
- package/dist/cli/commands/chrome-debug.js.map +1 -0
- package/dist/cli/commands/design-audit.d.ts +3 -0
- package/dist/cli/commands/design-audit.d.ts.map +1 -0
- package/dist/cli/commands/design-audit.js +68 -0
- package/dist/cli/commands/design-audit.js.map +1 -0
- package/dist/cli/commands/preview.d.ts +14 -0
- package/dist/cli/commands/preview.d.ts.map +1 -0
- package/dist/cli/commands/preview.js +31 -0
- package/dist/cli/commands/preview.js.map +1 -0
- package/dist/cli/commands/run.d.ts +3 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +728 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/runs.d.ts +8 -0
- package/dist/cli/commands/runs.d.ts.map +1 -0
- package/dist/cli/commands/runs.js +35 -0
- package/dist/cli/commands/runs.js.map +1 -0
- package/dist/cli/commands/share.d.ts +10 -0
- package/dist/cli/commands/share.d.ts.map +1 -0
- package/dist/cli/commands/share.js +32 -0
- package/dist/cli/commands/share.js.map +1 -0
- package/dist/cli/commands/showcase.d.ts +17 -0
- package/dist/cli/commands/showcase.d.ts.map +1 -0
- package/dist/cli/commands/showcase.js +20 -0
- package/dist/cli/commands/showcase.js.map +1 -0
- package/dist/cli/commands/snapshot.d.ts +12 -0
- package/dist/cli/commands/snapshot.d.ts.map +1 -0
- package/dist/cli/commands/snapshot.js +24 -0
- package/dist/cli/commands/snapshot.js.map +1 -0
- package/dist/cli/commands/view.d.ts +7 -0
- package/dist/cli/commands/view.d.ts.map +1 -0
- package/dist/cli/commands/view.js +23 -0
- package/dist/cli/commands/view.js.map +1 -0
- package/dist/cli/constants.d.ts +6 -0
- package/dist/cli/constants.d.ts.map +1 -0
- package/dist/cli/constants.js +3 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/version.d.ts +7 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +16 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/cli-design-audit.d.ts +44 -36
- package/dist/cli-design-audit.d.ts.map +1 -1
- package/dist/cli-design-audit.js +137 -1646
- package/dist/cli-design-audit.js.map +1 -1
- package/dist/cli-jobs.js +2 -1
- package/dist/cli-jobs.js.map +1 -1
- package/dist/cli.js +66 -1697
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -0
- package/dist/config.js.map +1 -1
- package/dist/design/audit/evolve/agent.d.ts +23 -0
- package/dist/design/audit/evolve/agent.d.ts.map +1 -0
- package/dist/design/audit/evolve/agent.js +272 -0
- package/dist/design/audit/evolve/agent.js.map +1 -0
- package/dist/design/audit/evolve/css.d.ts +10 -0
- package/dist/design/audit/evolve/css.d.ts.map +1 -0
- package/dist/design/audit/evolve/css.js +206 -0
- package/dist/design/audit/evolve/css.js.map +1 -0
- package/dist/design/audit/evolve/index.d.ts +13 -0
- package/dist/design/audit/evolve/index.d.ts.map +1 -0
- package/dist/design/audit/evolve/index.js +12 -0
- package/dist/design/audit/evolve/index.js.map +1 -0
- package/dist/design/audit/evolve/report.d.ts +3 -0
- package/dist/design/audit/evolve/report.d.ts.map +1 -0
- package/dist/design/audit/evolve/report.js +45 -0
- package/dist/design/audit/evolve/report.js.map +1 -0
- package/dist/design/audit/evolve/types.d.ts +14 -0
- package/dist/design/audit/evolve/types.d.ts.map +1 -0
- package/dist/design/audit/evolve/types.js +2 -0
- package/dist/design/audit/evolve/types.js.map +1 -0
- package/dist/design/audit/pipeline.d.ts +12 -0
- package/dist/design/audit/pipeline.d.ts.map +1 -1
- package/dist/design/audit/pipeline.js +43 -27
- package/dist/design/audit/pipeline.js.map +1 -1
- package/dist/design/audit/reference/artifact/build.d.ts +33 -0
- package/dist/design/audit/reference/artifact/build.d.ts.map +1 -0
- package/dist/design/audit/reference/artifact/build.js +64 -0
- package/dist/design/audit/reference/artifact/build.js.map +1 -0
- package/dist/design/audit/reference/artifact/render.d.ts +39 -0
- package/dist/design/audit/reference/artifact/render.d.ts.map +1 -0
- package/dist/design/audit/reference/artifact/render.js +213 -0
- package/dist/design/audit/reference/artifact/render.js.map +1 -0
- package/dist/design/audit/reference/artifact/text.d.ts +11 -0
- package/dist/design/audit/reference/artifact/text.d.ts.map +1 -0
- package/dist/design/audit/reference/artifact/text.js +20 -0
- package/dist/design/audit/reference/artifact/text.js.map +1 -0
- package/dist/design/audit/reference/artifact/to-findings.d.ts +57 -0
- package/dist/design/audit/reference/artifact/to-findings.d.ts.map +1 -0
- package/dist/design/audit/reference/artifact/to-findings.js +314 -0
- package/dist/design/audit/reference/artifact/to-findings.js.map +1 -0
- package/dist/design/audit/reference/config.d.ts +50 -0
- package/dist/design/audit/reference/config.d.ts.map +1 -0
- package/dist/design/audit/reference/config.js +108 -0
- package/dist/design/audit/reference/config.js.map +1 -0
- package/dist/design/audit/reference/contracts.d.ts +1030 -0
- package/dist/design/audit/reference/contracts.d.ts.map +1 -0
- package/dist/design/audit/reference/contracts.js +28 -0
- package/dist/design/audit/reference/contracts.js.map +1 -0
- package/dist/design/audit/reference/corpus/build.d.ts +115 -0
- package/dist/design/audit/reference/corpus/build.d.ts.map +1 -0
- package/dist/design/audit/reference/corpus/build.js +152 -0
- package/dist/design/audit/reference/corpus/build.js.map +1 -0
- package/dist/design/audit/reference/corpus/schema.d.ts +33 -0
- package/dist/design/audit/reference/corpus/schema.d.ts.map +1 -0
- package/dist/design/audit/reference/corpus/schema.js +249 -0
- package/dist/design/audit/reference/corpus/schema.js.map +1 -0
- package/dist/design/audit/reference/corpus/store.d.ts +26 -0
- package/dist/design/audit/reference/corpus/store.d.ts.map +1 -0
- package/dist/design/audit/reference/corpus/store.js +104 -0
- package/dist/design/audit/reference/corpus/store.js.map +1 -0
- package/dist/design/audit/reference/dna/delta.d.ts +21 -0
- package/dist/design/audit/reference/dna/delta.d.ts.map +1 -0
- package/dist/design/audit/reference/dna/delta.js +126 -0
- package/dist/design/audit/reference/dna/delta.js.map +1 -0
- package/dist/design/audit/reference/dna/derive.d.ts +31 -0
- package/dist/design/audit/reference/dna/derive.d.ts.map +1 -0
- package/dist/design/audit/reference/dna/derive.js +381 -0
- package/dist/design/audit/reference/dna/derive.js.map +1 -0
- package/dist/design/audit/reference/dna/descriptor.d.ts +36 -0
- package/dist/design/audit/reference/dna/descriptor.d.ts.map +1 -0
- package/dist/design/audit/reference/dna/descriptor.js +209 -0
- package/dist/design/audit/reference/dna/descriptor.js.map +1 -0
- package/dist/design/audit/reference/dna/page-adapter.d.ts +17 -0
- package/dist/design/audit/reference/dna/page-adapter.d.ts.map +1 -0
- package/dist/design/audit/reference/dna/page-adapter.js +35 -0
- package/dist/design/audit/reference/dna/page-adapter.js.map +1 -0
- package/dist/design/audit/reference/dna/scroll-capture.d.ts +93 -0
- package/dist/design/audit/reference/dna/scroll-capture.d.ts.map +1 -0
- package/dist/design/audit/reference/dna/scroll-capture.js +374 -0
- package/dist/design/audit/reference/dna/scroll-capture.js.map +1 -0
- package/dist/design/audit/reference/engine/budget.d.ts +63 -0
- package/dist/design/audit/reference/engine/budget.d.ts.map +1 -0
- package/dist/design/audit/reference/engine/budget.js +110 -0
- package/dist/design/audit/reference/engine/budget.js.map +1 -0
- package/dist/design/audit/reference/engine/core.d.ts +32 -0
- package/dist/design/audit/reference/engine/core.d.ts.map +1 -0
- package/dist/design/audit/reference/engine/core.js +261 -0
- package/dist/design/audit/reference/engine/core.js.map +1 -0
- package/dist/design/audit/reference/engine/guard.d.ts +43 -0
- package/dist/design/audit/reference/engine/guard.d.ts.map +1 -0
- package/dist/design/audit/reference/engine/guard.js +43 -0
- package/dist/design/audit/reference/engine/guard.js.map +1 -0
- package/dist/design/audit/reference/engine/score-core.d.ts +48 -0
- package/dist/design/audit/reference/engine/score-core.d.ts.map +1 -0
- package/dist/design/audit/reference/engine/score-core.js +134 -0
- package/dist/design/audit/reference/engine/score-core.js.map +1 -0
- package/dist/design/audit/reference/engine/wiring.d.ts +35 -0
- package/dist/design/audit/reference/engine/wiring.d.ts.map +1 -0
- package/dist/design/audit/reference/engine/wiring.js +80 -0
- package/dist/design/audit/reference/engine/wiring.js.map +1 -0
- package/dist/design/audit/reference/eval/taste-core.d.ts +77 -0
- package/dist/design/audit/reference/eval/taste-core.d.ts.map +1 -0
- package/dist/design/audit/reference/eval/taste-core.js +95 -0
- package/dist/design/audit/reference/eval/taste-core.js.map +1 -0
- package/dist/design/audit/reference/generate/generator.d.ts +49 -0
- package/dist/design/audit/reference/generate/generator.d.ts.map +1 -0
- package/dist/design/audit/reference/generate/generator.js +94 -0
- package/dist/design/audit/reference/generate/generator.js.map +1 -0
- package/dist/design/audit/reference/generate/parse.d.ts +28 -0
- package/dist/design/audit/reference/generate/parse.d.ts.map +1 -0
- package/dist/design/audit/reference/generate/parse.js +180 -0
- package/dist/design/audit/reference/generate/parse.js.map +1 -0
- package/dist/design/audit/reference/generate/prompt.d.ts +36 -0
- package/dist/design/audit/reference/generate/prompt.d.ts.map +1 -0
- package/dist/design/audit/reference/generate/prompt.js +124 -0
- package/dist/design/audit/reference/generate/prompt.js.map +1 -0
- package/dist/design/audit/reference/index.d.ts +26 -0
- package/dist/design/audit/reference/index.d.ts.map +1 -0
- package/dist/design/audit/reference/index.js +31 -0
- package/dist/design/audit/reference/index.js.map +1 -0
- package/dist/design/audit/reference/judge/image-clamp.d.ts +34 -0
- package/dist/design/audit/reference/judge/image-clamp.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/image-clamp.js +88 -0
- package/dist/design/audit/reference/judge/image-clamp.js.map +1 -0
- package/dist/design/audit/reference/judge/pairwise.d.ts +34 -0
- package/dist/design/audit/reference/judge/pairwise.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/pairwise.js +105 -0
- package/dist/design/audit/reference/judge/pairwise.js.map +1 -0
- package/dist/design/audit/reference/judge/parse.d.ts +31 -0
- package/dist/design/audit/reference/judge/parse.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/parse.js +113 -0
- package/dist/design/audit/reference/judge/parse.js.map +1 -0
- package/dist/design/audit/reference/judge/prompt.d.ts +38 -0
- package/dist/design/audit/reference/judge/prompt.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/prompt.js +111 -0
- package/dist/design/audit/reference/judge/prompt.js.map +1 -0
- package/dist/design/audit/reference/judge/quality.d.ts +28 -0
- package/dist/design/audit/reference/judge/quality.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/quality.js +62 -0
- package/dist/design/audit/reference/judge/quality.js.map +1 -0
- package/dist/design/audit/reference/judge/rank.d.ts +41 -0
- package/dist/design/audit/reference/judge/rank.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/rank.js +196 -0
- package/dist/design/audit/reference/judge/rank.js.map +1 -0
- package/dist/design/audit/reference/judge/text-judge.d.ts +31 -0
- package/dist/design/audit/reference/judge/text-judge.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/text-judge.js +43 -0
- package/dist/design/audit/reference/judge/text-judge.js.map +1 -0
- package/dist/design/audit/reference/judge/vision-judge.d.ts +59 -0
- package/dist/design/audit/reference/judge/vision-judge.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/vision-judge.js +150 -0
- package/dist/design/audit/reference/judge/vision-judge.js.map +1 -0
- package/dist/design/audit/reference/judge/vision-model.d.ts +65 -0
- package/dist/design/audit/reference/judge/vision-model.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/vision-model.js +110 -0
- package/dist/design/audit/reference/judge/vision-model.js.map +1 -0
- package/dist/design/audit/reference/pipeline/evaluate-reference.d.ts +68 -0
- package/dist/design/audit/reference/pipeline/evaluate-reference.d.ts.map +1 -0
- package/dist/design/audit/reference/pipeline/evaluate-reference.js +52 -0
- package/dist/design/audit/reference/pipeline/evaluate-reference.js.map +1 -0
- package/dist/design/audit/reference/reference-context.d.ts +31 -0
- package/dist/design/audit/reference/reference-context.d.ts.map +1 -0
- package/dist/design/audit/reference/reference-context.js +73 -0
- package/dist/design/audit/reference/reference-context.js.map +1 -0
- package/dist/design/audit/reference/retrieval/embedding-hash.d.ts +30 -0
- package/dist/design/audit/reference/retrieval/embedding-hash.d.ts.map +1 -0
- package/dist/design/audit/reference/retrieval/embedding-hash.js +87 -0
- package/dist/design/audit/reference/retrieval/embedding-hash.js.map +1 -0
- package/dist/design/audit/reference/retrieval/embedding-openai.d.ts +38 -0
- package/dist/design/audit/reference/retrieval/embedding-openai.d.ts.map +1 -0
- package/dist/design/audit/reference/retrieval/embedding-openai.js +73 -0
- package/dist/design/audit/reference/retrieval/embedding-openai.js.map +1 -0
- package/dist/design/audit/reference/retrieval/matcher.d.ts +34 -0
- package/dist/design/audit/reference/retrieval/matcher.d.ts.map +1 -0
- package/dist/design/audit/reference/retrieval/matcher.js +107 -0
- package/dist/design/audit/reference/retrieval/matcher.js.map +1 -0
- package/dist/design/audit/reference/run.d.ts +59 -0
- package/dist/design/audit/reference/run.d.ts.map +1 -0
- package/dist/design/audit/reference/run.js +99 -0
- package/dist/design/audit/reference/run.js.map +1 -0
- package/dist/design/audit/report.d.ts +35 -0
- package/dist/design/audit/report.d.ts.map +1 -0
- package/dist/design/audit/report.js +195 -0
- package/dist/design/audit/report.js.map +1 -0
- package/dist/design/audit/tokens/extract.d.ts +71 -0
- package/dist/design/audit/tokens/extract.d.ts.map +1 -0
- package/dist/design/audit/tokens/extract.js +1034 -0
- package/dist/design/audit/tokens/extract.js.map +1 -0
- package/dist/design/audit/types.d.ts +8 -0
- package/dist/design/audit/types.d.ts.map +1 -1
- package/dist/design/compare.d.ts.map +1 -1
- package/dist/design/compare.js +2 -6
- package/dist/design/compare.js.map +1 -1
- package/dist/design/cookie-consent.d.ts +3 -0
- package/dist/design/cookie-consent.d.ts.map +1 -0
- package/dist/design/cookie-consent.js +26 -0
- package/dist/design/cookie-consent.js.map +1 -0
- package/dist/design/viewports.d.ts +18 -0
- package/dist/design/viewports.d.ts.map +1 -0
- package/dist/design/viewports.js +10 -0
- package/dist/design/viewports.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/memory/store.d.ts +19 -1
- package/dist/memory/store.d.ts.map +1 -1
- package/dist/memory/store.js +47 -0
- package/dist/memory/store.js.map +1 -1
- package/dist/provider-defaults.d.ts +18 -0
- package/dist/provider-defaults.d.ts.map +1 -1
- package/dist/provider-defaults.js +33 -0
- package/dist/provider-defaults.js.map +1 -1
- package/dist/runner/allowed-domains.d.ts +11 -0
- package/dist/runner/allowed-domains.d.ts.map +1 -0
- package/dist/runner/allowed-domains.js +14 -0
- package/dist/runner/allowed-domains.js.map +1 -0
- package/dist/runner/batch-fill.d.ts +28 -0
- package/dist/runner/batch-fill.d.ts.map +1 -0
- package/dist/runner/batch-fill.js +80 -0
- package/dist/runner/batch-fill.js.map +1 -0
- package/dist/runner/completion-policy.d.ts +26 -0
- package/dist/runner/completion-policy.d.ts.map +1 -0
- package/dist/runner/completion-policy.js +76 -0
- package/dist/runner/completion-policy.js.map +1 -0
- package/dist/runner/constants.d.ts +14 -0
- package/dist/runner/constants.d.ts.map +1 -0
- package/dist/runner/constants.js +23 -0
- package/dist/runner/constants.js.map +1 -0
- package/dist/runner/decision-screenshot.d.ts +24 -0
- package/dist/runner/decision-screenshot.d.ts.map +1 -0
- package/dist/runner/decision-screenshot.js +23 -0
- package/dist/runner/decision-screenshot.js.map +1 -0
- package/dist/runner/domain-boundary.d.ts +36 -0
- package/dist/runner/domain-boundary.d.ts.map +1 -0
- package/dist/runner/domain-boundary.js +81 -0
- package/dist/runner/domain-boundary.js.map +1 -0
- package/dist/runner/effect-verify.d.ts +28 -0
- package/dist/runner/effect-verify.d.ts.map +1 -0
- package/dist/runner/effect-verify.js +42 -0
- package/dist/runner/effect-verify.js.map +1 -0
- package/dist/runner/execute-plan.d.ts +58 -0
- package/dist/runner/execute-plan.d.ts.map +1 -0
- package/dist/runner/execute-plan.js +426 -0
- package/dist/runner/execute-plan.js.map +1 -0
- package/dist/runner/max-turns-extension.d.ts +19 -0
- package/dist/runner/max-turns-extension.d.ts.map +1 -0
- package/dist/runner/max-turns-extension.js +25 -0
- package/dist/runner/max-turns-extension.js.map +1 -0
- package/dist/runner/micro-plan.d.ts +11 -0
- package/dist/runner/micro-plan.d.ts.map +1 -0
- package/dist/runner/micro-plan.js +29 -0
- package/dist/runner/micro-plan.js.map +1 -0
- package/dist/runner/prompt-snippets.d.ts +5 -0
- package/dist/runner/prompt-snippets.d.ts.map +1 -0
- package/dist/runner/prompt-snippets.js +13 -0
- package/dist/runner/prompt-snippets.js.map +1 -0
- package/dist/runner/replay/contracts.d.ts +300 -0
- package/dist/runner/replay/contracts.d.ts.map +1 -0
- package/dist/runner/replay/contracts.js +42 -0
- package/dist/runner/replay/contracts.js.map +1 -0
- package/dist/runner/replay/controller.d.ts +27 -0
- package/dist/runner/replay/controller.d.ts.map +1 -0
- package/dist/runner/replay/controller.js +197 -0
- package/dist/runner/replay/controller.js.map +1 -0
- package/dist/runner/replay/guard.d.ts +28 -0
- package/dist/runner/replay/guard.d.ts.map +1 -0
- package/dist/runner/replay/guard.js +100 -0
- package/dist/runner/replay/guard.js.map +1 -0
- package/dist/runner/runner.d.ts +44 -51
- package/dist/runner/runner.d.ts.map +1 -1
- package/dist/runner/runner.js +155 -851
- package/dist/runner/runner.js.map +1 -1
- package/dist/runner/scout-feedback.d.ts +51 -0
- package/dist/runner/scout-feedback.d.ts.map +1 -0
- package/dist/runner/scout-feedback.js +149 -0
- package/dist/runner/scout-feedback.js.map +1 -0
- package/dist/skills/macro-loader.d.ts +1 -1
- package/dist/test-runner.d.ts.map +1 -1
- package/dist/test-runner.js +25 -0
- package/dist/test-runner.js.map +1 -1
- package/dist/types/actions.d.ts +241 -0
- package/dist/types/actions.d.ts.map +1 -0
- package/dist/types/actions.js +5 -0
- package/dist/types/actions.js.map +1 -0
- package/dist/types/config.d.ts +211 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/design-audit.d.ts +92 -0
- package/dist/types/design-audit.d.ts.map +1 -0
- package/dist/types/design-audit.js +5 -0
- package/dist/types/design-audit.js.map +1 -0
- package/dist/types/design-tokens.d.ts +138 -0
- package/dist/types/design-tokens.d.ts.map +1 -0
- package/dist/types/design-tokens.js +5 -0
- package/dist/types/design-tokens.js.map +1 -0
- package/dist/types/page.d.ts +16 -0
- package/dist/types/page.d.ts.map +1 -0
- package/dist/types/page.js +2 -0
- package/dist/types/page.js.map +1 -0
- package/dist/types/plan.d.ts +50 -0
- package/dist/types/plan.d.ts.map +1 -0
- package/dist/types/plan.js +2 -0
- package/dist/types/plan.js.map +1 -0
- package/dist/types/preview.d.ts +9 -0
- package/dist/types/preview.d.ts.map +1 -0
- package/dist/types/preview.js +5 -0
- package/dist/types/preview.js.map +1 -0
- package/dist/types/result.d.ts +62 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +2 -0
- package/dist/types/result.js.map +1 -0
- package/dist/types/scenario.d.ts +20 -0
- package/dist/types/scenario.d.ts.map +1 -0
- package/dist/types/scenario.js +5 -0
- package/dist/types/scenario.js.map +1 -0
- package/dist/types/test-runner.d.ts +145 -0
- package/dist/types/test-runner.d.ts.map +1 -0
- package/dist/types/test-runner.js +10 -0
- package/dist/types/test-runner.js.map +1 -0
- package/dist/types/trajectory.d.ts +38 -0
- package/dist/types/trajectory.d.ts.map +1 -0
- package/dist/types/trajectory.js +2 -0
- package/dist/types/trajectory.js.map +1 -0
- package/dist/types/turn.d.ts +50 -0
- package/dist/types/turn.d.ts.map +1 -0
- package/dist/types/turn.js +2 -0
- package/dist/types/turn.js.map +1 -0
- package/dist/types.d.ts +16 -1017
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +15 -8
- package/dist/types.js.map +1 -1
- package/dist/wallet/rpc-interception.d.ts +15 -0
- package/dist/wallet/rpc-interception.d.ts.map +1 -0
- package/dist/wallet/rpc-interception.js +95 -0
- package/dist/wallet/rpc-interception.js.map +1 -0
- package/package.json +7 -3
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design-DNA derivation — the PURE core of the reference engine's FOUNDATION.
|
|
3
|
+
*
|
|
4
|
+
* `toDesignDNA` folds an already-extracted `DesignTokens` record (+ optional
|
|
5
|
+
* deterministic `MeasurementBundle`) into the normalised, browser-free
|
|
6
|
+
* `DesignDNA` identity. It performs NO IO, NO LLM, NO browser work and is fully
|
|
7
|
+
* deterministic, so it unit-tests on static token fixtures alone.
|
|
8
|
+
*
|
|
9
|
+
* Altitude discipline (per ARCHITECTURE.md §0): this is a LOSSY normalisation of
|
|
10
|
+
* tokens. It CARRIES THROUGH the already-computed `ColorToken.cluster` and
|
|
11
|
+
* `ViewportTokens.gridBaseUnit` rather than re-clustering colours or re-detecting
|
|
12
|
+
* a grid — those decisions belong to the token extractor, not here.
|
|
13
|
+
*/
|
|
14
|
+
import { foldScrollMotion } from './scroll-capture.js';
|
|
15
|
+
// Adjacent type-scale ratios this close to each other (max/min) read as one
|
|
16
|
+
// modular scale; beyond it the scale is irregular and no ratio is reported.
|
|
17
|
+
const RATIO_CONSISTENCY_TOLERANCE = 1.12;
|
|
18
|
+
// CSS `line-height: normal` has no numeric value to read; this is the
|
|
19
|
+
// conventional ~1.2 approximation used only when the keyword/garbage is present.
|
|
20
|
+
const NORMAL_LINE_HEIGHT = 1.2;
|
|
21
|
+
// A heading at or above this rendered size is classified as a display step.
|
|
22
|
+
const DISPLAY_MIN_PX = 40;
|
|
23
|
+
// Distinct component-pattern thresholds for the whitespace-free density proxy.
|
|
24
|
+
const SPARSE_MAX_PATTERNS = 4;
|
|
25
|
+
const BALANCED_MAX_PATTERNS = 12;
|
|
26
|
+
// Substrings that mark a detected library as motion-related.
|
|
27
|
+
const ANIMATION_LIB_PATTERNS = [
|
|
28
|
+
'gsap',
|
|
29
|
+
'framer',
|
|
30
|
+
'lottie',
|
|
31
|
+
'anime',
|
|
32
|
+
'aos',
|
|
33
|
+
'velocity',
|
|
34
|
+
'react-spring',
|
|
35
|
+
'lenis',
|
|
36
|
+
'scrollmagic',
|
|
37
|
+
'rive',
|
|
38
|
+
'three.js',
|
|
39
|
+
'threejs',
|
|
40
|
+
];
|
|
41
|
+
const round2 = (n) => Math.round(n * 100) / 100;
|
|
42
|
+
function primaryFamily(stack) {
|
|
43
|
+
const first = stack.split(',')[0]?.trim() ?? '';
|
|
44
|
+
return first.replace(/^["']|["']$/g, '');
|
|
45
|
+
}
|
|
46
|
+
function parseWeight(raw) {
|
|
47
|
+
const n = parseInt(raw, 10);
|
|
48
|
+
if (Number.isFinite(n) && n > 0)
|
|
49
|
+
return n;
|
|
50
|
+
const named = { normal: 400, bold: 700, lighter: 300, bolder: 700 };
|
|
51
|
+
return named[raw.trim().toLowerCase()] ?? 400;
|
|
52
|
+
}
|
|
53
|
+
function lineHeightRatio(raw, fontSizePx) {
|
|
54
|
+
const trimmed = raw.trim();
|
|
55
|
+
if (trimmed === 'normal' || trimmed === '')
|
|
56
|
+
return NORMAL_LINE_HEIGHT;
|
|
57
|
+
const px = trimmed.match(/^([\d.]+)px$/);
|
|
58
|
+
if (px && fontSizePx > 0)
|
|
59
|
+
return round2(parseFloat(px[1]) / fontSizePx);
|
|
60
|
+
const pct = trimmed.match(/^([\d.]+)%$/);
|
|
61
|
+
if (pct)
|
|
62
|
+
return round2(parseFloat(pct[1]) / 100);
|
|
63
|
+
const num = parseFloat(trimmed);
|
|
64
|
+
if (Number.isFinite(num) && !/[a-z%]/i.test(trimmed))
|
|
65
|
+
return round2(num);
|
|
66
|
+
return NORMAL_LINE_HEIGHT;
|
|
67
|
+
}
|
|
68
|
+
function stepRole(usage, fontSizePx) {
|
|
69
|
+
if (usage === 'heading')
|
|
70
|
+
return fontSizePx >= DISPLAY_MIN_PX ? 'display' : 'heading';
|
|
71
|
+
return usage;
|
|
72
|
+
}
|
|
73
|
+
function parsePx(raw) {
|
|
74
|
+
const m = raw.trim().match(/^(-?[\d.]+)px$/);
|
|
75
|
+
if (!m)
|
|
76
|
+
return undefined;
|
|
77
|
+
const n = parseFloat(m[1]);
|
|
78
|
+
return Number.isFinite(n) ? n : undefined;
|
|
79
|
+
}
|
|
80
|
+
function detectRatio(steps) {
|
|
81
|
+
const sizes = [...new Set(steps.map((s) => s.fontSizePx))].sort((a, b) => a - b);
|
|
82
|
+
if (sizes.length < 2)
|
|
83
|
+
return undefined;
|
|
84
|
+
const ratios = [];
|
|
85
|
+
for (let i = 1; i < sizes.length; i++) {
|
|
86
|
+
if (sizes[i - 1] > 0)
|
|
87
|
+
ratios.push(sizes[i] / sizes[i - 1]);
|
|
88
|
+
}
|
|
89
|
+
if (ratios.length === 0)
|
|
90
|
+
return undefined;
|
|
91
|
+
const min = Math.min(...ratios);
|
|
92
|
+
const max = Math.max(...ratios);
|
|
93
|
+
if (min <= 0 || max / min > RATIO_CONSISTENCY_TOLERANCE)
|
|
94
|
+
return undefined;
|
|
95
|
+
return round2(ratios.reduce((a, b) => a + b, 0) / ratios.length);
|
|
96
|
+
}
|
|
97
|
+
function deriveDensity(componentPatternCount, whitespaceRatio) {
|
|
98
|
+
if (whitespaceRatio !== undefined) {
|
|
99
|
+
if (whitespaceRatio >= 0.6)
|
|
100
|
+
return 'sparse';
|
|
101
|
+
if (whitespaceRatio >= 0.35)
|
|
102
|
+
return 'balanced';
|
|
103
|
+
return 'dense';
|
|
104
|
+
}
|
|
105
|
+
if (componentPatternCount <= SPARSE_MAX_PATTERNS)
|
|
106
|
+
return 'sparse';
|
|
107
|
+
if (componentPatternCount <= BALANCED_MAX_PATTERNS)
|
|
108
|
+
return 'balanced';
|
|
109
|
+
return 'dense';
|
|
110
|
+
}
|
|
111
|
+
function aggregateSpacingSteps(responsive) {
|
|
112
|
+
const set = new Set();
|
|
113
|
+
for (const vp of Object.values(responsive)) {
|
|
114
|
+
for (const s of vp.spacing) {
|
|
115
|
+
const px = parsePx(s.value);
|
|
116
|
+
if (px !== undefined && px > 0)
|
|
117
|
+
set.add(Math.round(px));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return [...set].sort((a, b) => a - b);
|
|
121
|
+
}
|
|
122
|
+
function aggregateRadii(responsive) {
|
|
123
|
+
const set = new Set();
|
|
124
|
+
for (const vp of Object.values(responsive)) {
|
|
125
|
+
for (const b of vp.borders) {
|
|
126
|
+
const px = parsePx(b.borderRadius);
|
|
127
|
+
if (px !== undefined && px > 0)
|
|
128
|
+
set.add(Math.round(px));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return [...set].sort((a, b) => a - b);
|
|
132
|
+
}
|
|
133
|
+
function pickGridBaseUnit(responsive) {
|
|
134
|
+
const desktop = responsive['desktop'];
|
|
135
|
+
if (desktop && desktop.gridBaseUnit !== undefined)
|
|
136
|
+
return desktop.gridBaseUnit;
|
|
137
|
+
const counts = new Map();
|
|
138
|
+
for (const vp of Object.values(responsive)) {
|
|
139
|
+
if (vp.gridBaseUnit !== undefined)
|
|
140
|
+
counts.set(vp.gridBaseUnit, (counts.get(vp.gridBaseUnit) ?? 0) + 1);
|
|
141
|
+
}
|
|
142
|
+
if (counts.size === 0)
|
|
143
|
+
return undefined;
|
|
144
|
+
let best;
|
|
145
|
+
let bestCount = -1;
|
|
146
|
+
// Sort by unit asc first so an equal-frequency tie resolves to the smallest unit.
|
|
147
|
+
for (const [unit, count] of [...counts.entries()].sort((a, b) => a[0] - b[0])) {
|
|
148
|
+
if (count > bestCount) {
|
|
149
|
+
bestCount = count;
|
|
150
|
+
best = unit;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return best;
|
|
154
|
+
}
|
|
155
|
+
function parseDurationsMs(value) {
|
|
156
|
+
const out = [];
|
|
157
|
+
const re = /(\d*\.?\d+)\s*(ms|s)\b/gi;
|
|
158
|
+
let m;
|
|
159
|
+
while ((m = re.exec(value)) !== null) {
|
|
160
|
+
const n = parseFloat(m[1]);
|
|
161
|
+
if (!Number.isFinite(n))
|
|
162
|
+
continue;
|
|
163
|
+
const ms = m[2].toLowerCase() === 's' ? n * 1000 : n;
|
|
164
|
+
if (ms > 0)
|
|
165
|
+
out.push(Math.round(ms));
|
|
166
|
+
}
|
|
167
|
+
return out;
|
|
168
|
+
}
|
|
169
|
+
function parseEasings(value) {
|
|
170
|
+
const out = [];
|
|
171
|
+
const fn = /(cubic-bezier|steps)\s*\([^)]*\)/gi;
|
|
172
|
+
let m;
|
|
173
|
+
while ((m = fn.exec(value)) !== null)
|
|
174
|
+
out.push(m[0].replace(/\s+/g, ''));
|
|
175
|
+
const named = /\b(ease-in-out|ease-in|ease-out|ease|linear|step-start|step-end)\b/gi;
|
|
176
|
+
while ((m = named.exec(value)) !== null)
|
|
177
|
+
out.push(m[1].toLowerCase());
|
|
178
|
+
return out;
|
|
179
|
+
}
|
|
180
|
+
function detectAnimationLibraries(libs) {
|
|
181
|
+
const out = new Set();
|
|
182
|
+
for (const lib of libs) {
|
|
183
|
+
const norm = lib.toLowerCase();
|
|
184
|
+
if (ANIMATION_LIB_PATTERNS.some((p) => norm.includes(p)))
|
|
185
|
+
out.add(lib);
|
|
186
|
+
}
|
|
187
|
+
return [...out].sort();
|
|
188
|
+
}
|
|
189
|
+
function deriveMotion(responsive, detectedLibraries, scroll) {
|
|
190
|
+
const durations = new Set();
|
|
191
|
+
const easings = new Set();
|
|
192
|
+
for (const vp of Object.values(responsive)) {
|
|
193
|
+
for (const a of vp.animations) {
|
|
194
|
+
for (const d of parseDurationsMs(a.value))
|
|
195
|
+
durations.add(d);
|
|
196
|
+
for (const e of parseEasings(a.value))
|
|
197
|
+
easings.add(e);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const motion = {
|
|
201
|
+
durationsMs: [...durations].sort((a, b) => a - b),
|
|
202
|
+
easings: [...easings].sort(),
|
|
203
|
+
libraries: detectAnimationLibraries(detectedLibraries),
|
|
204
|
+
};
|
|
205
|
+
// Live-observed scroll motion, when the opt-in capture pass ran. Absent =
|
|
206
|
+
// not captured (never read as "no scroll motion").
|
|
207
|
+
if (scroll)
|
|
208
|
+
motion.scroll = foldScrollMotion(scroll);
|
|
209
|
+
return motion;
|
|
210
|
+
}
|
|
211
|
+
function distinctComponentCount(responsive, kind) {
|
|
212
|
+
const set = new Set();
|
|
213
|
+
for (const vp of Object.values(responsive)) {
|
|
214
|
+
for (const c of vp.components[kind])
|
|
215
|
+
set.add(c.fingerprint);
|
|
216
|
+
}
|
|
217
|
+
return set.size;
|
|
218
|
+
}
|
|
219
|
+
function distinctNavCount(responsive) {
|
|
220
|
+
const set = new Set();
|
|
221
|
+
for (const vp of Object.values(responsive)) {
|
|
222
|
+
for (const n of vp.components.nav)
|
|
223
|
+
set.add(n.selector);
|
|
224
|
+
}
|
|
225
|
+
return set.size;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* A coarse, deterministic structural archetype label derived from the dominant
|
|
229
|
+
* component composition. Free-form by contract — a hint for retrieval, never a
|
|
230
|
+
* forced bucket — so novel compositions fall through to `content-flow`.
|
|
231
|
+
*/
|
|
232
|
+
function deriveArchetype(c) {
|
|
233
|
+
if (c.buttons === 0 && c.inputs === 0 && c.cards === 0 && c.nav === 0)
|
|
234
|
+
return 'minimal';
|
|
235
|
+
if (c.inputs >= 3 && c.inputs >= c.cards)
|
|
236
|
+
return 'form-shell';
|
|
237
|
+
if (c.cards >= 3 && c.cards >= c.inputs)
|
|
238
|
+
return 'card-grid';
|
|
239
|
+
if (c.nav >= 1 && c.buttons >= 2 && c.cards < 3)
|
|
240
|
+
return 'nav-content';
|
|
241
|
+
return 'content-flow';
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Fold a `DesignTokens` record (+ optional measurements + optional live
|
|
245
|
+
* `RawScrollCapture`) into a `DesignDNA`. Pure and deterministic: identical
|
|
246
|
+
* inputs always yield an identical DNA. `scroll` is attached as `motion.scroll`
|
|
247
|
+
* only when supplied — the browser layer captures it; this fold never observes a
|
|
248
|
+
* page.
|
|
249
|
+
*/
|
|
250
|
+
export function toDesignDNA(tokens, measurements, scroll) {
|
|
251
|
+
const steps = tokens.typography.scale
|
|
252
|
+
.map((e) => {
|
|
253
|
+
const fontSizePx = round2(parseFloat(e.fontSize));
|
|
254
|
+
return {
|
|
255
|
+
fontSizePx,
|
|
256
|
+
weight: parseWeight(e.fontWeight),
|
|
257
|
+
lineHeight: lineHeightRatio(e.lineHeight, fontSizePx),
|
|
258
|
+
family: primaryFamily(e.fontFamily),
|
|
259
|
+
role: stepRole(e.usage, fontSizePx),
|
|
260
|
+
};
|
|
261
|
+
})
|
|
262
|
+
.filter((s) => Number.isFinite(s.fontSizePx) && s.fontSizePx > 0)
|
|
263
|
+
.sort((a, b) => a.fontSizePx - b.fontSizePx);
|
|
264
|
+
const families = tokens.typography.families.map((f) => ({
|
|
265
|
+
family: f.family,
|
|
266
|
+
role: f.classification,
|
|
267
|
+
weights: [...f.weights].sort((a, b) => a - b),
|
|
268
|
+
}));
|
|
269
|
+
// Colour roles are a 1:1 carry-through of the precomputed cluster — never a
|
|
270
|
+
// re-clustering. Tokens with no cluster are deliberately dropped, not guessed.
|
|
271
|
+
const roles = {
|
|
272
|
+
primary: [],
|
|
273
|
+
secondary: [],
|
|
274
|
+
accent: [],
|
|
275
|
+
neutral: [],
|
|
276
|
+
background: [],
|
|
277
|
+
border: [],
|
|
278
|
+
};
|
|
279
|
+
for (const c of tokens.colors) {
|
|
280
|
+
if (!c.cluster)
|
|
281
|
+
continue;
|
|
282
|
+
const bucket = roles[c.cluster];
|
|
283
|
+
if (!bucket.includes(c.hex))
|
|
284
|
+
bucket.push(c.hex);
|
|
285
|
+
}
|
|
286
|
+
const failures = measurements?.contrast.aaFailures ?? [];
|
|
287
|
+
const contrastFloor = failures.length > 0 ? round2(Math.min(...failures.map((f) => f.ratio))) : undefined;
|
|
288
|
+
const components = {
|
|
289
|
+
buttons: distinctComponentCount(tokens.responsive, 'buttons'),
|
|
290
|
+
inputs: distinctComponentCount(tokens.responsive, 'inputs'),
|
|
291
|
+
cards: distinctComponentCount(tokens.responsive, 'cards'),
|
|
292
|
+
nav: distinctNavCount(tokens.responsive),
|
|
293
|
+
};
|
|
294
|
+
const baseUnit = pickGridBaseUnit(tokens.responsive);
|
|
295
|
+
const density = deriveDensity(components.buttons + components.inputs + components.cards + components.nav);
|
|
296
|
+
const signals = measurements
|
|
297
|
+
? {
|
|
298
|
+
contrastAaPassRate: measurements.contrast.summary.aaPassRate,
|
|
299
|
+
a11yBlockingCount: measurements.a11y.violations.filter((v) => v.impact === 'critical' || v.impact === 'serious').length,
|
|
300
|
+
}
|
|
301
|
+
: undefined;
|
|
302
|
+
return {
|
|
303
|
+
url: tokens.url,
|
|
304
|
+
capturedAt: tokens.extractedAt,
|
|
305
|
+
type: {
|
|
306
|
+
steps,
|
|
307
|
+
ratio: detectRatio(steps),
|
|
308
|
+
families,
|
|
309
|
+
},
|
|
310
|
+
color: {
|
|
311
|
+
roles,
|
|
312
|
+
contrastFloor,
|
|
313
|
+
},
|
|
314
|
+
spacing: {
|
|
315
|
+
baseUnit,
|
|
316
|
+
steps: aggregateSpacingSteps(tokens.responsive),
|
|
317
|
+
density,
|
|
318
|
+
},
|
|
319
|
+
radii: {
|
|
320
|
+
steps: aggregateRadii(tokens.responsive),
|
|
321
|
+
},
|
|
322
|
+
motion: deriveMotion(tokens.responsive, tokens.detectedLibraries, scroll),
|
|
323
|
+
layout: {
|
|
324
|
+
columns: undefined,
|
|
325
|
+
gridBaseUnit: baseUnit,
|
|
326
|
+
whitespaceRatio: undefined,
|
|
327
|
+
density,
|
|
328
|
+
archetype: deriveArchetype(components),
|
|
329
|
+
},
|
|
330
|
+
components,
|
|
331
|
+
signals,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Render the observed scroll-motion as a compact clause appended to the motion
|
|
336
|
+
* line, or '' when no scroll pass was captured (honest absence). Reports the
|
|
337
|
+
* measured numbers even when `scrollDriven` is false (a captured-but-quiet page),
|
|
338
|
+
* tagging that case so the reader can distinguish it from a motion-rich one.
|
|
339
|
+
*/
|
|
340
|
+
function scrollMotionClause(scroll) {
|
|
341
|
+
if (!scroll)
|
|
342
|
+
return '';
|
|
343
|
+
const parts = [`${scroll.pageHeightRatio}× tall`, `${scroll.reveals.count} reveals`];
|
|
344
|
+
if (scroll.reveals.kinds.length)
|
|
345
|
+
parts[parts.length - 1] += ` (${scroll.reveals.kinds.join('/')})`;
|
|
346
|
+
if (scroll.stickyCount > 0)
|
|
347
|
+
parts.push(`${scroll.stickyCount} sticky`);
|
|
348
|
+
if (scroll.parallax > 0)
|
|
349
|
+
parts.push(`parallax ${scroll.parallax}`);
|
|
350
|
+
return `; scroll: ${parts.join(', ')}${scroll.scrollDriven ? '' : ' (quiet)'}`;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* A budget-bounded, prompt-ready summary of a `DesignDNA`. Deterministic and
|
|
354
|
+
* IO-free; truncates to `maxChars` so an injected reference can never blow the
|
|
355
|
+
* generation/judge token budget.
|
|
356
|
+
*/
|
|
357
|
+
export function summarizeDNA(dna, opts = {}) {
|
|
358
|
+
const maxChars = opts.maxChars ?? 1200;
|
|
359
|
+
const sizes = dna.type.steps.map((s) => s.fontSizePx).join('/');
|
|
360
|
+
const ratio = dna.type.ratio !== undefined ? `~${dna.type.ratio}×` : 'irregular';
|
|
361
|
+
const fams = dna.type.families.map((f) => `${f.family}(${f.role})`).join(', ');
|
|
362
|
+
const colorLine = Object.keys(dna.color.roles)
|
|
363
|
+
.filter((r) => dna.color.roles[r].length > 0)
|
|
364
|
+
.map((r) => `${r}:${dna.color.roles[r].join(' ')}`)
|
|
365
|
+
.join(' ');
|
|
366
|
+
const lines = [
|
|
367
|
+
`type: ${sizes || 'none'} px, scale ${ratio}; families ${fams || 'none'}`,
|
|
368
|
+
`color: ${colorLine || 'none'}${dna.color.contrastFloor !== undefined ? ` (contrast floor ${dna.color.contrastFloor})` : ''}`,
|
|
369
|
+
`spacing: base ${dna.spacing.baseUnit ?? 'none'} px, steps ${dna.spacing.steps.join('/') || 'none'}, ${dna.spacing.density}`,
|
|
370
|
+
`radii: ${dna.radii.steps.join('/') || 'none'} px`,
|
|
371
|
+
`motion: ${dna.motion.durationsMs.join('/') || 'none'} ms, ${dna.motion.easings.join(' ') || 'no-easing'}${dna.motion.libraries.length ? `, libs ${dna.motion.libraries.join(' ')}` : ''}${scrollMotionClause(dna.motion.scroll)}`,
|
|
372
|
+
`layout: ${dna.layout.archetype}, ${dna.layout.density}`,
|
|
373
|
+
`components: ${dna.components.buttons}btn ${dna.components.inputs}input ${dna.components.cards}card ${dna.components.nav}nav`,
|
|
374
|
+
];
|
|
375
|
+
if (dna.signals) {
|
|
376
|
+
lines.push(`signals: contrast AA ${dna.signals.contrastAaPassRate ?? '?'}, a11y blocking ${dna.signals.a11yBlockingCount ?? '?'}`);
|
|
377
|
+
}
|
|
378
|
+
const body = lines.join('\n');
|
|
379
|
+
return body.length > maxChars ? `${body.slice(0, maxChars - 1)}…` : body;
|
|
380
|
+
}
|
|
381
|
+
//# sourceMappingURL=derive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/dna/derive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design-DNA derivatives for RETRIEVAL — the two PURE projections of a
|
|
3
|
+
* `DesignDNA` the reference engine needs before it can match exemplars.
|
|
4
|
+
*
|
|
5
|
+
* - `aestheticDescriptor` renders a DNA as a compact, qualitative aesthetic
|
|
6
|
+
* PHRASE — the text the `EmbeddingProvider` embeds. It deliberately does NOT
|
|
7
|
+
* overlap `summarizeDNA` (dna/derive.ts): that summary is a numeric SPEC dump
|
|
8
|
+
* for prompt/judge injection (exact px lists, hex values); this is a bag of
|
|
9
|
+
* aesthetic KEYWORDS (density, archetype, scale character, palette
|
|
10
|
+
* temperature, roundness, motion energy) chosen so semantically-similar
|
|
11
|
+
* designs land near each other in embedding space. Same field-traversal order
|
|
12
|
+
* as `summarizeDNA`, no shared logic — neither duplicates the other.
|
|
13
|
+
* - `structuralFeatures` renders a DNA as a deterministic, fixed-length numeric
|
|
14
|
+
* vector — the matcher's optional secondary (structural) similarity signal.
|
|
15
|
+
* The matcher derives the exemplar side of this comparison with the SAME
|
|
16
|
+
* function, so both sides live in one feature space.
|
|
17
|
+
*
|
|
18
|
+
* Both are pure: no IO, no LLM, no browser; identical inputs → identical output.
|
|
19
|
+
*/
|
|
20
|
+
import type { DesignDNA } from '../contracts.js';
|
|
21
|
+
/**
|
|
22
|
+
* Render a `DesignDNA` as a budget-bounded, qualitative aesthetic descriptor for
|
|
23
|
+
* embedding/retrieval. Deterministic and IO-free; clipped to `maxChars` so an
|
|
24
|
+
* embedder's token budget can never be blown.
|
|
25
|
+
*/
|
|
26
|
+
export declare function aestheticDescriptor(dna: DesignDNA, opts?: {
|
|
27
|
+
maxChars?: number;
|
|
28
|
+
}): string;
|
|
29
|
+
/**
|
|
30
|
+
* Project a `DesignDNA` onto a deterministic, fixed-length structural feature
|
|
31
|
+
* vector. Order-stable and identical across calls; every component is bounded so
|
|
32
|
+
* the vector is safe to feed straight into `cosineSimilarity`. Missing signals
|
|
33
|
+
* collapse to a neutral 0 rather than being dropped, keeping the length fixed.
|
|
34
|
+
*/
|
|
35
|
+
export declare function structuralFeatures(dna: DesignDNA): number[];
|
|
36
|
+
//# sourceMappingURL=descriptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../../../../src/design/audit/reference/dna/descriptor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,iBAAiB,CAAA;AA8F3D;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CA+B5F;AAuBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,EAAE,CAsB3D"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design-DNA derivatives for RETRIEVAL — the two PURE projections of a
|
|
3
|
+
* `DesignDNA` the reference engine needs before it can match exemplars.
|
|
4
|
+
*
|
|
5
|
+
* - `aestheticDescriptor` renders a DNA as a compact, qualitative aesthetic
|
|
6
|
+
* PHRASE — the text the `EmbeddingProvider` embeds. It deliberately does NOT
|
|
7
|
+
* overlap `summarizeDNA` (dna/derive.ts): that summary is a numeric SPEC dump
|
|
8
|
+
* for prompt/judge injection (exact px lists, hex values); this is a bag of
|
|
9
|
+
* aesthetic KEYWORDS (density, archetype, scale character, palette
|
|
10
|
+
* temperature, roundness, motion energy) chosen so semantically-similar
|
|
11
|
+
* designs land near each other in embedding space. Same field-traversal order
|
|
12
|
+
* as `summarizeDNA`, no shared logic — neither duplicates the other.
|
|
13
|
+
* - `structuralFeatures` renders a DNA as a deterministic, fixed-length numeric
|
|
14
|
+
* vector — the matcher's optional secondary (structural) similarity signal.
|
|
15
|
+
* The matcher derives the exemplar side of this comparison with the SAME
|
|
16
|
+
* function, so both sides live in one feature space.
|
|
17
|
+
*
|
|
18
|
+
* Both are pure: no IO, no LLM, no browser; identical inputs → identical output.
|
|
19
|
+
*/
|
|
20
|
+
const round2 = (n) => Math.round(n * 100) / 100;
|
|
21
|
+
const clamp01 = (n) => (n < 0 ? 0 : n > 1 ? 1 : n);
|
|
22
|
+
const COLOR_ROLE_ORDER = ['primary', 'secondary', 'accent', 'neutral', 'background', 'border'];
|
|
23
|
+
/** Parse `#rgb` / `#rrggbb` into 0-255 channels, or undefined for anything else. */
|
|
24
|
+
function parseHex(hex) {
|
|
25
|
+
const m = hex.trim().match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);
|
|
26
|
+
if (!m)
|
|
27
|
+
return undefined;
|
|
28
|
+
const h = m[1];
|
|
29
|
+
const full = h.length === 3 ? h.replace(/(.)/g, '$1$1') : h;
|
|
30
|
+
const r = parseInt(full.slice(0, 2), 16);
|
|
31
|
+
const g = parseInt(full.slice(2, 4), 16);
|
|
32
|
+
const b = parseInt(full.slice(4, 6), 16);
|
|
33
|
+
return { r, g, b };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Qualitative colour temperature of a hex: warm (red-led), cool (blue-led) or
|
|
37
|
+
* neutral (low saturation / green-led). A coarse aesthetic cue for retrieval.
|
|
38
|
+
*/
|
|
39
|
+
function colorTemperature(hex) {
|
|
40
|
+
const rgb = parseHex(hex);
|
|
41
|
+
if (!rgb)
|
|
42
|
+
return 'neutral';
|
|
43
|
+
const { r, g, b } = rgb;
|
|
44
|
+
const max = Math.max(r, g, b);
|
|
45
|
+
const min = Math.min(r, g, b);
|
|
46
|
+
const sat = max === 0 ? 0 : (max - min) / max;
|
|
47
|
+
if (sat < 0.15)
|
|
48
|
+
return 'neutral';
|
|
49
|
+
if (r >= b && r >= g)
|
|
50
|
+
return 'warm';
|
|
51
|
+
if (b >= r && b >= g)
|
|
52
|
+
return 'cool';
|
|
53
|
+
return 'neutral';
|
|
54
|
+
}
|
|
55
|
+
/** Aggressiveness of the modular type scale, as an aesthetic word. */
|
|
56
|
+
function scaleCharacter(ratio) {
|
|
57
|
+
if (ratio === undefined)
|
|
58
|
+
return 'irregular scale';
|
|
59
|
+
if (ratio < 1.18)
|
|
60
|
+
return `tight scale ~${round2(ratio)}`;
|
|
61
|
+
if (ratio < 1.4)
|
|
62
|
+
return `modular scale ~${round2(ratio)}`;
|
|
63
|
+
return `dramatic scale ~${round2(ratio)}`;
|
|
64
|
+
}
|
|
65
|
+
/** Corner roundness as an aesthetic word, from the largest radius. */
|
|
66
|
+
function roundnessCharacter(steps) {
|
|
67
|
+
if (steps.length === 0)
|
|
68
|
+
return 'sharp corners';
|
|
69
|
+
const max = Math.max(...steps);
|
|
70
|
+
if (max >= 999)
|
|
71
|
+
return 'pill corners';
|
|
72
|
+
if (max >= 16)
|
|
73
|
+
return `very rounded corners ${max}px`;
|
|
74
|
+
if (max >= 6)
|
|
75
|
+
return `rounded corners ${max}px`;
|
|
76
|
+
return `slightly rounded corners ${max}px`;
|
|
77
|
+
}
|
|
78
|
+
/** Static motion energy as an aesthetic word, from the token rip. */
|
|
79
|
+
function staticMotionCharacter(dna) {
|
|
80
|
+
const { durationsMs, libraries } = dna.motion;
|
|
81
|
+
if (libraries.length > 0)
|
|
82
|
+
return `animated motion (${libraries.join(' ')})`;
|
|
83
|
+
if (durationsMs.length === 0)
|
|
84
|
+
return 'static, no motion';
|
|
85
|
+
const median = durationsMs[Math.floor(durationsMs.length / 2)];
|
|
86
|
+
if (median <= 200)
|
|
87
|
+
return `snappy motion ~${median}ms`;
|
|
88
|
+
if (median <= 450)
|
|
89
|
+
return `smooth motion ~${median}ms`;
|
|
90
|
+
return `slow motion ~${median}ms`;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Motion energy as an aesthetic word. Appends scroll-driven keywords ONLY when a
|
|
94
|
+
* scroll pass was captured AND read the page as motion-rich, so scroll-rich pages
|
|
95
|
+
* cluster near scroll-rich exemplars in embedding space. A page with no captured
|
|
96
|
+
* scroll (or a captured-but-quiet one) reads exactly as before — the existing
|
|
97
|
+
* corpus, captured statically, is unaffected.
|
|
98
|
+
*/
|
|
99
|
+
function motionCharacter(dna) {
|
|
100
|
+
const base = staticMotionCharacter(dna);
|
|
101
|
+
const s = dna.motion.scroll;
|
|
102
|
+
if (!s || !s.scrollDriven)
|
|
103
|
+
return base;
|
|
104
|
+
const words = [];
|
|
105
|
+
if (s.pageHeightRatio >= 2.5)
|
|
106
|
+
words.push('long-form scroll');
|
|
107
|
+
if (s.reveals.count >= 2) {
|
|
108
|
+
words.push(`${s.reveals.count} scroll reveals${s.reveals.kinds.length ? ` (${s.reveals.kinds.join('/')})` : ''}`);
|
|
109
|
+
}
|
|
110
|
+
if (s.stickyCount >= 1)
|
|
111
|
+
words.push('sticky pinning');
|
|
112
|
+
if (s.parallax >= 0.25)
|
|
113
|
+
words.push('parallax depth');
|
|
114
|
+
return words.length ? `${base}, scroll-driven: ${words.join(', ')}` : base;
|
|
115
|
+
}
|
|
116
|
+
/** Contrast posture as an aesthetic word, when a floor was measured. */
|
|
117
|
+
function contrastCharacter(floor) {
|
|
118
|
+
if (floor === undefined)
|
|
119
|
+
return undefined;
|
|
120
|
+
if (floor >= 7)
|
|
121
|
+
return 'high-contrast';
|
|
122
|
+
if (floor >= 4.5)
|
|
123
|
+
return 'adequate-contrast';
|
|
124
|
+
return 'low-contrast';
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Render a `DesignDNA` as a budget-bounded, qualitative aesthetic descriptor for
|
|
128
|
+
* embedding/retrieval. Deterministic and IO-free; clipped to `maxChars` so an
|
|
129
|
+
* embedder's token budget can never be blown.
|
|
130
|
+
*/
|
|
131
|
+
export function aestheticDescriptor(dna, opts = {}) {
|
|
132
|
+
const maxChars = opts.maxChars ?? 600;
|
|
133
|
+
const displayLed = dna.type.steps.some((s) => s.role === 'display');
|
|
134
|
+
const families = dna.type.families.map((f) => f.family).filter(Boolean);
|
|
135
|
+
const typeParts = [
|
|
136
|
+
`${dna.type.steps.length}-step ${scaleCharacter(dna.type.ratio)}`,
|
|
137
|
+
displayLed ? 'display-led' : 'text-led',
|
|
138
|
+
families.length ? `families ${families.join(' ')}` : 'system fonts',
|
|
139
|
+
];
|
|
140
|
+
const populatedRoles = COLOR_ROLE_ORDER.filter((r) => dna.color.roles[r].length > 0);
|
|
141
|
+
const primaryHex = dna.color.roles.primary[0] ?? dna.color.roles.accent[0];
|
|
142
|
+
const paletteTemp = primaryHex ? colorTemperature(primaryHex) : 'neutral';
|
|
143
|
+
const paletteSize = populatedRoles.length <= 2 ? 'minimal palette' : populatedRoles.length >= 5 ? 'rich palette' : 'balanced palette';
|
|
144
|
+
const contrastWord = contrastCharacter(dna.color.contrastFloor);
|
|
145
|
+
const colorParts = [`${paletteTemp} ${paletteSize}`, `${populatedRoles.length} roles`];
|
|
146
|
+
if (contrastWord)
|
|
147
|
+
colorParts.push(contrastWord);
|
|
148
|
+
const c = dna.components;
|
|
149
|
+
const lines = [
|
|
150
|
+
`${dna.layout.density} density, ${dna.layout.archetype} archetype`,
|
|
151
|
+
`type: ${typeParts.join(', ')}`,
|
|
152
|
+
`colour: ${colorParts.join(', ')}`,
|
|
153
|
+
`spacing: ${dna.spacing.density} rhythm${dna.spacing.baseUnit !== undefined ? ` on ${dna.spacing.baseUnit}px grid` : ', no clear grid'}`,
|
|
154
|
+
`form: ${roundnessCharacter(dna.radii.steps)}`,
|
|
155
|
+
`motion: ${motionCharacter(dna)}`,
|
|
156
|
+
`components: ${c.buttons} button, ${c.inputs} input, ${c.cards} card, ${c.nav} nav patterns`,
|
|
157
|
+
];
|
|
158
|
+
const body = lines.join('; ');
|
|
159
|
+
return body.length > maxChars ? `${body.slice(0, maxChars - 1)}…` : body;
|
|
160
|
+
}
|
|
161
|
+
// Fixed feature layout — index order is the contract, every slot is bounded to
|
|
162
|
+
// ~[0,1] so cosine similarity over the vector stays well-conditioned. Changing
|
|
163
|
+
// the order or length is a breaking change to any corpus embedded against it.
|
|
164
|
+
const TYPE_STEP_SCALE = 8;
|
|
165
|
+
const TYPE_FAMILY_SCALE = 4;
|
|
166
|
+
const COLOR_ROLE_COUNT = 6;
|
|
167
|
+
const MAX_CONTRAST_RATIO = 21;
|
|
168
|
+
const MAX_GRID_UNIT = 16;
|
|
169
|
+
const SPACING_STEP_SCALE = 10;
|
|
170
|
+
const RADIUS_ROUNDNESS_SCALE = 32;
|
|
171
|
+
const RADIUS_STEP_SCALE = 6;
|
|
172
|
+
const MOTION_DURATION_SCALE = 6;
|
|
173
|
+
const COMPONENT_SCALE = 8;
|
|
174
|
+
const NAV_SCALE = 4;
|
|
175
|
+
const DENSITY_SCORE = {
|
|
176
|
+
sparse: 0,
|
|
177
|
+
balanced: 0.5,
|
|
178
|
+
dense: 1,
|
|
179
|
+
};
|
|
180
|
+
/**
|
|
181
|
+
* Project a `DesignDNA` onto a deterministic, fixed-length structural feature
|
|
182
|
+
* vector. Order-stable and identical across calls; every component is bounded so
|
|
183
|
+
* the vector is safe to feed straight into `cosineSimilarity`. Missing signals
|
|
184
|
+
* collapse to a neutral 0 rather than being dropped, keeping the length fixed.
|
|
185
|
+
*/
|
|
186
|
+
export function structuralFeatures(dna) {
|
|
187
|
+
const populatedRoles = COLOR_ROLE_ORDER.filter((r) => dna.color.roles[r].length > 0).length;
|
|
188
|
+
const maxRadius = dna.radii.steps.length ? Math.max(...dna.radii.steps) : 0;
|
|
189
|
+
const c = dna.components;
|
|
190
|
+
return [
|
|
191
|
+
clamp01(dna.type.steps.length / TYPE_STEP_SCALE),
|
|
192
|
+
dna.type.ratio !== undefined ? clamp01((dna.type.ratio - 1) / 0.6) : 0,
|
|
193
|
+
clamp01(dna.type.families.length / TYPE_FAMILY_SCALE),
|
|
194
|
+
clamp01(populatedRoles / COLOR_ROLE_COUNT),
|
|
195
|
+
dna.color.contrastFloor !== undefined ? clamp01(dna.color.contrastFloor / MAX_CONTRAST_RATIO) : 0,
|
|
196
|
+
dna.spacing.baseUnit !== undefined ? clamp01(dna.spacing.baseUnit / MAX_GRID_UNIT) : 0,
|
|
197
|
+
clamp01(dna.spacing.steps.length / SPACING_STEP_SCALE),
|
|
198
|
+
DENSITY_SCORE[dna.spacing.density],
|
|
199
|
+
clamp01(maxRadius / RADIUS_ROUNDNESS_SCALE),
|
|
200
|
+
clamp01(dna.radii.steps.length / RADIUS_STEP_SCALE),
|
|
201
|
+
clamp01(dna.motion.durationsMs.length / MOTION_DURATION_SCALE),
|
|
202
|
+
dna.motion.libraries.length > 0 ? 1 : 0,
|
|
203
|
+
clamp01(c.buttons / COMPONENT_SCALE),
|
|
204
|
+
clamp01(c.inputs / COMPONENT_SCALE),
|
|
205
|
+
clamp01(c.cards / COMPONENT_SCALE),
|
|
206
|
+
clamp01(c.nav / NAV_SCALE),
|
|
207
|
+
].map(round2);
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=descriptor.js.map
|