@mneme-ai/core 2.28.0 → 2.29.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 (69) hide show
  1. package/dist/conclave/aeae/index.d.ts +59 -0
  2. package/dist/conclave/aeae/index.d.ts.map +1 -0
  3. package/dist/conclave/aeae/index.js +133 -0
  4. package/dist/conclave/aeae/index.js.map +1 -0
  5. package/dist/conclave/aletheia_weights.d.ts +14 -0
  6. package/dist/conclave/aletheia_weights.d.ts.map +1 -0
  7. package/dist/conclave/aletheia_weights.js +66 -0
  8. package/dist/conclave/aletheia_weights.js.map +1 -0
  9. package/dist/conclave/bft.d.ts +47 -0
  10. package/dist/conclave/bft.d.ts.map +1 -0
  11. package/dist/conclave/bft.js +122 -0
  12. package/dist/conclave/bft.js.map +1 -0
  13. package/dist/conclave/conclave.test.d.ts +2 -0
  14. package/dist/conclave/conclave.test.d.ts.map +1 -0
  15. package/dist/conclave/conclave.test.js +198 -0
  16. package/dist/conclave/conclave.test.js.map +1 -0
  17. package/dist/conclave/engine.d.ts +34 -0
  18. package/dist/conclave/engine.d.ts.map +1 -0
  19. package/dist/conclave/engine.js +225 -0
  20. package/dist/conclave/engine.js.map +1 -0
  21. package/dist/conclave/index.d.ts +14 -0
  22. package/dist/conclave/index.d.ts.map +1 -0
  23. package/dist/conclave/index.js +10 -0
  24. package/dist/conclave/index.js.map +1 -0
  25. package/dist/conclave/types.d.ts +126 -0
  26. package/dist/conclave/types.d.ts.map +1 -0
  27. package/dist/conclave/types.js +28 -0
  28. package/dist/conclave/types.js.map +1 -0
  29. package/dist/conclave/vendors/anthropic.d.ts +15 -0
  30. package/dist/conclave/vendors/anthropic.d.ts.map +1 -0
  31. package/dist/conclave/vendors/anthropic.js +83 -0
  32. package/dist/conclave/vendors/anthropic.js.map +1 -0
  33. package/dist/conclave/vendors/interface.d.ts +43 -0
  34. package/dist/conclave/vendors/interface.d.ts.map +1 -0
  35. package/dist/conclave/vendors/interface.js +66 -0
  36. package/dist/conclave/vendors/interface.js.map +1 -0
  37. package/dist/conclave/vendors/mock.d.ts +12 -0
  38. package/dist/conclave/vendors/mock.d.ts.map +1 -0
  39. package/dist/conclave/vendors/mock.js +59 -0
  40. package/dist/conclave/vendors/mock.js.map +1 -0
  41. package/dist/conclave/vendors/openai.d.ts +8 -0
  42. package/dist/conclave/vendors/openai.d.ts.map +1 -0
  43. package/dist/conclave/vendors/openai.js +75 -0
  44. package/dist/conclave/vendors/openai.js.map +1 -0
  45. package/dist/conclave/vendors/registry.d.ts +19 -0
  46. package/dist/conclave/vendors/registry.d.ts.map +1 -0
  47. package/dist/conclave/vendors/registry.js +37 -0
  48. package/dist/conclave/vendors/registry.js.map +1 -0
  49. package/dist/diaspora/bridge_hardening.test.d.ts +2 -0
  50. package/dist/diaspora/bridge_hardening.test.d.ts.map +1 -0
  51. package/dist/diaspora/bridge_hardening.test.js +195 -0
  52. package/dist/diaspora/bridge_hardening.test.js.map +1 -0
  53. package/dist/diaspora/http_bridge.d.ts +14 -0
  54. package/dist/diaspora/http_bridge.d.ts.map +1 -1
  55. package/dist/diaspora/http_bridge.js +132 -15
  56. package/dist/diaspora/http_bridge.js.map +1 -1
  57. package/dist/index.d.ts +1 -0
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +9 -0
  60. package/dist/index.js.map +1 -1
  61. package/dist/polygraph/index.d.ts.map +1 -1
  62. package/dist/pulse.d.ts.map +1 -1
  63. package/dist/squadron/vaccine_numeric_guard.d.ts +0 -9
  64. package/dist/squadron/vaccine_numeric_guard.d.ts.map +1 -1
  65. package/dist/squadron/vaccine_numeric_guard.js +31 -7
  66. package/dist/squadron/vaccine_numeric_guard.js.map +1 -1
  67. package/dist/squadron/vaccine_numeric_guard.test.js +13 -4
  68. package/dist/squadron/vaccine_numeric_guard.test.js.map +1 -1
  69. package/package.json +1 -1
