@tangle-network/browser-agent-driver 0.33.2 → 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.
Files changed (485) 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/cli/args.d.ts +141 -0
  77. package/dist/cli/args.d.ts.map +1 -0
  78. package/dist/cli/args.js +167 -0
  79. package/dist/cli/args.js.map +1 -0
  80. package/dist/cli/benchmark-sync.d.ts +9 -0
  81. package/dist/cli/benchmark-sync.d.ts.map +1 -0
  82. package/dist/cli/benchmark-sync.js +43 -0
  83. package/dist/cli/benchmark-sync.js.map +1 -0
  84. package/dist/cli/build-config.d.ts +11 -0
  85. package/dist/cli/build-config.d.ts.map +1 -0
  86. package/dist/cli/build-config.js +355 -0
  87. package/dist/cli/build-config.js.map +1 -0
  88. package/dist/cli/commands/auth.d.ts +3 -0
  89. package/dist/cli/commands/auth.d.ts.map +1 -0
  90. package/dist/cli/commands/auth.js +36 -0
  91. package/dist/cli/commands/auth.js.map +1 -0
  92. package/dist/cli/commands/chrome-debug.d.ts +7 -0
  93. package/dist/cli/commands/chrome-debug.d.ts.map +1 -0
  94. package/dist/cli/commands/chrome-debug.js +11 -0
  95. package/dist/cli/commands/chrome-debug.js.map +1 -0
  96. package/dist/cli/commands/design-audit.d.ts +3 -0
  97. package/dist/cli/commands/design-audit.d.ts.map +1 -0
  98. package/dist/cli/commands/design-audit.js +68 -0
  99. package/dist/cli/commands/design-audit.js.map +1 -0
  100. package/dist/cli/commands/preview.d.ts +14 -0
  101. package/dist/cli/commands/preview.d.ts.map +1 -0
  102. package/dist/cli/commands/preview.js +31 -0
  103. package/dist/cli/commands/preview.js.map +1 -0
  104. package/dist/cli/commands/run.d.ts +3 -0
  105. package/dist/cli/commands/run.d.ts.map +1 -0
  106. package/dist/cli/commands/run.js +728 -0
  107. package/dist/cli/commands/run.js.map +1 -0
  108. package/dist/cli/commands/runs.d.ts +8 -0
  109. package/dist/cli/commands/runs.d.ts.map +1 -0
  110. package/dist/cli/commands/runs.js +35 -0
  111. package/dist/cli/commands/runs.js.map +1 -0
  112. package/dist/cli/commands/share.d.ts +10 -0
  113. package/dist/cli/commands/share.d.ts.map +1 -0
  114. package/dist/cli/commands/share.js +32 -0
  115. package/dist/cli/commands/share.js.map +1 -0
  116. package/dist/cli/commands/showcase.d.ts +17 -0
  117. package/dist/cli/commands/showcase.d.ts.map +1 -0
  118. package/dist/cli/commands/showcase.js +20 -0
  119. package/dist/cli/commands/showcase.js.map +1 -0
  120. package/dist/cli/commands/snapshot.d.ts +12 -0
  121. package/dist/cli/commands/snapshot.d.ts.map +1 -0
  122. package/dist/cli/commands/snapshot.js +24 -0
  123. package/dist/cli/commands/snapshot.js.map +1 -0
  124. package/dist/cli/commands/view.d.ts +7 -0
  125. package/dist/cli/commands/view.d.ts.map +1 -0
  126. package/dist/cli/commands/view.js +23 -0
  127. package/dist/cli/commands/view.js.map +1 -0
  128. package/dist/cli/constants.d.ts +6 -0
  129. package/dist/cli/constants.d.ts.map +1 -0
  130. package/dist/cli/constants.js +3 -0
  131. package/dist/cli/constants.js.map +1 -0
  132. package/dist/cli/version.d.ts +7 -0
  133. package/dist/cli/version.d.ts.map +1 -0
  134. package/dist/cli/version.js +16 -0
  135. package/dist/cli/version.js.map +1 -0
  136. package/dist/cli-design-audit.d.ts +44 -36
  137. package/dist/cli-design-audit.d.ts.map +1 -1
  138. package/dist/cli-design-audit.js +137 -1646
  139. package/dist/cli-design-audit.js.map +1 -1
  140. package/dist/cli-jobs.js +2 -1
  141. package/dist/cli-jobs.js.map +1 -1
  142. package/dist/cli.js +66 -1697
  143. package/dist/cli.js.map +1 -1
  144. package/dist/config.d.ts +5 -0
  145. package/dist/config.d.ts.map +1 -1
  146. package/dist/config.js +8 -0
  147. package/dist/config.js.map +1 -1
  148. package/dist/design/audit/evolve/agent.d.ts +23 -0
  149. package/dist/design/audit/evolve/agent.d.ts.map +1 -0
  150. package/dist/design/audit/evolve/agent.js +272 -0
  151. package/dist/design/audit/evolve/agent.js.map +1 -0
  152. package/dist/design/audit/evolve/css.d.ts +10 -0
  153. package/dist/design/audit/evolve/css.d.ts.map +1 -0
  154. package/dist/design/audit/evolve/css.js +206 -0
  155. package/dist/design/audit/evolve/css.js.map +1 -0
  156. package/dist/design/audit/evolve/index.d.ts +13 -0
  157. package/dist/design/audit/evolve/index.d.ts.map +1 -0
  158. package/dist/design/audit/evolve/index.js +12 -0
  159. package/dist/design/audit/evolve/index.js.map +1 -0
  160. package/dist/design/audit/evolve/report.d.ts +3 -0
  161. package/dist/design/audit/evolve/report.d.ts.map +1 -0
  162. package/dist/design/audit/evolve/report.js +45 -0
  163. package/dist/design/audit/evolve/report.js.map +1 -0
  164. package/dist/design/audit/evolve/types.d.ts +14 -0
  165. package/dist/design/audit/evolve/types.d.ts.map +1 -0
  166. package/dist/design/audit/evolve/types.js +2 -0
  167. package/dist/design/audit/evolve/types.js.map +1 -0
  168. package/dist/design/audit/pipeline.d.ts +12 -0
  169. package/dist/design/audit/pipeline.d.ts.map +1 -1
  170. package/dist/design/audit/pipeline.js +43 -27
  171. package/dist/design/audit/pipeline.js.map +1 -1
  172. package/dist/design/audit/reference/artifact/build.d.ts +33 -0
  173. package/dist/design/audit/reference/artifact/build.d.ts.map +1 -0
  174. package/dist/design/audit/reference/artifact/build.js +64 -0
  175. package/dist/design/audit/reference/artifact/build.js.map +1 -0
  176. package/dist/design/audit/reference/artifact/render.d.ts +39 -0
  177. package/dist/design/audit/reference/artifact/render.d.ts.map +1 -0
  178. package/dist/design/audit/reference/artifact/render.js +213 -0
  179. package/dist/design/audit/reference/artifact/render.js.map +1 -0
  180. package/dist/design/audit/reference/artifact/text.d.ts +11 -0
  181. package/dist/design/audit/reference/artifact/text.d.ts.map +1 -0
  182. package/dist/design/audit/reference/artifact/text.js +20 -0
  183. package/dist/design/audit/reference/artifact/text.js.map +1 -0
  184. package/dist/design/audit/reference/artifact/to-findings.d.ts +57 -0
  185. package/dist/design/audit/reference/artifact/to-findings.d.ts.map +1 -0
  186. package/dist/design/audit/reference/artifact/to-findings.js +314 -0
  187. package/dist/design/audit/reference/artifact/to-findings.js.map +1 -0
  188. package/dist/design/audit/reference/config.d.ts +50 -0
  189. package/dist/design/audit/reference/config.d.ts.map +1 -0
  190. package/dist/design/audit/reference/config.js +108 -0
  191. package/dist/design/audit/reference/config.js.map +1 -0
  192. package/dist/design/audit/reference/contracts.d.ts +1030 -0
  193. package/dist/design/audit/reference/contracts.d.ts.map +1 -0
  194. package/dist/design/audit/reference/contracts.js +28 -0
  195. package/dist/design/audit/reference/contracts.js.map +1 -0
  196. package/dist/design/audit/reference/corpus/build.d.ts +115 -0
  197. package/dist/design/audit/reference/corpus/build.d.ts.map +1 -0
  198. package/dist/design/audit/reference/corpus/build.js +152 -0
  199. package/dist/design/audit/reference/corpus/build.js.map +1 -0
  200. package/dist/design/audit/reference/corpus/schema.d.ts +33 -0
  201. package/dist/design/audit/reference/corpus/schema.d.ts.map +1 -0
  202. package/dist/design/audit/reference/corpus/schema.js +249 -0
  203. package/dist/design/audit/reference/corpus/schema.js.map +1 -0
  204. package/dist/design/audit/reference/corpus/store.d.ts +26 -0
  205. package/dist/design/audit/reference/corpus/store.d.ts.map +1 -0
  206. package/dist/design/audit/reference/corpus/store.js +104 -0
  207. package/dist/design/audit/reference/corpus/store.js.map +1 -0
  208. package/dist/design/audit/reference/dna/delta.d.ts +21 -0
  209. package/dist/design/audit/reference/dna/delta.d.ts.map +1 -0
  210. package/dist/design/audit/reference/dna/delta.js +126 -0
  211. package/dist/design/audit/reference/dna/delta.js.map +1 -0
  212. package/dist/design/audit/reference/dna/derive.d.ts +31 -0
  213. package/dist/design/audit/reference/dna/derive.d.ts.map +1 -0
  214. package/dist/design/audit/reference/dna/derive.js +381 -0
  215. package/dist/design/audit/reference/dna/derive.js.map +1 -0
  216. package/dist/design/audit/reference/dna/descriptor.d.ts +36 -0
  217. package/dist/design/audit/reference/dna/descriptor.d.ts.map +1 -0
  218. package/dist/design/audit/reference/dna/descriptor.js +209 -0
  219. package/dist/design/audit/reference/dna/descriptor.js.map +1 -0
  220. package/dist/design/audit/reference/dna/page-adapter.d.ts +17 -0
  221. package/dist/design/audit/reference/dna/page-adapter.d.ts.map +1 -0
  222. package/dist/design/audit/reference/dna/page-adapter.js +35 -0
  223. package/dist/design/audit/reference/dna/page-adapter.js.map +1 -0
  224. package/dist/design/audit/reference/dna/scroll-capture.d.ts +93 -0
  225. package/dist/design/audit/reference/dna/scroll-capture.d.ts.map +1 -0
  226. package/dist/design/audit/reference/dna/scroll-capture.js +374 -0
  227. package/dist/design/audit/reference/dna/scroll-capture.js.map +1 -0
  228. package/dist/design/audit/reference/engine/budget.d.ts +63 -0
  229. package/dist/design/audit/reference/engine/budget.d.ts.map +1 -0
  230. package/dist/design/audit/reference/engine/budget.js +110 -0
  231. package/dist/design/audit/reference/engine/budget.js.map +1 -0
  232. package/dist/design/audit/reference/engine/core.d.ts +32 -0
  233. package/dist/design/audit/reference/engine/core.d.ts.map +1 -0
  234. package/dist/design/audit/reference/engine/core.js +261 -0
  235. package/dist/design/audit/reference/engine/core.js.map +1 -0
  236. package/dist/design/audit/reference/engine/guard.d.ts +43 -0
  237. package/dist/design/audit/reference/engine/guard.d.ts.map +1 -0
  238. package/dist/design/audit/reference/engine/guard.js +43 -0
  239. package/dist/design/audit/reference/engine/guard.js.map +1 -0
  240. package/dist/design/audit/reference/engine/score-core.d.ts +48 -0
  241. package/dist/design/audit/reference/engine/score-core.d.ts.map +1 -0
  242. package/dist/design/audit/reference/engine/score-core.js +134 -0
  243. package/dist/design/audit/reference/engine/score-core.js.map +1 -0
  244. package/dist/design/audit/reference/engine/wiring.d.ts +35 -0
  245. package/dist/design/audit/reference/engine/wiring.d.ts.map +1 -0
  246. package/dist/design/audit/reference/engine/wiring.js +80 -0
  247. package/dist/design/audit/reference/engine/wiring.js.map +1 -0
  248. package/dist/design/audit/reference/eval/taste-core.d.ts +77 -0
  249. package/dist/design/audit/reference/eval/taste-core.d.ts.map +1 -0
  250. package/dist/design/audit/reference/eval/taste-core.js +95 -0
  251. package/dist/design/audit/reference/eval/taste-core.js.map +1 -0
  252. package/dist/design/audit/reference/generate/generator.d.ts +49 -0
  253. package/dist/design/audit/reference/generate/generator.d.ts.map +1 -0
  254. package/dist/design/audit/reference/generate/generator.js +94 -0
  255. package/dist/design/audit/reference/generate/generator.js.map +1 -0
  256. package/dist/design/audit/reference/generate/parse.d.ts +28 -0
  257. package/dist/design/audit/reference/generate/parse.d.ts.map +1 -0
  258. package/dist/design/audit/reference/generate/parse.js +180 -0
  259. package/dist/design/audit/reference/generate/parse.js.map +1 -0
  260. package/dist/design/audit/reference/generate/prompt.d.ts +36 -0
  261. package/dist/design/audit/reference/generate/prompt.d.ts.map +1 -0
  262. package/dist/design/audit/reference/generate/prompt.js +124 -0
  263. package/dist/design/audit/reference/generate/prompt.js.map +1 -0
  264. package/dist/design/audit/reference/index.d.ts +26 -0
  265. package/dist/design/audit/reference/index.d.ts.map +1 -0
  266. package/dist/design/audit/reference/index.js +31 -0
  267. package/dist/design/audit/reference/index.js.map +1 -0
  268. package/dist/design/audit/reference/judge/image-clamp.d.ts +34 -0
  269. package/dist/design/audit/reference/judge/image-clamp.d.ts.map +1 -0
  270. package/dist/design/audit/reference/judge/image-clamp.js +88 -0
  271. package/dist/design/audit/reference/judge/image-clamp.js.map +1 -0
  272. package/dist/design/audit/reference/judge/pairwise.d.ts +34 -0
  273. package/dist/design/audit/reference/judge/pairwise.d.ts.map +1 -0
  274. package/dist/design/audit/reference/judge/pairwise.js +105 -0
  275. package/dist/design/audit/reference/judge/pairwise.js.map +1 -0
  276. package/dist/design/audit/reference/judge/parse.d.ts +31 -0
  277. package/dist/design/audit/reference/judge/parse.d.ts.map +1 -0
  278. package/dist/design/audit/reference/judge/parse.js +113 -0
  279. package/dist/design/audit/reference/judge/parse.js.map +1 -0
  280. package/dist/design/audit/reference/judge/prompt.d.ts +38 -0
  281. package/dist/design/audit/reference/judge/prompt.d.ts.map +1 -0
  282. package/dist/design/audit/reference/judge/prompt.js +111 -0
  283. package/dist/design/audit/reference/judge/prompt.js.map +1 -0
  284. package/dist/design/audit/reference/judge/quality.d.ts +28 -0
  285. package/dist/design/audit/reference/judge/quality.d.ts.map +1 -0
  286. package/dist/design/audit/reference/judge/quality.js +62 -0
  287. package/dist/design/audit/reference/judge/quality.js.map +1 -0
  288. package/dist/design/audit/reference/judge/rank.d.ts +41 -0
  289. package/dist/design/audit/reference/judge/rank.d.ts.map +1 -0
  290. package/dist/design/audit/reference/judge/rank.js +196 -0
  291. package/dist/design/audit/reference/judge/rank.js.map +1 -0
  292. package/dist/design/audit/reference/judge/text-judge.d.ts +31 -0
  293. package/dist/design/audit/reference/judge/text-judge.d.ts.map +1 -0
  294. package/dist/design/audit/reference/judge/text-judge.js +43 -0
  295. package/dist/design/audit/reference/judge/text-judge.js.map +1 -0
  296. package/dist/design/audit/reference/judge/vision-judge.d.ts +59 -0
  297. package/dist/design/audit/reference/judge/vision-judge.d.ts.map +1 -0
  298. package/dist/design/audit/reference/judge/vision-judge.js +150 -0
  299. package/dist/design/audit/reference/judge/vision-judge.js.map +1 -0
  300. package/dist/design/audit/reference/judge/vision-model.d.ts +65 -0
  301. package/dist/design/audit/reference/judge/vision-model.d.ts.map +1 -0
  302. package/dist/design/audit/reference/judge/vision-model.js +110 -0
  303. package/dist/design/audit/reference/judge/vision-model.js.map +1 -0
  304. package/dist/design/audit/reference/pipeline/evaluate-reference.d.ts +68 -0
  305. package/dist/design/audit/reference/pipeline/evaluate-reference.d.ts.map +1 -0
  306. package/dist/design/audit/reference/pipeline/evaluate-reference.js +52 -0
  307. package/dist/design/audit/reference/pipeline/evaluate-reference.js.map +1 -0
  308. package/dist/design/audit/reference/reference-context.d.ts +31 -0
  309. package/dist/design/audit/reference/reference-context.d.ts.map +1 -0
  310. package/dist/design/audit/reference/reference-context.js +73 -0
  311. package/dist/design/audit/reference/reference-context.js.map +1 -0
  312. package/dist/design/audit/reference/retrieval/embedding-hash.d.ts +30 -0
  313. package/dist/design/audit/reference/retrieval/embedding-hash.d.ts.map +1 -0
  314. package/dist/design/audit/reference/retrieval/embedding-hash.js +87 -0
  315. package/dist/design/audit/reference/retrieval/embedding-hash.js.map +1 -0
  316. package/dist/design/audit/reference/retrieval/embedding-openai.d.ts +38 -0
  317. package/dist/design/audit/reference/retrieval/embedding-openai.d.ts.map +1 -0
  318. package/dist/design/audit/reference/retrieval/embedding-openai.js +73 -0
  319. package/dist/design/audit/reference/retrieval/embedding-openai.js.map +1 -0
  320. package/dist/design/audit/reference/retrieval/matcher.d.ts +34 -0
  321. package/dist/design/audit/reference/retrieval/matcher.d.ts.map +1 -0
  322. package/dist/design/audit/reference/retrieval/matcher.js +107 -0
  323. package/dist/design/audit/reference/retrieval/matcher.js.map +1 -0
  324. package/dist/design/audit/reference/run.d.ts +59 -0
  325. package/dist/design/audit/reference/run.d.ts.map +1 -0
  326. package/dist/design/audit/reference/run.js +99 -0
  327. package/dist/design/audit/reference/run.js.map +1 -0
  328. package/dist/design/audit/report.d.ts +35 -0
  329. package/dist/design/audit/report.d.ts.map +1 -0
  330. package/dist/design/audit/report.js +195 -0
  331. package/dist/design/audit/report.js.map +1 -0
  332. package/dist/design/audit/tokens/extract.d.ts +71 -0
  333. package/dist/design/audit/tokens/extract.d.ts.map +1 -0
  334. package/dist/design/audit/tokens/extract.js +1034 -0
  335. package/dist/design/audit/tokens/extract.js.map +1 -0
  336. package/dist/design/audit/types.d.ts +8 -0
  337. package/dist/design/audit/types.d.ts.map +1 -1
  338. package/dist/design/compare.d.ts.map +1 -1
  339. package/dist/design/compare.js +2 -6
  340. package/dist/design/compare.js.map +1 -1
  341. package/dist/design/cookie-consent.d.ts +3 -0
  342. package/dist/design/cookie-consent.d.ts.map +1 -0
  343. package/dist/design/cookie-consent.js +26 -0
  344. package/dist/design/cookie-consent.js.map +1 -0
  345. package/dist/design/viewports.d.ts +18 -0
  346. package/dist/design/viewports.d.ts.map +1 -0
  347. package/dist/design/viewports.js +10 -0
  348. package/dist/design/viewports.js.map +1 -0
  349. package/dist/index.d.ts +2 -2
  350. package/dist/index.d.ts.map +1 -1
  351. package/dist/index.js +1 -1
  352. package/dist/index.js.map +1 -1
  353. package/dist/memory/store.d.ts +19 -1
  354. package/dist/memory/store.d.ts.map +1 -1
  355. package/dist/memory/store.js +47 -0
  356. package/dist/memory/store.js.map +1 -1
  357. package/dist/provider-defaults.d.ts +18 -0
  358. package/dist/provider-defaults.d.ts.map +1 -1
  359. package/dist/provider-defaults.js +33 -0
  360. package/dist/provider-defaults.js.map +1 -1
  361. package/dist/runner/allowed-domains.d.ts +11 -0
  362. package/dist/runner/allowed-domains.d.ts.map +1 -0
  363. package/dist/runner/allowed-domains.js +14 -0
  364. package/dist/runner/allowed-domains.js.map +1 -0
  365. package/dist/runner/batch-fill.d.ts +28 -0
  366. package/dist/runner/batch-fill.d.ts.map +1 -0
  367. package/dist/runner/batch-fill.js +80 -0
  368. package/dist/runner/batch-fill.js.map +1 -0
  369. package/dist/runner/completion-policy.d.ts +26 -0
  370. package/dist/runner/completion-policy.d.ts.map +1 -0
  371. package/dist/runner/completion-policy.js +76 -0
  372. package/dist/runner/completion-policy.js.map +1 -0
  373. package/dist/runner/constants.d.ts +14 -0
  374. package/dist/runner/constants.d.ts.map +1 -0
  375. package/dist/runner/constants.js +23 -0
  376. package/dist/runner/constants.js.map +1 -0
  377. package/dist/runner/decision-screenshot.d.ts +24 -0
  378. package/dist/runner/decision-screenshot.d.ts.map +1 -0
  379. package/dist/runner/decision-screenshot.js +23 -0
  380. package/dist/runner/decision-screenshot.js.map +1 -0
  381. package/dist/runner/domain-boundary.d.ts +36 -0
  382. package/dist/runner/domain-boundary.d.ts.map +1 -0
  383. package/dist/runner/domain-boundary.js +81 -0
  384. package/dist/runner/domain-boundary.js.map +1 -0
  385. package/dist/runner/effect-verify.d.ts +28 -0
  386. package/dist/runner/effect-verify.d.ts.map +1 -0
  387. package/dist/runner/effect-verify.js +42 -0
  388. package/dist/runner/effect-verify.js.map +1 -0
  389. package/dist/runner/execute-plan.d.ts +58 -0
  390. package/dist/runner/execute-plan.d.ts.map +1 -0
  391. package/dist/runner/execute-plan.js +426 -0
  392. package/dist/runner/execute-plan.js.map +1 -0
  393. package/dist/runner/max-turns-extension.d.ts +19 -0
  394. package/dist/runner/max-turns-extension.d.ts.map +1 -0
  395. package/dist/runner/max-turns-extension.js +25 -0
  396. package/dist/runner/max-turns-extension.js.map +1 -0
  397. package/dist/runner/micro-plan.d.ts +11 -0
  398. package/dist/runner/micro-plan.d.ts.map +1 -0
  399. package/dist/runner/micro-plan.js +29 -0
  400. package/dist/runner/micro-plan.js.map +1 -0
  401. package/dist/runner/prompt-snippets.d.ts +5 -0
  402. package/dist/runner/prompt-snippets.d.ts.map +1 -0
  403. package/dist/runner/prompt-snippets.js +13 -0
  404. package/dist/runner/prompt-snippets.js.map +1 -0
  405. package/dist/runner/replay/contracts.d.ts +300 -0
  406. package/dist/runner/replay/contracts.d.ts.map +1 -0
  407. package/dist/runner/replay/contracts.js +42 -0
  408. package/dist/runner/replay/contracts.js.map +1 -0
  409. package/dist/runner/replay/controller.d.ts +27 -0
  410. package/dist/runner/replay/controller.d.ts.map +1 -0
  411. package/dist/runner/replay/controller.js +197 -0
  412. package/dist/runner/replay/controller.js.map +1 -0
  413. package/dist/runner/replay/guard.d.ts +28 -0
  414. package/dist/runner/replay/guard.d.ts.map +1 -0
  415. package/dist/runner/replay/guard.js +100 -0
  416. package/dist/runner/replay/guard.js.map +1 -0
  417. package/dist/runner/runner.d.ts +44 -51
  418. package/dist/runner/runner.d.ts.map +1 -1
  419. package/dist/runner/runner.js +155 -851
  420. package/dist/runner/runner.js.map +1 -1
  421. package/dist/runner/scout-feedback.d.ts +51 -0
  422. package/dist/runner/scout-feedback.d.ts.map +1 -0
  423. package/dist/runner/scout-feedback.js +149 -0
  424. package/dist/runner/scout-feedback.js.map +1 -0
  425. package/dist/skills/macro-loader.d.ts +1 -1
  426. package/dist/test-runner.d.ts.map +1 -1
  427. package/dist/test-runner.js +25 -0
  428. package/dist/test-runner.js.map +1 -1
  429. package/dist/types/actions.d.ts +241 -0
  430. package/dist/types/actions.d.ts.map +1 -0
  431. package/dist/types/actions.js +5 -0
  432. package/dist/types/actions.js.map +1 -0
  433. package/dist/types/config.d.ts +211 -0
  434. package/dist/types/config.d.ts.map +1 -0
  435. package/dist/types/config.js +2 -0
  436. package/dist/types/config.js.map +1 -0
  437. package/dist/types/design-audit.d.ts +92 -0
  438. package/dist/types/design-audit.d.ts.map +1 -0
  439. package/dist/types/design-audit.js +5 -0
  440. package/dist/types/design-audit.js.map +1 -0
  441. package/dist/types/design-tokens.d.ts +138 -0
  442. package/dist/types/design-tokens.d.ts.map +1 -0
  443. package/dist/types/design-tokens.js +5 -0
  444. package/dist/types/design-tokens.js.map +1 -0
  445. package/dist/types/page.d.ts +16 -0
  446. package/dist/types/page.d.ts.map +1 -0
  447. package/dist/types/page.js +2 -0
  448. package/dist/types/page.js.map +1 -0
  449. package/dist/types/plan.d.ts +50 -0
  450. package/dist/types/plan.d.ts.map +1 -0
  451. package/dist/types/plan.js +2 -0
  452. package/dist/types/plan.js.map +1 -0
  453. package/dist/types/preview.d.ts +9 -0
  454. package/dist/types/preview.d.ts.map +1 -0
  455. package/dist/types/preview.js +5 -0
  456. package/dist/types/preview.js.map +1 -0
  457. package/dist/types/result.d.ts +62 -0
  458. package/dist/types/result.d.ts.map +1 -0
  459. package/dist/types/result.js +2 -0
  460. package/dist/types/result.js.map +1 -0
  461. package/dist/types/scenario.d.ts +20 -0
  462. package/dist/types/scenario.d.ts.map +1 -0
  463. package/dist/types/scenario.js +5 -0
  464. package/dist/types/scenario.js.map +1 -0
  465. package/dist/types/test-runner.d.ts +145 -0
  466. package/dist/types/test-runner.d.ts.map +1 -0
  467. package/dist/types/test-runner.js +10 -0
  468. package/dist/types/test-runner.js.map +1 -0
  469. package/dist/types/trajectory.d.ts +38 -0
  470. package/dist/types/trajectory.d.ts.map +1 -0
  471. package/dist/types/trajectory.js +2 -0
  472. package/dist/types/trajectory.js.map +1 -0
  473. package/dist/types/turn.d.ts +50 -0
  474. package/dist/types/turn.d.ts.map +1 -0
  475. package/dist/types/turn.js +2 -0
  476. package/dist/types/turn.js.map +1 -0
  477. package/dist/types.d.ts +16 -1017
  478. package/dist/types.d.ts.map +1 -1
  479. package/dist/types.js +15 -8
  480. package/dist/types.js.map +1 -1
  481. package/dist/wallet/rpc-interception.d.ts +15 -0
  482. package/dist/wallet/rpc-interception.d.ts.map +1 -0
  483. package/dist/wallet/rpc-interception.js +95 -0
  484. package/dist/wallet/rpc-interception.js.map +1 -0
  485. package/package.json +7 -3
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Direction ranking — the PURE Bradley-Terry / Elo rollup. Folds many debiased
3
+ * `TasteVerdict`s into a single `RankResult`. No IO, no model: deterministic for
4
+ * a fixed verdict set, so `rankDirections` IS the `DirectionRanker`
5
+ * implementation (`{ rank: rankDirections }` at the wiring root).
6
+ *
7
+ * Two complementary solvers, both reported:
8
+ * - Bradley-Terry strengths via minorization-maximization (the maximum-
9
+ * likelihood stationary ranking; order-independent, sum-normalised).
10
+ * - Elo via sequential `updateElo` (cheap, online, conserves total rating).
11
+ *
12
+ * The published order is by Bradley-Terry strength, with Elo then id as
13
+ * deterministic tie-breaks. `calibrateAgainstVotes` scores judge-vs-human
14
+ * agreement so the taste judge can be validated against ground-truth votes.
15
+ */
16
+ const ELO_START = 1500;
17
+ const ELO_K = 32;
18
+ const BT_ITERATIONS = 200;
19
+ const round2 = (n) => Math.round(n * 100) / 100;
20
+ const round4 = (n) => Math.round(n * 10000) / 10000;
21
+ const round6 = (n) => Math.round(n * 1e6) / 1e6;
22
+ const clamp01 = (n) => (n < 0 ? 0 : n > 1 ? 1 : n);
23
+ function collectIds(seed, verdicts) {
24
+ const set = new Set(seed);
25
+ for (const v of verdicts) {
26
+ set.add(v.aId);
27
+ set.add(v.bId);
28
+ }
29
+ return [...set];
30
+ }
31
+ /**
32
+ * One Elo update for a single game. `outcome` is the score for the FIRST player
33
+ * (1 win, 0.5 tie, 0 loss). Total rating is conserved (the two deltas cancel),
34
+ * and the update is symmetric under swapping players + complementing the outcome.
35
+ */
36
+ export function updateElo(ra, rb, outcome, k = ELO_K) {
37
+ const expectedA = 1 / (1 + Math.pow(10, (rb - ra) / 400));
38
+ const expectedB = 1 - expectedA;
39
+ const o = clamp01(outcome);
40
+ const ra2 = ra + k * (o - expectedA);
41
+ const rb2 = rb + k * (1 - o - expectedB);
42
+ return [ra2, rb2];
43
+ }
44
+ /**
45
+ * Bradley-Terry strengths per id, sum-normalised. A win counts as one game won;
46
+ * a tie splits the game half-and-half. Returns `{}` for no verdicts and a
47
+ * uniform distribution when ids exist but no games were played.
48
+ */
49
+ export function bradleyTerry(verdicts) {
50
+ const ids = collectIds([], verdicts);
51
+ if (ids.length === 0)
52
+ return {};
53
+ const wins = {};
54
+ const games = {};
55
+ for (const id of ids) {
56
+ wins[id] = 0;
57
+ games[id] = {};
58
+ for (const other of ids)
59
+ games[id][other] = 0;
60
+ }
61
+ let totalGames = 0;
62
+ for (const v of verdicts) {
63
+ if (v.aId === v.bId)
64
+ continue;
65
+ games[v.aId][v.bId] += 1;
66
+ games[v.bId][v.aId] += 1;
67
+ totalGames += 1;
68
+ if (v.winner === v.aId)
69
+ wins[v.aId] += 1;
70
+ else if (v.winner === v.bId)
71
+ wins[v.bId] += 1;
72
+ else {
73
+ wins[v.aId] += 0.5;
74
+ wins[v.bId] += 0.5;
75
+ }
76
+ }
77
+ if (totalGames === 0) {
78
+ const uniform = 1 / ids.length;
79
+ return Object.fromEntries(ids.map((id) => [id, uniform]));
80
+ }
81
+ let p = Object.fromEntries(ids.map((id) => [id, 1]));
82
+ for (let iter = 0; iter < BT_ITERATIONS; iter++) {
83
+ const next = {};
84
+ for (const i of ids) {
85
+ let denom = 0;
86
+ for (const j of ids) {
87
+ if (i === j)
88
+ continue;
89
+ const nij = games[i][j];
90
+ if (nij === 0)
91
+ continue;
92
+ denom += nij / (p[i] + p[j]);
93
+ }
94
+ next[i] = denom > 0 ? wins[i] / denom : 0;
95
+ }
96
+ const sum = ids.reduce((s, id) => s + next[id], 0);
97
+ p = sum > 0 ? Object.fromEntries(ids.map((id) => [id, next[id] / sum])) : next;
98
+ }
99
+ const sum = ids.reduce((s, id) => s + p[id], 0);
100
+ if (sum <= 0)
101
+ return p;
102
+ return Object.fromEntries(ids.map((id) => [id, round6(p[id] / sum)]));
103
+ }
104
+ /**
105
+ * Roll a set of pairwise verdicts up into a ranking. `ids` seeds the population
106
+ * (so a direction with no verdicts still appears, ranked last). Order is by
107
+ * Bradley-Terry strength, tie-broken by Elo then id for determinism.
108
+ */
109
+ export function rankDirections(ids, verdicts) {
110
+ const population = collectIds(ids, verdicts);
111
+ const bt = bradleyTerry(verdicts);
112
+ const bradleyTerryMap = {};
113
+ for (const id of population)
114
+ bradleyTerryMap[id] = bt[id] ?? 0;
115
+ // No evidence at all over the whole population ⇒ uniform priors (sum-normalised
116
+ // to 1, per contract), not a row of zeros.
117
+ const btSum = population.reduce((s, id) => s + bradleyTerryMap[id], 0);
118
+ if (population.length > 0 && btSum <= 1e-12) {
119
+ const uniform = round6(1 / population.length);
120
+ for (const id of population)
121
+ bradleyTerryMap[id] = uniform;
122
+ }
123
+ // Games played per id — a seeded-but-unjudged direction (0 games) must sink
124
+ // below any direction that was actually compared, even a loser, since we have
125
+ // no evidence to surface it.
126
+ const games = {};
127
+ for (const id of population)
128
+ games[id] = 0;
129
+ for (const v of verdicts) {
130
+ if (v.aId === v.bId)
131
+ continue;
132
+ games[v.aId] = (games[v.aId] ?? 0) + 1;
133
+ games[v.bId] = (games[v.bId] ?? 0) + 1;
134
+ }
135
+ const elo = {};
136
+ for (const id of population)
137
+ elo[id] = ELO_START;
138
+ for (const v of verdicts) {
139
+ if (v.aId === v.bId)
140
+ continue;
141
+ if (!(v.aId in elo))
142
+ elo[v.aId] = ELO_START;
143
+ if (!(v.bId in elo))
144
+ elo[v.bId] = ELO_START;
145
+ const outcome = v.winner === v.aId ? 1 : v.winner === v.bId ? 0 : 0.5;
146
+ const [ra, rb] = updateElo(elo[v.aId], elo[v.bId], outcome);
147
+ elo[v.aId] = ra;
148
+ elo[v.bId] = rb;
149
+ }
150
+ const order = [...population].sort((x, y) => {
151
+ const db = bradleyTerryMap[y] - bradleyTerryMap[x];
152
+ if (Math.abs(db) > 1e-9)
153
+ return db;
154
+ const dg = games[y] - games[x];
155
+ if (dg !== 0)
156
+ return dg;
157
+ const de = elo[y] - elo[x];
158
+ if (Math.abs(de) > 1e-9)
159
+ return de;
160
+ return x < y ? -1 : x > y ? 1 : 0;
161
+ });
162
+ const eloRounded = {};
163
+ for (const id of population)
164
+ eloRounded[id] = round2(elo[id]);
165
+ return {
166
+ order,
167
+ winnerId: order[0] ?? '',
168
+ bradleyTerry: bradleyTerryMap,
169
+ elo: eloRounded,
170
+ };
171
+ }
172
+ /**
173
+ * Judge-vs-human agreement over a set of votes. Ties (on either side) and pairs
174
+ * the judge never compared are excluded from `n`. Empty → `{ agreement: 0, n: 0 }`,
175
+ * never NaN.
176
+ */
177
+ export function calibrateAgainstVotes(verdicts, votes) {
178
+ const key = (a, b) => (a < b ? `${a}|${b}` : `${b}|${a}`);
179
+ const judgeByPair = new Map();
180
+ for (const v of verdicts)
181
+ judgeByPair.set(key(v.aId, v.bId), v.winner);
182
+ let n = 0;
183
+ let agree = 0;
184
+ for (const vote of votes) {
185
+ if (vote.winner === 'tie')
186
+ continue;
187
+ const judged = judgeByPair.get(key(vote.aId, vote.bId));
188
+ if (judged === undefined || judged === 'tie')
189
+ continue;
190
+ n++;
191
+ if (judged === vote.winner)
192
+ agree++;
193
+ }
194
+ return { agreement: n > 0 ? round4(agree / n) : 0, n };
195
+ }
196
+ //# sourceMappingURL=rank.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rank.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/rank.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Text taste judge — the default `TasteJudge` adapter. The ONLY impure piece of
3
+ * the judge stack: one `brain.complete` per comparison over budget-bounded DNA /
4
+ * direction summaries, parsed by the pure `parseRawVerdict`. All debiasing,
5
+ * aggregation, and ranking live in the pure cores around it (`pairwise`,
6
+ * `quality`, `rank`).
7
+ *
8
+ * The model dependency is injected through the narrow `JudgeModel` seam — the
9
+ * real `Brain` satisfies it structurally, so the wiring root passes `brain`
10
+ * unchanged while unit tests inject a deterministic mock with no live model.
11
+ *
12
+ * `brain.auditDesign` is deliberately NOT used: overloading the page-audit seam
13
+ * for taste comparison is the contract abuse the architecture forbids. A vision
14
+ * judge is a future drop-in implementing this same `TasteJudge` interface once a
15
+ * clean visual-compare seam exists.
16
+ */
17
+ import type { TasteJudge } from '../contracts.js';
18
+ /**
19
+ * The narrow model seam the text judge needs. `Brain` is assignable to this, so
20
+ * `createTextJudge(brain)` compiles at the wiring root while tests supply a stub.
21
+ */
22
+ export interface JudgeModel {
23
+ complete(system: string, user: string, options?: {
24
+ maxOutputTokens?: number;
25
+ }): Promise<{
26
+ text: string;
27
+ tokensUsed?: number;
28
+ }>;
29
+ }
30
+ export declare function createTextJudge(brain: JudgeModel): TasteJudge;
31
+ //# sourceMappingURL=text-judge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-judge.d.ts","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/text-judge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAA8B,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAI7E;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CACN,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,GACrC,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAClD;AAKD,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAuB7D"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Text taste judge — the default `TasteJudge` adapter. The ONLY impure piece of
3
+ * the judge stack: one `brain.complete` per comparison over budget-bounded DNA /
4
+ * direction summaries, parsed by the pure `parseRawVerdict`. All debiasing,
5
+ * aggregation, and ranking live in the pure cores around it (`pairwise`,
6
+ * `quality`, `rank`).
7
+ *
8
+ * The model dependency is injected through the narrow `JudgeModel` seam — the
9
+ * real `Brain` satisfies it structurally, so the wiring root passes `brain`
10
+ * unchanged while unit tests inject a deterministic mock with no live model.
11
+ *
12
+ * `brain.auditDesign` is deliberately NOT used: overloading the page-audit seam
13
+ * for taste comparison is the contract abuse the architecture forbids. A vision
14
+ * judge is a future drop-in implementing this same `TasteJudge` interface once a
15
+ * clean visual-compare seam exists.
16
+ */
17
+ import { buildPairwisePrompt, buildQualityPrompt } from './prompt.js';
18
+ import { parseRawVerdict } from './parse.js';
19
+ // Verdict JSON is tiny; cap output so a runaway judge response can't blow budget.
20
+ const JUDGE_MAX_OUTPUT_TOKENS = 400;
21
+ export function createTextJudge(brain) {
22
+ return {
23
+ id: 'text-judge',
24
+ async compare(input) {
25
+ // Direction-vs-direction comparisons carry a directionSummary; page-vs-
26
+ // exemplar (absolute quality) comparisons carry only DNA. Choose the
27
+ // matching prompt; the debias core supplies the slot order via input a/b.
28
+ const usesDirections = Boolean(input.a.directionSummary || input.b.directionSummary);
29
+ const { system, user } = usesDirections
30
+ ? buildPairwisePrompt(input, 'AB')
31
+ : buildQualityPrompt(input, 'AB');
32
+ const { text, tokensUsed } = await brain.complete(system, user, {
33
+ maxOutputTokens: JUDGE_MAX_OUTPUT_TOKENS,
34
+ });
35
+ const verdict = parseRawVerdict(text);
36
+ // Echo the dimension scope so the quality leg can bucket per-dimension.
37
+ return input.dimension !== undefined
38
+ ? { ...verdict, dimension: input.dimension, tokensUsed }
39
+ : { ...verdict, tokensUsed };
40
+ },
41
+ };
42
+ }
43
+ //# sourceMappingURL=text-judge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-judge.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/text-judge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAc5C,kFAAkF;AAClF,MAAM,uBAAuB,GAAG,GAAG,CAAA;AAEnC,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,OAAO;QACL,EAAE,EAAE,YAAY;QAChB,KAAK,CAAC,OAAO,CAAC,KAAqB;YACjC,wEAAwE;YACxE,qEAAqE;YACrE,0EAA0E;YAC1E,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,IAAI,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAA;YACpF,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc;gBACrC,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC;gBAClC,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YAEnC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE;gBAC9D,eAAe,EAAE,uBAAuB;aACzC,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;YAErC,wEAAwE;YACxE,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS;gBAClC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE;gBACxD,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,CAAA;QAChC,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Vision taste judge — a screenshot-grounded `TasteJudge` that is a drop-in for
3
+ * the default text judge. PURE given its injected models: it imports no Brain and
4
+ * does no IO, so it unit-tests with deterministic `VisionJudgeModel` stubs and no
5
+ * live model. The disk read + provider round-trip live behind the injected seam
6
+ * (`judge/vision-model.createBrainVisionModel`).
7
+ *
8
+ * What it adds over the text judge: it judges from the subjects' SCREENSHOTS (the
9
+ * audited page and the corpus exemplars), not just their DNA text — so the
10
+ * absolute-quality leg (`judge/quality.assessPageQuality`) becomes a genuine
11
+ * visual page-vs-exemplar comparison. It reuses the text judge's pure prompt
12
+ * cores (`buildQualityPrompt`/`buildPairwisePrompt`) and parser
13
+ * (`parseVerdictOrNull`) verbatim — vision adds images, not new prompt logic.
14
+ *
15
+ * TWO layered debiases, kept separate so neither is double-applied:
16
+ * - POSITION-SWAP (A-vs-B and B-vs-A) is NOT done here. The surrounding pure
17
+ * debias core (`judge/pairwise.judgePair`) already calls `compare` twice and
18
+ * reconciles, so one `compare` is ONE slot order. Re-swapping internally would
19
+ * double the model calls and break that core's accounting.
20
+ * - The ENSEMBLE (across MODELS) IS done here: every model runs in parallel on
21
+ * the given slot order, then aggregates to a majority winner with an honest
22
+ * agreement-fraction confidence (see `aggregateVerdicts`). With one model it
23
+ * degrades to a single judge; with many it is robust to single-model bias.
24
+ *
25
+ * Fail-closed: a model that throws or returns no parseable winner is DROPPED; if
26
+ * every model is dropped, `compare` throws rather than fabricating a tie. An empty
27
+ * model list is rejected at construction.
28
+ *
29
+ * SCOPE: only subjects that HAVE a screenshot are vision-judged. Unrendered
30
+ * `RedesignDirection` specs carry none, so a comparison with a screenshot-less
31
+ * side delegates to the injected text fallback — keeping this a single drop-in
32
+ * judge for BOTH the quality leg (vision) and the direction-ranking leg (text).
33
+ */
34
+ import type { RawVerdict, TasteJudge, VisionJudgeModel } from '../contracts.js';
35
+ /**
36
+ * Collapse the surviving per-model verdicts into one ensemble `RawVerdict` body
37
+ * (winnerSlot + honest confidence + merged reasons). PURE. Throws on an empty set
38
+ * — an all-dropped ensemble is an explicit error, never a fabricated tie.
39
+ *
40
+ * The bucket (A/B/tie) with the STRICT maximum vote count wins; a genuine `tie`
41
+ * vote counts in its own bucket. `confidence` is that bucket's vote share
42
+ * (agreement fraction). A split — two or more buckets sharing the top count —
43
+ * is undecided ⇒ tie at confidence 0.
44
+ */
45
+ export declare function aggregateVerdicts(verdicts: RawVerdict[]): {
46
+ winnerSlot: RawVerdict['winnerSlot'];
47
+ confidence: number;
48
+ reasons: string[];
49
+ };
50
+ /**
51
+ * Build a vision `TasteJudge` over a non-empty list of `VisionJudgeModel`s. One
52
+ * model ⇒ a single judge; many ⇒ the cross-model ensemble. `textFallback` (the
53
+ * default text judge, injected by the wiring) handles comparisons whose subjects
54
+ * lack screenshots; omit it only in tests that never exercise that path.
55
+ */
56
+ export declare function createVisionJudge(models: VisionJudgeModel[], opts?: {
57
+ textFallback?: TasteJudge;
58
+ }): TasteJudge;
59
+ //# sourceMappingURL=vision-judge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vision-judge.d.ts","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/vision-judge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAEV,UAAU,EACV,UAAU,EAEV,gBAAgB,EACjB,MAAM,iBAAiB,CAAA;AAqBxB;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG;IACzD,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,CAAA;IACpC,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB,CAqBA;AA6BD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,gBAAgB,EAAE,EAC1B,IAAI,GAAE;IAAE,YAAY,CAAC,EAAE,UAAU,CAAA;CAAO,GACvC,UAAU,CAsDZ"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Vision taste judge — a screenshot-grounded `TasteJudge` that is a drop-in for
3
+ * the default text judge. PURE given its injected models: it imports no Brain and
4
+ * does no IO, so it unit-tests with deterministic `VisionJudgeModel` stubs and no
5
+ * live model. The disk read + provider round-trip live behind the injected seam
6
+ * (`judge/vision-model.createBrainVisionModel`).
7
+ *
8
+ * What it adds over the text judge: it judges from the subjects' SCREENSHOTS (the
9
+ * audited page and the corpus exemplars), not just their DNA text — so the
10
+ * absolute-quality leg (`judge/quality.assessPageQuality`) becomes a genuine
11
+ * visual page-vs-exemplar comparison. It reuses the text judge's pure prompt
12
+ * cores (`buildQualityPrompt`/`buildPairwisePrompt`) and parser
13
+ * (`parseVerdictOrNull`) verbatim — vision adds images, not new prompt logic.
14
+ *
15
+ * TWO layered debiases, kept separate so neither is double-applied:
16
+ * - POSITION-SWAP (A-vs-B and B-vs-A) is NOT done here. The surrounding pure
17
+ * debias core (`judge/pairwise.judgePair`) already calls `compare` twice and
18
+ * reconciles, so one `compare` is ONE slot order. Re-swapping internally would
19
+ * double the model calls and break that core's accounting.
20
+ * - The ENSEMBLE (across MODELS) IS done here: every model runs in parallel on
21
+ * the given slot order, then aggregates to a majority winner with an honest
22
+ * agreement-fraction confidence (see `aggregateVerdicts`). With one model it
23
+ * degrades to a single judge; with many it is robust to single-model bias.
24
+ *
25
+ * Fail-closed: a model that throws or returns no parseable winner is DROPPED; if
26
+ * every model is dropped, `compare` throws rather than fabricating a tie. An empty
27
+ * model list is rejected at construction.
28
+ *
29
+ * SCOPE: only subjects that HAVE a screenshot are vision-judged. Unrendered
30
+ * `RedesignDirection` specs carry none, so a comparison with a screenshot-less
31
+ * side delegates to the injected text fallback — keeping this a single drop-in
32
+ * judge for BOTH the quality leg (vision) and the direction-ranking leg (text).
33
+ */
34
+ import { buildPairwisePrompt, buildQualityPrompt } from './prompt.js';
35
+ import { parseVerdictOrNull } from './parse.js';
36
+ // Verdict JSON is tiny; cap output so a runaway response can't blow budget. Same
37
+ // ceiling as the text judge (`text-judge.JUDGE_MAX_OUTPUT_TOKENS`).
38
+ const JUDGE_MAX_OUTPUT_TOKENS = 400;
39
+ // Merged-reason ceiling on the aggregated verdict, so an N-model ensemble cannot
40
+ // bloat one `RawVerdict` with N× the reasons.
41
+ const REASON_CAP = 8;
42
+ // Prepended to the reused text prompt so the model maps images→slots. The images
43
+ // are attached in slot order ([slot A, slot B]); `compare` always renders the
44
+ // input on slot order 'AB', and the outer `judgePair` supplies the swapped order.
45
+ const VISION_PREAMBLE = 'Two screenshots are attached. The FIRST image is SLOT A; the SECOND image is SLOT B. ' +
46
+ 'Judge primarily from the screenshots — the text below is a secondary DNA summary of each design.';
47
+ const round4 = (n) => Math.round(n * 10000) / 10000;
48
+ /**
49
+ * Collapse the surviving per-model verdicts into one ensemble `RawVerdict` body
50
+ * (winnerSlot + honest confidence + merged reasons). PURE. Throws on an empty set
51
+ * — an all-dropped ensemble is an explicit error, never a fabricated tie.
52
+ *
53
+ * The bucket (A/B/tie) with the STRICT maximum vote count wins; a genuine `tie`
54
+ * vote counts in its own bucket. `confidence` is that bucket's vote share
55
+ * (agreement fraction). A split — two or more buckets sharing the top count —
56
+ * is undecided ⇒ tie at confidence 0.
57
+ */
58
+ export function aggregateVerdicts(verdicts) {
59
+ if (verdicts.length === 0) {
60
+ throw new Error('vision judge: cannot aggregate an empty set of verdicts');
61
+ }
62
+ const counts = { A: 0, B: 0, tie: 0 };
63
+ for (const v of verdicts)
64
+ counts[v.winnerSlot]++;
65
+ const total = verdicts.length;
66
+ const top = Math.max(counts.A, counts.B, counts.tie);
67
+ const leaders = ['A', 'B', 'tie'].filter((slot) => counts[slot] === top);
68
+ const decided = leaders.length === 1;
69
+ const winnerSlot = decided ? leaders[0] : 'tie';
70
+ const confidence = decided ? round4(top / total) : 0;
71
+ const reasons = [
72
+ `ensemble: A=${counts.A} B=${counts.B} tie=${counts.tie} over ${total} model${total === 1 ? '' : 's'}`,
73
+ ];
74
+ for (const v of verdicts) {
75
+ for (const r of v.reasons)
76
+ if (!reasons.includes(r))
77
+ reasons.push(r);
78
+ }
79
+ return { winnerSlot, confidence, reasons: reasons.slice(0, REASON_CAP) };
80
+ }
81
+ /** Run one model on a single slot order; a throw/unparseable result is a drop. */
82
+ async function runModel(model, system, user, images) {
83
+ try {
84
+ const { text, tokensUsed } = await model.completeVision(system, user, images, {
85
+ maxOutputTokens: JUDGE_MAX_OUTPUT_TOKENS,
86
+ });
87
+ const verdict = parseVerdictOrNull(text);
88
+ if (!verdict && process.env.BAD_VISION_JUDGE_DEBUG === '1')
89
+ console.error(`[vision ${model.id}] parse-failed | len=${text.length} head=${JSON.stringify(text.slice(0, 240))}`);
90
+ return { verdict, tokens: tokensUsed ?? 0 };
91
+ }
92
+ catch (err) {
93
+ if (process.env.BAD_VISION_JUDGE_DEBUG === '1')
94
+ console.error(`[vision ${model.id}] call-failed: ${err instanceof Error ? err.message : String(err)}`);
95
+ return { verdict: null, tokens: 0 };
96
+ }
97
+ }
98
+ /**
99
+ * Build a vision `TasteJudge` over a non-empty list of `VisionJudgeModel`s. One
100
+ * model ⇒ a single judge; many ⇒ the cross-model ensemble. `textFallback` (the
101
+ * default text judge, injected by the wiring) handles comparisons whose subjects
102
+ * lack screenshots; omit it only in tests that never exercise that path.
103
+ */
104
+ export function createVisionJudge(models, opts = {}) {
105
+ if (models.length === 0) {
106
+ throw new Error('vision judge: at least one vision model is required (empty ensemble)');
107
+ }
108
+ const { textFallback } = opts;
109
+ const id = `vision-judge[${models.map((m) => m.id).join('+')}]`;
110
+ return {
111
+ id,
112
+ async compare(input) {
113
+ const { a, b } = input;
114
+ // Vision needs an image on BOTH sides. Screenshot-less subjects (unrendered
115
+ // directions) delegate to the injected text judge, so one instance serves
116
+ // the vision quality leg AND the text direction leg.
117
+ if (!a.screenshotPath || !b.screenshotPath) {
118
+ if (!textFallback) {
119
+ throw new Error(`vision judge: subjects ${a.id}/${b.id} lack screenshots and no text fallback was injected`);
120
+ }
121
+ return textFallback.compare(input);
122
+ }
123
+ // Mirror the text judge's prompt selection; both subjects carry screenshots
124
+ // here, so this is the absolute-quality leg in practice.
125
+ const usesDirections = Boolean(a.directionSummary || b.directionSummary);
126
+ const { system, user } = usesDirections
127
+ ? buildPairwisePrompt(input, 'AB')
128
+ : buildQualityPrompt(input, 'AB');
129
+ const userWithImages = `${VISION_PREAMBLE}\n\n${user}`;
130
+ const images = [
131
+ { screenshotPath: a.screenshotPath },
132
+ { screenshotPath: b.screenshotPath },
133
+ ];
134
+ const outcomes = await Promise.all(models.map((m) => runModel(m, system, userWithImages, images)));
135
+ const survivors = outcomes
136
+ .map((o) => o.verdict)
137
+ .filter((v) => v !== null);
138
+ const tokensUsed = outcomes.reduce((sum, o) => sum + o.tokens, 0);
139
+ if (survivors.length === 0) {
140
+ throw new Error(`vision judge: every model in the ensemble (${models.length}) failed to return a usable ` +
141
+ 'verdict; refusing to fabricate a tie');
142
+ }
143
+ const agg = aggregateVerdicts(survivors);
144
+ const verdict = { winnerSlot: agg.winnerSlot, confidence: agg.confidence, reasons: agg.reasons };
145
+ const withTokens = tokensUsed > 0 ? { ...verdict, tokensUsed } : verdict;
146
+ return input.dimension !== undefined ? { ...withTokens, dimension: input.dimension } : withTokens;
147
+ },
148
+ };
149
+ }
150
+ //# sourceMappingURL=vision-judge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vision-judge.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/vision-judge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Brain-backed vision-model adapter — the IO half of the vision judge stack.
3
+ *
4
+ * The vision ensemble depends only on the narrow `VisionJudgeModel` seam
5
+ * (contracts): a model bound to ONE `{ provider, model }` ref that takes a system
6
+ * prompt + a user prompt + the compared subjects' screenshots and returns raw
7
+ * text. This module is the concrete, Brain-backed implementation of that seam.
8
+ * It is the ONLY impure part of the vision judge (disk read + a live model call);
9
+ * the aggregation in `vision-judge.ts` stays pure and unit-tests with stubs.
10
+ *
11
+ * Two responsibilities, both thin:
12
+ * - `createBrainVisionModel`: wrap one Brain as a `VisionJudgeModel` — resolve
13
+ * each `VisionImageRef` to encoded bytes (disk read for `screenshotPath`,
14
+ * mediaType from the file extension; passthrough for in-memory base64) and
15
+ * route them through `brain.completeVision`. The `id` is the ref rendered as
16
+ * `provider:model`, so an ensemble keys/aggregates per model.
17
+ * - `buildVisionModels`: construct the ensemble from a `ModelRef[]` — ONE Brain
18
+ * per ref, each with its OWN provider key. A single Brain CANNOT serve a mixed
19
+ * ensemble: `Brain.getModel` resolves the key via
20
+ * `resolveProviderApiKey(provider, this.explicitApiKey)`, so an explicit key
21
+ * set for one provider would leak to the others. Per-ref Brains give each ref
22
+ * the correct provider key (resolved from the environment).
23
+ */
24
+ import type { ModelRef, VisionJudgeModel } from '../contracts.js';
25
+ /** The encoded image shape `Brain.completeVision` accepts (base64/data + type). */
26
+ interface EncodedImage {
27
+ image: string;
28
+ mediaType: string;
29
+ }
30
+ /**
31
+ * The narrow Brain capability this adapter needs — exactly `Brain.completeVision`.
32
+ * Declared locally so the wrapper does not depend on the full `Brain` type and a
33
+ * test could inject a fake round-trip; `buildVisionModels` supplies the real one.
34
+ */
35
+ export interface VisionCompletionModel {
36
+ completeVision(system: string, user: string, images: ReadonlyArray<EncodedImage>, options?: {
37
+ maxOutputTokens?: number;
38
+ }): Promise<{
39
+ text: string;
40
+ tokensUsed?: number;
41
+ }>;
42
+ }
43
+ /** Render a `ModelRef` as the stable `provider:model` id the ensemble keys on. */
44
+ export declare function refToId(ref: ModelRef): string;
45
+ /**
46
+ * Wrap one Brain (already bound to a `{ provider, model }`) as a
47
+ * `VisionJudgeModel`. The disk read + mediaType inference happen here so the
48
+ * pure ensemble never touches the filesystem; a failed read or model call
49
+ * propagates as a rejection, which the ensemble treats as a DROPPED model.
50
+ */
51
+ export declare function createBrainVisionModel(brain: VisionCompletionModel, ref: ModelRef): VisionJudgeModel;
52
+ /**
53
+ * Construct the vision ensemble: ONE Brain per `ModelRef`, each resolving its own
54
+ * provider/model/api-key through `provider-defaults` (so a mixed
55
+ * openai+anthropic+google ensemble each gets the right env key). `vision: true`
56
+ * is set for clarity; `completeVision` builds its own multimodal message and does
57
+ * not depend on the Brain's vision strategy.
58
+ *
59
+ * Future lever: explicit per-vision-model `--api-key`/`--base-url` (today each ref
60
+ * resolves its key from the environment by provider; the audit's own brain still
61
+ * honours an explicit `--api-key`).
62
+ */
63
+ export declare function buildVisionModels(refs: ModelRef[]): VisionJudgeModel[];
64
+ export {};
65
+ //# sourceMappingURL=vision-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vision-model.d.ts","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/vision-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAYH,OAAO,KAAK,EAAE,QAAQ,EAAkB,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEjF,mFAAmF;AACnF,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,cAAc,CACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,EACnC,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,GACrC,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAClD;AAED,kFAAkF;AAClF,wBAAgB,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,CAE7C;AA+BD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,EAAE,GAAG,EAAE,QAAQ,GAAG,gBAAgB,CAQpG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,gBAAgB,EAAE,CAmBtE"}