@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,110 @@
1
+ /**
2
+ * Brain-backed vision-model adapter — the IO half of the vision judge stack.
3
+ *
4
+ * The vision ensemble depends only on the narrow `VisionJudgeModel` seam
5
+ * (contracts): a model bound to ONE `{ provider, model }` ref that takes a system
6
+ * prompt + a user prompt + the compared subjects' screenshots and returns raw
7
+ * text. This module is the concrete, Brain-backed implementation of that seam.
8
+ * It is the ONLY impure part of the vision judge (disk read + a live model call);
9
+ * the aggregation in `vision-judge.ts` stays pure and unit-tests with stubs.
10
+ *
11
+ * Two responsibilities, both thin:
12
+ * - `createBrainVisionModel`: wrap one Brain as a `VisionJudgeModel` — resolve
13
+ * each `VisionImageRef` to encoded bytes (disk read for `screenshotPath`,
14
+ * mediaType from the file extension; passthrough for in-memory base64) and
15
+ * route them through `brain.completeVision`. The `id` is the ref rendered as
16
+ * `provider:model`, so an ensemble keys/aggregates per model.
17
+ * - `buildVisionModels`: construct the ensemble from a `ModelRef[]` — ONE Brain
18
+ * per ref, each with its OWN provider key. A single Brain CANNOT serve a mixed
19
+ * ensemble: `Brain.getModel` resolves the key via
20
+ * `resolveProviderApiKey(provider, this.explicitApiKey)`, so an explicit key
21
+ * set for one provider would leak to the others. Per-ref Brains give each ref
22
+ * the correct provider key (resolved from the environment).
23
+ */
24
+ import { readFile } from 'node:fs/promises';
25
+ import path from 'node:path';
26
+ import { Brain } from '../../../../brain/index.js';
27
+ import { clampPngLongestEdge } from './image-clamp.js';
28
+ import { resolveDefaultProvider, resolveProviderApiKey, resolveProviderModelName, } from '../../../../provider-defaults.js';
29
+ /** Render a `ModelRef` as the stable `provider:model` id the ensemble keys on. */
30
+ export function refToId(ref) {
31
+ return `${ref.provider ?? resolveDefaultProvider()}:${ref.model}`;
32
+ }
33
+ /** Infer an image mediaType from a screenshot file extension (PNG default). */
34
+ function mediaTypeForPath(p) {
35
+ const ext = path.extname(p).toLowerCase();
36
+ if (ext === '.jpg' || ext === '.jpeg')
37
+ return 'image/jpeg';
38
+ if (ext === '.webp')
39
+ return 'image/webp';
40
+ if (ext === '.gif')
41
+ return 'image/gif';
42
+ return 'image/png';
43
+ }
44
+ /**
45
+ * Resolve a `VisionImageRef` to encoded bytes (disk read for on-disk paths).
46
+ * Full-page PNG captures are clamped to the vision API's longest-edge limit first
47
+ * (see {@link clampPngLongestEdge}) — without it, a tall exemplar screenshot trips
48
+ * Anthropic's 8000px hard limit and the whole comparison fails. The clamp is a
49
+ * no-op for in-bounds images and for non-PNG bytes, so it never alters a small
50
+ * screenshot.
51
+ */
52
+ async function resolveImage(ref) {
53
+ if ('base64' in ref) {
54
+ if (ref.mediaType !== 'image/png')
55
+ return { image: ref.base64, mediaType: ref.mediaType };
56
+ const clamped = clampPngLongestEdge(Buffer.from(ref.base64, 'base64'));
57
+ return { image: clamped.toString('base64'), mediaType: ref.mediaType };
58
+ }
59
+ const mediaType = mediaTypeForPath(ref.screenshotPath);
60
+ const buf = await readFile(ref.screenshotPath);
61
+ const bytes = mediaType === 'image/png' ? clampPngLongestEdge(buf) : buf;
62
+ return { image: bytes.toString('base64'), mediaType };
63
+ }
64
+ /**
65
+ * Wrap one Brain (already bound to a `{ provider, model }`) as a
66
+ * `VisionJudgeModel`. The disk read + mediaType inference happen here so the
67
+ * pure ensemble never touches the filesystem; a failed read or model call
68
+ * propagates as a rejection, which the ensemble treats as a DROPPED model.
69
+ */
70
+ export function createBrainVisionModel(brain, ref) {
71
+ return {
72
+ id: refToId(ref),
73
+ async completeVision(system, user, images, options) {
74
+ const encoded = await Promise.all(images.map(resolveImage));
75
+ return brain.completeVision(system, user, encoded, options);
76
+ },
77
+ };
78
+ }
79
+ /**
80
+ * Construct the vision ensemble: ONE Brain per `ModelRef`, each resolving its own
81
+ * provider/model/api-key through `provider-defaults` (so a mixed
82
+ * openai+anthropic+google ensemble each gets the right env key). `vision: true`
83
+ * is set for clarity; `completeVision` builds its own multimodal message and does
84
+ * not depend on the Brain's vision strategy.
85
+ *
86
+ * Future lever: explicit per-vision-model `--api-key`/`--base-url` (today each ref
87
+ * resolves its key from the environment by provider; the audit's own brain still
88
+ * honours an explicit `--api-key`).
89
+ */
90
+ export function buildVisionModels(refs) {
91
+ return refs.map((ref) => {
92
+ const provider = ref.provider ?? resolveDefaultProvider();
93
+ const model = resolveProviderModelName(provider, ref.model);
94
+ const brain = new Brain({
95
+ provider,
96
+ model,
97
+ apiKey: resolveProviderApiKey(provider),
98
+ vision: true,
99
+ // The Claude Code SDK drops image parts unless streaming input is on; these
100
+ // Brains exist only to send screenshots, so force it. No-op for every other
101
+ // provider, so a mixed ensemble is unaffected.
102
+ claudeCodeStreamingInput: true,
103
+ // Opt-in per-call provider logging for diagnosing dropped vision verdicts.
104
+ debug: process.env.BAD_VISION_JUDGE_DEBUG === '1',
105
+ llmTimeoutMs: 120_000,
106
+ });
107
+ return createBrainVisionModel(brain, { provider, model });
108
+ });
109
+ }
110
+ //# sourceMappingURL=vision-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vision-model.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/judge/vision-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * L4 entrypoint — the flagged STAGE-6 replacement. ORCH: it runs the ONE shared
3
+ * core and maps its result onto the EXISTING `PageAuditResult` contract so the
4
+ * reference-grounded path drops into the v1 pipeline and stages 7-9 run unchanged.
5
+ *
6
+ * It is the sibling of `run.ts`: the SAME `engine/core.runRedesignCore`, a
7
+ * different return-shaping. Where `run.ts` surfaces the rich `RedesignArtifact`,
8
+ * this maps `RedesignRunResult` → `PageAuditResult` via the pure
9
+ * `artifact/to-findings.toReferencePageAuditResult` — never a second scoring pass.
10
+ *
11
+ * Acquire-once is honoured by the CALLER: the pipeline loads the corpus and
12
+ * resolves the reference ONCE above the page/rep loops and threads them in
13
+ * (`input.corpus`, `input.reference`), so this entry never reads the corpus from
14
+ * disk and the core never calls `store.load()`.
15
+ */
16
+ import type { PageClassification, MeasurementBundle, ReferenceContext, ReferenceGroundedConfig, PageAuditResult, Exemplar, ReferenceEngineDeps, Dimension, DimensionScore, RedesignArtifact } from '../contracts.js';
17
+ import { type ReferenceBrain } from '../engine/wiring.js';
18
+ /**
19
+ * Per-page input for {@link evaluateReferenceGrounded}. `corpus` and `config` are
20
+ * the once-acquired values threaded down from the pipeline; `reference` is the
21
+ * once-resolved operator reference (when one was supplied).
22
+ */
23
+ export interface EvaluateReferenceInput {
24
+ url: string;
25
+ classification: PageClassification;
26
+ measurements: MeasurementBundle;
27
+ /** Page screenshot, carried onto the result and reserved for a future vision judge. */
28
+ screenshotPath?: string;
29
+ /** Operator reference resolved once upstream; folded into `config.reference`. */
30
+ reference?: ReferenceContext;
31
+ /** The exemplar corpus, loaded ONCE per run by the pipeline and reused across pages/reps. */
32
+ corpus: Exemplar[];
33
+ /** The resolved engine config (the pipeline supplies a fully-resolved bundle). */
34
+ config: ReferenceGroundedConfig;
35
+ }
36
+ /**
37
+ * The result of one reference-grounded page evaluation.
38
+ *
39
+ * `result` is the `PageAuditResult` stages 7-9 consume; its `score` is the single
40
+ * headline authority. `dimensionScores` is the engine's per-`Dimension` surface,
41
+ * surfaced HERE so the pipeline can hand it to stage-8's `buildAuditResult` as
42
+ * `precomputedScores` — skipping the redundant `brain.auditDesign` scoring pass so
43
+ * there is exactly ONE scoring authority and no second multidim LLM call.
44
+ */
45
+ export interface ReferenceEvaluation {
46
+ result: PageAuditResult;
47
+ dimensionScores: Record<Dimension, DimensionScore>;
48
+ /**
49
+ * The rich engine output (all ranked directions with ASCII layout, type/colour/
50
+ * motion systems, hierarchy, copy). Carried here so the CLI can surface the full
51
+ * redesign brief instead of the lossy `DesignFinding` projection. The lossy
52
+ * `PageAuditResult.findings` projection alone cannot represent it.
53
+ */
54
+ artifact: RedesignArtifact;
55
+ }
56
+ /**
57
+ * Evaluate one page in reference-grounded mode. Returns a `ReferenceEvaluation`:
58
+ * the `PageAuditResult` (whose `score`, `summary`, `strengths`, `findings`, and
59
+ * `designSystemScore` come from the single quality authority via
60
+ * `toReferencePageAuditResult`) plus the engine's `dimensionScores` for the
61
+ * stage-8 `precomputedScores` hook.
62
+ *
63
+ * `deps` defaults to the production composition root (`buildDefaultDeps`); it is
64
+ * injectable only so the wiring unit-tests with deterministic fakes (no browser,
65
+ * no live LLM). The pipeline never passes it.
66
+ */
67
+ export declare function evaluateReferenceGrounded(brain: ReferenceBrain, input: EvaluateReferenceInput, deps?: ReferenceEngineDeps): Promise<ReferenceEvaluation>;
68
+ //# sourceMappingURL=evaluate-reference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate-reference.d.ts","sourceRoot":"","sources":["../../../../../src/design/audit/reference/pipeline/evaluate-reference.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EACf,QAAQ,EACR,mBAAmB,EACnB,SAAS,EACT,cAAc,EACd,gBAAgB,EACjB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAI3E;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,kBAAkB,CAAA;IAClC,YAAY,EAAE,iBAAiB,CAAA;IAC/B,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iFAAiF;IACjF,SAAS,CAAC,EAAE,gBAAgB,CAAA;IAC5B,6FAA6F;IAC7F,MAAM,EAAE,QAAQ,EAAE,CAAA;IAClB,kFAAkF;IAClF,MAAM,EAAE,uBAAuB,CAAA;CAChC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,eAAe,CAAA;IACvB,eAAe,EAAE,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;IAClD;;;;;OAKG;IACH,QAAQ,EAAE,gBAAgB,CAAA;CAC3B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,sBAAsB,EAC7B,IAAI,CAAC,EAAE,mBAAmB,GACzB,OAAO,CAAC,mBAAmB,CAAC,CAuB9B"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * L4 entrypoint — the flagged STAGE-6 replacement. ORCH: it runs the ONE shared
3
+ * core and maps its result onto the EXISTING `PageAuditResult` contract so the
4
+ * reference-grounded path drops into the v1 pipeline and stages 7-9 run unchanged.
5
+ *
6
+ * It is the sibling of `run.ts`: the SAME `engine/core.runRedesignCore`, a
7
+ * different return-shaping. Where `run.ts` surfaces the rich `RedesignArtifact`,
8
+ * this maps `RedesignRunResult` → `PageAuditResult` via the pure
9
+ * `artifact/to-findings.toReferencePageAuditResult` — never a second scoring pass.
10
+ *
11
+ * Acquire-once is honoured by the CALLER: the pipeline loads the corpus and
12
+ * resolves the reference ONCE above the page/rep loops and threads them in
13
+ * (`input.corpus`, `input.reference`), so this entry never reads the corpus from
14
+ * disk and the core never calls `store.load()`.
15
+ */
16
+ import { runRedesignCore } from '../engine/core.js';
17
+ import { buildDefaultDeps } from '../engine/wiring.js';
18
+ import { toReferencePageAuditResult } from '../artifact/to-findings.js';
19
+ import { writeArtifact } from '../artifact/render.js';
20
+ /**
21
+ * Evaluate one page in reference-grounded mode. Returns a `ReferenceEvaluation`:
22
+ * the `PageAuditResult` (whose `score`, `summary`, `strengths`, `findings`, and
23
+ * `designSystemScore` come from the single quality authority via
24
+ * `toReferencePageAuditResult`) plus the engine's `dimensionScores` for the
25
+ * stage-8 `precomputedScores` hook.
26
+ *
27
+ * `deps` defaults to the production composition root (`buildDefaultDeps`); it is
28
+ * injectable only so the wiring unit-tests with deterministic fakes (no browser,
29
+ * no live LLM). The pipeline never passes it.
30
+ */
31
+ export async function evaluateReferenceGrounded(brain, input, deps) {
32
+ // The core grounds against `config.reference`, never a separate field, so fold
33
+ // the once-resolved reference into the config the core reads.
34
+ const config = input.reference
35
+ ? { ...input.config, reference: input.reference }
36
+ : input.config;
37
+ const resolvedDeps = deps ?? buildDefaultDeps(brain, config);
38
+ const result = await runRedesignCore(resolvedDeps, {
39
+ url: input.url,
40
+ classification: input.classification,
41
+ measurements: input.measurements,
42
+ ...(input.screenshotPath ? { screenshotPath: input.screenshotPath } : {}),
43
+ corpus: input.corpus,
44
+ config,
45
+ });
46
+ if (config.artifactDir)
47
+ await writeArtifact(result.artifact, config.artifactDir);
48
+ const audit = toReferencePageAuditResult(result);
49
+ const withShot = input.screenshotPath ? { ...audit, screenshotPath: input.screenshotPath } : audit;
50
+ return { result: withShot, dimensionScores: result.dimensionScores, artifact: result.artifact };
51
+ }
52
+ //# sourceMappingURL=evaluate-reference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate-reference.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/pipeline/evaluate-reference.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAcH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAuB,MAAM,qBAAqB,CAAA;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAA;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AA0CrD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,KAAqB,EACrB,KAA6B,EAC7B,IAA0B;IAE1B,+EAA+E;IAC/E,8DAA8D;IAC9D,MAAM,MAAM,GAA4B,KAAK,CAAC,SAAS;QACrD,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE;QACjD,CAAC,CAAC,KAAK,CAAC,MAAM,CAAA;IAEhB,MAAM,YAAY,GAAG,IAAI,IAAI,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAE5D,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,EAAE;QACjD,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM;KACP,CAAC,CAAA;IAEF,IAAI,MAAM,CAAC,WAAW;QAAE,MAAM,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;IAEhF,MAAM,KAAK,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAA;IAChD,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;IAClG,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAA;AACjG,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Reference resolution adapter — turn the operator's `--reference <url|path>`
3
+ * into a resolved `ReferenceContext` ONCE, fail-closed.
4
+ *
5
+ * It owns the SINGLE IO seam (a live URL or a ripped local copy → `DesignDNA`)
6
+ * by delegating to an injected `DesignDnaExtractor`; it adds zero extraction
7
+ * logic of its own and the DNA→summary fold reuses the pure `summarizeDNA`, so
8
+ * it unit-tests against a deterministic fake extractor with no live browser or
9
+ * network. Per ARCHITECTURE §9 D3 it lives in its own small module — not the fat
10
+ * orchestrator — so both the CLI plumbing and tests reach it directly.
11
+ *
12
+ * Fail-closed: an unresolvable reference throws an explicit error rather than
13
+ * degrading to a fabricated "neutral" reference that would silently mis-ground.
14
+ */
15
+ import type { DesignDnaExtractor, ReferenceContext } from './contracts.js';
16
+ /** The single dependency the resolver injects — the page→DNA extractor seam. */
17
+ export interface ResolveReferenceDeps {
18
+ extractor: DesignDnaExtractor;
19
+ }
20
+ /** Browser/IO knobs forwarded to the extractor for the reference capture. */
21
+ export interface ResolveReferenceOptions {
22
+ headless?: boolean;
23
+ outputDir?: string;
24
+ }
25
+ /**
26
+ * Resolve `--reference` into a `ReferenceContext` exactly once. Returns
27
+ * `undefined` when no reference was supplied (the engine then grounds against
28
+ * the corpus alone); throws when a supplied reference cannot be captured.
29
+ */
30
+ export declare function resolveReferenceContext(ref: string | undefined, deps: ResolveReferenceDeps, opts?: ResolveReferenceOptions): Promise<ReferenceContext | undefined>;
31
+ //# sourceMappingURL=reference-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference-context.d.ts","sourceRoot":"","sources":["../../../../src/design/audit/reference/reference-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAiB,MAAM,gBAAgB,CAAA;AAGzF,gFAAgF;AAChF,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,kBAAkB,CAAA;CAC9B;AAED,6EAA6E;AAC7E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AA6BD;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,IAAI,EAAE,oBAAoB,EAC1B,IAAI,GAAE,uBAA4B,GACjC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAoBvC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Reference resolution adapter — turn the operator's `--reference <url|path>`
3
+ * into a resolved `ReferenceContext` ONCE, fail-closed.
4
+ *
5
+ * It owns the SINGLE IO seam (a live URL or a ripped local copy → `DesignDNA`)
6
+ * by delegating to an injected `DesignDnaExtractor`; it adds zero extraction
7
+ * logic of its own and the DNA→summary fold reuses the pure `summarizeDNA`, so
8
+ * it unit-tests against a deterministic fake extractor with no live browser or
9
+ * network. Per ARCHITECTURE §9 D3 it lives in its own small module — not the fat
10
+ * orchestrator — so both the CLI plumbing and tests reach it directly.
11
+ *
12
+ * Fail-closed: an unresolvable reference throws an explicit error rather than
13
+ * degrading to a fabricated "neutral" reference that would silently mis-ground.
14
+ */
15
+ import path from 'node:path';
16
+ import { pathToFileURL } from 'node:url';
17
+ import { summarizeDNA } from './dna/derive.js';
18
+ const HTTP_RE = /^https?:\/\//i;
19
+ /**
20
+ * Classify a `--reference` argument into a `ReferenceKind` and the URL the
21
+ * extractor consumes. A live `http(s)` ref is a `url`; any other value is a
22
+ * `rip` (a previously ripped local copy) addressed as a `file://` URL so the
23
+ * same extractor handles both. A relative path is resolved against the cwd.
24
+ */
25
+ function classifyReference(ref) {
26
+ if (HTTP_RE.test(ref))
27
+ return { kind: 'url', url: ref };
28
+ if (ref.startsWith('file://'))
29
+ return { kind: 'rip', url: ref };
30
+ const abs = path.isAbsolute(ref) ? ref : path.resolve(ref);
31
+ return { kind: 'rip', url: pathToFileURL(abs).href };
32
+ }
33
+ /**
34
+ * Prefer the desktop capture; otherwise any captured viewport, else none.
35
+ * Returned ABSOLUTE so a downstream consumer (e.g. the vision judge reading the
36
+ * screenshot off disk) resolves it independent of the process cwd — the
37
+ * extractor yields a path relative to its outputDir.
38
+ */
39
+ function firstScreenshot(paths) {
40
+ const p = paths['desktop'] ?? Object.values(paths)[0];
41
+ if (!p)
42
+ return undefined;
43
+ return path.isAbsolute(p) ? p : path.resolve(p);
44
+ }
45
+ /**
46
+ * Resolve `--reference` into a `ReferenceContext` exactly once. Returns
47
+ * `undefined` when no reference was supplied (the engine then grounds against
48
+ * the corpus alone); throws when a supplied reference cannot be captured.
49
+ */
50
+ export async function resolveReferenceContext(ref, deps, opts = {}) {
51
+ if (!ref)
52
+ return undefined;
53
+ const { kind, url } = classifyReference(ref);
54
+ let capture;
55
+ try {
56
+ capture = await deps.extractor.extract({
57
+ url,
58
+ ...(opts.headless !== undefined ? { headless: opts.headless } : {}),
59
+ ...(opts.outputDir ? { outputDir: opts.outputDir } : {}),
60
+ });
61
+ }
62
+ catch (err) {
63
+ throw new Error(`--reference could not be resolved (${ref}): ${err.message}`);
64
+ }
65
+ const screenshotPath = firstScreenshot(capture.screenshotPaths);
66
+ return {
67
+ kind,
68
+ dna: capture.dna,
69
+ summary: summarizeDNA(capture.dna),
70
+ ...(screenshotPath ? { screenshotPath } : {}),
71
+ };
72
+ }
73
+ //# sourceMappingURL=reference-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference-context.js","sourceRoot":"","sources":["../../../../src/design/audit/reference/reference-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAa9C,MAAM,OAAO,GAAG,eAAe,CAAA;AAE/B;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,GAAW;IACpC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IACvD,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC1D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;AACtD,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,KAA6B;IACpD,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACrD,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IACxB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,GAAuB,EACvB,IAA0B,EAC1B,OAAgC,EAAE;IAElC,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;IAC5C,IAAI,OAAO,CAAA;IACX,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YACrC,GAAG;YACH,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,MAAO,GAAa,CAAC,OAAO,EAAE,CAAC,CAAA;IAC1F,CAAC;IACD,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;IAC/D,OAAO;QACL,IAAI;QACJ,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;QAClC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAA;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Deterministic hash embedder + cosine similarity — the LITERALLY PURE half of
3
+ * the embedding boundary (the offline/test default).
4
+ *
5
+ * `HashEmbeddingProvider` implements `EmbeddingProvider` with a feature-hashing
6
+ * trick: every word unigram and adjacent bigram of the input is hashed to a
7
+ * signed bucket in a fixed-dimension vector, which is then L2-normalised. No
8
+ * network, no dynamic import, no env — so retrieval works with zero provider and
9
+ * unit tests never touch the wire. Identical text always yields an identical,
10
+ * unit-length vector.
11
+ *
12
+ * `cosineSimilarity` is the only symbol `retrieval/matcher` imports from here,
13
+ * keeping the matcher inside the pure subgraph. The network-backed provider lives
14
+ * in the sibling `embedding-openai.ts` adapter so this module stays pure.
15
+ */
16
+ import type { EmbeddingProvider } from '../contracts.js';
17
+ /** Fixed embedding width. A corpus embedded with the hash provider is keyed to this. */
18
+ export declare const HASH_EMBEDDING_DIMS = 256;
19
+ /**
20
+ * The offline/test default embedder. Deterministic, normalised, zero-IO.
21
+ */
22
+ export declare const HashEmbeddingProvider: EmbeddingProvider;
23
+ /**
24
+ * Cosine similarity of two numeric vectors, in [-1, 1]. Symmetric. Returns 0 when
25
+ * either vector is all-zero or empty (a fail-closed "no signal", never NaN). When
26
+ * lengths differ it compares the common leading dimensions — the caller is
27
+ * responsible for keeping query/exemplar vectors in the same embedding space.
28
+ */
29
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
30
+ //# sourceMappingURL=embedding-hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-hash.d.ts","sourceRoot":"","sources":["../../../../../src/design/audit/reference/retrieval/embedding-hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEzE,wFAAwF;AACxF,eAAO,MAAM,mBAAmB,MAAM,CAAA;AAwCtC;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,iBAKnC,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAajE"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Deterministic hash embedder + cosine similarity — the LITERALLY PURE half of
3
+ * the embedding boundary (the offline/test default).
4
+ *
5
+ * `HashEmbeddingProvider` implements `EmbeddingProvider` with a feature-hashing
6
+ * trick: every word unigram and adjacent bigram of the input is hashed to a
7
+ * signed bucket in a fixed-dimension vector, which is then L2-normalised. No
8
+ * network, no dynamic import, no env — so retrieval works with zero provider and
9
+ * unit tests never touch the wire. Identical text always yields an identical,
10
+ * unit-length vector.
11
+ *
12
+ * `cosineSimilarity` is the only symbol `retrieval/matcher` imports from here,
13
+ * keeping the matcher inside the pure subgraph. The network-backed provider lives
14
+ * in the sibling `embedding-openai.ts` adapter so this module stays pure.
15
+ */
16
+ /** Fixed embedding width. A corpus embedded with the hash provider is keyed to this. */
17
+ export const HASH_EMBEDDING_DIMS = 256;
18
+ const FNV_OFFSET = 0x811c9dc5;
19
+ const FNV_PRIME = 0x01000193;
20
+ /** 32-bit FNV-1a — a stable, dependency-free string hash. */
21
+ function fnv1a(str) {
22
+ let h = FNV_OFFSET;
23
+ for (let i = 0; i < str.length; i++) {
24
+ h ^= str.charCodeAt(i);
25
+ h = Math.imul(h, FNV_PRIME);
26
+ }
27
+ return h >>> 0;
28
+ }
29
+ /** Lowercase word unigrams + adjacent bigrams; deterministic and order-stable. */
30
+ function tokenize(text) {
31
+ const words = text.toLowerCase().match(/[a-z0-9#]+/g) ?? [];
32
+ const tokens = [...words];
33
+ for (let i = 1; i < words.length; i++)
34
+ tokens.push(`${words[i - 1]}_${words[i]}`);
35
+ return tokens;
36
+ }
37
+ function hashEmbed(text) {
38
+ const vec = new Array(HASH_EMBEDDING_DIMS).fill(0);
39
+ for (const token of tokenize(text)) {
40
+ const h = fnv1a(token);
41
+ const bucket = h % HASH_EMBEDDING_DIMS;
42
+ // A second, independent hash bit picks the sign, decorrelating collisions.
43
+ const sign = (fnv1a(`${token}\0sign`) & 1) === 0 ? 1 : -1;
44
+ vec[bucket] += sign;
45
+ }
46
+ let norm = 0;
47
+ for (const v of vec)
48
+ norm += v * v;
49
+ if (norm === 0)
50
+ return vec;
51
+ const inv = 1 / Math.sqrt(norm);
52
+ for (let i = 0; i < vec.length; i++)
53
+ vec[i] *= inv;
54
+ return vec;
55
+ }
56
+ /**
57
+ * The offline/test default embedder. Deterministic, normalised, zero-IO.
58
+ */
59
+ export const HashEmbeddingProvider = {
60
+ id: 'hash-v1',
61
+ async embed(texts) {
62
+ return texts.map(hashEmbed);
63
+ },
64
+ };
65
+ /**
66
+ * Cosine similarity of two numeric vectors, in [-1, 1]. Symmetric. Returns 0 when
67
+ * either vector is all-zero or empty (a fail-closed "no signal", never NaN). When
68
+ * lengths differ it compares the common leading dimensions — the caller is
69
+ * responsible for keeping query/exemplar vectors in the same embedding space.
70
+ */
71
+ export function cosineSimilarity(a, b) {
72
+ const len = Math.min(a.length, b.length);
73
+ if (len === 0)
74
+ return 0;
75
+ let dot = 0;
76
+ let na = 0;
77
+ let nb = 0;
78
+ for (let i = 0; i < len; i++) {
79
+ dot += a[i] * b[i];
80
+ na += a[i] * a[i];
81
+ nb += b[i] * b[i];
82
+ }
83
+ if (na === 0 || nb === 0)
84
+ return 0;
85
+ return dot / (Math.sqrt(na) * Math.sqrt(nb));
86
+ }
87
+ //# sourceMappingURL=embedding-hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-hash.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/retrieval/embedding-hash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Network-backed embedder — the ADAPTER half of the embedding boundary.
3
+ *
4
+ * `OpenAiEmbeddingProvider` implements `EmbeddingProvider` over the OpenAI
5
+ * embeddings endpoint via a `dynamic import('openai')` (the import is confined to
6
+ * this one adapter so the sibling `embedding-hash.ts` stays literally pure and
7
+ * the `openai` dep is never loaded on the offline path). The API key is resolved
8
+ * through the existing `resolveProviderApiKey` provider abstraction — never a
9
+ * hand-rolled fetch and never a duplicated env lookup.
10
+ *
11
+ * `resolveEmbeddingProvider` is the swap point: it returns the OpenAI provider
12
+ * when a key is present and falls back to the deterministic `HashEmbeddingProvider`
13
+ * otherwise, so the engine and its unit tests run with zero provider by default.
14
+ */
15
+ import type { EmbeddingProvider } from '../contracts.js';
16
+ /** Small, cheap, 1536-dim default. A corpus must be embedded with the same model. */
17
+ export declare const DEFAULT_OPENAI_EMBEDDING_MODEL = "text-embedding-3-small";
18
+ /**
19
+ * The default network-backed provider. Reads `OPENAI_API_KEY` from the
20
+ * environment lazily on each `embed` call via the shared provider abstraction.
21
+ */
22
+ export declare const OpenAiEmbeddingProvider: EmbeddingProvider;
23
+ /** Options for selecting an embedding provider. */
24
+ export interface ResolveEmbeddingOptions {
25
+ /** Explicit key, bypassing env resolution. */
26
+ apiKey?: string;
27
+ /** Env to resolve the key from (defaults to `process.env`). */
28
+ env?: NodeJS.ProcessEnv;
29
+ /** Override the embedding model (otherwise `DEFAULT_OPENAI_EMBEDDING_MODEL`). */
30
+ model?: string;
31
+ }
32
+ /**
33
+ * Pick a concrete embedder: the OpenAI provider when a key is resolvable, else the
34
+ * deterministic `HashEmbeddingProvider`. Fail-safe by construction — a missing key
35
+ * yields a working offline embedder rather than an error.
36
+ */
37
+ export declare function resolveEmbeddingProvider(opts?: ResolveEmbeddingOptions): EmbeddingProvider;
38
+ //# sourceMappingURL=embedding-openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-openai.d.ts","sourceRoot":"","sources":["../../../../../src/design/audit/reference/retrieval/embedding-openai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAIzE,qFAAqF;AACrF,eAAO,MAAM,8BAA8B,2BAA2B,CAAA;AAkCtE;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,iBAErC,CAAA;AAED,mDAAmD;AACnD,MAAM,WAAW,uBAAuB;IACtC,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,GAAE,uBAA4B,GAAG,iBAAiB,CAQ9F"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Network-backed embedder — the ADAPTER half of the embedding boundary.
3
+ *
4
+ * `OpenAiEmbeddingProvider` implements `EmbeddingProvider` over the OpenAI
5
+ * embeddings endpoint via a `dynamic import('openai')` (the import is confined to
6
+ * this one adapter so the sibling `embedding-hash.ts` stays literally pure and
7
+ * the `openai` dep is never loaded on the offline path). The API key is resolved
8
+ * through the existing `resolveProviderApiKey` provider abstraction — never a
9
+ * hand-rolled fetch and never a duplicated env lookup.
10
+ *
11
+ * `resolveEmbeddingProvider` is the swap point: it returns the OpenAI provider
12
+ * when a key is present and falls back to the deterministic `HashEmbeddingProvider`
13
+ * otherwise, so the engine and its unit tests run with zero provider by default.
14
+ */
15
+ import { resolveProviderApiKey } from '../../../../provider-defaults.js';
16
+ import { HashEmbeddingProvider } from './embedding-hash.js';
17
+ /** Small, cheap, 1536-dim default. A corpus must be embedded with the same model. */
18
+ export const DEFAULT_OPENAI_EMBEDDING_MODEL = 'text-embedding-3-small';
19
+ /** L2-normalise so provider vectors are unit-length like the hash provider's. */
20
+ function l2normalize(v) {
21
+ let norm = 0;
22
+ for (const x of v)
23
+ norm += x * x;
24
+ if (norm === 0)
25
+ return v.slice();
26
+ const inv = 1 / Math.sqrt(norm);
27
+ return v.map((x) => x * inv);
28
+ }
29
+ /**
30
+ * Build an OpenAI-backed `EmbeddingProvider` for `model`, resolving its key lazily
31
+ * (at `embed` time) through `getApiKey` so the provider can be a stable object.
32
+ */
33
+ function createOpenAiProvider(model, getApiKey) {
34
+ return {
35
+ id: `openai:${model}`,
36
+ async embed(texts) {
37
+ if (texts.length === 0)
38
+ return [];
39
+ const apiKey = getApiKey();
40
+ if (!apiKey) {
41
+ throw new Error('OpenAiEmbeddingProvider: no OpenAI API key resolved (set OPENAI_API_KEY or pass apiKey)');
42
+ }
43
+ const { default: OpenAI } = await import('openai');
44
+ const client = new OpenAI({ apiKey });
45
+ const res = await client.embeddings.create({ model, input: texts });
46
+ const out = new Array(texts.length);
47
+ for (const item of res.data)
48
+ out[item.index] = l2normalize(item.embedding);
49
+ return out;
50
+ },
51
+ };
52
+ }
53
+ /**
54
+ * The default network-backed provider. Reads `OPENAI_API_KEY` from the
55
+ * environment lazily on each `embed` call via the shared provider abstraction.
56
+ */
57
+ export const OpenAiEmbeddingProvider = createOpenAiProvider(DEFAULT_OPENAI_EMBEDDING_MODEL, () => resolveProviderApiKey('openai'));
58
+ /**
59
+ * Pick a concrete embedder: the OpenAI provider when a key is resolvable, else the
60
+ * deterministic `HashEmbeddingProvider`. Fail-safe by construction — a missing key
61
+ * yields a working offline embedder rather than an error.
62
+ */
63
+ export function resolveEmbeddingProvider(opts = {}) {
64
+ const apiKey = resolveProviderApiKey('openai', opts.apiKey, opts.env);
65
+ if (!apiKey)
66
+ return HashEmbeddingProvider;
67
+ const model = opts.model ?? DEFAULT_OPENAI_EMBEDDING_MODEL;
68
+ if (model === DEFAULT_OPENAI_EMBEDDING_MODEL && opts.apiKey === undefined && opts.env === undefined) {
69
+ return OpenAiEmbeddingProvider;
70
+ }
71
+ return createOpenAiProvider(model, () => resolveProviderApiKey('openai', opts.apiKey, opts.env));
72
+ }
73
+ //# sourceMappingURL=embedding-openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-openai.js","sourceRoot":"","sources":["../../../../../src/design/audit/reference/retrieval/embedding-openai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAE3D,qFAAqF;AACrF,MAAM,CAAC,MAAM,8BAA8B,GAAG,wBAAwB,CAAA;AAEtE,iFAAiF;AACjF,SAAS,WAAW,CAAC,CAAW;IAC9B,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,MAAM,CAAC,IAAI,CAAC;QAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAA;IAChC,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAA;IAChC,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/B,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;AAC9B,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,KAAa,EAAE,SAAmC;IAC9E,OAAO;QACL,EAAE,EAAE,UAAU,KAAK,EAAE;QACrB,KAAK,CAAC,KAAK,CAAC,KAAe;YACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAA;YACjC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;YAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAA;YAC5G,CAAC;YACD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAA;YAClD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;YACrC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;YACnE,MAAM,GAAG,GAAG,IAAI,KAAK,CAAkB,KAAK,CAAC,MAAM,CAAC,CAAA;YACpD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,IAAI;gBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC1E,OAAO,GAAG,CAAA;QACZ,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAsB,oBAAoB,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAClH,qBAAqB,CAAC,QAAQ,CAAC,CAChC,CAAA;AAYD;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAgC,EAAE;IACzE,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;IACrE,IAAI,CAAC,MAAM;QAAE,OAAO,qBAAqB,CAAA;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,8BAA8B,CAAA;IAC1D,IAAI,KAAK,KAAK,8BAA8B,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QACpG,OAAO,uBAAuB,CAAA;IAChC,CAAC;IACD,OAAO,oBAAoB,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAClG,CAAC"}