ai-model-verifier 1.4.0 → 2.0.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/README.md +79 -21
- package/dist/engine/context.d.ts +43 -0
- package/dist/engine/context.d.ts.map +1 -0
- package/dist/engine/context.js +50 -0
- package/dist/engine/context.js.map +1 -0
- package/dist/engine/evidence.d.ts +40 -0
- package/dist/engine/evidence.d.ts.map +1 -0
- package/dist/engine/evidence.js +108 -0
- package/dist/engine/evidence.js.map +1 -0
- package/dist/engine/handshake.d.ts +16 -0
- package/dist/engine/handshake.d.ts.map +1 -0
- package/dist/{handshake.js → engine/handshake.js} +35 -63
- package/dist/engine/handshake.js.map +1 -0
- package/dist/engine/probe-runner.d.ts +14 -0
- package/dist/engine/probe-runner.d.ts.map +1 -0
- package/dist/engine/probe-runner.js +163 -0
- package/dist/engine/probe-runner.js.map +1 -0
- package/dist/engine/verdict.d.ts +15 -0
- package/dist/engine/verdict.d.ts.map +1 -0
- package/dist/engine/verdict.js +19 -0
- package/dist/engine/verdict.js.map +1 -0
- package/dist/highlight.d.ts +2 -2
- package/dist/highlight.d.ts.map +1 -1
- package/dist/highlight.js +10 -9
- package/dist/highlight.js.map +1 -1
- package/dist/{patterns.d.ts → identity/patterns.d.ts} +7 -0
- package/dist/identity/patterns.d.ts.map +1 -0
- package/dist/{patterns.js → identity/patterns.js} +7 -0
- package/dist/identity/patterns.js.map +1 -0
- package/dist/identity/signals.d.ts +15 -0
- package/dist/identity/signals.d.ts.map +1 -0
- package/dist/{signals.js → identity/signals.js} +15 -24
- package/dist/identity/signals.js.map +1 -0
- package/dist/index.d.ts +15 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -5
- package/dist/index.js.map +1 -1
- package/dist/internal/utils.d.ts +3 -1
- package/dist/internal/utils.d.ts.map +1 -1
- package/dist/internal/utils.js +12 -6
- package/dist/internal/utils.js.map +1 -1
- package/dist/models/catalog.d.ts +7 -0
- package/dist/models/catalog.d.ts.map +1 -0
- package/dist/models/catalog.js +23 -0
- package/dist/models/catalog.js.map +1 -0
- package/dist/models/facts.d.ts +56 -0
- package/dist/models/facts.d.ts.map +1 -0
- package/dist/models/facts.js +91 -0
- package/dist/models/facts.js.map +1 -0
- package/dist/models/index.d.ts +6 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +5 -0
- package/dist/models/index.js.map +1 -0
- package/dist/{substitution.d.ts → models/substitution.d.ts} +3 -4
- package/dist/models/substitution.d.ts.map +1 -0
- package/dist/{substitution.js → models/substitution.js} +3 -4
- package/dist/models/substitution.js.map +1 -0
- package/dist/models/tiers.d.ts +14 -0
- package/dist/models/tiers.d.ts.map +1 -0
- package/dist/models/tiers.js +35 -0
- package/dist/models/tiers.js.map +1 -0
- package/dist/probes/prompts.d.ts +23 -0
- package/dist/probes/prompts.d.ts.map +1 -0
- package/dist/probes/prompts.js +31 -0
- package/dist/probes/prompts.js.map +1 -0
- package/dist/probes/table.d.ts +37 -0
- package/dist/probes/table.d.ts.map +1 -0
- package/dist/probes/table.js +57 -0
- package/dist/probes/table.js.map +1 -0
- package/dist/registry.d.ts +26 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +23 -0
- package/dist/registry.js.map +1 -0
- package/dist/rules/index.d.ts +15 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +8 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/probe-ladder.d.ts +33 -0
- package/dist/rules/probe-ladder.d.ts.map +1 -0
- package/dist/rules/probe-ladder.js +156 -0
- package/dist/rules/probe-ladder.js.map +1 -0
- package/dist/{detectors → rules}/response-metadata.d.ts +11 -14
- package/dist/rules/response-metadata.d.ts.map +1 -0
- package/dist/{detectors → rules}/response-metadata.js +32 -15
- package/dist/rules/response-metadata.js.map +1 -0
- package/dist/rules/table.d.ts +27 -0
- package/dist/rules/table.d.ts.map +1 -0
- package/dist/rules/table.js +47 -0
- package/dist/rules/table.js.map +1 -0
- package/dist/{detectors → rules}/thinking-floor.d.ts +14 -29
- package/dist/rules/thinking-floor.d.ts.map +1 -0
- package/dist/rules/thinking-floor.js +119 -0
- package/dist/rules/thinking-floor.js.map +1 -0
- package/dist/rules/thinking-signature.d.ts +43 -0
- package/dist/rules/thinking-signature.d.ts.map +1 -0
- package/dist/rules/thinking-signature.js +72 -0
- package/dist/rules/thinking-signature.js.map +1 -0
- package/dist/{detectors → rules}/throughput.d.ts +7 -10
- package/dist/rules/throughput.d.ts.map +1 -0
- package/dist/{detectors → rules}/throughput.js +32 -11
- package/dist/rules/throughput.js.map +1 -0
- package/dist/{detectors → rules}/token-truth.d.ts +7 -13
- package/dist/rules/token-truth.d.ts.map +1 -0
- package/dist/rules/token-truth.js +112 -0
- package/dist/rules/token-truth.js.map +1 -0
- package/dist/rules/tokenizer-fingerprint.d.ts +46 -0
- package/dist/rules/tokenizer-fingerprint.d.ts.map +1 -0
- package/dist/rules/tokenizer-fingerprint.js +110 -0
- package/dist/rules/tokenizer-fingerprint.js.map +1 -0
- package/dist/rules/types.d.ts +57 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +2 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/transport.d.ts +10 -2
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +40 -32
- package/dist/transport.js.map +1 -1
- package/dist/types.d.ts +70 -31
- package/dist/types.d.ts.map +1 -1
- package/dist/vendors/anthropic.d.ts +44 -0
- package/dist/vendors/anthropic.d.ts.map +1 -0
- package/dist/vendors/anthropic.js +114 -0
- package/dist/vendors/anthropic.js.map +1 -0
- package/dist/vendors/base-url.d.ts +3 -0
- package/dist/vendors/base-url.d.ts.map +1 -0
- package/dist/vendors/base-url.js +6 -0
- package/dist/vendors/base-url.js.map +1 -0
- package/dist/vendors/gemini.d.ts +44 -0
- package/dist/vendors/gemini.d.ts.map +1 -0
- package/dist/vendors/gemini.js +77 -0
- package/dist/vendors/gemini.js.map +1 -0
- package/dist/vendors/index.d.ts +9 -0
- package/dist/vendors/index.d.ts.map +1 -0
- package/dist/vendors/index.js +7 -0
- package/dist/vendors/index.js.map +1 -0
- package/dist/vendors/openai.d.ts +46 -0
- package/dist/vendors/openai.d.ts.map +1 -0
- package/dist/vendors/openai.js +77 -0
- package/dist/vendors/openai.js.map +1 -0
- package/dist/vendors/table.d.ts +113 -0
- package/dist/vendors/table.d.ts.map +1 -0
- package/dist/vendors/table.js +14 -0
- package/dist/vendors/table.js.map +1 -0
- package/dist/vendors/types.d.ts +93 -0
- package/dist/vendors/types.d.ts.map +1 -0
- package/dist/vendors/types.js +2 -0
- package/dist/vendors/types.js.map +1 -0
- package/dist/verify.d.ts +30 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +185 -0
- package/dist/verify.js.map +1 -0
- package/package.json +25 -10
- package/dist/detectors/response-metadata.d.ts.map +0 -1
- package/dist/detectors/response-metadata.js.map +0 -1
- package/dist/detectors/thinking-floor.d.ts.map +0 -1
- package/dist/detectors/thinking-floor.js +0 -135
- package/dist/detectors/thinking-floor.js.map +0 -1
- package/dist/detectors/thinking-signature.d.ts +0 -70
- package/dist/detectors/thinking-signature.d.ts.map +0 -1
- package/dist/detectors/thinking-signature.js +0 -177
- package/dist/detectors/thinking-signature.js.map +0 -1
- package/dist/detectors/throughput.d.ts.map +0 -1
- package/dist/detectors/throughput.js.map +0 -1
- package/dist/detectors/token-truth.d.ts.map +0 -1
- package/dist/detectors/token-truth.js +0 -142
- package/dist/detectors/token-truth.js.map +0 -1
- package/dist/detectors/tokenizer-fingerprint.d.ts +0 -65
- package/dist/detectors/tokenizer-fingerprint.d.ts.map +0 -1
- package/dist/detectors/tokenizer-fingerprint.js +0 -135
- package/dist/detectors/tokenizer-fingerprint.js.map +0 -1
- package/dist/handshake.d.ts +0 -23
- package/dist/handshake.d.ts.map +0 -1
- package/dist/handshake.js.map +0 -1
- package/dist/internal/fixed-text.d.ts +0 -13
- package/dist/internal/fixed-text.d.ts.map +0 -1
- package/dist/internal/fixed-text.js +0 -13
- package/dist/internal/fixed-text.js.map +0 -1
- package/dist/models.d.ts +0 -5
- package/dist/models.d.ts.map +0 -1
- package/dist/models.js +0 -54
- package/dist/models.js.map +0 -1
- package/dist/nonce.d.ts +0 -4
- package/dist/nonce.d.ts.map +0 -1
- package/dist/nonce.js +0 -12
- package/dist/nonce.js.map +0 -1
- package/dist/patterns.d.ts.map +0 -1
- package/dist/patterns.js.map +0 -1
- package/dist/probes.d.ts +0 -10
- package/dist/probes.d.ts.map +0 -1
- package/dist/probes.js +0 -54
- package/dist/probes.js.map +0 -1
- package/dist/providers/anthropic.d.ts +0 -3
- package/dist/providers/anthropic.d.ts.map +0 -1
- package/dist/providers/anthropic.js +0 -67
- package/dist/providers/anthropic.js.map +0 -1
- package/dist/providers/config.d.ts +0 -34
- package/dist/providers/config.d.ts.map +0 -1
- package/dist/providers/config.js +0 -14
- package/dist/providers/config.js.map +0 -1
- package/dist/providers/gemini.d.ts +0 -3
- package/dist/providers/gemini.d.ts.map +0 -1
- package/dist/providers/gemini.js +0 -58
- package/dist/providers/gemini.js.map +0 -1
- package/dist/providers/openai.d.ts +0 -3
- package/dist/providers/openai.d.ts.map +0 -1
- package/dist/providers/openai.js +0 -56
- package/dist/providers/openai.js.map +0 -1
- package/dist/rules.d.ts +0 -6
- package/dist/rules.d.ts.map +0 -1
- package/dist/rules.js +0 -28
- package/dist/rules.js.map +0 -1
- package/dist/runner.d.ts +0 -39
- package/dist/runner.d.ts.map +0 -1
- package/dist/runner.js +0 -352
- package/dist/runner.js.map +0 -1
- package/dist/signals.d.ts +0 -11
- package/dist/signals.d.ts.map +0 -1
- package/dist/signals.js.map +0 -1
- package/dist/substitution.d.ts.map +0 -1
- package/dist/substitution.js.map +0 -1
- package/dist/verdict.d.ts +0 -26
- package/dist/verdict.d.ts.map +0 -1
- package/dist/verdict.js +0 -84
- package/dist/verdict.js.map +0 -1
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { detectSignal } from "../identity/signals";
|
|
2
|
+
import { sleep } from "../internal/utils";
|
|
3
|
+
import { echoesNonce } from "../probes/prompts";
|
|
4
|
+
import { PROBES, } from "../probes/table";
|
|
5
|
+
import { buildChat, callWire } from "./context";
|
|
6
|
+
const NONCE_MISMATCH_RETRIES = 2;
|
|
7
|
+
const NONCE_MISMATCH_BACKOFF_MS = 500;
|
|
8
|
+
const RESPONSE_CAP = 2000;
|
|
9
|
+
const cap = (text) => text.length > RESPONSE_CAP ? `${text.slice(0, RESPONSE_CAP)}...` : text;
|
|
10
|
+
export function probeReason(pass, signal, muxFailure, transient) {
|
|
11
|
+
if (signal === "coding-tool")
|
|
12
|
+
return "coding-tool wrapper detected";
|
|
13
|
+
if (signal === "scam")
|
|
14
|
+
return "scam page detected";
|
|
15
|
+
if (signal === "cjk-leak")
|
|
16
|
+
return "CJK leaked into an English reply";
|
|
17
|
+
if (signal === "foreign")
|
|
18
|
+
return "foreign vendor named";
|
|
19
|
+
if (signal === "cloud-host")
|
|
20
|
+
return "cloud host named (accepted)";
|
|
21
|
+
if (signal === "blank")
|
|
22
|
+
return "blank response";
|
|
23
|
+
if (muxFailure)
|
|
24
|
+
return "response mixing (nonce mismatch)";
|
|
25
|
+
if (transient)
|
|
26
|
+
return "transient upstream error";
|
|
27
|
+
return pass ? "passed" : "failed quality check";
|
|
28
|
+
}
|
|
29
|
+
async function runProbe(ctx, probe) {
|
|
30
|
+
const started = performance.now();
|
|
31
|
+
const base = {
|
|
32
|
+
label: probe.label,
|
|
33
|
+
signal: null,
|
|
34
|
+
muxFailure: false,
|
|
35
|
+
transient: false,
|
|
36
|
+
usage: null,
|
|
37
|
+
detectedModel: null,
|
|
38
|
+
responseText: null,
|
|
39
|
+
httpStatus: null,
|
|
40
|
+
text: undefined,
|
|
41
|
+
raw: null,
|
|
42
|
+
corsBlocked: false,
|
|
43
|
+
};
|
|
44
|
+
const elapsed = () => Math.round(performance.now() - started);
|
|
45
|
+
let lastPrompt = "";
|
|
46
|
+
let weak = null;
|
|
47
|
+
for (let attempt = 0; attempt <= NONCE_MISMATCH_RETRIES; attempt++) {
|
|
48
|
+
if (attempt > 0)
|
|
49
|
+
await sleep(NONCE_MISMATCH_BACKOFF_MS);
|
|
50
|
+
const nonce = ctx.nonce();
|
|
51
|
+
lastPrompt = probe.prompt(nonce);
|
|
52
|
+
const built = buildChat(ctx, {
|
|
53
|
+
maxTokens: probe.maxTokens,
|
|
54
|
+
messages: [{ role: "user", content: lastPrompt }],
|
|
55
|
+
});
|
|
56
|
+
const res = await callWire(ctx, built);
|
|
57
|
+
const log = (pass, signal, responseText, error) => ctx.onProbe?.({
|
|
58
|
+
label: probe.label,
|
|
59
|
+
attempt,
|
|
60
|
+
pass,
|
|
61
|
+
signal,
|
|
62
|
+
request: built,
|
|
63
|
+
responseText,
|
|
64
|
+
...(error !== undefined ? { error } : {}),
|
|
65
|
+
});
|
|
66
|
+
// No answer, no verdict: only an answered probe can prove a faker. A busy
|
|
67
|
+
// relay reports 400/403/404 as often as 503, and a 403 here once
|
|
68
|
+
// blacklisted an honest lane for good.
|
|
69
|
+
if (res.error !== null || res.status === null || res.status >= 400) {
|
|
70
|
+
log(false, null, null, res.error ?? `HTTP ${res.status}`);
|
|
71
|
+
return {
|
|
72
|
+
...base,
|
|
73
|
+
pass: false,
|
|
74
|
+
transient: true,
|
|
75
|
+
latencyMs: elapsed(),
|
|
76
|
+
prompt: lastPrompt,
|
|
77
|
+
httpStatus: res.status,
|
|
78
|
+
reason: probeReason(false, null, false, true),
|
|
79
|
+
corsBlocked: res.corsBlocked,
|
|
80
|
+
raw: res.data,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const text = ctx.wire.read.text(res.data);
|
|
84
|
+
const meta = ctx.wire.read.meta(res.data);
|
|
85
|
+
if (text === null) {
|
|
86
|
+
log(false, null, null, "upstream error envelope");
|
|
87
|
+
return {
|
|
88
|
+
...base,
|
|
89
|
+
pass: false,
|
|
90
|
+
latencyMs: elapsed(),
|
|
91
|
+
prompt: lastPrompt,
|
|
92
|
+
httpStatus: res.status,
|
|
93
|
+
usage: meta.usage,
|
|
94
|
+
detectedModel: meta.detectedModel,
|
|
95
|
+
reason: "upstream error envelope",
|
|
96
|
+
raw: res.data,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (!echoesNonce(text, nonce)) {
|
|
100
|
+
log(false, null, text, `nonce_mismatch (attempt ${attempt + 1}/${NONCE_MISMATCH_RETRIES + 1}): expected "${nonce}"`);
|
|
101
|
+
if (text.trim().length > 0)
|
|
102
|
+
weak = { text, raw: res.data, status: res.status };
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const signal = detectSignal(text, probe.label, ctx.wire.identity);
|
|
106
|
+
const pass = probe.grade(text, ctx.wire);
|
|
107
|
+
log(pass, signal, text);
|
|
108
|
+
return {
|
|
109
|
+
...base,
|
|
110
|
+
pass,
|
|
111
|
+
signal,
|
|
112
|
+
latencyMs: elapsed(),
|
|
113
|
+
prompt: lastPrompt,
|
|
114
|
+
responseText: cap(text),
|
|
115
|
+
httpStatus: res.status,
|
|
116
|
+
usage: meta.usage,
|
|
117
|
+
detectedModel: meta.detectedModel,
|
|
118
|
+
reason: probeReason(pass, signal, false, false),
|
|
119
|
+
text,
|
|
120
|
+
raw: res.data,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
// The nonce proves the reply belongs to THIS request. Across the log history
|
|
124
|
+
// 169 mismatches were a CORRECT answer from a model that ignored the tag, so
|
|
125
|
+
// a readable reply is still graded, just never trusted for the nonce.
|
|
126
|
+
if (weak) {
|
|
127
|
+
const meta = ctx.wire.read.meta(weak.raw);
|
|
128
|
+
const signal = detectSignal(weak.text, probe.label, ctx.wire.identity);
|
|
129
|
+
const pass = probe.grade(weak.text, ctx.wire);
|
|
130
|
+
return {
|
|
131
|
+
...base,
|
|
132
|
+
pass,
|
|
133
|
+
signal,
|
|
134
|
+
latencyMs: elapsed(),
|
|
135
|
+
prompt: lastPrompt,
|
|
136
|
+
responseText: cap(weak.text),
|
|
137
|
+
httpStatus: weak.status,
|
|
138
|
+
usage: meta.usage,
|
|
139
|
+
detectedModel: meta.detectedModel,
|
|
140
|
+
reason: pass
|
|
141
|
+
? "passed (no nonce echo)"
|
|
142
|
+
: probeReason(pass, signal, false, false),
|
|
143
|
+
text: weak.text,
|
|
144
|
+
raw: weak.raw,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
...base,
|
|
149
|
+
pass: false,
|
|
150
|
+
muxFailure: true,
|
|
151
|
+
latencyMs: elapsed(),
|
|
152
|
+
prompt: lastPrompt,
|
|
153
|
+
reason: probeReason(false, null, true, false),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
export function collectProbes(ctx) {
|
|
157
|
+
return Promise.all(PROBES.map((probe) => runProbe(ctx, probe)));
|
|
158
|
+
}
|
|
159
|
+
/** The probe that generated the most: the reply worth reading metadata from. */
|
|
160
|
+
export function richestProbe(probes) {
|
|
161
|
+
return probes.reduce((best, r) => (r.usage?.completion ?? 0) > (best?.usage?.completion ?? 0) ? r : best, null);
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=probe-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe-runner.js","sourceRoot":"","sources":["../../src/engine/probe-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Finding } from "../rules/types";
|
|
2
|
+
import type { VerifyVerdict } from "../types";
|
|
3
|
+
export type FoldedVerdict = {
|
|
4
|
+
verdict: VerifyVerdict;
|
|
5
|
+
reasons: string[];
|
|
6
|
+
/** Genuine by the probes alone: the version they name is never checked. */
|
|
7
|
+
versionUnverifiable: boolean;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Findings arrive in rule-table order, so the first one that is not a note
|
|
11
|
+
* decides. An evidence-layer finding therefore outranks the probe ladder, and
|
|
12
|
+
* within the ladder the earlier rule wins, exactly the old hand-ordered chain.
|
|
13
|
+
*/
|
|
14
|
+
export declare function foldVerdict(findings: readonly Finding[]): FoldedVerdict;
|
|
15
|
+
//# sourceMappingURL=verdict.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verdict.d.ts","sourceRoot":"","sources":["../../src/engine/verdict.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2EAA2E;IAC3E,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,aAAa,CAcvE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Findings arrive in rule-table order, so the first one that is not a note
|
|
3
|
+
* decides. An evidence-layer finding therefore outranks the probe ladder, and
|
|
4
|
+
* within the ladder the earlier rule wins, exactly the old hand-ordered chain.
|
|
5
|
+
*/
|
|
6
|
+
export function foldVerdict(findings) {
|
|
7
|
+
const first = findings.find((f) => f.severity !== "note");
|
|
8
|
+
const verdict = !first
|
|
9
|
+
? "genuine"
|
|
10
|
+
: first.severity === "inconclusive"
|
|
11
|
+
? "unverified"
|
|
12
|
+
: "suspicious";
|
|
13
|
+
return {
|
|
14
|
+
verdict,
|
|
15
|
+
reasons: first ? [first.reason] : [],
|
|
16
|
+
versionUnverifiable: !findings.some((f) => f.layer === "probe" && f.severity !== "note"),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=verdict.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verdict.js","sourceRoot":"","sources":["../../src/engine/verdict.ts"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,QAA4B;IACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAkB,CAAC,KAAK;QACnC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,cAAc;YACjC,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,YAAY,CAAC;IACnB,OAAO;QACL,OAAO;QACP,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QACpC,mBAAmB,EAAE,CAAC,QAAQ,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CACpD;KACF,CAAC;AACJ,CAAC"}
|
package/dist/highlight.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { VerifyProvider } from "./types";
|
|
2
1
|
export type HighlightKind = "foreign" | "cjk" | "coding-tool" | "scam" | "home" | null;
|
|
3
2
|
export type HighlightSegment = {
|
|
4
3
|
text: string;
|
|
5
4
|
kind: HighlightKind;
|
|
6
5
|
};
|
|
7
|
-
|
|
6
|
+
/** Marks the phrases the signals react to, for a UI to colour a reply. */
|
|
7
|
+
export declare function highlightSpans(text: string, vendorId: string, probeLabel: string): HighlightSegment[];
|
|
8
8
|
//# sourceMappingURL=highlight.d.ts.map
|
package/dist/highlight.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../src/highlight.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../src/highlight.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,aAAa,GACvB,SAAS,GAAG,KAAK,GAAG,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAE7D,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAwBrE,0EAA0E;AAC1E,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,gBAAgB,EAAE,CA6CpB"}
|
package/dist/highlight.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { VENDORS, vendorFor } from "./vendors/table";
|
|
2
|
+
import { CJK_CHAR, CODING_TOOL_NAMES, CODING_TOOL_REFUSAL_PATTERNS, SCAM_PAGE_PATTERNS, } from "./identity/patterns";
|
|
3
3
|
function collectPhrase(lower, phrases, kind) {
|
|
4
4
|
const out = [];
|
|
5
5
|
for (const phrase of phrases) {
|
|
@@ -17,23 +17,24 @@ function collectPhrase(lower, phrases, kind) {
|
|
|
17
17
|
}
|
|
18
18
|
return out;
|
|
19
19
|
}
|
|
20
|
-
|
|
20
|
+
/** Marks the phrases the signals react to, for a UI to colour a reply. */
|
|
21
|
+
export function highlightSpans(text, vendorId, probeLabel) {
|
|
21
22
|
if (!text)
|
|
22
23
|
return [];
|
|
23
|
-
const
|
|
24
|
-
if (!
|
|
24
|
+
const wire = vendorFor(VENDORS, vendorId);
|
|
25
|
+
if (!wire)
|
|
25
26
|
return [{ text, kind: null }];
|
|
26
27
|
const lower = text.toLowerCase();
|
|
27
28
|
const matches = [
|
|
28
29
|
...collectPhrase(lower, CODING_TOOL_NAMES, "coding-tool"),
|
|
29
30
|
...collectPhrase(lower, CODING_TOOL_REFUSAL_PATTERNS, "coding-tool"),
|
|
30
31
|
...collectPhrase(lower, SCAM_PAGE_PATTERNS, "scam"),
|
|
31
|
-
...collectPhrase(lower,
|
|
32
|
-
...collectPhrase(lower,
|
|
33
|
-
...collectPhrase(lower,
|
|
32
|
+
...collectPhrase(lower, wire.identity.foreign, "foreign"),
|
|
33
|
+
...collectPhrase(lower, wire.identity.home, "home"),
|
|
34
|
+
...collectPhrase(lower, wire.identity.homeModelNames, "home"),
|
|
34
35
|
];
|
|
35
36
|
if (probeLabel === "model-name")
|
|
36
|
-
matches.push(...collectPhrase(lower,
|
|
37
|
+
matches.push(...collectPhrase(lower, wire.identity.cloudModelNames, "foreign"));
|
|
37
38
|
for (const m of text.matchAll(CJK_CHAR))
|
|
38
39
|
if (m.index !== undefined)
|
|
39
40
|
matches.push({ start: m.index, end: m.index + m[0].length, kind: "cjk" });
|
package/dist/highlight.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"highlight.js","sourceRoot":"","sources":["../src/highlight.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,
|
|
1
|
+
{"version":3,"file":"highlight.js","sourceRoot":"","sources":["../src/highlight.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
export declare const CODING_TOOL_REFUSAL_PATTERNS: string[];
|
|
2
|
+
/**
|
|
3
|
+
* Matched on word boundaries: these are single common-ish words, and substring
|
|
4
|
+
* matching condemned a real haiku ("golden light cascades" contains "cascade")
|
|
5
|
+
* on an otherwise clean opus-4.8 lane. The refusal PHRASES stay substring
|
|
6
|
+
* matched, being long enough not to collide.
|
|
7
|
+
*/
|
|
2
8
|
export declare const CODING_TOOL_NAMES: string[];
|
|
3
9
|
export declare const SCAM_PAGE_PATTERNS: string[];
|
|
4
10
|
export declare const VENDOR_PATTERNS: {
|
|
@@ -12,5 +18,6 @@ export declare function foreignPatternsExcept(home: VendorKey): string[];
|
|
|
12
18
|
export declare const CLOUD_HOST_PATTERNS: string[];
|
|
13
19
|
export declare const FAKE_RESPONSE_SIGNATURES: string[];
|
|
14
20
|
export declare const CJK_CHAR: RegExp;
|
|
21
|
+
/** A couple of incidental glyphs (a quoted loanword) are tolerated. */
|
|
15
22
|
export declare const CJK_LEAK_MIN_CHARS = 4;
|
|
16
23
|
//# sourceMappingURL=patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../src/identity/patterns.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,UA2BxC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,UAAiC,CAAC;AAEhE,eAAO,MAAM,kBAAkB,UAM9B,CAAC;AAEF,eAAO,MAAM,eAAe;aAC1B,SAAS,YAAG,WAAW,EAAE,QAAQ;aACjC,MAAM,YAAG,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;aAC5E,MAAM,YAAG,QAAQ,EAAE,UAAU,EAAE,QAAQ;aACvC,KAAK,YACH,UAAU,EACV,MAAM,EACN,UAAU,EACV,MAAM,EACN,SAAS,EACT,OAAO,EACP,MAAM,EACN,MAAM,EACN,KAAK,EACL,OAAO;CAED,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,eAAe,CAAC;AAErD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,EAAE,CAK/D;AAGD,eAAO,MAAM,mBAAmB,UAA6E,CAAC;AAE9G,eAAO,MAAM,wBAAwB,UAA0B,CAAC;AAEhE,eAAO,MAAM,QAAQ,QAAuB,CAAC;AAE7C,uEAAuE;AACvE,eAAO,MAAM,kBAAkB,IAAI,CAAC"}
|
|
@@ -26,6 +26,12 @@ export const CODING_TOOL_REFUSAL_PATTERNS = [
|
|
|
26
26
|
"development workflows, cli commands",
|
|
27
27
|
"here to help with coding, development workflows",
|
|
28
28
|
];
|
|
29
|
+
/**
|
|
30
|
+
* Matched on word boundaries: these are single common-ish words, and substring
|
|
31
|
+
* matching condemned a real haiku ("golden light cascades" contains "cascade")
|
|
32
|
+
* on an otherwise clean opus-4.8 lane. The refusal PHRASES stay substring
|
|
33
|
+
* matched, being long enough not to collide.
|
|
34
|
+
*/
|
|
29
35
|
export const CODING_TOOL_NAMES = ["kiro", "cascade", "codeium"];
|
|
30
36
|
export const SCAM_PAGE_PATTERNS = [
|
|
31
37
|
"token被盗",
|
|
@@ -59,5 +65,6 @@ export function foreignPatternsExcept(home) {
|
|
|
59
65
|
export const CLOUD_HOST_PATTERNS = ["amazon", "aws", "bedrock", "google", "vertex", "microsoft", "azure", "foundry"];
|
|
60
66
|
export const FAKE_RESPONSE_SIGNATURES = ["claude sonnet (4.0)"];
|
|
61
67
|
export const CJK_CHAR = /[-ヿ㐀-䶿一-鿿豈-가-]/g;
|
|
68
|
+
/** A couple of incidental glyphs (a quoted loanword) are tolerated. */
|
|
62
69
|
export const CJK_LEAK_MIN_CHARS = 4;
|
|
63
70
|
//# sourceMappingURL=patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/identity/patterns.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,yBAAyB;IACzB,uCAAuC;IACvC,mCAAmC;IACnC,8BAA8B;IAC9B,mCAAmC;IACnC,uCAAuC;IACvC,gCAAgC;IAChC,wBAAwB;IACxB,sCAAsC;IACtC,kCAAkC;IAClC,oCAAoC;IACpC,qCAAqC;IACrC,4CAA4C;IAC5C,sCAAsC;IACtC,6CAA6C;IAC7C,+BAA+B;IAC/B,wCAAwC;IACxC,2BAA2B;IAC3B,kBAAkB;IAClB,wBAAwB;IACxB,yBAAyB;IACzB,gCAAgC;IAChC,qBAAqB;IACrB,WAAW;IACX,qCAAqC;IACrC,iDAAiD;CAClD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,SAAS;IACT,WAAW;IACX,SAAS;IACT,SAAS;IACT,SAAS;CACV,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,SAAS,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;IAClC,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;IAC7E,MAAM,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC;IACxC,KAAK,EAAE;QACL,UAAU;QACV,MAAM;QACN,UAAU;QACV,MAAM;QACN,SAAS;QACT,OAAO;QACP,MAAM;QACN,MAAM;QACN,KAAK;QACL,OAAO;KACR;CACO,CAAC;AAIX,MAAM,UAAU,qBAAqB,CAAC,IAAe;IACnD,MAAM,IAAI,GAAgB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CAC3D,CAAC,CAAC,EAAkB,EAAE,CAAC,CAAC,IAAI,eAAe,CAC5C,CAAC;IACF,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,kBAAkB;AAClB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAC,KAAK,EAAC,SAAS,EAAC,QAAQ,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,SAAS,CAAC,CAAC;AAE9G,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,QAAQ,GAAG,oBAAoB,CAAC;AAE7C,uEAAuE;AACvE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ProbeLabel, ProbeSignal } from "../probes/table";
|
|
2
|
+
import type { VendorIdentity } from "../vendors/types";
|
|
3
|
+
export declare const includesAny: (text: string, patterns: readonly string[]) => boolean;
|
|
4
|
+
export declare const hasCodingToolRefusal: (text: string) => boolean;
|
|
5
|
+
export declare const hasScamPage: (text: string) => boolean;
|
|
6
|
+
/**
|
|
7
|
+
* English prompts expect English answers; a substituted or distilled Chinese
|
|
8
|
+
* model (or a corrupting proxy) leaks CJK into the reply even when it has
|
|
9
|
+
* learned to say "anthropic".
|
|
10
|
+
*/
|
|
11
|
+
export declare function cjkLeak(text: string): boolean;
|
|
12
|
+
export declare function hasForeignIdentity(text: string, identity: VendorIdentity, probe: ProbeLabel): boolean;
|
|
13
|
+
export declare function detectSignal(text: string, probe: ProbeLabel, identity: VendorIdentity): ProbeSignal;
|
|
14
|
+
export declare function isTransientError(msg: string): boolean;
|
|
15
|
+
//# sourceMappingURL=signals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../src/identity/signals.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,eAAO,MAAM,WAAW,SAAU,MAAM,YAAY,SAAS,MAAM,EAAE,YAC7B,CAAC;AAKzC,eAAO,MAAM,oBAAoB,SAAU,MAAM,YAEA,CAAC;AAElD,eAAO,MAAM,WAAW,SAAU,MAAM,YACD,CAAC;AAExC;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG7C;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,UAAU,GAChB,OAAO,CAKT;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,cAAc,GACvB,WAAW,CAeb;AAID,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAYrD"}
|
|
@@ -1,35 +1,26 @@
|
|
|
1
1
|
import { CJK_CHAR, CJK_LEAK_MIN_CHARS, CLOUD_HOST_PATTERNS, CODING_TOOL_NAMES, CODING_TOOL_REFUSAL_PATTERNS, SCAM_PAGE_PATTERNS, } from "./patterns";
|
|
2
2
|
export const includesAny = (text, patterns) => patterns.some((p) => text.includes(p));
|
|
3
|
-
|
|
3
|
+
const includesAnyWord = (text, words) => words.some((w) => new RegExp(`\\b${w}\\b`).test(text));
|
|
4
|
+
export const hasCodingToolRefusal = (text) => includesAnyWord(text, CODING_TOOL_NAMES) ||
|
|
4
5
|
includesAny(text, CODING_TOOL_REFUSAL_PATTERNS);
|
|
5
6
|
export const hasScamPage = (text) => includesAny(text, SCAM_PAGE_PATTERNS);
|
|
7
|
+
/**
|
|
8
|
+
* English prompts expect English answers; a substituted or distilled Chinese
|
|
9
|
+
* model (or a corrupting proxy) leaks CJK into the reply even when it has
|
|
10
|
+
* learned to say "anthropic".
|
|
11
|
+
*/
|
|
6
12
|
export function cjkLeak(text) {
|
|
7
13
|
const m = text.match(CJK_CHAR);
|
|
8
14
|
return m !== null && m.length >= CJK_LEAK_MIN_CHARS;
|
|
9
15
|
}
|
|
10
|
-
export function hasForeignIdentity(text,
|
|
11
|
-
if (includesAny(text,
|
|
16
|
+
export function hasForeignIdentity(text, identity, probe) {
|
|
17
|
+
if (includesAny(text, identity.foreign))
|
|
12
18
|
return true;
|
|
13
|
-
if (probe === "model-name" && includesAny(text,
|
|
19
|
+
if (probe === "model-name" && includesAny(text, identity.cloudModelNames))
|
|
14
20
|
return true;
|
|
15
21
|
return false;
|
|
16
22
|
}
|
|
17
|
-
export function
|
|
18
|
-
const found = tiers.filter((tier) => text.includes(tier));
|
|
19
|
-
return found.length === 1 ? found[0] : null;
|
|
20
|
-
}
|
|
21
|
-
export function detectTierMismatch(requestedModel, modelNameText, tiers) {
|
|
22
|
-
const reqTier = tierOf(requestedModel.toLowerCase(), tiers);
|
|
23
|
-
if (!reqTier)
|
|
24
|
-
return null;
|
|
25
|
-
if (!modelNameText)
|
|
26
|
-
return null;
|
|
27
|
-
const saidTier = tierOf(modelNameText, tiers);
|
|
28
|
-
if (saidTier && saidTier !== reqTier)
|
|
29
|
-
return saidTier;
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
export function detectSignal(text, probeLabel, foreignPatterns, cloudModelNamePatterns, acceptsCloudHostIdentity) {
|
|
23
|
+
export function detectSignal(text, probe, identity) {
|
|
33
24
|
if (text.length === 0)
|
|
34
25
|
return "blank";
|
|
35
26
|
if (hasCodingToolRefusal(text))
|
|
@@ -38,11 +29,11 @@ export function detectSignal(text, probeLabel, foreignPatterns, cloudModelNamePa
|
|
|
38
29
|
return "scam";
|
|
39
30
|
if (cjkLeak(text))
|
|
40
31
|
return "cjk-leak";
|
|
41
|
-
if (
|
|
42
|
-
if (hasForeignIdentity(text,
|
|
32
|
+
if (probe === "identity" || probe === "model-name") {
|
|
33
|
+
if (hasForeignIdentity(text, identity, probe))
|
|
43
34
|
return "foreign";
|
|
44
|
-
if (
|
|
45
|
-
|
|
35
|
+
if (probe === "identity" &&
|
|
36
|
+
identity.acceptsCloudHost &&
|
|
46
37
|
includesAny(text, CLOUD_HOST_PATTERNS))
|
|
47
38
|
return "cloud-host";
|
|
48
39
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signals.js","sourceRoot":"","sources":["../../src/identity/signals.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
export * from "./types";
|
|
2
|
-
export
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
export
|
|
2
|
+
export { verify, runRules, verifyWith, runRulesWith, callWire } from "./verify";
|
|
3
|
+
export type { Registry } from "./verify";
|
|
4
|
+
export { createVerifier } from "./registry";
|
|
5
|
+
export { defineVendor } from "./vendors/types";
|
|
6
|
+
export type { VendorAdapter, VendorIdentity, WireCtx, ChatRequest, ChatMessage, CountRequest, BuiltRequest, ProbeMeta, EnvelopeShape, } from "./vendors/types";
|
|
7
|
+
export { VENDORS, vendorFor } from "./vendors/table";
|
|
8
|
+
export { defineRule } from "./rules/types";
|
|
9
|
+
export type { Rule, RuleCtx, RuleLayer, RuleVerdict, Finding, Severity, Reports, } from "./rules/types";
|
|
10
|
+
export { RULES, DETECTION_RULES, DETECTION_EXCEPTIONS, RULE_FOR_SIGNAL, } from "./rules/table";
|
|
11
|
+
export type { VerdictRuleId, DetectionExceptionId } from "./rules/table";
|
|
12
|
+
export type { EvidenceBag, EvidenceKey } from "./engine/evidence";
|
|
13
|
+
export { defineModelFacts, resolveModelFacts } from "./models/facts";
|
|
14
|
+
export type { ModelFacts, FactsEntry } from "./models/facts";
|
|
15
|
+
export { PROBES, PROBE_SIGNALS } from "./probes/table";
|
|
6
16
|
export type { TransportFn, TransportArgs, TransportResult } from "./transport";
|
|
7
|
-
export
|
|
17
|
+
export { directTransport, browserTransport } from "./transport";
|
|
8
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAChF,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EACV,aAAa,EACb,cAAc,EACd,OAAO,EACP,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EACV,IAAI,EACJ,OAAO,EACP,SAAS,EACT,WAAW,EACX,OAAO,EACP,QAAQ,EACR,OAAO,GACR,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,KAAK,EACL,eAAe,EACf,oBAAoB,EACpB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACzE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACrE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
|
-
// Root export:
|
|
2
|
-
// have their own entry points
|
|
1
|
+
// Root export: the engine, the tables and every type. Vendors, rules, models,
|
|
2
|
+
// transport and highlight have their own entry points for consumers that only
|
|
3
|
+
// want a piece.
|
|
3
4
|
export * from "./types";
|
|
4
|
-
export
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
5
|
+
export { verify, runRules, verifyWith, runRulesWith, callWire } from "./verify";
|
|
6
|
+
export { createVerifier } from "./registry";
|
|
7
|
+
export { defineVendor } from "./vendors/types";
|
|
8
|
+
export { VENDORS, vendorFor } from "./vendors/table";
|
|
9
|
+
export { defineRule } from "./rules/types";
|
|
10
|
+
export { RULES, DETECTION_RULES, DETECTION_EXCEPTIONS, RULE_FOR_SIGNAL, } from "./rules/table";
|
|
11
|
+
export { defineModelFacts, resolveModelFacts } from "./models/facts";
|
|
12
|
+
export { PROBES, PROBE_SIGNALS } from "./probes/table";
|
|
13
|
+
export { directTransport, browserTransport } from "./transport";
|
|
7
14
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,8EAA8E;AAC9E,gBAAgB;AAChB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEhF,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAY/C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAU3C,OAAO,EACL,KAAK,EACL,eAAe,EACf,oBAAoB,EACpB,eAAe,GAChB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAErE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/internal/utils.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export declare function isRecord(v: unknown): v is Record<string, unknown>;
|
|
2
2
|
export declare function rec(v: unknown): Record<string, unknown> | undefined;
|
|
3
|
-
export declare function isOneOf<const T extends readonly unknown[]>(values: T): (v: unknown) => v is T[number];
|
|
4
3
|
export declare function errMessage(err: unknown): string;
|
|
5
4
|
export declare function sleep(ms: number): Promise<void>;
|
|
5
|
+
/** Rejects booleans and floats: usage counts are whole tokens or nothing. */
|
|
6
|
+
export declare function intOf(v: unknown): number | null;
|
|
7
|
+
export declare function hostOf(url: string): string;
|
|
6
8
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEjE;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAEnE;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAE/C;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,6EAA6E;AAC7E,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM1C"}
|
package/dist/internal/utils.js
CHANGED
|
@@ -1,19 +1,25 @@
|
|
|
1
|
-
// Vendored from unorouter's src/lib/utils/base.ts so the package stays
|
|
2
|
-
// dependency-free. Four helpers, copied verbatim; keep them in step if the
|
|
3
|
-
// originals change.
|
|
4
1
|
export function isRecord(v) {
|
|
5
2
|
return !!v && typeof v === "object" && !Array.isArray(v);
|
|
6
3
|
}
|
|
7
4
|
export function rec(v) {
|
|
8
5
|
return isRecord(v) ? v : undefined;
|
|
9
6
|
}
|
|
10
|
-
export function isOneOf(values) {
|
|
11
|
-
return (v) => values.some((x) => x === v);
|
|
12
|
-
}
|
|
13
7
|
export function errMessage(err) {
|
|
14
8
|
return err instanceof Error ? err.message : String(err);
|
|
15
9
|
}
|
|
16
10
|
export function sleep(ms) {
|
|
17
11
|
return new Promise((r) => setTimeout(r, ms));
|
|
18
12
|
}
|
|
13
|
+
/** Rejects booleans and floats: usage counts are whole tokens or nothing. */
|
|
14
|
+
export function intOf(v) {
|
|
15
|
+
return typeof v === "number" && Number.isInteger(v) && v >= 0 ? v : null;
|
|
16
|
+
}
|
|
17
|
+
export function hostOf(url) {
|
|
18
|
+
try {
|
|
19
|
+
return new URL(url).host;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return url;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
19
25
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,CAAU;IACjC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,CAAU;IAC5B,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,KAAK,CAAC,CAAU;IAC9B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,GAAW;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type VendorId } from "../vendors/table";
|
|
2
|
+
/** Models the tester offers by default, per wire. */
|
|
3
|
+
export declare const CURATED_MODELS: Record<VendorId, readonly string[]>;
|
|
4
|
+
export declare function vendorForModel(model: string): VendorId | null;
|
|
5
|
+
/** Display vendor for a row: the model's maker when known, else the wire's. */
|
|
6
|
+
export declare function vendorForRow(vendor: VendorId, model?: string): string;
|
|
7
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/models/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGrE,qDAAqD;AACrD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAU9D,CAAC;AAEF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAE7D;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAGrE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { VENDORS, vendorFor } from "../vendors/table";
|
|
2
|
+
import { resolveModelFacts } from "./facts";
|
|
3
|
+
/** Models the tester offers by default, per wire. */
|
|
4
|
+
export const CURATED_MODELS = {
|
|
5
|
+
anthropic: [
|
|
6
|
+
"claude-opus-4-6",
|
|
7
|
+
"claude-opus-4-7",
|
|
8
|
+
"claude-opus-4-8",
|
|
9
|
+
"claude-sonnet-4-6",
|
|
10
|
+
"claude-haiku-4-5",
|
|
11
|
+
],
|
|
12
|
+
openai: ["gpt-5.5", "gpt-5.4", "gpt-5.1", "o3", "o4-mini"],
|
|
13
|
+
gemini: ["gemini-3.1-pro-preview", "gemini-3.1-flash", "gemini-2.5-pro"],
|
|
14
|
+
};
|
|
15
|
+
export function vendorForModel(model) {
|
|
16
|
+
return resolveModelFacts(model).vendor;
|
|
17
|
+
}
|
|
18
|
+
/** Display vendor for a row: the model's maker when known, else the wire's. */
|
|
19
|
+
export function vendorForRow(vendor, model) {
|
|
20
|
+
const id = (model ? vendorForModel(model) : null) ?? vendor;
|
|
21
|
+
return vendorFor(VENDORS, id)?.vendorName ?? id;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/models/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAiB,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE5C,qDAAqD;AACrD,MAAM,CAAC,MAAM,cAAc,GAAwC;IACjE,SAAS,EAAE;QACT,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,mBAAmB;QACnB,kBAAkB;KACnB;IACD,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC;IAC1D,MAAM,EAAE,CAAC,wBAAwB,EAAE,kBAAkB,EAAE,gBAAgB,CAAC;CACzE,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;AACzC,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,YAAY,CAAC,MAAgB,EAAE,KAAc;IAC3D,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;IAC5D,OAAO,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;AAClD,CAAC"}
|