@salucallc/tiresias-sdk 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.
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Tiresias SDK — LLM Adapters
3
+ * OpenAI-compatible and Anthropic adapters for tiresias.call()
4
+ */
5
+ import type { LLMAdapter, LLMCallOptions, LLMResponse, Message } from "./types.js";
6
+ export interface OpenAIAdapterOptions {
7
+ apiKey: string;
8
+ baseUrl?: string;
9
+ defaultModel?: string;
10
+ }
11
+ export declare class OpenAIAdapter implements LLMAdapter {
12
+ private apiKey;
13
+ private baseUrl;
14
+ private defaultModel;
15
+ constructor(options: OpenAIAdapterOptions);
16
+ call(messages: Message[], options?: LLMCallOptions): Promise<LLMResponse>;
17
+ }
18
+ export interface AnthropicAdapterOptions {
19
+ apiKey: string;
20
+ defaultModel?: string;
21
+ }
22
+ export declare class AnthropicAdapter implements LLMAdapter {
23
+ private apiKey;
24
+ private defaultModel;
25
+ private baseUrl;
26
+ constructor(options: AnthropicAdapterOptions);
27
+ call(messages: Message[], options?: LLMCallOptions): Promise<LLMResponse>;
28
+ }
29
+ //# sourceMappingURL=adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAInF,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,aAAc,YAAW,UAAU;IAC9C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAS;gBAEjB,OAAO,EAAE,oBAAoB;IAMnC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;CA6CpF;AAID,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAkC;gBAErC,OAAO,EAAE,uBAAuB;IAKtC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;CAwCpF"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ /**
3
+ * Tiresias SDK — LLM Adapters
4
+ * OpenAI-compatible and Anthropic adapters for tiresias.call()
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.AnthropicAdapter = exports.OpenAIAdapter = void 0;
8
+ class OpenAIAdapter {
9
+ apiKey;
10
+ baseUrl;
11
+ defaultModel;
12
+ constructor(options) {
13
+ this.apiKey = options.apiKey;
14
+ this.baseUrl = (options.baseUrl ?? "https://api.openai.com/v1").replace(/\/$/, "");
15
+ this.defaultModel = options.defaultModel ?? "gpt-4o-mini";
16
+ }
17
+ async call(messages, options = {}) {
18
+ const model = options.model ?? this.defaultModel;
19
+ const msgs = [];
20
+ if (options.systemPrompt) {
21
+ msgs.push({ role: "system", content: options.systemPrompt });
22
+ }
23
+ for (const m of messages) {
24
+ msgs.push({ role: m.role, content: m.content });
25
+ }
26
+ const body = JSON.stringify({
27
+ model,
28
+ messages: msgs,
29
+ max_tokens: options.maxTokens ?? 4096,
30
+ temperature: options.temperature ?? 0.0,
31
+ });
32
+ const res = await fetch(`${this.baseUrl}/chat/completions`, {
33
+ method: "POST",
34
+ headers: {
35
+ Authorization: `Bearer ${this.apiKey}`,
36
+ "Content-Type": "application/json",
37
+ },
38
+ body,
39
+ });
40
+ if (!res.ok) {
41
+ const text = await res.text();
42
+ throw new Error(`OpenAI API error ${res.status}: ${text}`);
43
+ }
44
+ const json = (await res.json());
45
+ return {
46
+ content: json.choices[0]?.message?.content ?? "",
47
+ usage: json.usage
48
+ ? { inputTokens: json.usage.prompt_tokens, outputTokens: json.usage.completion_tokens }
49
+ : undefined,
50
+ raw: json,
51
+ };
52
+ }
53
+ }
54
+ exports.OpenAIAdapter = OpenAIAdapter;
55
+ class AnthropicAdapter {
56
+ apiKey;
57
+ defaultModel;
58
+ baseUrl = "https://api.anthropic.com/v1";
59
+ constructor(options) {
60
+ this.apiKey = options.apiKey;
61
+ this.defaultModel = options.defaultModel ?? "claude-haiku-4-5-20251001";
62
+ }
63
+ async call(messages, options = {}) {
64
+ const model = options.model ?? this.defaultModel;
65
+ const body = JSON.stringify({
66
+ model,
67
+ max_tokens: options.maxTokens ?? 4096,
68
+ system: options.systemPrompt,
69
+ messages: messages.map((m) => ({ role: m.role, content: m.content })),
70
+ });
71
+ const res = await fetch(`${this.baseUrl}/messages`, {
72
+ method: "POST",
73
+ headers: {
74
+ "x-api-key": this.apiKey,
75
+ "anthropic-version": "2023-06-01",
76
+ "Content-Type": "application/json",
77
+ },
78
+ body,
79
+ });
80
+ if (!res.ok) {
81
+ const text = await res.text();
82
+ throw new Error(`Anthropic API error ${res.status}: ${text}`);
83
+ }
84
+ const json = (await res.json());
85
+ const textContent = json.content.find((c) => c.type === "text");
86
+ return {
87
+ content: textContent?.text ?? "",
88
+ usage: json.usage
89
+ ? { inputTokens: json.usage.input_tokens, outputTokens: json.usage.output_tokens }
90
+ : undefined,
91
+ raw: json,
92
+ };
93
+ }
94
+ }
95
+ exports.AnthropicAdapter = AnthropicAdapter;
96
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * PATENT-CRITICAL: Hash-Chained Audit Log (SALUCA-005 / cross_layer_orchestration)
3
+ *
4
+ * Each AuditEntry contains:
5
+ * chainHash = SHA3-256( prevChainHash || sessionId || timestamp || scoreJson )
6
+ *
7
+ * This creates a tamper-evident append-only ledger. Any retroactive modification
8
+ * of an entry invalidates all subsequent chain hashes, making silent tampering
9
+ * detectable. The hash linkage is the novel IP element of this module.
10
+ *
11
+ * SHA3-256 is used (not SHA2) for forward security and to distinguish from
12
+ * the SHA2-256 used in tiresias-watch (different security domain).
13
+ */
14
+ import type { AuditEntry, CompositeScore, AuditStore } from "./types.js";
15
+ export declare const GENESIS_HASH: string;
16
+ /**
17
+ * Compute the chain hash for a new audit entry.
18
+ * PATENT-CRITICAL: this exact construction is the hash-chain claim in SALUCA-005.
19
+ */
20
+ export declare function computeChainHash(prevChainHash: string, sessionId: string, timestamp: number, composite: CompositeScore): string;
21
+ /**
22
+ * Compute SHA-256 hash of raw request content (for requestHash field).
23
+ */
24
+ export declare function hashRequest(content: string): string;
25
+ /**
26
+ * Build a new AuditEntry, computing chainHash from the previous head.
27
+ */
28
+ export declare function buildAuditEntry(sessionId: string, requestContent: string, composite: CompositeScore, prevChainHash: string, metadata?: Record<string, unknown>): AuditEntry;
29
+ /**
30
+ * Verify the integrity of an audit chain.
31
+ * Returns the index of the first broken link, or -1 if chain is intact.
32
+ */
33
+ export declare function verifyChain(entries: AuditEntry[]): number;
34
+ /**
35
+ * Default in-memory audit store for development / testing.
36
+ * For production, replace with a persistent store (SQLite, Supabase, etc.).
37
+ */
38
+ export declare class MemoryAuditStore implements AuditStore {
39
+ private entries;
40
+ append(entry: AuditEntry): Promise<void>;
41
+ getHead(sessionId: string): Promise<string>;
42
+ query(sessionId: string, limit?: number): Promise<AuditEntry[]>;
43
+ verifySession(sessionId: string): Promise<{
44
+ valid: boolean;
45
+ brokenAt: number;
46
+ }>;
47
+ /** Return all sessions with their entry counts */
48
+ stats(): Record<string, number>;
49
+ }
50
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzE,eAAO,MAAM,YAAY,QAAiB,CAAC;AAE3C;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,cAAc,GACxB,MAAM,CAgBR;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,cAAc,EACzB,aAAa,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,UAAU,CAcZ;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAsBzD;AAID;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,OAAO,CAAwC;IAEjD,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM3C,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAK5D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAMrF,kDAAkD;IAClD,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAKhC"}
package/dist/audit.js ADDED
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ /**
3
+ * PATENT-CRITICAL: Hash-Chained Audit Log (SALUCA-005 / cross_layer_orchestration)
4
+ *
5
+ * Each AuditEntry contains:
6
+ * chainHash = SHA3-256( prevChainHash || sessionId || timestamp || scoreJson )
7
+ *
8
+ * This creates a tamper-evident append-only ledger. Any retroactive modification
9
+ * of an entry invalidates all subsequent chain hashes, making silent tampering
10
+ * detectable. The hash linkage is the novel IP element of this module.
11
+ *
12
+ * SHA3-256 is used (not SHA2) for forward security and to distinguish from
13
+ * the SHA2-256 used in tiresias-watch (different security domain).
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.MemoryAuditStore = exports.GENESIS_HASH = void 0;
17
+ exports.computeChainHash = computeChainHash;
18
+ exports.hashRequest = hashRequest;
19
+ exports.buildAuditEntry = buildAuditEntry;
20
+ exports.verifyChain = verifyChain;
21
+ const node_crypto_1 = require("node:crypto");
22
+ exports.GENESIS_HASH = "0".repeat(64);
23
+ /**
24
+ * Compute the chain hash for a new audit entry.
25
+ * PATENT-CRITICAL: this exact construction is the hash-chain claim in SALUCA-005.
26
+ */
27
+ function computeChainHash(prevChainHash, sessionId, timestamp, composite) {
28
+ const scoreJson = JSON.stringify({
29
+ score: composite.score,
30
+ injectionThreat: composite.injectionThreat,
31
+ piiRisk: composite.piiRisk,
32
+ networkThreat: composite.networkThreat,
33
+ policy: composite.policy,
34
+ });
35
+ // SHA3-256 chain: prev_hash || session_id || timestamp || score_json
36
+ return (0, node_crypto_1.createHash)("sha3-256")
37
+ .update(prevChainHash)
38
+ .update(sessionId)
39
+ .update(String(timestamp))
40
+ .update(scoreJson)
41
+ .digest("hex");
42
+ }
43
+ /**
44
+ * Compute SHA-256 hash of raw request content (for requestHash field).
45
+ */
46
+ function hashRequest(content) {
47
+ return (0, node_crypto_1.createHash)("sha256").update(content, "utf8").digest("hex");
48
+ }
49
+ /**
50
+ * Build a new AuditEntry, computing chainHash from the previous head.
51
+ */
52
+ function buildAuditEntry(sessionId, requestContent, composite, prevChainHash, metadata) {
53
+ const timestamp = Date.now();
54
+ const chainHash = computeChainHash(prevChainHash, sessionId, timestamp, composite);
55
+ return {
56
+ entryId: (0, node_crypto_1.randomUUID)(),
57
+ sessionId,
58
+ timestamp,
59
+ requestHash: hashRequest(requestContent),
60
+ composite,
61
+ chainHash,
62
+ prevChainHash,
63
+ metadata,
64
+ };
65
+ }
66
+ /**
67
+ * Verify the integrity of an audit chain.
68
+ * Returns the index of the first broken link, or -1 if chain is intact.
69
+ */
70
+ function verifyChain(entries) {
71
+ if (entries.length === 0)
72
+ return -1;
73
+ // First entry must chain from genesis
74
+ if (entries[0].prevChainHash !== exports.GENESIS_HASH)
75
+ return 0;
76
+ for (let i = 0; i < entries.length; i++) {
77
+ const entry = entries[i];
78
+ const expectedHash = computeChainHash(entry.prevChainHash, entry.sessionId, entry.timestamp, entry.composite);
79
+ if (entry.chainHash !== expectedHash)
80
+ return i;
81
+ // Each entry's chainHash must equal next entry's prevChainHash
82
+ if (i < entries.length - 1 && entries[i + 1].prevChainHash !== entry.chainHash) {
83
+ return i + 1;
84
+ }
85
+ }
86
+ return -1;
87
+ }
88
+ // ── In-Memory Audit Store (default) ──────────────────────────────────────────
89
+ /**
90
+ * Default in-memory audit store for development / testing.
91
+ * For production, replace with a persistent store (SQLite, Supabase, etc.).
92
+ */
93
+ class MemoryAuditStore {
94
+ entries = new Map();
95
+ async append(entry) {
96
+ const list = this.entries.get(entry.sessionId) ?? [];
97
+ list.push(entry);
98
+ this.entries.set(entry.sessionId, list);
99
+ }
100
+ async getHead(sessionId) {
101
+ const list = this.entries.get(sessionId);
102
+ if (!list || list.length === 0)
103
+ return exports.GENESIS_HASH;
104
+ return list[list.length - 1].chainHash;
105
+ }
106
+ async query(sessionId, limit = 100) {
107
+ const list = this.entries.get(sessionId) ?? [];
108
+ return list.slice(-limit);
109
+ }
110
+ async verifySession(sessionId) {
111
+ const entries = await this.query(sessionId, 10_000);
112
+ const brokenAt = verifyChain(entries);
113
+ return { valid: brokenAt === -1, brokenAt };
114
+ }
115
+ /** Return all sessions with their entry counts */
116
+ stats() {
117
+ const out = {};
118
+ for (const [sid, list] of this.entries)
119
+ out[sid] = list.length;
120
+ return out;
121
+ }
122
+ }
123
+ exports.MemoryAuditStore = MemoryAuditStore;
124
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @salucallc/tiresias-sdk
3
+ * Unified Tiresias AI Safety SDK
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * import { Tiresias, OpenAIAdapter } from "@salucallc/tiresias-sdk";
8
+ *
9
+ * const tiresias = new Tiresias();
10
+ * const adapter = new OpenAIAdapter({ apiKey: process.env.OPENAI_API_KEY! });
11
+ *
12
+ * const result = await tiresias.call(
13
+ * [{ role: "user", content: "What is the capital of France?" }],
14
+ * adapter,
15
+ * { sessionId: "user-123" }
16
+ * );
17
+ *
18
+ * if (result.blocked) {
19
+ * console.log("Request blocked:", result.decision, result.composite.score);
20
+ * } else {
21
+ * console.log(result.llmResponse?.content);
22
+ * }
23
+ * ```
24
+ */
25
+ export { Tiresias } from "./tiresias.js";
26
+ export { computeCompositeScore, scoreToPolicy } from "./scoring.js";
27
+ export { computeChainHash, hashRequest, buildAuditEntry, verifyChain, MemoryAuditStore, GENESIS_HASH, } from "./audit.js";
28
+ export { SessionManager } from "./session.js";
29
+ export { OpenAIAdapter, AnthropicAdapter } from "./adapters.js";
30
+ export type { WatchSignal, ReportSignal, NetworkSignal, CompositeScore, PolicyDecision, PolicyThresholds, AuditEntry, TiresiasSession, Message, MessageRole, LLMResponse, LLMAdapter, LLMCallOptions, TiresiasConfig, AuditStore, TiresiasCallResult, } from "./types.js";
31
+ export { DEFAULT_POLICY_THRESHOLDS } from "./types.js";
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChE,YAAY,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,OAAO,EACP,WAAW,EACX,WAAW,EACX,UAAU,EACV,cAAc,EACd,cAAc,EACd,UAAU,EACV,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ /**
3
+ * @salucallc/tiresias-sdk
4
+ * Unified Tiresias AI Safety SDK
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { Tiresias, OpenAIAdapter } from "@salucallc/tiresias-sdk";
9
+ *
10
+ * const tiresias = new Tiresias();
11
+ * const adapter = new OpenAIAdapter({ apiKey: process.env.OPENAI_API_KEY! });
12
+ *
13
+ * const result = await tiresias.call(
14
+ * [{ role: "user", content: "What is the capital of France?" }],
15
+ * adapter,
16
+ * { sessionId: "user-123" }
17
+ * );
18
+ *
19
+ * if (result.blocked) {
20
+ * console.log("Request blocked:", result.decision, result.composite.score);
21
+ * } else {
22
+ * console.log(result.llmResponse?.content);
23
+ * }
24
+ * ```
25
+ */
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ exports.DEFAULT_POLICY_THRESHOLDS = exports.AnthropicAdapter = exports.OpenAIAdapter = exports.SessionManager = exports.GENESIS_HASH = exports.MemoryAuditStore = exports.verifyChain = exports.buildAuditEntry = exports.hashRequest = exports.computeChainHash = exports.scoreToPolicy = exports.computeCompositeScore = exports.Tiresias = void 0;
28
+ var tiresias_js_1 = require("./tiresias.js");
29
+ Object.defineProperty(exports, "Tiresias", { enumerable: true, get: function () { return tiresias_js_1.Tiresias; } });
30
+ var scoring_js_1 = require("./scoring.js");
31
+ Object.defineProperty(exports, "computeCompositeScore", { enumerable: true, get: function () { return scoring_js_1.computeCompositeScore; } });
32
+ Object.defineProperty(exports, "scoreToPolicy", { enumerable: true, get: function () { return scoring_js_1.scoreToPolicy; } });
33
+ var audit_js_1 = require("./audit.js");
34
+ Object.defineProperty(exports, "computeChainHash", { enumerable: true, get: function () { return audit_js_1.computeChainHash; } });
35
+ Object.defineProperty(exports, "hashRequest", { enumerable: true, get: function () { return audit_js_1.hashRequest; } });
36
+ Object.defineProperty(exports, "buildAuditEntry", { enumerable: true, get: function () { return audit_js_1.buildAuditEntry; } });
37
+ Object.defineProperty(exports, "verifyChain", { enumerable: true, get: function () { return audit_js_1.verifyChain; } });
38
+ Object.defineProperty(exports, "MemoryAuditStore", { enumerable: true, get: function () { return audit_js_1.MemoryAuditStore; } });
39
+ Object.defineProperty(exports, "GENESIS_HASH", { enumerable: true, get: function () { return audit_js_1.GENESIS_HASH; } });
40
+ var session_js_1 = require("./session.js");
41
+ Object.defineProperty(exports, "SessionManager", { enumerable: true, get: function () { return session_js_1.SessionManager; } });
42
+ var adapters_js_1 = require("./adapters.js");
43
+ Object.defineProperty(exports, "OpenAIAdapter", { enumerable: true, get: function () { return adapters_js_1.OpenAIAdapter; } });
44
+ Object.defineProperty(exports, "AnthropicAdapter", { enumerable: true, get: function () { return adapters_js_1.AnthropicAdapter; } });
45
+ var types_js_1 = require("./types.js");
46
+ Object.defineProperty(exports, "DEFAULT_POLICY_THRESHOLDS", { enumerable: true, get: function () { return types_js_1.DEFAULT_POLICY_THRESHOLDS; } });
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;;AAEH,6CAAyC;AAAhC,uGAAA,QAAQ,OAAA;AACjB,2CAAoE;AAA3D,mHAAA,qBAAqB,OAAA;AAAE,2GAAA,aAAa,OAAA;AAC7C,uCAOoB;AANlB,4GAAA,gBAAgB,OAAA;AAChB,uGAAA,WAAW,OAAA;AACX,2GAAA,eAAe,OAAA;AACf,uGAAA,WAAW,OAAA;AACX,4GAAA,gBAAgB,OAAA;AAChB,wGAAA,YAAY,OAAA;AAEd,2CAA8C;AAArC,4GAAA,cAAc,OAAA;AACvB,6CAAgE;AAAvD,4GAAA,aAAa,OAAA;AAAE,+GAAA,gBAAgB,OAAA;AAmBxC,uCAAuD;AAA9C,qHAAA,yBAAyB,OAAA"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * PATENT-CRITICAL: Composite Risk Scoring (SALUCA-005 / cross_layer_orchestration)
3
+ *
4
+ * Composite formula:
5
+ * score = (0.5 × injection_threat) + (0.4 × pii_risk) + (0.1 × network_threat)
6
+ *
7
+ * This cross-module weighting is the novel IP element of the orchestration patent.
8
+ * The injection signal dominates (0.5) because it represents active adversarial attack;
9
+ * PII leakage is structural risk (0.4); network telemetry is ambient context (0.1).
10
+ */
11
+ import type { WatchSignal, ReportSignal, NetworkSignal, CompositeScore, PolicyDecision, PolicyThresholds } from "./types.js";
12
+ /**
13
+ * Compute composite risk score from three independent safety signals.
14
+ * PATENT-CRITICAL: formula and weights are novel claims in SALUCA-005.
15
+ */
16
+ export declare function computeCompositeScore(watch: WatchSignal, report: ReportSignal, network: NetworkSignal, thresholds?: PolicyThresholds): CompositeScore;
17
+ /**
18
+ * Map composite score to policy decision using configured thresholds.
19
+ * Default thresholds are patent-critical nominal values.
20
+ */
21
+ export declare function scoreToPolicy(score: number, thresholds?: PolicyThresholds): PolicyDecision;
22
+ //# sourceMappingURL=scoring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../src/scoring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,cAAc,EACd,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAQpB;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,aAAa,EACtB,UAAU,GAAE,gBAA4C,GACvD,cAAc,CAiBhB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,gBAA4C,GACvD,cAAc,CAKhB"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * PATENT-CRITICAL: Composite Risk Scoring (SALUCA-005 / cross_layer_orchestration)
4
+ *
5
+ * Composite formula:
6
+ * score = (0.5 × injection_threat) + (0.4 × pii_risk) + (0.1 × network_threat)
7
+ *
8
+ * This cross-module weighting is the novel IP element of the orchestration patent.
9
+ * The injection signal dominates (0.5) because it represents active adversarial attack;
10
+ * PII leakage is structural risk (0.4); network telemetry is ambient context (0.1).
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.computeCompositeScore = computeCompositeScore;
14
+ exports.scoreToPolicy = scoreToPolicy;
15
+ const types_js_1 = require("./types.js");
16
+ // Composite weight constants — PATENT-CRITICAL
17
+ const W_INJECTION = 0.5;
18
+ const W_PII = 0.4;
19
+ const W_NETWORK = 0.1;
20
+ /**
21
+ * Compute composite risk score from three independent safety signals.
22
+ * PATENT-CRITICAL: formula and weights are novel claims in SALUCA-005.
23
+ */
24
+ function computeCompositeScore(watch, report, network, thresholds = types_js_1.DEFAULT_POLICY_THRESHOLDS) {
25
+ const score = clamp(W_INJECTION * watch.injectionThreat +
26
+ W_PII * report.piiRisk +
27
+ W_NETWORK * network.networkThreat);
28
+ const policy = scoreToPolicy(score, thresholds);
29
+ return {
30
+ score,
31
+ injectionThreat: watch.injectionThreat,
32
+ piiRisk: report.piiRisk,
33
+ networkThreat: network.networkThreat,
34
+ policy,
35
+ timestamp: Date.now(),
36
+ };
37
+ }
38
+ /**
39
+ * Map composite score to policy decision using configured thresholds.
40
+ * Default thresholds are patent-critical nominal values.
41
+ */
42
+ function scoreToPolicy(score, thresholds = types_js_1.DEFAULT_POLICY_THRESHOLDS) {
43
+ if (score >= thresholds.quarantineAt)
44
+ return "QUARANTINE";
45
+ if (score >= thresholds.blockAt)
46
+ return "BLOCK";
47
+ if (score >= thresholds.warnAt)
48
+ return "WARN";
49
+ return "ALLOW";
50
+ }
51
+ function clamp(v, lo = 0, hi = 1) {
52
+ return Math.min(Math.max(v, lo), hi);
53
+ }
54
+ //# sourceMappingURL=scoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring.js","sourceRoot":"","sources":["../src/scoring.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAqBH,sDAsBC;AAMD,sCAQC;AA/CD,yCAAuD;AAEvD,+CAA+C;AAC/C,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,KAAK,GAAG,GAAG,CAAC;AAClB,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB;;;GAGG;AACH,SAAgB,qBAAqB,CACnC,KAAkB,EAClB,MAAoB,EACpB,OAAsB,EACtB,aAA+B,oCAAyB;IAExD,MAAM,KAAK,GAAG,KAAK,CACjB,WAAW,GAAG,KAAK,CAAC,eAAe;QACnC,KAAK,GAAG,MAAM,CAAC,OAAO;QACtB,SAAS,GAAG,OAAO,CAAC,aAAa,CAClC,CAAC;IAEF,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAEhD,OAAO;QACL,KAAK;QACL,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,MAAM;QACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa,CAC3B,KAAa,EACb,aAA+B,oCAAyB;IAExD,IAAI,KAAK,IAAI,UAAU,CAAC,YAAY;QAAE,OAAO,YAAY,CAAC;IAC1D,IAAI,KAAK,IAAI,UAAU,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,KAAK,IAAI,UAAU,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC9C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,KAAK,CAAC,CAAS,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;IACtC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Tiresias Session Manager
3
+ * Tracks per-session state: request count, last score, audit chain head.
4
+ */
5
+ import type { TiresiasSession, CompositeScore } from "./types.js";
6
+ export declare class SessionManager {
7
+ private sessions;
8
+ create(sessionId?: string): TiresiasSession;
9
+ get(sessionId: string): TiresiasSession | undefined;
10
+ getOrCreate(sessionId: string): TiresiasSession;
11
+ update(sessionId: string, score: CompositeScore, newChainHash: string): void;
12
+ list(): TiresiasSession[];
13
+ delete(sessionId: string): boolean;
14
+ }
15
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGlE,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA2C;IAE3D,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,eAAe;IAa3C,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAInD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe;IAI/C,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAQ5E,IAAI,IAAI,eAAe,EAAE;IAIzB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;CAGnC"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ /**
3
+ * Tiresias Session Manager
4
+ * Tracks per-session state: request count, last score, audit chain head.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SessionManager = void 0;
8
+ const node_crypto_1 = require("node:crypto");
9
+ const audit_js_1 = require("./audit.js");
10
+ class SessionManager {
11
+ sessions = new Map();
12
+ create(sessionId) {
13
+ const id = sessionId ?? (0, node_crypto_1.randomUUID)();
14
+ const session = {
15
+ sessionId: id,
16
+ createdAt: Date.now(),
17
+ requestCount: 0,
18
+ lastScore: null,
19
+ auditChainHead: audit_js_1.GENESIS_HASH,
20
+ };
21
+ this.sessions.set(id, session);
22
+ return session;
23
+ }
24
+ get(sessionId) {
25
+ return this.sessions.get(sessionId);
26
+ }
27
+ getOrCreate(sessionId) {
28
+ return this.sessions.get(sessionId) ?? this.create(sessionId);
29
+ }
30
+ update(sessionId, score, newChainHash) {
31
+ const session = this.getOrCreate(sessionId);
32
+ session.requestCount += 1;
33
+ session.lastScore = score;
34
+ session.auditChainHead = newChainHash;
35
+ this.sessions.set(sessionId, session);
36
+ }
37
+ list() {
38
+ return Array.from(this.sessions.values());
39
+ }
40
+ delete(sessionId) {
41
+ return this.sessions.delete(sessionId);
42
+ }
43
+ }
44
+ exports.SessionManager = SessionManager;
45
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,6CAAyC;AAEzC,yCAA0C;AAE1C,MAAa,cAAc;IACjB,QAAQ,GAAiC,IAAI,GAAG,EAAE,CAAC;IAE3D,MAAM,CAAC,SAAkB;QACvB,MAAM,EAAE,GAAG,SAAS,IAAI,IAAA,wBAAU,GAAE,CAAC;QACrC,MAAM,OAAO,GAAoB;YAC/B,SAAS,EAAE,EAAE;YACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,uBAAY;SAC7B,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,GAAG,CAAC,SAAiB;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,WAAW,CAAC,SAAiB;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,CAAC,SAAiB,EAAE,KAAqB,EAAE,YAAoB;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC5C,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;QAC1B,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;QAC1B,OAAO,CAAC,cAAc,GAAG,YAAY,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,SAAiB;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;CACF;AAvCD,wCAuCC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Tiresias SDK — Main Orchestrator
3
+ *
4
+ * tiresias.call(messages, adapter, options) is the high-level entry point.
5
+ * It runs the three safety signals, computes composite score, applies policy,
6
+ * writes a hash-chained audit entry, and either passes through to the LLM
7
+ * or blocks the request.
8
+ */
9
+ import type { Message, LLMAdapter, LLMCallOptions, TiresiasCallResult, TiresiasConfig } from "./types.js";
10
+ import { MemoryAuditStore } from "./audit.js";
11
+ import { SessionManager } from "./session.js";
12
+ export declare class Tiresias {
13
+ private config;
14
+ private sessions;
15
+ private auditStore;
16
+ constructor(config?: TiresiasConfig);
17
+ /**
18
+ * Main entry point.
19
+ * 1. Run watch (injection detection)
20
+ * 2. Run report (PII scan)
21
+ * 3. Get network signal (passthrough or provider)
22
+ * 4. Compute composite score
23
+ * 5. Apply policy
24
+ * 6. Write hash-chained audit entry
25
+ * 7. If ALLOW/WARN: call LLM adapter and return response
26
+ * If BLOCK/QUARANTINE: return without calling LLM
27
+ */
28
+ call(messages: Message[], adapter: LLMAdapter, options?: LLMCallOptions & {
29
+ sessionId?: string;
30
+ }): Promise<TiresiasCallResult>;
31
+ /** Audit log access */
32
+ get audit(): MemoryAuditStore;
33
+ /** Session access */
34
+ get session(): SessionManager;
35
+ private runWatchSignal;
36
+ private runReportSignal;
37
+ private runNetworkSignal;
38
+ }
39
+ //# sourceMappingURL=tiresias.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiresias.d.ts","sourceRoot":"","sources":["../src/tiresias.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,cAAc,EAIf,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAmB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAY9C,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,UAAU,CAAmB;gBAEzB,MAAM,GAAE,cAAmB;IAMvC;;;;;;;;;;OAUG;IACG,IAAI,CACR,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,UAAU,EACnB,OAAO,GAAE,cAAc,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACpD,OAAO,CAAC,kBAAkB,CAAC;IAwE9B,uBAAuB;IACvB,IAAI,KAAK,IAAI,gBAAgB,CAE5B;IAED,qBAAqB;IACrB,IAAI,OAAO,IAAI,cAAc,CAE5B;YAIa,cAAc;YA4Cd,eAAe;YAef,gBAAgB;CAW/B"}