@tangle-network/browser-agent-driver 0.29.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.
- package/dist/brain/index.d.ts +15 -1
- package/dist/brain/index.d.ts.map +1 -1
- package/dist/brain/index.js +67 -5
- package/dist/brain/index.js.map +1 -1
- package/dist/cli-ack-patch.d.ts +39 -0
- package/dist/cli-ack-patch.d.ts.map +1 -0
- package/dist/cli-ack-patch.js +47 -0
- package/dist/cli-ack-patch.js.map +1 -0
- package/dist/cli-design-audit.d.ts +16 -0
- package/dist/cli-design-audit.d.ts.map +1 -1
- package/dist/cli-design-audit.js +232 -7
- package/dist/cli-design-audit.js.map +1 -1
- package/dist/cli-jobs.d.ts +13 -0
- package/dist/cli-jobs.d.ts.map +1 -0
- package/dist/cli-jobs.js +262 -0
- package/dist/cli-jobs.js.map +1 -0
- package/dist/cli-patterns.d.ts +26 -0
- package/dist/cli-patterns.d.ts.map +1 -0
- package/dist/cli-patterns.js +49 -0
- package/dist/cli-patterns.js.map +1 -0
- package/dist/cli-reports.d.ts +12 -0
- package/dist/cli-reports.d.ts.map +1 -0
- package/dist/cli-reports.js +97 -0
- package/dist/cli-reports.js.map +1 -0
- package/dist/cli-ui.d.ts.map +1 -1
- package/dist/cli-ui.js +5 -1
- package/dist/cli-ui.js.map +1 -1
- package/dist/cli.js +52 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +4 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/design/audit/attribution/aggregate.d.ts +16 -0
- package/dist/design/audit/attribution/aggregate.d.ts.map +1 -0
- package/dist/design/audit/attribution/aggregate.js +81 -0
- package/dist/design/audit/attribution/aggregate.js.map +1 -0
- package/dist/design/audit/attribution/store.d.ts +36 -0
- package/dist/design/audit/attribution/store.d.ts.map +1 -0
- package/dist/design/audit/attribution/store.js +108 -0
- package/dist/design/audit/attribution/store.js.map +1 -0
- package/dist/design/audit/attribution/types.d.ts +13 -0
- package/dist/design/audit/attribution/types.d.ts.map +1 -0
- package/dist/design/audit/attribution/types.js +10 -0
- package/dist/design/audit/attribution/types.js.map +1 -0
- package/dist/design/audit/classify-ensemble.d.ts +46 -0
- package/dist/design/audit/classify-ensemble.d.ts.map +1 -0
- package/dist/design/audit/classify-ensemble.js +207 -0
- package/dist/design/audit/classify-ensemble.js.map +1 -0
- package/dist/design/audit/ethics/check.d.ts +59 -0
- package/dist/design/audit/ethics/check.d.ts.map +1 -0
- package/dist/design/audit/ethics/check.js +137 -0
- package/dist/design/audit/ethics/check.js.map +1 -0
- package/dist/design/audit/ethics/loader.d.ts +21 -0
- package/dist/design/audit/ethics/loader.d.ts.map +1 -0
- package/dist/design/audit/ethics/loader.js +207 -0
- package/dist/design/audit/ethics/loader.js.map +1 -0
- package/dist/design/audit/ethics/rules/finance.yaml +37 -0
- package/dist/design/audit/ethics/rules/kids.yaml +37 -0
- package/dist/design/audit/ethics/rules/legal.yaml +35 -0
- package/dist/design/audit/ethics/rules/medical.yaml +36 -0
- package/dist/design/audit/evaluate.d.ts +69 -0
- package/dist/design/audit/evaluate.d.ts.map +1 -1
- package/dist/design/audit/evaluate.js +417 -55
- package/dist/design/audit/evaluate.js.map +1 -1
- package/dist/design/audit/first-principles-mode.d.ts +42 -0
- package/dist/design/audit/first-principles-mode.d.ts.map +1 -0
- package/dist/design/audit/first-principles-mode.js +77 -0
- package/dist/design/audit/first-principles-mode.js.map +1 -0
- package/dist/design/audit/modality/android.d.ts +14 -0
- package/dist/design/audit/modality/android.d.ts.map +1 -0
- package/dist/design/audit/modality/android.js +18 -0
- package/dist/design/audit/modality/android.js.map +1 -0
- package/dist/design/audit/modality/html.d.ts +22 -0
- package/dist/design/audit/modality/html.d.ts.map +1 -0
- package/dist/design/audit/modality/html.js +51 -0
- package/dist/design/audit/modality/html.js.map +1 -0
- package/dist/design/audit/modality/index.d.ts +8 -0
- package/dist/design/audit/modality/index.d.ts.map +1 -0
- package/dist/design/audit/modality/index.js +15 -0
- package/dist/design/audit/modality/index.js.map +1 -0
- package/dist/design/audit/modality/ios.d.ts +16 -0
- package/dist/design/audit/modality/ios.d.ts.map +1 -0
- package/dist/design/audit/modality/ios.js +19 -0
- package/dist/design/audit/modality/ios.js.map +1 -0
- package/dist/design/audit/modality/types.d.ts +9 -0
- package/dist/design/audit/modality/types.d.ts.map +1 -0
- package/dist/design/audit/modality/types.js +9 -0
- package/dist/design/audit/modality/types.js.map +1 -0
- package/dist/design/audit/patches/index.d.ts +8 -0
- package/dist/design/audit/patches/index.d.ts.map +1 -0
- package/dist/design/audit/patches/index.js +5 -0
- package/dist/design/audit/patches/index.js.map +1 -0
- package/dist/design/audit/patches/parse.d.ts +29 -0
- package/dist/design/audit/patches/parse.d.ts.map +1 -0
- package/dist/design/audit/patches/parse.js +153 -0
- package/dist/design/audit/patches/parse.js.map +1 -0
- package/dist/design/audit/patches/render.d.ts +20 -0
- package/dist/design/audit/patches/render.d.ts.map +1 -0
- package/dist/design/audit/patches/render.js +55 -0
- package/dist/design/audit/patches/render.js.map +1 -0
- package/dist/design/audit/patches/severity-enforcement.d.ts +23 -0
- package/dist/design/audit/patches/severity-enforcement.d.ts.map +1 -0
- package/dist/design/audit/patches/severity-enforcement.js +42 -0
- package/dist/design/audit/patches/severity-enforcement.js.map +1 -0
- package/dist/design/audit/patches/validate.d.ts +34 -0
- package/dist/design/audit/patches/validate.d.ts.map +1 -0
- package/dist/design/audit/patches/validate.js +53 -0
- package/dist/design/audit/patches/validate.js.map +1 -0
- package/dist/design/audit/patterns/match.d.ts +24 -0
- package/dist/design/audit/patterns/match.d.ts.map +1 -0
- package/dist/design/audit/patterns/match.js +48 -0
- package/dist/design/audit/patterns/match.js.map +1 -0
- package/dist/design/audit/patterns/mine.d.ts +31 -0
- package/dist/design/audit/patterns/mine.d.ts.map +1 -0
- package/dist/design/audit/patterns/mine.js +35 -0
- package/dist/design/audit/patterns/mine.js.map +1 -0
- package/dist/design/audit/patterns/store.d.ts +14 -0
- package/dist/design/audit/patterns/store.d.ts.map +1 -0
- package/dist/design/audit/patterns/store.js +53 -0
- package/dist/design/audit/patterns/store.js.map +1 -0
- package/dist/design/audit/patterns/types.d.ts +53 -0
- package/dist/design/audit/patterns/types.d.ts.map +1 -0
- package/dist/design/audit/patterns/types.js +13 -0
- package/dist/design/audit/patterns/types.js.map +1 -0
- package/dist/design/audit/pipeline.d.ts +26 -0
- package/dist/design/audit/pipeline.d.ts.map +1 -1
- package/dist/design/audit/pipeline.js +131 -4
- package/dist/design/audit/pipeline.js.map +1 -1
- package/dist/design/audit/rubric/anchor-loader.d.ts +44 -0
- package/dist/design/audit/rubric/anchor-loader.d.ts.map +1 -0
- package/dist/design/audit/rubric/anchor-loader.js +210 -0
- package/dist/design/audit/rubric/anchor-loader.js.map +1 -0
- package/dist/design/audit/rubric/anchors/blog.yaml +33 -0
- package/dist/design/audit/rubric/anchors/dashboard.yaml +35 -0
- package/dist/design/audit/rubric/anchors/docs.yaml +35 -0
- package/dist/design/audit/rubric/anchors/ecommerce.yaml +33 -0
- package/dist/design/audit/rubric/anchors/marketing.yaml +34 -0
- package/dist/design/audit/rubric/anchors/saas-app.yaml +38 -0
- package/dist/design/audit/rubric/anchors/social.yaml +33 -0
- package/dist/design/audit/rubric/anchors/tool.yaml +33 -0
- package/dist/design/audit/rubric/anchors/utility.yaml +33 -0
- package/dist/design/audit/rubric/fragments/audience-clinician.md +42 -0
- package/dist/design/audit/rubric/fragments/audience-developer.md +40 -0
- package/dist/design/audit/rubric/fragments/audience-kids.md +35 -0
- package/dist/design/audit/rubric/fragments/audience-vulnerability-minor-facing.md +37 -0
- package/dist/design/audit/rubric/fragments/first-principles.md +65 -0
- package/dist/design/audit/rubric/fragments/modality-mobile.md +39 -0
- package/dist/design/audit/rubric/fragments/modality-tablet.md +35 -0
- package/dist/design/audit/rubric/fragments/regulatory-coppa.md +32 -0
- package/dist/design/audit/rubric/fragments/regulatory-gdpr.md +33 -0
- package/dist/design/audit/rubric/fragments/regulatory-hipaa.md +36 -0
- package/dist/design/audit/rubric/fragments/universal-product-intent.md +48 -0
- package/dist/design/audit/rubric/loader.d.ts +26 -6
- package/dist/design/audit/rubric/loader.d.ts.map +1 -1
- package/dist/design/audit/rubric/loader.js +77 -27
- package/dist/design/audit/rubric/loader.js.map +1 -1
- package/dist/design/audit/rubric/rollup-weights.d.ts +25 -0
- package/dist/design/audit/rubric/rollup-weights.d.ts.map +1 -0
- package/dist/design/audit/rubric/rollup-weights.js +51 -0
- package/dist/design/audit/rubric/rollup-weights.js.map +1 -0
- package/dist/design/audit/types.d.ts +28 -0
- package/dist/design/audit/types.d.ts.map +1 -1
- package/dist/design/audit/v2/build-result.d.ts +47 -0
- package/dist/design/audit/v2/build-result.d.ts.map +1 -0
- package/dist/design/audit/v2/build-result.js +163 -0
- package/dist/design/audit/v2/build-result.js.map +1 -0
- package/dist/design/audit/v2/score.d.ts +49 -0
- package/dist/design/audit/v2/score.d.ts.map +1 -0
- package/dist/design/audit/v2/score.js +211 -0
- package/dist/design/audit/v2/score.js.map +1 -0
- package/dist/design/audit/v2/types.d.ts +431 -0
- package/dist/design/audit/v2/types.d.ts.map +1 -0
- package/dist/design/audit/v2/types.js +26 -0
- package/dist/design/audit/v2/types.js.map +1 -0
- package/dist/discover/index.d.ts +16 -0
- package/dist/discover/index.d.ts.map +1 -0
- package/dist/discover/index.js +25 -0
- package/dist/discover/index.js.map +1 -0
- package/dist/discover/wayback.d.ts +49 -0
- package/dist/discover/wayback.d.ts.map +1 -0
- package/dist/discover/wayback.js +123 -0
- package/dist/discover/wayback.js.map +1 -0
- package/dist/jobs/anti-bot.d.ts +19 -0
- package/dist/jobs/anti-bot.d.ts.map +1 -0
- package/dist/jobs/anti-bot.js +64 -0
- package/dist/jobs/anti-bot.js.map +1 -0
- package/dist/jobs/cost-estimate.d.ts +12 -0
- package/dist/jobs/cost-estimate.d.ts.map +1 -0
- package/dist/jobs/cost-estimate.js +21 -0
- package/dist/jobs/cost-estimate.js.map +1 -0
- package/dist/jobs/cost-history.d.ts +19 -0
- package/dist/jobs/cost-history.d.ts.map +1 -0
- package/dist/jobs/cost-history.js +42 -0
- package/dist/jobs/cost-history.js.map +1 -0
- package/dist/jobs/index.d.ts +31 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +37 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/orchestrator.d.ts +42 -0
- package/dist/jobs/orchestrator.d.ts.map +1 -0
- package/dist/jobs/orchestrator.js +282 -0
- package/dist/jobs/orchestrator.js.map +1 -0
- package/dist/jobs/queue.d.ts +45 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/queue.js +114 -0
- package/dist/jobs/queue.js.map +1 -0
- package/dist/jobs/retry.d.ts +36 -0
- package/dist/jobs/retry.d.ts.map +1 -0
- package/dist/jobs/retry.js +77 -0
- package/dist/jobs/retry.js.map +1 -0
- package/dist/jobs/store.d.ts +31 -0
- package/dist/jobs/store.d.ts.map +1 -0
- package/dist/jobs/store.js +92 -0
- package/dist/jobs/store.js.map +1 -0
- package/dist/jobs/types.d.ts +106 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/types.js +13 -0
- package/dist/jobs/types.js.map +1 -0
- package/dist/provider-defaults.d.ts +1 -1
- package/dist/provider-defaults.d.ts.map +1 -1
- package/dist/provider-defaults.js +8 -0
- package/dist/provider-defaults.js.map +1 -1
- package/dist/reports/aggregate.d.ts +38 -0
- package/dist/reports/aggregate.d.ts.map +1 -0
- package/dist/reports/aggregate.js +145 -0
- package/dist/reports/aggregate.js.map +1 -0
- package/dist/reports/index.d.ts +21 -0
- package/dist/reports/index.d.ts.map +1 -0
- package/dist/reports/index.js +15 -0
- package/dist/reports/index.js.map +1 -0
- package/dist/reports/narrate.d.ts +19 -0
- package/dist/reports/narrate.d.ts.map +1 -0
- package/dist/reports/narrate.js +40 -0
- package/dist/reports/narrate.js.map +1 -0
- package/dist/reports/templates.d.ts +43 -0
- package/dist/reports/templates.d.ts.map +1 -0
- package/dist/reports/templates.js +200 -0
- package/dist/reports/templates.js.map +1 -0
- package/dist/reports/tokens.d.ts +77 -0
- package/dist/reports/tokens.d.ts.map +1 -0
- package/dist/reports/tokens.js +88 -0
- package/dist/reports/tokens.js.map +1 -0
- package/dist/reports/tools.d.ts +76 -0
- package/dist/reports/tools.d.ts.map +1 -0
- package/dist/reports/tools.js +205 -0
- package/dist/reports/tools.js.map +1 -0
- package/dist/reports/types.d.ts +51 -0
- package/dist/reports/types.d.ts.map +1 -0
- package/dist/reports/types.js +9 -0
- package/dist/reports/types.js.map +1 -0
- package/dist/supervisor/critic.d.ts +1 -1
- package/dist/supervisor/critic.d.ts.map +1 -1
- package/dist/supervisor/critic.js +50 -5
- package/dist/supervisor/critic.js.map +1 -1
- package/dist/telemetry/client.d.ts +42 -0
- package/dist/telemetry/client.d.ts.map +1 -0
- package/dist/telemetry/client.js +203 -0
- package/dist/telemetry/client.js.map +1 -0
- package/dist/telemetry/hash.d.ts +4 -0
- package/dist/telemetry/hash.d.ts.map +1 -0
- package/dist/telemetry/hash.js +7 -0
- package/dist/telemetry/hash.js.map +1 -0
- package/dist/telemetry/index.d.ts +6 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +5 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/schema.d.ts +85 -0
- package/dist/telemetry/schema.d.ts.map +1 -0
- package/dist/telemetry/schema.js +13 -0
- package/dist/telemetry/schema.js.map +1 -0
- package/dist/telemetry/sink.d.ts +46 -0
- package/dist/telemetry/sink.d.ts.map +1 -0
- package/dist/telemetry/sink.js +97 -0
- package/dist/telemetry/sink.js.map +1 -0
- package/dist/types.d.ts +5 -5
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/reports/templates.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,YAAY,CAAA;AAI/D,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,4FAA4F;IAC5F,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,IAAI,GAAE,qBAA0B,GAAG,MAAM,CAwChG;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,IAAI,GAAE,sBAA2B,GAAG,MAAM,CA6BlG;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2FAA2F;IAC3F,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAChC;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,IAAI,GAAE,yBAA8B,GAAG,MAAM,CA+BxG;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,GAAE,wBAA6B,GAAG,MAAM,CAqD1F;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAWhD"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static report templates — markdown rendering of pre-aggregated data.
|
|
3
|
+
*
|
|
4
|
+
* No LLM. The narration layer (narrate.ts) wraps these with prose; the
|
|
5
|
+
* templates themselves are pure functions of data so they're snapshot-testable
|
|
6
|
+
* and deterministic.
|
|
7
|
+
*/
|
|
8
|
+
import { leaderboard, longitudinalFor, tierBuckets, compareRuns } from './aggregate.js';
|
|
9
|
+
import { aggregateTokens, diffTokens, groupByUrl } from './tokens.js';
|
|
10
|
+
export function renderLeaderboard(rows, opts = {}) {
|
|
11
|
+
const lines = [];
|
|
12
|
+
const title = opts.title ?? 'Design Audit Leaderboard';
|
|
13
|
+
lines.push(`# ${title}`);
|
|
14
|
+
lines.push('');
|
|
15
|
+
lines.push(`Generated: ${new Date().toISOString()}`);
|
|
16
|
+
lines.push('');
|
|
17
|
+
if (opts.byType) {
|
|
18
|
+
lines.push(`Filtered to page-type: \`${opts.byType}\``);
|
|
19
|
+
lines.push('');
|
|
20
|
+
}
|
|
21
|
+
const ranked = leaderboard(rows, { topN: opts.topN, byType: opts.byType });
|
|
22
|
+
lines.push(`## Ranked sites (${ranked.length})`);
|
|
23
|
+
lines.push('');
|
|
24
|
+
lines.push('| # | URL | Page type | Rollup | Top dim | Bottom dim | Ethics |');
|
|
25
|
+
lines.push('|---|-----|-----------|--------|---------|------------|--------|');
|
|
26
|
+
ranked.forEach((r, i) => {
|
|
27
|
+
const dims = Object.entries(r.dimensions);
|
|
28
|
+
dims.sort((a, b) => b[1] - a[1]);
|
|
29
|
+
const top = dims[0] ? `${dims[0][0]} ${dims[0][1].toFixed(1)}` : '—';
|
|
30
|
+
const bot = dims[dims.length - 1] ? `${dims[dims.length - 1][0]} ${dims[dims.length - 1][1].toFixed(1)}` : '—';
|
|
31
|
+
lines.push(`| ${i + 1} | ${escapeMd(r.url)} | ${r.pageType ?? '?'} | ${r.rollupScore.toFixed(2)} | ${top} | ${bot} | ${r.ethicsViolations} |`);
|
|
32
|
+
});
|
|
33
|
+
lines.push('');
|
|
34
|
+
if (opts.buckets && opts.buckets.length > 0) {
|
|
35
|
+
const buckets = tierBuckets(rows, opts.buckets);
|
|
36
|
+
lines.push('## Tiers');
|
|
37
|
+
lines.push('');
|
|
38
|
+
lines.push('| Tier | N | Mean | Median |');
|
|
39
|
+
lines.push('|------|---|------|--------|');
|
|
40
|
+
for (const b of buckets) {
|
|
41
|
+
lines.push(`| ${b.label} | ${b.rows.length} | ${fmt(b.meanScore)} | ${fmt(b.medianScore)} |`);
|
|
42
|
+
}
|
|
43
|
+
lines.push('');
|
|
44
|
+
}
|
|
45
|
+
return lines.join('\n');
|
|
46
|
+
}
|
|
47
|
+
export function renderLongitudinal(rows, opts = {}) {
|
|
48
|
+
const lines = [];
|
|
49
|
+
lines.push(`# ${opts.title ?? 'Longitudinal Design Audit'}`);
|
|
50
|
+
lines.push('');
|
|
51
|
+
lines.push(`Generated: ${new Date().toISOString()}`);
|
|
52
|
+
lines.push('');
|
|
53
|
+
const urls = opts.urls ?? Array.from(new Set(rows.map(r => r.url)));
|
|
54
|
+
for (const url of urls) {
|
|
55
|
+
const series = longitudinalFor(rows, url);
|
|
56
|
+
if (series.length === 0)
|
|
57
|
+
continue;
|
|
58
|
+
lines.push(`## ${escapeMd(url)}`);
|
|
59
|
+
lines.push('');
|
|
60
|
+
lines.push('| Captured | Rollup | Page type |');
|
|
61
|
+
lines.push('|----------|--------|-----------|');
|
|
62
|
+
for (const s of series) {
|
|
63
|
+
lines.push(`| ${s.capturedAt.slice(0, 10)} | ${s.rollupScore.toFixed(2)} | ${s.pageType ?? '?'} |`);
|
|
64
|
+
}
|
|
65
|
+
const first = series[0];
|
|
66
|
+
const last = series[series.length - 1];
|
|
67
|
+
if (first && last && first !== last) {
|
|
68
|
+
const delta = last.rollupScore - first.rollupScore;
|
|
69
|
+
const sign = delta >= 0 ? '+' : '';
|
|
70
|
+
lines.push('');
|
|
71
|
+
lines.push(`Net change ${first.capturedAt.slice(0, 10)} → ${last.capturedAt.slice(0, 10)}: **${sign}${delta.toFixed(2)}**`);
|
|
72
|
+
}
|
|
73
|
+
lines.push('');
|
|
74
|
+
}
|
|
75
|
+
return lines.join('\n');
|
|
76
|
+
}
|
|
77
|
+
export function renderBatchComparison(rows, opts = {}) {
|
|
78
|
+
const lines = [];
|
|
79
|
+
lines.push(`# ${opts.title ?? 'Batch Comparison'}`);
|
|
80
|
+
lines.push('');
|
|
81
|
+
lines.push(`Generated: ${new Date().toISOString()}`);
|
|
82
|
+
lines.push('');
|
|
83
|
+
let pairs = opts.pairs ?? [];
|
|
84
|
+
if (pairs.length === 0) {
|
|
85
|
+
const urls = Array.from(new Set(rows.map(r => r.url)));
|
|
86
|
+
if (urls.length >= 2)
|
|
87
|
+
pairs = [[urls[0], urls[1]]];
|
|
88
|
+
}
|
|
89
|
+
for (const [aUrl, bUrl] of pairs) {
|
|
90
|
+
const a = rows.find(r => r.url === aUrl && Number.isFinite(r.rollupScore));
|
|
91
|
+
const b = rows.find(r => r.url === bUrl && Number.isFinite(r.rollupScore));
|
|
92
|
+
if (!a || !b)
|
|
93
|
+
continue;
|
|
94
|
+
const cmp = compareRuns(a, b);
|
|
95
|
+
lines.push(`## ${escapeMd(aUrl)} vs ${escapeMd(bUrl)}`);
|
|
96
|
+
lines.push('');
|
|
97
|
+
lines.push(`Rollup delta: **${signed(cmp.rollupDelta)}** (a ${a.rollupScore.toFixed(2)} – b ${b.rollupScore.toFixed(2)})`);
|
|
98
|
+
lines.push('');
|
|
99
|
+
if (cmp.perDimension.length > 0) {
|
|
100
|
+
lines.push('| Dimension | a | b | Δ |');
|
|
101
|
+
lines.push('|-----------|---|---|---|');
|
|
102
|
+
for (const d of cmp.perDimension) {
|
|
103
|
+
lines.push(`| ${d.dim} | ${d.afterScore.toFixed(1)} | ${d.beforeScore.toFixed(1)} | ${signed(d.delta)} |`);
|
|
104
|
+
}
|
|
105
|
+
lines.push('');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return lines.join('\n');
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Render a per-URL brand-kit evolution: for each URL, list the snapshots in
|
|
112
|
+
* chronological order with their distinct color palette, font families, and
|
|
113
|
+
* detected libraries. Between consecutive snapshots, surface the delta
|
|
114
|
+
* (colors added/removed, families added/removed, brand-meta changes).
|
|
115
|
+
*/
|
|
116
|
+
export function renderBrandEvolution(job, opts = {}) {
|
|
117
|
+
const summaries = aggregateTokens(job);
|
|
118
|
+
const lines = [];
|
|
119
|
+
lines.push(`# ${opts.title ?? 'Brand & Design-System Evolution'}`);
|
|
120
|
+
lines.push('');
|
|
121
|
+
lines.push(`Generated: ${new Date().toISOString()}`);
|
|
122
|
+
lines.push('');
|
|
123
|
+
if (summaries.length === 0) {
|
|
124
|
+
lines.push(`_No tokens.json files were produced. Run the job with \`audit.extractTokens: true\` to enable._`);
|
|
125
|
+
return lines.join('\n');
|
|
126
|
+
}
|
|
127
|
+
const topColors = opts.topColors ?? 6;
|
|
128
|
+
const series = groupByUrl(summaries);
|
|
129
|
+
for (const { url, snapshots } of series) {
|
|
130
|
+
lines.push(`## ${escapeMd(url)}`);
|
|
131
|
+
lines.push('');
|
|
132
|
+
for (let i = 0; i < snapshots.length; i++) {
|
|
133
|
+
const s = snapshots[i];
|
|
134
|
+
const captured = s.capturedAt ? s.capturedAt.slice(0, 10) : 'live';
|
|
135
|
+
lines.push(`### ${captured}`);
|
|
136
|
+
lines.push('');
|
|
137
|
+
const swatches = s.colors.slice(0, topColors).map(c => `\`${c.hex}\` ×${c.count}`).join(' · ');
|
|
138
|
+
lines.push(`**Top colors**: ${swatches || '_none extracted_'}`);
|
|
139
|
+
const families = s.fontFamilies.map(f => `${f.family} (${f.classification})`).join(', ');
|
|
140
|
+
lines.push(`**Font families**: ${families || '_none_'}`);
|
|
141
|
+
lines.push(`**Type-scale entries**: ${s.typeScaleEntries}`);
|
|
142
|
+
if (s.detectedLibraries.length > 0)
|
|
143
|
+
lines.push(`**Detected libraries**: ${s.detectedLibraries.join(', ')}`);
|
|
144
|
+
if (s.brand?.themeColor)
|
|
145
|
+
lines.push(`**Theme color**: \`${s.brand.themeColor}\``);
|
|
146
|
+
if (s.logos.length > 0)
|
|
147
|
+
lines.push(`**Logos**: ${s.logos.length}`);
|
|
148
|
+
lines.push('');
|
|
149
|
+
// Snapshot-to-snapshot delta against the previous snapshot in the series.
|
|
150
|
+
const prev = snapshots[i - 1];
|
|
151
|
+
if (prev) {
|
|
152
|
+
const d = diffTokens(prev, s);
|
|
153
|
+
const callouts = [];
|
|
154
|
+
if (d.colorsAdded.length > 0)
|
|
155
|
+
callouts.push(`+${d.colorsAdded.length} new colors`);
|
|
156
|
+
if (d.colorsRemoved.length > 0)
|
|
157
|
+
callouts.push(`−${d.colorsRemoved.length} removed`);
|
|
158
|
+
if (d.familiesAdded.length > 0)
|
|
159
|
+
callouts.push(`+ ${d.familiesAdded.join(', ')}`);
|
|
160
|
+
if (d.familiesRemoved.length > 0)
|
|
161
|
+
callouts.push(`− ${d.familiesRemoved.join(', ')}`);
|
|
162
|
+
if (d.librariesAdded.length > 0)
|
|
163
|
+
callouts.push(`adopted ${d.librariesAdded.join(', ')}`);
|
|
164
|
+
if (d.librariesRemoved.length > 0)
|
|
165
|
+
callouts.push(`dropped ${d.librariesRemoved.join(', ')}`);
|
|
166
|
+
if (d.brandChanges.length > 0)
|
|
167
|
+
callouts.push(`brand meta: ${d.brandChanges.map(c => c.field).join(', ')} changed`);
|
|
168
|
+
if (callouts.length > 0) {
|
|
169
|
+
lines.push(`_Δ vs ${prev.capturedAt?.slice(0, 10) ?? 'previous'}: ${callouts.join(' · ')}_`);
|
|
170
|
+
lines.push('');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return lines.join('\n');
|
|
176
|
+
}
|
|
177
|
+
export function renderJobHeader(job) {
|
|
178
|
+
const ok = job.results.filter(r => r.status === 'ok').length;
|
|
179
|
+
const fail = job.results.filter(r => r.status === 'failed').length;
|
|
180
|
+
const skip = job.results.filter(r => r.status === 'skipped').length;
|
|
181
|
+
return [
|
|
182
|
+
`**Job**: \`${job.jobId}\``,
|
|
183
|
+
job.spec.label ? `**Label**: ${job.spec.label}` : undefined,
|
|
184
|
+
`**Targets**: ${job.targets.length} · ok: ${ok} · failed: ${fail} · skipped: ${skip}`,
|
|
185
|
+
`**Cost**: $${job.totalCostUSD.toFixed(2)}`,
|
|
186
|
+
`**Status**: ${job.status}`,
|
|
187
|
+
].filter(Boolean).join(' \n');
|
|
188
|
+
}
|
|
189
|
+
function escapeMd(s) {
|
|
190
|
+
return s.replace(/\|/g, '\\|');
|
|
191
|
+
}
|
|
192
|
+
function signed(n) {
|
|
193
|
+
if (!Number.isFinite(n))
|
|
194
|
+
return '—';
|
|
195
|
+
return (n >= 0 ? '+' : '') + n.toFixed(2);
|
|
196
|
+
}
|
|
197
|
+
function fmt(n) {
|
|
198
|
+
return Number.isFinite(n) ? n.toFixed(2) : '—';
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/reports/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
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
|
+
* Schema-version contract: `tokens.json` files older than `MIN_TOKENS_SCHEMA`
|
|
11
|
+
* are skipped with a warning. The aggregator never silently coerces old
|
|
12
|
+
* shapes — better empty rows than wrong rows.
|
|
13
|
+
*/
|
|
14
|
+
import type { Job } from '../jobs/types.js';
|
|
15
|
+
import type { DesignTokens, ColorToken, FontFamily } from '../types.js';
|
|
16
|
+
/** Minimum acceptable schemaVersion for tokens.json. Bump when the shape changes incompatibly. */
|
|
17
|
+
export declare const MIN_TOKENS_SCHEMA = 1;
|
|
18
|
+
/** Most recent schemaVersion we know how to read. Future versions will warn but still attempt to parse. */
|
|
19
|
+
export declare const CURRENT_TOKENS_SCHEMA = 1;
|
|
20
|
+
export interface TokenSummary {
|
|
21
|
+
/** Seed URL (groups snapshots of the same site). */
|
|
22
|
+
url: string;
|
|
23
|
+
/** Snapshot URL when wayback. */
|
|
24
|
+
snapshotUrl?: string;
|
|
25
|
+
/** ISO datetime of capture. */
|
|
26
|
+
capturedAt?: string;
|
|
27
|
+
/** Per-target runId (== outputDir for jobs). */
|
|
28
|
+
runId: string;
|
|
29
|
+
/** Resolved on-disk path to tokens.json. */
|
|
30
|
+
tokensPath?: string;
|
|
31
|
+
/** Top-level brand metadata (title, theme color, favicon, og image). */
|
|
32
|
+
brand: DesignTokens['brand'];
|
|
33
|
+
/** All distinct colors, sorted desc by usage count. */
|
|
34
|
+
colors: ColorToken[];
|
|
35
|
+
/** Distinct typography families with classification + weight set. */
|
|
36
|
+
fontFamilies: FontFamily[];
|
|
37
|
+
/** Type-scale entry count (proxy for typographic complexity). */
|
|
38
|
+
typeScaleEntries: number;
|
|
39
|
+
/** Logo asset URLs (svg + raster). */
|
|
40
|
+
logos: string[];
|
|
41
|
+
/** Loaded font-file URLs. */
|
|
42
|
+
fontFiles: string[];
|
|
43
|
+
/** Detected libraries (e.g. ['tailwind','radix-ui']). */
|
|
44
|
+
detectedLibraries: string[];
|
|
45
|
+
}
|
|
46
|
+
/** Read each ok result's tokens.json and project to TokenSummary. */
|
|
47
|
+
export declare function aggregateTokens(job: Job): TokenSummary[];
|
|
48
|
+
/**
|
|
49
|
+
* Diff between two TokenSummary records. Useful for "this URL evolved from
|
|
50
|
+
* 4 colors → 12 colors and dropped Helvetica for Inter" callouts.
|
|
51
|
+
*/
|
|
52
|
+
export interface TokenDiff {
|
|
53
|
+
colorsAdded: string[];
|
|
54
|
+
colorsRemoved: string[];
|
|
55
|
+
colorsCommon: number;
|
|
56
|
+
familiesAdded: string[];
|
|
57
|
+
familiesRemoved: string[];
|
|
58
|
+
brandChanges: Array<{
|
|
59
|
+
field: keyof DesignTokens['brand'];
|
|
60
|
+
before: string | undefined;
|
|
61
|
+
after: string | undefined;
|
|
62
|
+
}>;
|
|
63
|
+
librariesAdded: string[];
|
|
64
|
+
librariesRemoved: string[];
|
|
65
|
+
}
|
|
66
|
+
export declare function diffTokens(a: TokenSummary, b: TokenSummary): TokenDiff;
|
|
67
|
+
/**
|
|
68
|
+
* Group token summaries by URL and return a chronological evolution series.
|
|
69
|
+
* Returns one entry per URL; each carries the sequence of TokenSummary rows
|
|
70
|
+
* sorted by capturedAt (or insertion order when capturedAt is missing).
|
|
71
|
+
*/
|
|
72
|
+
export interface TokenSeries {
|
|
73
|
+
url: string;
|
|
74
|
+
snapshots: TokenSummary[];
|
|
75
|
+
}
|
|
76
|
+
export declare function groupByUrl(summaries: TokenSummary[]): TokenSeries[];
|
|
77
|
+
//# sourceMappingURL=tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/reports/tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEvE,kGAAkG;AAClG,eAAO,MAAM,iBAAiB,IAAI,CAAA;AAClC,2GAA2G;AAC3G,eAAO,MAAM,qBAAqB,IAAI,CAAA;AAEtC,MAAM,WAAW,YAAY;IAC3B,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAA;IACX,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;IACb,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,wEAAwE;IACxE,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;IAC5B,uDAAuD;IACvD,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,qEAAqE;IACrE,YAAY,EAAE,UAAU,EAAE,CAAA;IAC1B,iEAAiE;IACjE,gBAAgB,EAAE,MAAM,CAAA;IACxB,sCAAsC;IACtC,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,6BAA6B;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAC5B;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,YAAY,EAAE,CA8BxD;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,YAAY,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,CAAA;IAClH,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,SAAS,CAuBtE;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,YAAY,EAAE,CAAA;CAC1B;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,WAAW,EAAE,CAYnE"}
|
|
@@ -0,0 +1,88 @@
|
|
|
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
|
+
* Schema-version contract: `tokens.json` files older than `MIN_TOKENS_SCHEMA`
|
|
11
|
+
* are skipped with a warning. The aggregator never silently coerces old
|
|
12
|
+
* shapes — better empty rows than wrong rows.
|
|
13
|
+
*/
|
|
14
|
+
import * as fs from 'node:fs';
|
|
15
|
+
/** Minimum acceptable schemaVersion for tokens.json. Bump when the shape changes incompatibly. */
|
|
16
|
+
export const MIN_TOKENS_SCHEMA = 1;
|
|
17
|
+
/** Most recent schemaVersion we know how to read. Future versions will warn but still attempt to parse. */
|
|
18
|
+
export const CURRENT_TOKENS_SCHEMA = 1;
|
|
19
|
+
/** Read each ok result's tokens.json and project to TokenSummary. */
|
|
20
|
+
export function aggregateTokens(job) {
|
|
21
|
+
const out = [];
|
|
22
|
+
for (const r of job.results) {
|
|
23
|
+
if (r.status !== 'ok' || !r.tokensPath || !fs.existsSync(r.tokensPath))
|
|
24
|
+
continue;
|
|
25
|
+
try {
|
|
26
|
+
const raw = JSON.parse(fs.readFileSync(r.tokensPath, 'utf-8'));
|
|
27
|
+
// Only enforce when schemaVersion is present. Pre-versioned files (the
|
|
28
|
+
// bulk of existing jobs at the time this check landed) are accepted as
|
|
29
|
+
// implicitly v1 — see CURRENT_TOKENS_SCHEMA.
|
|
30
|
+
if (typeof raw.schemaVersion === 'number' && raw.schemaVersion < MIN_TOKENS_SCHEMA)
|
|
31
|
+
continue;
|
|
32
|
+
const tokens = raw;
|
|
33
|
+
out.push({
|
|
34
|
+
url: r.url,
|
|
35
|
+
snapshotUrl: r.snapshotUrl,
|
|
36
|
+
capturedAt: r.capturedAt,
|
|
37
|
+
runId: r.runId ?? '',
|
|
38
|
+
tokensPath: r.tokensPath,
|
|
39
|
+
brand: tokens.brand ?? {},
|
|
40
|
+
colors: (tokens.colors ?? []).slice().sort((a, b) => (b.count ?? 0) - (a.count ?? 0)),
|
|
41
|
+
fontFamilies: tokens.typography?.families ?? [],
|
|
42
|
+
typeScaleEntries: tokens.typography?.scale?.length ?? 0,
|
|
43
|
+
logos: (tokens.logos ?? []).map(l => l.src ?? '').filter(Boolean),
|
|
44
|
+
fontFiles: (tokens.fontFiles ?? []).map(f => f.src).filter(Boolean),
|
|
45
|
+
detectedLibraries: tokens.detectedLibraries ?? [],
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Skip corrupted token files.
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
export function diffTokens(a, b) {
|
|
55
|
+
const aHex = new Set(a.colors.map(c => c.hex.toLowerCase()));
|
|
56
|
+
const bHex = new Set(b.colors.map(c => c.hex.toLowerCase()));
|
|
57
|
+
const colorsAdded = [...bHex].filter(h => !aHex.has(h));
|
|
58
|
+
const colorsRemoved = [...aHex].filter(h => !bHex.has(h));
|
|
59
|
+
const colorsCommon = [...aHex].filter(h => bHex.has(h)).length;
|
|
60
|
+
const aFam = new Set(a.fontFamilies.map(f => f.family));
|
|
61
|
+
const bFam = new Set(b.fontFamilies.map(f => f.family));
|
|
62
|
+
const familiesAdded = [...bFam].filter(f => !aFam.has(f));
|
|
63
|
+
const familiesRemoved = [...aFam].filter(f => !bFam.has(f));
|
|
64
|
+
const brandFields = ['title', 'description', 'themeColor', 'favicon', 'ogImage'];
|
|
65
|
+
const brandChanges = brandFields
|
|
66
|
+
.filter(f => (a.brand?.[f] ?? '') !== (b.brand?.[f] ?? ''))
|
|
67
|
+
.map(f => ({ field: f, before: a.brand?.[f], after: b.brand?.[f] }));
|
|
68
|
+
const aLib = new Set(a.detectedLibraries);
|
|
69
|
+
const bLib = new Set(b.detectedLibraries);
|
|
70
|
+
const librariesAdded = [...bLib].filter(l => !aLib.has(l));
|
|
71
|
+
const librariesRemoved = [...aLib].filter(l => !bLib.has(l));
|
|
72
|
+
return { colorsAdded, colorsRemoved, colorsCommon, familiesAdded, familiesRemoved, brandChanges, librariesAdded, librariesRemoved };
|
|
73
|
+
}
|
|
74
|
+
export function groupByUrl(summaries) {
|
|
75
|
+
const map = new Map();
|
|
76
|
+
for (const s of summaries) {
|
|
77
|
+
if (!map.has(s.url))
|
|
78
|
+
map.set(s.url, []);
|
|
79
|
+
map.get(s.url).push(s);
|
|
80
|
+
}
|
|
81
|
+
const out = [];
|
|
82
|
+
for (const [url, snapshots] of map.entries()) {
|
|
83
|
+
snapshots.sort((a, b) => (a.capturedAt ?? '').localeCompare(b.capturedAt ?? ''));
|
|
84
|
+
out.push({ url, snapshots });
|
|
85
|
+
}
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
//# 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"}
|