@unorouter/verify-core 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.
Files changed (79) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +36 -0
  3. package/dist/handshake.d.ts +23 -0
  4. package/dist/handshake.d.ts.map +1 -0
  5. package/dist/handshake.js +90 -0
  6. package/dist/handshake.js.map +1 -0
  7. package/dist/highlight.d.ts +8 -0
  8. package/dist/highlight.d.ts.map +1 -0
  9. package/dist/highlight.js +63 -0
  10. package/dist/highlight.js.map +1 -0
  11. package/dist/index.d.ts +7 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +7 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/internal/utils.d.ts +6 -0
  16. package/dist/internal/utils.d.ts.map +1 -0
  17. package/dist/internal/utils.js +19 -0
  18. package/dist/internal/utils.js.map +1 -0
  19. package/dist/models.d.ts +5 -0
  20. package/dist/models.d.ts.map +1 -0
  21. package/dist/models.js +54 -0
  22. package/dist/models.js.map +1 -0
  23. package/dist/nonce.d.ts +4 -0
  24. package/dist/nonce.d.ts.map +1 -0
  25. package/dist/nonce.js +12 -0
  26. package/dist/nonce.js.map +1 -0
  27. package/dist/patterns.d.ts +16 -0
  28. package/dist/patterns.d.ts.map +1 -0
  29. package/dist/patterns.js +63 -0
  30. package/dist/patterns.js.map +1 -0
  31. package/dist/probes.d.ts +10 -0
  32. package/dist/probes.d.ts.map +1 -0
  33. package/dist/probes.js +54 -0
  34. package/dist/probes.js.map +1 -0
  35. package/dist/providers/anthropic.d.ts +3 -0
  36. package/dist/providers/anthropic.d.ts.map +1 -0
  37. package/dist/providers/anthropic.js +70 -0
  38. package/dist/providers/anthropic.js.map +1 -0
  39. package/dist/providers/config.d.ts +34 -0
  40. package/dist/providers/config.d.ts.map +1 -0
  41. package/dist/providers/config.js +14 -0
  42. package/dist/providers/config.js.map +1 -0
  43. package/dist/providers/gemini.d.ts +3 -0
  44. package/dist/providers/gemini.d.ts.map +1 -0
  45. package/dist/providers/gemini.js +58 -0
  46. package/dist/providers/gemini.js.map +1 -0
  47. package/dist/providers/openai.d.ts +3 -0
  48. package/dist/providers/openai.d.ts.map +1 -0
  49. package/dist/providers/openai.js +56 -0
  50. package/dist/providers/openai.js.map +1 -0
  51. package/dist/rules.d.ts +6 -0
  52. package/dist/rules.d.ts.map +1 -0
  53. package/dist/rules.js +28 -0
  54. package/dist/rules.js.map +1 -0
  55. package/dist/runner.d.ts +12 -0
  56. package/dist/runner.d.ts.map +1 -0
  57. package/dist/runner.js +256 -0
  58. package/dist/runner.js.map +1 -0
  59. package/dist/signals.d.ts +11 -0
  60. package/dist/signals.d.ts.map +1 -0
  61. package/dist/signals.js +64 -0
  62. package/dist/signals.js.map +1 -0
  63. package/dist/substitution.d.ts +24 -0
  64. package/dist/substitution.d.ts.map +1 -0
  65. package/dist/substitution.js +35 -0
  66. package/dist/substitution.js.map +1 -0
  67. package/dist/transport.d.ts +17 -0
  68. package/dist/transport.d.ts.map +1 -0
  69. package/dist/transport.js +79 -0
  70. package/dist/transport.js.map +1 -0
  71. package/dist/types.d.ts +43 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/dist/types.js +2 -0
  74. package/dist/types.js.map +1 -0
  75. package/dist/verdict.d.ts +19 -0
  76. package/dist/verdict.d.ts.map +1 -0
  77. package/dist/verdict.js +84 -0
  78. package/dist/verdict.js.map +1 -0
  79. package/package.json +44 -0
