@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,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Absolute quality assessment — the single honest scoring leg.
|
|
3
|
+
*
|
|
4
|
+
* `assessPageQuality` judges the page-under-audit against the retrieved
|
|
5
|
+
* world-class exemplars with the same position-swapped `judgePair` debias, and
|
|
6
|
+
* reports the page's win-rate. This — NOT the relative direction ranking — is
|
|
7
|
+
* what `score-core` turns into the headline 0-10 and the per-`Dimension` scores.
|
|
8
|
+
*
|
|
9
|
+
* Overall leg: one debiased comparison per exemplar → `overallWinRate`.
|
|
10
|
+
* Optional per-dimension leg (`opts.dimensions`): one dimension-scoped
|
|
11
|
+
* comparison SET per `Dimension`, so each `dimensionWinRates` entry is genuinely
|
|
12
|
+
* judge-resolved (the judge narrows its rubric to that dimension), never the
|
|
13
|
+
* overall number stamped across dims. A dimension with no decisive comparison is
|
|
14
|
+
* OMITTED — callers must not fabricate a per-dim score from `overallWinRate`.
|
|
15
|
+
*
|
|
16
|
+
* Pure¹: the `TasteJudge` is injected, so this unit-tests with a stub judge and
|
|
17
|
+
* no live model. Comparisons run sequentially for deterministic accounting;
|
|
18
|
+
* concurrency/budget is the orchestrator's concern, not this leg's.
|
|
19
|
+
*/
|
|
20
|
+
import { judgePair } from './pairwise.js';
|
|
21
|
+
const round4 = (n) => Math.round(n * 10000) / 10000;
|
|
22
|
+
/** Neutral rate when no decisive (non-tie) comparison backed a leg. */
|
|
23
|
+
const ON_PAR = 0.5;
|
|
24
|
+
async function pageWinRate(judge, page, exemplars, dimension) {
|
|
25
|
+
let wins = 0;
|
|
26
|
+
let comparisons = 0;
|
|
27
|
+
for (const exemplar of exemplars) {
|
|
28
|
+
const verdict = await judgePair(judge, { a: page, b: exemplar, dimension });
|
|
29
|
+
if (verdict.winner === 'tie')
|
|
30
|
+
continue;
|
|
31
|
+
comparisons++;
|
|
32
|
+
if (verdict.winner === page.id)
|
|
33
|
+
wins++;
|
|
34
|
+
}
|
|
35
|
+
return { rate: comparisons > 0 ? round4(wins / comparisons) : ON_PAR, comparisons };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Assess the absolute quality of `page` against `exemplars` → a `win-rate`-keyed
|
|
39
|
+
* `QualityAssessment`.
|
|
40
|
+
*/
|
|
41
|
+
export async function assessPageQuality(judge, page, exemplars, opts = {}) {
|
|
42
|
+
const overall = await pageWinRate(judge, page, exemplars);
|
|
43
|
+
let dimensionWinRates;
|
|
44
|
+
const dimensions = opts.dimensions ?? [];
|
|
45
|
+
if (dimensions.length > 0 && exemplars.length > 0) {
|
|
46
|
+
const collected = {};
|
|
47
|
+
for (const dimension of dimensions) {
|
|
48
|
+
const dim = await pageWinRate(judge, page, exemplars, dimension);
|
|
49
|
+
// Omit a dimension with no decisive signal rather than stamp a fake rate.
|
|
50
|
+
if (dim.comparisons > 0)
|
|
51
|
+
collected[dimension] = dim.rate;
|
|
52
|
+
}
|
|
53
|
+
if (Object.keys(collected).length > 0)
|
|
54
|
+
dimensionWinRates = collected;
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
overallWinRate: overall.rate,
|
|
58
|
+
dimensionWinRates,
|
|
59
|
+
comparisons: overall.comparisons,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/quality.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAEzC,MAAM,MAAM,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAA;AAEnE,uEAAuE;AACvE,MAAM,MAAM,GAAG,GAAG,CAAA;AASlB,KAAK,UAAU,WAAW,CACxB,KAAiB,EACjB,IAAkB,EAClB,SAAyB,EACzB,SAAqB;IAErB,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,IAAI,WAAW,GAAG,CAAC,CAAA;IACnB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAA;QAC3E,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK;YAAE,SAAQ;QACtC,WAAW,EAAE,CAAA;QACb,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE;YAAE,IAAI,EAAE,CAAA;IACxC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,CAAA;AACrF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAiB,EACjB,IAAkB,EAClB,SAAyB,EACzB,OAAqC,EAAE;IAEvC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;IAEzD,IAAI,iBAAiE,CAAA;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA;IACxC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,SAAS,GAAuC,EAAE,CAAA;QACxD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;YAChE,0EAA0E;YAC1E,IAAI,GAAG,CAAC,WAAW,GAAG,CAAC;gBAAE,SAAS,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,IAAI,CAAA;QAC1D,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,iBAAiB,GAAG,SAAS,CAAA;IACtE,CAAC;IAED,OAAO;QACL,cAAc,EAAE,OAAO,CAAC,IAAI;QAC5B,iBAAiB;QACjB,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Direction ranking — the PURE Bradley-Terry / Elo rollup. Folds many debiased
|
|
3
|
+
* `TasteVerdict`s into a single `RankResult`. No IO, no model: deterministic for
|
|
4
|
+
* a fixed verdict set, so `rankDirections` IS the `DirectionRanker`
|
|
5
|
+
* implementation (`{ rank: rankDirections }` at the wiring root).
|
|
6
|
+
*
|
|
7
|
+
* Two complementary solvers, both reported:
|
|
8
|
+
* - Bradley-Terry strengths via minorization-maximization (the maximum-
|
|
9
|
+
* likelihood stationary ranking; order-independent, sum-normalised).
|
|
10
|
+
* - Elo via sequential `updateElo` (cheap, online, conserves total rating).
|
|
11
|
+
*
|
|
12
|
+
* The published order is by Bradley-Terry strength, with Elo then id as
|
|
13
|
+
* deterministic tie-breaks. `calibrateAgainstVotes` scores judge-vs-human
|
|
14
|
+
* agreement so the taste judge can be validated against ground-truth votes.
|
|
15
|
+
*/
|
|
16
|
+
import type { CalibrationResult, HumanVote, RankResult, TasteVerdict } from '../contracts.js';
|
|
17
|
+
/**
|
|
18
|
+
* One Elo update for a single game. `outcome` is the score for the FIRST player
|
|
19
|
+
* (1 win, 0.5 tie, 0 loss). Total rating is conserved (the two deltas cancel),
|
|
20
|
+
* and the update is symmetric under swapping players + complementing the outcome.
|
|
21
|
+
*/
|
|
22
|
+
export declare function updateElo(ra: number, rb: number, outcome: number, k?: number): [number, number];
|
|
23
|
+
/**
|
|
24
|
+
* Bradley-Terry strengths per id, sum-normalised. A win counts as one game won;
|
|
25
|
+
* a tie splits the game half-and-half. Returns `{}` for no verdicts and a
|
|
26
|
+
* uniform distribution when ids exist but no games were played.
|
|
27
|
+
*/
|
|
28
|
+
export declare function bradleyTerry(verdicts: TasteVerdict[]): Record<string, number>;
|
|
29
|
+
/**
|
|
30
|
+
* Roll a set of pairwise verdicts up into a ranking. `ids` seeds the population
|
|
31
|
+
* (so a direction with no verdicts still appears, ranked last). Order is by
|
|
32
|
+
* Bradley-Terry strength, tie-broken by Elo then id for determinism.
|
|
33
|
+
*/
|
|
34
|
+
export declare function rankDirections(ids: string[], verdicts: TasteVerdict[]): RankResult;
|
|
35
|
+
/**
|
|
36
|
+
* Judge-vs-human agreement over a set of votes. Ties (on either side) and pairs
|
|
37
|
+
* the judge never compared are excluded from `n`. Empty → `{ agreement: 0, n: 0 }`,
|
|
38
|
+
* never NaN.
|
|
39
|
+
*/
|
|
40
|
+
export declare function calibrateAgainstVotes(verdicts: TasteVerdict[], votes: HumanVote[]): CalibrationResult;
|
|
41
|
+
//# sourceMappingURL=rank.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rank.d.ts","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/rank.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAoB7F;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,GAAE,MAAc,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAOtG;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmD7E;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,UAAU,CAwDlF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,iBAAiB,CAerG"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Direction ranking — the PURE Bradley-Terry / Elo rollup. Folds many debiased
|
|
3
|
+
* `TasteVerdict`s into a single `RankResult`. No IO, no model: deterministic for
|
|
4
|
+
* a fixed verdict set, so `rankDirections` IS the `DirectionRanker`
|
|
5
|
+
* implementation (`{ rank: rankDirections }` at the wiring root).
|
|
6
|
+
*
|
|
7
|
+
* Two complementary solvers, both reported:
|
|
8
|
+
* - Bradley-Terry strengths via minorization-maximization (the maximum-
|
|
9
|
+
* likelihood stationary ranking; order-independent, sum-normalised).
|
|
10
|
+
* - Elo via sequential `updateElo` (cheap, online, conserves total rating).
|
|
11
|
+
*
|
|
12
|
+
* The published order is by Bradley-Terry strength, with Elo then id as
|
|
13
|
+
* deterministic tie-breaks. `calibrateAgainstVotes` scores judge-vs-human
|
|
14
|
+
* agreement so the taste judge can be validated against ground-truth votes.
|
|
15
|
+
*/
|
|
16
|
+
const ELO_START = 1500;
|
|
17
|
+
const ELO_K = 32;
|
|
18
|
+
const BT_ITERATIONS = 200;
|
|
19
|
+
const round2 = (n) => Math.round(n * 100) / 100;
|
|
20
|
+
const round4 = (n) => Math.round(n * 10000) / 10000;
|
|
21
|
+
const round6 = (n) => Math.round(n * 1e6) / 1e6;
|
|
22
|
+
const clamp01 = (n) => (n < 0 ? 0 : n > 1 ? 1 : n);
|
|
23
|
+
function collectIds(seed, verdicts) {
|
|
24
|
+
const set = new Set(seed);
|
|
25
|
+
for (const v of verdicts) {
|
|
26
|
+
set.add(v.aId);
|
|
27
|
+
set.add(v.bId);
|
|
28
|
+
}
|
|
29
|
+
return [...set];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* One Elo update for a single game. `outcome` is the score for the FIRST player
|
|
33
|
+
* (1 win, 0.5 tie, 0 loss). Total rating is conserved (the two deltas cancel),
|
|
34
|
+
* and the update is symmetric under swapping players + complementing the outcome.
|
|
35
|
+
*/
|
|
36
|
+
export function updateElo(ra, rb, outcome, k = ELO_K) {
|
|
37
|
+
const expectedA = 1 / (1 + Math.pow(10, (rb - ra) / 400));
|
|
38
|
+
const expectedB = 1 - expectedA;
|
|
39
|
+
const o = clamp01(outcome);
|
|
40
|
+
const ra2 = ra + k * (o - expectedA);
|
|
41
|
+
const rb2 = rb + k * (1 - o - expectedB);
|
|
42
|
+
return [ra2, rb2];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Bradley-Terry strengths per id, sum-normalised. A win counts as one game won;
|
|
46
|
+
* a tie splits the game half-and-half. Returns `{}` for no verdicts and a
|
|
47
|
+
* uniform distribution when ids exist but no games were played.
|
|
48
|
+
*/
|
|
49
|
+
export function bradleyTerry(verdicts) {
|
|
50
|
+
const ids = collectIds([], verdicts);
|
|
51
|
+
if (ids.length === 0)
|
|
52
|
+
return {};
|
|
53
|
+
const wins = {};
|
|
54
|
+
const games = {};
|
|
55
|
+
for (const id of ids) {
|
|
56
|
+
wins[id] = 0;
|
|
57
|
+
games[id] = {};
|
|
58
|
+
for (const other of ids)
|
|
59
|
+
games[id][other] = 0;
|
|
60
|
+
}
|
|
61
|
+
let totalGames = 0;
|
|
62
|
+
for (const v of verdicts) {
|
|
63
|
+
if (v.aId === v.bId)
|
|
64
|
+
continue;
|
|
65
|
+
games[v.aId][v.bId] += 1;
|
|
66
|
+
games[v.bId][v.aId] += 1;
|
|
67
|
+
totalGames += 1;
|
|
68
|
+
if (v.winner === v.aId)
|
|
69
|
+
wins[v.aId] += 1;
|
|
70
|
+
else if (v.winner === v.bId)
|
|
71
|
+
wins[v.bId] += 1;
|
|
72
|
+
else {
|
|
73
|
+
wins[v.aId] += 0.5;
|
|
74
|
+
wins[v.bId] += 0.5;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (totalGames === 0) {
|
|
78
|
+
const uniform = 1 / ids.length;
|
|
79
|
+
return Object.fromEntries(ids.map((id) => [id, uniform]));
|
|
80
|
+
}
|
|
81
|
+
let p = Object.fromEntries(ids.map((id) => [id, 1]));
|
|
82
|
+
for (let iter = 0; iter < BT_ITERATIONS; iter++) {
|
|
83
|
+
const next = {};
|
|
84
|
+
for (const i of ids) {
|
|
85
|
+
let denom = 0;
|
|
86
|
+
for (const j of ids) {
|
|
87
|
+
if (i === j)
|
|
88
|
+
continue;
|
|
89
|
+
const nij = games[i][j];
|
|
90
|
+
if (nij === 0)
|
|
91
|
+
continue;
|
|
92
|
+
denom += nij / (p[i] + p[j]);
|
|
93
|
+
}
|
|
94
|
+
next[i] = denom > 0 ? wins[i] / denom : 0;
|
|
95
|
+
}
|
|
96
|
+
const sum = ids.reduce((s, id) => s + next[id], 0);
|
|
97
|
+
p = sum > 0 ? Object.fromEntries(ids.map((id) => [id, next[id] / sum])) : next;
|
|
98
|
+
}
|
|
99
|
+
const sum = ids.reduce((s, id) => s + p[id], 0);
|
|
100
|
+
if (sum <= 0)
|
|
101
|
+
return p;
|
|
102
|
+
return Object.fromEntries(ids.map((id) => [id, round6(p[id] / sum)]));
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Roll a set of pairwise verdicts up into a ranking. `ids` seeds the population
|
|
106
|
+
* (so a direction with no verdicts still appears, ranked last). Order is by
|
|
107
|
+
* Bradley-Terry strength, tie-broken by Elo then id for determinism.
|
|
108
|
+
*/
|
|
109
|
+
export function rankDirections(ids, verdicts) {
|
|
110
|
+
const population = collectIds(ids, verdicts);
|
|
111
|
+
const bt = bradleyTerry(verdicts);
|
|
112
|
+
const bradleyTerryMap = {};
|
|
113
|
+
for (const id of population)
|
|
114
|
+
bradleyTerryMap[id] = bt[id] ?? 0;
|
|
115
|
+
// No evidence at all over the whole population ⇒ uniform priors (sum-normalised
|
|
116
|
+
// to 1, per contract), not a row of zeros.
|
|
117
|
+
const btSum = population.reduce((s, id) => s + bradleyTerryMap[id], 0);
|
|
118
|
+
if (population.length > 0 && btSum <= 1e-12) {
|
|
119
|
+
const uniform = round6(1 / population.length);
|
|
120
|
+
for (const id of population)
|
|
121
|
+
bradleyTerryMap[id] = uniform;
|
|
122
|
+
}
|
|
123
|
+
// Games played per id — a seeded-but-unjudged direction (0 games) must sink
|
|
124
|
+
// below any direction that was actually compared, even a loser, since we have
|
|
125
|
+
// no evidence to surface it.
|
|
126
|
+
const games = {};
|
|
127
|
+
for (const id of population)
|
|
128
|
+
games[id] = 0;
|
|
129
|
+
for (const v of verdicts) {
|
|
130
|
+
if (v.aId === v.bId)
|
|
131
|
+
continue;
|
|
132
|
+
games[v.aId] = (games[v.aId] ?? 0) + 1;
|
|
133
|
+
games[v.bId] = (games[v.bId] ?? 0) + 1;
|
|
134
|
+
}
|
|
135
|
+
const elo = {};
|
|
136
|
+
for (const id of population)
|
|
137
|
+
elo[id] = ELO_START;
|
|
138
|
+
for (const v of verdicts) {
|
|
139
|
+
if (v.aId === v.bId)
|
|
140
|
+
continue;
|
|
141
|
+
if (!(v.aId in elo))
|
|
142
|
+
elo[v.aId] = ELO_START;
|
|
143
|
+
if (!(v.bId in elo))
|
|
144
|
+
elo[v.bId] = ELO_START;
|
|
145
|
+
const outcome = v.winner === v.aId ? 1 : v.winner === v.bId ? 0 : 0.5;
|
|
146
|
+
const [ra, rb] = updateElo(elo[v.aId], elo[v.bId], outcome);
|
|
147
|
+
elo[v.aId] = ra;
|
|
148
|
+
elo[v.bId] = rb;
|
|
149
|
+
}
|
|
150
|
+
const order = [...population].sort((x, y) => {
|
|
151
|
+
const db = bradleyTerryMap[y] - bradleyTerryMap[x];
|
|
152
|
+
if (Math.abs(db) > 1e-9)
|
|
153
|
+
return db;
|
|
154
|
+
const dg = games[y] - games[x];
|
|
155
|
+
if (dg !== 0)
|
|
156
|
+
return dg;
|
|
157
|
+
const de = elo[y] - elo[x];
|
|
158
|
+
if (Math.abs(de) > 1e-9)
|
|
159
|
+
return de;
|
|
160
|
+
return x < y ? -1 : x > y ? 1 : 0;
|
|
161
|
+
});
|
|
162
|
+
const eloRounded = {};
|
|
163
|
+
for (const id of population)
|
|
164
|
+
eloRounded[id] = round2(elo[id]);
|
|
165
|
+
return {
|
|
166
|
+
order,
|
|
167
|
+
winnerId: order[0] ?? '',
|
|
168
|
+
bradleyTerry: bradleyTerryMap,
|
|
169
|
+
elo: eloRounded,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Judge-vs-human agreement over a set of votes. Ties (on either side) and pairs
|
|
174
|
+
* the judge never compared are excluded from `n`. Empty → `{ agreement: 0, n: 0 }`,
|
|
175
|
+
* never NaN.
|
|
176
|
+
*/
|
|
177
|
+
export function calibrateAgainstVotes(verdicts, votes) {
|
|
178
|
+
const key = (a, b) => (a < b ? `${a}|${b}` : `${b}|${a}`);
|
|
179
|
+
const judgeByPair = new Map();
|
|
180
|
+
for (const v of verdicts)
|
|
181
|
+
judgeByPair.set(key(v.aId, v.bId), v.winner);
|
|
182
|
+
let n = 0;
|
|
183
|
+
let agree = 0;
|
|
184
|
+
for (const vote of votes) {
|
|
185
|
+
if (vote.winner === 'tie')
|
|
186
|
+
continue;
|
|
187
|
+
const judged = judgeByPair.get(key(vote.aId, vote.bId));
|
|
188
|
+
if (judged === undefined || judged === 'tie')
|
|
189
|
+
continue;
|
|
190
|
+
n++;
|
|
191
|
+
if (judged === vote.winner)
|
|
192
|
+
agree++;
|
|
193
|
+
}
|
|
194
|
+
return { agreement: n > 0 ? round4(agree / n) : 0, n };
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=rank.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rank.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/rank.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text taste judge — the default `TasteJudge` adapter. The ONLY impure piece of
|
|
3
|
+
* the judge stack: one `brain.complete` per comparison over budget-bounded DNA /
|
|
4
|
+
* direction summaries, parsed by the pure `parseRawVerdict`. All debiasing,
|
|
5
|
+
* aggregation, and ranking live in the pure cores around it (`pairwise`,
|
|
6
|
+
* `quality`, `rank`).
|
|
7
|
+
*
|
|
8
|
+
* The model dependency is injected through the narrow `JudgeModel` seam — the
|
|
9
|
+
* real `Brain` satisfies it structurally, so the wiring root passes `brain`
|
|
10
|
+
* unchanged while unit tests inject a deterministic mock with no live model.
|
|
11
|
+
*
|
|
12
|
+
* `brain.auditDesign` is deliberately NOT used: overloading the page-audit seam
|
|
13
|
+
* for taste comparison is the contract abuse the architecture forbids. A vision
|
|
14
|
+
* judge is a future drop-in implementing this same `TasteJudge` interface once a
|
|
15
|
+
* clean visual-compare seam exists.
|
|
16
|
+
*/
|
|
17
|
+
import type { TasteJudge } from '../contracts.js';
|
|
18
|
+
/**
|
|
19
|
+
* The narrow model seam the text judge needs. `Brain` is assignable to this, so
|
|
20
|
+
* `createTextJudge(brain)` compiles at the wiring root while tests supply a stub.
|
|
21
|
+
*/
|
|
22
|
+
export interface JudgeModel {
|
|
23
|
+
complete(system: string, user: string, options?: {
|
|
24
|
+
maxOutputTokens?: number;
|
|
25
|
+
}): Promise<{
|
|
26
|
+
text: string;
|
|
27
|
+
tokensUsed?: number;
|
|
28
|
+
}>;
|
|
29
|
+
}
|
|
30
|
+
export declare function createTextJudge(brain: JudgeModel): TasteJudge;
|
|
31
|
+
//# sourceMappingURL=text-judge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-judge.d.ts","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/text-judge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAA8B,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAI7E;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CACN,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,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;AAKD,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAuB7D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text taste judge — the default `TasteJudge` adapter. The ONLY impure piece of
|
|
3
|
+
* the judge stack: one `brain.complete` per comparison over budget-bounded DNA /
|
|
4
|
+
* direction summaries, parsed by the pure `parseRawVerdict`. All debiasing,
|
|
5
|
+
* aggregation, and ranking live in the pure cores around it (`pairwise`,
|
|
6
|
+
* `quality`, `rank`).
|
|
7
|
+
*
|
|
8
|
+
* The model dependency is injected through the narrow `JudgeModel` seam — the
|
|
9
|
+
* real `Brain` satisfies it structurally, so the wiring root passes `brain`
|
|
10
|
+
* unchanged while unit tests inject a deterministic mock with no live model.
|
|
11
|
+
*
|
|
12
|
+
* `brain.auditDesign` is deliberately NOT used: overloading the page-audit seam
|
|
13
|
+
* for taste comparison is the contract abuse the architecture forbids. A vision
|
|
14
|
+
* judge is a future drop-in implementing this same `TasteJudge` interface once a
|
|
15
|
+
* clean visual-compare seam exists.
|
|
16
|
+
*/
|
|
17
|
+
import { buildPairwisePrompt, buildQualityPrompt } from './prompt.js';
|
|
18
|
+
import { parseRawVerdict } from './parse.js';
|
|
19
|
+
// Verdict JSON is tiny; cap output so a runaway judge response can't blow budget.
|
|
20
|
+
const JUDGE_MAX_OUTPUT_TOKENS = 400;
|
|
21
|
+
export function createTextJudge(brain) {
|
|
22
|
+
return {
|
|
23
|
+
id: 'text-judge',
|
|
24
|
+
async compare(input) {
|
|
25
|
+
// Direction-vs-direction comparisons carry a directionSummary; page-vs-
|
|
26
|
+
// exemplar (absolute quality) comparisons carry only DNA. Choose the
|
|
27
|
+
// matching prompt; the debias core supplies the slot order via input a/b.
|
|
28
|
+
const usesDirections = Boolean(input.a.directionSummary || input.b.directionSummary);
|
|
29
|
+
const { system, user } = usesDirections
|
|
30
|
+
? buildPairwisePrompt(input, 'AB')
|
|
31
|
+
: buildQualityPrompt(input, 'AB');
|
|
32
|
+
const { text, tokensUsed } = await brain.complete(system, user, {
|
|
33
|
+
maxOutputTokens: JUDGE_MAX_OUTPUT_TOKENS,
|
|
34
|
+
});
|
|
35
|
+
const verdict = parseRawVerdict(text);
|
|
36
|
+
// Echo the dimension scope so the quality leg can bucket per-dimension.
|
|
37
|
+
return input.dimension !== undefined
|
|
38
|
+
? { ...verdict, dimension: input.dimension, tokensUsed }
|
|
39
|
+
: { ...verdict, tokensUsed };
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=text-judge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-judge.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/text-judge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAc5C,kFAAkF;AAClF,MAAM,uBAAuB,GAAG,GAAG,CAAA;AAEnC,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,OAAO;QACL,EAAE,EAAE,YAAY;QAChB,KAAK,CAAC,OAAO,CAAC,KAAqB;YACjC,wEAAwE;YACxE,qEAAqE;YACrE,0EAA0E;YAC1E,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,IAAI,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAA;YACpF,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc;gBACrC,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC;gBAClC,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YAEnC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE;gBAC9D,eAAe,EAAE,uBAAuB;aACzC,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;YAErC,wEAAwE;YACxE,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS;gBAClC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE;gBACxD,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,CAAA;QAChC,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vision taste judge — a screenshot-grounded `TasteJudge` that is a drop-in for
|
|
3
|
+
* the default text judge. PURE given its injected models: it imports no Brain and
|
|
4
|
+
* does no IO, so it unit-tests with deterministic `VisionJudgeModel` stubs and no
|
|
5
|
+
* live model. The disk read + provider round-trip live behind the injected seam
|
|
6
|
+
* (`judge/vision-model.createBrainVisionModel`).
|
|
7
|
+
*
|
|
8
|
+
* What it adds over the text judge: it judges from the subjects' SCREENSHOTS (the
|
|
9
|
+
* audited page and the corpus exemplars), not just their DNA text — so the
|
|
10
|
+
* absolute-quality leg (`judge/quality.assessPageQuality`) becomes a genuine
|
|
11
|
+
* visual page-vs-exemplar comparison. It reuses the text judge's pure prompt
|
|
12
|
+
* cores (`buildQualityPrompt`/`buildPairwisePrompt`) and parser
|
|
13
|
+
* (`parseVerdictOrNull`) verbatim — vision adds images, not new prompt logic.
|
|
14
|
+
*
|
|
15
|
+
* TWO layered debiases, kept separate so neither is double-applied:
|
|
16
|
+
* - POSITION-SWAP (A-vs-B and B-vs-A) is NOT done here. The surrounding pure
|
|
17
|
+
* debias core (`judge/pairwise.judgePair`) already calls `compare` twice and
|
|
18
|
+
* reconciles, so one `compare` is ONE slot order. Re-swapping internally would
|
|
19
|
+
* double the model calls and break that core's accounting.
|
|
20
|
+
* - The ENSEMBLE (across MODELS) IS done here: every model runs in parallel on
|
|
21
|
+
* the given slot order, then aggregates to a majority winner with an honest
|
|
22
|
+
* agreement-fraction confidence (see `aggregateVerdicts`). With one model it
|
|
23
|
+
* degrades to a single judge; with many it is robust to single-model bias.
|
|
24
|
+
*
|
|
25
|
+
* Fail-closed: a model that throws or returns no parseable winner is DROPPED; if
|
|
26
|
+
* every model is dropped, `compare` throws rather than fabricating a tie. An empty
|
|
27
|
+
* model list is rejected at construction.
|
|
28
|
+
*
|
|
29
|
+
* SCOPE: only subjects that HAVE a screenshot are vision-judged. Unrendered
|
|
30
|
+
* `RedesignDirection` specs carry none, so a comparison with a screenshot-less
|
|
31
|
+
* side delegates to the injected text fallback — keeping this a single drop-in
|
|
32
|
+
* judge for BOTH the quality leg (vision) and the direction-ranking leg (text).
|
|
33
|
+
*/
|
|
34
|
+
import type { RawVerdict, TasteJudge, VisionJudgeModel } from '../contracts.js';
|
|
35
|
+
/**
|
|
36
|
+
* Collapse the surviving per-model verdicts into one ensemble `RawVerdict` body
|
|
37
|
+
* (winnerSlot + honest confidence + merged reasons). PURE. Throws on an empty set
|
|
38
|
+
* — an all-dropped ensemble is an explicit error, never a fabricated tie.
|
|
39
|
+
*
|
|
40
|
+
* The bucket (A/B/tie) with the STRICT maximum vote count wins; a genuine `tie`
|
|
41
|
+
* vote counts in its own bucket. `confidence` is that bucket's vote share
|
|
42
|
+
* (agreement fraction). A split — two or more buckets sharing the top count —
|
|
43
|
+
* is undecided ⇒ tie at confidence 0.
|
|
44
|
+
*/
|
|
45
|
+
export declare function aggregateVerdicts(verdicts: RawVerdict[]): {
|
|
46
|
+
winnerSlot: RawVerdict['winnerSlot'];
|
|
47
|
+
confidence: number;
|
|
48
|
+
reasons: string[];
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Build a vision `TasteJudge` over a non-empty list of `VisionJudgeModel`s. One
|
|
52
|
+
* model ⇒ a single judge; many ⇒ the cross-model ensemble. `textFallback` (the
|
|
53
|
+
* default text judge, injected by the wiring) handles comparisons whose subjects
|
|
54
|
+
* lack screenshots; omit it only in tests that never exercise that path.
|
|
55
|
+
*/
|
|
56
|
+
export declare function createVisionJudge(models: VisionJudgeModel[], opts?: {
|
|
57
|
+
textFallback?: TasteJudge;
|
|
58
|
+
}): TasteJudge;
|
|
59
|
+
//# sourceMappingURL=vision-judge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vision-judge.d.ts","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/vision-judge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAEV,UAAU,EACV,UAAU,EAEV,gBAAgB,EACjB,MAAM,iBAAiB,CAAA;AAqBxB;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG;IACzD,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,CAAA;IACpC,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB,CAqBA;AA6BD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,gBAAgB,EAAE,EAC1B,IAAI,GAAE;IAAE,YAAY,CAAC,EAAE,UAAU,CAAA;CAAO,GACvC,UAAU,CAsDZ"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vision taste judge — a screenshot-grounded `TasteJudge` that is a drop-in for
|
|
3
|
+
* the default text judge. PURE given its injected models: it imports no Brain and
|
|
4
|
+
* does no IO, so it unit-tests with deterministic `VisionJudgeModel` stubs and no
|
|
5
|
+
* live model. The disk read + provider round-trip live behind the injected seam
|
|
6
|
+
* (`judge/vision-model.createBrainVisionModel`).
|
|
7
|
+
*
|
|
8
|
+
* What it adds over the text judge: it judges from the subjects' SCREENSHOTS (the
|
|
9
|
+
* audited page and the corpus exemplars), not just their DNA text — so the
|
|
10
|
+
* absolute-quality leg (`judge/quality.assessPageQuality`) becomes a genuine
|
|
11
|
+
* visual page-vs-exemplar comparison. It reuses the text judge's pure prompt
|
|
12
|
+
* cores (`buildQualityPrompt`/`buildPairwisePrompt`) and parser
|
|
13
|
+
* (`parseVerdictOrNull`) verbatim — vision adds images, not new prompt logic.
|
|
14
|
+
*
|
|
15
|
+
* TWO layered debiases, kept separate so neither is double-applied:
|
|
16
|
+
* - POSITION-SWAP (A-vs-B and B-vs-A) is NOT done here. The surrounding pure
|
|
17
|
+
* debias core (`judge/pairwise.judgePair`) already calls `compare` twice and
|
|
18
|
+
* reconciles, so one `compare` is ONE slot order. Re-swapping internally would
|
|
19
|
+
* double the model calls and break that core's accounting.
|
|
20
|
+
* - The ENSEMBLE (across MODELS) IS done here: every model runs in parallel on
|
|
21
|
+
* the given slot order, then aggregates to a majority winner with an honest
|
|
22
|
+
* agreement-fraction confidence (see `aggregateVerdicts`). With one model it
|
|
23
|
+
* degrades to a single judge; with many it is robust to single-model bias.
|
|
24
|
+
*
|
|
25
|
+
* Fail-closed: a model that throws or returns no parseable winner is DROPPED; if
|
|
26
|
+
* every model is dropped, `compare` throws rather than fabricating a tie. An empty
|
|
27
|
+
* model list is rejected at construction.
|
|
28
|
+
*
|
|
29
|
+
* SCOPE: only subjects that HAVE a screenshot are vision-judged. Unrendered
|
|
30
|
+
* `RedesignDirection` specs carry none, so a comparison with a screenshot-less
|
|
31
|
+
* side delegates to the injected text fallback — keeping this a single drop-in
|
|
32
|
+
* judge for BOTH the quality leg (vision) and the direction-ranking leg (text).
|
|
33
|
+
*/
|
|
34
|
+
import { buildPairwisePrompt, buildQualityPrompt } from './prompt.js';
|
|
35
|
+
import { parseVerdictOrNull } from './parse.js';
|
|
36
|
+
// Verdict JSON is tiny; cap output so a runaway response can't blow budget. Same
|
|
37
|
+
// ceiling as the text judge (`text-judge.JUDGE_MAX_OUTPUT_TOKENS`).
|
|
38
|
+
const JUDGE_MAX_OUTPUT_TOKENS = 400;
|
|
39
|
+
// Merged-reason ceiling on the aggregated verdict, so an N-model ensemble cannot
|
|
40
|
+
// bloat one `RawVerdict` with N× the reasons.
|
|
41
|
+
const REASON_CAP = 8;
|
|
42
|
+
// Prepended to the reused text prompt so the model maps images→slots. The images
|
|
43
|
+
// are attached in slot order ([slot A, slot B]); `compare` always renders the
|
|
44
|
+
// input on slot order 'AB', and the outer `judgePair` supplies the swapped order.
|
|
45
|
+
const VISION_PREAMBLE = 'Two screenshots are attached. The FIRST image is SLOT A; the SECOND image is SLOT B. ' +
|
|
46
|
+
'Judge primarily from the screenshots — the text below is a secondary DNA summary of each design.';
|
|
47
|
+
const round4 = (n) => Math.round(n * 10000) / 10000;
|
|
48
|
+
/**
|
|
49
|
+
* Collapse the surviving per-model verdicts into one ensemble `RawVerdict` body
|
|
50
|
+
* (winnerSlot + honest confidence + merged reasons). PURE. Throws on an empty set
|
|
51
|
+
* — an all-dropped ensemble is an explicit error, never a fabricated tie.
|
|
52
|
+
*
|
|
53
|
+
* The bucket (A/B/tie) with the STRICT maximum vote count wins; a genuine `tie`
|
|
54
|
+
* vote counts in its own bucket. `confidence` is that bucket's vote share
|
|
55
|
+
* (agreement fraction). A split — two or more buckets sharing the top count —
|
|
56
|
+
* is undecided ⇒ tie at confidence 0.
|
|
57
|
+
*/
|
|
58
|
+
export function aggregateVerdicts(verdicts) {
|
|
59
|
+
if (verdicts.length === 0) {
|
|
60
|
+
throw new Error('vision judge: cannot aggregate an empty set of verdicts');
|
|
61
|
+
}
|
|
62
|
+
const counts = { A: 0, B: 0, tie: 0 };
|
|
63
|
+
for (const v of verdicts)
|
|
64
|
+
counts[v.winnerSlot]++;
|
|
65
|
+
const total = verdicts.length;
|
|
66
|
+
const top = Math.max(counts.A, counts.B, counts.tie);
|
|
67
|
+
const leaders = ['A', 'B', 'tie'].filter((slot) => counts[slot] === top);
|
|
68
|
+
const decided = leaders.length === 1;
|
|
69
|
+
const winnerSlot = decided ? leaders[0] : 'tie';
|
|
70
|
+
const confidence = decided ? round4(top / total) : 0;
|
|
71
|
+
const reasons = [
|
|
72
|
+
`ensemble: A=${counts.A} B=${counts.B} tie=${counts.tie} over ${total} model${total === 1 ? '' : 's'}`,
|
|
73
|
+
];
|
|
74
|
+
for (const v of verdicts) {
|
|
75
|
+
for (const r of v.reasons)
|
|
76
|
+
if (!reasons.includes(r))
|
|
77
|
+
reasons.push(r);
|
|
78
|
+
}
|
|
79
|
+
return { winnerSlot, confidence, reasons: reasons.slice(0, REASON_CAP) };
|
|
80
|
+
}
|
|
81
|
+
/** Run one model on a single slot order; a throw/unparseable result is a drop. */
|
|
82
|
+
async function runModel(model, system, user, images) {
|
|
83
|
+
try {
|
|
84
|
+
const { text, tokensUsed } = await model.completeVision(system, user, images, {
|
|
85
|
+
maxOutputTokens: JUDGE_MAX_OUTPUT_TOKENS,
|
|
86
|
+
});
|
|
87
|
+
const verdict = parseVerdictOrNull(text);
|
|
88
|
+
if (!verdict && process.env.BAD_VISION_JUDGE_DEBUG === '1')
|
|
89
|
+
console.error(`[vision ${model.id}] parse-failed | len=${text.length} head=${JSON.stringify(text.slice(0, 240))}`);
|
|
90
|
+
return { verdict, tokens: tokensUsed ?? 0 };
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
if (process.env.BAD_VISION_JUDGE_DEBUG === '1')
|
|
94
|
+
console.error(`[vision ${model.id}] call-failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
95
|
+
return { verdict: null, tokens: 0 };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Build a vision `TasteJudge` over a non-empty list of `VisionJudgeModel`s. One
|
|
100
|
+
* model ⇒ a single judge; many ⇒ the cross-model ensemble. `textFallback` (the
|
|
101
|
+
* default text judge, injected by the wiring) handles comparisons whose subjects
|
|
102
|
+
* lack screenshots; omit it only in tests that never exercise that path.
|
|
103
|
+
*/
|
|
104
|
+
export function createVisionJudge(models, opts = {}) {
|
|
105
|
+
if (models.length === 0) {
|
|
106
|
+
throw new Error('vision judge: at least one vision model is required (empty ensemble)');
|
|
107
|
+
}
|
|
108
|
+
const { textFallback } = opts;
|
|
109
|
+
const id = `vision-judge[${models.map((m) => m.id).join('+')}]`;
|
|
110
|
+
return {
|
|
111
|
+
id,
|
|
112
|
+
async compare(input) {
|
|
113
|
+
const { a, b } = input;
|
|
114
|
+
// Vision needs an image on BOTH sides. Screenshot-less subjects (unrendered
|
|
115
|
+
// directions) delegate to the injected text judge, so one instance serves
|
|
116
|
+
// the vision quality leg AND the text direction leg.
|
|
117
|
+
if (!a.screenshotPath || !b.screenshotPath) {
|
|
118
|
+
if (!textFallback) {
|
|
119
|
+
throw new Error(`vision judge: subjects ${a.id}/${b.id} lack screenshots and no text fallback was injected`);
|
|
120
|
+
}
|
|
121
|
+
return textFallback.compare(input);
|
|
122
|
+
}
|
|
123
|
+
// Mirror the text judge's prompt selection; both subjects carry screenshots
|
|
124
|
+
// here, so this is the absolute-quality leg in practice.
|
|
125
|
+
const usesDirections = Boolean(a.directionSummary || b.directionSummary);
|
|
126
|
+
const { system, user } = usesDirections
|
|
127
|
+
? buildPairwisePrompt(input, 'AB')
|
|
128
|
+
: buildQualityPrompt(input, 'AB');
|
|
129
|
+
const userWithImages = `${VISION_PREAMBLE}\n\n${user}`;
|
|
130
|
+
const images = [
|
|
131
|
+
{ screenshotPath: a.screenshotPath },
|
|
132
|
+
{ screenshotPath: b.screenshotPath },
|
|
133
|
+
];
|
|
134
|
+
const outcomes = await Promise.all(models.map((m) => runModel(m, system, userWithImages, images)));
|
|
135
|
+
const survivors = outcomes
|
|
136
|
+
.map((o) => o.verdict)
|
|
137
|
+
.filter((v) => v !== null);
|
|
138
|
+
const tokensUsed = outcomes.reduce((sum, o) => sum + o.tokens, 0);
|
|
139
|
+
if (survivors.length === 0) {
|
|
140
|
+
throw new Error(`vision judge: every model in the ensemble (${models.length}) failed to return a usable ` +
|
|
141
|
+
'verdict; refusing to fabricate a tie');
|
|
142
|
+
}
|
|
143
|
+
const agg = aggregateVerdicts(survivors);
|
|
144
|
+
const verdict = { winnerSlot: agg.winnerSlot, confidence: agg.confidence, reasons: agg.reasons };
|
|
145
|
+
const withTokens = tokensUsed > 0 ? { ...verdict, tokensUsed } : verdict;
|
|
146
|
+
return input.dimension !== undefined ? { ...withTokens, dimension: input.dimension } : withTokens;
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=vision-judge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vision-judge.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/vision-judge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AASH,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAE/C,iFAAiF;AACjF,oEAAoE;AACpE,MAAM,uBAAuB,GAAG,GAAG,CAAA;AAEnC,iFAAiF;AACjF,8CAA8C;AAC9C,MAAM,UAAU,GAAG,CAAC,CAAA;AAEpB,iFAAiF;AACjF,8EAA8E;AAC9E,kFAAkF;AAClF,MAAM,eAAe,GACnB,uFAAuF;IACvF,kGAAkG,CAAA;AAEpG,MAAM,MAAM,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAA;AAEnE;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAsB;IAKtD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;IAC5E,CAAC;IACD,MAAM,MAAM,GAA6C,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAA;IAC/E,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAA;IAEhD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAA;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAA;IACpD,MAAM,OAAO,GAAI,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;IACnF,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAA;IACpC,MAAM,UAAU,GAA6B,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACzE,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAEpD,MAAM,OAAO,GAAa;QACxB,eAAe,MAAM,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,QAAQ,MAAM,CAAC,GAAG,SAAS,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE;KACvG,CAAA;IACD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACtE,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,CAAA;AAC1E,CAAC;AAOD,kFAAkF;AAClF,KAAK,UAAU,QAAQ,CACrB,KAAuB,EACvB,MAAc,EACd,IAAY,EACZ,MAAwB;IAExB,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;YAC5E,eAAe,EAAE,uBAAuB;SACzC,CAAC,CAAA;QACF,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACxC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,GAAG;YACxD,OAAO,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,EAAE,wBAAwB,IAAI,CAAC,MAAM,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAA;QACpH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,IAAI,CAAC,EAAE,CAAA;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,GAAG;YAC5C,OAAO,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,EAAE,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACxG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAA;IACrC,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAA0B,EAC1B,OAAsC,EAAE;IAExC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAA;IACzF,CAAC;IACD,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAA;IAC7B,MAAM,EAAE,GAAG,gBAAgB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;IAE/D,OAAO;QACL,EAAE;QACF,KAAK,CAAC,OAAO,CAAC,KAAqB;YACjC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,CAAA;YACtB,4EAA4E;YAC5E,0EAA0E;YAC1E,qDAAqD;YACrD,IAAI,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;gBAC3C,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,MAAM,IAAI,KAAK,CACb,0BAA0B,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,qDAAqD,CAC5F,CAAA;gBACH,CAAC;gBACD,OAAO,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACpC,CAAC;YAED,4EAA4E;YAC5E,yDAAyD;YACzD,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,gBAAgB,CAAC,CAAA;YACxE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc;gBACrC,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC;gBAClC,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YACnC,MAAM,cAAc,GAAG,GAAG,eAAe,OAAO,IAAI,EAAE,CAAA;YACtD,MAAM,MAAM,GAAqB;gBAC/B,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE;gBACpC,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE;aACrC,CAAA;YAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;YAClG,MAAM,SAAS,GAAG,QAAQ;iBACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;iBACrB,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAA;YAC7C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;YAEjE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CACb,8CAA8C,MAAM,CAAC,MAAM,8BAA8B;oBACvF,sCAAsC,CACzC,CAAA;YACH,CAAC;YAED,MAAM,GAAG,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAA;YACxC,MAAM,OAAO,GAAe,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAA;YAC5G,MAAM,UAAU,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAA;YACxE,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,UAAU,CAAA;QACnG,CAAC;KACF,CAAA;AACH,CAAC"}
|