@tangle-network/browser-agent-driver 0.30.0 → 0.31.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 (235) hide show
  1. package/dist/cli-ack-patch.d.ts +39 -0
  2. package/dist/cli-ack-patch.d.ts.map +1 -0
  3. package/dist/cli-ack-patch.js +47 -0
  4. package/dist/cli-ack-patch.js.map +1 -0
  5. package/dist/cli-design-audit.d.ts +12 -0
  6. package/dist/cli-design-audit.d.ts.map +1 -1
  7. package/dist/cli-design-audit.js +88 -0
  8. package/dist/cli-design-audit.js.map +1 -1
  9. package/dist/cli-jobs.d.ts +13 -0
  10. package/dist/cli-jobs.d.ts.map +1 -0
  11. package/dist/cli-jobs.js +262 -0
  12. package/dist/cli-jobs.js.map +1 -0
  13. package/dist/cli-patterns.d.ts +26 -0
  14. package/dist/cli-patterns.d.ts.map +1 -0
  15. package/dist/cli-patterns.js +49 -0
  16. package/dist/cli-patterns.js.map +1 -0
  17. package/dist/cli-reports.d.ts +12 -0
  18. package/dist/cli-reports.d.ts.map +1 -0
  19. package/dist/cli-reports.js +97 -0
  20. package/dist/cli-reports.js.map +1 -0
  21. package/dist/cli.js +29 -1
  22. package/dist/cli.js.map +1 -1
  23. package/dist/design/audit/attribution/aggregate.d.ts +16 -0
  24. package/dist/design/audit/attribution/aggregate.d.ts.map +1 -0
  25. package/dist/design/audit/attribution/aggregate.js +81 -0
  26. package/dist/design/audit/attribution/aggregate.js.map +1 -0
  27. package/dist/design/audit/attribution/store.d.ts +36 -0
  28. package/dist/design/audit/attribution/store.d.ts.map +1 -0
  29. package/dist/design/audit/attribution/store.js +108 -0
  30. package/dist/design/audit/attribution/store.js.map +1 -0
  31. package/dist/design/audit/attribution/types.d.ts +13 -0
  32. package/dist/design/audit/attribution/types.d.ts.map +1 -0
  33. package/dist/design/audit/attribution/types.js +10 -0
  34. package/dist/design/audit/attribution/types.js.map +1 -0
  35. package/dist/design/audit/classify-ensemble.d.ts +46 -0
  36. package/dist/design/audit/classify-ensemble.d.ts.map +1 -0
  37. package/dist/design/audit/classify-ensemble.js +207 -0
  38. package/dist/design/audit/classify-ensemble.js.map +1 -0
  39. package/dist/design/audit/ethics/check.d.ts +59 -0
  40. package/dist/design/audit/ethics/check.d.ts.map +1 -0
  41. package/dist/design/audit/ethics/check.js +137 -0
  42. package/dist/design/audit/ethics/check.js.map +1 -0
  43. package/dist/design/audit/ethics/loader.d.ts +21 -0
  44. package/dist/design/audit/ethics/loader.d.ts.map +1 -0
  45. package/dist/design/audit/ethics/loader.js +207 -0
  46. package/dist/design/audit/ethics/loader.js.map +1 -0
  47. package/dist/design/audit/ethics/rules/finance.yaml +37 -0
  48. package/dist/design/audit/ethics/rules/kids.yaml +37 -0
  49. package/dist/design/audit/ethics/rules/legal.yaml +35 -0
  50. package/dist/design/audit/ethics/rules/medical.yaml +36 -0
  51. package/dist/design/audit/evaluate.d.ts.map +1 -1
  52. package/dist/design/audit/evaluate.js +4 -1
  53. package/dist/design/audit/evaluate.js.map +1 -1
  54. package/dist/design/audit/first-principles-mode.d.ts +42 -0
  55. package/dist/design/audit/first-principles-mode.d.ts.map +1 -0
  56. package/dist/design/audit/first-principles-mode.js +77 -0
  57. package/dist/design/audit/first-principles-mode.js.map +1 -0
  58. package/dist/design/audit/modality/android.d.ts +14 -0
  59. package/dist/design/audit/modality/android.d.ts.map +1 -0
  60. package/dist/design/audit/modality/android.js +18 -0
  61. package/dist/design/audit/modality/android.js.map +1 -0
  62. package/dist/design/audit/modality/html.d.ts +22 -0
  63. package/dist/design/audit/modality/html.d.ts.map +1 -0
  64. package/dist/design/audit/modality/html.js +51 -0
  65. package/dist/design/audit/modality/html.js.map +1 -0
  66. package/dist/design/audit/modality/index.d.ts +8 -0
  67. package/dist/design/audit/modality/index.d.ts.map +1 -0
  68. package/dist/design/audit/modality/index.js +15 -0
  69. package/dist/design/audit/modality/index.js.map +1 -0
  70. package/dist/design/audit/modality/ios.d.ts +16 -0
  71. package/dist/design/audit/modality/ios.d.ts.map +1 -0
  72. package/dist/design/audit/modality/ios.js +19 -0
  73. package/dist/design/audit/modality/ios.js.map +1 -0
  74. package/dist/design/audit/modality/types.d.ts +9 -0
  75. package/dist/design/audit/modality/types.d.ts.map +1 -0
  76. package/dist/design/audit/modality/types.js +9 -0
  77. package/dist/design/audit/modality/types.js.map +1 -0
  78. package/dist/design/audit/patches/index.d.ts +8 -0
  79. package/dist/design/audit/patches/index.d.ts.map +1 -0
  80. package/dist/design/audit/patches/index.js +5 -0
  81. package/dist/design/audit/patches/index.js.map +1 -0
  82. package/dist/design/audit/patches/parse.d.ts +29 -0
  83. package/dist/design/audit/patches/parse.d.ts.map +1 -0
  84. package/dist/design/audit/patches/parse.js +153 -0
  85. package/dist/design/audit/patches/parse.js.map +1 -0
  86. package/dist/design/audit/patches/render.d.ts +20 -0
  87. package/dist/design/audit/patches/render.d.ts.map +1 -0
  88. package/dist/design/audit/patches/render.js +55 -0
  89. package/dist/design/audit/patches/render.js.map +1 -0
  90. package/dist/design/audit/patches/severity-enforcement.d.ts +23 -0
  91. package/dist/design/audit/patches/severity-enforcement.d.ts.map +1 -0
  92. package/dist/design/audit/patches/severity-enforcement.js +42 -0
  93. package/dist/design/audit/patches/severity-enforcement.js.map +1 -0
  94. package/dist/design/audit/patches/validate.d.ts +34 -0
  95. package/dist/design/audit/patches/validate.d.ts.map +1 -0
  96. package/dist/design/audit/patches/validate.js +53 -0
  97. package/dist/design/audit/patches/validate.js.map +1 -0
  98. package/dist/design/audit/patterns/match.d.ts +24 -0
  99. package/dist/design/audit/patterns/match.d.ts.map +1 -0
  100. package/dist/design/audit/patterns/match.js +48 -0
  101. package/dist/design/audit/patterns/match.js.map +1 -0
  102. package/dist/design/audit/patterns/mine.d.ts +31 -0
  103. package/dist/design/audit/patterns/mine.d.ts.map +1 -0
  104. package/dist/design/audit/patterns/mine.js +35 -0
  105. package/dist/design/audit/patterns/mine.js.map +1 -0
  106. package/dist/design/audit/patterns/store.d.ts +14 -0
  107. package/dist/design/audit/patterns/store.d.ts.map +1 -0
  108. package/dist/design/audit/patterns/store.js +53 -0
  109. package/dist/design/audit/patterns/store.js.map +1 -0
  110. package/dist/design/audit/patterns/types.d.ts +53 -0
  111. package/dist/design/audit/patterns/types.d.ts.map +1 -0
  112. package/dist/design/audit/patterns/types.js +13 -0
  113. package/dist/design/audit/patterns/types.js.map +1 -0
  114. package/dist/design/audit/pipeline.d.ts +12 -0
  115. package/dist/design/audit/pipeline.d.ts.map +1 -1
  116. package/dist/design/audit/pipeline.js +65 -3
  117. package/dist/design/audit/pipeline.js.map +1 -1
  118. package/dist/design/audit/rubric/anchor-loader.d.ts +44 -0
  119. package/dist/design/audit/rubric/anchor-loader.d.ts.map +1 -0
  120. package/dist/design/audit/rubric/anchor-loader.js +210 -0
  121. package/dist/design/audit/rubric/anchor-loader.js.map +1 -0
  122. package/dist/design/audit/rubric/anchors/blog.yaml +33 -0
  123. package/dist/design/audit/rubric/anchors/dashboard.yaml +35 -0
  124. package/dist/design/audit/rubric/anchors/docs.yaml +35 -0
  125. package/dist/design/audit/rubric/anchors/ecommerce.yaml +33 -0
  126. package/dist/design/audit/rubric/anchors/marketing.yaml +34 -0
  127. package/dist/design/audit/rubric/anchors/saas-app.yaml +38 -0
  128. package/dist/design/audit/rubric/anchors/social.yaml +33 -0
  129. package/dist/design/audit/rubric/anchors/tool.yaml +33 -0
  130. package/dist/design/audit/rubric/anchors/utility.yaml +33 -0
  131. package/dist/design/audit/rubric/fragments/audience-clinician.md +42 -0
  132. package/dist/design/audit/rubric/fragments/audience-developer.md +40 -0
  133. package/dist/design/audit/rubric/fragments/audience-kids.md +35 -0
  134. package/dist/design/audit/rubric/fragments/audience-vulnerability-minor-facing.md +37 -0
  135. package/dist/design/audit/rubric/fragments/first-principles.md +65 -0
  136. package/dist/design/audit/rubric/fragments/modality-mobile.md +39 -0
  137. package/dist/design/audit/rubric/fragments/modality-tablet.md +35 -0
  138. package/dist/design/audit/rubric/fragments/regulatory-coppa.md +32 -0
  139. package/dist/design/audit/rubric/fragments/regulatory-gdpr.md +33 -0
  140. package/dist/design/audit/rubric/fragments/regulatory-hipaa.md +36 -0
  141. package/dist/design/audit/rubric/loader.d.ts +26 -6
  142. package/dist/design/audit/rubric/loader.d.ts.map +1 -1
  143. package/dist/design/audit/rubric/loader.js +45 -26
  144. package/dist/design/audit/rubric/loader.js.map +1 -1
  145. package/dist/design/audit/rubric/rollup-weights.d.ts +25 -0
  146. package/dist/design/audit/rubric/rollup-weights.d.ts.map +1 -0
  147. package/dist/design/audit/rubric/rollup-weights.js +51 -0
  148. package/dist/design/audit/rubric/rollup-weights.js.map +1 -0
  149. package/dist/design/audit/types.d.ts +28 -0
  150. package/dist/design/audit/types.d.ts.map +1 -1
  151. package/dist/design/audit/v2/build-result.d.ts +47 -0
  152. package/dist/design/audit/v2/build-result.d.ts.map +1 -0
  153. package/dist/design/audit/v2/build-result.js +163 -0
  154. package/dist/design/audit/v2/build-result.js.map +1 -0
  155. package/dist/design/audit/v2/score.d.ts +49 -0
  156. package/dist/design/audit/v2/score.d.ts.map +1 -0
  157. package/dist/design/audit/v2/score.js +211 -0
  158. package/dist/design/audit/v2/score.js.map +1 -0
  159. package/dist/design/audit/v2/types.d.ts +431 -0
  160. package/dist/design/audit/v2/types.d.ts.map +1 -0
  161. package/dist/design/audit/v2/types.js +26 -0
  162. package/dist/design/audit/v2/types.js.map +1 -0
  163. package/dist/discover/index.d.ts +16 -0
  164. package/dist/discover/index.d.ts.map +1 -0
  165. package/dist/discover/index.js +25 -0
  166. package/dist/discover/index.js.map +1 -0
  167. package/dist/discover/wayback.d.ts +49 -0
  168. package/dist/discover/wayback.d.ts.map +1 -0
  169. package/dist/discover/wayback.js +123 -0
  170. package/dist/discover/wayback.js.map +1 -0
  171. package/dist/jobs/anti-bot.d.ts +19 -0
  172. package/dist/jobs/anti-bot.d.ts.map +1 -0
  173. package/dist/jobs/anti-bot.js +64 -0
  174. package/dist/jobs/anti-bot.js.map +1 -0
  175. package/dist/jobs/cost-estimate.d.ts +12 -0
  176. package/dist/jobs/cost-estimate.d.ts.map +1 -0
  177. package/dist/jobs/cost-estimate.js +21 -0
  178. package/dist/jobs/cost-estimate.js.map +1 -0
  179. package/dist/jobs/cost-history.d.ts +19 -0
  180. package/dist/jobs/cost-history.d.ts.map +1 -0
  181. package/dist/jobs/cost-history.js +42 -0
  182. package/dist/jobs/cost-history.js.map +1 -0
  183. package/dist/jobs/index.d.ts +31 -0
  184. package/dist/jobs/index.d.ts.map +1 -0
  185. package/dist/jobs/index.js +37 -0
  186. package/dist/jobs/index.js.map +1 -0
  187. package/dist/jobs/orchestrator.d.ts +42 -0
  188. package/dist/jobs/orchestrator.d.ts.map +1 -0
  189. package/dist/jobs/orchestrator.js +282 -0
  190. package/dist/jobs/orchestrator.js.map +1 -0
  191. package/dist/jobs/queue.d.ts +45 -0
  192. package/dist/jobs/queue.d.ts.map +1 -0
  193. package/dist/jobs/queue.js +114 -0
  194. package/dist/jobs/queue.js.map +1 -0
  195. package/dist/jobs/retry.d.ts +36 -0
  196. package/dist/jobs/retry.d.ts.map +1 -0
  197. package/dist/jobs/retry.js +77 -0
  198. package/dist/jobs/retry.js.map +1 -0
  199. package/dist/jobs/store.d.ts +31 -0
  200. package/dist/jobs/store.d.ts.map +1 -0
  201. package/dist/jobs/store.js +92 -0
  202. package/dist/jobs/store.js.map +1 -0
  203. package/dist/jobs/types.d.ts +106 -0
  204. package/dist/jobs/types.d.ts.map +1 -0
  205. package/dist/jobs/types.js +13 -0
  206. package/dist/jobs/types.js.map +1 -0
  207. package/dist/reports/aggregate.d.ts +38 -0
  208. package/dist/reports/aggregate.d.ts.map +1 -0
  209. package/dist/reports/aggregate.js +145 -0
  210. package/dist/reports/aggregate.js.map +1 -0
  211. package/dist/reports/index.d.ts +21 -0
  212. package/dist/reports/index.d.ts.map +1 -0
  213. package/dist/reports/index.js +15 -0
  214. package/dist/reports/index.js.map +1 -0
  215. package/dist/reports/narrate.d.ts +19 -0
  216. package/dist/reports/narrate.d.ts.map +1 -0
  217. package/dist/reports/narrate.js +40 -0
  218. package/dist/reports/narrate.js.map +1 -0
  219. package/dist/reports/templates.d.ts +43 -0
  220. package/dist/reports/templates.d.ts.map +1 -0
  221. package/dist/reports/templates.js +200 -0
  222. package/dist/reports/templates.js.map +1 -0
  223. package/dist/reports/tokens.d.ts +77 -0
  224. package/dist/reports/tokens.d.ts.map +1 -0
  225. package/dist/reports/tokens.js +88 -0
  226. package/dist/reports/tokens.js.map +1 -0
  227. package/dist/reports/tools.d.ts +76 -0
  228. package/dist/reports/tools.d.ts.map +1 -0
  229. package/dist/reports/tools.js +205 -0
  230. package/dist/reports/tools.js.map +1 -0
  231. package/dist/reports/types.d.ts +51 -0
  232. package/dist/reports/types.d.ts.map +1 -0
  233. package/dist/reports/types.js +9 -0
  234. package/dist/reports/types.js.map +1 -0
  235. package/package.json +2 -1