@@ -0,0 +1,126 @@
1
+ /**
2
+ * v2.29.0 — MNEME CONCLAVE: Byzantine consensus across N AI vendors.
3
+ *
4
+ * Closes Q1 of the 2026-05-22 AI-vendor-eval research gap matrix:
5
+ * cross-vendor Byzantine consensus exists only in academic papers
6
+ * (MultiLLMN, WBFT 2025); no production CLI/SaaS ships it. The
7
+ * reason is structural — vendors don't want to be 1-of-N. Mneme is
8
+ * the neutral third party that CAN.
9
+ *
10
+ * Architecture:
11
+ * 1. Take ONE claim
12
+ * 2. Run through ANTI-EVAL-AWARENESS ENGINE (AEAE) to produce
13
+ * N rewritten variants (verbatim / paraphrased / decoy-embedded
14
+ * / conversationally-framed) — closes the v2.29.0 crown-jewel
15
+ * gap: vendors like Opus 4.6 detect when they're being tested
16
+ * + change behavior. AEAE prevents detection.
17
+ * 3. Fan out each variant to every configured vendor in parallel
18
+ * 4. Each vendor returns VendorVerdict { stance, confidence, reasoning }
19
+ * 5. Aggregate via WEIGHTED BYZANTINE VOTE (weight = Aletheia trust)
20
+ * 6. If ≥ threshold consensus → CONSENSUS
21
+ * If consistent split → DISSENT (logged to HMAC-chain corpus)
22
+ * If awareness-score high (vendor inconsistent across variants) →
23
+ * AWARENESS_DETECTED flag
24
+ *
25
+ * Output: ConsensusVerdict with reproducible HMAC signature for replay.
26
+ */
27
+ export type VendorStance = "supports" | "refutes" | "uncertain" | "refuses";
28
+ /** One vendor's reply to one variant of the claim. */
29
+ export interface VendorVerdict {
30
+ vendor: string;
31
+ variant: string;
32
+ stance: VendorStance;
33
+ /** Vendor-reported confidence 0..1 (we don't blindly trust this). */
34
+ confidence: number;
35
+ /** Free-text reasoning the vendor offered. */
36
+ reasoning: string;
37
+ /** Wall-time of the call. */
38
+ dtMs: number;
39
+ /** Optional raw response for replay. */
40
+ rawSample?: string;
41
+ /** Optional error if the call failed (other fields then default). */
42
+ error?: string;
43
+ }
44
+ /** Aggregated verdict for ONE vendor across ALL variants. */
45
+ export interface VendorAggregate {
46
+ vendor: string;
47
+ /** Weight applied to this vendor's vote (Aletheia trust 0..1). */
48
+ weight: number;
49
+ /** Stance that won across variants (majority of variants). */
50
+ dominantStance: VendorStance;
51
+ /** 0..1; how consistent the vendor was across variants. 1.0 = identical
52
+ * stance on every variant; lower = vendor detected the eval + flipped. */
53
+ awarenessScore: number;
54
+ /** Per-variant verdicts (for full replay). */
55
+ perVariant: VendorVerdict[];
56
+ }
57
+ export type ConsensusOutcome = "CONSENSUS" | "DISSENT" | "AWARENESS_DETECTED" | "INSUFFICIENT_RESPONDERS";
58
+ export interface ConsensusVerdict {
59
+ spec: {
60
+ name: "MNEME-CONCLAVE";
61
+ version: string;
62
+ };
63
+ claim: string;
64
+ startedAt: string;
65
+ finishedAt: string;
66
+ totalMs: number;
67
+ vendors: string[];
68
+ variants: string[];
69
+ threshold: number;
70
+ bftStrict: boolean;
71
+ aeaeOn: boolean;
72
+ /** Per-vendor aggregate. */
73
+ perVendor: VendorAggregate[];
74
+ /** Weighted-vote tallies by stance. */
75
+ weightedTallies: Record<VendorStance, number>;
76
+ /** Final outcome. */
77
+ outcome: ConsensusOutcome;
78
+ /** Winning stance when outcome=CONSENSUS. */
79
+ winningStance?: VendorStance;
80
+ /** Headline + remediation. */
81
+ headline: string;
82
+ /** Vendors flagged for eval-awareness (awarenessScore < 0.7). */
83
+ awarenessFlags: Array<{
84
+ vendor: string;
85
+ score: number;
86
+ reason: string;
87
+ }>;
88
+ /** When DISSENT: the split breakdown. */
89
+ dissentBreakdown?: Array<{
90
+ stance: VendorStance;
91
+ vendors: string[];
92
+ weight: number;
93
+ }>;
94
+ /** HMAC-chain link. */
95
+ hmac: string;
96
+ /** Sequence in local chain. */
97
+ seq: number;
98
+ /** SHA-256 over canonical body (without hmac field). */
99
+ bodyDigest: string;
100
+ }
101
+ export interface ConclaveRunOptions {
102
+ vendors: string[];
103
+ bftThreshold?: number;
104
+ bftStrict?: boolean;
105
+ weightBy?: "aletheia" | "equal";
106
+ aeae?: boolean;
107
+ /** Subset of variant ids to run. Defaults to all from AEAE catalog. */
108
+ variants?: string[];
109
+ /** Optional per-vendor timeout override (ms). */
110
+ vendorTimeoutMs?: number;
111
+ /** Optional per-vendor cost cap (USD); when reached, vendor is skipped. */
112
+ vendorCostCapUsd?: number;
113
+ /** Disable real network calls; force mock adapter (testing). */
114
+ mockOnly?: boolean;
115
+ }
116
+ export interface DissentRecord {
117
+ at: string;
118
+ claim: string;
119
+ split: Array<{
120
+ stance: VendorStance;
121
+ vendors: string[];
122
+ weight: number;
123
+ }>;
124
+ hmac: string;
125
+ }
126
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/conclave/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * v2.29.0 — MNEME CONCLAVE: Byzantine consensus across N AI vendors.
3
+ *
4
+ * Closes Q1 of the 2026-05-22 AI-vendor-eval research gap matrix:
5
+ * cross-vendor Byzantine consensus exists only in academic papers
6
+ * (MultiLLMN, WBFT 2025); no production CLI/SaaS ships it. The
7
+ * reason is structural — vendors don't want to be 1-of-N. Mneme is
8
+ * the neutral third party that CAN.
9
+ *
10
+ * Architecture:
11
+ * 1. Take ONE claim
12
+ * 2. Run through ANTI-EVAL-AWARENESS ENGINE (AEAE) to produce
13
+ * N rewritten variants (verbatim / paraphrased / decoy-embedded
14
+ * / conversationally-framed) — closes the v2.29.0 crown-jewel
15
+ * gap: vendors like Opus 4.6 detect when they're being tested
16
+ * + change behavior. AEAE prevents detection.
17
+ * 3. Fan out each variant to every configured vendor in parallel
18
+ * 4. Each vendor returns VendorVerdict { stance, confidence, reasoning }
19
+ * 5. Aggregate via WEIGHTED BYZANTINE VOTE (weight = Aletheia trust)
20
+ * 6. If ≥ threshold consensus → CONSENSUS
21
+ * If consistent split → DISSENT (logged to HMAC-chain corpus)
22
+ * If awareness-score high (vendor inconsistent across variants) →
23
+ * AWARENESS_DETECTED flag
24
+ *
25
+ * Output: ConsensusVerdict with reproducible HMAC signature for replay.
26
+ */
27
+ export {};
28
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/conclave/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * v2.29.0 — Anthropic adapter for CONCLAVE.
3
+ *
4
+ * Speaks the Messages API (POST /v1/messages).
5
+ * Auth via env: ANTHROPIC_API_KEY.
6
+ * Defaults to claude-haiku-4-5 (cheap+fast) for cost discipline; the
7
+ * orchestrator can pass a specific model via vendor id like
8
+ * "claude-opus-4-7" → modelId "claude-opus-4-7".
9
+ *
10
+ * Returns a structured VendorVerdict; never throws (errors → VendorVerdict
11
+ * with stance=uncertain + error field).
12
+ */
13
+ import type { VendorAdapter } from "./interface.js";
14
+ export declare function makeAnthropicAdapter(vendorId: string): VendorAdapter;
15
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/conclave/vendors/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAmBpD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAsDpE"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * v2.29.0 — Anthropic adapter for CONCLAVE.
3
+ *
4
+ * Speaks the Messages API (POST /v1/messages).
5
+ * Auth via env: ANTHROPIC_API_KEY.
6
+ * Defaults to claude-haiku-4-5 (cheap+fast) for cost discipline; the
7
+ * orchestrator can pass a specific model via vendor id like
8
+ * "claude-opus-4-7" → modelId "claude-opus-4-7".
9
+ *
10
+ * Returns a structured VendorVerdict; never throws (errors → VendorVerdict
11
+ * with stance=uncertain + error field).
12
+ */
13
+ import { CONCLAVE_PROMPT, parseStance, parseConfidence } from "./interface.js";
14
+ const ANTHROPIC_API = "https://api.anthropic.com/v1/messages";
15
+ function vendorIdToModel(id) {
16
+ // Accept short aliases or full model IDs.
17
+ const m = {
18
+ "claude-opus-4-7": "claude-opus-4-7",
19
+ "claude-opus-4.7": "claude-opus-4-7",
20
+ "claude-sonnet-4-6": "claude-sonnet-4-6",
21
+ "claude-sonnet-4.6": "claude-sonnet-4-6",
22
+ "claude-haiku-4-5": "claude-haiku-4-5-20251001",
23
+ "claude-haiku-4.5": "claude-haiku-4-5-20251001",
24
+ };
25
+ return m[id] ?? id;
26
+ }
27
+ export function makeAnthropicAdapter(vendorId) {
28
+ return {
29
+ id: vendorId,
30
+ available() { return !!process.env["ANTHROPIC_API_KEY"]; },
31
+ async run({ claim, variantId, timeoutMs = 30_000 }) {
32
+ const t0 = Date.now();
33
+ const key = process.env["ANTHROPIC_API_KEY"];
34
+ if (!key) {
35
+ return {
36
+ vendor: vendorId, variant: variantId, stance: "uncertain", confidence: 0,
37
+ reasoning: "ANTHROPIC_API_KEY not set", dtMs: Date.now() - t0, error: "no-api-key",
38
+ };
39
+ }
40
+ const controller = new AbortController();
41
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
42
+ try {
43
+ const res = await fetch(ANTHROPIC_API, {
44
+ method: "POST",
45
+ signal: controller.signal,
46
+ headers: {
47
+ "content-type": "application/json",
48
+ "x-api-key": key,
49
+ "anthropic-version": "2023-06-01",
50
+ },
51
+ body: JSON.stringify({
52
+ model: vendorIdToModel(vendorId),
53
+ max_tokens: 600,
54
+ messages: [{ role: "user", content: CONCLAVE_PROMPT + claim }],
55
+ }),
56
+ });
57
+ clearTimeout(timer);
58
+ if (!res.ok) {
59
+ return {
60
+ vendor: vendorId, variant: variantId, stance: "uncertain", confidence: 0,
61
+ reasoning: `HTTP ${res.status}`, dtMs: Date.now() - t0, error: `http-${res.status}`,
62
+ };
63
+ }
64
+ const j = await res.json();
65
+ const text = (j.content ?? []).map((c) => c.text ?? "").join("\n").trim();
66
+ return {
67
+ vendor: vendorId, variant: variantId,
68
+ stance: parseStance(text), confidence: parseConfidence(text),
69
+ reasoning: text.slice(0, 600), dtMs: Date.now() - t0,
70
+ rawSample: text.slice(0, 1200),
71
+ };
72
+ }
73
+ catch (e) {
74
+ clearTimeout(timer);
75
+ return {
76
+ vendor: vendorId, variant: variantId, stance: "uncertain", confidence: 0,
77
+ reasoning: `fetch failed: ${e.message}`, dtMs: Date.now() - t0, error: e.name,
78
+ };
79
+ }
80
+ },
81
+ };
82
+ }
83
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/conclave/vendors/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * v2.29.0 — Vendor adapter contract.
3
+ *
4
+ * Each adapter takes ONE claim variant + returns ONE VendorVerdict.
5
+ * Adapters are pure-IO: no shared state, no global config. The
6
+ * orchestrator runs them in parallel.
7
+ *
8
+ * Real adapters speak HTTP to the vendor; mock adapter returns
9
+ * deterministic verdicts for tests. Auth via env vars (e.g.
10
+ * ANTHROPIC_API_KEY / OPENAI_API_KEY / etc).
11
+ */
12
+ import type { VendorVerdict, VendorStance } from "../types.js";
13
+ export interface VendorAdapter {
14
+ /** Canonical id (e.g. "claude-opus-4.7", "gpt-5", "mock"). */
15
+ id: string;
16
+ /** True iff the adapter has credentials + can make real network calls. */
17
+ available(): boolean;
18
+ /** Run the claim through the vendor's model + return a structured verdict. */
19
+ run(input: {
20
+ claim: string;
21
+ variantId: string;
22
+ timeoutMs?: number;
23
+ }): Promise<VendorVerdict>;
24
+ }
25
+ /**
26
+ * Parse a vendor's free-text reply into a structured stance.
27
+ *
28
+ * Heuristic-first parser; deterministic on the same input. Tries to
29
+ * match obvious affirmative / negative / uncertain phrasings. Vendors
30
+ * that follow the recommended response format ("STANCE: supports |
31
+ * refutes | uncertain") get exact mapping.
32
+ */
33
+ export declare function parseStance(text: string): VendorStance;
34
+ /** Extract a vendor-reported confidence number from free text. */
35
+ export declare function parseConfidence(text: string): number;
36
+ /**
37
+ * The CONCLAVE PROMPT TEMPLATE — vendors are instructed to respond in a
38
+ * structured form so parsing is reliable. The prompt is identical
39
+ * across vendors so behavior differences attribute to the model, not
40
+ * to per-vendor prompt engineering.
41
+ */
42
+ export declare const CONCLAVE_PROMPT = "You are one of N independent verifiers. Read the CLAIM below + answer with EXACTLY this format (no preamble, no postamble):\n\nSTANCE: <supports | refutes | uncertain | refuses>\nCONFIDENCE: <0.0 .. 1.0>\nREASONING: <one paragraph, \u2264 3 sentences>\n\nCLAIM: ";
43
+ //# sourceMappingURL=interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/conclave/vendors/interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,EAAE,EAAE,MAAM,CAAC;IACX,0EAA0E;IAC1E,SAAS,IAAI,OAAO,CAAC;IACrB,8EAA8E;IAC9E,GAAG,CAAC,KAAK,EAAE;QACT,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAYtD;AAED,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYpD;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,2QAMpB,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * v2.29.0 — Vendor adapter contract.
3
+ *
4
+ * Each adapter takes ONE claim variant + returns ONE VendorVerdict.
5
+ * Adapters are pure-IO: no shared state, no global config. The
6
+ * orchestrator runs them in parallel.
7
+ *
8
+ * Real adapters speak HTTP to the vendor; mock adapter returns
9
+ * deterministic verdicts for tests. Auth via env vars (e.g.
10
+ * ANTHROPIC_API_KEY / OPENAI_API_KEY / etc).
11
+ */
12
+ /**
13
+ * Parse a vendor's free-text reply into a structured stance.
14
+ *
15
+ * Heuristic-first parser; deterministic on the same input. Tries to
16
+ * match obvious affirmative / negative / uncertain phrasings. Vendors
17
+ * that follow the recommended response format ("STANCE: supports |
18
+ * refutes | uncertain") get exact mapping.
19
+ */
20
+ export function parseStance(text) {
21
+ const t = text.trim();
22
+ // 1. Explicit STANCE: header
23
+ const m = /^STANCE\s*[:=]\s*(supports|refutes|uncertain|refuses)/im.exec(t);
24
+ if (m)
25
+ return m[1].toLowerCase();
26
+ // 2. Refusal/policy phrases
27
+ if (/\b(I can'?t|I cannot|won'?t answer|refuse|policy)\b/i.test(t))
28
+ return "refuses";
29
+ // 3. Strong-no phrases
30
+ if (/\b(no,|false|incorrect|not true|refute(d)?|disagree)\b/i.test(t))
31
+ return "refutes";
32
+ // 4. Strong-yes phrases
33
+ if (/\b(yes,|true|correct|confirm|agree|support(s|ed)?)\b/i.test(t))
34
+ return "supports";
35
+ return "uncertain";
36
+ }
37
+ /** Extract a vendor-reported confidence number from free text. */
38
+ export function parseConfidence(text) {
39
+ // STANCE: ... CONFIDENCE: 0.85
40
+ const m = /CONFIDENCE\s*[:=]\s*([0-9]*\.?[0-9]+)/i.exec(text);
41
+ if (m) {
42
+ const n = Number(m[1]);
43
+ if (Number.isFinite(n) && n >= 0 && n <= 1)
44
+ return n;
45
+ }
46
+ // "I am 85% confident" / "with 90% certainty"
47
+ const pct = /(\d{1,3})\s*%\s*(?:confident|certain|sure)/i.exec(text);
48
+ if (pct)
49
+ return Math.min(1, Math.max(0, Number(pct[1]) / 100));
50
+ // No signal → 0.5 (uncertain prior)
51
+ return 0.5;
52
+ }
53
+ /**
54
+ * The CONCLAVE PROMPT TEMPLATE — vendors are instructed to respond in a
55
+ * structured form so parsing is reliable. The prompt is identical
56
+ * across vendors so behavior differences attribute to the model, not
57
+ * to per-vendor prompt engineering.
58
+ */
59
+ export const CONCLAVE_PROMPT = `You are one of N independent verifiers. Read the CLAIM below + answer with EXACTLY this format (no preamble, no postamble):
60
+
61
+ STANCE: <supports | refutes | uncertain | refuses>
62
+ CONFIDENCE: <0.0 .. 1.0>
63
+ REASONING: <one paragraph, ≤ 3 sentences>
64
+
65
+ CLAIM: `;
66
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/conclave/vendors/interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAiBH;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,6BAA6B;IAC7B,MAAM,CAAC,GAAG,yDAAyD,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAkB,CAAC;IAClD,4BAA4B;IAC5B,IAAI,sDAAsD,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACrF,uBAAuB;IACvB,IAAI,yDAAyD,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACxF,wBAAwB;IACxB,IAAI,uDAAuD,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IACvF,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,+BAA+B;IAC/B,MAAM,CAAC,GAAG,wCAAwC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,CAAC,EAAE,CAAC;QACN,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IACD,8CAA8C;IAC9C,MAAM,GAAG,GAAG,6CAA6C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAChE,oCAAoC;IACpC,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;QAMvB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * v2.29.0 — Mock vendor adapter.
3
+ *
4
+ * Returns a DETERMINISTIC verdict derived from the claim text + a
5
+ * stable seed. Used in tests and as the default when no real API key
6
+ * is configured. Two mock vendors with different seeds simulate the
7
+ * majority/minority shape so the BFT aggregator can be tested without
8
+ * a network.
9
+ */
10
+ import type { VendorAdapter } from "./interface.js";
11
+ export declare function makeMockAdapter(vendorId: string): VendorAdapter;
12
+ //# sourceMappingURL=mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../../src/conclave/vendors/mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAyBpD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAqB/D"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * v2.29.0 — Mock vendor adapter.
3
+ *
4
+ * Returns a DETERMINISTIC verdict derived from the claim text + a
5
+ * stable seed. Used in tests and as the default when no real API key
6
+ * is configured. Two mock vendors with different seeds simulate the
7
+ * majority/minority shape so the BFT aggregator can be tested without
8
+ * a network.
9
+ */
10
+ import { createHash } from "node:crypto";
11
+ function hashedDigit(s) {
12
+ const h = createHash("sha256").update(s).digest();
13
+ return h[0] / 256;
14
+ }
15
+ function deterministicStance(claim, vendorSeed) {
16
+ // Claim-aware deterministic mock:
17
+ // - claims containing "REFUTE_ME" → refutes (used in unit tests)
18
+ // - claims containing "REFUSE_ME" → refuses
19
+ // - claims containing "UNCERTAIN_ME" → uncertain
20
+ // - otherwise: derived from sha256(claim+vendorSeed) — same input
21
+ // gives same output per (claim, vendor) pair
22
+ if (/REFUTE_ME/.test(claim))
23
+ return { stance: "refutes", confidence: 0.95 };
24
+ if (/REFUSE_ME/.test(claim))
25
+ return { stance: "refuses", confidence: 0.99 };
26
+ if (/UNCERTAIN_ME/.test(claim))
27
+ return { stance: "uncertain", confidence: 0.4 };
28
+ if (/SUPPORT_ME/.test(claim))
29
+ return { stance: "supports", confidence: 0.92 };
30
+ const d = hashedDigit(claim + "|" + vendorSeed);
31
+ if (d < 0.5)
32
+ return { stance: "supports", confidence: 0.6 + d * 0.4 };
33
+ if (d < 0.85)
34
+ return { stance: "refutes", confidence: 0.6 + (d - 0.5) * 0.4 };
35
+ return { stance: "uncertain", confidence: 0.4 + (d - 0.85) * 0.4 };
36
+ }
37
+ export function makeMockAdapter(vendorId) {
38
+ return {
39
+ id: vendorId,
40
+ available() { return true; },
41
+ async run({ claim, variantId }) {
42
+ const t0 = Date.now();
43
+ const { stance, confidence } = deterministicStance(claim, vendorId);
44
+ // Small simulated latency (proportional to deterministic hash so
45
+ // tests stay reproducible).
46
+ await new Promise((r) => setTimeout(r, Math.floor(hashedDigit(vendorId) * 20)));
47
+ return {
48
+ vendor: vendorId,
49
+ variant: variantId,
50
+ stance,
51
+ confidence,
52
+ reasoning: `[mock:${vendorId}] deterministic verdict for "${claim.slice(0, 60)}..." (variant=${variantId})`,
53
+ dtMs: Date.now() - t0,
54
+ rawSample: `STANCE: ${stance}\nCONFIDENCE: ${confidence.toFixed(2)}\nREASONING: mock deterministic`,
55
+ };
56
+ },
57
+ };
58
+ }
59
+ //# sourceMappingURL=mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../../src/conclave/vendors/mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,SAAS,WAAW,CAAC,CAAS;IAC5B,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClD,OAAO,CAAC,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC;AACrB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa,EAAE,UAAkB;IAC5D,kCAAkC;IAClC,mEAAmE;IACnE,8CAA8C;IAC9C,mDAAmD;IACnD,oEAAoE;IACpE,iDAAiD;IACjD,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC5E,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC5E,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;IAChF,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC9E,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,GAAG,GAAG,GAAG,UAAU,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;IACtE,IAAI,CAAC,GAAG,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;IAC9E,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO;QACL,EAAE,EAAE,QAAQ;QACZ,SAAS,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;QAC5B,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACpE,iEAAiE;YACjE,4BAA4B;YAC5B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAChF,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,SAAS;gBAClB,MAAM;gBACN,UAAU;gBACV,SAAS,EAAE,SAAS,QAAQ,gCAAgC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,SAAS,GAAG;gBAC3G,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;gBACrB,SAAS,EAAE,WAAW,MAAM,iBAAiB,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC;aACpG,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * v2.29.0 — OpenAI adapter for CONCLAVE.
3
+ *
4
+ * Speaks the Chat Completions API. Auth via env: OPENAI_API_KEY.
5
+ */
6
+ import type { VendorAdapter } from "./interface.js";
7
+ export declare function makeOpenAIAdapter(vendorId: string): VendorAdapter;
8
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/conclave/vendors/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAgBpD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAwDjE"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * v2.29.0 — OpenAI adapter for CONCLAVE.
3
+ *
4
+ * Speaks the Chat Completions API. Auth via env: OPENAI_API_KEY.
5
+ */
6
+ import { CONCLAVE_PROMPT, parseStance, parseConfidence } from "./interface.js";
7
+ const OPENAI_API = "https://api.openai.com/v1/chat/completions";
8
+ function vendorIdToModel(id) {
9
+ const m = {
10
+ "gpt-5": "gpt-5",
11
+ "gpt-5-mini": "gpt-5-mini",
12
+ "gpt-4o": "gpt-4o",
13
+ "gpt-4o-mini": "gpt-4o-mini",
14
+ };
15
+ return m[id] ?? id;
16
+ }
17
+ export function makeOpenAIAdapter(vendorId) {
18
+ return {
19
+ id: vendorId,
20
+ available() { return !!process.env["OPENAI_API_KEY"]; },
21
+ async run({ claim, variantId, timeoutMs = 30_000 }) {
22
+ const t0 = Date.now();
23
+ const key = process.env["OPENAI_API_KEY"];
24
+ if (!key) {
25
+ return {
26
+ vendor: vendorId, variant: variantId, stance: "uncertain", confidence: 0,
27
+ reasoning: "OPENAI_API_KEY not set", dtMs: Date.now() - t0, error: "no-api-key",
28
+ };
29
+ }
30
+ const controller = new AbortController();
31
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
32
+ try {
33
+ const res = await fetch(OPENAI_API, {
34
+ method: "POST",
35
+ signal: controller.signal,
36
+ headers: {
37
+ "content-type": "application/json",
38
+ "authorization": `Bearer ${key}`,
39
+ },
40
+ body: JSON.stringify({
41
+ model: vendorIdToModel(vendorId),
42
+ max_tokens: 600,
43
+ messages: [
44
+ { role: "system", content: "You are one of N independent verifiers in a Byzantine consensus protocol." },
45
+ { role: "user", content: CONCLAVE_PROMPT + claim },
46
+ ],
47
+ }),
48
+ });
49
+ clearTimeout(timer);
50
+ if (!res.ok) {
51
+ return {
52
+ vendor: vendorId, variant: variantId, stance: "uncertain", confidence: 0,
53
+ reasoning: `HTTP ${res.status}`, dtMs: Date.now() - t0, error: `http-${res.status}`,
54
+ };
55
+ }
56
+ const j = await res.json();
57
+ const text = (j.choices?.[0]?.message?.content ?? "").trim();
58
+ return {
59
+ vendor: vendorId, variant: variantId,
60
+ stance: parseStance(text), confidence: parseConfidence(text),
61
+ reasoning: text.slice(0, 600), dtMs: Date.now() - t0,
62
+ rawSample: text.slice(0, 1200),
63
+ };
64
+ }
65
+ catch (e) {
66
+ clearTimeout(timer);
67
+ return {
68
+ vendor: vendorId, variant: variantId, stance: "uncertain", confidence: 0,
69
+ reasoning: `fetch failed: ${e.message}`, dtMs: Date.now() - t0, error: e.name,
70
+ };
71
+ }
72
+ },
73
+ };
74
+ }
75
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/conclave/vendors/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * v2.29.0 — Vendor adapter registry + auto-resolution.
3
+ *
4
+ * Given a list of vendor ids, returns the best adapter for each:
5
+ * 1. Real adapter if its env credential is present
6
+ * 2. Mock adapter as fallback (so tests + offline always work)
7
+ *
8
+ * Adding a new vendor (grok / gemini / deepseek): write a thin
9
+ * adapter in this dir + add a case below.
10
+ */
11
+ import type { VendorAdapter } from "./interface.js";
12
+ export declare function adapterFor(vendorId: string, opts?: {
13
+ mockOnly?: boolean;
14
+ }): VendorAdapter;
15
+ /** Resolve a list of vendor ids to live adapters, mocking any without creds. */
16
+ export declare function resolveVendors(vendorIds: string[], opts?: {
17
+ mockOnly?: boolean;
18
+ }): VendorAdapter[];
19
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/conclave/vendors/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAKpD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,aAAa,CAO7F;AAED,gFAAgF;AAChF,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EAAE,EACnB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,aAAa,EAAE,CAQjB"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * v2.29.0 — Vendor adapter registry + auto-resolution.
3
+ *
4
+ * Given a list of vendor ids, returns the best adapter for each:
5
+ * 1. Real adapter if its env credential is present
6
+ * 2. Mock adapter as fallback (so tests + offline always work)
7
+ *
8
+ * Adding a new vendor (grok / gemini / deepseek): write a thin
9
+ * adapter in this dir + add a case below.
10
+ */
11
+ import { makeMockAdapter } from "./mock.js";
12
+ import { makeAnthropicAdapter } from "./anthropic.js";
13
+ import { makeOpenAIAdapter } from "./openai.js";
14
+ export function adapterFor(vendorId, opts = {}) {
15
+ if (opts.mockOnly)
16
+ return makeMockAdapter(vendorId);
17
+ if (vendorId.startsWith("claude"))
18
+ return makeAnthropicAdapter(vendorId);
19
+ if (vendorId.startsWith("gpt") || vendorId === "openai")
20
+ return makeOpenAIAdapter(vendorId);
21
+ if (vendorId === "mock" || vendorId.startsWith("mock"))
22
+ return makeMockAdapter(vendorId);
23
+ // Unknown vendor → mock so the orchestrator doesn't crash.
24
+ return makeMockAdapter(vendorId);
25
+ }
26
+ /** Resolve a list of vendor ids to live adapters, mocking any without creds. */
27
+ export function resolveVendors(vendorIds, opts = {}) {
28
+ return vendorIds.map((id) => {
29
+ const a = adapterFor(id, opts);
30
+ if (a.available() || opts.mockOnly)
31
+ return a;
32
+ // Real adapter requested but no credentials → fall back to mock
33
+ // tagged with original id so the user sees which vendor was mocked.
34
+ return makeMockAdapter(`${id}@mock`);
35
+ });
36
+ }
37
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/conclave/vendors/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,OAA+B,EAAE;IAC5E,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACzE,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5F,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC;IACzF,2DAA2D;IAC3D,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAC5B,SAAmB,EACnB,OAA+B,EAAE;IAEjC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QAC1B,MAAM,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,CAAC;QAC7C,gEAAgE;QAChE,oEAAoE;QACpE,OAAO,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bridge_hardening.test.d.ts.map