@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,74 @@
1
+ /**
2
+ * Brand-kit / design-token aggregation across a job's targets.
3
+ *
4
+ * Reads each per-target `tokens.json` (produced when AuditOptions.extractTokens
5
+ * was true) and projects to a flat row shape so longitudinal evolution and
6
+ * batch comparison templates can render without re-implementing extraction.
7
+ *
8
+ * No LLM. Pure function of on-disk data — same contract as aggregate.ts.
9
+ */
10
+ import * as fs from 'node:fs';
11
+ /** Read each ok result's tokens.json and project to TokenSummary. */
12
+ export function aggregateTokens(job) {
13
+ const out = [];
14
+ for (const r of job.results) {
15
+ if (r.status !== 'ok' || !r.tokensPath || !fs.existsSync(r.tokensPath))
16
+ continue;
17
+ try {
18
+ const tokens = JSON.parse(fs.readFileSync(r.tokensPath, 'utf-8'));
19
+ out.push({
20
+ url: r.url,
21
+ snapshotUrl: r.snapshotUrl,
22
+ capturedAt: r.capturedAt,
23
+ runId: r.runId ?? '',
24
+ tokensPath: r.tokensPath,
25
+ brand: tokens.brand ?? {},
26
+ colors: (tokens.colors ?? []).slice().sort((a, b) => (b.count ?? 0) - (a.count ?? 0)),
27
+ fontFamilies: tokens.typography?.families ?? [],
28
+ typeScaleEntries: tokens.typography?.scale?.length ?? 0,
29
+ logos: (tokens.logos ?? []).map(l => l.src ?? '').filter(Boolean),
30
+ fontFiles: (tokens.fontFiles ?? []).map(f => f.src).filter(Boolean),
31
+ detectedLibraries: tokens.detectedLibraries ?? [],
32
+ });
33
+ }
34
+ catch {
35
+ // Skip corrupted token files.
36
+ }
37
+ }
38
+ return out;
39
+ }
40
+ export function diffTokens(a, b) {
41
+ const aHex = new Set(a.colors.map(c => c.hex.toLowerCase()));
42
+ const bHex = new Set(b.colors.map(c => c.hex.toLowerCase()));
43
+ const colorsAdded = [...bHex].filter(h => !aHex.has(h));
44
+ const colorsRemoved = [...aHex].filter(h => !bHex.has(h));
45
+ const colorsCommon = [...aHex].filter(h => bHex.has(h)).length;
46
+ const aFam = new Set(a.fontFamilies.map(f => f.family));
47
+ const bFam = new Set(b.fontFamilies.map(f => f.family));
48
+ const familiesAdded = [...bFam].filter(f => !aFam.has(f));
49
+ const familiesRemoved = [...aFam].filter(f => !bFam.has(f));
50
+ const brandFields = ['title', 'description', 'themeColor', 'favicon', 'ogImage'];
51
+ const brandChanges = brandFields
52
+ .filter(f => (a.brand?.[f] ?? '') !== (b.brand?.[f] ?? ''))
53
+ .map(f => ({ field: f, before: a.brand?.[f], after: b.brand?.[f] }));
54
+ const aLib = new Set(a.detectedLibraries);
55
+ const bLib = new Set(b.detectedLibraries);
56
+ const librariesAdded = [...bLib].filter(l => !aLib.has(l));
57
+ const librariesRemoved = [...aLib].filter(l => !bLib.has(l));
58
+ return { colorsAdded, colorsRemoved, colorsCommon, familiesAdded, familiesRemoved, brandChanges, librariesAdded, librariesRemoved };
59
+ }
60
+ export function groupByUrl(summaries) {
61
+ const map = new Map();
62
+ for (const s of summaries) {
63
+ if (!map.has(s.url))
64
+ map.set(s.url, []);
65
+ map.get(s.url).push(s);
66
+ }
67
+ const out = [];
68
+ for (const [url, snapshots] of map.entries()) {
69
+ snapshots.sort((a, b) => (a.capturedAt ?? '').localeCompare(b.capturedAt ?? ''));
70
+ out.push({ url, snapshots });
71
+ }
72
+ return out;
73
+ }
74
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/reports/tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
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 type { AggregateRow } from './types.js';
14
+ export interface ReportToolsContext {
15
+ /** Override jobs dir (tests). */
16
+ jobsDir?: string;
17
+ /** Override the resolver for `runFreshAudit` so tests/CLIs can plug in their own pipeline. */
18
+ runFreshAudit?: (url: string) => Promise<{
19
+ runId: string;
20
+ resultPath: string;
21
+ rollupScore?: number;
22
+ }>;
23
+ }
24
+ export declare function buildReportTools(ctx?: ReportToolsContext): {
25
+ readonly queryJob: import("ai").Tool<{
26
+ jobId: string;
27
+ byType?: string;
28
+ topN?: number;
29
+ direction?: "asc" | "desc";
30
+ }, AggregateRow[]>;
31
+ readonly fetchAudit: import("ai").Tool<{
32
+ jobId: string;
33
+ runId: string;
34
+ }, any>;
35
+ readonly compareRuns: import("ai").Tool<{
36
+ jobId: string;
37
+ runIdA: string;
38
+ runIdB: string;
39
+ }, import("./types.js").CompareRunsResult>;
40
+ readonly longitudinal: import("ai").Tool<{
41
+ jobId: string;
42
+ url: string;
43
+ }, import("./types.js").LongitudinalRow[]>;
44
+ readonly tierBuckets: import("ai").Tool<{
45
+ jobId: string;
46
+ boundaries: number[];
47
+ }, import("./aggregate.js").TierBucket[]>;
48
+ readonly renderTemplate: import("ai").Tool<{
49
+ jobId: string;
50
+ template: "leaderboard" | "longitudinal" | "batch-comparison" | "brand-evolution";
51
+ title?: string;
52
+ topN?: number;
53
+ byType?: string;
54
+ buckets?: number[];
55
+ }, {
56
+ markdown: string;
57
+ }>;
58
+ readonly fetchTokens: import("ai").Tool<{
59
+ jobId: string;
60
+ url?: string;
61
+ }, import("./tokens.js").TokenSummary[]>;
62
+ readonly diffTokens: import("ai").Tool<{
63
+ jobId: string;
64
+ runIdA: string;
65
+ runIdB: string;
66
+ }, import("./tokens.js").TokenDiff>;
67
+ readonly runFreshAudit: import("ai").Tool<{
68
+ url: string;
69
+ }, {
70
+ runId: string;
71
+ resultPath: string;
72
+ rollupScore?: number;
73
+ }>;
74
+ };
75
+ export type ReportToolSet = ReturnType<typeof buildReportTools>;
76
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/reports/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,MAAM,WAAW,kBAAkB;IACjC,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8FAA8F;IAC9F,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACtG;AAQD,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,kBAAuB;;eAItB,MAAM;iBAAW,MAAM;eAAS,MAAM;oBAAc,KAAK,GAAG,MAAM;;;eAkBlE,MAAM;eAAS,MAAM;;;eAqBrB,MAAM;gBAAU,MAAM;gBAAU,MAAM;;;eAoBtC,MAAM;aAAO,MAAM;;;eAgBnB,MAAM;oBAAc,MAAM,EAAE;;;eAiBpD,MAAM;kBACH,aAAa,GAAG,cAAc,GAAG,kBAAkB,GAAG,iBAAiB;gBACzE,MAAM;eACP,MAAM;iBACJ,MAAM;kBACL,MAAM,EAAE;;;;;eA4Ba,MAAM;cAAQ,MAAM;;;eAsBpB,MAAM;gBAAU,MAAM;gBAAU,MAAM;;;aAsBxC,MAAM;;eAtLS,MAAM;oBAAc,MAAM;sBAAgB,MAAM;;EAmMnG;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAA"}
@@ -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/score-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 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,gCAAgC,CAAA;AAE/D,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,qEAAqE;IACrE,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"}
@@ -19,7 +19,24 @@
19
19
  * Override per-case via Scenario.tokenBudget or globally via the