@@ -0,0 +1,205 @@
1
+ /**
2
+ * AI SDK tool surface for the report agent.
3
+ *
4
+ * These tools let an LLM agent (browser-side chat, Claude Code, anywhere
5
+ * AI SDK runs) interrogate a job's audit results. The contract is strict:
6
+ * every numerical claim the agent makes must come from a tool result, never
7
+ * from its own arithmetic. Templates are deterministic; the agent narrates.
8
+ *
9
+ * The tools use plain JSONSchema (`jsonSchema` from `ai`) rather than zod so
10
+ * we don't add a dependency. Schemas are intentionally minimal — agents prefer
11
+ * concise tool surfaces.
12
+ */
13
+ import { tool, jsonSchema } from 'ai';
14
+ import * as fs from 'node:fs';
15
+ import { loadJob } from '../jobs/store.js';
16
+ import { aggregateJob, leaderboard, longitudinalFor, compareRuns, tierBuckets } from './aggregate.js';
17
+ import { aggregateTokens, diffTokens as diffTokensFn, groupByUrl } from './tokens.js';
18
+ import { renderLeaderboard, renderLongitudinal, renderBatchComparison, renderBrandEvolution } from './templates.js';
19
+ function rowsForJob(jobId, jobsDir) {
20
+ const job = loadJob(jobId, jobsDir);
21
+ if (!job)
22
+ throw new Error(`job not found: ${jobId}`);
23
+ return aggregateJob(job);
24
+ }
25
+ export function buildReportTools(ctx = {}) {
26
+ return {
27
+ queryJob: tool({
28
+ description: 'Return aggregated rows for every audited target in a job (filtered/ranked). Use this for any leaderboard, ranking, or scope query.',
29
+ inputSchema: jsonSchema({
30
+ type: 'object',
31
+ properties: {
32
+ jobId: { type: 'string' },
33
+ byType: { type: 'string', description: 'Filter to one page-type (saas-app, marketing, dashboard, ecommerce, ...).' },
34
+ topN: { type: 'integer', minimum: 1 },
35
+ direction: { type: 'string', enum: ['asc', 'desc'], description: 'Default desc (highest scores first).' },
36
+ },
37
+ required: ['jobId'],
38
+ }),
39
+ execute: async ({ jobId, byType, topN, direction }) => {
40
+ const rows = rowsForJob(jobId, ctx.jobsDir);
41
+ return leaderboard(rows, { byType, topN, direction });
42
+ },
43
+ }),
44
+ fetchAudit: tool({
45
+ description: 'Fetch the full report.json for a single audit run by runId. Use sparingly — only when the agent needs finding-level detail beyond aggregated scores.',
46
+ inputSchema: jsonSchema({
47
+ type: 'object',
48
+ properties: {
49
+ jobId: { type: 'string' },
50
+ runId: { type: 'string' },
51
+ },
52
+ required: ['jobId', 'runId'],
53
+ }),
54
+ execute: async ({ jobId, runId }) => {
55
+ const job = loadJob(jobId, ctx.jobsDir);
56
+ if (!job)
57
+ throw new Error(`job not found: ${jobId}`);
58
+ const entry = job.results.find(r => r.runId === runId);
59
+ if (!entry || !entry.resultPath || !fs.existsSync(entry.resultPath)) {
60
+ throw new Error(`runId not found or report.json missing: ${runId}`);
61
+ }
62
+ return JSON.parse(fs.readFileSync(entry.resultPath, 'utf-8'));
63
+ },
64
+ }),
65
+ compareRuns: tool({
66
+ description: 'Compute a deterministic dimension-by-dimension diff between two audited runs in the same job. Returns rollupDelta and per-dimension deltas.',
67
+ inputSchema: jsonSchema({
68
+ type: 'object',
69
+ properties: {
70
+ jobId: { type: 'string' },
71
+ runIdA: { type: 'string' },
72
+ runIdB: { type: 'string' },
73
+ },
74
+ required: ['jobId', 'runIdA', 'runIdB'],
75
+ }),
76
+ execute: async ({ jobId, runIdA, runIdB }) => {
77
+ const rows = rowsForJob(jobId, ctx.jobsDir);
78
+ const a = rows.find(r => r.runId === runIdA);
79
+ const b = rows.find(r => r.runId === runIdB);
80
+ if (!a || !b)
81
+ throw new Error(`runId not found in job: ${!a ? runIdA : runIdB}`);
82
+ return compareRuns(a, b);
83
+ },
84
+ }),
85
+ longitudinal: tool({
86
+ description: 'For wayback-expanded jobs, return the time series of scores for one URL (sorted oldest → newest). Use this for "how has X evolved" questions.',
87
+ inputSchema: jsonSchema({
88
+ type: 'object',
89
+ properties: {
90
+ jobId: { type: 'string' },
91
+ url: { type: 'string' },
92
+ },
93
+ required: ['jobId', 'url'],
94
+ }),
95
+ execute: async ({ jobId, url }) => {
96
+ const rows = rowsForJob(jobId, ctx.jobsDir);
97
+ return longitudinalFor(rows, url);
98
+ },
99
+ }),
100
+ tierBuckets: tool({
101
+ description: 'Bucket a job\'s ranked results into tier slices (e.g. boundaries [10, 100, 200] → top 10 / 11–100 / 101–200 / 201+).',
102
+ inputSchema: jsonSchema({
103
+ type: 'object',
104
+ properties: {
105
+ jobId: { type: 'string' },
106
+ boundaries: { type: 'array', items: { type: 'integer', minimum: 1 } },
107
+ },
108
+ required: ['jobId', 'boundaries'],
109
+ }),
110
+ execute: async ({ jobId, boundaries }) => {
111
+ const rows = rowsForJob(jobId, ctx.jobsDir);
112
+ return tierBuckets(rows, boundaries);
113
+ },
114
+ }),
115
+ renderTemplate: tool({
116
+ description: 'Render a deterministic markdown report from a job. Use this when the user wants a shareable artifact, not a free-form answer.',
117
+ inputSchema: jsonSchema({
118
+ type: 'object',
119
+ properties: {
120
+ jobId: { type: 'string' },
121
+ template: { type: 'string', enum: ['leaderboard', 'longitudinal', 'batch-comparison', 'brand-evolution'] },
122
+ title: { type: 'string' },
123
+ topN: { type: 'integer', minimum: 1 },
124
+ byType: { type: 'string' },
125
+ buckets: { type: 'array', items: { type: 'integer', minimum: 1 } },
126
+ },
127
+ required: ['jobId', 'template'],
128
+ }),
129
+ execute: async ({ jobId, template, title, topN, byType, buckets }) => {
130
+ if (template === 'brand-evolution') {
131
+ const job = loadJob(jobId, ctx.jobsDir);
132
+ if (!job)
133
+ throw new Error(`job not found: ${jobId}`);
134
+ return { markdown: renderBrandEvolution(job, { title }) };
135
+ }
136
+ const rows = rowsForJob(jobId, ctx.jobsDir);
137
+ if (template === 'leaderboard')
138
+ return { markdown: renderLeaderboard(rows, { title, topN, byType, buckets }) };
139
+ if (template === 'longitudinal')
140
+ return { markdown: renderLongitudinal(rows, { title }) };
141
+ return { markdown: renderBatchComparison(rows, { title }) };
142
+ },
143
+ }),
144
+ fetchTokens: tool({
145
+ description: 'Return aggregated brand-kit token summaries (colors, fonts, libraries, brand metadata) for every audited target that had token extraction enabled. Use for "what colors does X use" or "how has the design system evolved" questions.',
146
+ inputSchema: jsonSchema({
147
+ type: 'object',
148
+ properties: {
149
+ jobId: { type: 'string' },
150
+ url: { type: 'string', description: 'Filter to one URL (returns the chronological series).' },
151
+ },
152
+ required: ['jobId'],
153
+ }),
154
+ execute: async ({ jobId, url }) => {
155
+ const job = loadJob(jobId, ctx.jobsDir);
156
+ if (!job)
157
+ throw new Error(`job not found: ${jobId}`);
158
+ const summaries = aggregateTokens(job);
159
+ if (url) {
160
+ const series = groupByUrl(summaries).find(s => s.url === url);
161
+ return series ? series.snapshots : [];
162
+ }
163
+ return summaries;
164
+ },
165
+ }),
166
+ diffTokens: tool({
167
+ description: 'Compute the token delta (colors added/removed, font families added/removed, brand-meta changes, library swaps) between two audited targets in the same job.',
168
+ inputSchema: jsonSchema({
169
+ type: 'object',
170
+ properties: {
171
+ jobId: { type: 'string' },
172
+ runIdA: { type: 'string' },
173
+ runIdB: { type: 'string' },
174
+ },
175
+ required: ['jobId', 'runIdA', 'runIdB'],
176
+ }),
177
+ execute: async ({ jobId, runIdA, runIdB }) => {
178
+ const job = loadJob(jobId, ctx.jobsDir);
179
+ if (!job)
180
+ throw new Error(`job not found: ${jobId}`);
181
+ const summaries = aggregateTokens(job);
182
+ const a = summaries.find(s => s.runId === runIdA);
183
+ const b = summaries.find(s => s.runId === runIdB);
184
+ if (!a || !b)
185
+ throw new Error(`token summary not found for ${!a ? runIdA : runIdB} — was extractTokens enabled?`);
186
+ return diffTokensFn(a, b);
187
+ },
188
+ }),
189
+ runFreshAudit: tool({
190
+ description: 'Kick off a NEW single-page audit when the agent needs current data not in the job. Cost-bearing. Use sparingly.',
191
+ inputSchema: jsonSchema({
192
+ type: 'object',
193
+ properties: { url: { type: 'string' } },
194
+ required: ['url'],
195
+ }),
196
+ execute: async ({ url }) => {
197
+ if (!ctx.runFreshAudit) {
198
+ throw new Error('runFreshAudit not wired in this context — host must inject a resolver');
199
+ }
200
+ return await ctx.runFreshAudit(url);
201
+ },
202
+ }),
203
+ };
204
+ }
205
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/reports/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Report shapes — flat rows that templates and tool calls share.
3
+ *
4
+ * `AggregateRow` is intentionally narrow (just the fields a leaderboard /
5
+ * comparison / longitudinal view needs). Anything richer should be loaded
6
+ * from `resultPath` on demand via `fetchAudit`.
7
+ */
8
+ import type { Dimension } from '../design/audit/v2/types.js';
9
+ export interface AggregateRow {
10
+ /** Seed URL (groups multiple snapshots of the same site together). */
11
+ url: string;
12
+ /** Snapshot URL (only set for wayback rows). */
13
+ snapshotUrl?: string;
14
+ /** ISO datetime of capture (only set for wayback rows). */
15
+ capturedAt?: string;
16
+ /** runId of the source audit. */
17
+ runId: string;
18
+ /** Page-type classification from the audit. */
19
+ pageType?: string;
20
+ /** Domain tag (e.g. "fintech", "health") from classification. */
21
+ domain?: string;
22
+ /** Rollup score (0-10). */
23
+ rollupScore: number;
24
+ /** Per-dimension scores (subset — only the v2 universal dimensions). */
25
+ dimensions: Partial<Record<Dimension, number>>;
26
+ /** Number of ethics violations detected. */
27
+ ethicsViolations: number;
28
+ /** Path to the per-run report.json for drill-down. */
29
+ resultPath?: string;
30
+ }
31
+ export interface DimensionDelta {
32
+ dim: Dimension;
33
+ beforeScore: number;
34
+ afterScore: number;
35
+ delta: number;
36
+ }
37
+ export interface CompareRunsResult {
38
+ a: AggregateRow;
39
+ b: AggregateRow;
40
+ rollupDelta: number;
41
+ /** Negative = a worse than b, positive = a better. */
42
+ perDimension: DimensionDelta[];
43
+ }
44
+ export interface LongitudinalRow {
45
+ url: string;
46
+ capturedAt: string;
47
+ rollupScore: number;
48
+ pageType?: string;
49
+ }
50
+ export type ReportTemplate = 'leaderboard' | 'longitudinal' | 'batch-comparison' | 'brand-evolution';
51
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/reports/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAE5D,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAA;IACX,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,wEAAwE;IACxE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;IAC9C,4CAA4C;IAC5C,gBAAgB,EAAE,MAAM,CAAA;IACxB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,SAAS,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,CAAC,EAAE,YAAY,CAAA;IACf,CAAC,EAAE,YAAY,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,sDAAsD;IACtD,YAAY,EAAE,cAAc,EAAE,CAAA;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,cAAc,GAAG,kBAAkB,GAAG,iBAAiB,CAAA"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Report shapes — flat rows that templates and tool calls share.
3
+ *
4
+ * `AggregateRow` is intentionally narrow (just the fields a leaderboard /
5
+ * comparison / longitudinal view needs). Anything richer should be loaded
6
+ * from `resultPath` on demand via `fetchAudit`.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/reports/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/browser-agent-driver",
3
- "version": "0.30.0",
3
+ "version": "0.31.0",
4
4
  "description": "LLM-driven browser agent for UI automation, testing, and evaluation",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -133,6 +133,7 @@
133
133
  "pixelmatch": "^7.1.0",
134
134
  "playwright": "^1.40.0",
135
135
  "pngjs": "^7.0.0",
136
+ "tsx": "^4.21.0",
136
137
  "typescript": "^5.3.0",
137
138
  "vitest": "^4.0.18"
138
139
  }