@tangle-network/browser-agent-driver 0.33.3 → 0.35.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/browser-launch.d.ts +6 -0
- package/dist/browser-launch.d.ts.map +1 -1
- package/dist/browser-launch.js +3 -0
- package/dist/browser-launch.js.map +1 -1
- 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 +740 -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 +12 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +20 -2
- 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 +273 -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 +100 -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 +220 -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 +172 -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 +123 -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 +27 -1
- 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 +23 -5
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brain-backed vision-model adapter — the IO half of the vision judge stack.
|
|
3
|
+
*
|
|
4
|
+
* The vision ensemble depends only on the narrow `VisionJudgeModel` seam
|
|
5
|
+
* (contracts): a model bound to ONE `{ provider, model }` ref that takes a system
|
|
6
|
+
* prompt + a user prompt + the compared subjects' screenshots and returns raw
|
|
7
|
+
* text. This module is the concrete, Brain-backed implementation of that seam.
|
|
8
|
+
* It is the ONLY impure part of the vision judge (disk read + a live model call);
|
|
9
|
+
* the aggregation in `vision-judge.ts` stays pure and unit-tests with stubs.
|
|
10
|
+
*
|
|
11
|
+
* Two responsibilities, both thin:
|
|
12
|
+
* - `createBrainVisionModel`: wrap one Brain as a `VisionJudgeModel` — resolve
|
|
13
|
+
* each `VisionImageRef` to encoded bytes (disk read for `screenshotPath`,
|
|
14
|
+
* mediaType from the file extension; passthrough for in-memory base64) and
|
|
15
|
+
* route them through `brain.completeVision`. The `id` is the ref rendered as
|
|
16
|
+
* `provider:model`, so an ensemble keys/aggregates per model.
|
|
17
|
+
* - `buildVisionModels`: construct the ensemble from a `ModelRef[]` — ONE Brain
|
|
18
|
+
* per ref, each with its OWN provider key. A single Brain CANNOT serve a mixed
|
|
19
|
+
* ensemble: `Brain.getModel` resolves the key via
|
|
20
|
+
* `resolveProviderApiKey(provider, this.explicitApiKey)`, so an explicit key
|
|
21
|
+
* set for one provider would leak to the others. Per-ref Brains give each ref
|
|
22
|
+
* the correct provider key (resolved from the environment).
|
|
23
|
+
*/
|
|
24
|
+
import type { ModelRef, VisionJudgeModel } from '../contracts.js';
|
|
25
|
+
/** The encoded image shape `Brain.completeVision` accepts (base64/data + type). */
|
|
26
|
+
interface EncodedImage {
|
|
27
|
+
image: string;
|
|
28
|
+
mediaType: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The narrow Brain capability this adapter needs — exactly `Brain.completeVision`.
|
|
32
|
+
* Declared locally so the wrapper does not depend on the full `Brain` type and a
|
|
33
|
+
* test could inject a fake round-trip; `buildVisionModels` supplies the real one.
|
|
34
|
+
*/
|
|
35
|
+
export interface VisionCompletionModel {
|
|
36
|
+
completeVision(system: string, user: string, images: ReadonlyArray<EncodedImage>, options?: {
|
|
37
|
+
maxOutputTokens?: number;
|
|
38
|
+
}): Promise<{
|
|
39
|
+
text: string;
|
|
40
|
+
tokensUsed?: number;
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
/** Render a `ModelRef` as the stable `provider:model` id the ensemble keys on. */
|
|
44
|
+
export declare function refToId(ref: ModelRef): string;
|
|
45
|
+
/**
|
|
46
|
+
* Wrap one Brain (already bound to a `{ provider, model }`) as a
|
|
47
|
+
* `VisionJudgeModel`. The disk read + mediaType inference happen here so the
|
|
48
|
+
* pure ensemble never touches the filesystem; a failed read or model call
|
|
49
|
+
* propagates as a rejection, which the ensemble treats as a DROPPED model.
|
|
50
|
+
*/
|
|
51
|
+
export declare function createBrainVisionModel(brain: VisionCompletionModel, ref: ModelRef): VisionJudgeModel;
|
|
52
|
+
/**
|
|
53
|
+
* Construct the vision ensemble: ONE Brain per `ModelRef`, each resolving its own
|
|
54
|
+
* provider/model/api-key through `provider-defaults` (so a mixed
|
|
55
|
+
* openai+anthropic+google ensemble each gets the right env key). `vision: true`
|
|
56
|
+
* is set for clarity; `completeVision` builds its own multimodal message and does
|
|
57
|
+
* not depend on the Brain's vision strategy.
|
|
58
|
+
*
|
|
59
|
+
* Future lever: explicit per-vision-model `--api-key`/`--base-url` (today each ref
|
|
60
|
+
* resolves its key from the environment by provider; the audit's own brain still
|
|
61
|
+
* honours an explicit `--api-key`).
|
|
62
|
+
*/
|
|
63
|
+
export declare function buildVisionModels(refs: ModelRef[]): VisionJudgeModel[];
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=vision-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vision-model.d.ts","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/vision-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAYH,OAAO,KAAK,EAAE,QAAQ,EAAkB,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEjF,mFAAmF;AACnF,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,cAAc,CACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,EACnC,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,GACrC,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAClD;AAED,kFAAkF;AAClF,wBAAgB,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,CAE7C;AA+BD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,EAAE,GAAG,EAAE,QAAQ,GAAG,gBAAgB,CAQpG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,gBAAgB,EAAE,CAmBtE"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brain-backed vision-model adapter — the IO half of the vision judge stack.
|
|
3
|
+
*
|
|
4
|
+
* The vision ensemble depends only on the narrow `VisionJudgeModel` seam
|
|
5
|
+
* (contracts): a model bound to ONE `{ provider, model }` ref that takes a system
|
|
6
|
+
* prompt + a user prompt + the compared subjects' screenshots and returns raw
|
|
7
|
+
* text. This module is the concrete, Brain-backed implementation of that seam.
|
|
8
|
+
* It is the ONLY impure part of the vision judge (disk read + a live model call);
|
|
9
|
+
* the aggregation in `vision-judge.ts` stays pure and unit-tests with stubs.
|
|
10
|
+
*
|
|
11
|
+
* Two responsibilities, both thin:
|
|
12
|
+
* - `createBrainVisionModel`: wrap one Brain as a `VisionJudgeModel` — resolve
|
|
13
|
+
* each `VisionImageRef` to encoded bytes (disk read for `screenshotPath`,
|
|
14
|
+
* mediaType from the file extension; passthrough for in-memory base64) and
|
|
15
|
+
* route them through `brain.completeVision`. The `id` is the ref rendered as
|
|
16
|
+
* `provider:model`, so an ensemble keys/aggregates per model.
|
|
17
|
+
* - `buildVisionModels`: construct the ensemble from a `ModelRef[]` — ONE Brain
|
|
18
|
+
* per ref, each with its OWN provider key. A single Brain CANNOT serve a mixed
|
|
19
|
+
* ensemble: `Brain.getModel` resolves the key via
|
|
20
|
+
* `resolveProviderApiKey(provider, this.explicitApiKey)`, so an explicit key
|
|
21
|
+
* set for one provider would leak to the others. Per-ref Brains give each ref
|
|
22
|
+
* the correct provider key (resolved from the environment).
|
|
23
|
+
*/
|
|
24
|
+
import { readFile } from 'node:fs/promises';
|
|
25
|
+
import path from 'node:path';
|
|
26
|
+
import { Brain } from '../../../../brain/index.js';
|
|
27
|
+
import { clampPngLongestEdge } from './image-clamp.js';
|
|
28
|
+
import { resolveDefaultProvider, resolveProviderApiKey, resolveProviderModelName, } from '../../../../provider-defaults.js';
|
|
29
|
+
/** Render a `ModelRef` as the stable `provider:model` id the ensemble keys on. */
|
|
30
|
+
export function refToId(ref) {
|
|
31
|
+
return `${ref.provider ?? resolveDefaultProvider()}:${ref.model}`;
|
|
32
|
+
}
|
|
33
|
+
/** Infer an image mediaType from a screenshot file extension (PNG default). */
|
|
34
|
+
function mediaTypeForPath(p) {
|
|
35
|
+
const ext = path.extname(p).toLowerCase();
|
|
36
|
+
if (ext === '.jpg' || ext === '.jpeg')
|
|
37
|
+
return 'image/jpeg';
|
|
38
|
+
if (ext === '.webp')
|
|
39
|
+
return 'image/webp';
|
|
40
|
+
if (ext === '.gif')
|
|
41
|
+
return 'image/gif';
|
|
42
|
+
return 'image/png';
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Resolve a `VisionImageRef` to encoded bytes (disk read for on-disk paths).
|
|
46
|
+
* Full-page PNG captures are clamped to the vision API's longest-edge limit first
|
|
47
|
+
* (see {@link clampPngLongestEdge}) — without it, a tall exemplar screenshot trips
|
|
48
|
+
* Anthropic's 8000px hard limit and the whole comparison fails. The clamp is a
|
|
49
|
+
* no-op for in-bounds images and for non-PNG bytes, so it never alters a small
|
|
50
|
+
* screenshot.
|
|
51
|
+
*/
|
|
52
|
+
async function resolveImage(ref) {
|
|
53
|
+
if ('base64' in ref) {
|
|
54
|
+
if (ref.mediaType !== 'image/png')
|
|
55
|
+
return { image: ref.base64, mediaType: ref.mediaType };
|
|
56
|
+
const clamped = clampPngLongestEdge(Buffer.from(ref.base64, 'base64'));
|
|
57
|
+
return { image: clamped.toString('base64'), mediaType: ref.mediaType };
|
|
58
|
+
}
|
|
59
|
+
const mediaType = mediaTypeForPath(ref.screenshotPath);
|
|
60
|
+
const buf = await readFile(ref.screenshotPath);
|
|
61
|
+
const bytes = mediaType === 'image/png' ? clampPngLongestEdge(buf) : buf;
|
|
62
|
+
return { image: bytes.toString('base64'), mediaType };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Wrap one Brain (already bound to a `{ provider, model }`) as a
|
|
66
|
+
* `VisionJudgeModel`. The disk read + mediaType inference happen here so the
|
|
67
|
+
* pure ensemble never touches the filesystem; a failed read or model call
|
|
68
|
+
* propagates as a rejection, which the ensemble treats as a DROPPED model.
|
|
69
|
+
*/
|
|
70
|
+
export function createBrainVisionModel(brain, ref) {
|
|
71
|
+
return {
|
|
72
|
+
id: refToId(ref),
|
|
73
|
+
async completeVision(system, user, images, options) {
|
|
74
|
+
const encoded = await Promise.all(images.map(resolveImage));
|
|
75
|
+
return brain.completeVision(system, user, encoded, options);
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Construct the vision ensemble: ONE Brain per `ModelRef`, each resolving its own
|
|
81
|
+
* provider/model/api-key through `provider-defaults` (so a mixed
|
|
82
|
+
* openai+anthropic+google ensemble each gets the right env key). `vision: true`
|
|
83
|
+
* is set for clarity; `completeVision` builds its own multimodal message and does
|
|
84
|
+
* not depend on the Brain's vision strategy.
|
|
85
|
+
*
|
|
86
|
+
* Future lever: explicit per-vision-model `--api-key`/`--base-url` (today each ref
|
|
87
|
+
* resolves its key from the environment by provider; the audit's own brain still
|
|
88
|
+
* honours an explicit `--api-key`).
|
|
89
|
+
*/
|
|
90
|
+
export function buildVisionModels(refs) {
|
|
91
|
+
return refs.map((ref) => {
|
|
92
|
+
const provider = ref.provider ?? resolveDefaultProvider();
|
|
93
|
+
const model = resolveProviderModelName(provider, ref.model);
|
|
94
|
+
const brain = new Brain({
|
|
95
|
+
provider,
|
|
96
|
+
model,
|
|
97
|
+
apiKey: resolveProviderApiKey(provider),
|
|
98
|
+
vision: true,
|
|
99
|
+
// The Claude Code SDK drops image parts unless streaming input is on; these
|
|
100
|
+
// Brains exist only to send screenshots, so force it. No-op for every other
|
|
101
|
+
// provider, so a mixed ensemble is unaffected.
|
|
102
|
+
claudeCodeStreamingInput: true,
|
|
103
|
+
// Opt-in per-call provider logging for diagnosing dropped vision verdicts.
|
|
104
|
+
debug: process.env.BAD_VISION_JUDGE_DEBUG === '1',
|
|
105
|
+
llmTimeoutMs: 120_000,
|
|
106
|
+
});
|
|
107
|
+
return createBrainVisionModel(brain, { provider, model });
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=vision-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vision-model.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/vision-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L4 entrypoint — the flagged STAGE-6 replacement. ORCH: it runs the ONE shared
|
|
3
|
+
* core and maps its result onto the EXISTING `PageAuditResult` contract so the
|
|
4
|
+
* reference-grounded path drops into the v1 pipeline and stages 7-9 run unchanged.
|
|
5
|
+
*
|
|
6
|
+
* It is the sibling of `run.ts`: the SAME `engine/core.runRedesignCore`, a
|
|
7
|
+
* different return-shaping. Where `run.ts` surfaces the rich `RedesignArtifact`,
|
|
8
|
+
* this maps `RedesignRunResult` → `PageAuditResult` via the pure
|
|
9
|
+
* `artifact/to-findings.toReferencePageAuditResult` — never a second scoring pass.
|
|
10
|
+
*
|
|
11
|
+
* Acquire-once is honoured by the CALLER: the pipeline loads the corpus and
|
|
12
|
+
* resolves the reference ONCE above the page/rep loops and threads them in
|
|
13
|
+
* (`input.corpus`, `input.reference`), so this entry never reads the corpus from
|
|
14
|
+
* disk and the core never calls `store.load()`.
|
|
15
|
+
*/
|
|
16
|
+
import type { PageClassification, MeasurementBundle, ReferenceContext, ReferenceGroundedConfig, PageAuditResult, Exemplar, ReferenceEngineDeps, Dimension, DimensionScore, RedesignArtifact } from '../contracts.js';
|
|
17
|
+
import { type ReferenceBrain } from '../engine/wiring.js';
|
|
18
|
+
/**
|
|
19
|
+
* Per-page input for {@link evaluateReferenceGrounded}. `corpus` and `config` are
|
|
20
|
+
* the once-acquired values threaded down from the pipeline; `reference` is the
|
|
21
|
+
* once-resolved operator reference (when one was supplied).
|
|
22
|
+
*/
|
|
23
|
+
export interface EvaluateReferenceInput {
|
|
24
|
+
url: string;
|
|
25
|
+
classification: PageClassification;
|
|
26
|
+
measurements: MeasurementBundle;
|
|
27
|
+
/** Page screenshot, carried onto the result and reserved for a future vision judge. */
|
|
28
|
+
screenshotPath?: string;
|
|
29
|
+
/** Operator reference resolved once upstream; folded into `config.reference`. */
|
|
30
|
+
reference?: ReferenceContext;
|
|
31
|
+
/** The exemplar corpus, loaded ONCE per run by the pipeline and reused across pages/reps. */
|
|
32
|
+
corpus: Exemplar[];
|
|
33
|
+
/** The resolved engine config (the pipeline supplies a fully-resolved bundle). */
|
|
34
|
+
config: ReferenceGroundedConfig;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The result of one reference-grounded page evaluation.
|
|
38
|
+
*
|
|
39
|
+
* `result` is the `PageAuditResult` stages 7-9 consume; its `score` is the single
|
|
40
|
+
* headline authority. `dimensionScores` is the engine's per-`Dimension` surface,
|
|
41
|
+
* surfaced HERE so the pipeline can hand it to stage-8's `buildAuditResult` as
|
|
42
|
+
* `precomputedScores` — skipping the redundant `brain.auditDesign` scoring pass so
|
|
43
|
+
* there is exactly ONE scoring authority and no second multidim LLM call.
|
|
44
|
+
*/
|
|
45
|
+
export interface ReferenceEvaluation {
|
|
46
|
+
result: PageAuditResult;
|
|
47
|
+
dimensionScores: Record<Dimension, DimensionScore>;
|
|
48
|
+
/**
|
|
49
|
+
* The rich engine output (all ranked directions with ASCII layout, type/colour/
|
|
50
|
+
* motion systems, hierarchy, copy). Carried here so the CLI can surface the full
|
|
51
|
+
* redesign brief instead of the lossy `DesignFinding` projection. The lossy
|
|
52
|
+
* `PageAuditResult.findings` projection alone cannot represent it.
|
|
53
|
+
*/
|
|
54
|
+
artifact: RedesignArtifact;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Evaluate one page in reference-grounded mode. Returns a `ReferenceEvaluation`:
|
|
58
|
+
* the `PageAuditResult` (whose `score`, `summary`, `strengths`, `findings`, and
|
|
59
|
+
* `designSystemScore` come from the single quality authority via
|
|
60
|
+
* `toReferencePageAuditResult`) plus the engine's `dimensionScores` for the
|
|
61
|
+
* stage-8 `precomputedScores` hook.
|
|
62
|
+
*
|
|
63
|
+
* `deps` defaults to the production composition root (`buildDefaultDeps`); it is
|
|
64
|
+
* injectable only so the wiring unit-tests with deterministic fakes (no browser,
|
|
65
|
+
* no live LLM). The pipeline never passes it.
|
|
66
|
+
*/
|
|
67
|
+
export declare function evaluateReferenceGrounded(brain: ReferenceBrain, input: EvaluateReferenceInput, deps?: ReferenceEngineDeps): Promise<ReferenceEvaluation>;
|
|
68
|
+
//# sourceMappingURL=evaluate-reference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate-reference.d.ts","sourceRoot":"","sources":["../../../../../src/design/audit/reference/pipeline/evaluate-reference.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EACf,QAAQ,EACR,mBAAmB,EACnB,SAAS,EACT,cAAc,EACd,gBAAgB,EACjB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAI3E;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,kBAAkB,CAAA;IAClC,YAAY,EAAE,iBAAiB,CAAA;IAC/B,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iFAAiF;IACjF,SAAS,CAAC,EAAE,gBAAgB,CAAA;IAC5B,6FAA6F;IAC7F,MAAM,EAAE,QAAQ,EAAE,CAAA;IAClB,kFAAkF;IAClF,MAAM,EAAE,uBAAuB,CAAA;CAChC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,eAAe,CAAA;IACvB,eAAe,EAAE,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;IAClD;;;;;OAKG;IACH,QAAQ,EAAE,gBAAgB,CAAA;CAC3B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,sBAAsB,EAC7B,IAAI,CAAC,EAAE,mBAAmB,GACzB,OAAO,CAAC,mBAAmB,CAAC,CAuB9B"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L4 entrypoint — the flagged STAGE-6 replacement. ORCH: it runs the ONE shared
|
|
3
|
+
* core and maps its result onto the EXISTING `PageAuditResult` contract so the
|
|
4
|
+
* reference-grounded path drops into the v1 pipeline and stages 7-9 run unchanged.
|
|
5
|
+
*
|
|
6
|
+
* It is the sibling of `run.ts`: the SAME `engine/core.runRedesignCore`, a
|
|
7
|
+
* different return-shaping. Where `run.ts` surfaces the rich `RedesignArtifact`,
|
|
8
|
+
* this maps `RedesignRunResult` → `PageAuditResult` via the pure
|
|
9
|
+
* `artifact/to-findings.toReferencePageAuditResult` — never a second scoring pass.
|
|
10
|
+
*
|
|
11
|
+
* Acquire-once is honoured by the CALLER: the pipeline loads the corpus and
|
|
12
|
+
* resolves the reference ONCE above the page/rep loops and threads them in
|
|
13
|
+
* (`input.corpus`, `input.reference`), so this entry never reads the corpus from
|
|
14
|
+
* disk and the core never calls `store.load()`.
|
|
15
|
+
*/
|
|
16
|
+
import { runRedesignCore } from '../engine/core.js';
|
|
17
|
+
import { buildDefaultDeps } from '../engine/wiring.js';
|
|
18
|
+
import { toReferencePageAuditResult } from '../artifact/to-findings.js';
|
|
19
|
+
import { writeArtifact } from '../artifact/render.js';
|
|
20
|
+
/**
|
|
21
|
+
* Evaluate one page in reference-grounded mode. Returns a `ReferenceEvaluation`:
|
|
22
|
+
* the `PageAuditResult` (whose `score`, `summary`, `strengths`, `findings`, and
|
|
23
|
+
* `designSystemScore` come from the single quality authority via
|
|
24
|
+
* `toReferencePageAuditResult`) plus the engine's `dimensionScores` for the
|
|
25
|
+
* stage-8 `precomputedScores` hook.
|
|
26
|
+
*
|
|
27
|
+
* `deps` defaults to the production composition root (`buildDefaultDeps`); it is
|
|
28
|
+
* injectable only so the wiring unit-tests with deterministic fakes (no browser,
|
|
29
|
+
* no live LLM). The pipeline never passes it.
|
|
30
|
+
*/
|
|
31
|
+
export async function evaluateReferenceGrounded(brain, input, deps) {
|
|
32
|
+
// The core grounds against `config.reference`, never a separate field, so fold
|
|
33
|
+
// the once-resolved reference into the config the core reads.
|
|
34
|
+
const config = input.reference
|
|
35
|
+
? { ...input.config, reference: input.reference }
|
|
36
|
+
: input.config;
|
|
37
|
+
const resolvedDeps = deps ?? buildDefaultDeps(brain, config);
|
|
38
|
+
const result = await runRedesignCore(resolvedDeps, {
|
|
39
|
+
url: input.url,
|
|
40
|
+
classification: input.classification,
|
|
41
|
+
measurements: input.measurements,
|
|
42
|
+
...(input.screenshotPath ? { screenshotPath: input.screenshotPath } : {}),
|
|
43
|
+
corpus: input.corpus,
|
|
44
|
+
config,
|
|
45
|
+
});
|
|
46
|
+
if (config.artifactDir)
|
|
47
|
+
await writeArtifact(result.artifact, config.artifactDir);
|
|
48
|
+
const audit = toReferencePageAuditResult(result);
|
|
49
|
+
const withShot = input.screenshotPath ? { ...audit, screenshotPath: input.screenshotPath } : audit;
|
|
50
|
+
return { result: withShot, dimensionScores: result.dimensionScores, artifact: result.artifact };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=evaluate-reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate-reference.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/pipeline/evaluate-reference.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAcH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAuB,MAAM,qBAAqB,CAAA;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAA;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AA0CrD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,KAAqB,EACrB,KAA6B,EAC7B,IAA0B;IAE1B,+EAA+E;IAC/E,8DAA8D;IAC9D,MAAM,MAAM,GAA4B,KAAK,CAAC,SAAS;QACrD,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE;QACjD,CAAC,CAAC,KAAK,CAAC,MAAM,CAAA;IAEhB,MAAM,YAAY,GAAG,IAAI,IAAI,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAE5D,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,EAAE;QACjD,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM;KACP,CAAC,CAAA;IAEF,IAAI,MAAM,CAAC,WAAW;QAAE,MAAM,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;IAEhF,MAAM,KAAK,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAA;IAChD,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;IAClG,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAA;AACjG,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reference resolution adapter — turn the operator's `--reference <url|path>`
|
|
3
|
+
* into a resolved `ReferenceContext` ONCE, fail-closed.
|
|
4
|
+
*
|
|
5
|
+
* It owns the SINGLE IO seam (a live URL or a ripped local copy → `DesignDNA`)
|
|
6
|
+
* by delegating to an injected `DesignDnaExtractor`; it adds zero extraction
|
|
7
|
+
* logic of its own and the DNA→summary fold reuses the pure `summarizeDNA`, so
|
|
8
|
+
* it unit-tests against a deterministic fake extractor with no live browser or
|
|
9
|
+
* network. Per ARCHITECTURE §9 D3 it lives in its own small module — not the fat
|
|
10
|
+
* orchestrator — so both the CLI plumbing and tests reach it directly.
|
|
11
|
+
*
|
|
12
|
+
* Fail-closed: an unresolvable reference throws an explicit error rather than
|
|
13
|
+
* degrading to a fabricated "neutral" reference that would silently mis-ground.
|
|
14
|
+
*/
|
|
15
|
+
import type { DesignDnaExtractor, ReferenceContext } from './contracts.js';
|
|
16
|
+
/** The single dependency the resolver injects — the page→DNA extractor seam. */
|
|
17
|
+
export interface ResolveReferenceDeps {
|
|
18
|
+
extractor: DesignDnaExtractor;
|
|
19
|
+
}
|
|
20
|
+
/** Browser/IO knobs forwarded to the extractor for the reference capture. */
|
|
21
|
+
export interface ResolveReferenceOptions {
|
|
22
|
+
headless?: boolean;
|
|
23
|
+
outputDir?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Resolve `--reference` into a `ReferenceContext` exactly once. Returns
|
|
27
|
+
* `undefined` when no reference was supplied (the engine then grounds against
|
|
28
|
+
* the corpus alone); throws when a supplied reference cannot be captured.
|
|
29
|
+
*/
|
|
30
|
+
export declare function resolveReferenceContext(ref: string | undefined, deps: ResolveReferenceDeps, opts?: ResolveReferenceOptions): Promise<ReferenceContext | undefined>;
|
|
31
|
+
//# sourceMappingURL=reference-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-context.d.ts","sourceRoot":"","sources":["../../../../src/design/audit/reference/reference-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAiB,MAAM,gBAAgB,CAAA;AAGzF,gFAAgF;AAChF,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,kBAAkB,CAAA;CAC9B;AAED,6EAA6E;AAC7E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AA6BD;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,IAAI,EAAE,oBAAoB,EAC1B,IAAI,GAAE,uBAA4B,GACjC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAoBvC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reference resolution adapter — turn the operator's `--reference <url|path>`
|
|
3
|
+
* into a resolved `ReferenceContext` ONCE, fail-closed.
|
|
4
|
+
*
|
|
5
|
+
* It owns the SINGLE IO seam (a live URL or a ripped local copy → `DesignDNA`)
|
|
6
|
+
* by delegating to an injected `DesignDnaExtractor`; it adds zero extraction
|
|
7
|
+
* logic of its own and the DNA→summary fold reuses the pure `summarizeDNA`, so
|
|
8
|
+
* it unit-tests against a deterministic fake extractor with no live browser or
|
|
9
|
+
* network. Per ARCHITECTURE §9 D3 it lives in its own small module — not the fat
|
|
10
|
+
* orchestrator — so both the CLI plumbing and tests reach it directly.
|
|
11
|
+
*
|
|
12
|
+
* Fail-closed: an unresolvable reference throws an explicit error rather than
|
|
13
|
+
* degrading to a fabricated "neutral" reference that would silently mis-ground.
|
|
14
|
+
*/
|
|
15
|
+
import path from 'node:path';
|
|
16
|
+
import { pathToFileURL } from 'node:url';
|
|
17
|
+
import { summarizeDNA } from './dna/derive.js';
|
|
18
|
+
const HTTP_RE = /^https?:\/\//i;
|
|
19
|
+
/**
|
|
20
|
+
* Classify a `--reference` argument into a `ReferenceKind` and the URL the
|
|
21
|
+
* extractor consumes. A live `http(s)` ref is a `url`; any other value is a
|
|
22
|
+
* `rip` (a previously ripped local copy) addressed as a `file://` URL so the
|
|
23
|
+
* same extractor handles both. A relative path is resolved against the cwd.
|
|
24
|
+
*/
|
|
25
|
+
function classifyReference(ref) {
|
|
26
|
+
if (HTTP_RE.test(ref))
|
|
27
|
+
return { kind: 'url', url: ref };
|
|
28
|
+
if (ref.startsWith('file://'))
|
|
29
|
+
return { kind: 'rip', url: ref };
|
|
30
|
+
const abs = path.isAbsolute(ref) ? ref : path.resolve(ref);
|
|
31
|
+
return { kind: 'rip', url: pathToFileURL(abs).href };
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Prefer the desktop capture; otherwise any captured viewport, else none.
|
|
35
|
+
* Returned ABSOLUTE so a downstream consumer (e.g. the vision judge reading the
|
|
36
|
+
* screenshot off disk) resolves it independent of the process cwd — the
|
|
37
|
+
* extractor yields a path relative to its outputDir.
|
|
38
|
+
*/
|
|
39
|
+
function firstScreenshot(paths) {
|
|
40
|
+
const p = paths['desktop'] ?? Object.values(paths)[0];
|
|
41
|
+
if (!p)
|
|
42
|
+
return undefined;
|
|
43
|
+
return path.isAbsolute(p) ? p : path.resolve(p);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Resolve `--reference` into a `ReferenceContext` exactly once. Returns
|
|
47
|
+
* `undefined` when no reference was supplied (the engine then grounds against
|
|
48
|
+
* the corpus alone); throws when a supplied reference cannot be captured.
|
|
49
|
+
*/
|
|
50
|
+
export async function resolveReferenceContext(ref, deps, opts = {}) {
|
|
51
|
+
if (!ref)
|
|
52
|
+
return undefined;
|
|
53
|
+
const { kind, url } = classifyReference(ref);
|
|
54
|
+
let capture;
|
|
55
|
+
try {
|
|
56
|
+
capture = await deps.extractor.extract({
|
|
57
|
+
url,
|
|
58
|
+
...(opts.headless !== undefined ? { headless: opts.headless } : {}),
|
|
59
|
+
...(opts.outputDir ? { outputDir: opts.outputDir } : {}),
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
throw new Error(`--reference could not be resolved (${ref}): ${err.message}`);
|
|
64
|
+
}
|
|
65
|
+
const screenshotPath = firstScreenshot(capture.screenshotPaths);
|
|
66
|
+
return {
|
|
67
|
+
kind,
|
|
68
|
+
dna: capture.dna,
|
|
69
|
+
summary: summarizeDNA(capture.dna),
|
|
70
|
+
...(screenshotPath ? { screenshotPath } : {}),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=reference-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-context.js","sourceRoot":"","sources":["../../../../src/design/audit/reference/reference-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAa9C,MAAM,OAAO,GAAG,eAAe,CAAA;AAE/B;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,GAAW;IACpC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IACvD,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC1D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;AACtD,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,KAA6B;IACpD,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACrD,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IACxB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,GAAuB,EACvB,IAA0B,EAC1B,OAAgC,EAAE;IAElC,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;IAC5C,IAAI,OAAO,CAAA;IACX,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YACrC,GAAG;YACH,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,MAAO,GAAa,CAAC,OAAO,EAAE,CAAC,CAAA;IAC1F,CAAC;IACD,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;IAC/D,OAAO;QACL,IAAI;QACJ,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;QAClC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic hash embedder + cosine similarity — the LITERALLY PURE half of
|
|
3
|
+
* the embedding boundary (the offline/test default).
|
|
4
|
+
*
|
|
5
|
+
* `HashEmbeddingProvider` implements `EmbeddingProvider` with a feature-hashing
|
|
6
|
+
* trick: every word unigram and adjacent bigram of the input is hashed to a
|
|
7
|
+
* signed bucket in a fixed-dimension vector, which is then L2-normalised. No
|
|
8
|
+
* network, no dynamic import, no env — so retrieval works with zero provider and
|
|
9
|
+
* unit tests never touch the wire. Identical text always yields an identical,
|
|
10
|
+
* unit-length vector.
|
|
11
|
+
*
|
|
12
|
+
* `cosineSimilarity` is the only symbol `retrieval/matcher` imports from here,
|
|
13
|
+
* keeping the matcher inside the pure subgraph. The network-backed provider lives
|
|
14
|
+
* in the sibling `embedding-openai.ts` adapter so this module stays pure.
|
|
15
|
+
*/
|
|
16
|
+
import type { EmbeddingProvider } from '../contracts.js';
|
|
17
|
+
/** Fixed embedding width. A corpus embedded with the hash provider is keyed to this. */
|
|
18
|
+
export declare const HASH_EMBEDDING_DIMS = 256;
|
|
19
|
+
/**
|
|
20
|
+
* The offline/test default embedder. Deterministic, normalised, zero-IO.
|
|
21
|
+
*/
|
|
22
|
+
export declare const HashEmbeddingProvider: EmbeddingProvider;
|
|
23
|
+
/**
|
|
24
|
+
* Cosine similarity of two numeric vectors, in [-1, 1]. Symmetric. Returns 0 when
|
|
25
|
+
* either vector is all-zero or empty (a fail-closed "no signal", never NaN). When
|
|
26
|
+
* lengths differ it compares the common leading dimensions — the caller is
|
|
27
|
+
* responsible for keeping query/exemplar vectors in the same embedding space.
|
|
28
|
+
*/
|
|
29
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
30
|
+
//# sourceMappingURL=embedding-hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-hash.d.ts","sourceRoot":"","sources":["../../../../../src/design/audit/reference/retrieval/embedding-hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEzE,wFAAwF;AACxF,eAAO,MAAM,mBAAmB,MAAM,CAAA;AAwCtC;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,iBAKnC,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAajE"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic hash embedder + cosine similarity — the LITERALLY PURE half of
|
|
3
|
+
* the embedding boundary (the offline/test default).
|
|
4
|
+
*
|
|
5
|
+
* `HashEmbeddingProvider` implements `EmbeddingProvider` with a feature-hashing
|
|
6
|
+
* trick: every word unigram and adjacent bigram of the input is hashed to a
|
|
7
|
+
* signed bucket in a fixed-dimension vector, which is then L2-normalised. No
|
|
8
|
+
* network, no dynamic import, no env — so retrieval works with zero provider and
|
|
9
|
+
* unit tests never touch the wire. Identical text always yields an identical,
|
|
10
|
+
* unit-length vector.
|
|
11
|
+
*
|
|
12
|
+
* `cosineSimilarity` is the only symbol `retrieval/matcher` imports from here,
|
|
13
|
+
* keeping the matcher inside the pure subgraph. The network-backed provider lives
|
|
14
|
+
* in the sibling `embedding-openai.ts` adapter so this module stays pure.
|
|
15
|
+
*/
|
|
16
|
+
/** Fixed embedding width. A corpus embedded with the hash provider is keyed to this. */
|
|
17
|
+
export const HASH_EMBEDDING_DIMS = 256;
|
|
18
|
+
const FNV_OFFSET = 0x811c9dc5;
|
|
19
|
+
const FNV_PRIME = 0x01000193;
|
|
20
|
+
/** 32-bit FNV-1a — a stable, dependency-free string hash. */
|
|
21
|
+
function fnv1a(str) {
|
|
22
|
+
let h = FNV_OFFSET;
|
|
23
|
+
for (let i = 0; i < str.length; i++) {
|
|
24
|
+
h ^= str.charCodeAt(i);
|
|
25
|
+
h = Math.imul(h, FNV_PRIME);
|
|
26
|
+
}
|
|
27
|
+
return h >>> 0;
|
|
28
|
+
}
|
|
29
|
+
/** Lowercase word unigrams + adjacent bigrams; deterministic and order-stable. */
|
|
30
|
+
function tokenize(text) {
|
|
31
|
+
const words = text.toLowerCase().match(/[a-z0-9#]+/g) ?? [];
|
|
32
|
+
const tokens = [...words];
|
|
33
|
+
for (let i = 1; i < words.length; i++)
|
|
34
|
+
tokens.push(`${words[i - 1]}_${words[i]}`);
|
|
35
|
+
return tokens;
|
|
36
|
+
}
|
|
37
|
+
function hashEmbed(text) {
|
|
38
|
+
const vec = new Array(HASH_EMBEDDING_DIMS).fill(0);
|
|
39
|
+
for (const token of tokenize(text)) {
|
|
40
|
+
const h = fnv1a(token);
|
|
41
|
+
const bucket = h % HASH_EMBEDDING_DIMS;
|
|
42
|
+
// A second, independent hash bit picks the sign, decorrelating collisions.
|
|
43
|
+
const sign = (fnv1a(`${token}\0sign`) & 1) === 0 ? 1 : -1;
|
|
44
|
+
vec[bucket] += sign;
|
|
45
|
+
}
|
|
46
|
+
let norm = 0;
|
|
47
|
+
for (const v of vec)
|
|
48
|
+
norm += v * v;
|
|
49
|
+
if (norm === 0)
|
|
50
|
+
return vec;
|
|
51
|
+
const inv = 1 / Math.sqrt(norm);
|
|
52
|
+
for (let i = 0; i < vec.length; i++)
|
|
53
|
+
vec[i] *= inv;
|
|
54
|
+
return vec;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The offline/test default embedder. Deterministic, normalised, zero-IO.
|
|
58
|
+
*/
|
|
59
|
+
export const HashEmbeddingProvider = {
|
|
60
|
+
id: 'hash-v1',
|
|
61
|
+
async embed(texts) {
|
|
62
|
+
return texts.map(hashEmbed);
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Cosine similarity of two numeric vectors, in [-1, 1]. Symmetric. Returns 0 when
|
|
67
|
+
* either vector is all-zero or empty (a fail-closed "no signal", never NaN). When
|
|
68
|
+
* lengths differ it compares the common leading dimensions — the caller is
|
|
69
|
+
* responsible for keeping query/exemplar vectors in the same embedding space.
|
|
70
|
+
*/
|
|
71
|
+
export function cosineSimilarity(a, b) {
|
|
72
|
+
const len = Math.min(a.length, b.length);
|
|
73
|
+
if (len === 0)
|
|
74
|
+
return 0;
|
|
75
|
+
let dot = 0;
|
|
76
|
+
let na = 0;
|
|
77
|
+
let nb = 0;
|
|
78
|
+
for (let i = 0; i < len; i++) {
|
|
79
|
+
dot += a[i] * b[i];
|
|
80
|
+
na += a[i] * a[i];
|
|
81
|
+
nb += b[i] * b[i];
|
|
82
|
+
}
|
|
83
|
+
if (na === 0 || nb === 0)
|
|
84
|
+
return 0;
|
|
85
|
+
return dot / (Math.sqrt(na) * Math.sqrt(nb));
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=embedding-hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-hash.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/retrieval/embedding-hash.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network-backed embedder — the ADAPTER half of the embedding boundary.
|
|
3
|
+
*
|
|
4
|
+
* `OpenAiEmbeddingProvider` implements `EmbeddingProvider` over the OpenAI
|
|
5
|
+
* embeddings endpoint via a `dynamic import('openai')` (the import is confined to
|
|
6
|
+
* this one adapter so the sibling `embedding-hash.ts` stays literally pure and
|
|
7
|
+
* the `openai` dep is never loaded on the offline path). The API key is resolved
|
|
8
|
+
* through the existing `resolveProviderApiKey` provider abstraction — never a
|
|
9
|
+
* hand-rolled fetch and never a duplicated env lookup.
|
|
10
|
+
*
|
|
11
|
+
* `resolveEmbeddingProvider` is the swap point: it returns the OpenAI provider
|
|
12
|
+
* when a key is present and falls back to the deterministic `HashEmbeddingProvider`
|
|
13
|
+
* otherwise, so the engine and its unit tests run with zero provider by default.
|
|
14
|
+
*/
|
|
15
|
+
import type { EmbeddingProvider } from '../contracts.js';
|
|
16
|
+
/** Small, cheap, 1536-dim default. A corpus must be embedded with the same model. */
|
|
17
|
+
export declare const DEFAULT_OPENAI_EMBEDDING_MODEL = "text-embedding-3-small";
|
|
18
|
+
/**
|
|
19
|
+
* The default network-backed provider. Reads `OPENAI_API_KEY` from the
|
|
20
|
+
* environment lazily on each `embed` call via the shared provider abstraction.
|
|
21
|
+
*/
|
|
22
|
+
export declare const OpenAiEmbeddingProvider: EmbeddingProvider;
|
|
23
|
+
/** Options for selecting an embedding provider. */
|
|
24
|
+
export interface ResolveEmbeddingOptions {
|
|
25
|
+
/** Explicit key, bypassing env resolution. */
|
|
26
|
+
apiKey?: string;
|
|
27
|
+
/** Env to resolve the key from (defaults to `process.env`). */
|
|
28
|
+
env?: NodeJS.ProcessEnv;
|
|
29
|
+
/** Override the embedding model (otherwise `DEFAULT_OPENAI_EMBEDDING_MODEL`). */
|
|
30
|
+
model?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Pick a concrete embedder: the OpenAI provider when a key is resolvable, else the
|
|
34
|
+
* deterministic `HashEmbeddingProvider`. Fail-safe by construction — a missing key
|
|
35
|
+
* yields a working offline embedder rather than an error.
|
|
36
|
+
*/
|
|
37
|
+
export declare function resolveEmbeddingProvider(opts?: ResolveEmbeddingOptions): EmbeddingProvider;
|
|
38
|
+
//# sourceMappingURL=embedding-openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-openai.d.ts","sourceRoot":"","sources":["../../../../../src/design/audit/reference/retrieval/embedding-openai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAIzE,qFAAqF;AACrF,eAAO,MAAM,8BAA8B,2BAA2B,CAAA;AAkCtE;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,iBAErC,CAAA;AAED,mDAAmD;AACnD,MAAM,WAAW,uBAAuB;IACtC,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,GAAE,uBAA4B,GAAG,iBAAiB,CAQ9F"}
|