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