@tangle-network/browser-agent-driver 0.30.0 → 0.32.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 (252) hide show
  1. package/dist/brain/index.d.ts +12 -0
  2. package/dist/brain/index.d.ts.map +1 -1
  3. package/dist/brain/index.js +36 -8
  4. package/dist/brain/index.js.map +1 -1
  5. package/dist/cli-ack-patch.d.ts +39 -0
  6. package/dist/cli-ack-patch.d.ts.map +1 -0
  7. package/dist/cli-ack-patch.js +47 -0
  8. package/dist/cli-ack-patch.js.map +1 -0
  9. package/dist/cli-design-audit.d.ts +12 -0
  10. package/dist/cli-design-audit.d.ts.map +1 -1
  11. package/dist/cli-design-audit.js +78 -0
  12. package/dist/cli-design-audit.js.map +1 -1
  13. package/dist/cli-jobs.d.ts +13 -0
  14. package/dist/cli-jobs.d.ts.map +1 -0
  15. package/dist/cli-jobs.js +253 -0
  16. package/dist/cli-jobs.js.map +1 -0
  17. package/dist/cli-patterns.d.ts +26 -0
  18. package/dist/cli-patterns.d.ts.map +1 -0
  19. package/dist/cli-patterns.js +49 -0
  20. package/dist/cli-patterns.js.map +1 -0
  21. package/dist/cli-reports.d.ts +12 -0
  22. package/dist/cli-reports.d.ts.map +1 -0
  23. package/dist/cli-reports.js +97 -0
  24. package/dist/cli-reports.js.map +1 -0
  25. package/dist/cli.js +29 -1
  26. package/dist/cli.js.map +1 -1
  27. package/dist/design/audit/attribution/aggregate.d.ts +16 -0
  28. package/dist/design/audit/attribution/aggregate.d.ts.map +1 -0
  29. package/dist/design/audit/attribution/aggregate.js +81 -0
  30. package/dist/design/audit/attribution/aggregate.js.map +1 -0
  31. package/dist/design/audit/attribution/store.d.ts +36 -0
  32. package/dist/design/audit/attribution/store.d.ts.map +1 -0
  33. package/dist/design/audit/attribution/store.js +108 -0
  34. package/dist/design/audit/attribution/store.js.map +1 -0
  35. package/dist/design/audit/attribution/types.d.ts +13 -0
  36. package/dist/design/audit/attribution/types.d.ts.map +1 -0
  37. package/dist/design/audit/attribution/types.js +10 -0
  38. package/dist/design/audit/attribution/types.js.map +1 -0
  39. package/dist/design/audit/build-result.d.ts +68 -0
  40. package/dist/design/audit/build-result.d.ts.map +1 -0
  41. package/dist/design/audit/build-result.js +243 -0
  42. package/dist/design/audit/build-result.js.map +1 -0
  43. package/dist/design/audit/classify-ensemble.d.ts +46 -0
  44. package/dist/design/audit/classify-ensemble.d.ts.map +1 -0
  45. package/dist/design/audit/classify-ensemble.js +207 -0
  46. package/dist/design/audit/classify-ensemble.js.map +1 -0
  47. package/dist/design/audit/ethics/check.d.ts +59 -0
  48. package/dist/design/audit/ethics/check.d.ts.map +1 -0
  49. package/dist/design/audit/ethics/check.js +137 -0
  50. package/dist/design/audit/ethics/check.js.map +1 -0
  51. package/dist/design/audit/ethics/loader.d.ts +21 -0
  52. package/dist/design/audit/ethics/loader.d.ts.map +1 -0
  53. package/dist/design/audit/ethics/loader.js +207 -0
  54. package/dist/design/audit/ethics/loader.js.map +1 -0
  55. package/dist/design/audit/ethics/rules/finance.yaml +37 -0
  56. package/dist/design/audit/ethics/rules/kids.yaml +37 -0
  57. package/dist/design/audit/ethics/rules/legal.yaml +35 -0
  58. package/dist/design/audit/ethics/rules/medical.yaml +36 -0
  59. package/dist/design/audit/evaluate.d.ts.map +1 -1
  60. package/dist/design/audit/evaluate.js +4 -1
  61. package/dist/design/audit/evaluate.js.map +1 -1
  62. package/dist/design/audit/first-principles-mode.d.ts +42 -0
  63. package/dist/design/audit/first-principles-mode.d.ts.map +1 -0
  64. package/dist/design/audit/first-principles-mode.js +77 -0
  65. package/dist/design/audit/first-principles-mode.js.map +1 -0
  66. package/dist/design/audit/modality/android.d.ts +14 -0
  67. package/dist/design/audit/modality/android.d.ts.map +1 -0
  68. package/dist/design/audit/modality/android.js +18 -0
  69. package/dist/design/audit/modality/android.js.map +1 -0
  70. package/dist/design/audit/modality/html.d.ts +22 -0
  71. package/dist/design/audit/modality/html.d.ts.map +1 -0
  72. package/dist/design/audit/modality/html.js +51 -0
  73. package/dist/design/audit/modality/html.js.map +1 -0
  74. package/dist/design/audit/modality/index.d.ts +8 -0
  75. package/dist/design/audit/modality/index.d.ts.map +1 -0
  76. package/dist/design/audit/modality/index.js +15 -0
  77. package/dist/design/audit/modality/index.js.map +1 -0
  78. package/dist/design/audit/modality/ios.d.ts +16 -0
  79. package/dist/design/audit/modality/ios.d.ts.map +1 -0
  80. package/dist/design/audit/modality/ios.js +19 -0
  81. package/dist/design/audit/modality/ios.js.map +1 -0
  82. package/dist/design/audit/modality/types.d.ts +9 -0
  83. package/dist/design/audit/modality/types.d.ts.map +1 -0
  84. package/dist/design/audit/modality/types.js +9 -0
  85. package/dist/design/audit/modality/types.js.map +1 -0
  86. package/dist/design/audit/patches/generate.d.ts +45 -0
  87. package/dist/design/audit/patches/generate.d.ts.map +1 -0
  88. package/dist/design/audit/patches/generate.js +161 -0
  89. package/dist/design/audit/patches/generate.js.map +1 -0
  90. package/dist/design/audit/patches/index.d.ts +8 -0
  91. package/dist/design/audit/patches/index.d.ts.map +1 -0
  92. package/dist/design/audit/patches/index.js +5 -0
  93. package/dist/design/audit/patches/index.js.map +1 -0
  94. package/dist/design/audit/patches/parse.d.ts +29 -0
  95. package/dist/design/audit/patches/parse.d.ts.map +1 -0
  96. package/dist/design/audit/patches/parse.js +153 -0
  97. package/dist/design/audit/patches/parse.js.map +1 -0
  98. package/dist/design/audit/patches/render.d.ts +20 -0
  99. package/dist/design/audit/patches/render.d.ts.map +1 -0
  100. package/dist/design/audit/patches/render.js +55 -0
  101. package/dist/design/audit/patches/render.js.map +1 -0
  102. package/dist/design/audit/patches/severity-enforcement.d.ts +23 -0
  103. package/dist/design/audit/patches/severity-enforcement.d.ts.map +1 -0
  104. package/dist/design/audit/patches/severity-enforcement.js +42 -0
  105. package/dist/design/audit/patches/severity-enforcement.js.map +1 -0
  106. package/dist/design/audit/patches/validate.d.ts +40 -0
  107. package/dist/design/audit/patches/validate.d.ts.map +1 -0
  108. package/dist/design/audit/patches/validate.js +60 -0
  109. package/dist/design/audit/patches/validate.js.map +1 -0
  110. package/dist/design/audit/patterns/match.d.ts +24 -0
  111. package/dist/design/audit/patterns/match.d.ts.map +1 -0
  112. package/dist/design/audit/patterns/match.js +48 -0
  113. package/dist/design/audit/patterns/match.js.map +1 -0
  114. package/dist/design/audit/patterns/mine.d.ts +31 -0
  115. package/dist/design/audit/patterns/mine.d.ts.map +1 -0
  116. package/dist/design/audit/patterns/mine.js +35 -0
  117. package/dist/design/audit/patterns/mine.js.map +1 -0
  118. package/dist/design/audit/patterns/store.d.ts +14 -0
  119. package/dist/design/audit/patterns/store.d.ts.map +1 -0
  120. package/dist/design/audit/patterns/store.js +53 -0
  121. package/dist/design/audit/patterns/store.js.map +1 -0
  122. package/dist/design/audit/patterns/types.d.ts +53 -0
  123. package/dist/design/audit/patterns/types.d.ts.map +1 -0
  124. package/dist/design/audit/patterns/types.js +13 -0
  125. package/dist/design/audit/patterns/types.js.map +1 -0
  126. package/dist/design/audit/pipeline.d.ts +12 -0
  127. package/dist/design/audit/pipeline.d.ts.map +1 -1
  128. package/dist/design/audit/pipeline.js +81 -5
  129. package/dist/design/audit/pipeline.js.map +1 -1
  130. package/dist/design/audit/rubric/anchor-loader.d.ts +44 -0
  131. package/dist/design/audit/rubric/anchor-loader.d.ts.map +1 -0
  132. package/dist/design/audit/rubric/anchor-loader.js +210 -0
  133. package/dist/design/audit/rubric/anchor-loader.js.map +1 -0
  134. package/dist/design/audit/rubric/anchors/blog.yaml +33 -0
  135. package/dist/design/audit/rubric/anchors/dashboard.yaml +35 -0
  136. package/dist/design/audit/rubric/anchors/docs.yaml +35 -0
  137. package/dist/design/audit/rubric/anchors/ecommerce.yaml +33 -0
  138. package/dist/design/audit/rubric/anchors/marketing.yaml +34 -0
  139. package/dist/design/audit/rubric/anchors/saas-app.yaml +38 -0
  140. package/dist/design/audit/rubric/anchors/social.yaml +33 -0
  141. package/dist/design/audit/rubric/anchors/tool.yaml +33 -0
  142. package/dist/design/audit/rubric/anchors/utility.yaml +33 -0
  143. package/dist/design/audit/rubric/fragments/audience-clinician.md +42 -0
  144. package/dist/design/audit/rubric/fragments/audience-developer.md +40 -0
  145. package/dist/design/audit/rubric/fragments/audience-kids.md +35 -0
  146. package/dist/design/audit/rubric/fragments/audience-vulnerability-minor-facing.md +37 -0
  147. package/dist/design/audit/rubric/fragments/first-principles.md +65 -0
  148. package/dist/design/audit/rubric/fragments/modality-mobile.md +39 -0
  149. package/dist/design/audit/rubric/fragments/modality-tablet.md +35 -0
  150. package/dist/design/audit/rubric/fragments/regulatory-coppa.md +32 -0
  151. package/dist/design/audit/rubric/fragments/regulatory-gdpr.md +33 -0
  152. package/dist/design/audit/rubric/fragments/regulatory-hipaa.md +36 -0
  153. package/dist/design/audit/rubric/loader.d.ts +26 -6
  154. package/dist/design/audit/rubric/loader.d.ts.map +1 -1
  155. package/dist/design/audit/rubric/loader.js +45 -26
  156. package/dist/design/audit/rubric/loader.js.map +1 -1
  157. package/dist/design/audit/rubric/rollup-weights.d.ts +25 -0
  158. package/dist/design/audit/rubric/rollup-weights.d.ts.map +1 -0
  159. package/dist/design/audit/rubric/rollup-weights.js +51 -0
  160. package/dist/design/audit/rubric/rollup-weights.js.map +1 -0
  161. package/dist/design/audit/score-types.d.ts +431 -0
  162. package/dist/design/audit/score-types.d.ts.map +1 -0
  163. package/dist/design/audit/score-types.js +26 -0
  164. package/dist/design/audit/score-types.js.map +1 -0
  165. package/dist/design/audit/score.d.ts +49 -0
  166. package/dist/design/audit/score.d.ts.map +1 -0
  167. package/dist/design/audit/score.js +211 -0
  168. package/dist/design/audit/score.js.map +1 -0
  169. package/dist/design/audit/types.d.ts +28 -0
  170. package/dist/design/audit/types.d.ts.map +1 -1
  171. package/dist/discover/index.d.ts +16 -0
  172. package/dist/discover/index.d.ts.map +1 -0
  173. package/dist/discover/index.js +25 -0
  174. package/dist/discover/index.js.map +1 -0
  175. package/dist/discover/wayback.d.ts +49 -0
  176. package/dist/discover/wayback.d.ts.map +1 -0
  177. package/dist/discover/wayback.js +123 -0
  178. package/dist/discover/wayback.js.map +1 -0
  179. package/dist/jobs/anti-bot.d.ts +19 -0
  180. package/dist/jobs/anti-bot.d.ts.map +1 -0
  181. package/dist/jobs/anti-bot.js +64 -0
  182. package/dist/jobs/anti-bot.js.map +1 -0
  183. package/dist/jobs/cost-estimate.d.ts +12 -0
  184. package/dist/jobs/cost-estimate.d.ts.map +1 -0
  185. package/dist/jobs/cost-estimate.js +21 -0
  186. package/dist/jobs/cost-estimate.js.map +1 -0
  187. package/dist/jobs/cost-history.d.ts +19 -0
  188. package/dist/jobs/cost-history.d.ts.map +1 -0
  189. package/dist/jobs/cost-history.js +42 -0
  190. package/dist/jobs/cost-history.js.map +1 -0
  191. package/dist/jobs/index.d.ts +31 -0
  192. package/dist/jobs/index.d.ts.map +1 -0
  193. package/dist/jobs/index.js +37 -0
  194. package/dist/jobs/index.js.map +1 -0
  195. package/dist/jobs/orchestrator.d.ts +42 -0
  196. package/dist/jobs/orchestrator.d.ts.map +1 -0
  197. package/dist/jobs/orchestrator.js +282 -0
  198. package/dist/jobs/orchestrator.js.map +1 -0
  199. package/dist/jobs/queue.d.ts +45 -0
  200. package/dist/jobs/queue.d.ts.map +1 -0
  201. package/dist/jobs/queue.js +114 -0
  202. package/dist/jobs/queue.js.map +1 -0
  203. package/dist/jobs/retry.d.ts +36 -0
  204. package/dist/jobs/retry.d.ts.map +1 -0
  205. package/dist/jobs/retry.js +77 -0
  206. package/dist/jobs/retry.js.map +1 -0
  207. package/dist/jobs/store.d.ts +31 -0
  208. package/dist/jobs/store.d.ts.map +1 -0
  209. package/dist/jobs/store.js +92 -0
  210. package/dist/jobs/store.js.map +1 -0
  211. package/dist/jobs/types.d.ts +106 -0
  212. package/dist/jobs/types.d.ts.map +1 -0
  213. package/dist/jobs/types.js +13 -0
  214. package/dist/jobs/types.js.map +1 -0
  215. package/dist/reports/aggregate.d.ts +38 -0
  216. package/dist/reports/aggregate.d.ts.map +1 -0
  217. package/dist/reports/aggregate.js +145 -0
  218. package/dist/reports/aggregate.js.map +1 -0
  219. package/dist/reports/index.d.ts +21 -0
  220. package/dist/reports/index.d.ts.map +1 -0
  221. package/dist/reports/index.js +15 -0
  222. package/dist/reports/index.js.map +1 -0
  223. package/dist/reports/narrate.d.ts +19 -0
  224. package/dist/reports/narrate.d.ts.map +1 -0
  225. package/dist/reports/narrate.js +40 -0
  226. package/dist/reports/narrate.js.map +1 -0
  227. package/dist/reports/templates.d.ts +43 -0
  228. package/dist/reports/templates.d.ts.map +1 -0
  229. package/dist/reports/templates.js +200 -0
  230. package/dist/reports/templates.js.map +1 -0
  231. package/dist/reports/tokens.d.ts +69 -0
  232. package/dist/reports/tokens.d.ts.map +1 -0
  233. package/dist/reports/tokens.js +74 -0
  234. package/dist/reports/tokens.js.map +1 -0
  235. package/dist/reports/tools.d.ts +76 -0
  236. package/dist/reports/tools.d.ts.map +1 -0
  237. package/dist/reports/tools.js +205 -0
  238. package/dist/reports/tools.js.map +1 -0
  239. package/dist/reports/types.d.ts +51 -0
  240. package/dist/reports/types.d.ts.map +1 -0
  241. package/dist/reports/types.js +9 -0
  242. package/dist/reports/types.js.map +1 -0
  243. package/dist/run-state.d.ts +36 -1
  244. package/dist/run-state.d.ts.map +1 -1
  245. package/dist/run-state.js +36 -1
  246. package/dist/run-state.js.map +1 -1
  247. package/dist/runner/runner.d.ts.map +1 -1
  248. package/dist/runner/runner.js +73 -3
  249. package/dist/runner/runner.js.map +1 -1
  250. package/dist/types.d.ts +7 -0
  251. package/dist/types.d.ts.map +1 -1
  252. package/package.json +5 -1
