@tangle-network/browser-agent-driver 0.33.3 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -1
- package/discovery/llms.txt +27 -0
- package/discovery/tangle-agent.json +36 -0
- package/dist/brain/action-parse.d.ts +16 -0
- package/dist/brain/action-parse.d.ts.map +1 -0
- package/dist/brain/action-parse.js +191 -0
- package/dist/brain/action-parse.js.map +1 -0
- package/dist/brain/decide.d.ts +58 -0
- package/dist/brain/decide.d.ts.map +1 -0
- package/dist/brain/decide.js +418 -0
- package/dist/brain/decide.js.map +1 -0
- package/dist/brain/history-compact.d.ts +19 -0
- package/dist/brain/history-compact.d.ts.map +1 -0
- package/dist/brain/history-compact.js +153 -0
- package/dist/brain/history-compact.js.map +1 -0
- package/dist/brain/index.d.ts +78 -152
- package/dist/brain/index.d.ts.map +1 -1
- package/dist/brain/index.js +62 -2268
- package/dist/brain/index.js.map +1 -1
- package/dist/brain/model-client.d.ts +101 -0
- package/dist/brain/model-client.d.ts.map +1 -0
- package/dist/brain/model-client.js +391 -0
- package/dist/brain/model-client.js.map +1 -0
- package/dist/brain/plan.d.ts +57 -0
- package/dist/brain/plan.d.ts.map +1 -0
- package/dist/brain/plan.js +194 -0
- package/dist/brain/plan.js.map +1 -0
- package/dist/brain/prompts.d.ts +37 -0
- package/dist/brain/prompts.d.ts.map +1 -0
- package/dist/brain/prompts.js +455 -0
- package/dist/brain/prompts.js.map +1 -0
- package/dist/brain/provider-fetch.d.ts +26 -0
- package/dist/brain/provider-fetch.d.ts.map +1 -0
- package/dist/brain/provider-fetch.js +45 -0
- package/dist/brain/provider-fetch.js.map +1 -0
- package/dist/brain/snapshot-budget.d.ts +20 -0
- package/dist/brain/snapshot-budget.d.ts.map +1 -0
- package/dist/brain/snapshot-budget.js +202 -0
- package/dist/brain/snapshot-budget.js.map +1 -0
- package/dist/brain/system-prompt.d.ts +67 -0
- package/dist/brain/system-prompt.d.ts.map +1 -0
- package/dist/brain/system-prompt.js +128 -0
- package/dist/brain/system-prompt.js.map +1 -0
- package/dist/brain/tasks/design-audit.d.ts +33 -0
- package/dist/brain/tasks/design-audit.d.ts.map +1 -0
- package/dist/brain/tasks/design-audit.js +100 -0
- package/dist/brain/tasks/design-audit.js.map +1 -0
- package/dist/brain/tasks/evaluate.d.ts +25 -0
- package/dist/brain/tasks/evaluate.d.ts.map +1 -0
- package/dist/brain/tasks/evaluate.js +55 -0
- package/dist/brain/tasks/evaluate.js.map +1 -0
- package/dist/brain/tasks/goal-verification.d.ts +32 -0
- package/dist/brain/tasks/goal-verification.d.ts.map +1 -0
- package/dist/brain/tasks/goal-verification.js +68 -0
- package/dist/brain/tasks/goal-verification.js.map +1 -0
- package/dist/brain/tasks/knowledge.d.ts +26 -0
- package/dist/brain/tasks/knowledge.d.ts.map +1 -0
- package/dist/brain/tasks/knowledge.js +56 -0
- package/dist/brain/tasks/knowledge.js.map +1 -0
- package/dist/brain/tasks/link-scout.d.ts +37 -0
- package/dist/brain/tasks/link-scout.d.ts.map +1 -0
- package/dist/brain/tasks/link-scout.js +69 -0
- package/dist/brain/tasks/link-scout.js.map +1 -0
- package/dist/brain/types.d.ts +55 -0
- package/dist/brain/types.d.ts.map +1 -0
- package/dist/brain/types.js +7 -0
- package/dist/brain/types.js.map +1 -0
- package/dist/browser/stealth-init-script.d.ts +9 -0
- package/dist/browser/stealth-init-script.d.ts.map +1 -0
- package/dist/browser/stealth-init-script.js +128 -0
- package/dist/browser/stealth-init-script.js.map +1 -0
- package/dist/browser/storage-state.d.ts +29 -0
- package/dist/browser/storage-state.d.ts.map +1 -0
- package/dist/browser/storage-state.js +47 -0
- package/dist/browser/storage-state.js.map +1 -0
- package/dist/cli/args.d.ts +141 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +167 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/benchmark-sync.d.ts +9 -0
- package/dist/cli/benchmark-sync.d.ts.map +1 -0
- package/dist/cli/benchmark-sync.js +43 -0
- package/dist/cli/benchmark-sync.js.map +1 -0
- package/dist/cli/build-config.d.ts +11 -0
- package/dist/cli/build-config.d.ts.map +1 -0
- package/dist/cli/build-config.js +355 -0
- package/dist/cli/build-config.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +3 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +36 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/chrome-debug.d.ts +7 -0
- package/dist/cli/commands/chrome-debug.d.ts.map +1 -0
- package/dist/cli/commands/chrome-debug.js +11 -0
- package/dist/cli/commands/chrome-debug.js.map +1 -0
- package/dist/cli/commands/design-audit.d.ts +3 -0
- package/dist/cli/commands/design-audit.d.ts.map +1 -0
- package/dist/cli/commands/design-audit.js +68 -0
- package/dist/cli/commands/design-audit.js.map +1 -0
- package/dist/cli/commands/preview.d.ts +14 -0
- package/dist/cli/commands/preview.d.ts.map +1 -0
- package/dist/cli/commands/preview.js +31 -0
- package/dist/cli/commands/preview.js.map +1 -0
- package/dist/cli/commands/run.d.ts +3 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +728 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/runs.d.ts +8 -0
- package/dist/cli/commands/runs.d.ts.map +1 -0
- package/dist/cli/commands/runs.js +35 -0
- package/dist/cli/commands/runs.js.map +1 -0
- package/dist/cli/commands/share.d.ts +10 -0
- package/dist/cli/commands/share.d.ts.map +1 -0
- package/dist/cli/commands/share.js +32 -0
- package/dist/cli/commands/share.js.map +1 -0
- package/dist/cli/commands/showcase.d.ts +17 -0
- package/dist/cli/commands/showcase.d.ts.map +1 -0
- package/dist/cli/commands/showcase.js +20 -0
- package/dist/cli/commands/showcase.js.map +1 -0
- package/dist/cli/commands/snapshot.d.ts +12 -0
- package/dist/cli/commands/snapshot.d.ts.map +1 -0
- package/dist/cli/commands/snapshot.js +24 -0
- package/dist/cli/commands/snapshot.js.map +1 -0
- package/dist/cli/commands/view.d.ts +7 -0
- package/dist/cli/commands/view.d.ts.map +1 -0
- package/dist/cli/commands/view.js +23 -0
- package/dist/cli/commands/view.js.map +1 -0
- package/dist/cli/constants.d.ts +6 -0
- package/dist/cli/constants.d.ts.map +1 -0
- package/dist/cli/constants.js +3 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/version.d.ts +7 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +16 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/cli-design-audit.d.ts +44 -36
- package/dist/cli-design-audit.d.ts.map +1 -1
- package/dist/cli-design-audit.js +137 -1646
- package/dist/cli-design-audit.js.map +1 -1
- package/dist/cli-jobs.js +2 -1
- package/dist/cli-jobs.js.map +1 -1
- package/dist/cli.js +66 -1697
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -0
- package/dist/config.js.map +1 -1
- package/dist/design/audit/evolve/agent.d.ts +23 -0
- package/dist/design/audit/evolve/agent.d.ts.map +1 -0
- package/dist/design/audit/evolve/agent.js +272 -0
- package/dist/design/audit/evolve/agent.js.map +1 -0
- package/dist/design/audit/evolve/css.d.ts +10 -0
- package/dist/design/audit/evolve/css.d.ts.map +1 -0
- package/dist/design/audit/evolve/css.js +206 -0
- package/dist/design/audit/evolve/css.js.map +1 -0
- package/dist/design/audit/evolve/index.d.ts +13 -0
- package/dist/design/audit/evolve/index.d.ts.map +1 -0
- package/dist/design/audit/evolve/index.js +12 -0
- package/dist/design/audit/evolve/index.js.map +1 -0
- package/dist/design/audit/evolve/report.d.ts +3 -0
- package/dist/design/audit/evolve/report.d.ts.map +1 -0
- package/dist/design/audit/evolve/report.js +45 -0
- package/dist/design/audit/evolve/report.js.map +1 -0
- package/dist/design/audit/evolve/types.d.ts +14 -0
- package/dist/design/audit/evolve/types.d.ts.map +1 -0
- package/dist/design/audit/evolve/types.js +2 -0
- package/dist/design/audit/evolve/types.js.map +1 -0
- package/dist/design/audit/pipeline.d.ts +12 -0
- package/dist/design/audit/pipeline.d.ts.map +1 -1
- package/dist/design/audit/pipeline.js +43 -27
- package/dist/design/audit/pipeline.js.map +1 -1
- package/dist/design/audit/reference/artifact/build.d.ts +33 -0
- package/dist/design/audit/reference/artifact/build.d.ts.map +1 -0
- package/dist/design/audit/reference/artifact/build.js +64 -0
- package/dist/design/audit/reference/artifact/build.js.map +1 -0
- package/dist/design/audit/reference/artifact/render.d.ts +39 -0
- package/dist/design/audit/reference/artifact/render.d.ts.map +1 -0
- package/dist/design/audit/reference/artifact/render.js +213 -0
- package/dist/design/audit/reference/artifact/render.js.map +1 -0
- package/dist/design/audit/reference/artifact/text.d.ts +11 -0
- package/dist/design/audit/reference/artifact/text.d.ts.map +1 -0
- package/dist/design/audit/reference/artifact/text.js +20 -0
- package/dist/design/audit/reference/artifact/text.js.map +1 -0
- package/dist/design/audit/reference/artifact/to-findings.d.ts +57 -0
- package/dist/design/audit/reference/artifact/to-findings.d.ts.map +1 -0
- package/dist/design/audit/reference/artifact/to-findings.js +314 -0
- package/dist/design/audit/reference/artifact/to-findings.js.map +1 -0
- package/dist/design/audit/reference/config.d.ts +50 -0
- package/dist/design/audit/reference/config.d.ts.map +1 -0
- package/dist/design/audit/reference/config.js +108 -0
- package/dist/design/audit/reference/config.js.map +1 -0
- package/dist/design/audit/reference/contracts.d.ts +1030 -0
- package/dist/design/audit/reference/contracts.d.ts.map +1 -0
- package/dist/design/audit/reference/contracts.js +28 -0
- package/dist/design/audit/reference/contracts.js.map +1 -0
- package/dist/design/audit/reference/corpus/build.d.ts +115 -0
- package/dist/design/audit/reference/corpus/build.d.ts.map +1 -0
- package/dist/design/audit/reference/corpus/build.js +152 -0
- package/dist/design/audit/reference/corpus/build.js.map +1 -0
- package/dist/design/audit/reference/corpus/schema.d.ts +33 -0
- package/dist/design/audit/reference/corpus/schema.d.ts.map +1 -0
- package/dist/design/audit/reference/corpus/schema.js +249 -0
- package/dist/design/audit/reference/corpus/schema.js.map +1 -0
- package/dist/design/audit/reference/corpus/store.d.ts +26 -0
- package/dist/design/audit/reference/corpus/store.d.ts.map +1 -0
- package/dist/design/audit/reference/corpus/store.js +104 -0
- package/dist/design/audit/reference/corpus/store.js.map +1 -0
- package/dist/design/audit/reference/dna/delta.d.ts +21 -0
- package/dist/design/audit/reference/dna/delta.d.ts.map +1 -0
- package/dist/design/audit/reference/dna/delta.js +126 -0
- package/dist/design/audit/reference/dna/delta.js.map +1 -0
- package/dist/design/audit/reference/dna/derive.d.ts +31 -0
- package/dist/design/audit/reference/dna/derive.d.ts.map +1 -0
- package/dist/design/audit/reference/dna/derive.js +381 -0
- package/dist/design/audit/reference/dna/derive.js.map +1 -0
- package/dist/design/audit/reference/dna/descriptor.d.ts +36 -0
- package/dist/design/audit/reference/dna/descriptor.d.ts.map +1 -0
- package/dist/design/audit/reference/dna/descriptor.js +209 -0
- package/dist/design/audit/reference/dna/descriptor.js.map +1 -0
- package/dist/design/audit/reference/dna/page-adapter.d.ts +17 -0
- package/dist/design/audit/reference/dna/page-adapter.d.ts.map +1 -0
- package/dist/design/audit/reference/dna/page-adapter.js +35 -0
- package/dist/design/audit/reference/dna/page-adapter.js.map +1 -0
- package/dist/design/audit/reference/dna/scroll-capture.d.ts +93 -0
- package/dist/design/audit/reference/dna/scroll-capture.d.ts.map +1 -0
- package/dist/design/audit/reference/dna/scroll-capture.js +374 -0
- package/dist/design/audit/reference/dna/scroll-capture.js.map +1 -0
- package/dist/design/audit/reference/engine/budget.d.ts +63 -0
- package/dist/design/audit/reference/engine/budget.d.ts.map +1 -0
- package/dist/design/audit/reference/engine/budget.js +110 -0
- package/dist/design/audit/reference/engine/budget.js.map +1 -0
- package/dist/design/audit/reference/engine/core.d.ts +32 -0
- package/dist/design/audit/reference/engine/core.d.ts.map +1 -0
- package/dist/design/audit/reference/engine/core.js +261 -0
- package/dist/design/audit/reference/engine/core.js.map +1 -0
- package/dist/design/audit/reference/engine/guard.d.ts +43 -0
- package/dist/design/audit/reference/engine/guard.d.ts.map +1 -0
- package/dist/design/audit/reference/engine/guard.js +43 -0
- package/dist/design/audit/reference/engine/guard.js.map +1 -0
- package/dist/design/audit/reference/engine/score-core.d.ts +48 -0
- package/dist/design/audit/reference/engine/score-core.d.ts.map +1 -0
- package/dist/design/audit/reference/engine/score-core.js +134 -0
- package/dist/design/audit/reference/engine/score-core.js.map +1 -0
- package/dist/design/audit/reference/engine/wiring.d.ts +35 -0
- package/dist/design/audit/reference/engine/wiring.d.ts.map +1 -0
- package/dist/design/audit/reference/engine/wiring.js +80 -0
- package/dist/design/audit/reference/engine/wiring.js.map +1 -0
- package/dist/design/audit/reference/eval/taste-core.d.ts +77 -0
- package/dist/design/audit/reference/eval/taste-core.d.ts.map +1 -0
- package/dist/design/audit/reference/eval/taste-core.js +95 -0
- package/dist/design/audit/reference/eval/taste-core.js.map +1 -0
- package/dist/design/audit/reference/generate/generator.d.ts +49 -0
- package/dist/design/audit/reference/generate/generator.d.ts.map +1 -0
- package/dist/design/audit/reference/generate/generator.js +94 -0
- package/dist/design/audit/reference/generate/generator.js.map +1 -0
- package/dist/design/audit/reference/generate/parse.d.ts +28 -0
- package/dist/design/audit/reference/generate/parse.d.ts.map +1 -0
- package/dist/design/audit/reference/generate/parse.js +180 -0
- package/dist/design/audit/reference/generate/parse.js.map +1 -0
- package/dist/design/audit/reference/generate/prompt.d.ts +36 -0
- package/dist/design/audit/reference/generate/prompt.d.ts.map +1 -0
- package/dist/design/audit/reference/generate/prompt.js +124 -0
- package/dist/design/audit/reference/generate/prompt.js.map +1 -0
- package/dist/design/audit/reference/index.d.ts +26 -0
- package/dist/design/audit/reference/index.d.ts.map +1 -0
- package/dist/design/audit/reference/index.js +31 -0
- package/dist/design/audit/reference/index.js.map +1 -0
- package/dist/design/audit/reference/judge/image-clamp.d.ts +34 -0
- package/dist/design/audit/reference/judge/image-clamp.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/image-clamp.js +88 -0
- package/dist/design/audit/reference/judge/image-clamp.js.map +1 -0
- package/dist/design/audit/reference/judge/pairwise.d.ts +34 -0
- package/dist/design/audit/reference/judge/pairwise.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/pairwise.js +105 -0
- package/dist/design/audit/reference/judge/pairwise.js.map +1 -0
- package/dist/design/audit/reference/judge/parse.d.ts +31 -0
- package/dist/design/audit/reference/judge/parse.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/parse.js +113 -0
- package/dist/design/audit/reference/judge/parse.js.map +1 -0
- package/dist/design/audit/reference/judge/prompt.d.ts +38 -0
- package/dist/design/audit/reference/judge/prompt.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/prompt.js +111 -0
- package/dist/design/audit/reference/judge/prompt.js.map +1 -0
- package/dist/design/audit/reference/judge/quality.d.ts +28 -0
- package/dist/design/audit/reference/judge/quality.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/quality.js +62 -0
- package/dist/design/audit/reference/judge/quality.js.map +1 -0
- package/dist/design/audit/reference/judge/rank.d.ts +41 -0
- package/dist/design/audit/reference/judge/rank.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/rank.js +196 -0
- package/dist/design/audit/reference/judge/rank.js.map +1 -0
- package/dist/design/audit/reference/judge/text-judge.d.ts +31 -0
- package/dist/design/audit/reference/judge/text-judge.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/text-judge.js +43 -0
- package/dist/design/audit/reference/judge/text-judge.js.map +1 -0
- package/dist/design/audit/reference/judge/vision-judge.d.ts +59 -0
- package/dist/design/audit/reference/judge/vision-judge.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/vision-judge.js +150 -0
- package/dist/design/audit/reference/judge/vision-judge.js.map +1 -0
- package/dist/design/audit/reference/judge/vision-model.d.ts +65 -0
- package/dist/design/audit/reference/judge/vision-model.d.ts.map +1 -0
- package/dist/design/audit/reference/judge/vision-model.js +110 -0
- package/dist/design/audit/reference/judge/vision-model.js.map +1 -0
- package/dist/design/audit/reference/pipeline/evaluate-reference.d.ts +68 -0
- package/dist/design/audit/reference/pipeline/evaluate-reference.d.ts.map +1 -0
- package/dist/design/audit/reference/pipeline/evaluate-reference.js +52 -0
- package/dist/design/audit/reference/pipeline/evaluate-reference.js.map +1 -0
- package/dist/design/audit/reference/reference-context.d.ts +31 -0
- package/dist/design/audit/reference/reference-context.d.ts.map +1 -0
- package/dist/design/audit/reference/reference-context.js +73 -0
- package/dist/design/audit/reference/reference-context.js.map +1 -0
- package/dist/design/audit/reference/retrieval/embedding-hash.d.ts +30 -0
- package/dist/design/audit/reference/retrieval/embedding-hash.d.ts.map +1 -0
- package/dist/design/audit/reference/retrieval/embedding-hash.js +87 -0
- package/dist/design/audit/reference/retrieval/embedding-hash.js.map +1 -0
- package/dist/design/audit/reference/retrieval/embedding-openai.d.ts +38 -0
- package/dist/design/audit/reference/retrieval/embedding-openai.d.ts.map +1 -0
- package/dist/design/audit/reference/retrieval/embedding-openai.js +73 -0
- package/dist/design/audit/reference/retrieval/embedding-openai.js.map +1 -0
- package/dist/design/audit/reference/retrieval/matcher.d.ts +34 -0
- package/dist/design/audit/reference/retrieval/matcher.d.ts.map +1 -0
- package/dist/design/audit/reference/retrieval/matcher.js +107 -0
- package/dist/design/audit/reference/retrieval/matcher.js.map +1 -0
- package/dist/design/audit/reference/run.d.ts +59 -0
- package/dist/design/audit/reference/run.d.ts.map +1 -0
- package/dist/design/audit/reference/run.js +99 -0
- package/dist/design/audit/reference/run.js.map +1 -0
- package/dist/design/audit/report.d.ts +35 -0
- package/dist/design/audit/report.d.ts.map +1 -0
- package/dist/design/audit/report.js +195 -0
- package/dist/design/audit/report.js.map +1 -0
- package/dist/design/audit/tokens/extract.d.ts +71 -0
- package/dist/design/audit/tokens/extract.d.ts.map +1 -0
- package/dist/design/audit/tokens/extract.js +1034 -0
- package/dist/design/audit/tokens/extract.js.map +1 -0
- package/dist/design/audit/types.d.ts +8 -0
- package/dist/design/audit/types.d.ts.map +1 -1
- package/dist/design/compare.d.ts.map +1 -1
- package/dist/design/compare.js +2 -6
- package/dist/design/compare.js.map +1 -1
- package/dist/design/cookie-consent.d.ts +3 -0
- package/dist/design/cookie-consent.d.ts.map +1 -0
- package/dist/design/cookie-consent.js +26 -0
- package/dist/design/cookie-consent.js.map +1 -0
- package/dist/design/viewports.d.ts +18 -0
- package/dist/design/viewports.d.ts.map +1 -0
- package/dist/design/viewports.js +10 -0
- package/dist/design/viewports.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/memory/store.d.ts +19 -1
- package/dist/memory/store.d.ts.map +1 -1
- package/dist/memory/store.js +47 -0
- package/dist/memory/store.js.map +1 -1
- package/dist/provider-defaults.d.ts +18 -0
- package/dist/provider-defaults.d.ts.map +1 -1
- package/dist/provider-defaults.js +33 -0
- package/dist/provider-defaults.js.map +1 -1
- package/dist/runner/allowed-domains.d.ts +11 -0
- package/dist/runner/allowed-domains.d.ts.map +1 -0
- package/dist/runner/allowed-domains.js +14 -0
- package/dist/runner/allowed-domains.js.map +1 -0
- package/dist/runner/batch-fill.d.ts +28 -0
- package/dist/runner/batch-fill.d.ts.map +1 -0
- package/dist/runner/batch-fill.js +80 -0
- package/dist/runner/batch-fill.js.map +1 -0
- package/dist/runner/completion-policy.d.ts +26 -0
- package/dist/runner/completion-policy.d.ts.map +1 -0
- package/dist/runner/completion-policy.js +76 -0
- package/dist/runner/completion-policy.js.map +1 -0
- package/dist/runner/constants.d.ts +14 -0
- package/dist/runner/constants.d.ts.map +1 -0
- package/dist/runner/constants.js +23 -0
- package/dist/runner/constants.js.map +1 -0
- package/dist/runner/decision-screenshot.d.ts +24 -0
- package/dist/runner/decision-screenshot.d.ts.map +1 -0
- package/dist/runner/decision-screenshot.js +23 -0
- package/dist/runner/decision-screenshot.js.map +1 -0
- package/dist/runner/domain-boundary.d.ts +36 -0
- package/dist/runner/domain-boundary.d.ts.map +1 -0
- package/dist/runner/domain-boundary.js +81 -0
- package/dist/runner/domain-boundary.js.map +1 -0
- package/dist/runner/effect-verify.d.ts +28 -0
- package/dist/runner/effect-verify.d.ts.map +1 -0
- package/dist/runner/effect-verify.js +42 -0
- package/dist/runner/effect-verify.js.map +1 -0
- package/dist/runner/execute-plan.d.ts +58 -0
- package/dist/runner/execute-plan.d.ts.map +1 -0
- package/dist/runner/execute-plan.js +426 -0
- package/dist/runner/execute-plan.js.map +1 -0
- package/dist/runner/max-turns-extension.d.ts +19 -0
- package/dist/runner/max-turns-extension.d.ts.map +1 -0
- package/dist/runner/max-turns-extension.js +25 -0
- package/dist/runner/max-turns-extension.js.map +1 -0
- package/dist/runner/micro-plan.d.ts +11 -0
- package/dist/runner/micro-plan.d.ts.map +1 -0
- package/dist/runner/micro-plan.js +29 -0
- package/dist/runner/micro-plan.js.map +1 -0
- package/dist/runner/prompt-snippets.d.ts +5 -0
- package/dist/runner/prompt-snippets.d.ts.map +1 -0
- package/dist/runner/prompt-snippets.js +13 -0
- package/dist/runner/prompt-snippets.js.map +1 -0
- package/dist/runner/replay/contracts.d.ts +300 -0
- package/dist/runner/replay/contracts.d.ts.map +1 -0
- package/dist/runner/replay/contracts.js +42 -0
- package/dist/runner/replay/contracts.js.map +1 -0
- package/dist/runner/replay/controller.d.ts +27 -0
- package/dist/runner/replay/controller.d.ts.map +1 -0
- package/dist/runner/replay/controller.js +197 -0
- package/dist/runner/replay/controller.js.map +1 -0
- package/dist/runner/replay/guard.d.ts +28 -0
- package/dist/runner/replay/guard.d.ts.map +1 -0
- package/dist/runner/replay/guard.js +100 -0
- package/dist/runner/replay/guard.js.map +1 -0
- package/dist/runner/runner.d.ts +44 -51
- package/dist/runner/runner.d.ts.map +1 -1
- package/dist/runner/runner.js +155 -851
- package/dist/runner/runner.js.map +1 -1
- package/dist/runner/scout-feedback.d.ts +51 -0
- package/dist/runner/scout-feedback.d.ts.map +1 -0
- package/dist/runner/scout-feedback.js +149 -0
- package/dist/runner/scout-feedback.js.map +1 -0
- package/dist/skills/macro-loader.d.ts +1 -1
- package/dist/test-runner.d.ts.map +1 -1
- package/dist/test-runner.js +25 -0
- package/dist/test-runner.js.map +1 -1
- package/dist/types/actions.d.ts +241 -0
- package/dist/types/actions.d.ts.map +1 -0
- package/dist/types/actions.js +5 -0
- package/dist/types/actions.js.map +1 -0
- package/dist/types/config.d.ts +211 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/design-audit.d.ts +92 -0
- package/dist/types/design-audit.d.ts.map +1 -0
- package/dist/types/design-audit.js +5 -0
- package/dist/types/design-audit.js.map +1 -0
- package/dist/types/design-tokens.d.ts +138 -0
- package/dist/types/design-tokens.d.ts.map +1 -0
- package/dist/types/design-tokens.js +5 -0
- package/dist/types/design-tokens.js.map +1 -0
- package/dist/types/page.d.ts +16 -0
- package/dist/types/page.d.ts.map +1 -0
- package/dist/types/page.js +2 -0
- package/dist/types/page.js.map +1 -0
- package/dist/types/plan.d.ts +50 -0
- package/dist/types/plan.d.ts.map +1 -0
- package/dist/types/plan.js +2 -0
- package/dist/types/plan.js.map +1 -0
- package/dist/types/preview.d.ts +9 -0
- package/dist/types/preview.d.ts.map +1 -0
- package/dist/types/preview.js +5 -0
- package/dist/types/preview.js.map +1 -0
- package/dist/types/result.d.ts +62 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +2 -0
- package/dist/types/result.js.map +1 -0
- package/dist/types/scenario.d.ts +20 -0
- package/dist/types/scenario.d.ts.map +1 -0
- package/dist/types/scenario.js +5 -0
- package/dist/types/scenario.js.map +1 -0
- package/dist/types/test-runner.d.ts +145 -0
- package/dist/types/test-runner.d.ts.map +1 -0
- package/dist/types/test-runner.js +10 -0
- package/dist/types/test-runner.js.map +1 -0
- package/dist/types/trajectory.d.ts +38 -0
- package/dist/types/trajectory.d.ts.map +1 -0
- package/dist/types/trajectory.js +2 -0
- package/dist/types/trajectory.js.map +1 -0
- package/dist/types/turn.d.ts +50 -0
- package/dist/types/turn.d.ts.map +1 -0
- package/dist/types/turn.js +2 -0
- package/dist/types/turn.js.map +1 -0
- package/dist/types.d.ts +16 -1017
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +15 -8
- package/dist/types.js.map +1 -1
- package/dist/wallet/rpc-interception.d.ts +15 -0
- package/dist/wallet/rpc-interception.d.ts.map +1 -0
- package/dist/wallet/rpc-interception.js +95 -0
- package/dist/wallet/rpc-interception.js.map +1 -0
- package/package.json +6 -2
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The hot-loop decision methods for the Brain engine: the DOM-first `decide`
|
|
3
|
+
* path, the vision-first / hybrid `decideVision` path, the navigation-model
|
|
4
|
+
* routing classifier they share, and the tolerant JSON decision parser.
|
|
5
|
+
*
|
|
6
|
+
* Extracted from brain/index.ts via the delegate + host-interface pattern.
|
|
7
|
+
* The Brain class keeps thin delegators (`decide`, `decideVision`, `parse`);
|
|
8
|
+
* these free functions hold the method bodies verbatim and read/write Brain
|
|
9
|
+
* state through {@link BrainDecideHost}, which Brain `implements` so tsc proves
|
|
10
|
+
* the host surface is complete. Behavior is byte-identical to the inlined
|
|
11
|
+
* versions — same ordering, thresholds, retries, and prompt text.
|
|
12
|
+
*/
|
|
13
|
+
import { parseNextActions, validateAction } from './action-parse.js';
|
|
14
|
+
import { budgetSnapshot, compactFirstTurnSnapshot } from './snapshot-budget.js';
|
|
15
|
+
import { VISION_FIRST_PROMPT, UNIFIED_VISION_DOM_PROMPT, FIRST_TURN_COMPACT_PROMPT, } from './prompts.js';
|
|
16
|
+
import { compactHistory } from './history-compact.js';
|
|
17
|
+
/**
|
|
18
|
+
* Classify whether this turn should use the nav (cheap) model for decide().
|
|
19
|
+
*
|
|
20
|
+
* Empirically tested: routing early navigation turns to gpt-4.1-mini causes
|
|
21
|
+
* worse decisions that cascade into longer runs (more turns = more total cost).
|
|
22
|
+
* gpt-5.4 without routing is cheaper overall because it navigates more efficiently.
|
|
23
|
+
*
|
|
24
|
+
* Current strategy: nav model is ONLY used for verification (see verifyGoalCompletion),
|
|
25
|
+
* not for decide(). The flag is kept for future experiments with better routing signals.
|
|
26
|
+
*/
|
|
27
|
+
function shouldUseNavigationModel(self, state, extraContext, turnInfo) {
|
|
28
|
+
if (!self.adaptiveModelRouting || !self.navModelName)
|
|
29
|
+
return false;
|
|
30
|
+
// Use the navigation model for DOM-only same-page turns. Keep the primary
|
|
31
|
+
// model for first turns, new pages, and error recovery.
|
|
32
|
+
const isFirstTurn = !turnInfo || turnInfo.current <= 1;
|
|
33
|
+
const samePageAsPrevious = self.lastDecisionUrl === state.url;
|
|
34
|
+
const hasError = extraContext?.includes('REJECTED') || extraContext?.includes('ERROR');
|
|
35
|
+
if (isFirstTurn || !samePageAsPrevious || hasError)
|
|
36
|
+
return false;
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
export async function decideImpl(self, goal, state, extraContext, turnInfo, options) {
|
|
40
|
+
// Vision-first and hybrid modes delegate to the vision path.
|
|
41
|
+
if (self.observationMode === 'vision' || self.observationMode === 'hybrid') {
|
|
42
|
+
return decideVisionImpl(self, goal, state, extraContext, turnInfo);
|
|
43
|
+
}
|
|
44
|
+
const useCompactFirstTurn = self.compactFirstTurn && turnInfo?.current === 1;
|
|
45
|
+
const samePageAsPrevious = self.lastDecisionUrl === state.url;
|
|
46
|
+
const isFirstTurn = !turnInfo || turnInfo.current <= 1;
|
|
47
|
+
// Diff-only mode: on same-page turns with small diffs, send only changed
|
|
48
|
+
// elements instead of the full snapshot. Saves 40-80% of input tokens on
|
|
49
|
+
// form-fill / interaction-heavy pages where the page structure is stable.
|
|
50
|
+
const rawDiff = state.snapshotDiffRaw;
|
|
51
|
+
const diffChanges = rawDiff ? rawDiff.added.length + rawDiff.removed.length + rawDiff.changed.length : 0;
|
|
52
|
+
const diffTotal = rawDiff ? diffChanges + rawDiff.unchangedCount : 0;
|
|
53
|
+
const useDiffOnly = samePageAsPrevious
|
|
54
|
+
&& !isFirstTurn
|
|
55
|
+
&& rawDiff !== undefined
|
|
56
|
+
&& diffChanges > 0
|
|
57
|
+
&& diffTotal > 0
|
|
58
|
+
&& diffChanges / diffTotal < 0.3;
|
|
59
|
+
// Tighter snapshot budget on same-page turns; new pages keep enough
|
|
60
|
+
// content for extraction from docs/spec pages.
|
|
61
|
+
const snapshotBudget = samePageAsPrevious ? 8_000 : 24_000;
|
|
62
|
+
let visibleSnapshot;
|
|
63
|
+
let elementsHeader;
|
|
64
|
+
if (useDiffOnly) {
|
|
65
|
+
// Build compact diff-only view: changed/added elements with refs
|
|
66
|
+
const lines = [];
|
|
67
|
+
if (rawDiff.added.length)
|
|
68
|
+
lines.push('ADDED:', ...rawDiff.added);
|
|
69
|
+
if (rawDiff.changed.length)
|
|
70
|
+
lines.push('CHANGED:', ...rawDiff.changed);
|
|
71
|
+
if (rawDiff.removed.length)
|
|
72
|
+
lines.push('REMOVED:', ...rawDiff.removed);
|
|
73
|
+
lines.push(`(${rawDiff.unchangedCount} elements unchanged — refs from previous turn still valid)`);
|
|
74
|
+
visibleSnapshot = lines.join('\n');
|
|
75
|
+
elementsHeader = 'ELEMENTS (diff-only, previous refs still valid)';
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
visibleSnapshot = useCompactFirstTurn
|
|
79
|
+
? compactFirstTurnSnapshot(state.snapshot)
|
|
80
|
+
: budgetSnapshot(state.snapshot, snapshotBudget);
|
|
81
|
+
elementsHeader = 'ELEMENTS';
|
|
82
|
+
}
|
|
83
|
+
self.lastDecisionUrl = state.url;
|
|
84
|
+
// Build user message with stable prefix (GOAL) for prompt caching,
|
|
85
|
+
// then dynamic per-turn content (turn budget, page state, elements).
|
|
86
|
+
let textContent = `GOAL: ${goal}
|
|
87
|
+
|
|
88
|
+
CURRENT PAGE:
|
|
89
|
+
URL: ${state.url}
|
|
90
|
+
Title: ${state.title}
|
|
91
|
+
|
|
92
|
+
${elementsHeader}:
|
|
93
|
+
${visibleSnapshot}`;
|
|
94
|
+
if (turnInfo) {
|
|
95
|
+
const remaining = turnInfo.max - turnInfo.current;
|
|
96
|
+
const budgetUsed = turnInfo.current / turnInfo.max;
|
|
97
|
+
textContent += `\n\nTURN: ${turnInfo.current}/${turnInfo.max} (${remaining} remaining)`;
|
|
98
|
+
if (remaining === 1) {
|
|
99
|
+
textContent += ` — FINAL TURN: return a terminal action only (complete or abort)`;
|
|
100
|
+
}
|
|
101
|
+
else if (remaining <= 3) {
|
|
102
|
+
textContent += ` — RUNNING LOW, avoid exploratory navigation; prioritize completing the goal or aborting with a clear blocker reason`;
|
|
103
|
+
}
|
|
104
|
+
else if (budgetUsed >= 0.5) {
|
|
105
|
+
textContent += ` — HALF BUDGET USED. If you have extracted useful data, try completing now. Do not navigate away from pages with relevant content without attempting completion first`;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Append snapshot diff only when NOT using diff-only mode (avoid redundant info)
|
|
109
|
+
if (!useDiffOnly && state.snapshotDiff && state.snapshotDiff.length < state.snapshot.length * 0.3) {
|
|
110
|
+
textContent += `\n\nSNAPSHOT CHANGES (since last turn):\n${state.snapshotDiff}`;
|
|
111
|
+
}
|
|
112
|
+
if (extraContext) {
|
|
113
|
+
textContent += `\n\n${extraContext}`;
|
|
114
|
+
}
|
|
115
|
+
textContent += '\n\nWhat action should you take?';
|
|
116
|
+
const userContent = self.buildUserContent(textContent, state.screenshot, options?.forceVision === true);
|
|
117
|
+
const useNavModel = shouldUseNavigationModel(self, state, extraContext, turnInfo);
|
|
118
|
+
const effectiveProvider = useNavModel ? (self.navProvider || self.provider) : self.provider;
|
|
119
|
+
const effectiveModel = useNavModel ? (self.navModelName || self.modelName) : self.modelName;
|
|
120
|
+
if (self.debug) {
|
|
121
|
+
const turnNum = Math.floor(self.history.length / 2) + 1;
|
|
122
|
+
const usingVision = !!state.screenshot && (self.visionStrategy === 'always' || (self.visionStrategy === 'auto' && options?.forceVision === true));
|
|
123
|
+
console.log(`[Brain] Turn ${turnNum} | URL: ${state.url} | Vision: ${usingVision}`);
|
|
124
|
+
if (self.adaptiveModelRouting) {
|
|
125
|
+
const mode = useNavModel ? 'nav-model' : 'primary-model';
|
|
126
|
+
console.log(`[Brain] Model route: ${mode} (${effectiveProvider}/${effectiveModel}) turn=${turnInfo?.current}/${turnInfo?.max}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const messages = [
|
|
130
|
+
...compactHistory(self.history),
|
|
131
|
+
{ role: 'user', content: userContent },
|
|
132
|
+
];
|
|
133
|
+
const dynamicSystemPrompt = useCompactFirstTurn
|
|
134
|
+
? FIRST_TURN_COMPACT_PROMPT
|
|
135
|
+
: self.buildSystemForDecide(goal, state, turnInfo?.current ?? 1, effectiveProvider);
|
|
136
|
+
const modelOpts = { provider: effectiveProvider, model: effectiveModel };
|
|
137
|
+
// Bump output budget near max turns so data-heavy completions don't truncate
|
|
138
|
+
const nearingEnd = turnInfo && turnInfo.current >= turnInfo.max - 3;
|
|
139
|
+
const maxTokens = useCompactFirstTurn ? 500 : nearingEnd ? 1200 : 600;
|
|
140
|
+
const result = await self.generate(dynamicSystemPrompt, messages, modelOpts, maxTokens);
|
|
141
|
+
let raw = result.text;
|
|
142
|
+
let tokensUsed = result.tokensUsed;
|
|
143
|
+
let inputTokens = result.inputTokens;
|
|
144
|
+
let outputTokens = result.outputTokens;
|
|
145
|
+
let cacheReadInputTokens = result.cacheReadInputTokens;
|
|
146
|
+
let cacheCreationInputTokens = result.cacheCreationInputTokens;
|
|
147
|
+
if (!raw) {
|
|
148
|
+
throw new Error('Brain.decide: LLM returned empty response — possible rate limit or model error');
|
|
149
|
+
}
|
|
150
|
+
if (self.debug) {
|
|
151
|
+
console.log('[Brain] Response:', raw.slice(0, 300));
|
|
152
|
+
}
|
|
153
|
+
let parsed = parseDecision(raw);
|
|
154
|
+
// On malformed JSON, retry with minimal context (current page + correction
|
|
155
|
+
// hint) instead of burning a full turn. Costs ~7K tokens vs ~25K for a
|
|
156
|
+
// full-history retry on the next turn.
|
|
157
|
+
if (parsed.reasoning?.startsWith('Malformed LLM JSON response') && !useCompactFirstTurn) {
|
|
158
|
+
if (self.debug) {
|
|
159
|
+
console.log('[Brain] Malformed JSON — retrying with format hint');
|
|
160
|
+
}
|
|
161
|
+
const retryMessages = [
|
|
162
|
+
{ role: 'user', content: userContent },
|
|
163
|
+
{ role: 'assistant', content: raw },
|
|
164
|
+
{ role: 'user', content: 'Your previous response was not valid JSON. Respond with ONLY a valid JSON object matching the required schema.' },
|
|
165
|
+
];
|
|
166
|
+
try {
|
|
167
|
+
const retryResult = await self.generate(dynamicSystemPrompt, retryMessages, modelOpts, maxTokens);
|
|
168
|
+
if (retryResult.text) {
|
|
169
|
+
const retryParsed = parseDecision(retryResult.text);
|
|
170
|
+
if (!retryParsed.reasoning?.startsWith('Malformed LLM JSON response')) {
|
|
171
|
+
raw = retryResult.text;
|
|
172
|
+
parsed = retryParsed;
|
|
173
|
+
}
|
|
174
|
+
else if (self.baseUrl) {
|
|
175
|
+
// Both the initial parse and the format-hint retry failed while a
|
|
176
|
+
// custom LLM_BASE_URL is set. Strong signal the gateway is
|
|
177
|
+
// returning a shape the scout can't consume (e.g. SSE streams,
|
|
178
|
+
// non-JSON wrappers). Surface the likely cause instead of
|
|
179
|
+
// burning silent retries turn after turn.
|
|
180
|
+
console.error(`[Brain] scout_json_parse_failed: LLM_BASE_URL=${self.baseUrl} returned a response the scout could not parse even after a format-hint retry. ` +
|
|
181
|
+
`Suggestion: switch to an Anthropic-native endpoint, or verify the gateway supports non-streaming chat/completions with { "response_format": { "type": "json_object" } }.`);
|
|
182
|
+
}
|
|
183
|
+
tokensUsed = (tokensUsed ?? 0) + (retryResult.tokensUsed ?? 0);
|
|
184
|
+
inputTokens = (inputTokens ?? 0) + (retryResult.inputTokens ?? 0);
|
|
185
|
+
outputTokens = (outputTokens ?? 0) + (retryResult.outputTokens ?? 0);
|
|
186
|
+
if (retryResult.cacheReadInputTokens !== undefined) {
|
|
187
|
+
cacheReadInputTokens = (cacheReadInputTokens ?? 0) + retryResult.cacheReadInputTokens;
|
|
188
|
+
}
|
|
189
|
+
if (retryResult.cacheCreationInputTokens !== undefined) {
|
|
190
|
+
cacheCreationInputTokens = (cacheCreationInputTokens ?? 0) + retryResult.cacheCreationInputTokens;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// Retry failed — fall through with original wait(1000) fallback
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Store in history
|
|
199
|
+
self.history.push({ role: 'user', content: userContent });
|
|
200
|
+
self.history.push({ role: 'assistant', content: raw });
|
|
201
|
+
// Trim old history
|
|
202
|
+
const maxMessages = self.maxHistoryTurns * 2;
|
|
203
|
+
if (self.history.length > maxMessages) {
|
|
204
|
+
self.history = self.history.slice(-maxMessages);
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
...parsed,
|
|
208
|
+
raw,
|
|
209
|
+
tokensUsed,
|
|
210
|
+
inputTokens,
|
|
211
|
+
outputTokens,
|
|
212
|
+
cacheReadInputTokens,
|
|
213
|
+
cacheCreationInputTokens,
|
|
214
|
+
modelUsed: effectiveModel,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Vision-first decision path. The screenshot is the primary
|
|
219
|
+
* observation; DOM snapshot is minimal context (URL, title only in pure
|
|
220
|
+
* vision mode, or compact DOM in hybrid mode). The LLM outputs
|
|
221
|
+
* coordinate-based actions (clickAt, typeAt) in 1024×768 virtual space.
|
|
222
|
+
*/
|
|
223
|
+
export async function decideVisionImpl(self, goal, state, extraContext, turnInfo) {
|
|
224
|
+
self.lastDecisionUrl = state.url;
|
|
225
|
+
// Adaptive observation: on same-page hybrid turns, send only changed
|
|
226
|
+
// elements when the diff is small.
|
|
227
|
+
const isHybrid = self.observationMode === 'hybrid';
|
|
228
|
+
const samePageAsPrevious = self.lastDecisionUrl === state.url;
|
|
229
|
+
const isFirstTurn = !turnInfo || turnInfo.current <= 1;
|
|
230
|
+
const rawDiff = state.snapshotDiffRaw;
|
|
231
|
+
const diffChanges = rawDiff ? rawDiff.added.length + rawDiff.removed.length + rawDiff.changed.length : 0;
|
|
232
|
+
const diffTotal = rawDiff ? diffChanges + rawDiff.unchangedCount : 0;
|
|
233
|
+
const useDiffOnly = isHybrid && samePageAsPrevious && !isFirstTurn
|
|
234
|
+
&& rawDiff !== undefined && diffChanges > 0 && diffTotal > 0
|
|
235
|
+
&& diffChanges / diffTotal < 0.4;
|
|
236
|
+
let textContent = `GOAL: ${goal}
|
|
237
|
+
|
|
238
|
+
CURRENT PAGE:
|
|
239
|
+
URL: ${state.url}
|
|
240
|
+
Title: ${state.title}`;
|
|
241
|
+
if (isHybrid && state.snapshot) {
|
|
242
|
+
if (useDiffOnly) {
|
|
243
|
+
// Diff-focused: only what changed since last turn
|
|
244
|
+
const lines = [];
|
|
245
|
+
if (rawDiff.added.length)
|
|
246
|
+
lines.push('ADDED:', ...rawDiff.added);
|
|
247
|
+
if (rawDiff.changed.length)
|
|
248
|
+
lines.push('CHANGED:', ...rawDiff.changed);
|
|
249
|
+
if (rawDiff.removed.length)
|
|
250
|
+
lines.push('REMOVED:', ...rawDiff.removed);
|
|
251
|
+
lines.push(`(${rawDiff.unchangedCount} elements unchanged — refs from previous turn still valid)`);
|
|
252
|
+
textContent += `\n\nPAGE CHANGES (what changed after your last action — this is the important part):\n${lines.join('\n')}`;
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
// Progressive budget reduction: more turns on same page = less snapshot
|
|
256
|
+
// needed (agent has already seen the full page, rely on screenshot + diff).
|
|
257
|
+
const sameTurnCount = samePageAsPrevious ? (turnInfo?.current || 0) : 0;
|
|
258
|
+
const snapshotBudget = samePageAsPrevious
|
|
259
|
+
? (sameTurnCount >= 8 ? 2_500 : 4_000) // aggressive after 8+ same-page turns
|
|
260
|
+
: 6_000;
|
|
261
|
+
const snap = budgetSnapshot(state.snapshot, snapshotBudget);
|
|
262
|
+
textContent += `\n\nELEMENTS:\n${snap}`;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (turnInfo) {
|
|
266
|
+
const remaining = turnInfo.max - turnInfo.current;
|
|
267
|
+
textContent += `\n\nTURN: ${turnInfo.current}/${turnInfo.max} (${remaining} remaining)`;
|
|
268
|
+
if (remaining === 1) {
|
|
269
|
+
textContent += ` — FINAL TURN: return a terminal action only (complete or abort)`;
|
|
270
|
+
}
|
|
271
|
+
else if (remaining <= 3) {
|
|
272
|
+
textContent += ` — RUNNING LOW, prioritize completing the goal or aborting`;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
if (extraContext) {
|
|
276
|
+
textContent += `\n\n${extraContext}`;
|
|
277
|
+
}
|
|
278
|
+
textContent += '\n\nLook at the screenshot. What action should you take?';
|
|
279
|
+
// Screenshot is required for vision-first mode
|
|
280
|
+
if (!state.screenshot) {
|
|
281
|
+
return {
|
|
282
|
+
action: { action: 'wait', ms: 500 },
|
|
283
|
+
reasoning: 'No screenshot available for vision-first mode — waiting for page to render',
|
|
284
|
+
raw: '{"action":{"action":"wait","ms":500}}',
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
const userContent = [
|
|
288
|
+
{ type: 'text', text: textContent },
|
|
289
|
+
{ type: 'image', image: state.screenshot, mediaType: 'image/jpeg' },
|
|
290
|
+
];
|
|
291
|
+
// Strip old screenshots from history; the current screenshot is the only
|
|
292
|
+
// image the model needs for this turn.
|
|
293
|
+
const compacted = compactHistory(self.history).map((msg) => {
|
|
294
|
+
if (msg.role !== 'user' || !Array.isArray(msg.content))
|
|
295
|
+
return msg;
|
|
296
|
+
const textOnly = msg.content
|
|
297
|
+
.filter((part) => part.type === 'text');
|
|
298
|
+
if (textOnly.length === msg.content.length)
|
|
299
|
+
return msg;
|
|
300
|
+
return { ...msg, content: textOnly };
|
|
301
|
+
});
|
|
302
|
+
const messages = [
|
|
303
|
+
...compacted,
|
|
304
|
+
{ role: 'user', content: userContent },
|
|
305
|
+
];
|
|
306
|
+
// Vision turns stay on the main model because smaller model routes can
|
|
307
|
+
// count image tokens differently and exhaust the token budget.
|
|
308
|
+
const modelOpts = { provider: self.provider, model: self.modelName };
|
|
309
|
+
const nearingEnd = turnInfo && turnInfo.current >= turnInfo.max - 3;
|
|
310
|
+
const maxTokens = nearingEnd ? 1200 : 600;
|
|
311
|
+
// Hybrid mode uses the unified prompt with both action vocabularies.
|
|
312
|
+
const systemPrompt = isHybrid ? UNIFIED_VISION_DOM_PROMPT : VISION_FIRST_PROMPT;
|
|
313
|
+
const result = await self.generate(systemPrompt, messages, modelOpts, maxTokens);
|
|
314
|
+
const raw = result.text;
|
|
315
|
+
if (!raw) {
|
|
316
|
+
throw new Error('Brain.decideVision: LLM returned empty response');
|
|
317
|
+
}
|
|
318
|
+
if (self.debug) {
|
|
319
|
+
console.log('[Brain/Vision] Response:', raw.slice(0, 300));
|
|
320
|
+
}
|
|
321
|
+
const parsed = parseDecision(raw);
|
|
322
|
+
self.history.push({ role: 'user', content: userContent });
|
|
323
|
+
self.history.push({ role: 'assistant', content: raw });
|
|
324
|
+
const maxMessages = self.maxHistoryTurns * 2;
|
|
325
|
+
if (self.history.length > maxMessages) {
|
|
326
|
+
self.history = self.history.slice(-maxMessages);
|
|
327
|
+
}
|
|
328
|
+
return {
|
|
329
|
+
...parsed,
|
|
330
|
+
raw,
|
|
331
|
+
tokensUsed: result.tokensUsed,
|
|
332
|
+
inputTokens: result.inputTokens,
|
|
333
|
+
outputTokens: result.outputTokens,
|
|
334
|
+
cacheReadInputTokens: result.cacheReadInputTokens,
|
|
335
|
+
cacheCreationInputTokens: result.cacheCreationInputTokens,
|
|
336
|
+
modelUsed: self.modelName,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
export function parseDecision(raw) {
|
|
340
|
+
let text = raw.trim();
|
|
341
|
+
// Strip markdown code blocks
|
|
342
|
+
if (text.startsWith('```')) {
|
|
343
|
+
text = text.replace(/^```(?:json)?\n?/, '').replace(/\n?```$/, '');
|
|
344
|
+
}
|
|
345
|
+
const VALID_ACTIONS = new Set([
|
|
346
|
+
'click', 'type', 'press', 'hover', 'select',
|
|
347
|
+
'scroll', 'navigate', 'wait', 'evaluate', 'runScript',
|
|
348
|
+
'extractWithIndex',
|
|
349
|
+
'verifyPreview', 'complete', 'abort',
|
|
350
|
+
'fill', 'clickSequence',
|
|
351
|
+
'clickAt', 'typeAt',
|
|
352
|
+
'clickLabel', 'typeLabel',
|
|
353
|
+
// Macro dispatch. The driver validates the macro name at execute time.
|
|
354
|
+
'macro',
|
|
355
|
+
// Parallel fan-out. Runner handles dispatch; validator checks shape.
|
|
356
|
+
'fanOut',
|
|
357
|
+
]);
|
|
358
|
+
// Parse strategy: exact → first-{/last-} extraction.
|
|
359
|
+
// Some OpenAI-compat gateways (router.tangle.tools, LiteLLM proxies, etc.)
|
|
360
|
+
// wrap model output in prose preambles ("Here's your response:\n{...}")
|
|
361
|
+
// that markdown-fence stripping doesn't catch. Fall back to extracting the
|
|
362
|
+
// outermost object literal before giving up.
|
|
363
|
+
let parsed = null;
|
|
364
|
+
let parseError = '';
|
|
365
|
+
try {
|
|
366
|
+
parsed = JSON.parse(text);
|
|
367
|
+
}
|
|
368
|
+
catch (err) {
|
|
369
|
+
parseError = err instanceof Error ? err.message : String(err);
|
|
370
|
+
const firstBrace = text.indexOf('{');
|
|
371
|
+
const lastBrace = text.lastIndexOf('}');
|
|
372
|
+
if (firstBrace >= 0 && lastBrace > firstBrace) {
|
|
373
|
+
try {
|
|
374
|
+
parsed = JSON.parse(text.slice(firstBrace, lastBrace + 1));
|
|
375
|
+
parseError = '';
|
|
376
|
+
}
|
|
377
|
+
catch { /* fall through to retry fallback */ }
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
if (!parsed) {
|
|
381
|
+
return {
|
|
382
|
+
// Do not hard-abort the scenario on transient JSON formatting issues.
|
|
383
|
+
// Waiting one turn lets the loop continue and recover on the next model call.
|
|
384
|
+
action: { action: 'wait', ms: 1000 },
|
|
385
|
+
reasoning: `Malformed LLM JSON response (${parseError}). Retrying next turn.`,
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
try {
|
|
389
|
+
const actionObj = parsed.action && typeof parsed.action === 'object' ? parsed.action : parsed;
|
|
390
|
+
const actionType = typeof parsed.action === 'string' ? parsed.action : actionObj?.action;
|
|
391
|
+
if (!actionType) {
|
|
392
|
+
throw new Error('Missing action field');
|
|
393
|
+
}
|
|
394
|
+
if (!VALID_ACTIONS.has(actionType)) {
|
|
395
|
+
throw new Error(`Unknown action "${actionType}". Valid: ${[...VALID_ACTIONS].join(', ')}`);
|
|
396
|
+
}
|
|
397
|
+
const actionData = parsed.action && typeof parsed.action === 'object'
|
|
398
|
+
? parsed.action
|
|
399
|
+
: parsed;
|
|
400
|
+
const action = validateAction(actionType, actionData);
|
|
401
|
+
return {
|
|
402
|
+
action,
|
|
403
|
+
nextActions: parseNextActions(parsed, VALID_ACTIONS),
|
|
404
|
+
reasoning: (parsed.reasoning || parsed.thought || parsed.thinking),
|
|
405
|
+
plan: Array.isArray(parsed.plan) ? parsed.plan : undefined,
|
|
406
|
+
currentStep: typeof parsed.currentStep === 'number' ? parsed.currentStep : undefined,
|
|
407
|
+
expectedEffect: (parsed.expectedEffect || parsed.expected_effect),
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
catch (err) {
|
|
411
|
+
const validationError = err instanceof Error ? err.message : String(err);
|
|
412
|
+
return {
|
|
413
|
+
action: { action: 'wait', ms: 1000 },
|
|
414
|
+
reasoning: `Malformed LLM JSON response (${validationError}). Retrying next turn.`,
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
//# sourceMappingURL=decide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decide.js","sourceRoot":"","sources":["../../src/brain/decide.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation-history compaction. Pure functions over a ModelMessage[]; the
|
|
3
|
+
* Brain class keeps a thin wrapper that passes its own `history`.
|
|
4
|
+
*
|
|
5
|
+
* Compact conversation history: strip ELEMENTS blocks and screenshots
|
|
6
|
+
* from older observations, keeping the last 2 user messages intact.
|
|
7
|
+
*
|
|
8
|
+
* For older turns, replaces the full ELEMENTS block with a one-line
|
|
9
|
+
* summary showing element count and the selectors the agent actually
|
|
10
|
+
* used, extracted from the paired assistant response.
|
|
11
|
+
*
|
|
12
|
+
* Three-tier compression:
|
|
13
|
+
* Zone 1 (intact): last 2 turns — full content
|
|
14
|
+
* Zone 2 (standard): turns 3-5 back — ELEMENTS stripped from user msgs
|
|
15
|
+
* Zone 3 (deep compact): turns 6+ back — both user and assistant ultra-compacted
|
|
16
|
+
*/
|
|
17
|
+
import type { ModelMessage } from 'ai';
|
|
18
|
+
export declare function compactHistory(history: ModelMessage[]): ModelMessage[];
|
|
19
|
+
//# sourceMappingURL=history-compact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-compact.d.ts","sourceRoot":"","sources":["../../src/brain/history-compact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAEvC,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAkEtE"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation-history compaction. Pure functions over a ModelMessage[]; the
|
|
3
|
+
* Brain class keeps a thin wrapper that passes its own `history`.
|
|
4
|
+
*
|
|
5
|
+
* Compact conversation history: strip ELEMENTS blocks and screenshots
|
|
6
|
+
* from older observations, keeping the last 2 user messages intact.
|
|
7
|
+
*
|
|
8
|
+
* For older turns, replaces the full ELEMENTS block with a one-line
|
|
9
|
+
* summary showing element count and the selectors the agent actually
|
|
10
|
+
* used, extracted from the paired assistant response.
|
|
11
|
+
*
|
|
12
|
+
* Three-tier compression:
|
|
13
|
+
* Zone 1 (intact): last 2 turns — full content
|
|
14
|
+
* Zone 2 (standard): turns 3-5 back — ELEMENTS stripped from user msgs
|
|
15
|
+
* Zone 3 (deep compact): turns 6+ back — both user and assistant ultra-compacted
|
|
16
|
+
*/
|
|
17
|
+
export function compactHistory(history) {
|
|
18
|
+
if (history.length === 0)
|
|
19
|
+
return [];
|
|
20
|
+
// Find indices of the last 2 user messages to keep intact
|
|
21
|
+
const userIndices = [];
|
|
22
|
+
for (let i = history.length - 1; i >= 0; i--) {
|
|
23
|
+
if (history[i].role === 'user') {
|
|
24
|
+
userIndices.push(i);
|
|
25
|
+
if (userIndices.length === 2)
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const keepIntactFrom = userIndices.length > 0
|
|
30
|
+
? userIndices[userIndices.length - 1]
|
|
31
|
+
: history.length;
|
|
32
|
+
// Three-tier compression:
|
|
33
|
+
// Zone 1 (intact): last 2 turns — full content
|
|
34
|
+
// Zone 2 (standard): turns 3-5 back — ELEMENTS stripped from user msgs
|
|
35
|
+
// Zone 3 (deep compact): turns 6+ back — both user and assistant ultra-compacted
|
|
36
|
+
// Keep enough older history for long multi-step travel workflows.
|
|
37
|
+
const deepCompactBefore = Math.max(0, history.length - 10);
|
|
38
|
+
return history.map((msg, idx) => {
|
|
39
|
+
// Zone 1: keep recent turns intact
|
|
40
|
+
if (idx >= keepIntactFrom)
|
|
41
|
+
return msg;
|
|
42
|
+
// Zone 3: ultra-compact for very old messages (user + assistant)
|
|
43
|
+
if (idx < deepCompactBefore) {
|
|
44
|
+
if (msg.role === 'assistant') {
|
|
45
|
+
const raw = typeof msg.content === 'string' ? msg.content : '';
|
|
46
|
+
return { ...msg, content: deepCompactAssistant(raw) };
|
|
47
|
+
}
|
|
48
|
+
if (msg.role === 'user') {
|
|
49
|
+
return { ...msg, content: deepCompactUser(msg) };
|
|
50
|
+
}
|
|
51
|
+
return msg;
|
|
52
|
+
}
|
|
53
|
+
// Zone 2: standard compact — strip ELEMENTS from user messages only
|
|
54
|
+
if (msg.role !== 'user')
|
|
55
|
+
return msg;
|
|
56
|
+
const assistantMsg = idx + 1 < history.length ? history[idx + 1] : undefined;
|
|
57
|
+
const selectors = assistantMsg?.role === 'assistant'
|
|
58
|
+
? extractSelectorsFromResponse(typeof assistantMsg.content === 'string' ? assistantMsg.content : '')
|
|
59
|
+
: [];
|
|
60
|
+
// Handle multimodal content (array of parts)
|
|
61
|
+
if (Array.isArray(msg.content)) {
|
|
62
|
+
const compacted = msg.content
|
|
63
|
+
.filter((part) => part.type === 'text')
|
|
64
|
+
.map((part) => ({
|
|
65
|
+
...part,
|
|
66
|
+
text: summarizeElements(part.text, selectors),
|
|
67
|
+
}));
|
|
68
|
+
return { ...msg, content: compacted };
|
|
69
|
+
}
|
|
70
|
+
// Handle string content
|
|
71
|
+
if (typeof msg.content === 'string') {
|
|
72
|
+
return { ...msg, content: summarizeElements(msg.content, selectors) };
|
|
73
|
+
}
|
|
74
|
+
return msg;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function deepCompactUser(msg) {
|
|
78
|
+
const text = typeof msg.content === 'string'
|
|
79
|
+
? msg.content
|
|
80
|
+
: Array.isArray(msg.content)
|
|
81
|
+
? msg.content
|
|
82
|
+
.filter((p) => p.type === 'text')
|
|
83
|
+
.map((p) => p.text)
|
|
84
|
+
.join('\n')
|
|
85
|
+
: '';
|
|
86
|
+
const urlMatch = text.match(/URL:\s*(\S+)/);
|
|
87
|
+
const titleMatch = text.match(/Title:\s*(.+?)(?:\n|$)/);
|
|
88
|
+
const url = urlMatch?.[1] ?? 'unknown';
|
|
89
|
+
const title = titleMatch?.[1]?.slice(0, 80) ?? '';
|
|
90
|
+
return `[Prior turn — URL: ${url}${title ? ` | ${title}` : ''}]`;
|
|
91
|
+
}
|
|
92
|
+
function deepCompactAssistant(raw) {
|
|
93
|
+
try {
|
|
94
|
+
let text = raw.trim();
|
|
95
|
+
if (text.startsWith('```')) {
|
|
96
|
+
text = text.replace(/^```(?:json)?\n?/, '').replace(/\n?```$/, '');
|
|
97
|
+
}
|
|
98
|
+
const parsed = JSON.parse(text);
|
|
99
|
+
const action = parsed.action?.action ?? 'unknown';
|
|
100
|
+
const selector = parsed.action?.selector ?? '';
|
|
101
|
+
const parts = [action];
|
|
102
|
+
if (selector)
|
|
103
|
+
parts.push(selector);
|
|
104
|
+
if (parsed.action?.url)
|
|
105
|
+
parts.push(parsed.action.url.slice(0, 120));
|
|
106
|
+
return `[${parts.join(' → ')}]`;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return raw.slice(0, 100) + (raw.length > 100 ? '…' : '');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Extract @ref selectors from an assistant JSON response.
|
|
114
|
+
*/
|
|
115
|
+
function extractSelectorsFromResponse(raw) {
|
|
116
|
+
const selectors = [];
|
|
117
|
+
try {
|
|
118
|
+
let text = raw.trim();
|
|
119
|
+
if (text.startsWith('```')) {
|
|
120
|
+
text = text.replace(/^```(?:json)?\n?/, '').replace(/\n?```$/, '');
|
|
121
|
+
}
|
|
122
|
+
const parsed = JSON.parse(text);
|
|
123
|
+
if (parsed.action?.selector)
|
|
124
|
+
selectors.push(parsed.action.selector);
|
|
125
|
+
if (Array.isArray(parsed.nextActions)) {
|
|
126
|
+
for (const na of parsed.nextActions) {
|
|
127
|
+
if (na?.selector)
|
|
128
|
+
selectors.push(na.selector);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// Best effort
|
|
134
|
+
}
|
|
135
|
+
return selectors;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Replace the ELEMENTS block with a one-line action-only summary.
|
|
139
|
+
*/
|
|
140
|
+
function summarizeElements(text, selectors) {
|
|
141
|
+
return text.replace(/ELEMENTS[^:\n]*:\n[\s\S]*?(?=\n\n|What action should you take\?|$)/, (match) => {
|
|
142
|
+
const snapshotStart = match.indexOf('\n');
|
|
143
|
+
if (snapshotStart === -1)
|
|
144
|
+
return 'ELEMENTS:\n[previous snapshot]';
|
|
145
|
+
const snapshotText = match.slice(snapshotStart + 1);
|
|
146
|
+
const elementCount = (snapshotText.match(/\[ref=\w+\]/g) || []).length;
|
|
147
|
+
const selectorList = selectors.length > 0
|
|
148
|
+
? selectors.join(', ')
|
|
149
|
+
: 'none';
|
|
150
|
+
return `ELEMENTS:\n[Page snapshot: ${elementCount} elements | agent used: ${selectorList}]`;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=history-compact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-compact.js","sourceRoot":"","sources":["../../src/brain/history-compact.ts"],"names":[],"mappings":"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"}
|