@@ -0,0 +1,70 @@
1
+ import { rec } from "../internal/utils";
2
+ import { foreignPatternsExcept } from "../patterns";
3
+ import { normalizeProbeBaseUrl, } from "./config";
4
+ function isAnthropicHost(baseUrl) {
5
+ try {
6
+ return new URL(baseUrl).host.endsWith("api.anthropic.com");
7
+ }
8
+ catch {
9
+ return false;
10
+ }
11
+ }
12
+ function buildRequest(args) {
13
+ const headers = {
14
+ "content-type": "application/json",
15
+ "x-api-key": args.apiKey,
16
+ "anthropic-version": "2023-06-01",
17
+ };
18
+ if (args.direct && isAnthropicHost(args.baseUrl))
19
+ headers["anthropic-dangerous-direct-browser-access"] = "true";
20
+ return {
21
+ url: `${normalizeProbeBaseUrl(args.baseUrl)}/v1/messages`,
22
+ headers,
23
+ body: {
24
+ model: args.model,
25
+ max_tokens: args.maxTokens,
26
+ messages: [{ role: "user", content: args.prompt }],
27
+ },
28
+ };
29
+ }
30
+ function extractText(data) {
31
+ const d = rec(data) ?? {};
32
+ if (d.type === "error")
33
+ return null;
34
+ return (d.content ?? [])
35
+ .filter((b) => b.type === "text")
36
+ .map((b) => b.text ?? "")
37
+ .join(" ")
38
+ .toLowerCase();
39
+ }
40
+ function extractMeta(data) {
41
+ const d = rec(data) ?? {};
42
+ const u = d.usage;
43
+ const prompt = u?.input_tokens ?? null;
44
+ const completion = u?.output_tokens ?? null;
45
+ return {
46
+ detectedModel: d.model ?? null,
47
+ usage: u
48
+ ? {
49
+ prompt,
50
+ completion,
51
+ total: prompt !== null && completion !== null ? prompt + completion : null,
52
+ }
53
+ : null,
54
+ };
55
+ }
56
+ export const anthropicConfig = {
57
+ provider: "anthropic",
58
+ buildRequest,
59
+ extractText,
60
+ extractMeta,
61
+ homeIdentityPatterns: ["anthropic"],
62
+ foreignIdentityPatterns: foreignPatternsExcept("anthropic"),
63
+ homeModelNamePatterns: ["claude", "anthropic"],
64
+ cloudModelNamePatterns: ["amazon q", "q developer", "kiro"],
65
+ // `fable` is load-bearing: sync catches fable lanes served as sonnet, and a
66
+ // tier list missing it makes that substitution undetectable here.
67
+ tiers: ["opus", "sonnet", "haiku", "fable"],
68
+ acceptsCloudHostIdentity: true,
69
+ };
70
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { ProbeUsage, VerifyProvider } from "../types";
2
+ export type ProbeMeta = {
3
+ detectedModel: string | null;
4
+ usage: ProbeUsage | null;
5
+ };
6
+ export type ProbeRequestArgs = {
7
+ baseUrl: string;
8
+ apiKey: string;
9
+ model: string;
10
+ prompt: string;
11
+ maxTokens: number;
12
+ direct: boolean;
13
+ };
14
+ export type BuiltRequest = {
15
+ url: string;
16
+ headers: Record<string, string>;
17
+ body: unknown;
18
+ };
19
+ /** Providers append their own version segment, so a pasted one would double it. */
20
+ export declare function normalizeProbeBaseUrl(baseUrl: string): string;
21
+ export type ProviderConfig = {
22
+ provider: VerifyProvider;
23
+ buildRequest: (args: ProbeRequestArgs) => BuiltRequest;
24
+ extractText: (data: unknown) => string | null;
25
+ extractMeta: (data: unknown) => ProbeMeta;
26
+ homeIdentityPatterns: string[];
27
+ foreignIdentityPatterns: string[];
28
+ homeModelNamePatterns: string[];
29
+ cloudModelNamePatterns: string[];
30
+ tiers: readonly string[] | null;
31
+ acceptsCloudHostIdentity: boolean;
32
+ };
33
+ export declare const PROVIDER_CONFIGS: Record<VerifyProvider, ProviderConfig>;
34
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/providers/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAK3D,MAAM,MAAM,SAAS,GAAG;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAIF,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,YAAY,CAAC;IACvD,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9C,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,SAAS,CAAC;IAC1C,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAClC,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,wBAAwB,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,cAAc,EAAE,cAAc,CAInE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { anthropicConfig } from "./anthropic";
2
+ import { geminiConfig } from "./gemini";
3
+ import { openaiConfig } from "./openai";
4
+ const VERSION_SUFFIX = /\/(?:v\d+(?:alpha|beta)?)\/*$/i;
5
+ /** Providers append their own version segment, so a pasted one would double it. */
6
+ export function normalizeProbeBaseUrl(baseUrl) {
7
+ return baseUrl.trim().replace(/\/+$/, "").replace(VERSION_SUFFIX, "");
8
+ }
9
+ export const PROVIDER_CONFIGS = {
10
+ anthropic: anthropicConfig,
11
+ openai: openaiConfig,
12
+ gemini: geminiConfig,
13
+ };
14
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/providers/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAsBxC,MAAM,cAAc,GAAG,gCAAgC,CAAC;AAExD,mFAAmF;AACnF,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AACxE,CAAC;AAeD,MAAM,CAAC,MAAM,gBAAgB,GAA2C;IACtE,SAAS,EAAE,eAAe;IAC1B,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;CACrB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type ProviderConfig } from "./config";
2
+ export declare const geminiConfig: ProviderConfig;
3
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,UAAU,CAAC;AAyDlB,eAAO,MAAM,YAAY,EAAE,cAW1B,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { rec } from "../internal/utils";
2
+ import { foreignPatternsExcept } from "../patterns";
3
+ import { normalizeProbeBaseUrl, } from "./config";
4
+ const GEMINI_MIN_OUTPUT_TOKENS = 1024;
5
+ function buildRequest(args) {
6
+ return {
7
+ url: `${normalizeProbeBaseUrl(args.baseUrl)}/v1beta/models/${args.model}:generateContent`,
8
+ headers: {
9
+ "content-type": "application/json",
10
+ "x-goog-api-key": args.apiKey,
11
+ },
12
+ body: {
13
+ contents: [{ role: "user", parts: [{ text: args.prompt }] }],
14
+ generationConfig: {
15
+ maxOutputTokens: Math.max(args.maxTokens, GEMINI_MIN_OUTPUT_TOKENS),
16
+ },
17
+ },
18
+ };
19
+ }
20
+ function extractText(data) {
21
+ const d = rec(data) ?? {};
22
+ if (d.error)
23
+ return null;
24
+ const parts = d.candidates?.[0]?.content?.parts;
25
+ if (!parts)
26
+ return null;
27
+ return parts
28
+ .map((p) => p.text ?? "")
29
+ .join(" ")
30
+ .toLowerCase();
31
+ }
32
+ function extractMeta(data) {
33
+ const d = rec(data) ?? {};
34
+ const u = d.usageMetadata;
35
+ return {
36
+ detectedModel: d.modelVersion ?? null,
37
+ usage: u
38
+ ? {
39
+ prompt: u.promptTokenCount ?? null,
40
+ completion: u.candidatesTokenCount ?? null,
41
+ total: u.totalTokenCount ?? null,
42
+ }
43
+ : null,
44
+ };
45
+ }
46
+ export const geminiConfig = {
47
+ provider: "gemini",
48
+ buildRequest,
49
+ extractText,
50
+ extractMeta,
51
+ homeIdentityPatterns: ["google", "deepmind"],
52
+ foreignIdentityPatterns: foreignPatternsExcept("google"),
53
+ homeModelNamePatterns: ["gemini", "google"],
54
+ cloudModelNamePatterns: [],
55
+ tiers: null,
56
+ acceptsCloudHostIdentity: false,
57
+ };
58
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,qBAAqB,GAItB,MAAM,UAAU,CAAC;AAalB,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAEtC,SAAS,YAAY,CAAC,IAAsB;IAC1C,OAAO;QACL,GAAG,EAAE,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,IAAI,CAAC,KAAK,kBAAkB;QACzF,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,gBAAgB,EAAE,IAAI,CAAC,MAAM;SAC9B;QACD,IAAI,EAAE;YACJ,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;YAC5D,gBAAgB,EAAE;gBAChB,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC;aACpE;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAa;IAChC,MAAM,CAAC,GAAmB,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;SACxB,IAAI,CAAC,GAAG,CAAC;SACT,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,IAAa;IAChC,MAAM,CAAC,GAAmB,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC;IAC1B,OAAO;QACL,aAAa,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;QACrC,KAAK,EAAE,CAAC;YACN,CAAC,CAAC;gBACE,MAAM,EAAE,CAAC,CAAC,gBAAgB,IAAI,IAAI;gBAClC,UAAU,EAAE,CAAC,CAAC,oBAAoB,IAAI,IAAI;gBAC1C,KAAK,EAAE,CAAC,CAAC,eAAe,IAAI,IAAI;aACjC;YACH,CAAC,CAAC,IAAI;KACT,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,QAAQ,EAAE,QAAQ;IAClB,YAAY;IACZ,WAAW;IACX,WAAW;IACX,oBAAoB,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC5C,uBAAuB,EAAE,qBAAqB,CAAC,QAAQ,CAAC;IACxD,qBAAqB,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC3C,sBAAsB,EAAE,EAAE;IAC1B,KAAK,EAAE,IAAI;IACX,wBAAwB,EAAE,KAAK;CAChC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type ProviderConfig } from "./config";
2
+ export declare const openaiConfig: ProviderConfig;
3
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,UAAU,CAAC;AAwDlB,eAAO,MAAM,YAAY,EAAE,cAW1B,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { rec } from "../internal/utils";
2
+ import { foreignPatternsExcept } from "../patterns";
3
+ import { normalizeProbeBaseUrl, } from "./config";
4
+ const REASONING_MIN_OUTPUT_TOKENS = 2000;
5
+ const REASONING_MODEL = /^(?:o[1-9]|gpt-5)/i;
6
+ function buildRequest(args) {
7
+ const maxCompletionTokens = REASONING_MODEL.test(args.model)
8
+ ? Math.max(args.maxTokens, REASONING_MIN_OUTPUT_TOKENS)
9
+ : args.maxTokens;
10
+ return {
11
+ url: `${normalizeProbeBaseUrl(args.baseUrl)}/v1/chat/completions`,
12
+ headers: {
13
+ "content-type": "application/json",
14
+ authorization: `Bearer ${args.apiKey}`,
15
+ },
16
+ body: {
17
+ model: args.model,
18
+ max_completion_tokens: maxCompletionTokens,
19
+ messages: [{ role: "user", content: args.prompt }],
20
+ },
21
+ };
22
+ }
23
+ function extractText(data) {
24
+ const d = rec(data) ?? {};
25
+ if (d.error)
26
+ return null;
27
+ const content = d.choices?.[0]?.message?.content;
28
+ return typeof content === "string" ? content.toLowerCase() : null;
29
+ }
30
+ function extractMeta(data) {
31
+ const d = rec(data) ?? {};
32
+ const u = d.usage;
33
+ return {
34
+ detectedModel: d.model ?? null,
35
+ usage: u
36
+ ? {
37
+ prompt: u.prompt_tokens ?? null,
38
+ completion: u.completion_tokens ?? null,
39
+ total: u.total_tokens ?? null,
40
+ }
41
+ : null,
42
+ };
43
+ }
44
+ export const openaiConfig = {
45
+ provider: "openai",
46
+ buildRequest,
47
+ extractText,
48
+ extractMeta,
49
+ homeIdentityPatterns: ["openai"],
50
+ foreignIdentityPatterns: foreignPatternsExcept("openai"),
51
+ homeModelNamePatterns: ["gpt", "openai", "o1", "o3", "o4"],
52
+ cloudModelNamePatterns: [],
53
+ tiers: null,
54
+ acceptsCloudHostIdentity: false,
55
+ };
56
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,qBAAqB,GAItB,MAAM,UAAU,CAAC;AAalB,MAAM,2BAA2B,GAAG,IAAI,CAAC;AACzC,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAE7C,SAAS,YAAY,CAAC,IAAsB;IAC1C,MAAM,mBAAmB,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC1D,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,2BAA2B,CAAC;QACvD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;IACnB,OAAO;QACL,GAAG,EAAE,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB;QACjE,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;SACvC;QACD,IAAI,EAAE;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,qBAAqB,EAAE,mBAAmB;YAC1C,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;SACnD;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAa;IAChC,MAAM,CAAC,GAAuB,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;IACjD,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACpE,CAAC;AAED,SAAS,WAAW,CAAC,IAAa;IAChC,MAAM,CAAC,GAAuB,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IAClB,OAAO;QACL,aAAa,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;QAC9B,KAAK,EAAE,CAAC;YACN,CAAC,CAAC;gBACE,MAAM,EAAE,CAAC,CAAC,aAAa,IAAI,IAAI;gBAC/B,UAAU,EAAE,CAAC,CAAC,iBAAiB,IAAI,IAAI;gBACvC,KAAK,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;aAC9B;YACH,CAAC,CAAC,IAAI;KACT,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,QAAQ,EAAE,QAAQ;IAClB,YAAY;IACZ,WAAW;IACX,WAAW;IACX,oBAAoB,EAAE,CAAC,QAAQ,CAAC;IAChC,uBAAuB,EAAE,qBAAqB,CAAC,QAAQ,CAAC;IACxD,qBAAqB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC1D,sBAAsB,EAAE,EAAE;IAC1B,KAAK,EAAE,IAAI;IACX,wBAAwB,EAAE,KAAK;CAChC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type DetectionRuleId = "coding-tool" | "scam" | "cjk-leak" | "mux" | "foreign" | "tier-mismatch" | "substituted";
2
+ export declare const DETECTION_RULES: readonly DetectionRuleId[];
3
+ export type DetectionExceptionId = "version" | "transient" | "cloud-host" | "reshaping" | "threshold";
4
+ export declare const DETECTION_EXCEPTIONS: readonly DetectionExceptionId[];
5
+ export declare function ruleIdForSignal(signal: string): DetectionRuleId | null;
6
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GACvB,aAAa,GACb,MAAM,GACN,UAAU,GACV,KAAK,GACL,SAAS,GACT,eAAe,GACf,aAAa,CAAC;AAElB,eAAO,MAAM,eAAe,EAAE,SAAS,eAAe,EAQrD,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAC9B,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,CAAC;AAErE,eAAO,MAAM,oBAAoB,EAAE,SAAS,oBAAoB,EAM/D,CAAC;AAEF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAMtE"}
package/dist/rules.js ADDED
@@ -0,0 +1,28 @@
1
+ export const DETECTION_RULES = [
2
+ "coding-tool",
3
+ "scam",
4
+ "cjk-leak",
5
+ "mux",
6
+ "foreign",
7
+ "tier-mismatch",
8
+ "substituted",
9
+ ];
10
+ export const DETECTION_EXCEPTIONS = [
11
+ "version",
12
+ "transient",
13
+ "cloud-host",
14
+ "reshaping",
15
+ "threshold",
16
+ ];
17
+ export function ruleIdForSignal(signal) {
18
+ if (signal === "coding-tool")
19
+ return "coding-tool";
20
+ if (signal === "scam")
21
+ return "scam";
22
+ if (signal === "cjk-leak")
23
+ return "cjk-leak";
24
+ if (signal === "foreign")
25
+ return "foreign";
26
+ return null;
27
+ }
28
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,eAAe,GAA+B;IACzD,aAAa;IACb,MAAM;IACN,UAAU;IACV,KAAK;IACL,SAAS;IACT,eAAe;IACf,aAAa;CACd,CAAC;AAKF,MAAM,CAAC,MAAM,oBAAoB,GAAoC;IACnE,SAAS;IACT,WAAW;IACX,YAAY;IACZ,WAAW;IACX,WAAW;CACZ,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,IAAI,MAAM,KAAK,aAAa;QAAE,OAAO,aAAa,CAAC;IACnD,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACrC,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAC7C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type TransportFn } from "./transport";
2
+ import type { TransportMode, VerifyProvider, VerifyResult } from "./types";
3
+ export declare function runVerification(opts: {
4
+ provider: VerifyProvider;
5
+ baseUrl: string;
6
+ apiKey: string;
7
+ model: string;
8
+ mode: TransportMode;
9
+ timeoutMs?: number;
10
+ transport?: TransportFn;
11
+ }): Promise<VerifyResult>;
12
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,KAAK,EAEV,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,SAAS,CAAC;AAqOjB,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,WAAW,CAAC;CACzB,GAAG,OAAO,CAAC,YAAY,CAAC,CA4ExB"}
package/dist/runner.js ADDED
@@ -0,0 +1,256 @@
1
+ import { sleep } from "./internal/utils";
2
+ import { echoesNonce, makeNonce } from "./nonce";
3
+ import { runHandshake } from "./handshake";
4
+ import { PROBES } from "./probes";
5
+ import { PROVIDER_CONFIGS } from "./providers/config";
6
+ import { detectSignal, isTransientError } from "./signals";
7
+ import { probeTransport } from "./transport";
8
+ import { aggregateVerdict, probeReason } from "./verdict";
9
+ const NONCE_MISMATCH_RETRIES = 2;
10
+ const NONCE_MISMATCH_BACKOFF_MS = 500;
11
+ const DEFAULT_TIMEOUT_MS = 30_000;
12
+ const RESPONSE_CAP = 2000;
13
+ const cap = (text) => text.length > RESPONSE_CAP ? `${text.slice(0, RESPONSE_CAP)}...` : text;
14
+ async function runProbe(args) {
15
+ const probe = args.probe;
16
+ const started = performance.now();
17
+ let lastPrompt = "";
18
+ let weakNonce = null;
19
+ for (let attempt = 0; attempt <= NONCE_MISMATCH_RETRIES; attempt++) {
20
+ if (attempt > 0)
21
+ await sleep(NONCE_MISMATCH_BACKOFF_MS);
22
+ const nonce = makeNonce();
23
+ lastPrompt = probe.buildPrompt(nonce);
24
+ const built = args.cfg.buildRequest({
25
+ baseUrl: args.baseUrl,
26
+ apiKey: args.apiKey,
27
+ model: args.model,
28
+ prompt: lastPrompt,
29
+ maxTokens: probe.maxTokens,
30
+ direct: args.mode === "direct",
31
+ });
32
+ const res = await args.transport({
33
+ mode: args.mode,
34
+ url: built.url,
35
+ headers: built.headers,
36
+ reqBody: built.body,
37
+ timeoutMs: args.timeoutMs,
38
+ });
39
+ if (res.error !== null) {
40
+ const transient = res.corsBlocked ||
41
+ isTransientError(res.error) ||
42
+ (res.status !== null && isTransientError(`HTTP ${res.status}`));
43
+ return {
44
+ label: probe.label,
45
+ pass: false,
46
+ signal: null,
47
+ muxFailure: false,
48
+ transient,
49
+ latencyMs: Math.round(performance.now() - started),
50
+ prompt: lastPrompt,
51
+ responseText: null,
52
+ httpStatus: res.status,
53
+ usage: null,
54
+ detectedModel: null,
55
+ reason: probeReason(false, null, false, transient),
56
+ text: undefined,
57
+ corsBlocked: res.corsBlocked,
58
+ };
59
+ }
60
+ const text = args.cfg.extractText(res.data);
61
+ if (text === null) {
62
+ return {
63
+ label: probe.label,
64
+ pass: false,
65
+ signal: null,
66
+ muxFailure: false,
67
+ transient: false,
68
+ latencyMs: Math.round(performance.now() - started),
69
+ prompt: lastPrompt,
70
+ responseText: null,
71
+ httpStatus: res.status,
72
+ usage: null,
73
+ detectedModel: null,
74
+ reason: "upstream error envelope",
75
+ text: undefined,
76
+ corsBlocked: false,
77
+ };
78
+ }
79
+ if (!echoesNonce(text, nonce)) {
80
+ if (text.trim().length > 0)
81
+ weakNonce = { text, res: { data: res.data, status: res.status } };
82
+ continue; // retry for a clean nonce echo first
83
+ }
84
+ const signal = detectSignal(text, probe.label, args.cfg.foreignIdentityPatterns, args.cfg.cloudModelNamePatterns, args.cfg.acceptsCloudHostIdentity);
85
+ const meta = args.cfg.extractMeta(res.data);
86
+ const pass = probe.evaluate(text, args.cfg);
87
+ return {
88
+ label: probe.label,
89
+ pass,
90
+ signal,
91
+ muxFailure: false,
92
+ transient: false,
93
+ latencyMs: Math.round(performance.now() - started),
94
+ prompt: lastPrompt,
95
+ responseText: cap(text),
96
+ httpStatus: res.status,
97
+ usage: meta.usage,
98
+ detectedModel: meta.detectedModel,
99
+ reason: probeReason(pass, signal, false, false),
100
+ text,
101
+ corsBlocked: false,
102
+ };
103
+ }
104
+ if (weakNonce) {
105
+ const text = weakNonce.text;
106
+ const signal = detectSignal(text, probe.label, args.cfg.foreignIdentityPatterns, args.cfg.cloudModelNamePatterns, args.cfg.acceptsCloudHostIdentity);
107
+ const meta = args.cfg.extractMeta(weakNonce.res.data);
108
+ const pass = probe.evaluate(text, args.cfg);
109
+ return {
110
+ label: probe.label,
111
+ pass,
112
+ signal,
113
+ muxFailure: false,
114
+ transient: false,
115
+ latencyMs: Math.round(performance.now() - started),
116
+ prompt: lastPrompt,
117
+ responseText: cap(text),
118
+ httpStatus: weakNonce.res.status,
119
+ usage: meta.usage,
120
+ detectedModel: meta.detectedModel,
121
+ reason: pass
122
+ ? "passed (no nonce echo)"
123
+ : probeReason(pass, signal, false, false),
124
+ text,
125
+ corsBlocked: false,
126
+ };
127
+ }
128
+ return {
129
+ label: probe.label,
130
+ pass: false,
131
+ signal: null,
132
+ muxFailure: true,
133
+ transient: false,
134
+ latencyMs: Math.round(performance.now() - started),
135
+ prompt: lastPrompt,
136
+ responseText: null,
137
+ httpStatus: null,
138
+ usage: null,
139
+ detectedModel: null,
140
+ reason: probeReason(false, null, true, false),
141
+ text: undefined,
142
+ corsBlocked: false,
143
+ };
144
+ }
145
+ function sumUsage(usages) {
146
+ const present = usages.filter((u) => u !== null);
147
+ if (present.length === 0)
148
+ return null;
149
+ const add = (key) => {
150
+ const vals = present
151
+ .map((u) => u[key])
152
+ .filter((v) => v !== null);
153
+ return vals.length > 0 ? vals.reduce((a, b) => a + b, 0) : null;
154
+ };
155
+ return {
156
+ prompt: add("prompt"),
157
+ completion: add("completion"),
158
+ total: add("total"),
159
+ };
160
+ }
161
+ function hostOf(baseUrl) {
162
+ try {
163
+ return new URL(baseUrl).host;
164
+ }
165
+ catch {
166
+ return baseUrl;
167
+ }
168
+ }
169
+ function connectivityResult(opts, error, corsBlocked, startedAt) {
170
+ return {
171
+ provider: opts.provider,
172
+ model: opts.model,
173
+ baseUrlHost: hostOf(opts.baseUrl),
174
+ verdict: "unverified",
175
+ versionUnverifiable: false,
176
+ probes: [],
177
+ reasons: [error],
178
+ probesPassed: 0,
179
+ probesTotal: 0,
180
+ latencyMs: Math.round(performance.now() - startedAt),
181
+ transport: opts.mode,
182
+ corsBlocked,
183
+ detectedModel: null,
184
+ totalUsage: null,
185
+ resolvedProvider: opts.provider,
186
+ connectivityError: error,
187
+ };
188
+ }
189
+ export async function runVerification(opts) {
190
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
191
+ const transport = opts.transport ?? probeTransport;
192
+ const started = performance.now();
193
+ const hs = await runHandshake({
194
+ provider: opts.provider,
195
+ baseUrl: opts.baseUrl,
196
+ apiKey: opts.apiKey,
197
+ model: opts.model,
198
+ mode: opts.mode,
199
+ timeoutMs,
200
+ transport,
201
+ });
202
+ if (!hs.ok)
203
+ return connectivityResult(opts, hs.reason, hs.corsBlocked, started);
204
+ const resolvedProvider = hs.resolvedProvider;
205
+ const cfg = PROVIDER_CONFIGS[resolvedProvider];
206
+ const results = await Promise.all(PROBES.map((probe) => runProbe({
207
+ probe,
208
+ cfg,
209
+ baseUrl: opts.baseUrl,
210
+ apiKey: opts.apiKey,
211
+ model: opts.model,
212
+ mode: hs.mode,
213
+ timeoutMs,
214
+ transport,
215
+ })));
216
+ const detectedModel = results.find((r) => r.detectedModel)?.detectedModel ?? null;
217
+ const verdict = aggregateVerdict({
218
+ model: opts.model,
219
+ cfg,
220
+ results,
221
+ detectedModel,
222
+ });
223
+ const corsBlocked = hs.mode === "direct" && results.some((r) => r.corsBlocked);
224
+ return {
225
+ provider: opts.provider,
226
+ model: opts.model,
227
+ baseUrlHost: hostOf(opts.baseUrl),
228
+ verdict: verdict.verdict,
229
+ versionUnverifiable: verdict.versionUnverifiable,
230
+ probes: results.map((r) => ({
231
+ label: r.label,
232
+ pass: r.pass,
233
+ signal: r.signal,
234
+ muxFailure: r.muxFailure,
235
+ transient: r.transient,
236
+ latencyMs: r.latencyMs,
237
+ prompt: r.prompt,
238
+ responseText: r.responseText,
239
+ httpStatus: r.httpStatus,
240
+ usage: r.usage,
241
+ detectedModel: r.detectedModel,
242
+ reason: r.reason,
243
+ })),
244
+ reasons: verdict.reasons,
245
+ probesPassed: results.filter((r) => r.pass).length,
246
+ probesTotal: results.length,
247
+ latencyMs: Math.round(performance.now() - started),
248
+ transport: hs.mode,
249
+ corsBlocked,
250
+ detectedModel,
251
+ totalUsage: sumUsage(results.map((r) => r.usage)),
252
+ resolvedProvider,
253
+ connectivityError: null,
254
+ };
255
+ }
256
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ProbeLabel, ProbeSignal } from "./types";
2
+ export declare const includesAny: (text: string, patterns: string[]) => boolean;
3
+ export declare const hasCodingToolRefusal: (text: string) => boolean;
4
+ export declare const hasScamPage: (text: string) => boolean;
5
+ export declare function cjkLeak(text: string): boolean;
6
+ export declare function hasForeignIdentity(text: string, foreignPatterns: string[], cloudModelNamePatterns: string[], probe: ProbeLabel): boolean;
7
+ export declare function tierOf(text: string, tiers: readonly string[]): string | null;
8
+ export declare function detectTierMismatch(requestedModel: string, modelNameText: string | undefined, tiers: readonly string[]): string | null;
9
+ export declare function detectSignal(text: string, probeLabel: ProbeLabel, foreignPatterns: string[], cloudModelNamePatterns: string[], acceptsCloudHostIdentity: boolean): ProbeSignal;
10
+ export declare function isTransientError(msg: string): boolean;
11
+ //# sourceMappingURL=signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../src/signals.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEvD,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,EAAE,YACpB,CAAC;AAEzC,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,YAEA,CAAC;AAElD,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,YACD,CAAC;AAExC,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG7C;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM,EAAE,EACzB,sBAAsB,EAAE,MAAM,EAAE,EAChC,KAAK,EAAE,UAAU,GAChB,OAAO,CAKT;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAG5E;AAED,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,MAAM,GAAG,IAAI,CAOf;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,MAAM,EAAE,EACzB,sBAAsB,EAAE,MAAM,EAAE,EAChC,wBAAwB,EAAE,OAAO,GAChC,WAAW,CAuBb;AAID,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAYrD"}