@@ -0,0 +1,68 @@
1
+ /**
2
+ * AuditResult builder.
3
+ *
4
+ * Composes the per-dimension scores, ensemble classification, and rollup
5
+ * into the canonical `AuditResult` that downstream consumers (jobs, reports,
6
+ * brand-evolution, orchestrator) read.
7
+ */
8
+ import type { Brain } from '../../brain/index.js';
9
+ import type { PageState } from '../../types.js';
10
+ import type { PageAuditResult, ComposedRubric, MeasurementBundle } from './types.js';
11
+ import { type AuditResult, type DesignFinding, type Dimension, type DimensionScore, type EnsembleClassification } from './score-types.js';
12
+ import { renderAnchor, type CalibrationAnchor } from './rubric/anchor-loader.js';
13
+ export interface BuildAuditResultInput {
14
+ brain: Brain;
15
+ state: PageState;
16
+ pageRef: string;
17
+ ensemble: EnsembleClassification;
18
+ rubric: ComposedRubric;
19
+ measurements: MeasurementBundle;
20
+ v1Result: PageAuditResult;
21
+ anchor?: CalibrationAnchor;
22
+ /** Reuse the pipeline runId so envelopes correlate. */
23
+ runId?: string;
24
+ /** Optional override (e.g. test fixtures). When set, skip the LLM call. */
25
+ precomputedScores?: Record<Dimension, DimensionScore>;
26
+ }
27
+ /**
28
+ * Produce a complete `AuditResult`. When `precomputedScores` is set we
29
+ * skip the LLM call entirely (used by deterministic tests + the
30
+ * `--audit-passes auto` legacy fallback path).
31
+ */
32
+ export declare function buildAuditResult(input: BuildAuditResultInput): Promise<AuditResult>;
33
+ declare function renderMeasurementSummary(measurements: MeasurementBundle): string;
34
+ /**
35
+ * Stamp stable ids + dimension + kind onto v1 findings. Patches are parsed
36
+ * separately by parseAndAttachPatches so the patch generator (which runs
37
+ * between adaptFindingsLite and parseAndAttachPatches) can populate
38
+ * `rawPatches` first.
39
+ */
40
+ declare function adaptFindingsLite(v1Findings: PageAuditResult['findings']): DesignFinding[];
41
+ /**
42
+ * After the patch generator has run, parse each finding's `rawPatches` array
43
+ * into typed Patch objects. The findingId on each parsed patch is overridden
44
+ * with the finding's stable id so it always points at the right place — even
45
+ * if the LLM emitted its own placeholder.
46
+ */
47
+ declare function parseAndAttachPatches(findings: DesignFinding[]): DesignFinding[];
48
+ /**
49
+ * Layer 2 enforcement — validate every patch against the page snapshot
50
+ * (drops patches whose `diff.before` isn't actually present), then run the
51
+ * severity policy: major/critical findings without ≥1 valid patch downgrade
52
+ * to minor.
53
+ */
54
+ declare function enforceFindingPolicy(findings: DesignFinding[], snapshot: string): DesignFinding[];
55
+ declare function mapCategoryToDimension(category: string): Dimension;
56
+ declare function computeTopFixes(findings: DesignFinding[]): DesignFinding[];
57
+ declare function synthesizeScoresFromLegacy(v1: PageAuditResult): Record<Dimension, DimensionScore>;
58
+ export declare const BUILD_RESULT_INTERNALS: {
59
+ renderMeasurementSummary: typeof renderMeasurementSummary;
60
+ adaptFindingsLite: typeof adaptFindingsLite;
61
+ parseAndAttachPatches: typeof parseAndAttachPatches;
62
+ enforceFindingPolicy: typeof enforceFindingPolicy;
63
+ mapCategoryToDimension: typeof mapCategoryToDimension;
64
+ computeTopFixes: typeof computeTopFixes;
65
+ synthesizeScoresFromLegacy: typeof synthesizeScoresFromLegacy;
66
+ };
67
+ export { renderAnchor };
68
+ //# sourceMappingURL=build-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-result.d.ts","sourceRoot":"","sources":["../../../src/design/audit/build-result.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EACV,eAAe,EAEf,cAAc,EACd,iBAAiB,EAClB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAG5B,MAAM,kBAAkB,CAAA;AAMzB,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAMhF,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,SAAS,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,sBAAsB,CAAA;IAChC,MAAM,EAAE,cAAc,CAAA;IACtB,YAAY,EAAE,iBAAiB,CAAA;IAC/B,QAAQ,EAAE,eAAe,CAAA;IACzB,MAAM,CAAC,EAAE,iBAAiB,CAAA;IAC1B,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;CACtD;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAiFzF;AAED,iBAAS,wBAAwB,CAAC,YAAY,EAAE,iBAAiB,GAAG,MAAM,CAOzE;AAED;;;;;GAKG;AACH,iBAAS,iBAAiB,CAAC,UAAU,EAAE,eAAe,CAAC,UAAU,CAAC,GAAG,aAAa,EAAE,CAanF;AAED;;;;;GAKG;AACH,iBAAS,qBAAqB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAOzE;AAaD;;;;;GAKG;AACH,iBAAS,oBAAoB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAa1F;AAED,iBAAS,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAe3D;AAQD,iBAAS,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAMnE;AAWD,iBAAS,0BAA0B,CAAC,EAAE,EAAE,eAAe,GAAG,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAgB1F;AAMD,eAAO,MAAM,sBAAsB;;;;;;;;CAQlC,CAAA;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * AuditResult builder.
3
+ *
4
+ * Composes the per-dimension scores, ensemble classification, and rollup
5
+ * into the canonical `AuditResult` that downstream consumers (jobs, reports,
6
+ * brand-evolution, orchestrator) read.
7
+ */
8
+ import { randomUUID, createHash } from 'node:crypto';
9
+ import { DIMENSIONS, } from './score-types.js';
10
+ import { buildEvalPrompt, computeRollup, parseAuditResponse, } from './score.js';
11
+ import { renderAnchor } from './rubric/anchor-loader.js';
12
+ import { parsePatches } from './patches/parse.js';
13
+ import { validatePatch } from './patches/validate.js';
14
+ import { enforcePatchPolicy } from './patches/severity-enforcement.js';
15
+ import { generatePatches } from './patches/generate.js';
16
+ /**
17
+ * Produce a complete `AuditResult`. When `precomputedScores` is set we
18
+ * skip the LLM call entirely (used by deterministic tests + the
19
+ * `--audit-passes auto` legacy fallback path).
20
+ */
21
+ export async function buildAuditResult(input) {
22
+ const { brain, state, pageRef, ensemble, rubric, measurements, v1Result, anchor, runId } = input;
23
+ const measurementSummary = renderMeasurementSummary(measurements);
24
+ const prompt = buildEvalPrompt({
25
+ pageType: ensemble.type,
26
+ rubricBody: rubric.body,
27
+ anchor,
28
+ measurementSummary,
29
+ intent: ensemble.intent,
30
+ });
31
+ let scores;
32
+ let llmTokens = 0;
33
+ if (input.precomputedScores) {
34
+ scores = input.precomputedScores;
35
+ }
36
+ else {
37
+ try {
38
+ const llm = await brain.auditDesign(state, 'Multi-dimensional audit', [], prompt);
39
+ llmTokens = llm.tokensUsed ?? 0;
40
+ const parsed = parseAuditResponse(llm.raw);
41
+ scores = parsed.scores;
42
+ }
43
+ catch {
44
+ // Fall back: synthesize per-dim scores from the v1 result. Conservative —
45
+ // every dim gets the v1 score, range +/- 1, confidence 'low'.
46
+ scores = synthesizeScoresFromLegacy(v1Result);
47
+ }
48
+ }
49
+ const rollup = computeRollup(scores, ensemble.type);
50
+ // Layer 2 — two-call patch flow. The findings prompt above stayed slim
51
+ // and focused on scoring; now ask the LLM for one patch per major/critical
52
+ // finding (skipped when precomputedScores is set, since tests can supply
53
+ // findings with rawPatches already attached).
54
+ let findings = adaptFindingsLite(v1Result.findings);
55
+ if (!input.precomputedScores) {
56
+ try {
57
+ const generated = await generatePatches({
58
+ brain,
59
+ snapshot: state.snapshot,
60
+ findings: findings,
61
+ });
62
+ findings = generated.findings;
63
+ llmTokens += generated.tokensUsed;
64
+ }
65
+ catch (err) {
66
+ // Patch generator failure is non-fatal — Layer 2 enforcement below will
67
+ // still downgrade major/critical findings that lack a valid patch.
68
+ console.warn(`[audit/patches] generator failed: ${err.message}`);
69
+ }
70
+ }
71
+ // Now parse rawPatches → typed Patches, validate against the snapshot,
72
+ // and enforce the severity policy (downgrade major/critical without a
73
+ // valid patch). adaptFindingsLite wires the parser; enforceFindingPolicy
74
+ // wires the validator + downgrade rule.
75
+ findings = parseAndAttachPatches(findings);
76
+ findings = enforceFindingPolicy(findings, state.snapshot);
77
+ const topFixes = computeTopFixes(findings).slice(0, 5).map((f) => f.id);
78
+ const promptHash = sha1(prompt);
79
+ const rubricHash = sha1(rubric.body);
80
+ const totalTokens = (v1Result.tokensUsed ?? 0) + llmTokens;
81
+ return {
82
+ runId: runId ?? randomUUID(),
83
+ pageRef,
84
+ classification: ensemble,
85
+ scores,
86
+ rollup,
87
+ findings,
88
+ topFixes,
89
+ measurements,
90
+ ethicsViolations: [],
91
+ matchedPatterns: [],
92
+ modality: 'html',
93
+ evaluatedAt: new Date().toISOString(),
94
+ promptHash,
95
+ rubricHash,
96
+ tokensUsed: totalTokens > 0 ? totalTokens : undefined,
97
+ passes: ['multidim'],
98
+ ...(v1Result.error ? { error: v1Result.error } : {}),
99
+ };
100
+ }
101
+ function renderMeasurementSummary(measurements) {
102
+ const aaFails = measurements.contrast.aaFailures.length;
103
+ const a11y = measurements.a11y.violations.length;
104
+ return [
105
+ `contrast AA failures: ${aaFails} of ${measurements.contrast.totalChecked} text elements`,
106
+ `axe violations: ${a11y}${a11y > 0 ? ` (top: ${measurements.a11y.violations.slice(0, 3).map((v) => `${v.id}/${v.impact}`).join(', ')})` : ''}`,
107
+ ].join('\n');
108
+ }
109
+ /**
110
+ * Stamp stable ids + dimension + kind onto v1 findings. Patches are parsed
111
+ * separately by parseAndAttachPatches so the patch generator (which runs
112
+ * between adaptFindingsLite and parseAndAttachPatches) can populate
113
+ * `rawPatches` first.
114
+ */
115
+ function adaptFindingsLite(v1Findings) {
116
+ return v1Findings.map((f, idx) => {
117
+ const id = `finding-${idx + 1}-${sha1(`${f.category}|${f.description}`).slice(0, 8)}`;
118
+ const dimension = mapCategoryToDimension(f.category);
119
+ const kind = inferKind(f);
120
+ return {
121
+ ...f,
122
+ id,
123
+ dimension,
124
+ kind,
125
+ patches: [],
126
+ };
127
+ });
128
+ }
129
+ /**
130
+ * After the patch generator has run, parse each finding's `rawPatches` array
131
+ * into typed Patch objects. The findingId on each parsed patch is overridden
132
+ * with the finding's stable id so it always points at the right place — even
133
+ * if the LLM emitted its own placeholder.
134
+ */
135
+ function parseAndAttachPatches(findings) {
136
+ return findings.map(f => {
137
+ const rawPatches = (f.rawPatches ?? []);
138
+ if (rawPatches.length === 0)
139
+ return f;
140
+ const parsed = parsePatches(rawPatches.map(p => withFindingId(p, f.id)));
141
+ return { ...f, patches: parsed.patches };
142
+ });
143
+ }
144
+ /**
145
+ * Inject `findingId` into a raw patch object before parsing, so the finding's
146
+ * stable id always wins over whatever placeholder the LLM emitted.
147
+ */
148
+ function withFindingId(raw, findingId) {
149
+ if (raw && typeof raw === 'object') {
150
+ return { ...raw, findingId };
151
+ }
152
+ return raw;
153
+ }
154
+ /**
155
+ * Layer 2 enforcement — validate every patch against the page snapshot
156
+ * (drops patches whose `diff.before` isn't actually present), then run the
157
+ * severity policy: major/critical findings without ≥1 valid patch downgrade
158
+ * to minor.
159
+ */
160
+ function enforceFindingPolicy(findings, snapshot) {
161
+ // Step 1: per-finding patch validation — keep only valid patches.
162
+ const validated = findings.map(f => {
163
+ const validPatches = (f.patches ?? []).filter(p => validatePatch(p, snapshot).valid);
164
+ return { ...f, patches: validPatches };
165
+ });
166
+ // Step 2: severity downgrade — collect valid patch ids and let the policy
167
+ // decide which findings keep their declared severity.
168
+ const validPatchIds = new Set();
169
+ for (const f of validated) {
170
+ for (const p of f.patches ?? [])
171
+ validPatchIds.add(p.patchId);
172
+ }
173
+ return enforcePatchPolicy(validated, validPatchIds).findings;
174
+ }
175
+ function mapCategoryToDimension(category) {
176
+ switch (category) {
177
+ case 'visual-bug':
178
+ case 'spacing':
179
+ case 'typography':
180
+ case 'alignment':
181
+ case 'layout':
182
+ return 'visual_craft';
183
+ case 'contrast':
184
+ case 'accessibility':
185
+ return 'visual_craft';
186
+ case 'ux':
187
+ default:
188
+ return 'product_intent';
189
+ }
190
+ }
191
+ function inferKind(f) {
192
+ if (f.category === 'contrast' || f.category === 'accessibility')
193
+ return 'measurement';
194
+ if (f.category === 'ux')
195
+ return 'job';
196
+ return 'polish';
197
+ }
198
+ function computeTopFixes(findings) {
199
+ return [...findings].sort((a, b) => {
200
+ const aScore = (a.impact ?? 0) * blastWeight(a.blast);
201
+ const bScore = (b.impact ?? 0) * blastWeight(b.blast);
202
+ return bScore - aScore;
203
+ });
204
+ }
205
+ function blastWeight(blast) {
206
+ switch (blast) {
207
+ case 'system': return 4;
208
+ case 'component': return 3;
209
+ case 'section': return 2;
210
+ default: return 1;
211
+ }
212
+ }
213
+ function synthesizeScoresFromLegacy(v1) {
214
+ const fallback = Math.max(1, Math.min(10, Math.round(v1.score)));
215
+ const out = {};
216
+ for (const dim of DIMENSIONS) {
217
+ out[dim] = {
218
+ score: fallback,
219
+ range: [
220
+ Math.max(1, fallback - 1),
221
+ Math.min(10, fallback + 1),
222
+ ],
223
+ confidence: 'low',
224
+ summary: 'Synthesized from v1 score (LLM call unavailable).',
225
+ primaryFindings: [],
226
+ };
227
+ }
228
+ return out;
229
+ }
230
+ function sha1(s) {
231
+ return createHash('sha1').update(s).digest('hex');
232
+ }
233
+ export const BUILD_RESULT_INTERNALS = {
234
+ renderMeasurementSummary,
235
+ adaptFindingsLite,
236
+ parseAndAttachPatches,
237
+ enforceFindingPolicy,
238
+ mapCategoryToDimension,
239
+ computeTopFixes,
240
+ synthesizeScoresFromLegacy,
241
+ };
242
+ export { renderAnchor };
243
+ //# sourceMappingURL=build-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-result.js","sourceRoot":"","sources":["../../../src/design/audit/build-result.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Ensemble classifier — Layer 1 of the world-class design-audit architecture.
3
+ *
4
+ * Three-signal vote (URL pattern + DOM heuristic + LLM) decides the page type
5
+ * and reports an ensemble confidence so downstream layers (first-principles
6
+ * fallback, rubric loader, telemetry) can act on uncertainty honestly.
7
+ *
8
+ * Vote logic:
9
+ * - URL + DOM agree on a type AND combined confidence > 0.7 → accept (skip LLM)
10
+ * - else → run LLM, take majority
11
+ * - if LLM confidence < 0.5 AND signals disagree → return 'unknown' with dissent
12
+ */
13
+ import type { Brain } from '../../brain/index.js';
14
+ import type { PageState } from '../../types.js';
15
+ import type { PageType } from './types.js';
16
+ import type { ClassifierSignal, DomHeuristics, EnsembleClassification } from './score-types.js';
17
+ interface UrlPatternRule {
18
+ pattern: RegExp;
19
+ type: PageType;
20
+ confidence: number;
21
+ rationale: string;
22
+ }
23
+ export interface EnsembleClassifyInput {
24
+ brain: Brain;
25
+ state: PageState;
26
+ url: string;
27
+ /** Optional pre-captured DOM heuristics. If absent, we attempt to derive them from the snapshot. */
28
+ domHeuristics?: DomHeuristics;
29
+ }
30
+ /** Public entry point. */
31
+ export declare function classifyEnsemble(input: EnsembleClassifyInput): Promise<EnsembleClassification>;
32
+ export declare function classifyByUrl(url: string): ClassifierSignal | null;
33
+ export declare function classifyByDom(dom: DomHeuristics): ClassifierSignal | null;
34
+ /**
35
+ * Best-effort DOM heuristic derivation from the accessibility-tree snapshot.
36
+ * Pipelines that capture true DOM heuristics via Playwright should pass them
37
+ * in directly; this fallback works against the @ref-snapshot text.
38
+ */
39
+ export declare function deriveHeuristics(state: PageState): DomHeuristics;
40
+ export declare const ENSEMBLE_INTERNALS: {
41
+ URL_PATTERN_RULES: UrlPatternRule[];
42
+ ENSEMBLE_AGREEMENT_THRESHOLD: number;
43
+ LLM_FALLBACK_CONFIDENCE: number;
44
+ };
45
+ export {};
46
+ //# sourceMappingURL=classify-ensemble.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify-ensemble.d.ts","sourceRoot":"","sources":["../../../src/design/audit/classify-ensemble.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,OAAO,KAAK,EAAsB,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC9D,OAAO,KAAK,EACV,gBAAgB,EAEhB,aAAa,EACb,sBAAsB,EACvB,MAAM,kBAAkB,CAAA;AAEzB,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,QAAQ,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAoBD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,SAAS,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;IACX,oGAAoG;IACpG,aAAa,CAAC,EAAE,aAAa,CAAA;CAC9B;AAED,0BAA0B;AAC1B,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAgFpG;AA8BD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAkBlE;AAID,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,gBAAgB,GAAG,IAAI,CA8BzE;AAQD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,aAAa,CAchE;AAYD,eAAO,MAAM,kBAAkB;;;;CAI9B,CAAA"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Ensemble classifier — Layer 1 of the world-class design-audit architecture.
3
+ *
4
+ * Three-signal vote (URL pattern + DOM heuristic + LLM) decides the page type
5
+ * and reports an ensemble confidence so downstream layers (first-principles
6
+ * fallback, rubric loader, telemetry) can act on uncertainty honestly.
7
+ *
8
+ * Vote logic:
9
+ * - URL + DOM agree on a type AND combined confidence > 0.7 → accept (skip LLM)
10
+ * - else → run LLM, take majority
11
+ * - if LLM confidence < 0.5 AND signals disagree → return 'unknown' with dissent
12
+ */
13
+ import { classifyPage, defaultClassification } from './classify.js';
14
+ /**
15
+ * URL pattern rules — straight from the RFC. Order matters: more specific
16
+ * patterns first. Each rule's confidence is the URL signal's contribution to
17
+ * the ensemble vote.
18
+ */
19
+ const URL_PATTERN_RULES = [
20
+ { pattern: /\/(docs|reference|api|guide|help|faq)(\/|$)/, type: 'docs', confidence: 0.85, rationale: 'URL contains a docs path segment' },
21
+ { pattern: /\/(checkout|cart|pay|order|billing)(\/|$)/, type: 'ecommerce', confidence: 0.85, rationale: 'URL contains a commerce path segment' },
22
+ { pattern: /\/(app|dashboard|workspace|admin)(\/|$)/, type: 'saas-app', confidence: 0.75, rationale: 'URL contains an app/dashboard path segment' },
23
+ { pattern: /\/(login|signup|auth|sign-in)(\/|$)/, type: 'utility', confidence: 0.85, rationale: 'URL contains an auth path segment' },
24
+ { pattern: /\/(pricing|plans|features|product)(\/|$)/, type: 'marketing', confidence: 0.7, rationale: 'URL contains a marketing path segment' },
25
+ { pattern: /\/(blog|articles|news|stories)(\/|$)/, type: 'blog', confidence: 0.8, rationale: 'URL contains a blog path segment' },
26
+ { pattern: /\/$/, type: 'marketing', confidence: 0.4, rationale: 'URL is a root path — weak marketing default' },
27
+ ];
28
+ const ENSEMBLE_AGREEMENT_THRESHOLD = 0.7;
29
+ const LLM_FALLBACK_CONFIDENCE = 0.5;
30
+ /** Public entry point. */
31
+ export async function classifyEnsemble(input) {
32
+ const signals = [];
33
+ // ── 1. URL pattern signal ──
34
+ const urlSignal = classifyByUrl(input.url);
35
+ if (urlSignal)
36
+ signals.push(urlSignal);
37
+ // ── 2. DOM heuristic signal ──
38
+ const dom = input.domHeuristics ?? deriveHeuristics(input.state);
39
+ const domSignal = classifyByDom(dom);
40
+ if (domSignal)
41
+ signals.push(domSignal);
42
+ // ── Quick path: URL + DOM agree with combined confidence > threshold ──
43
+ if (urlSignal &&
44
+ domSignal &&
45
+ urlSignal.type === domSignal.type &&
46
+ urlSignal.confidence + domSignal.confidence > ENSEMBLE_AGREEMENT_THRESHOLD) {
47
+ const ensembleConfidence = clamp01(Math.min(1, (urlSignal.confidence + domSignal.confidence) / 1.6));
48
+ return finalize({
49
+ type: urlSignal.type,
50
+ base: defaultClassification(),
51
+ signals,
52
+ ensembleConfidence,
53
+ signalsAgreed: true,
54
+ });
55
+ }
56
+ // ── 3. LLM tiebreaker ──
57
+ const llmClass = await classifyPage(input.brain, input.state).catch(() => defaultClassification());
58
+ signals.push({
59
+ source: 'llm',
60
+ type: llmClass.type,
61
+ confidence: llmClass.confidence,
62
+ rationale: llmClass.intent || 'LLM page classification',
63
+ });
64
+ // ── Vote ──
65
+ const tally = new Map();
66
+ for (const sig of signals) {
67
+ tally.set(sig.type, (tally.get(sig.type) ?? 0) + sig.confidence);
68
+ }
69
+ const sortedVotes = [...tally.entries()].sort((a, b) => b[1] - a[1]);
70
+ const winner = sortedVotes[0];
71
+ const winningType = winner ? winner[0] : 'unknown';
72
+ const winningTotal = winner ? winner[1] : 0;
73
+ // Compute aggregate confidence: average over participating signals, weighted by agreement.
74
+ const winningSignals = signals.filter((s) => s.type === winningType);
75
+ const agreementShare = winningSignals.length / signals.length;
76
+ const meanConfidence = winningSignals.reduce((acc, s) => acc + s.confidence, 0) / Math.max(winningSignals.length, 1);
77
+ const ensembleConfidence = clamp01(meanConfidence * agreementShare + 0.05 * (winningTotal - meanConfidence));
78
+ const signalsAgreed = signals.every((s) => s.type === winningType);
79
+ const dissent = signals.filter((s) => s.type !== winningType).map((s) => ({ source: s.source, type: s.type }));
80
+ // ── Low-confidence + disagreement → 'unknown' with dissent ──
81
+ if (!signalsAgreed && llmClass.confidence < LLM_FALLBACK_CONFIDENCE) {
82
+ return finalize({
83
+ type: 'unknown',
84
+ base: llmClass,
85
+ signals,
86
+ ensembleConfidence: Math.min(ensembleConfidence, 0.5),
87
+ signalsAgreed: false,
88
+ dissent,
89
+ });
90
+ }
91
+ return finalize({
92
+ type: winningType,
93
+ base: llmClass,
94
+ signals,
95
+ ensembleConfidence,
96
+ signalsAgreed,
97
+ dissent: signalsAgreed ? undefined : dissent,
98
+ });
99
+ }
100
+ function finalize(args) {
101
+ const { type, base, signals, ensembleConfidence, signalsAgreed } = args;
102
+ const firstPrinciplesMode = !signalsAgreed || ensembleConfidence < 0.6;
103
+ const out = {
104
+ ...base,
105
+ type,
106
+ confidence: ensembleConfidence,
107
+ signals,
108
+ signalsAgreed,
109
+ ensembleConfidence,
110
+ firstPrinciplesMode,
111
+ };
112
+ if (args.dissent && args.dissent.length > 0)
113
+ out.dissent = args.dissent;
114
+ return out;
115
+ }
116
+ // ── URL-pattern classifier ──────────────────────────────────────────────────
117
+ export function classifyByUrl(url) {
118
+ let pathname;
119
+ try {
120
+ pathname = new URL(url).pathname || '/';
121
+ }
122
+ catch {
123
+ return null;
124
+ }
125
+ for (const rule of URL_PATTERN_RULES) {
126
+ if (rule.pattern.test(pathname)) {
127
+ return {
128
+ source: 'url-pattern',
129
+ type: rule.type,
130
+ confidence: rule.confidence,
131
+ rationale: `${rule.rationale} (${pathname})`,
132
+ };
133
+ }
134
+ }
135
+ return null;
136
+ }
137
+ // ── DOM-heuristic classifier ────────────────────────────────────────────────
138
+ export function classifyByDom(dom) {
139
+ // docs: lots of paragraphs + code blocks, modest nav
140
+ if (dom.codeBlockCount >= 3 && dom.paragraphCount >= 6) {
141
+ return signal('dom-heuristic', 'docs', 0.7, `code blocks=${dom.codeBlockCount}, paragraphs=${dom.paragraphCount}`);
142
+ }
143
+ // dashboard: many table rows or charts + sidebar
144
+ if ((dom.tableRowCount >= 8 || dom.chartCount >= 2) && dom.hasSidebar) {
145
+ return signal('dom-heuristic', 'dashboard', 0.7, `rows=${dom.tableRowCount}, charts=${dom.chartCount}, sidebar=true`);
146
+ }
147
+ // saas-app: sidebar + multiple forms or many inputs
148
+ if (dom.hasSidebar && (dom.formCount >= 1 || dom.inputCount >= 4)) {
149
+ return signal('dom-heuristic', 'saas-app', 0.65, `sidebar=true, forms=${dom.formCount}, inputs=${dom.inputCount}`);
150
+ }
151
+ // utility: single dominant form, no hero, no sidebar
152
+ if (dom.formCount >= 1 && dom.inputCount >= 2 && !dom.hasHeroSection && !dom.hasSidebar) {
153
+ return signal('dom-heuristic', 'utility', 0.7, `single form, no hero, no sidebar`);
154
+ }
155
+ // ecommerce: forms + many nav items + footer links (storefront chrome)
156
+ if (dom.formCount >= 1 && dom.navItems >= 6 && dom.hasFooterLinks) {
157
+ return signal('dom-heuristic', 'ecommerce', 0.6, `nav=${dom.navItems}, footer-links, form present`);
158
+ }
159
+ // blog: long body of paragraphs without forms or tables
160
+ if (dom.paragraphCount >= 8 && dom.formCount === 0 && dom.tableRowCount === 0) {
161
+ return signal('dom-heuristic', 'blog', 0.65, `paragraphs=${dom.paragraphCount}, no forms or tables`);
162
+ }
163
+ // marketing: hero + footer-link cloud + few paragraphs
164
+ if (dom.hasHeroSection && dom.hasFooterLinks && dom.paragraphCount < 8) {
165
+ return signal('dom-heuristic', 'marketing', 0.6, `hero present, footer-links, paragraphs=${dom.paragraphCount}`);
166
+ }
167
+ return null;
168
+ }
169
+ function signal(source, type, confidence, rationale) {
170
+ return { source, type, confidence, rationale };
171
+ }
172
+ // ── DOM heuristic derivation from snapshot ──────────────────────────────────
173
+ /**
174
+ * Best-effort DOM heuristic derivation from the accessibility-tree snapshot.
175
+ * Pipelines that capture true DOM heuristics via Playwright should pass them
176
+ * in directly; this fallback works against the @ref-snapshot text.
177
+ */
178
+ export function deriveHeuristics(state) {
179
+ const snapshot = state.snapshot ?? '';
180
+ return {
181
+ formCount: countMatches(snapshot, /\bform\b/gi),
182
+ inputCount: countMatches(snapshot, /\b(textbox|searchbox|combobox|spinbutton|input)\b/gi),
183
+ tableRowCount: countMatches(snapshot, /\brow\b/gi),
184
+ chartCount: countMatches(snapshot, /\b(graphics-document|graphics-symbol|figure)\b/gi),
185
+ navItems: countMatches(snapshot, /\bnavigation\b/gi),
186
+ hasFooterLinks: /\bcontentinfo\b/i.test(snapshot),
187
+ hasHeroSection: /\bhero\b/i.test(snapshot) || /\bbanner\b/i.test(snapshot),
188
+ hasSidebar: /\bcomplementary\b/i.test(snapshot) || /\bsidebar\b/i.test(snapshot),
189
+ paragraphCount: countMatches(snapshot, /\bparagraph\b/gi),
190
+ codeBlockCount: countMatches(snapshot, /\bcode\b/gi),
191
+ };
192
+ }
193
+ function countMatches(haystack, pattern) {
194
+ const m = haystack.match(pattern);
195
+ return m ? m.length : 0;
196
+ }
197
+ function clamp01(n) {
198
+ if (Number.isNaN(n))
199
+ return 0;
200
+ return Math.max(0, Math.min(1, n));
201
+ }
202
+ export const ENSEMBLE_INTERNALS = {
203
+ URL_PATTERN_RULES,
204
+ ENSEMBLE_AGREEMENT_THRESHOLD,
205
+ LLM_FALLBACK_CONFIDENCE,
206
+ };
207
+ //# sourceMappingURL=classify-ensemble.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify-ensemble.js","sourceRoot":"","sources":["../../../src/design/audit/classify-ensemble.ts"],"names":[],"mappings":"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"}