@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.
Files changed (489) hide show
  1. package/README.md +42 -1
  2. package/discovery/llms.txt +27 -0
  3. package/discovery/tangle-agent.json +36 -0
  4. package/dist/brain/action-parse.d.ts +16 -0
  5. package/dist/brain/action-parse.d.ts.map +1 -0
  6. package/dist/brain/action-parse.js +191 -0
  7. package/dist/brain/action-parse.js.map +1 -0
  8. package/dist/brain/decide.d.ts +58 -0
  9. package/dist/brain/decide.d.ts.map +1 -0
  10. package/dist/brain/decide.js +418 -0
  11. package/dist/brain/decide.js.map +1 -0
  12. package/dist/brain/history-compact.d.ts +19 -0
  13. package/dist/brain/history-compact.d.ts.map +1 -0
  14. package/dist/brain/history-compact.js +153 -0
  15. package/dist/brain/history-compact.js.map +1 -0
  16. package/dist/brain/index.d.ts +78 -152
  17. package/dist/brain/index.d.ts.map +1 -1
  18. package/dist/brain/index.js +62 -2268
  19. package/dist/brain/index.js.map +1 -1
  20. package/dist/brain/model-client.d.ts +101 -0
  21. package/dist/brain/model-client.d.ts.map +1 -0
  22. package/dist/brain/model-client.js +391 -0
  23. package/dist/brain/model-client.js.map +1 -0
  24. package/dist/brain/plan.d.ts +57 -0
  25. package/dist/brain/plan.d.ts.map +1 -0
  26. package/dist/brain/plan.js +194 -0
  27. package/dist/brain/plan.js.map +1 -0
  28. package/dist/brain/prompts.d.ts +37 -0
  29. package/dist/brain/prompts.d.ts.map +1 -0
  30. package/dist/brain/prompts.js +455 -0
  31. package/dist/brain/prompts.js.map +1 -0
  32. package/dist/brain/provider-fetch.d.ts +26 -0
  33. package/dist/brain/provider-fetch.d.ts.map +1 -0
  34. package/dist/brain/provider-fetch.js +45 -0
  35. package/dist/brain/provider-fetch.js.map +1 -0
  36. package/dist/brain/snapshot-budget.d.ts +20 -0
  37. package/dist/brain/snapshot-budget.d.ts.map +1 -0
  38. package/dist/brain/snapshot-budget.js +202 -0
  39. package/dist/brain/snapshot-budget.js.map +1 -0
  40. package/dist/brain/system-prompt.d.ts +67 -0
  41. package/dist/brain/system-prompt.d.ts.map +1 -0
  42. package/dist/brain/system-prompt.js +128 -0
  43. package/dist/brain/system-prompt.js.map +1 -0
  44. package/dist/brain/tasks/design-audit.d.ts +33 -0
  45. package/dist/brain/tasks/design-audit.d.ts.map +1 -0
  46. package/dist/brain/tasks/design-audit.js +100 -0
  47. package/dist/brain/tasks/design-audit.js.map +1 -0
  48. package/dist/brain/tasks/evaluate.d.ts +25 -0
  49. package/dist/brain/tasks/evaluate.d.ts.map +1 -0
  50. package/dist/brain/tasks/evaluate.js +55 -0
  51. package/dist/brain/tasks/evaluate.js.map +1 -0
  52. package/dist/brain/tasks/goal-verification.d.ts +32 -0
  53. package/dist/brain/tasks/goal-verification.d.ts.map +1 -0
  54. package/dist/brain/tasks/goal-verification.js +68 -0
  55. package/dist/brain/tasks/goal-verification.js.map +1 -0
  56. package/dist/brain/tasks/knowledge.d.ts +26 -0
  57. package/dist/brain/tasks/knowledge.d.ts.map +1 -0
  58. package/dist/brain/tasks/knowledge.js +56 -0
  59. package/dist/brain/tasks/knowledge.js.map +1 -0
  60. package/dist/brain/tasks/link-scout.d.ts +37 -0
  61. package/dist/brain/tasks/link-scout.d.ts.map +1 -0
  62. package/dist/brain/tasks/link-scout.js +69 -0
  63. package/dist/brain/tasks/link-scout.js.map +1 -0
  64. package/dist/brain/types.d.ts +55 -0
  65. package/dist/brain/types.d.ts.map +1 -0
  66. package/dist/brain/types.js +7 -0
  67. package/dist/brain/types.js.map +1 -0
  68. package/dist/browser/stealth-init-script.d.ts +9 -0
  69. package/dist/browser/stealth-init-script.d.ts.map +1 -0
  70. package/dist/browser/stealth-init-script.js +128 -0
  71. package/dist/browser/stealth-init-script.js.map +1 -0
  72. package/dist/browser/storage-state.d.ts +29 -0
  73. package/dist/browser/storage-state.d.ts.map +1 -0
  74. package/dist/browser/storage-state.js +47 -0
  75. package/dist/browser/storage-state.js.map +1 -0
  76. package/dist/browser-launch.d.ts +6 -0
  77. package/dist/browser-launch.d.ts.map +1 -1
  78. package/dist/browser-launch.js +3 -0
  79. package/dist/browser-launch.js.map +1 -1
  80. package/dist/cli/args.d.ts +141 -0
  81. package/dist/cli/args.d.ts.map +1 -0
  82. package/dist/cli/args.js +167 -0
  83. package/dist/cli/args.js.map +1 -0
  84. package/dist/cli/benchmark-sync.d.ts +9 -0
  85. package/dist/cli/benchmark-sync.d.ts.map +1 -0
  86. package/dist/cli/benchmark-sync.js +43 -0
  87. package/dist/cli/benchmark-sync.js.map +1 -0
  88. package/dist/cli/build-config.d.ts +11 -0
  89. package/dist/cli/build-config.d.ts.map +1 -0
  90. package/dist/cli/build-config.js +355 -0
  91. package/dist/cli/build-config.js.map +1 -0
  92. package/dist/cli/commands/auth.d.ts +3 -0
  93. package/dist/cli/commands/auth.d.ts.map +1 -0
  94. package/dist/cli/commands/auth.js +36 -0
  95. package/dist/cli/commands/auth.js.map +1 -0
  96. package/dist/cli/commands/chrome-debug.d.ts +7 -0
  97. package/dist/cli/commands/chrome-debug.d.ts.map +1 -0
  98. package/dist/cli/commands/chrome-debug.js +11 -0
  99. package/dist/cli/commands/chrome-debug.js.map +1 -0
  100. package/dist/cli/commands/design-audit.d.ts +3 -0
  101. package/dist/cli/commands/design-audit.d.ts.map +1 -0
  102. package/dist/cli/commands/design-audit.js +68 -0
  103. package/dist/cli/commands/design-audit.js.map +1 -0
  104. package/dist/cli/commands/preview.d.ts +14 -0
  105. package/dist/cli/commands/preview.d.ts.map +1 -0
  106. package/dist/cli/commands/preview.js +31 -0
  107. package/dist/cli/commands/preview.js.map +1 -0
  108. package/dist/cli/commands/run.d.ts +3 -0
  109. package/dist/cli/commands/run.d.ts.map +1 -0
  110. package/dist/cli/commands/run.js +740 -0
  111. package/dist/cli/commands/run.js.map +1 -0
  112. package/dist/cli/commands/runs.d.ts +8 -0
  113. package/dist/cli/commands/runs.d.ts.map +1 -0
  114. package/dist/cli/commands/runs.js +35 -0
  115. package/dist/cli/commands/runs.js.map +1 -0
  116. package/dist/cli/commands/share.d.ts +10 -0
  117. package/dist/cli/commands/share.d.ts.map +1 -0
  118. package/dist/cli/commands/share.js +32 -0
  119. package/dist/cli/commands/share.js.map +1 -0
  120. package/dist/cli/commands/showcase.d.ts +17 -0
  121. package/dist/cli/commands/showcase.d.ts.map +1 -0
  122. package/dist/cli/commands/showcase.js +20 -0
  123. package/dist/cli/commands/showcase.js.map +1 -0
  124. package/dist/cli/commands/snapshot.d.ts +12 -0
  125. package/dist/cli/commands/snapshot.d.ts.map +1 -0
  126. package/dist/cli/commands/snapshot.js +24 -0
  127. package/dist/cli/commands/snapshot.js.map +1 -0
  128. package/dist/cli/commands/view.d.ts +7 -0
  129. package/dist/cli/commands/view.d.ts.map +1 -0
  130. package/dist/cli/commands/view.js +23 -0
  131. package/dist/cli/commands/view.js.map +1 -0
  132. package/dist/cli/constants.d.ts +6 -0
  133. package/dist/cli/constants.d.ts.map +1 -0
  134. package/dist/cli/constants.js +3 -0
  135. package/dist/cli/constants.js.map +1 -0
  136. package/dist/cli/version.d.ts +7 -0
  137. package/dist/cli/version.d.ts.map +1 -0
  138. package/dist/cli/version.js +16 -0
  139. package/dist/cli/version.js.map +1 -0
  140. package/dist/cli-design-audit.d.ts +44 -36
  141. package/dist/cli-design-audit.d.ts.map +1 -1
  142. package/dist/cli-design-audit.js +137 -1646
  143. package/dist/cli-design-audit.js.map +1 -1
  144. package/dist/cli-jobs.js +2 -1
  145. package/dist/cli-jobs.js.map +1 -1
  146. package/dist/cli.js +66 -1697
  147. package/dist/cli.js.map +1 -1
  148. package/dist/config.d.ts +12 -0
  149. package/dist/config.d.ts.map +1 -1
  150. package/dist/config.js +20 -2
  151. package/dist/config.js.map +1 -1
  152. package/dist/design/audit/evolve/agent.d.ts +23 -0
  153. package/dist/design/audit/evolve/agent.d.ts.map +1 -0
  154. package/dist/design/audit/evolve/agent.js +273 -0
  155. package/dist/design/audit/evolve/agent.js.map +1 -0
  156. package/dist/design/audit/evolve/css.d.ts +10 -0
  157. package/dist/design/audit/evolve/css.d.ts.map +1 -0
  158. package/dist/design/audit/evolve/css.js +206 -0
  159. package/dist/design/audit/evolve/css.js.map +1 -0
  160. package/dist/design/audit/evolve/index.d.ts +13 -0
  161. package/dist/design/audit/evolve/index.d.ts.map +1 -0
  162. package/dist/design/audit/evolve/index.js +12 -0
  163. package/dist/design/audit/evolve/index.js.map +1 -0
  164. package/dist/design/audit/evolve/report.d.ts +3 -0
  165. package/dist/design/audit/evolve/report.d.ts.map +1 -0
  166. package/dist/design/audit/evolve/report.js +45 -0
  167. package/dist/design/audit/evolve/report.js.map +1 -0
  168. package/dist/design/audit/evolve/types.d.ts +14 -0
  169. package/dist/design/audit/evolve/types.d.ts.map +1 -0
  170. package/dist/design/audit/evolve/types.js +2 -0
  171. package/dist/design/audit/evolve/types.js.map +1 -0
  172. package/dist/design/audit/pipeline.d.ts +12 -0
  173. package/dist/design/audit/pipeline.d.ts.map +1 -1
  174. package/dist/design/audit/pipeline.js +43 -27
  175. package/dist/design/audit/pipeline.js.map +1 -1
  176. package/dist/design/audit/reference/artifact/build.d.ts +33 -0
  177. package/dist/design/audit/reference/artifact/build.d.ts.map +1 -0
  178. package/dist/design/audit/reference/artifact/build.js +64 -0
  179. package/dist/design/audit/reference/artifact/build.js.map +1 -0
  180. package/dist/design/audit/reference/artifact/render.d.ts +39 -0
  181. package/dist/design/audit/reference/artifact/render.d.ts.map +1 -0
  182. package/dist/design/audit/reference/artifact/render.js +213 -0
  183. package/dist/design/audit/reference/artifact/render.js.map +1 -0
  184. package/dist/design/audit/reference/artifact/text.d.ts +11 -0
  185. package/dist/design/audit/reference/artifact/text.d.ts.map +1 -0
  186. package/dist/design/audit/reference/artifact/text.js +20 -0
  187. package/dist/design/audit/reference/artifact/text.js.map +1 -0
  188. package/dist/design/audit/reference/artifact/to-findings.d.ts +57 -0
  189. package/dist/design/audit/reference/artifact/to-findings.d.ts.map +1 -0
  190. package/dist/design/audit/reference/artifact/to-findings.js +314 -0
  191. package/dist/design/audit/reference/artifact/to-findings.js.map +1 -0
  192. package/dist/design/audit/reference/config.d.ts +50 -0
  193. package/dist/design/audit/reference/config.d.ts.map +1 -0
  194. package/dist/design/audit/reference/config.js +108 -0
  195. package/dist/design/audit/reference/config.js.map +1 -0
  196. package/dist/design/audit/reference/contracts.d.ts +1030 -0
  197. package/dist/design/audit/reference/contracts.d.ts.map +1 -0
  198. package/dist/design/audit/reference/contracts.js +28 -0
  199. package/dist/design/audit/reference/contracts.js.map +1 -0
  200. package/dist/design/audit/reference/corpus/build.d.ts +115 -0
  201. package/dist/design/audit/reference/corpus/build.d.ts.map +1 -0
  202. package/dist/design/audit/reference/corpus/build.js +152 -0
  203. package/dist/design/audit/reference/corpus/build.js.map +1 -0
  204. package/dist/design/audit/reference/corpus/schema.d.ts +33 -0
  205. package/dist/design/audit/reference/corpus/schema.d.ts.map +1 -0
  206. package/dist/design/audit/reference/corpus/schema.js +249 -0
  207. package/dist/design/audit/reference/corpus/schema.js.map +1 -0
  208. package/dist/design/audit/reference/corpus/store.d.ts +26 -0
  209. package/dist/design/audit/reference/corpus/store.d.ts.map +1 -0
  210. package/dist/design/audit/reference/corpus/store.js +104 -0
  211. package/dist/design/audit/reference/corpus/store.js.map +1 -0
  212. package/dist/design/audit/reference/dna/delta.d.ts +21 -0
  213. package/dist/design/audit/reference/dna/delta.d.ts.map +1 -0
  214. package/dist/design/audit/reference/dna/delta.js +126 -0
  215. package/dist/design/audit/reference/dna/delta.js.map +1 -0
  216. package/dist/design/audit/reference/dna/derive.d.ts +31 -0
  217. package/dist/design/audit/reference/dna/derive.d.ts.map +1 -0
  218. package/dist/design/audit/reference/dna/derive.js +381 -0
  219. package/dist/design/audit/reference/dna/derive.js.map +1 -0
  220. package/dist/design/audit/reference/dna/descriptor.d.ts +36 -0
  221. package/dist/design/audit/reference/dna/descriptor.d.ts.map +1 -0
  222. package/dist/design/audit/reference/dna/descriptor.js +209 -0
  223. package/dist/design/audit/reference/dna/descriptor.js.map +1 -0
  224. package/dist/design/audit/reference/dna/page-adapter.d.ts +17 -0
  225. package/dist/design/audit/reference/dna/page-adapter.d.ts.map +1 -0
  226. package/dist/design/audit/reference/dna/page-adapter.js +35 -0
  227. package/dist/design/audit/reference/dna/page-adapter.js.map +1 -0
  228. package/dist/design/audit/reference/dna/scroll-capture.d.ts +93 -0
  229. package/dist/design/audit/reference/dna/scroll-capture.d.ts.map +1 -0
  230. package/dist/design/audit/reference/dna/scroll-capture.js +374 -0
  231. package/dist/design/audit/reference/dna/scroll-capture.js.map +1 -0
  232. package/dist/design/audit/reference/engine/budget.d.ts +63 -0
  233. package/dist/design/audit/reference/engine/budget.d.ts.map +1 -0
  234. package/dist/design/audit/reference/engine/budget.js +110 -0
  235. package/dist/design/audit/reference/engine/budget.js.map +1 -0
  236. package/dist/design/audit/reference/engine/core.d.ts +32 -0
  237. package/dist/design/audit/reference/engine/core.d.ts.map +1 -0
  238. package/dist/design/audit/reference/engine/core.js +261 -0
  239. package/dist/design/audit/reference/engine/core.js.map +1 -0
  240. package/dist/design/audit/reference/engine/guard.d.ts +43 -0
  241. package/dist/design/audit/reference/engine/guard.d.ts.map +1 -0
  242. package/dist/design/audit/reference/engine/guard.js +43 -0
  243. package/dist/design/audit/reference/engine/guard.js.map +1 -0
  244. package/dist/design/audit/reference/engine/score-core.d.ts +48 -0
  245. package/dist/design/audit/reference/engine/score-core.d.ts.map +1 -0
  246. package/dist/design/audit/reference/engine/score-core.js +134 -0
  247. package/dist/design/audit/reference/engine/score-core.js.map +1 -0
  248. package/dist/design/audit/reference/engine/wiring.d.ts +35 -0
  249. package/dist/design/audit/reference/engine/wiring.d.ts.map +1 -0
  250. package/dist/design/audit/reference/engine/wiring.js +80 -0
  251. package/dist/design/audit/reference/engine/wiring.js.map +1 -0
  252. package/dist/design/audit/reference/eval/taste-core.d.ts +77 -0
  253. package/dist/design/audit/reference/eval/taste-core.d.ts.map +1 -0
  254. package/dist/design/audit/reference/eval/taste-core.js +95 -0
  255. package/dist/design/audit/reference/eval/taste-core.js.map +1 -0
  256. package/dist/design/audit/reference/generate/generator.d.ts +49 -0
  257. package/dist/design/audit/reference/generate/generator.d.ts.map +1 -0
  258. package/dist/design/audit/reference/generate/generator.js +100 -0
  259. package/dist/design/audit/reference/generate/generator.js.map +1 -0
  260. package/dist/design/audit/reference/generate/parse.d.ts +28 -0
  261. package/dist/design/audit/reference/generate/parse.d.ts.map +1 -0
  262. package/dist/design/audit/reference/generate/parse.js +220 -0
  263. package/dist/design/audit/reference/generate/parse.js.map +1 -0
  264. package/dist/design/audit/reference/generate/prompt.d.ts +36 -0
  265. package/dist/design/audit/reference/generate/prompt.d.ts.map +1 -0
  266. package/dist/design/audit/reference/generate/prompt.js +172 -0
  267. package/dist/design/audit/reference/generate/prompt.js.map +1 -0
  268. package/dist/design/audit/reference/index.d.ts +26 -0
  269. package/dist/design/audit/reference/index.d.ts.map +1 -0
  270. package/dist/design/audit/reference/index.js +31 -0
  271. package/dist/design/audit/reference/index.js.map +1 -0
  272. package/dist/design/audit/reference/judge/image-clamp.d.ts +34 -0
  273. package/dist/design/audit/reference/judge/image-clamp.d.ts.map +1 -0
  274. package/dist/design/audit/reference/judge/image-clamp.js +88 -0
  275. package/dist/design/audit/reference/judge/image-clamp.js.map +1 -0
  276. package/dist/design/audit/reference/judge/pairwise.d.ts +34 -0
  277. package/dist/design/audit/reference/judge/pairwise.d.ts.map +1 -0
  278. package/dist/design/audit/reference/judge/pairwise.js +105 -0
  279. package/dist/design/audit/reference/judge/pairwise.js.map +1 -0
  280. package/dist/design/audit/reference/judge/parse.d.ts +31 -0
  281. package/dist/design/audit/reference/judge/parse.d.ts.map +1 -0
  282. package/dist/design/audit/reference/judge/parse.js +113 -0
  283. package/dist/design/audit/reference/judge/parse.js.map +1 -0
  284. package/dist/design/audit/reference/judge/prompt.d.ts +38 -0
  285. package/dist/design/audit/reference/judge/prompt.d.ts.map +1 -0
  286. package/dist/design/audit/reference/judge/prompt.js +123 -0
  287. package/dist/design/audit/reference/judge/prompt.js.map +1 -0
  288. package/dist/design/audit/reference/judge/quality.d.ts +28 -0
  289. package/dist/design/audit/reference/judge/quality.d.ts.map +1 -0
  290. package/dist/design/audit/reference/judge/quality.js +62 -0
  291. package/dist/design/audit/reference/judge/quality.js.map +1 -0
  292. package/dist/design/audit/reference/judge/rank.d.ts +41 -0
  293. package/dist/design/audit/reference/judge/rank.d.ts.map +1 -0
  294. package/dist/design/audit/reference/judge/rank.js +196 -0
  295. package/dist/design/audit/reference/judge/rank.js.map +1 -0
  296. package/dist/design/audit/reference/judge/text-judge.d.ts +31 -0
  297. package/dist/design/audit/reference/judge/text-judge.d.ts.map +1 -0
  298. package/dist/design/audit/reference/judge/text-judge.js +43 -0
  299. package/dist/design/audit/reference/judge/text-judge.js.map +1 -0
  300. package/dist/design/audit/reference/judge/vision-judge.d.ts +59 -0
  301. package/dist/design/audit/reference/judge/vision-judge.d.ts.map +1 -0
  302. package/dist/design/audit/reference/judge/vision-judge.js +150 -0
  303. package/dist/design/audit/reference/judge/vision-judge.js.map +1 -0
  304. package/dist/design/audit/reference/judge/vision-model.d.ts +65 -0
  305. package/dist/design/audit/reference/judge/vision-model.d.ts.map +1 -0
  306. package/dist/design/audit/reference/judge/vision-model.js +110 -0
  307. package/dist/design/audit/reference/judge/vision-model.js.map +1 -0
  308. package/dist/design/audit/reference/pipeline/evaluate-reference.d.ts +68 -0
  309. package/dist/design/audit/reference/pipeline/evaluate-reference.d.ts.map +1 -0
  310. package/dist/design/audit/reference/pipeline/evaluate-reference.js +52 -0
  311. package/dist/design/audit/reference/pipeline/evaluate-reference.js.map +1 -0
  312. package/dist/design/audit/reference/reference-context.d.ts +31 -0
  313. package/dist/design/audit/reference/reference-context.d.ts.map +1 -0
  314. package/dist/design/audit/reference/reference-context.js +73 -0
  315. package/dist/design/audit/reference/reference-context.js.map +1 -0
  316. package/dist/design/audit/reference/retrieval/embedding-hash.d.ts +30 -0
  317. package/dist/design/audit/reference/retrieval/embedding-hash.d.ts.map +1 -0
  318. package/dist/design/audit/reference/retrieval/embedding-hash.js +87 -0
  319. package/dist/design/audit/reference/retrieval/embedding-hash.js.map +1 -0
  320. package/dist/design/audit/reference/retrieval/embedding-openai.d.ts +38 -0
  321. package/dist/design/audit/reference/retrieval/embedding-openai.d.ts.map +1 -0
  322. package/dist/design/audit/reference/retrieval/embedding-openai.js +73 -0
  323. package/dist/design/audit/reference/retrieval/embedding-openai.js.map +1 -0
  324. package/dist/design/audit/reference/retrieval/matcher.d.ts +34 -0
  325. package/dist/design/audit/reference/retrieval/matcher.d.ts.map +1 -0
  326. package/dist/design/audit/reference/retrieval/matcher.js +107 -0
  327. package/dist/design/audit/reference/retrieval/matcher.js.map +1 -0
  328. package/dist/design/audit/reference/run.d.ts +59 -0
  329. package/dist/design/audit/reference/run.d.ts.map +1 -0
  330. package/dist/design/audit/reference/run.js +99 -0
  331. package/dist/design/audit/reference/run.js.map +1 -0
  332. package/dist/design/audit/report.d.ts +35 -0
  333. package/dist/design/audit/report.d.ts.map +1 -0
  334. package/dist/design/audit/report.js +195 -0
  335. package/dist/design/audit/report.js.map +1 -0
  336. package/dist/design/audit/tokens/extract.d.ts +71 -0
  337. package/dist/design/audit/tokens/extract.d.ts.map +1 -0
  338. package/dist/design/audit/tokens/extract.js +1034 -0
  339. package/dist/design/audit/tokens/extract.js.map +1 -0
  340. package/dist/design/audit/types.d.ts +8 -0
  341. package/dist/design/audit/types.d.ts.map +1 -1
  342. package/dist/design/compare.d.ts.map +1 -1
  343. package/dist/design/compare.js +2 -6
  344. package/dist/design/compare.js.map +1 -1
  345. package/dist/design/cookie-consent.d.ts +3 -0
  346. package/dist/design/cookie-consent.d.ts.map +1 -0
  347. package/dist/design/cookie-consent.js +26 -0
  348. package/dist/design/cookie-consent.js.map +1 -0
  349. package/dist/design/viewports.d.ts +18 -0
  350. package/dist/design/viewports.d.ts.map +1 -0
  351. package/dist/design/viewports.js +10 -0
  352. package/dist/design/viewports.js.map +1 -0
  353. package/dist/index.d.ts +2 -2
  354. package/dist/index.d.ts.map +1 -1
  355. package/dist/index.js +1 -1
  356. package/dist/index.js.map +1 -1
  357. package/dist/memory/store.d.ts +19 -1
  358. package/dist/memory/store.d.ts.map +1 -1
  359. package/dist/memory/store.js +47 -0
  360. package/dist/memory/store.js.map +1 -1
  361. package/dist/provider-defaults.d.ts +18 -0
  362. package/dist/provider-defaults.d.ts.map +1 -1
  363. package/dist/provider-defaults.js +33 -0
  364. package/dist/provider-defaults.js.map +1 -1
  365. package/dist/runner/allowed-domains.d.ts +11 -0
  366. package/dist/runner/allowed-domains.d.ts.map +1 -0
  367. package/dist/runner/allowed-domains.js +14 -0
  368. package/dist/runner/allowed-domains.js.map +1 -0
  369. package/dist/runner/batch-fill.d.ts +28 -0
  370. package/dist/runner/batch-fill.d.ts.map +1 -0
  371. package/dist/runner/batch-fill.js +80 -0
  372. package/dist/runner/batch-fill.js.map +1 -0
  373. package/dist/runner/completion-policy.d.ts +26 -0
  374. package/dist/runner/completion-policy.d.ts.map +1 -0
  375. package/dist/runner/completion-policy.js +76 -0
  376. package/dist/runner/completion-policy.js.map +1 -0
  377. package/dist/runner/constants.d.ts +14 -0
  378. package/dist/runner/constants.d.ts.map +1 -0
  379. package/dist/runner/constants.js +23 -0
  380. package/dist/runner/constants.js.map +1 -0
  381. package/dist/runner/decision-screenshot.d.ts +24 -0
  382. package/dist/runner/decision-screenshot.d.ts.map +1 -0
  383. package/dist/runner/decision-screenshot.js +23 -0
  384. package/dist/runner/decision-screenshot.js.map +1 -0
  385. package/dist/runner/domain-boundary.d.ts +36 -0
  386. package/dist/runner/domain-boundary.d.ts.map +1 -0
  387. package/dist/runner/domain-boundary.js +81 -0
  388. package/dist/runner/domain-boundary.js.map +1 -0
  389. package/dist/runner/effect-verify.d.ts +28 -0
  390. package/dist/runner/effect-verify.d.ts.map +1 -0
  391. package/dist/runner/effect-verify.js +42 -0
  392. package/dist/runner/effect-verify.js.map +1 -0
  393. package/dist/runner/execute-plan.d.ts +58 -0
  394. package/dist/runner/execute-plan.d.ts.map +1 -0
  395. package/dist/runner/execute-plan.js +426 -0
  396. package/dist/runner/execute-plan.js.map +1 -0
  397. package/dist/runner/max-turns-extension.d.ts +19 -0
  398. package/dist/runner/max-turns-extension.d.ts.map +1 -0
  399. package/dist/runner/max-turns-extension.js +25 -0
  400. package/dist/runner/max-turns-extension.js.map +1 -0
  401. package/dist/runner/micro-plan.d.ts +11 -0
  402. package/dist/runner/micro-plan.d.ts.map +1 -0
  403. package/dist/runner/micro-plan.js +29 -0
  404. package/dist/runner/micro-plan.js.map +1 -0
  405. package/dist/runner/prompt-snippets.d.ts +5 -0
  406. package/dist/runner/prompt-snippets.d.ts.map +1 -0
  407. package/dist/runner/prompt-snippets.js +13 -0
  408. package/dist/runner/prompt-snippets.js.map +1 -0
  409. package/dist/runner/replay/contracts.d.ts +300 -0
  410. package/dist/runner/replay/contracts.d.ts.map +1 -0
  411. package/dist/runner/replay/contracts.js +42 -0
  412. package/dist/runner/replay/contracts.js.map +1 -0
  413. package/dist/runner/replay/controller.d.ts +27 -0
  414. package/dist/runner/replay/controller.d.ts.map +1 -0
  415. package/dist/runner/replay/controller.js +197 -0
  416. package/dist/runner/replay/controller.js.map +1 -0
  417. package/dist/runner/replay/guard.d.ts +28 -0
  418. package/dist/runner/replay/guard.d.ts.map +1 -0
  419. package/dist/runner/replay/guard.js +100 -0
  420. package/dist/runner/replay/guard.js.map +1 -0
  421. package/dist/runner/runner.d.ts +44 -51
  422. package/dist/runner/runner.d.ts.map +1 -1
  423. package/dist/runner/runner.js +155 -851
  424. package/dist/runner/runner.js.map +1 -1
  425. package/dist/runner/scout-feedback.d.ts +51 -0
  426. package/dist/runner/scout-feedback.d.ts.map +1 -0
  427. package/dist/runner/scout-feedback.js +149 -0
  428. package/dist/runner/scout-feedback.js.map +1 -0
  429. package/dist/skills/macro-loader.d.ts +1 -1
  430. package/dist/test-runner.d.ts.map +1 -1
  431. package/dist/test-runner.js +27 -1
  432. package/dist/test-runner.js.map +1 -1
  433. package/dist/types/actions.d.ts +241 -0
  434. package/dist/types/actions.d.ts.map +1 -0
  435. package/dist/types/actions.js +5 -0
  436. package/dist/types/actions.js.map +1 -0
  437. package/dist/types/config.d.ts +211 -0
  438. package/dist/types/config.d.ts.map +1 -0
  439. package/dist/types/config.js +2 -0
  440. package/dist/types/config.js.map +1 -0
  441. package/dist/types/design-audit.d.ts +92 -0
  442. package/dist/types/design-audit.d.ts.map +1 -0
  443. package/dist/types/design-audit.js +5 -0
  444. package/dist/types/design-audit.js.map +1 -0
  445. package/dist/types/design-tokens.d.ts +138 -0
  446. package/dist/types/design-tokens.d.ts.map +1 -0
  447. package/dist/types/design-tokens.js +5 -0
  448. package/dist/types/design-tokens.js.map +1 -0
  449. package/dist/types/page.d.ts +16 -0
  450. package/dist/types/page.d.ts.map +1 -0
  451. package/dist/types/page.js +2 -0
  452. package/dist/types/page.js.map +1 -0
  453. package/dist/types/plan.d.ts +50 -0
  454. package/dist/types/plan.d.ts.map +1 -0
  455. package/dist/types/plan.js +2 -0
  456. package/dist/types/plan.js.map +1 -0
  457. package/dist/types/preview.d.ts +9 -0
  458. package/dist/types/preview.d.ts.map +1 -0
  459. package/dist/types/preview.js +5 -0
  460. package/dist/types/preview.js.map +1 -0
  461. package/dist/types/result.d.ts +62 -0
  462. package/dist/types/result.d.ts.map +1 -0
  463. package/dist/types/result.js +2 -0
  464. package/dist/types/result.js.map +1 -0
  465. package/dist/types/scenario.d.ts +20 -0
  466. package/dist/types/scenario.d.ts.map +1 -0
  467. package/dist/types/scenario.js +5 -0
  468. package/dist/types/scenario.js.map +1 -0
  469. package/dist/types/test-runner.d.ts +145 -0
  470. package/dist/types/test-runner.d.ts.map +1 -0
  471. package/dist/types/test-runner.js +10 -0
  472. package/dist/types/test-runner.js.map +1 -0
  473. package/dist/types/trajectory.d.ts +38 -0
  474. package/dist/types/trajectory.d.ts.map +1 -0
  475. package/dist/types/trajectory.js +2 -0
  476. package/dist/types/trajectory.js.map +1 -0
  477. package/dist/types/turn.d.ts +50 -0
  478. package/dist/types/turn.d.ts.map +1 -0
  479. package/dist/types/turn.js +2 -0
  480. package/dist/types/turn.js.map +1 -0
  481. package/dist/types.d.ts +16 -1017
  482. package/dist/types.d.ts.map +1 -1
  483. package/dist/types.js +15 -8
  484. package/dist/types.js.map +1 -1
  485. package/dist/wallet/rpc-interception.d.ts +15 -0
  486. package/dist/wallet/rpc-interception.d.ts.map +1 -0
  487. package/dist/wallet/rpc-interception.js +95 -0
  488. package/dist/wallet/rpc-interception.js.map +1 -0
  489. package/package.json +23 -5
@@ -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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"}