20
20
  * BAD_TOKEN_BUDGET env var.
21
21
  */
22
- export declare const DEFAULT_TOKEN_BUDGET = 100000;
22
+ /**
23
+ * Default token budget per case. The cap aborts a run with `cost_cap_exceeded`
24
+ * once total LLM tokens (input + output + cache) exceed this number.
25
+ *
26
+ * History:
27
+ * - Gen 9: 100k cap added to bound runaway recovery loops (after Gen 8.1
28
+ * burned 130-173k tokens / $0.25-$0.32 per case in death-spiral runs).
29
+ * - 2026-04-27: bumped 100k → 300k. The Gen 11-era 100k cap was set when
30
+ * the brain default was a smaller model (gpt-5.2 family). gpt-5.4 is
31
+ * materially more verbose per turn — the production-shipping cap was
32
+ * dominating the failure mode (10/12 WebVoyager curated-30 misses were
33
+ * `cost_cap_exceeded` at the 100k cap). Bumping to 300k took curated-30
34
+ * pass rate from 60.0% → 86.7% with zero cost_cap aborts.
35
+ *
36
+ * Override per-case via Scenario.tokenBudget or globally via the
37
+ * BAD_TOKEN_BUDGET env var (env wins — see RunState constructor).
38
+ */
39
+ export declare const DEFAULT_TOKEN_BUDGET = 300000;
23
40
  export declare class RunState {
24
41
  consecutiveErrors: number;
25
42
  totalErrors: number;
@@ -35,6 +52,24 @@ export declare class RunState {
35
52
  url: string;
36
53
  turn: number;
37
54
  }>;
55
+ /**
56
+ * Last turn at which the agent showed verifiable progress: URL changed,
57
+ * snapshot DOM materially changed, or evidence was extracted. Drives the
58
+ * 2026-04-28 adaptive-max-turns extension — the runner grants up to 5
59
+ * extra turns past the configured maxTurns IF the last 3 turns showed
60
+ * progress, on the theory that an agent making demonstrable progress
61
+ * 3 turns from the cap should not be cut off arbitrarily.
62
+ *
63
+ * Initial value `-Infinity` so a brand-new run with zero observations
64
+ * cannot trigger the extension on its way in.
65
+ *
66
+ * Updated by:
67
+ * - URL change between consecutive observe-completed events
68
+ * - Snapshot byte delta > 5% of prior turn (filters noise from
69
+ * decorative animations / dynamic IDs / timestamps)
70
+ * - firstSufficientEvidenceTurn being set this turn
71
+ */
72
+ lastProgressTurn: number;
38
73
  readonly maxTotalErrors: number;
39
74
  /** Total LLM tokens (input + output + cache) charged to this case so far. */
40
75
  totalTokensUsed: number;
@@ -1 +1 @@
1
- {"version":3,"file":"run-state.d.ts","sourceRoot":"","sources":["../src/run-state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,oBAAoB,SAAU,CAAC;AAE5C,qBAAa,QAAQ;IACnB,iBAAiB,SAAK;IACtB,WAAW,SAAK;IAChB,0BAA0B,SAAK;IAC/B,2BAA2B,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD,uBAAuB,SAAK;IAC5B,kBAAkB,SAAa;IAC/B,wBAAwB,EAAE,MAAM,EAAE,CAAM;IACxC,4DAA4D;IAC5D,iBAAiB,EAAE,MAAM,EAAE,CAAM;IACjC,eAAe,cAAqB;IAGpC,WAAW,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAM;IAEvD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,6EAA6E;IAC7E,eAAe,SAAK;IACpB,wFAAwF;IACxF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAEjB,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IAgBlD,WAAW,IAAI,IAAI;IAKnB,sBAAsB,IAAI,IAAI;IAI9B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAM9C,IAAI,sBAAsB,IAAI,OAAO,CAEpC;IAED,IAAI,4BAA4B,IAAI,OAAO,CAE1C;IAED,IAAI,sBAAsB,IAAI,OAAO,CAEpC;IAED,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;CAKvC"}
1
+ {"version":3,"file":"run-state.d.ts","sourceRoot":"","sources":["../src/run-state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;;;;;GAeG;AACH;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,oBAAoB,SAAU,CAAC;AAE5C,qBAAa,QAAQ;IACnB,iBAAiB,SAAK;IACtB,WAAW,SAAK;IAChB,0BAA0B,SAAK;IAC/B,2BAA2B,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD,uBAAuB,SAAK;IAC5B,kBAAkB,SAAa;IAC/B,wBAAwB,EAAE,MAAM,EAAE,CAAM;IACxC,4DAA4D;IAC5D,iBAAiB,EAAE,MAAM,EAAE,CAAM;IACjC,eAAe,cAAqB;IAGpC,WAAW,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAM;IAEvD;;;;;;;;;;;;;;;;OAgBG;IACH,gBAAgB,SAAa;IAE7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,6EAA6E;IAC7E,eAAe,SAAK;IACpB,wFAAwF;IACxF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAEjB,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IAgBlD,WAAW,IAAI,IAAI;IAKnB,sBAAsB,IAAI,IAAI;IAI9B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAM9C,IAAI,sBAAsB,IAAI,OAAO,CAEpC;IAED,IAAI,4BAA4B,IAAI,OAAO,CAE1C;IAED,IAAI,sBAAsB,IAAI,OAAO,CAEpC;IAED,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;CAKvC"}
package/dist/run-state.js CHANGED
@@ -19,7 +19,24 @@
19
19
  * Override per-case via Scenario.tokenBudget or globally via the
20
20
  * BAD_TOKEN_BUDGET env var.
21
21
  */
22
- export const DEFAULT_TOKEN_BUDGET = 100_000;
22
+ /**
23
+ * Default token budget per case. The cap aborts a run with `cost_cap_exceeded`
24
+ * once total LLM tokens (input + output + cache) exceed this number.
25
+ *
26
+ * History:
27
+ * - Gen 9: 100k cap added to bound runaway recovery loops (after Gen 8.1
28
+ * burned 130-173k tokens / $0.25-$0.32 per case in death-spiral runs).
29
+ * - 2026-04-27: bumped 100k → 300k. The Gen 11-era 100k cap was set when
30
+ * the brain default was a smaller model (gpt-5.2 family). gpt-5.4 is
31
+ * materially more verbose per turn — the production-shipping cap was
32
+ * dominating the failure mode (10/12 WebVoyager curated-30 misses were
33
+ * `cost_cap_exceeded` at the 100k cap). Bumping to 300k took curated-30
34
+ * pass rate from 60.0% → 86.7% with zero cost_cap aborts.
35
+ *
36
+ * Override per-case via Scenario.tokenBudget or globally via the
37
+ * BAD_TOKEN_BUDGET env var (env wins — see RunState constructor).
38
+ */
39
+ export const DEFAULT_TOKEN_BUDGET = 300_000;
23
40
  export class RunState {
24
41
  consecutiveErrors = 0;
25
42
  totalErrors = 0;
@@ -33,6 +50,24 @@ export class RunState {
33
50
  searchScoutUrls = new Set();
34
51
  // Gen 24b: checkpoint replay — save known-good URLs for rollback on wrong-path
35
52
  checkpoints = [];
53
+ /**
54
+ * Last turn at which the agent showed verifiable progress: URL changed,
55
+ * snapshot DOM materially changed, or evidence was extracted. Drives the
56
+ * 2026-04-28 adaptive-max-turns extension — the runner grants up to 5
57
+ * extra turns past the configured maxTurns IF the last 3 turns showed
58
+ * progress, on the theory that an agent making demonstrable progress
59
+ * 3 turns from the cap should not be cut off arbitrarily.
60
+ *
61
+ * Initial value `-Infinity` so a brand-new run with zero observations
62
+ * cannot trigger the extension on its way in.
63
+ *
64
+ * Updated by:
65
+ * - URL change between consecutive observe-completed events
66
+ * - Snapshot byte delta > 5% of prior turn (filters noise from
67
+ * decorative animations / dynamic IDs / timestamps)
68
+ * - firstSufficientEvidenceTurn being set this turn
69
+ */
70
+ lastProgressTurn = -Infinity;
36
71
  maxTotalErrors;
37
72
  /** Total LLM tokens (input + output + cache) charged to this case so far. */
38
73
  totalTokensUsed = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"run-state.js","sourceRoot":"","sources":["../src/run-state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAE5C,MAAM,OAAO,QAAQ;IACnB,iBAAiB,GAAG,CAAC,CAAC;IACtB,WAAW,GAAG,CAAC,CAAC;IAChB,0BAA0B,GAAG,CAAC,CAAC;IAC/B,2BAA2B,CAAqB;IAChD,uBAAuB,GAAG,CAAC,CAAC;IAC5B,kBAAkB,GAAG,CAAC,QAAQ,CAAC;IAC/B,wBAAwB,GAAa,EAAE,CAAC;IACxC,4DAA4D;IAC5D,iBAAiB,GAAa,EAAE,CAAC;IACjC,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,+EAA+E;IAC/E,WAAW,GAAyC,EAAE,CAAC;IAE9C,cAAc,CAAS;IAEhC,6EAA6E;IAC7E,eAAe,GAAG,CAAC,CAAC;IACpB,wFAAwF;IAC/E,WAAW,CAAS;IAE7B,YAAY,QAAgB,EAAE,WAAoB;QAChD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3D,kEAAkE;QAClE,qEAAqE;QACrE,gEAAgE;QAChE,sEAAsE;QACtE,gEAAgE;QAChE,kEAAkE;QAClE,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,oBAAoB,CAAC;QACzD,CAAC;IACH,CAAC;IAED,WAAW;QACT,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,sBAAsB;QACpB,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,YAAY,CAAC,MAA0B;QACrC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACxE,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC;QACjC,CAAC;IACH,CAAC;IAED,IAAI,sBAAsB;QACxB,OAAO,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,cAAc,CAAC;IACjD,CAAC;IAED,IAAI,4BAA4B;QAC9B,OAAO,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,sBAAsB;QACxB,OAAO,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,WAAW,CAAC;IAClD,CAAC;IAED,cAAc,CAAC,QAAgB;QAC7B,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC3E,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"run-state.js","sourceRoot":"","sources":["../src/run-state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;;;;;GAeG;AACH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAE5C,MAAM,OAAO,QAAQ;IACnB,iBAAiB,GAAG,CAAC,CAAC;IACtB,WAAW,GAAG,CAAC,CAAC;IAChB,0BAA0B,GAAG,CAAC,CAAC;IAC/B,2BAA2B,CAAqB;IAChD,uBAAuB,GAAG,CAAC,CAAC;IAC5B,kBAAkB,GAAG,CAAC,QAAQ,CAAC;IAC/B,wBAAwB,GAAa,EAAE,CAAC;IACxC,4DAA4D;IAC5D,iBAAiB,GAAa,EAAE,CAAC;IACjC,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,+EAA+E;IAC/E,WAAW,GAAyC,EAAE,CAAC;IAEvD;;;;;;;;;;;;;;;;OAgBG;IACH,gBAAgB,GAAG,CAAC,QAAQ,CAAC;IAEpB,cAAc,CAAS;IAEhC,6EAA6E;IAC7E,eAAe,GAAG,CAAC,CAAC;IACpB,wFAAwF;IAC/E,WAAW,CAAS;IAE7B,YAAY,QAAgB,EAAE,WAAoB;QAChD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3D,kEAAkE;QAClE,qEAAqE;QACrE,gEAAgE;QAChE,sEAAsE;QACtE,gEAAgE;QAChE,kEAAkE;QAClE,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,oBAAoB,CAAC;QACzD,CAAC;IACH,CAAC;IAED,WAAW;QACT,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,sBAAsB;QACpB,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,YAAY,CAAC,MAA0B;QACrC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACxE,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC;QACjC,CAAC;IACH,CAAC;IAED,IAAI,sBAAsB;QACxB,OAAO,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,cAAc,CAAC;IACjD,CAAC;IAED,IAAI,4BAA4B;QAC9B,OAAO,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,sBAAsB;QACxB,OAAO,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,WAAW,CAAC;IAClD,CAAC;IAED,cAAc,CAAC,QAAgB;QAC7B,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC3E,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/runner/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAkC,MAAM,aAAa,CAAC;AAKvH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAuB/D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAa,MAAM,aAAa,CAAC;AAStD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAiDzF;AA4CD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAC9B;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,wDAAwD;IACxD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACnG,wDAAwD;IACxD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sEAAsE;IACtE,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,sDAAsD;IACtD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAgB3D;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CA2BtF;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAuB;IACtC,OAAO,CAAC,UAAU,CAAC,CAAkC;IACrD,OAAO,CAAC,aAAa,CAAC,CAAqF;IAC3G,OAAO,CAAC,mBAAmB,CAAC,CAAS;IACrC,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,SAAS,CAAC,CAAe;IACjC,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,GAAG,CAAe;IAC1B,OAAO,CAAC,YAAY,CAAM;IAK1B,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,UAAU,CAAC,CAAqB;IACxC,0EAA0E;IAC1E,OAAO,CAAC,gBAAgB,CAAC,CAAS;gBAEtB,OAAO,EAAE,mBAAmB;IA8BlC,GAAG,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC;IA4hEnD,OAAO,CAAC,qBAAqB;IA2B7B,qEAAqE;IACrE,OAAO,CAAC,UAAU;IAkClB;;;;;;;;;;;;OAYG;IACH;;;;;;;;;;;;;;;;;;;OAmBG;YACW,WAAW;YAofX,YAAY;YAkCZ,+BAA+B;YAgE/B,mCAAmC;YAwCnC,6BAA6B;YA4C7B,qCAAqC;YAqBrC,4BAA4B;YA4B5B,4BAA4B;YAkC5B,wBAAwB;CASvC;AAED,2BAA2B;AAC3B,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAC,GAC5C,OAAO,CAAC,WAAW,CAAC,CAGtB"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/runner/runner.ts"],"names":[],"mappings":"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"}