@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,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quality-evaluation task for the Brain decision engine: asks the LLM to rate
|
|
3
|
+
* the visual quality, design, and professional polish of the current page.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from brain/index.ts via the delegate + host-interface pattern.
|
|
6
|
+
* Brain.evaluate keeps a thin delegator; the body lives here verbatim and reads
|
|
7
|
+
* Brain state through {@link BrainEvaluateHost}, which Brain `implements` so tsc
|
|
8
|
+
* proves the host surface is complete.
|
|
9
|
+
*/
|
|
10
|
+
import { EVALUATE_PROMPT } from '../prompts.js';
|
|
11
|
+
export async function evaluateImpl(self, state, goal) {
|
|
12
|
+
const textContent = `GOAL that was being worked on: ${goal}
|
|
13
|
+
|
|
14
|
+
CURRENT PAGE:
|
|
15
|
+
URL: ${state.url}
|
|
16
|
+
Title: ${state.title}
|
|
17
|
+
|
|
18
|
+
Please evaluate the quality of this page/application.`;
|
|
19
|
+
const userContent = self.buildUserContent(textContent, state.screenshot, true);
|
|
20
|
+
const result = await self.generate(EVALUATE_PROMPT, [{ role: 'user', content: userContent }], undefined, 800);
|
|
21
|
+
const raw = result.text;
|
|
22
|
+
const tokensUsed = result.tokensUsed;
|
|
23
|
+
if (self.debug) {
|
|
24
|
+
console.log('[Brain] Evaluation:', raw.slice(0, 300));
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
let text = raw.trim();
|
|
28
|
+
if (text.startsWith('```')) {
|
|
29
|
+
text = text.replace(/^```(?:json)?\n?/, '').replace(/\n?```$/, '');
|
|
30
|
+
}
|
|
31
|
+
const parsed = JSON.parse(text);
|
|
32
|
+
const rawScore = typeof parsed.score === 'number' ? parsed.score : 5;
|
|
33
|
+
return {
|
|
34
|
+
score: Math.max(1, Math.min(10, rawScore)),
|
|
35
|
+
assessment: parsed.assessment ?? 'No assessment provided',
|
|
36
|
+
strengths: Array.isArray(parsed.strengths) ? parsed.strengths : [],
|
|
37
|
+
issues: Array.isArray(parsed.issues) ? parsed.issues : [],
|
|
38
|
+
suggestions: Array.isArray(parsed.suggestions) ? parsed.suggestions : [],
|
|
39
|
+
raw,
|
|
40
|
+
tokensUsed,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return {
|
|
45
|
+
score: 5,
|
|
46
|
+
assessment: 'Failed to parse evaluation response',
|
|
47
|
+
strengths: [],
|
|
48
|
+
issues: [],
|
|
49
|
+
suggestions: [],
|
|
50
|
+
raw,
|
|
51
|
+
tokensUsed,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=evaluate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../../src/brain/tasks/evaluate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAoBhD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAuB,EAAE,KAAgB,EAAE,IAAY;IACxF,MAAM,WAAW,GAAG,kCAAkC,IAAI;;;OAGrD,KAAK,CAAC,GAAG;SACP,KAAK,CAAC,KAAK;;sDAEkC,CAAC;IAErD,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAE/E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAChC,eAAe,EACf,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EACxC,SAAS,EACT,GAAG,CACJ,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC;IACxB,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAErC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,CAAC;QACH,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACtB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC1C,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,wBAAwB;YACzD,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;YAClE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YACzD,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;YACxE,GAAG;YACH,UAAU;SACX,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,qCAAqC;YACjD,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,EAAE;YACV,WAAW,EAAE,EAAE;YACf,GAAG;YACH,UAAU;SACX,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Goal-verification task for the Brain decision engine: a fresh (history-free)
|
|
3
|
+
* LLM call that checks whether the agent's claimed result actually achieved the
|
|
4
|
+
* goal, kept separate from quality evaluation to avoid self-confirmation bias.
|
|
5
|
+
*
|
|
6
|
+
* Extracted from brain/index.ts via the delegate + host-interface pattern.
|
|
7
|
+
* Brain.verifyGoalCompletion keeps a thin delegator; the body lives here
|
|
8
|
+
* verbatim and reads Brain state through {@link BrainGoalVerificationHost}, which
|
|
9
|
+
* Brain `implements` so tsc proves the host surface is complete.
|
|
10
|
+
*/
|
|
11
|
+
import type { ModelMessage, SystemModelMessage } from 'ai';
|
|
12
|
+
import type { PageState, GoalVerification } from '../../types.js';
|
|
13
|
+
import type { UserContent } from '../types.js';
|
|
14
|
+
import type { BrainProvider, ModelSelection, GenerateResult } from '../model-client.js';
|
|
15
|
+
/**
|
|
16
|
+
* The slice of Brain state `verifyGoalCompletion` reads. All members are public
|
|
17
|
+
* on Brain by construction; `implements BrainGoalVerificationHost` makes a
|
|
18
|
+
* missing/mistyped member a compile error.
|
|
19
|
+
*/
|
|
20
|
+
export interface BrainGoalVerificationHost {
|
|
21
|
+
provider: BrainProvider;
|
|
22
|
+
debug: boolean;
|
|
23
|
+
adaptiveModelRouting: boolean;
|
|
24
|
+
navProvider?: BrainProvider;
|
|
25
|
+
navModelName?: string;
|
|
26
|
+
verifierProvider?: string;
|
|
27
|
+
verifierModel?: string;
|
|
28
|
+
buildUserContent(text: string, screenshot?: string, forceVision?: boolean): UserContent;
|
|
29
|
+
generate(system: string | SystemModelMessage[], messages: ModelMessage[], selection?: ModelSelection, maxOutputTokens?: number): Promise<GenerateResult>;
|
|
30
|
+
}
|
|
31
|
+
export declare function verifyGoalCompletionImpl(self: BrainGoalVerificationHost, state: PageState, goal: string, claimedResult: string): Promise<GoalVerification>;
|
|
32
|
+
//# sourceMappingURL=goal-verification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-verification.d.ts","sourceRoot":"","sources":["../../../src/brain/tasks/goal-verification.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAExF;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,oBAAoB,EAAE,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IACxF,QAAQ,CACN,MAAM,EAAE,MAAM,GAAG,kBAAkB,EAAE,EACrC,QAAQ,EAAE,YAAY,EAAE,EACxB,SAAS,CAAC,EAAE,cAAc,EAC1B,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,cAAc,CAAC,CAAC;CAC5B;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,yBAAyB,EAC/B,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,gBAAgB,CAAC,CAgE3B"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Goal-verification task for the Brain decision engine: a fresh (history-free)
|
|
3
|
+
* LLM call that checks whether the agent's claimed result actually achieved the
|
|
4
|
+
* goal, kept separate from quality evaluation to avoid self-confirmation bias.
|
|
5
|
+
*
|
|
6
|
+
* Extracted from brain/index.ts via the delegate + host-interface pattern.
|
|
7
|
+
* Brain.verifyGoalCompletion keeps a thin delegator; the body lives here
|
|
8
|
+
* verbatim and reads Brain state through {@link BrainGoalVerificationHost}, which
|
|
9
|
+
* Brain `implements` so tsc proves the host surface is complete.
|
|
10
|
+
*/
|
|
11
|
+
import { buildFirstPartyBoundaryNote } from '../../domain-policy.js';
|
|
12
|
+
import { budgetSnapshot } from '../snapshot-budget.js';
|
|
13
|
+
export async function verifyGoalCompletionImpl(self, state, goal, claimedResult) {
|
|
14
|
+
const siteBoundaryNote = buildFirstPartyBoundaryNote(goal, state.url);
|
|
15
|
+
const textContent = `GOAL: ${goal}
|
|
16
|
+
|
|
17
|
+
AGENT'S CLAIMED RESULT: ${claimedResult}
|
|
18
|
+
|
|
19
|
+
CURRENT PAGE:
|
|
20
|
+
URL: ${state.url}
|
|
21
|
+
Title: ${state.title}
|
|
22
|
+
|
|
23
|
+
ELEMENTS:
|
|
24
|
+
${budgetSnapshot(state.snapshot)}${siteBoundaryNote ? `\n\n${siteBoundaryNote}` : ''}
|
|
25
|
+
|
|
26
|
+
Was the goal actually achieved? Analyze the current page state carefully.`;
|
|
27
|
+
const userContent = self.buildUserContent(textContent, state.screenshot, true);
|
|
28
|
+
// Verifier can use its own model, then the navigation model, then main.
|
|
29
|
+
const verifyProvider = self.verifierProvider
|
|
30
|
+
? self.verifierProvider
|
|
31
|
+
: (self.adaptiveModelRouting && self.navModelName ? (self.navProvider || self.provider) : undefined);
|
|
32
|
+
const verifyModel = self.verifierModel
|
|
33
|
+
|| (self.adaptiveModelRouting && self.navModelName ? self.navModelName : undefined);
|
|
34
|
+
const result = await self.generate(`Verify whether the browser agent achieved its goal. Respond with ONLY JSON:
|
|
35
|
+
{"achieved":true,"confidence":0.9,"evidence":["observation"],"missing":[]}
|
|
36
|
+
|
|
37
|
+
Check: page state matches goal, no errors, URL is expected, claimed result matches visible data.
|
|
38
|
+
SUPPLEMENTAL TOOL EVIDENCE / SCRIPT RESULT in claimed results = verified DOM data, trustworthy even if page navigated away. Multi-page data collection is valid.`, [{ role: 'user', content: userContent }], verifyProvider && verifyModel ? { provider: verifyProvider, model: verifyModel } : undefined, 600);
|
|
39
|
+
const raw = result.text;
|
|
40
|
+
if (self.debug) {
|
|
41
|
+
console.log('[Brain] Goal verification:', raw.slice(0, 300));
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
let text = raw.trim();
|
|
45
|
+
if (text.startsWith('```')) {
|
|
46
|
+
text = text.replace(/^```(?:json)?\n?/, '').replace(/\n?```$/, '');
|
|
47
|
+
}
|
|
48
|
+
const parsed = JSON.parse(text);
|
|
49
|
+
return {
|
|
50
|
+
achieved: parsed.achieved === true,
|
|
51
|
+
confidence: typeof parsed.confidence === 'number'
|
|
52
|
+
? Math.max(0, Math.min(1, parsed.confidence))
|
|
53
|
+
: 0.5,
|
|
54
|
+
evidence: Array.isArray(parsed.evidence) ? parsed.evidence : [],
|
|
55
|
+
missing: Array.isArray(parsed.missing) ? parsed.missing : [],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Parse failure — assume not verified (conservative)
|
|
60
|
+
return {
|
|
61
|
+
achieved: false,
|
|
62
|
+
confidence: 0,
|
|
63
|
+
evidence: [],
|
|
64
|
+
missing: ['Failed to parse goal verification response'],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=goal-verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-verification.js","sourceRoot":"","sources":["../../../src/brain/tasks/goal-verification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge-extraction task for the Brain decision engine: distills a completed
|
|
3
|
+
* trajectory into reusable timing/selector/pattern/quirk facts that help an
|
|
4
|
+
* agent complete similar tasks faster next time.
|
|
5
|
+
*
|
|
6
|
+
* Extracted from brain/index.ts via the delegate + host-interface pattern.
|
|
7
|
+
* Brain.extractKnowledge keeps a thin delegator; the body lives here verbatim
|
|
8
|
+
* and reads Brain state through {@link BrainKnowledgeHost}, which Brain
|
|
9
|
+
* `implements` so tsc proves the host surface is complete.
|
|
10
|
+
*/
|
|
11
|
+
import type { ModelMessage, SystemModelMessage } from 'ai';
|
|
12
|
+
import type { ModelSelection, GenerateResult } from '../model-client.js';
|
|
13
|
+
/**
|
|
14
|
+
* The slice of Brain state `extractKnowledge` reads — just the transport funnel.
|
|
15
|
+
* `implements BrainKnowledgeHost` makes a missing/mistyped member a compile
|
|
16
|
+
* error.
|
|
17
|
+
*/
|
|
18
|
+
export interface BrainKnowledgeHost {
|
|
19
|
+
generate(system: string | SystemModelMessage[], messages: ModelMessage[], selection?: ModelSelection, maxOutputTokens?: number): Promise<GenerateResult>;
|
|
20
|
+
}
|
|
21
|
+
export declare function extractKnowledgeImpl(self: BrainKnowledgeHost, trajectoryText: string, domain: string): Promise<Array<{
|
|
22
|
+
type: 'timing' | 'selector' | 'pattern' | 'quirk';
|
|
23
|
+
key: string;
|
|
24
|
+
value: string;
|
|
25
|
+
}>>;
|
|
26
|
+
//# sourceMappingURL=knowledge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../../src/brain/tasks/knowledge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzE;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CACN,MAAM,EAAE,MAAM,GAAG,kBAAkB,EAAE,EACrC,QAAQ,EAAE,YAAY,EAAE,EACxB,SAAS,CAAC,EAAE,cAAc,EAC1B,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,cAAc,CAAC,CAAC;CAC5B;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,kBAAkB,EACxB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAmDnG"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge-extraction task for the Brain decision engine: distills a completed
|
|
3
|
+
* trajectory into reusable timing/selector/pattern/quirk facts that help an
|
|
4
|
+
* agent complete similar tasks faster next time.
|
|
5
|
+
*
|
|
6
|
+
* Extracted from brain/index.ts via the delegate + host-interface pattern.
|
|
7
|
+
* Brain.extractKnowledge keeps a thin delegator; the body lives here verbatim
|
|
8
|
+
* and reads Brain state through {@link BrainKnowledgeHost}, which Brain
|
|
9
|
+
* `implements` so tsc proves the host surface is complete.
|
|
10
|
+
*/
|
|
11
|
+
export async function extractKnowledgeImpl(self, trajectoryText, domain) {
|
|
12
|
+
const result = await self.generate(`You are analyzing a browser automation trajectory to extract reusable knowledge.
|
|
13
|
+
Extract facts that would help an agent complete similar tasks faster next time.
|
|
14
|
+
|
|
15
|
+
Respond with ONLY a JSON array of facts:
|
|
16
|
+
[
|
|
17
|
+
{"type": "timing", "key": "page-load", "value": "wait 3000ms after navigation for content to hydrate"},
|
|
18
|
+
{"type": "selector", "key": "send-button", "value": "[data-testid='chat-send-button'] is the reliable send button selector"},
|
|
19
|
+
{"type": "pattern", "key": "auth-flow", "value": "Click sign-in → fill email → fill password → click submit → wait for redirect"},
|
|
20
|
+
{"type": "quirk", "key": "lazy-loading", "value": "File tree loads asynchronously — wait for entries before asserting"}
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
Types:
|
|
24
|
+
- timing: wait durations, delays that are necessary
|
|
25
|
+
- selector: reliable selectors for important elements
|
|
26
|
+
- pattern: multi-step interaction sequences
|
|
27
|
+
- quirk: app-specific behaviors or gotchas
|
|
28
|
+
|
|
29
|
+
Only include facts that are genuinely useful. Quality over quantity. Max 10 facts.`, [{
|
|
30
|
+
role: 'user',
|
|
31
|
+
content: `Domain: ${domain}\n\nTrajectory:\n${trajectoryText}`,
|
|
32
|
+
}], undefined, 800);
|
|
33
|
+
try {
|
|
34
|
+
let text = result.text.trim();
|
|
35
|
+
if (text.startsWith('```')) {
|
|
36
|
+
text = text.replace(/^```(?:json)?\n?/, '').replace(/\n?```$/, '');
|
|
37
|
+
}
|
|
38
|
+
const parsed = JSON.parse(text);
|
|
39
|
+
if (!Array.isArray(parsed))
|
|
40
|
+
return [];
|
|
41
|
+
const VALID_TYPES = new Set(['timing', 'selector', 'pattern', 'quirk']);
|
|
42
|
+
return parsed
|
|
43
|
+
.filter((f) => VALID_TYPES.has(f.type) &&
|
|
44
|
+
typeof f.key === 'string' &&
|
|
45
|
+
typeof f.value === 'string')
|
|
46
|
+
.map((f) => ({
|
|
47
|
+
type: f.type,
|
|
48
|
+
key: f.key,
|
|
49
|
+
value: f.value,
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=knowledge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../../src/brain/tasks/knowledge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmBH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAwB,EACxB,cAAsB,EACtB,MAAc;IAEd,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAChC;;;;;;;;;;;;;;;;;mFAiB+E,EAC/E,CAAC;YACC,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,WAAW,MAAM,oBAAoB,cAAc,EAAE;SAC/D,CAAC,EACF,SAAS,EACT,GAAG,CACJ,CAAC;IAEF,IAAI,CAAC;QACH,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QAEtC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QACxE,OAAO,MAAM;aACV,MAAM,CAAC,CAAC,CAA0B,EAAE,EAAE,CACrC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAc,CAAC;YACjC,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;YACzB,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAC5B;aACA,GAAG,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC;YACpC,IAAI,EAAE,CAAC,CAAC,IAAmD;YAC3D,GAAG,EAAE,CAAC,CAAC,GAAa;YACpB,KAAK,EAAE,CAAC,CAAC,KAAe;SACzB,CAAC,CAAC,CAAC;IACR,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Link-scout task for the Brain decision engine: given a goal and a ranked set
|
|
3
|
+
* of deterministic link candidates, asks a cheap scout model to pick the single
|
|
4
|
+
* best next visible link (with a deterministic top-candidate fallback on parse
|
|
5
|
+
* failure).
|
|
6
|
+
*
|
|
7
|
+
* Extracted from brain/index.ts via the delegate + host-interface pattern.
|
|
8
|
+
* Brain.recommendLinkCandidate keeps a thin delegator; the body lives here
|
|
9
|
+
* verbatim and reads Brain state through {@link BrainLinkScoutHost}, which Brain
|
|
10
|
+
* `implements` so tsc proves the host surface is complete.
|
|
11
|
+
*/
|
|
12
|
+
import type { ModelMessage, SystemModelMessage } from 'ai';
|
|
13
|
+
import type { PageState } from '../../types.js';
|
|
14
|
+
import type { LinkScoutRecommendation, UserContent } from '../types.js';
|
|
15
|
+
import type { BrainProvider, ModelSelection, GenerateResult } from '../model-client.js';
|
|
16
|
+
/**
|
|
17
|
+
* The slice of Brain state `recommendLinkCandidate` reads. All members are
|
|
18
|
+
* public on Brain by construction; `implements BrainLinkScoutHost` makes a
|
|
19
|
+
* missing/mistyped member a compile error.
|
|
20
|
+
*/
|
|
21
|
+
export interface BrainLinkScoutHost {
|
|
22
|
+
provider: BrainProvider;
|
|
23
|
+
modelName: string;
|
|
24
|
+
navProvider?: BrainProvider;
|
|
25
|
+
navModelName?: string;
|
|
26
|
+
scoutProvider?: BrainProvider;
|
|
27
|
+
scoutModelName?: string;
|
|
28
|
+
scoutUseVision: boolean;
|
|
29
|
+
buildUserContent(text: string, screenshot?: string, forceVision?: boolean): UserContent;
|
|
30
|
+
generate(system: string | SystemModelMessage[], messages: ModelMessage[], selection?: ModelSelection, maxOutputTokens?: number): Promise<GenerateResult>;
|
|
31
|
+
}
|
|
32
|
+
export declare function recommendLinkCandidateImpl(self: BrainLinkScoutHost, goal: string, state: PageState, candidates: Array<{
|
|
33
|
+
ref: string;
|
|
34
|
+
text: string;
|
|
35
|
+
score: number;
|
|
36
|
+
}>, extraContext?: string): Promise<LinkScoutRecommendation>;
|
|
37
|
+
//# sourceMappingURL=link-scout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-scout.d.ts","sourceRoot":"","sources":["../../../src/brain/tasks/link-scout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAExF;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,aAAa,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IACxF,QAAQ,CACN,MAAM,EAAE,MAAM,GAAG,kBAAkB,EAAE,EACrC,QAAQ,EAAE,YAAY,EAAE,EACxB,SAAS,CAAC,EAAE,cAAc,EAC1B,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,cAAc,CAAC,CAAC;CAC5B;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAC/D,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,uBAAuB,CAAC,CAoElC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Link-scout task for the Brain decision engine: given a goal and a ranked set
|
|
3
|
+
* of deterministic link candidates, asks a cheap scout model to pick the single
|
|
4
|
+
* best next visible link (with a deterministic top-candidate fallback on parse
|
|
5
|
+
* failure).
|
|
6
|
+
*
|
|
7
|
+
* Extracted from brain/index.ts via the delegate + host-interface pattern.
|
|
8
|
+
* Brain.recommendLinkCandidate keeps a thin delegator; the body lives here
|
|
9
|
+
* verbatim and reads Brain state through {@link BrainLinkScoutHost}, which Brain
|
|
10
|
+
* `implements` so tsc proves the host surface is complete.
|
|
11
|
+
*/
|
|
12
|
+
import { LINK_SCOUT_PROMPT } from '../prompts.js';
|
|
13
|
+
export async function recommendLinkCandidateImpl(self, goal, state, candidates, extraContext) {
|
|
14
|
+
const topCandidates = candidates.slice(0, 5);
|
|
15
|
+
// Scout only needs candidates + context, not the full snapshot (saves 2-8k tokens)
|
|
16
|
+
const lines = [
|
|
17
|
+
`GOAL: ${goal}`,
|
|
18
|
+
'',
|
|
19
|
+
`PAGE: ${state.url} — ${state.title}`,
|
|
20
|
+
'',
|
|
21
|
+
'CANDIDATES:',
|
|
22
|
+
...topCandidates.map((candidate, index) => `${index + 1}. ${candidate.ref} — ${candidate.text} (score ${candidate.score})`),
|
|
23
|
+
];
|
|
24
|
+
if (extraContext) {
|
|
25
|
+
lines.push('', extraContext);
|
|
26
|
+
}
|
|
27
|
+
lines.push('', 'Choose the single best next visible link.');
|
|
28
|
+
const userContent = self.buildUserContent(lines.join('\n'), state.screenshot, self.scoutUseVision);
|
|
29
|
+
const provider = self.scoutProvider || self.navProvider || self.provider;
|
|
30
|
+
const model = self.scoutModelName || self.navModelName || self.modelName;
|
|
31
|
+
const result = await self.generate(LINK_SCOUT_PROMPT, [{ role: 'user', content: userContent }], { provider, model }, 300);
|
|
32
|
+
const raw = result.text;
|
|
33
|
+
const tokensUsed = result.tokensUsed;
|
|
34
|
+
try {
|
|
35
|
+
let text = raw.trim();
|
|
36
|
+
if (text.startsWith('```')) {
|
|
37
|
+
text = text.replace(/^```(?:json)?\n?/, '').replace(/\n?```$/, '');
|
|
38
|
+
}
|
|
39
|
+
const parsed = JSON.parse(text);
|
|
40
|
+
const selector = typeof parsed.selector === 'string' ? parsed.selector.trim() : '';
|
|
41
|
+
const candidate = topCandidates.find((entry) => entry.ref === selector);
|
|
42
|
+
if (!candidate) {
|
|
43
|
+
throw new Error('invalid scout selector');
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
selector,
|
|
47
|
+
reasoning: typeof parsed.reasoning === 'string' ? parsed.reasoning : 'No scout reasoning provided.',
|
|
48
|
+
confidence: typeof parsed.confidence === 'number'
|
|
49
|
+
? Math.max(0, Math.min(1, parsed.confidence))
|
|
50
|
+
: 0.5,
|
|
51
|
+
raw,
|
|
52
|
+
tokensUsed,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
const fallback = topCandidates[0];
|
|
57
|
+
if (!fallback) {
|
|
58
|
+
throw new Error('recommendLinkCandidate requires at least one candidate');
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
selector: fallback.ref,
|
|
62
|
+
reasoning: 'Scout fallback: selected the top deterministic candidate after parse failure.',
|
|
63
|
+
confidence: 0.5,
|
|
64
|
+
raw,
|
|
65
|
+
tokensUsed,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=link-scout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-scout.js","sourceRoot":"","sources":["../../../src/brain/tasks/link-scout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public result types for the LLM decision engine plus the internal
|
|
3
|
+
* UserContent shape. BrainDecision/QualityEvaluation/LinkScoutRecommendation are
|
|
4
|
+
* re-exported from brain/index.ts so existing import paths stay valid.
|
|
5
|
+
*/
|
|
6
|
+
import type { Action } from '../types.js';
|
|
7
|
+
export interface BrainDecision {
|
|
8
|
+
action: Action;
|
|
9
|
+
nextActions?: Action[];
|
|
10
|
+
raw: string;
|
|
11
|
+
reasoning?: string;
|
|
12
|
+
plan?: string[];
|
|
13
|
+
currentStep?: number;
|
|
14
|
+
expectedEffect?: string;
|
|
15
|
+
tokensUsed?: number;
|
|
16
|
+
inputTokens?: number;
|
|
17
|
+
outputTokens?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Prompt-cache hit tokens (provider-agnostic). Reads from the AI SDK's
|
|
20
|
+
* unified `usage.inputTokenDetails.cacheReadTokens` field. Populated by:
|
|
21
|
+
* - OpenAI / ZAI / GLM via automatic server-side caching
|
|
22
|
+
* - Anthropic via the cache_control markers set in buildSystemForDecide
|
|
23
|
+
*/
|
|
24
|
+
cacheReadInputTokens?: number;
|
|
25
|
+
/** Prompt-cache write tokens (cache miss, first turn — provider-agnostic) */
|
|
26
|
+
cacheCreationInputTokens?: number;
|
|
27
|
+
/** Which model handled this decision (for cost tracking with adaptive routing) */
|
|
28
|
+
modelUsed?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface QualityEvaluation {
|
|
31
|
+
score: number;
|
|
32
|
+
assessment: string;
|
|
33
|
+
strengths: string[];
|
|
34
|
+
issues: string[];
|
|
35
|
+
suggestions: string[];
|
|
36
|
+
raw: string;
|
|
37
|
+
tokensUsed?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface LinkScoutRecommendation {
|
|
40
|
+
selector: string;
|
|
41
|
+
reasoning: string;
|
|
42
|
+
confidence: number;
|
|
43
|
+
raw: string;
|
|
44
|
+
tokensUsed?: number;
|
|
45
|
+
}
|
|
46
|
+
/** User message content — text-only or multimodal with screenshot */
|
|
47
|
+
export type UserContent = string | Array<{
|
|
48
|
+
type: 'text';
|
|
49
|
+
text: string;
|
|
50
|
+
} | {
|
|
51
|
+
type: 'image';
|
|
52
|
+
image: string;
|
|
53
|
+
mediaType: string;
|
|
54
|
+
}>;
|
|
55
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/brain/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,6EAA6E;IAC7E,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qEAAqE;AACrE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public result types for the LLM decision engine plus the internal
|
|
3
|
+
* UserContent shape. BrainDecision/QualityEvaluation/LinkScoutRecommendation are
|
|
4
|
+
* re-exported from brain/index.ts so existing import paths stay valid.
|
|
5
|
+
*/
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/brain/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stealth fingerprint patches injected into every Playwright-controlled
|
|
3
|
+
* context (never into real user browsers reached over CDP). Overrides the
|
|
4
|
+
* automation tells that anti-bot vendors fingerprint: navigator.webdriver,
|
|
5
|
+
* empty plugin/mimetype lists, headless WebGL vendor strings, the CDP
|
|
6
|
+
* screenX/screenY bug, missing navigator.connection, canvas readback, etc.
|
|
7
|
+
*/
|
|
8
|
+
export declare const STEALTH_INIT_SCRIPT = "\n // navigator.webdriver \u2014 explicit override (backup for --disable-blink-features)\n Object.defineProperty(navigator, 'webdriver', { get: () => undefined });\n // navigator.plugins \u2014 empty in headless, non-empty in real browsers\n Object.defineProperty(navigator, 'plugins', {\n get: () => [\n { name: 'Chrome PDF Plugin', filename: 'internal-pdf-viewer', description: 'Portable Document Format' },\n { name: 'Chrome PDF Viewer', filename: 'mhjfbmdgcfjbbpaeojofohoefgiehjai', description: '' },\n { name: 'Native Client', filename: 'internal-nacl-plugin', description: '' },\n ],\n });\n // navigator.languages \u2014 must match Accept-Language header\n Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] });\n // hardware signals \u2014 realistic desktop values\n Object.defineProperty(navigator, 'hardwareConcurrency', { get: () => 8 });\n Object.defineProperty(navigator, 'deviceMemory', { get: () => 8 });\n // window.chrome \u2014 full stub matching real Chrome\n if (!window.chrome) window.chrome = {};\n if (!window.chrome.runtime) window.chrome.runtime = { id: undefined };\n if (!window.chrome.app) window.chrome.app = { isInstalled: false, InstallState: { DISABLED: 'disabled', INSTALLED: 'installed', NOT_INSTALLED: 'not_installed' }, RunningState: { CANNOT_RUN: 'cannot_run', READY_TO_RUN: 'ready_to_run', RUNNING: 'running' } };\n if (!window.chrome.csi) window.chrome.csi = function() { return { onloadT: Date.now(), startE: Date.now(), pageT: Date.now() - performance.timing.navigationStart }; };\n if (!window.chrome.loadTimes) window.chrome.loadTimes = function() { return { commitLoadTime: Date.now() / 1000, connectionInfo: 'h2', finishDocumentLoadTime: Date.now() / 1000, finishLoadTime: Date.now() / 1000, firstPaintAfterLoadTime: 0, firstPaintTime: Date.now() / 1000, navigationType: 'Other', npnNegotiatedProtocol: 'h2', requestTime: Date.now() / 1000 - 0.16, startLoadTime: Date.now() / 1000 - 0.16, wasAlternateProtocolAvailable: false, wasFetchedViaSpdy: true, wasNpnNegotiated: true }; };\n // WebGL vendor/renderer \u2014 match real GPU values\n try {\n const getParameter = WebGLRenderingContext.prototype.getParameter;\n WebGLRenderingContext.prototype.getParameter = function(parameter) {\n if (parameter === 37445) return 'Intel Inc.';\n if (parameter === 37446) return 'Intel Iris OpenGL Engine';\n return getParameter.call(this, parameter);\n };\n } catch (_) {}\n try {\n const getParameter2 = WebGL2RenderingContext.prototype.getParameter;\n WebGL2RenderingContext.prototype.getParameter = function(parameter) {\n if (parameter === 37445) return 'Intel Inc.';\n if (parameter === 37446) return 'Intel Iris OpenGL Engine';\n return getParameter2.call(this, parameter);\n };\n } catch (_) {}\n // window.outerWidth/outerHeight \u2014 0 in headless, match viewport in real browsers\n if (window.outerWidth === 0) Object.defineProperty(window, 'outerWidth', { get: () => window.innerWidth });\n if (window.outerHeight === 0) Object.defineProperty(window, 'outerHeight', { get: () => window.innerHeight + 85 });\n // Patch permissions API \u2014 cover all permission types bots commonly mis-handle\n try {\n const origQuery = navigator.permissions.query.bind(navigator.permissions);\n navigator.permissions.query = (params) => {\n const deny = ['notifications', 'geolocation', 'camera', 'microphone', 'payment-handler'];\n if (deny.includes(params.name))\n return Promise.resolve({ state: 'denied', onchange: null });\n return origQuery(params);\n };\n } catch (_) {}\n // Canvas fingerprint noise \u2014 add imperceptible per-session noise to canvas readback\n // so each session produces a unique fingerprint (defeats static fingerprint matching)\n try {\n const seed = Math.random() * 0xffff | 0;\n const noisify = (canvas) => {\n try {\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n const { width: w, height: h } = canvas;\n if (w === 0 || h === 0) return;\n const img = ctx.getImageData(0, 0, w, h);\n const d = img.data;\n for (let i = 0; i < d.length; i += 4) {\n // deterministic per-pixel noise from seed + position\n d[i] = d[i] ^ ((seed + i) & 1);\n }\n ctx.putImageData(img, 0, 0);\n } catch (_) {}\n };\n const origToDataURL = HTMLCanvasElement.prototype.toDataURL;\n HTMLCanvasElement.prototype.toDataURL = function(...args) {\n noisify(this);\n return origToDataURL.apply(this, args);\n };\n const origToBlob = HTMLCanvasElement.prototype.toBlob;\n HTMLCanvasElement.prototype.toBlob = function(...args) {\n noisify(this);\n return origToBlob.apply(this, args);\n };\n } catch (_) {}\n // Fix CDP screenX/screenY bug \u2014 CDP Input.dispatchMouseEvent sets\n // screenX=clientX, screenY=clientY which never happens in real browsers.\n // Cloudflare Turnstile actively checks this. Add a per-session window\n // offset so screenX/screenY are realistic and internally consistent.\n try {\n const winX = Math.floor(Math.random() * 200) + 50;\n const winY = Math.floor(Math.random() * 100) + 50;\n const chrome = 85;\n Object.defineProperty(MouseEvent.prototype, 'screenX', {\n get() { return this.clientX + winX; },\n configurable: true,\n });\n Object.defineProperty(MouseEvent.prototype, 'screenY', {\n get() { return this.clientY + winY + chrome; },\n configurable: true,\n });\n } catch (_) {}\n // navigator.connection \u2014 missing in headless, present in real Chrome\n try {\n if (!navigator.connection) {\n Object.defineProperty(navigator, 'connection', {\n get: () => ({\n effectiveType: '4g',\n rtt: 50,\n downlink: 10,\n saveData: false,\n onchange: null,\n }),\n });\n }\n } catch (_) {}\n // Notification.permission \u2014 default differs in headless\n try {\n if (typeof Notification !== 'undefined' && Notification.permission === 'default') {\n Object.defineProperty(Notification, 'permission', { get: () => 'denied' });\n }\n } catch (_) {}\n ";
|
|
9
|
+
//# sourceMappingURL=stealth-init-script.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stealth-init-script.d.ts","sourceRoot":"","sources":["../../src/browser/stealth-init-script.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,m0NAuHzB,CAAC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stealth fingerprint patches injected into every Playwright-controlled
|
|
3
|
+
* context (never into real user browsers reached over CDP). Overrides the
|
|
4
|
+
* automation tells that anti-bot vendors fingerprint: navigator.webdriver,
|
|
5
|
+
* empty plugin/mimetype lists, headless WebGL vendor strings, the CDP
|
|
6
|
+
* screenX/screenY bug, missing navigator.connection, canvas readback, etc.
|
|
7
|
+
*/
|
|
8
|
+
export const STEALTH_INIT_SCRIPT = `
|
|
9
|
+
// navigator.webdriver — explicit override (backup for --disable-blink-features)
|
|
10
|
+
Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
|
|
11
|
+
// navigator.plugins — empty in headless, non-empty in real browsers
|
|
12
|
+
Object.defineProperty(navigator, 'plugins', {
|
|
13
|
+
get: () => [
|
|
14
|
+
{ name: 'Chrome PDF Plugin', filename: 'internal-pdf-viewer', description: 'Portable Document Format' },
|
|
15
|
+
{ name: 'Chrome PDF Viewer', filename: 'mhjfbmdgcfjbbpaeojofohoefgiehjai', description: '' },
|
|
16
|
+
{ name: 'Native Client', filename: 'internal-nacl-plugin', description: '' },
|
|
17
|
+
],
|
|
18
|
+
});
|
|
19
|
+
// navigator.languages — must match Accept-Language header
|
|
20
|
+
Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] });
|
|
21
|
+
// hardware signals — realistic desktop values
|
|
22
|
+
Object.defineProperty(navigator, 'hardwareConcurrency', { get: () => 8 });
|
|
23
|
+
Object.defineProperty(navigator, 'deviceMemory', { get: () => 8 });
|
|
24
|
+
// window.chrome — full stub matching real Chrome
|
|
25
|
+
if (!window.chrome) window.chrome = {};
|
|
26
|
+
if (!window.chrome.runtime) window.chrome.runtime = { id: undefined };
|
|
27
|
+
if (!window.chrome.app) window.chrome.app = { isInstalled: false, InstallState: { DISABLED: 'disabled', INSTALLED: 'installed', NOT_INSTALLED: 'not_installed' }, RunningState: { CANNOT_RUN: 'cannot_run', READY_TO_RUN: 'ready_to_run', RUNNING: 'running' } };
|
|
28
|
+
if (!window.chrome.csi) window.chrome.csi = function() { return { onloadT: Date.now(), startE: Date.now(), pageT: Date.now() - performance.timing.navigationStart }; };
|
|
29
|
+
if (!window.chrome.loadTimes) window.chrome.loadTimes = function() { return { commitLoadTime: Date.now() / 1000, connectionInfo: 'h2', finishDocumentLoadTime: Date.now() / 1000, finishLoadTime: Date.now() / 1000, firstPaintAfterLoadTime: 0, firstPaintTime: Date.now() / 1000, navigationType: 'Other', npnNegotiatedProtocol: 'h2', requestTime: Date.now() / 1000 - 0.16, startLoadTime: Date.now() / 1000 - 0.16, wasAlternateProtocolAvailable: false, wasFetchedViaSpdy: true, wasNpnNegotiated: true }; };
|
|
30
|
+
// WebGL vendor/renderer — match real GPU values
|
|
31
|
+
try {
|
|
32
|
+
const getParameter = WebGLRenderingContext.prototype.getParameter;
|
|
33
|
+
WebGLRenderingContext.prototype.getParameter = function(parameter) {
|
|
34
|
+
if (parameter === 37445) return 'Intel Inc.';
|
|
35
|
+
if (parameter === 37446) return 'Intel Iris OpenGL Engine';
|
|
36
|
+
return getParameter.call(this, parameter);
|
|
37
|
+
};
|
|
38
|
+
} catch (_) {}
|
|
39
|
+
try {
|
|
40
|
+
const getParameter2 = WebGL2RenderingContext.prototype.getParameter;
|
|
41
|
+
WebGL2RenderingContext.prototype.getParameter = function(parameter) {
|
|
42
|
+
if (parameter === 37445) return 'Intel Inc.';
|
|
43
|
+
if (parameter === 37446) return 'Intel Iris OpenGL Engine';
|
|
44
|
+
return getParameter2.call(this, parameter);
|
|
45
|
+
};
|
|
46
|
+
} catch (_) {}
|
|
47
|
+
// window.outerWidth/outerHeight — 0 in headless, match viewport in real browsers
|
|
48
|
+
if (window.outerWidth === 0) Object.defineProperty(window, 'outerWidth', { get: () => window.innerWidth });
|
|
49
|
+
if (window.outerHeight === 0) Object.defineProperty(window, 'outerHeight', { get: () => window.innerHeight + 85 });
|
|
50
|
+
// Patch permissions API — cover all permission types bots commonly mis-handle
|
|
51
|
+
try {
|
|
52
|
+
const origQuery = navigator.permissions.query.bind(navigator.permissions);
|
|
53
|
+
navigator.permissions.query = (params) => {
|
|
54
|
+
const deny = ['notifications', 'geolocation', 'camera', 'microphone', 'payment-handler'];
|
|
55
|
+
if (deny.includes(params.name))
|
|
56
|
+
return Promise.resolve({ state: 'denied', onchange: null });
|
|
57
|
+
return origQuery(params);
|
|
58
|
+
};
|
|
59
|
+
} catch (_) {}
|
|
60
|
+
// Canvas fingerprint noise — add imperceptible per-session noise to canvas readback
|
|
61
|
+
// so each session produces a unique fingerprint (defeats static fingerprint matching)
|
|
62
|
+
try {
|
|
63
|
+
const seed = Math.random() * 0xffff | 0;
|
|
64
|
+
const noisify = (canvas) => {
|
|
65
|
+
try {
|
|
66
|
+
const ctx = canvas.getContext('2d');
|
|
67
|
+
if (!ctx) return;
|
|
68
|
+
const { width: w, height: h } = canvas;
|
|
69
|
+
if (w === 0 || h === 0) return;
|
|
70
|
+
const img = ctx.getImageData(0, 0, w, h);
|
|
71
|
+
const d = img.data;
|
|
72
|
+
for (let i = 0; i < d.length; i += 4) {
|
|
73
|
+
// deterministic per-pixel noise from seed + position
|
|
74
|
+
d[i] = d[i] ^ ((seed + i) & 1);
|
|
75
|
+
}
|
|
76
|
+
ctx.putImageData(img, 0, 0);
|
|
77
|
+
} catch (_) {}
|
|
78
|
+
};
|
|
79
|
+
const origToDataURL = HTMLCanvasElement.prototype.toDataURL;
|
|
80
|
+
HTMLCanvasElement.prototype.toDataURL = function(...args) {
|
|
81
|
+
noisify(this);
|
|
82
|
+
return origToDataURL.apply(this, args);
|
|
83
|
+
};
|
|
84
|
+
const origToBlob = HTMLCanvasElement.prototype.toBlob;
|
|
85
|
+
HTMLCanvasElement.prototype.toBlob = function(...args) {
|
|
86
|
+
noisify(this);
|
|
87
|
+
return origToBlob.apply(this, args);
|
|
88
|
+
};
|
|
89
|
+
} catch (_) {}
|
|
90
|
+
// Fix CDP screenX/screenY bug — CDP Input.dispatchMouseEvent sets
|
|
91
|
+
// screenX=clientX, screenY=clientY which never happens in real browsers.
|
|
92
|
+
// Cloudflare Turnstile actively checks this. Add a per-session window
|
|
93
|
+
// offset so screenX/screenY are realistic and internally consistent.
|
|
94
|
+
try {
|
|
95
|
+
const winX = Math.floor(Math.random() * 200) + 50;
|
|
96
|
+
const winY = Math.floor(Math.random() * 100) + 50;
|
|
97
|
+
const chrome = 85;
|
|
98
|
+
Object.defineProperty(MouseEvent.prototype, 'screenX', {
|
|
99
|
+
get() { return this.clientX + winX; },
|
|
100
|
+
configurable: true,
|
|
101
|
+
});
|
|
102
|
+
Object.defineProperty(MouseEvent.prototype, 'screenY', {
|
|
103
|
+
get() { return this.clientY + winY + chrome; },
|
|
104
|
+
configurable: true,
|
|
105
|
+
});
|
|
106
|
+
} catch (_) {}
|
|
107
|
+
// navigator.connection — missing in headless, present in real Chrome
|
|
108
|
+
try {
|
|
109
|
+
if (!navigator.connection) {
|
|
110
|
+
Object.defineProperty(navigator, 'connection', {
|
|
111
|
+
get: () => ({
|
|
112
|
+
effectiveType: '4g',
|
|
113
|
+
rtt: 50,
|
|
114
|
+
downlink: 10,
|
|
115
|
+
saveData: false,
|
|
116
|
+
onchange: null,
|
|
117
|
+
}),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
} catch (_) {}
|
|
121
|
+
// Notification.permission — default differs in headless
|
|
122
|
+
try {
|
|
123
|
+
if (typeof Notification !== 'undefined' && Notification.permission === 'default') {
|
|
124
|
+
Object.defineProperty(Notification, 'permission', { get: () => 'denied' });
|
|
125
|
+
}
|
|
126
|
+
} catch (_) {}
|
|
127
|
+
`;
|
|
128
|
+
//# sourceMappingURL=stealth-init-script.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stealth-init-script.js","sourceRoot":"","sources":["../../src/browser/stealth-init-script.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAuH5B,CAAC"}
|