@dreamdata_io/verify-tracking 0.1.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/LICENSE +21 -0
- package/README.md +756 -0
- package/dist/ai/checker.js +222 -0
- package/dist/ai/checker.js.map +1 -0
- package/dist/ai/checklist.js +190 -0
- package/dist/ai/checklist.js.map +1 -0
- package/dist/ai/cli-presets.js +27 -0
- package/dist/ai/cli-presets.js.map +1 -0
- package/dist/ai/evidence-view.js +143 -0
- package/dist/ai/evidence-view.js.map +1 -0
- package/dist/ai/local-cli.js +58 -0
- package/dist/ai/local-cli.js.map +1 -0
- package/dist/ai/openai-compatible.js +78 -0
- package/dist/ai/openai-compatible.js.map +1 -0
- package/dist/ai/response-parser.js +105 -0
- package/dist/ai/response-parser.js.map +1 -0
- package/dist/ai/types.js +2 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/analysis/consent-mode.js +225 -0
- package/dist/analysis/consent-mode.js.map +1 -0
- package/dist/analysis/deployment.js +2658 -0
- package/dist/analysis/deployment.js.map +1 -0
- package/dist/analysis/diagnosis/copy.en.js +303 -0
- package/dist/analysis/diagnosis/copy.en.js.map +1 -0
- package/dist/analysis/diagnosis/diagnose.js +172 -0
- package/dist/analysis/diagnosis/diagnose.js.map +1 -0
- package/dist/analysis/diagnosis/docs.js +118 -0
- package/dist/analysis/diagnosis/docs.js.map +1 -0
- package/dist/analysis/diagnosis/index.js +5 -0
- package/dist/analysis/diagnosis/index.js.map +1 -0
- package/dist/analysis/diagnosis/rules.js +656 -0
- package/dist/analysis/diagnosis/rules.js.map +1 -0
- package/dist/analysis/diagnosis/types.js +2 -0
- package/dist/analysis/diagnosis/types.js.map +1 -0
- package/dist/cli.js +344 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/env.js +100 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/preflight.js +167 -0
- package/dist/config/preflight.js.map +1 -0
- package/dist/config/user-config.js +79 -0
- package/dist/config/user-config.js.map +1 -0
- package/dist/evidence/collect.js +527 -0
- package/dist/evidence/collect.js.map +1 -0
- package/dist/evidence/consent-accept.js +377 -0
- package/dist/evidence/consent-accept.js.map +1 -0
- package/dist/evidence/consent.js +340 -0
- package/dist/evidence/consent.js.map +1 -0
- package/dist/evidence/constants.js +615 -0
- package/dist/evidence/constants.js.map +1 -0
- package/dist/evidence/globals.js +132 -0
- package/dist/evidence/globals.js.map +1 -0
- package/dist/evidence/gtm-container.js +432 -0
- package/dist/evidence/gtm-container.js.map +1 -0
- package/dist/evidence/heuristic-banner.js +107 -0
- package/dist/evidence/heuristic-banner.js.map +1 -0
- package/dist/evidence/http-probe.js +139 -0
- package/dist/evidence/http-probe.js.map +1 -0
- package/dist/evidence/init-script.js +112 -0
- package/dist/evidence/init-script.js.map +1 -0
- package/dist/evidence/network.js +365 -0
- package/dist/evidence/network.js.map +1 -0
- package/dist/evidence/preference-center.js +368 -0
- package/dist/evidence/preference-center.js.map +1 -0
- package/dist/evidence/script.js +425 -0
- package/dist/evidence/script.js.map +1 -0
- package/dist/evidence/second-page.js +332 -0
- package/dist/evidence/second-page.js.map +1 -0
- package/dist/evidence/selector-probe.js +53 -0
- package/dist/evidence/selector-probe.js.map +1 -0
- package/dist/evidence/stealth.js +21 -0
- package/dist/evidence/stealth.js.map +1 -0
- package/dist/evidence/types.js +14 -0
- package/dist/evidence/types.js.map +1 -0
- package/dist/interactive/prompt.js +31 -0
- package/dist/interactive/prompt.js.map +1 -0
- package/dist/mcp/server.js +308 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/summary.js +41 -0
- package/dist/mcp/summary.js.map +1 -0
- package/dist/report/context.js +184 -0
- package/dist/report/context.js.map +1 -0
- package/dist/report/projection.js +125 -0
- package/dist/report/projection.js.map +1 -0
- package/dist/report/quote-check.js +90 -0
- package/dist/report/quote-check.js.map +1 -0
- package/dist/report/render.js +178 -0
- package/dist/report/render.js.map +1 -0
- package/dist/report/serializers.js +124 -0
- package/dist/report/serializers.js.map +1 -0
- package/dist/report/store.js +139 -0
- package/dist/report/store.js.map +1 -0
- package/dist/run/verify.js +77 -0
- package/dist/run/verify.js.map +1 -0
- package/dist/utils/duration.js +10 -0
- package/dist/utils/duration.js.map +1 -0
- package/dist/utils/errors.js +17 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.js +59 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/runTimingsLog.js +27 -0
- package/dist/utils/runTimingsLog.js.map +1 -0
- package/dist/utils/slug.js +27 -0
- package/dist/utils/slug.js.map +1 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/package.json +57 -0
- package/scripts/install.sh +314 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../src/analysis/diagnosis/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/analysis/diagnosis/types.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import * as clack from "@clack/prompts";
|
|
4
|
+
import { resolveCliPresetTemplate } from "./ai/cli-presets.js";
|
|
5
|
+
import { DEFAULT_AI_TIMEOUT_MS, DEFAULT_TIMEOUT_MS, isPhaseName, resolveAiTimeoutMs, resolveApiKey, resolveBackendType, resolveBaseUrl, resolveCliCmd, resolveCliPreset, resolveModel, resolvePhases, resolveTrackingHosts, } from "./config/env.js";
|
|
6
|
+
import { browserPreflightError, claudeAuthPreflightError, cliBackendPreflightError } from "./config/preflight.js";
|
|
7
|
+
import { USER_CONFIG_PATH, loadUserConfig } from "./config/user-config.js";
|
|
8
|
+
import { isValidHttpUrl, promptForUrl } from "./interactive/prompt.js";
|
|
9
|
+
import { renderPhaseDetail, renderTextReport } from "./report/render.js";
|
|
10
|
+
import { serializeEvidenceToJson, serializeToJson, serializeToMarkdown } from "./report/serializers.js";
|
|
11
|
+
import { runVerification, writeDefaultArtifacts, writeEnsuringDir } from "./run/verify.js";
|
|
12
|
+
import { logger } from "./utils/logger.js";
|
|
13
|
+
import { isSafeSlug, slugFromUrl } from "./utils/slug.js";
|
|
14
|
+
import { VERSION } from "./version.js";
|
|
15
|
+
function parseSlug(raw) {
|
|
16
|
+
const slug = (raw ?? "").trim();
|
|
17
|
+
if (!isSafeSlug(slug)) {
|
|
18
|
+
console.error(`--slug expects a name made of letters, digits, "_" and "-" (the verification/slugs.txt convention, e.g. tungstenautomation_com) — got: ${raw ?? ""}`);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
return slug;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* A derived slug names both default output paths just as `--slug` does, so it
|
|
25
|
+
* answers to the same rule — but only when those paths are actually written.
|
|
26
|
+
* A host the convention cannot express (an IPv6 literal, which keeps its
|
|
27
|
+
* brackets and colons) is reported up front rather than filed under a mangled
|
|
28
|
+
* name; the caller names it themselves with `--slug`. Runs that write
|
|
29
|
+
* elsewhere, or nowhere, only ever use the slug as a label and are left alone.
|
|
30
|
+
*/
|
|
31
|
+
function assertSlugIsPathSafe(slug, url) {
|
|
32
|
+
if (isSafeSlug(slug))
|
|
33
|
+
return;
|
|
34
|
+
console.error(`Cannot derive a report file name from ${url} (got: ${slug}). Pass --slug to name it, --out to choose the path, or --no-save-report to skip the write.`);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
/** An unparseable `--url` would otherwise reach the browser as a search term. */
|
|
38
|
+
function parseUrl(raw) {
|
|
39
|
+
const url = (raw ?? "").trim();
|
|
40
|
+
if (!isValidHttpUrl(url)) {
|
|
41
|
+
console.error(`--url expects an http(s) URL (e.g. https://example.com) — got: ${raw ?? ""}`);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
return url;
|
|
45
|
+
}
|
|
46
|
+
const HELP_TEXT = `
|
|
47
|
+
verify-tracking [--url <url>] [options]
|
|
48
|
+
|
|
49
|
+
--version Print the version and exit
|
|
50
|
+
--url <url> URL to check (prompted interactively if omitted)
|
|
51
|
+
--slug <slug> Account slug this run belongs to. Names the report file
|
|
52
|
+
and is recorded inside it, so a run against a host that
|
|
53
|
+
differs from the account's own domain (a login host, a
|
|
54
|
+
marketing subdomain) still files under the account.
|
|
55
|
+
Defaults to the URL's hostname with dots as underscores.
|
|
56
|
+
--headed Launch a visible browser instead of headless
|
|
57
|
+
--out <path> Write the report to this file, instead of the default
|
|
58
|
+
verification/reports/<slug>_report.json. The full
|
|
59
|
+
evidence lands beside it as <path>.evidence.json
|
|
60
|
+
rather than in verification/evidence/.
|
|
61
|
+
--no-save-report Skip both default writes (report and full evidence)
|
|
62
|
+
--format <fmt> text | json | markdown (default: text)
|
|
63
|
+
--timeout <ms> Navigation timeout in ms (default: ${DEFAULT_TIMEOUT_MS})
|
|
64
|
+
|
|
65
|
+
Consent states
|
|
66
|
+
Every run walks all three by default, each in its own fresh browser context:
|
|
67
|
+
clean (banner untouched), grant (accept, then reload), reject (decline, then
|
|
68
|
+
reload). Consent verdicts are comparisons between them — a single state
|
|
69
|
+
cannot tell a correctly gated bundle from a broken one, since both look
|
|
70
|
+
like silence.
|
|
71
|
+
|
|
72
|
+
--phase <list> Comma-separated subset, e.g. --phase clean,grant
|
|
73
|
+
--quick Shorthand for --phase clean
|
|
74
|
+
--accept-consent Deprecated alias for --phase grant
|
|
75
|
+
--reject-consent Deprecated alias for --phase reject
|
|
76
|
+
--no-tag-manager-scan Skip reading the page's GTM container(s). The scan is
|
|
77
|
+
what reveals a bundle that a tag manager injects only
|
|
78
|
+
once consent allows it, and so is never in the DOM
|
|
79
|
+
beforehand; without it such an install looks absent.
|
|
80
|
+
--no-http-probe Skip the one plain-HTTP fetch of the URL taken before
|
|
81
|
+
the browser starts. That fetch is what tells a site
|
|
82
|
+
with nothing installed apart from a site whose bot
|
|
83
|
+
wall served the browser a challenge page instead:
|
|
84
|
+
both leave the browser with no script, no container,
|
|
85
|
+
no banner and no tracking request, and only the
|
|
86
|
+
served markup can break the tie. It also recovers
|
|
87
|
+
the GTM container id, and so the install, on a page
|
|
88
|
+
the browser could not read at all.
|
|
89
|
+
--no-second-page Skip the second page each phase walks to. That walk is
|
|
90
|
+
what catches a bundle that fires on the entry page and
|
|
91
|
+
then stops — a consent-gated bundle injected only once,
|
|
92
|
+
or a single-page app that changes route without ever
|
|
93
|
+
sending another page event. Costs one navigation per
|
|
94
|
+
phase.
|
|
95
|
+
--verbose Also print each phase's own observation context
|
|
96
|
+
|
|
97
|
+
--tracking-host <h> Host receiving event requests; repeat or comma-separate for
|
|
98
|
+
several. Needed for installs fronted by a first-party
|
|
99
|
+
CNAME (default: cdn.dreamdata.cloud)
|
|
100
|
+
--backend <type> openai | local-cli (default: openai)
|
|
101
|
+
--base-url <url> OpenAI-compatible base URL (default: https://openrouter.ai/api/v1)
|
|
102
|
+
--api-key <key> API key for the OpenAI-compatible backend
|
|
103
|
+
--model <model> Model id/slug to use
|
|
104
|
+
--cli-preset <name> Named local-cli preset (e.g. "claude")
|
|
105
|
+
--cli-cmd <template> Custom local-cli command template with {model}/{prompt} placeholders
|
|
106
|
+
--ai-timeout <ms> How long to wait for the model's answer (default:
|
|
107
|
+
${DEFAULT_AI_TIMEOUT_MS}). A local model that does not fit
|
|
108
|
+
in RAM runs partly on the CPU and can take far longer
|
|
109
|
+
than a hosted one for the same prompt.
|
|
110
|
+
--debug Verbose logging (never logs secrets)
|
|
111
|
+
--help Show this help
|
|
112
|
+
`;
|
|
113
|
+
function parsePhaseList(raw) {
|
|
114
|
+
const names = (raw ?? "").split(",").map((name) => name.trim()).filter(Boolean);
|
|
115
|
+
const invalid = names.filter((name) => !isPhaseName(name));
|
|
116
|
+
if (names.length === 0 || invalid.length > 0) {
|
|
117
|
+
console.error(`--phase expects a comma-separated subset of clean,grant,reject (got: ${raw ?? ""})`);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
return names.filter(isPhaseName);
|
|
121
|
+
}
|
|
122
|
+
function parseArgs(argv) {
|
|
123
|
+
const flags = {
|
|
124
|
+
headed: false,
|
|
125
|
+
format: "text",
|
|
126
|
+
timeoutMs: DEFAULT_TIMEOUT_MS,
|
|
127
|
+
debug: false,
|
|
128
|
+
scanTagManager: true,
|
|
129
|
+
probeSecondPage: true,
|
|
130
|
+
probeOverHttp: true,
|
|
131
|
+
verbose: false,
|
|
132
|
+
noSaveReport: false,
|
|
133
|
+
};
|
|
134
|
+
for (let i = 0; i < argv.length; i++) {
|
|
135
|
+
const arg = argv[i];
|
|
136
|
+
switch (arg) {
|
|
137
|
+
case "--url":
|
|
138
|
+
flags.url = parseUrl(argv[++i]);
|
|
139
|
+
break;
|
|
140
|
+
case "--slug":
|
|
141
|
+
flags.slug = parseSlug(argv[++i]);
|
|
142
|
+
break;
|
|
143
|
+
case "--headed":
|
|
144
|
+
flags.headed = true;
|
|
145
|
+
break;
|
|
146
|
+
case "--phase":
|
|
147
|
+
flags.phases = parsePhaseList(argv[++i]);
|
|
148
|
+
break;
|
|
149
|
+
case "--quick":
|
|
150
|
+
flags.phases = ["clean"];
|
|
151
|
+
break;
|
|
152
|
+
case "--accept-consent":
|
|
153
|
+
flags.phases = ["grant"];
|
|
154
|
+
break;
|
|
155
|
+
case "--reject-consent":
|
|
156
|
+
flags.phases = ["reject"];
|
|
157
|
+
break;
|
|
158
|
+
case "--no-tag-manager-scan":
|
|
159
|
+
flags.scanTagManager = false;
|
|
160
|
+
break;
|
|
161
|
+
case "--no-second-page":
|
|
162
|
+
flags.probeSecondPage = false;
|
|
163
|
+
break;
|
|
164
|
+
case "--no-http-probe":
|
|
165
|
+
flags.probeOverHttp = false;
|
|
166
|
+
break;
|
|
167
|
+
case "--verbose":
|
|
168
|
+
flags.verbose = true;
|
|
169
|
+
break;
|
|
170
|
+
case "--tracking-host":
|
|
171
|
+
flags.trackingHosts = [...(flags.trackingHosts ?? []), ...(argv[++i] ?? "").split(",")];
|
|
172
|
+
break;
|
|
173
|
+
case "--out":
|
|
174
|
+
flags.out = argv[++i];
|
|
175
|
+
break;
|
|
176
|
+
case "--no-save-report":
|
|
177
|
+
flags.noSaveReport = true;
|
|
178
|
+
break;
|
|
179
|
+
case "--format":
|
|
180
|
+
flags.format = argv[++i];
|
|
181
|
+
break;
|
|
182
|
+
case "--timeout":
|
|
183
|
+
flags.timeoutMs = Number(argv[++i]);
|
|
184
|
+
break;
|
|
185
|
+
case "--backend":
|
|
186
|
+
flags.backend = argv[++i];
|
|
187
|
+
break;
|
|
188
|
+
case "--base-url":
|
|
189
|
+
flags.baseUrl = argv[++i];
|
|
190
|
+
break;
|
|
191
|
+
case "--api-key":
|
|
192
|
+
flags.apiKey = argv[++i];
|
|
193
|
+
break;
|
|
194
|
+
case "--model":
|
|
195
|
+
flags.model = argv[++i];
|
|
196
|
+
break;
|
|
197
|
+
case "--cli-preset":
|
|
198
|
+
flags.cliPreset = argv[++i];
|
|
199
|
+
break;
|
|
200
|
+
case "--cli-cmd":
|
|
201
|
+
flags.cliCmd = argv[++i];
|
|
202
|
+
break;
|
|
203
|
+
case "--ai-timeout":
|
|
204
|
+
flags.aiTimeoutMs = Number(argv[++i]);
|
|
205
|
+
break;
|
|
206
|
+
case "--debug":
|
|
207
|
+
flags.debug = true;
|
|
208
|
+
process.env.DEBUG = "1";
|
|
209
|
+
break;
|
|
210
|
+
case "--help":
|
|
211
|
+
console.log(HELP_TEXT);
|
|
212
|
+
process.exit(0);
|
|
213
|
+
break;
|
|
214
|
+
case "--version":
|
|
215
|
+
console.log(VERSION);
|
|
216
|
+
process.exit(0);
|
|
217
|
+
break;
|
|
218
|
+
default:
|
|
219
|
+
console.error(`Unknown flag: ${arg}`);
|
|
220
|
+
console.log(HELP_TEXT);
|
|
221
|
+
process.exit(1);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return flags;
|
|
225
|
+
}
|
|
226
|
+
function buildBackendConfig(flags) {
|
|
227
|
+
return {
|
|
228
|
+
type: resolveBackendType(flags),
|
|
229
|
+
baseUrl: resolveBaseUrl(flags),
|
|
230
|
+
apiKey: resolveApiKey(flags),
|
|
231
|
+
model: resolveModel(flags),
|
|
232
|
+
cliPreset: resolveCliPreset(flags),
|
|
233
|
+
cliCmd: resolveCliCmd(flags),
|
|
234
|
+
timeoutMs: resolveAiTimeoutMs(flags),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
const PHASE_PROGRESS = {
|
|
238
|
+
clean: "Loading the page untouched",
|
|
239
|
+
grant: "Accepting consent and reloading",
|
|
240
|
+
reject: "Refusing consent and reloading",
|
|
241
|
+
};
|
|
242
|
+
async function main() {
|
|
243
|
+
// Before any flag is resolved: the file only fills in what the environment
|
|
244
|
+
// and the flags leave unset, so it has to be in place before they are read.
|
|
245
|
+
const configPath = loadUserConfig();
|
|
246
|
+
if (configPath)
|
|
247
|
+
logger.debug(`Loaded settings from ${configPath}`);
|
|
248
|
+
// Flags first: --help and --version exit inside parseArgs, and they must
|
|
249
|
+
// answer on a machine with no browser installed — the preflight is about the
|
|
250
|
+
// run, not about printing text.
|
|
251
|
+
const flags = parseArgs(process.argv.slice(2));
|
|
252
|
+
const preflight = browserPreflightError();
|
|
253
|
+
if (preflight) {
|
|
254
|
+
console.error(preflight);
|
|
255
|
+
process.exit(1);
|
|
256
|
+
}
|
|
257
|
+
const url = flags.url ?? (await promptForUrl());
|
|
258
|
+
const slug = flags.slug ?? slugFromUrl(url);
|
|
259
|
+
const writesDefaultReport = !flags.out && !flags.noSaveReport;
|
|
260
|
+
if (writesDefaultReport)
|
|
261
|
+
assertSlugIsPathSafe(slug, url);
|
|
262
|
+
const backendConfig = buildBackendConfig(flags);
|
|
263
|
+
const phases = resolvePhases(flags);
|
|
264
|
+
if (backendConfig.type === "openai" && !backendConfig.apiKey) {
|
|
265
|
+
logger.warn(`No API key set. Pass --api-key, set AI_API_KEY, or put it in ${USER_CONFIG_PATH}. Proceeding — some endpoints require none.`);
|
|
266
|
+
}
|
|
267
|
+
// Checked here rather than with the browser: the backend is only known once
|
|
268
|
+
// the flags and the config file have both been read, and a missing CLI must
|
|
269
|
+
// still be reported before the minutes of browser work, not after.
|
|
270
|
+
if (backendConfig.type === "local-cli" && !backendConfig.cliCmd && backendConfig.cliPreset) {
|
|
271
|
+
const template = resolveCliPresetTemplate(backendConfig.cliPreset, backendConfig.model);
|
|
272
|
+
const cliError = template ? cliBackendPreflightError(template.command) : null;
|
|
273
|
+
if (cliError) {
|
|
274
|
+
console.error(cliError);
|
|
275
|
+
process.exit(1);
|
|
276
|
+
}
|
|
277
|
+
// Being installed and being signed in are separate failures with separate
|
|
278
|
+
// fixes, so they are separate checks — and this one only after the first
|
|
279
|
+
// has established there is a CLI to ask.
|
|
280
|
+
const authError = template ? claudeAuthPreflightError(template.command, backendConfig.cliPreset) : null;
|
|
281
|
+
if (authError) {
|
|
282
|
+
console.error(authError);
|
|
283
|
+
process.exit(1);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
const spinner = clack.spinner();
|
|
287
|
+
spinner.start("Collecting evidence…");
|
|
288
|
+
const run = await runVerification({
|
|
289
|
+
url,
|
|
290
|
+
slug,
|
|
291
|
+
phases,
|
|
292
|
+
backend: backendConfig,
|
|
293
|
+
headless: !flags.headed,
|
|
294
|
+
timeoutMs: flags.timeoutMs,
|
|
295
|
+
trackingHosts: resolveTrackingHosts(flags),
|
|
296
|
+
scanTagManager: flags.scanTagManager,
|
|
297
|
+
probeSecondPage: flags.probeSecondPage,
|
|
298
|
+
probeOverHttp: flags.probeOverHttp,
|
|
299
|
+
}, (event) => {
|
|
300
|
+
if (event.step === "collect") {
|
|
301
|
+
spinner.message(`[${event.index + 1}/${event.total}] ${PHASE_PROGRESS[event.phase]}${flags.probeSecondPage ? ", then walking to a second page" : ""}…`);
|
|
302
|
+
}
|
|
303
|
+
else if (event.step === "ai-check") {
|
|
304
|
+
spinner.message("Checking evidence with the AI model…");
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
spinner.stop(`Evidence collected from ${run.evidence.phases.length} consent state(s), then checked with the AI model.`);
|
|
308
|
+
const { evidence, analysis, result, timings } = run;
|
|
309
|
+
const render = (format) => format === "json"
|
|
310
|
+
? serializeToJson(evidence, analysis, result, { slug, timings })
|
|
311
|
+
: format === "markdown"
|
|
312
|
+
? serializeToMarkdown(evidence, analysis, result, { slug, timings })
|
|
313
|
+
: renderTextReport(evidence, analysis, result, timings);
|
|
314
|
+
console.log(render(flags.format));
|
|
315
|
+
if (flags.verbose && flags.format === "text") {
|
|
316
|
+
console.log("");
|
|
317
|
+
console.log(renderPhaseDetail(evidence));
|
|
318
|
+
}
|
|
319
|
+
if (flags.out) {
|
|
320
|
+
await writeEnsuringDir(flags.out, render(flags.format));
|
|
321
|
+
logger.info(`Report written to ${resolve(flags.out)}`);
|
|
322
|
+
// `--out` takes the run out of the default layout, so its companion goes
|
|
323
|
+
// next to the file the caller named rather than into the archive
|
|
324
|
+
// directory they did not ask for.
|
|
325
|
+
const evidencePath = flags.out.replace(/(\.[^./\\]+)?$/, ".evidence.json");
|
|
326
|
+
await writeEnsuringDir(evidencePath, serializeEvidenceToJson(evidence, analysis, result, { slug, timings }));
|
|
327
|
+
logger.info(`Full evidence written to ${resolve(evidencePath)}`);
|
|
328
|
+
}
|
|
329
|
+
else if (writesDefaultReport) {
|
|
330
|
+
const written = await writeDefaultArtifacts(run, slug);
|
|
331
|
+
// Absolute, unlike the paths recorded inside the report: those stay
|
|
332
|
+
// relative so they read the same wherever the file is opened, while the
|
|
333
|
+
// operator being told where to look is run from an arbitrary directory and
|
|
334
|
+
// needs somewhere they can actually go.
|
|
335
|
+
logger.info(`Report written to ${resolve(written.reportPath)}`);
|
|
336
|
+
logger.info(`Full evidence written to ${resolve(written.evidencePath)}`);
|
|
337
|
+
}
|
|
338
|
+
process.exit(result.overallPass ? 0 : 1);
|
|
339
|
+
}
|
|
340
|
+
main().catch((err) => {
|
|
341
|
+
logger.error("verify-tracking failed", err);
|
|
342
|
+
process.exit(1);
|
|
343
|
+
});
|
|
344
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { ALL_PHASES } from "../evidence/types.js";
|
|
2
|
+
export const DEFAULT_TIMEOUT_MS = 15_000;
|
|
3
|
+
/**
|
|
4
|
+
* How long to wait for the model to answer.
|
|
5
|
+
*
|
|
6
|
+
* The OpenAI SDK defaults to 10 minutes, which is generous for a hosted
|
|
7
|
+
* endpoint and too short for a local one: a 32B model that does not fit in
|
|
8
|
+
* RAM spills onto the CPU and takes longer than that for a single ~16k-token
|
|
9
|
+
* prompt, so the run dies on a client-side abort with the answer still being
|
|
10
|
+
* generated. Overnight batches want to wait; a caller who would rather fail
|
|
11
|
+
* fast can say so.
|
|
12
|
+
*/
|
|
13
|
+
export const DEFAULT_AI_TIMEOUT_MS = 1_800_000;
|
|
14
|
+
export const BATCH_FLUSH_WAIT_MS = 5_500;
|
|
15
|
+
/**
|
|
16
|
+
* Which backend answers, when nobody said.
|
|
17
|
+
*
|
|
18
|
+
* Zero-key is the intended default: the operators this ships to are set up
|
|
19
|
+
* with a local Claude Code CLI and no API key, and an unconfigured run used to
|
|
20
|
+
* pick the hosted endpoint and die on a 401 that named nothing they could fix.
|
|
21
|
+
* A key, wherever it comes from, still selects the endpoint it authenticates —
|
|
22
|
+
* so a developer with AI_API_KEY in .env is unaffected.
|
|
23
|
+
*/
|
|
24
|
+
export function resolveBackendType(flags) {
|
|
25
|
+
if (flags.backend)
|
|
26
|
+
return flags.backend;
|
|
27
|
+
const fromEnv = process.env.AI_BACKEND;
|
|
28
|
+
if (fromEnv === "openai" || fromEnv === "local-cli")
|
|
29
|
+
return fromEnv;
|
|
30
|
+
return resolveApiKey(flags) ? "openai" : "local-cli";
|
|
31
|
+
}
|
|
32
|
+
export function resolveBaseUrl(flags) {
|
|
33
|
+
return flags.baseUrl ?? process.env.AI_BASE_URL ?? "https://openrouter.ai/api/v1";
|
|
34
|
+
}
|
|
35
|
+
export function resolveApiKey(flags) {
|
|
36
|
+
// Trimmed: a whitespace-only value from a mis-edited config.env would
|
|
37
|
+
// otherwise read as "a key is present" and select the hosted backend, which
|
|
38
|
+
// then dies on a 401 naming nothing the operator can fix.
|
|
39
|
+
return (flags.apiKey ?? process.env.AI_API_KEY ?? "").trim();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The default model is per backend, because the two name models differently.
|
|
43
|
+
*
|
|
44
|
+
* `anthropic/claude-sonnet-4.5` is an OpenRouter identifier. Handed to
|
|
45
|
+
* `claude --model` it is rejected — and the CLI still exits 0, so the run
|
|
46
|
+
* treated the refusal text as the model's answer and reported a verdict it
|
|
47
|
+
* could not parse. The claude preset gets an alias that CLI accepts instead.
|
|
48
|
+
*/
|
|
49
|
+
export const DEFAULT_OPENAI_MODEL = "anthropic/claude-sonnet-4.5";
|
|
50
|
+
export const DEFAULT_CLI_MODEL = "sonnet";
|
|
51
|
+
export function resolveModel(flags) {
|
|
52
|
+
const fallback = resolveBackendType(flags) === "local-cli" ? DEFAULT_CLI_MODEL : DEFAULT_OPENAI_MODEL;
|
|
53
|
+
return flags.model ?? process.env.AI_MODEL ?? fallback;
|
|
54
|
+
}
|
|
55
|
+
export function resolveAiTimeoutMs(flags) {
|
|
56
|
+
// `--ai-timeout foo` parses to NaN at the call site; a NaN or negative
|
|
57
|
+
// timeout handed to the SDK fails the run in a way that reads like a model
|
|
58
|
+
// problem, so an unusable value falls through to the next source.
|
|
59
|
+
const usable = (value) => value !== undefined && Number.isFinite(value) && value > 0;
|
|
60
|
+
const fromEnv = Number(process.env.AI_TIMEOUT_MS);
|
|
61
|
+
if (usable(flags.aiTimeoutMs))
|
|
62
|
+
return flags.aiTimeoutMs;
|
|
63
|
+
return usable(fromEnv) ? fromEnv : DEFAULT_AI_TIMEOUT_MS;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Defaults to the one verified preset. `--backend local-cli` refuses to run
|
|
67
|
+
* without a preset or a custom command, and requiring the operator to name the
|
|
68
|
+
* only shipped one is friction with no decision behind it. A `--cli-cmd` still
|
|
69
|
+
* wins: resolveTemplate checks it first.
|
|
70
|
+
*/
|
|
71
|
+
export const DEFAULT_CLI_PRESET = "claude";
|
|
72
|
+
export function resolveCliPreset(flags) {
|
|
73
|
+
return flags.cliPreset ?? process.env.AI_CLI_PRESET ?? DEFAULT_CLI_PRESET;
|
|
74
|
+
}
|
|
75
|
+
export function resolveCliCmd(flags) {
|
|
76
|
+
return flags.cliCmd ?? process.env.AI_CLI_CMD;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Hosts to watch for event requests. Returns undefined when unset so the
|
|
80
|
+
* collector applies its own default rather than duplicating it here.
|
|
81
|
+
*/
|
|
82
|
+
export function resolveTrackingHosts(flags) {
|
|
83
|
+
const fromEnv = process.env.DD_TRACKING_HOSTS;
|
|
84
|
+
const raw = flags.trackingHosts ?? (fromEnv ? fromEnv.split(",") : undefined);
|
|
85
|
+
const hosts = raw?.map((host) => host.trim()).filter((host) => host.length > 0);
|
|
86
|
+
return hosts && hosts.length > 0 ? hosts : undefined;
|
|
87
|
+
}
|
|
88
|
+
const PHASE_NAMES = ALL_PHASES;
|
|
89
|
+
export function isPhaseName(value) {
|
|
90
|
+
return PHASE_NAMES.includes(value);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Phases to walk, in the canonical clean → grant → reject order regardless of
|
|
94
|
+
* the order they were named in, and de-duplicated.
|
|
95
|
+
*/
|
|
96
|
+
export function resolvePhases(flags) {
|
|
97
|
+
const requested = flags.phases ?? [...ALL_PHASES];
|
|
98
|
+
return ALL_PHASES.filter((phase) => requested.includes(phase));
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"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"}
|