@tangle-network/browser-agent-driver 0.33.3 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +6 -2
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Position-swapped pairwise debias — the core that cancels slot bias.
3
+ *
4
+ * A single judge call is contaminated by position bias: models systematically
5
+ * over-prefer whichever design sits in slot A. `judgePair` neutralises it by
6
+ * running BOTH slot orders through the INJECTED `TasteJudge` (A-vs-B and
7
+ * B-vs-A) and reconciling. The model call is the only impure part and it is
8
+ * injected, so `reconcileVerdicts` — where all the debias logic lives — is fully
9
+ * pure and unit-tests with stub verdicts and zero live model.
10
+ *
11
+ * Reconciliation rule (measures taste, not slot):
12
+ * - both orders pick the SAME id ⇒ that id wins (margin = mean confidence)
13
+ * - the preferred id FLIPS with the slot ⇒ pure position bias ⇒ tie
14
+ * - only one order separates them ⇒ a low-confidence win (margin halved)
15
+ * - both orders tie ⇒ tie
16
+ *
17
+ * `swapped` re-labels the subjects (a↔b) while preserving `dimension`,
18
+ * `reference`, and `rubricBody`, so the judge sees the same comparison from the
19
+ * other side — the second call is a genuine slot swap, not a different question.
20
+ */
21
+ const round4 = (n) => Math.round(n * 10000) / 10000;
22
+ const clamp01 = (n) => (n < 0 ? 0 : n > 1 ? 1 : n);
23
+ function slotToId(slot, idForSlotA, idForSlotB) {
24
+ if (slot === 'A')
25
+ return idForSlotA;
26
+ if (slot === 'B')
27
+ return idForSlotB;
28
+ return 'tie';
29
+ }
30
+ function mergeReasons(...lists) {
31
+ const out = [];
32
+ for (const list of lists) {
33
+ for (const r of list)
34
+ if (!out.includes(r))
35
+ out.push(r);
36
+ }
37
+ return out;
38
+ }
39
+ /**
40
+ * Reconcile the two slot-order verdicts into a stable, id-keyed `TasteVerdict`.
41
+ * Pure: no IO, no model. `ab` presented a→SLOT A, b→SLOT B; `ba` presented
42
+ * b→SLOT A, a→SLOT B.
43
+ */
44
+ export function reconcileVerdicts(ab, ba, aId, bId) {
45
+ const w1 = slotToId(ab.winnerSlot, aId, bId);
46
+ const w2 = slotToId(ba.winnerSlot, bId, aId);
47
+ const reasons = mergeReasons(ab.reasons, ba.reasons);
48
+ if (w1 === 'tie' && w2 === 'tie') {
49
+ return { aId, bId, winner: 'tie', margin: 0, reasons };
50
+ }
51
+ if (w1 !== 'tie' && w2 !== 'tie') {
52
+ if (w1 === w2) {
53
+ const margin = clamp01(round4((ab.confidence + ba.confidence) / 2));
54
+ return { aId, bId, winner: w1, margin, reasons };
55
+ }
56
+ // The preferred id flipped with the slot ⇒ the signal is position, not taste.
57
+ return {
58
+ aId,
59
+ bId,
60
+ winner: 'tie',
61
+ margin: 0,
62
+ reasons: mergeReasons(reasons, [
63
+ 'position bias: preferred slot flipped across orders; collapsed to tie',
64
+ ]),
65
+ };
66
+ }
67
+ // Exactly one order expressed a preference; the other could not separate them.
68
+ // Honour the uncontradicted signal but at halved confidence.
69
+ const decided = w1 !== 'tie' ? w1 : w2;
70
+ const conf = w1 !== 'tie' ? ab.confidence : ba.confidence;
71
+ return { aId, bId, winner: decided, margin: clamp01(round4(conf / 2)), reasons };
72
+ }
73
+ /**
74
+ * Run a single comparison through both slot orders (× `reps`) and reconcile to a
75
+ * position-debiased `TasteVerdict`. The `TasteJudge` is injected, so this is the
76
+ * only impure boundary; all aggregation is deterministic.
77
+ */
78
+ export async function judgePair(judge, input, reps = 1) {
79
+ const aId = input.a.id;
80
+ const bId = input.b.id;
81
+ const swapped = { ...input, a: input.b, b: input.a };
82
+ const effReps = Math.max(1, Math.floor(reps));
83
+ let scoreA = 0;
84
+ let scoreB = 0;
85
+ const reasons = [];
86
+ for (let i = 0; i < effReps; i++) {
87
+ const ab = await judge.compare(input);
88
+ const ba = await judge.compare(swapped);
89
+ const v = reconcileVerdicts(ab, ba, aId, bId);
90
+ if (v.winner === aId)
91
+ scoreA += v.margin;
92
+ else if (v.winner === bId)
93
+ scoreB += v.margin;
94
+ for (const r of v.reasons)
95
+ if (!reasons.includes(r))
96
+ reasons.push(r);
97
+ }
98
+ const net = (scoreA - scoreB) / effReps;
99
+ if (net > 1e-9)
100
+ return { aId, bId, winner: aId, margin: clamp01(round4(net)), reasons };
101
+ if (net < -1e-9)
102
+ return { aId, bId, winner: bId, margin: clamp01(round4(-net)), reasons };
103
+ return { aId, bId, winner: 'tie', margin: 0, reasons };
104
+ }
105
+ //# sourceMappingURL=pairwise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairwise.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/pairwise.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Judge-response parsing — the PURE parse core. Turns one model response into a
3
+ * slot-relative `RawVerdict`. Fail-closed by contract: any unparseable or
4
+ * winner-less response collapses to a `tie` with confidence 0 and an explicit
5
+ * reason, never a fabricated A/B verdict. Slot bias is only neutralisable if a
6
+ * garbage response counts as "no signal", so this NEVER guesses a winner.
7
+ *
8
+ * It is deliberately tolerant of the noise real gateways add (markdown fences,
9
+ * prose preambles around the object) — mirroring `brain.parse` — but it is
10
+ * strict about the one field that matters: the winner must be an unambiguous
11
+ * A / B / tie token, or the verdict is a tie.
12
+ */
13
+ import type { RawVerdict } from '../contracts.js';
14
+ /**
15
+ * STRICT parse: return a `RawVerdict` ONLY when the response carries an
16
+ * unambiguous winner token, else `null` ("no usable verdict"). This is the
17
+ * single source of truth for the happy path; both consumers build on it:
18
+ * - the text judge wraps it with a fail-closed tie (see `parseRawVerdict`), so a
19
+ * garbage single-model response is treated as "no signal" and the outer
20
+ * position-swap can cancel it;
21
+ * - the vision ENSEMBLE judge uses the `null` to DROP a non-responding model
22
+ * (exclude it from the majority tally + denominator), rather than diluting the
23
+ * agreement fraction with a phantom tie vote.
24
+ */
25
+ export declare function parseVerdictOrNull(raw: string): RawVerdict | null;
26
+ /**
27
+ * Parse a judge response into a slot-relative `RawVerdict`. Garbage in →
28
+ * `{ winnerSlot: 'tie', confidence: 0, reasons: [<why>] }`.
29
+ */
30
+ export declare function parseRawVerdict(raw: string): RawVerdict;
31
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AA2DjD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAUjE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAWvD"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Judge-response parsing — the PURE parse core. Turns one model response into a
3
+ * slot-relative `RawVerdict`. Fail-closed by contract: any unparseable or
4
+ * winner-less response collapses to a `tie` with confidence 0 and an explicit
5
+ * reason, never a fabricated A/B verdict. Slot bias is only neutralisable if a
6
+ * garbage response counts as "no signal", so this NEVER guesses a winner.
7
+ *
8
+ * It is deliberately tolerant of the noise real gateways add (markdown fences,
9
+ * prose preambles around the object) — mirroring `brain.parse` — but it is
10
+ * strict about the one field that matters: the winner must be an unambiguous
11
+ * A / B / tie token, or the verdict is a tie.
12
+ */
13
+ const DEFAULT_CONFIDENCE = 0.5;
14
+ function stripFences(raw) {
15
+ let t = raw.trim();
16
+ if (t.startsWith('```')) {
17
+ t = t
18
+ .replace(/^```(?:json)?\s*/i, '')
19
+ .replace(/```$/i, '')
20
+ .trim();
21
+ }
22
+ return t;
23
+ }
24
+ function extractObject(text) {
25
+ try {
26
+ return JSON.parse(text);
27
+ }
28
+ catch {
29
+ // Some gateways wrap the object in prose ("Here's the verdict: {…}"); fall
30
+ // back to the outermost brace pair before giving up.
31
+ const first = text.indexOf('{');
32
+ const last = text.lastIndexOf('}');
33
+ if (first >= 0 && last > first) {
34
+ try {
35
+ return JSON.parse(text.slice(first, last + 1));
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ return null;
42
+ }
43
+ }
44
+ function normalizeWinner(raw) {
45
+ if (typeof raw !== 'string')
46
+ return null;
47
+ const w = raw.trim().toUpperCase();
48
+ if (w === 'A')
49
+ return 'A';
50
+ if (w === 'B')
51
+ return 'B';
52
+ if (w === 'TIE' || w === 'DRAW' || w === 'EQUAL' || w === 'NEITHER' || w === 'NONE')
53
+ return 'tie';
54
+ return null;
55
+ }
56
+ function normalizeConfidence(raw) {
57
+ const n = typeof raw === 'number' ? raw : typeof raw === 'string' ? parseFloat(raw) : NaN;
58
+ if (!Number.isFinite(n))
59
+ return DEFAULT_CONFIDENCE;
60
+ return n < 0 ? 0 : n > 1 ? 1 : n;
61
+ }
62
+ function normalizeReasons(raw) {
63
+ if (Array.isArray(raw)) {
64
+ return raw
65
+ .filter((r) => typeof r === 'string' && r.trim().length > 0)
66
+ .map((r) => r.trim());
67
+ }
68
+ if (typeof raw === 'string' && raw.trim().length > 0)
69
+ return [raw.trim()];
70
+ return [];
71
+ }
72
+ /**
73
+ * STRICT parse: return a `RawVerdict` ONLY when the response carries an
74
+ * unambiguous winner token, else `null` ("no usable verdict"). This is the
75
+ * single source of truth for the happy path; both consumers build on it:
76
+ * - the text judge wraps it with a fail-closed tie (see `parseRawVerdict`), so a
77
+ * garbage single-model response is treated as "no signal" and the outer
78
+ * position-swap can cancel it;
79
+ * - the vision ENSEMBLE judge uses the `null` to DROP a non-responding model
80
+ * (exclude it from the majority tally + denominator), rather than diluting the
81
+ * agreement fraction with a phantom tie vote.
82
+ */
83
+ export function parseVerdictOrNull(raw) {
84
+ const obj = extractObject(stripFences(raw));
85
+ if (!obj)
86
+ return null;
87
+ const winnerSlot = normalizeWinner(obj.winner ?? obj.winnerSlot ?? obj.choice);
88
+ if (!winnerSlot)
89
+ return null;
90
+ return {
91
+ winnerSlot,
92
+ confidence: normalizeConfidence(obj.confidence),
93
+ reasons: normalizeReasons(obj.reasons ?? obj.reason),
94
+ };
95
+ }
96
+ /**
97
+ * Parse a judge response into a slot-relative `RawVerdict`. Garbage in →
98
+ * `{ winnerSlot: 'tie', confidence: 0, reasons: [<why>] }`.
99
+ */
100
+ export function parseRawVerdict(raw) {
101
+ const verdict = parseVerdictOrNull(raw);
102
+ if (verdict)
103
+ return verdict;
104
+ // No usable winner ⇒ fail closed to a tie, preserving the specific reason: an
105
+ // object with no valid winner vs. a response with no object at all.
106
+ const hasObject = extractObject(stripFences(raw)) !== null;
107
+ return {
108
+ winnerSlot: 'tie',
109
+ confidence: 0,
110
+ reasons: [hasObject ? 'judge response missing a valid winner' : 'unparseable judge response'],
111
+ };
112
+ }
113
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Pairwise / absolute-quality judge prompts — the PURE prompt core of the taste
3
+ * judge. No IO, no LLM, no browser: every output is a deterministic function of
4
+ * the `JudgePairInput` + the chosen presentation `slot`, so identical inputs
5
+ * always yield byte-identical prompts (a hard requirement for reproducibility and
6
+ * for the position-swapped double run to cancel bias rather than introduce it).
7
+ *
8
+ * Two builders, one per judging leg:
9
+ * - `buildPairwisePrompt` — the RELATIVE leg: two redesign directions judged
10
+ * against a named reference (holistic taste/craft/fit).
11
+ * - `buildQualityPrompt` — the ABSOLUTE leg: page vs world-class exemplar,
12
+ * optionally narrowed to ONE product `Dimension` so the per-dimension win-rate
13
+ * is genuinely judge-resolved, never one overall number stamped across dims.
14
+ *
15
+ * Both carry an explicit anti-position-bias clause: SLOT A/B order is declared
16
+ * information-free so the model is told to judge on merit alone. The `slot`
17
+ * argument decides which logical subject (`input.a` / `input.b`) is physically
18
+ * rendered as SLOT A — the debias core drives both orders through here.
19
+ */
20
+ import type { JudgePairInput } from '../contracts.js';
21
+ /** Presentation order: 'AB' renders input.a as SLOT A; 'BA' swaps them. */
22
+ export type Slot = 'AB' | 'BA';
23
+ /**
24
+ * The RELATIVE leg prompt: two redesign directions judged against a reference.
25
+ */
26
+ export declare function buildPairwisePrompt(input: JudgePairInput, slot: Slot): {
27
+ system: string;
28
+ user: string;
29
+ };
30
+ /**
31
+ * The ABSOLUTE leg prompt: page vs world-class exemplar, optionally narrowed to
32
+ * a single product `Dimension`.
33
+ */
34
+ export declare function buildQualityPrompt(input: JudgePairInput, slot: Slot): {
35
+ system: string;
36
+ user: string;
37
+ };
38
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA6C,MAAM,iBAAiB,CAAA;AAEhG,2EAA2E;AAC3E,MAAM,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAqE9B;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAUvG;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAatG"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Pairwise / absolute-quality judge prompts — the PURE prompt core of the taste
3
+ * judge. No IO, no LLM, no browser: every output is a deterministic function of
4
+ * the `JudgePairInput` + the chosen presentation `slot`, so identical inputs
5
+ * always yield byte-identical prompts (a hard requirement for reproducibility and
6
+ * for the position-swapped double run to cancel bias rather than introduce it).
7
+ *
8
+ * Two builders, one per judging leg:
9
+ * - `buildPairwisePrompt` — the RELATIVE leg: two redesign directions judged
10
+ * against a named reference (holistic taste/craft/fit).
11
+ * - `buildQualityPrompt` — the ABSOLUTE leg: page vs world-class exemplar,
12
+ * optionally narrowed to ONE product `Dimension` so the per-dimension win-rate
13
+ * is genuinely judge-resolved, never one overall number stamped across dims.
14
+ *
15
+ * Both carry an explicit anti-position-bias clause: SLOT A/B order is declared
16
+ * information-free so the model is told to judge on merit alone. The `slot`
17
+ * argument decides which logical subject (`input.a` / `input.b`) is physically
18
+ * rendered as SLOT A — the debias core drives both orders through here.
19
+ */
20
+ // Plain-language guidance per product-quality dimension, injected only when the
21
+ // absolute leg scopes a comparison to one `Dimension`. Lives here (with the
22
+ // prompt logic) — never in the logic-free contracts hub.
23
+ const DIMENSION_GUIDANCE = {
24
+ product_intent: 'how clearly and directly the design serves its core job-to-be-done',
25
+ visual_craft: 'typographic precision, colour discipline, spacing rhythm, and overall polish',
26
+ trust_clarity: 'legibility, contrast, restraint, and signals of credibility',
27
+ workflow: 'how efficiently a user can complete the primary task with minimal friction',
28
+ content_ia: 'information hierarchy, scannability, and content organisation',
29
+ };
30
+ const ANTI_POSITION_BIAS = 'SLOT A and SLOT B are presented in a randomized order that carries NO information. ' +
31
+ 'Do not favour a design because of its slot — judge only on merit.';
32
+ const RESPONSE_CONTRACT = [
33
+ 'Respond with ONLY a JSON object and no surrounding prose:',
34
+ '{"winner": "A" | "B" | "tie", "confidence": <number 0-1>, "reasons": [<short strings>]}',
35
+ ].join('\n');
36
+ function orderedSubjects(input, slot) {
37
+ return slot === 'AB' ? [input.a, input.b] : [input.b, input.a];
38
+ }
39
+ function renderReference(ref) {
40
+ if (!ref)
41
+ return '';
42
+ return `REFERENCE (${ref.kind}) — judge both designs against this world-class target:\n${ref.summary}`;
43
+ }
44
+ function renderRubric(body) {
45
+ if (!body)
46
+ return '';
47
+ return `SCORING CRITERIA:\n${body}`;
48
+ }
49
+ function renderSubject(label, s) {
50
+ const lines = [`SLOT ${label} (identity withheld):`];
51
+ if (s.directionSummary)
52
+ lines.push(s.directionSummary);
53
+ lines.push(s.dnaSummary);
54
+ return lines.join('\n');
55
+ }
56
+ function joinSections(sections) {
57
+ return sections.filter((s) => s.length > 0).join('\n\n');
58
+ }
59
+ function pairwiseSystem() {
60
+ return [
61
+ 'You are a world-class art director comparing two redesign directions for the same page against a named reference.',
62
+ 'Pick the direction with stronger taste, craft, information hierarchy, and fit to the reference.',
63
+ ANTI_POSITION_BIAS,
64
+ RESPONSE_CONTRACT,
65
+ 'Use "tie" only when the two are genuinely indistinguishable in quality.',
66
+ ].join('\n');
67
+ }
68
+ function qualitySystem(dimension) {
69
+ const focus = dimension
70
+ ? ` Focus ONLY on the "${dimension}" dimension: ${DIMENSION_GUIDANCE[dimension]}.`
71
+ : '';
72
+ return [
73
+ `You are a world-class design critic judging which of two designs is closer to world-class quality.${focus}`,
74
+ ANTI_POSITION_BIAS,
75
+ RESPONSE_CONTRACT,
76
+ 'Use "tie" only when the two are genuinely on par.',
77
+ ].join('\n');
78
+ }
79
+ /**
80
+ * The RELATIVE leg prompt: two redesign directions judged against a reference.
81
+ */
82
+ export function buildPairwisePrompt(input, slot) {
83
+ const [first, second] = orderedSubjects(input, slot);
84
+ const user = joinSections([
85
+ renderReference(input.reference),
86
+ renderRubric(input.rubricBody),
87
+ renderSubject('A', first),
88
+ renderSubject('B', second),
89
+ 'Which slot is the stronger redesign direction?',
90
+ ]);
91
+ return { system: pairwiseSystem(), user };
92
+ }
93
+ /**
94
+ * The ABSOLUTE leg prompt: page vs world-class exemplar, optionally narrowed to
95
+ * a single product `Dimension`.
96
+ */
97
+ export function buildQualityPrompt(input, slot) {
98
+ const [first, second] = orderedSubjects(input, slot);
99
+ const question = input.dimension
100
+ ? `Which slot better exemplifies world-class "${input.dimension}"?`
101
+ : 'Which slot is the higher-quality design overall?';
102
+ const user = joinSections([
103
+ renderReference(input.reference),
104
+ renderRubric(input.rubricBody),
105
+ renderSubject('A', first),
106
+ renderSubject('B', second),
107
+ question,
108
+ ]);
109
+ return { system: qualitySystem(input.dimension), user };
110
+ }
111
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
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 type { Dimension, JudgeSubject, QualityAssessment, TasteJudge } from '../contracts.js';
21
+ /**
22
+ * Assess the absolute quality of `page` against `exemplars` → a `win-rate`-keyed
23
+ * `QualityAssessment`.
24
+ */
25
+ export declare function assessPageQuality(judge: TasteJudge, page: JudgeSubject, exemplars: JudgeSubject[], opts?: {
26
+ dimensions?: Dimension[];
27
+ }): Promise<QualityAssessment>;
28
+ //# sourceMappingURL=quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality.d.ts","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/quality.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACX,MAAM,iBAAiB,CAAA;AAgCxB;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,YAAY,EAAE,EACzB,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,SAAS,EAAE,CAAA;CAAO,GACtC,OAAO,CAAC,iBAAiB,CAAC,CAoB5B"}
@@ -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"}