@tenova/swt3-ai 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,7 +2,7 @@ Cryptographic AI Governance for the Edge. Zero Latency. Zero Data Retention.
2
2
 
3
3
  # @tenova/swt3-ai
4
4
 
5
- **SWT3 AI Witness SDK for TypeScript** continuous, cryptographic attestation for AI systems. Prove your models are running approved weights, safety guardrails are active, and inferences are traceable. All without a single prompt or response ever leaving your infrastructure.
5
+ **SWT3 AI Witness SDK for TypeScript**: continuous, cryptographic attestation for AI systems. Prove your models are running approved weights, safety guardrails are active, and inferences are traceable. All without a single prompt or response ever leaving your infrastructure.
6
6
 
7
7
  Works with OpenAI, Anthropic, Vercel AI SDK, and any OpenAI-compatible endpoint (vLLM, Ollama, Azure, Llama.cpp).
8
8
 
@@ -22,14 +22,14 @@ const witness = new Witness({
22
22
 
23
23
  const client = witness.wrap(new OpenAI()) as OpenAI;
24
24
 
25
- // Non-streaming works exactly as before
25
+ // Non-streaming, works exactly as before
26
26
  const response = await client.chat.completions.create({
27
27
  model: "gpt-4o",
28
28
  messages: [{ role: "user", content: "Summarize this contract..." }],
29
29
  });
30
30
  console.log(response.choices[0].message.content);
31
31
 
32
- // Streaming also works. Chunks arrive in real-time, witnessing happens after.
32
+ // Streaming, also works. Chunks arrive in real-time, witnessing happens after.
33
33
  const stream = await client.chat.completions.create({
34
34
  model: "gpt-4o",
35
35
  messages: [{ role: "user", content: "Explain quantum computing" }],
@@ -93,17 +93,17 @@ const result = await streamText({
93
93
  onFinish: witness.vercelOnFinish({ promptText: prompt }),
94
94
  });
95
95
 
96
- // Works with any Vercel AI SDK providerOpenAI, Anthropic, Google, Mistral, custom
96
+ // Works with any Vercel AI SDK provider:OpenAI, Anthropic, Google, Mistral, custom
97
97
  ```
98
98
 
99
99
  The `onFinish` hook is framework-idiomatic: no wrapping, no proxying, no monkey-patching. It fires after the stream completes and receives a normalized result regardless of provider.
100
100
 
101
101
  ## Sovereign Cloud Support
102
102
 
103
- The SDK works out-of-the-box with any OpenAI-compatible endpoint. Run Llama 3 on vLLM, Mistral on Ollama, or any model behind an OpenAI-compatible APIevery inference is witnessed identically.
103
+ The SDK works out-of-the-box with any OpenAI-compatible endpoint. Run Llama 3 on vLLM, Mistral on Ollama, or any model behind an OpenAI-compatible API:every inference is witnessed identically.
104
104
 
105
105
  ```typescript
106
- // vLLM with Llama 3 sovereign cloud, your hardware
106
+ // vLLM with Llama 3, sovereign cloud, your hardware
107
107
  const client = witness.wrap(
108
108
  new OpenAI({ baseURL: "http://gpu-cluster.internal:8000/v1" }),
109
109
  ) as OpenAI;
@@ -112,7 +112,7 @@ const response = await client.chat.completions.create({
112
112
  model: "meta-llama/Meta-Llama-3-70B-Instruct",
113
113
  messages: [{ role: "user", content: "Classify this threat indicator" }],
114
114
  });
115
- // Same SWT3 anchor, same ledger, same audit trailregardless of where the model runs
115
+ // Same SWT3 anchor, same ledger, same audit trail:regardless of where the model runs
116
116
 
117
117
  // Ollama (local development)
118
118
  const localClient = witness.wrap(
@@ -130,12 +130,12 @@ const azureClient = witness.wrap(
130
130
 
131
131
  ## What Happens Per Inference
132
132
 
133
- 1. **Intercept** ES6 Proxy wraps your AI client transparently
134
- 2. **Hash** Prompts and responses are SHA-256 hashed in-process
135
- 3. **Extract** Model hash, latency, token count, refusal status numeric factors
136
- 4. **Clear** Raw text is purged from the wire payload (configurable clearing level)
137
- 5. **Buffer** Factors queued in background, flushed to the SWT3 ledger asynchronously
138
- 6. **Return** Your original response returns untouched, zero added latency
133
+ 1. **Intercept**: ES6 Proxy wraps your AI client transparently
134
+ 2. **Hash**: Prompts and responses are SHA-256 hashed in-process
135
+ 3. **Extract**: Model hash, latency, token count, refusal status as numeric factors
136
+ 4. **Clear**: Raw text is purged from the wire payload (configurable clearing level)
137
+ 5. **Buffer**: Factors queued in background, flushed to the SWT3 ledger asynchronously
138
+ 6. **Return**: Your original response returns untouched, zero added latency
139
139
 
140
140
  For streaming: chunks arrive to the developer in real-time. The SDK accumulates content in the background and witnesses after the stream completes.
141
141
 
@@ -148,7 +148,7 @@ For streaming: chunks arrive to the developer in real-time. The SDK accumulates
148
148
  | 2 | Sensitive | Hashes + factors + model only | Healthcare, legal, PII |
149
149
  | 3 | Classified | Numeric factors only. Model ID hashed. | Defense, air-gapped |
150
150
 
151
- At Level 1+, raw prompts and responses **never leave your infrastructure**. The witness endpoint is a "Blind Registrar"it stores cryptographic proofs, not data.
151
+ At Level 1+, raw prompts and responses **never leave your infrastructure**. The witness endpoint is a "Blind Registrar":it stores cryptographic proofs, not data.
152
152
 
153
153
  ```typescript
154
154
  // Healthcare deployment: Level 2
@@ -224,6 +224,8 @@ npm install @anthropic-ai/sdk # for Anthropic adapter
224
224
  | `timeout` | `10000` | HTTP timeout (ms) |
225
225
  | `maxRetries` | `3` | Retries before dead-letter |
226
226
  | `guardrailNames` | `[]` | Active guardrail names |
227
+ | `factorHandoff` | - | `"file"` to enable local factor export |
228
+ | `factorHandoffPath` | - | Directory for factor handoff files |
227
229
 
228
230
  ### `witness.wrap(client)`
229
231
 
@@ -241,6 +243,34 @@ Force-flush all buffered payloads. Returns receipts.
241
243
 
242
244
  Stop the witness and flush remaining payloads.
243
245
 
246
+ ## Factor Handoff (Clearing Level 2+)
247
+
248
+ At Clearing Level 2 or 3, some or all verifiable data is stripped before it reaches the witness endpoint. The Factor Handoff writes your factors to a local directory **before** clearing proceeds. If the write fails, the payload is not transmitted.
249
+
250
+ ```typescript
251
+ const witness = new Witness({
252
+ endpoint: "https://sovereign.tenova.io",
253
+ apiKey: "axm_live_...",
254
+ tenantId: "YOUR_ENCLAVE",
255
+ clearingLevel: 3,
256
+ factorHandoff: "file",
257
+ factorHandoffPath: "/secure/vault/factors/",
258
+ });
259
+ ```
260
+
261
+ Each anchor gets its own JSON file containing the full uncleared factors and metadata for independent re-verification.
262
+
263
+ For the full protocol specification, see the [Factor Handoff Protocol](https://sovereign.tenova.io/docs/factor-handoff-protocol.html).
264
+
265
+ ## Documentation
266
+
267
+ - [SDK Developer Docs](https://sovereign.tenova.io/docs/) - Quickstart, providers, clearing levels, configuration
268
+ - [Factor Handoff Protocol](https://sovereign.tenova.io/docs/factor-handoff-protocol.html) - How factors are securely transferred to your custody
269
+ - [Clearing Protocol Terms](https://sovereign.tenova.io/terms/clearing-addendum) - Shared responsibility model and liability
270
+ - [CMMC Compliance Overlay](https://sovereign.tenova.io/guides/cmmc-overlay.html) - Control mappings for defense industrial base
271
+
244
272
  ---
245
273
 
246
274
  *SWT3: Sovereign Witness Traceability. We don't run your models. We witness them.*
275
+
276
+ SWT3 and Sovereign Witness Traceability are trademarks of Tenable Nova LLC. Patent pending. Apache 2.0 licensed.
@@ -0,0 +1,33 @@
1
+ /**
2
+ * SWT3 AI Witness SDK — AWS Bedrock Adapter (ES6 Proxy).
3
+ *
4
+ * Wraps the @aws-sdk/client-bedrock-runtime client so that
5
+ * `client.send(new ConverseCommand(...))` and
6
+ * `client.send(new InvokeModelCommand(...))` are intercepted.
7
+ *
8
+ * AWS Bedrock uses the Command pattern:
9
+ * const response = await client.send(new ConverseCommand({ modelId, messages }));
10
+ *
11
+ * The adapter intercepts `send()` and checks if the command is a
12
+ * ConverseCommand or InvokeModelCommand to extract factors.
13
+ *
14
+ * Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
15
+ */
16
+ import type { Witness } from "../witness.js";
17
+ /**
18
+ * Wrap a BedrockRuntimeClient with transparent witnessing.
19
+ *
20
+ * Usage:
21
+ * import { BedrockRuntimeClient, ConverseCommand } from "@aws-sdk/client-bedrock-runtime";
22
+ * import { Witness } from "@tenova/swt3-ai";
23
+ *
24
+ * const witness = new Witness({ endpoint, apiKey, tenantId });
25
+ * const client = witness.wrap(new BedrockRuntimeClient({ region: "us-east-1" }));
26
+ *
27
+ * const response = await client.send(new ConverseCommand({
28
+ * modelId: "anthropic.claude-3-5-sonnet-20241022-v2:0",
29
+ * messages: [{ role: "user", content: [{ text: "Hello" }] }],
30
+ * }));
31
+ */
32
+ export declare function wrapBedrock(client: unknown, witness: Witness): unknown;
33
+ //# sourceMappingURL=bedrock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bedrock.d.ts","sourceRoot":"","sources":["../../src/adapters/bedrock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAatE"}
@@ -0,0 +1,259 @@
1
+ /**
2
+ * SWT3 AI Witness SDK — AWS Bedrock Adapter (ES6 Proxy).
3
+ *
4
+ * Wraps the @aws-sdk/client-bedrock-runtime client so that
5
+ * `client.send(new ConverseCommand(...))` and
6
+ * `client.send(new InvokeModelCommand(...))` are intercepted.
7
+ *
8
+ * AWS Bedrock uses the Command pattern:
9
+ * const response = await client.send(new ConverseCommand({ modelId, messages }));
10
+ *
11
+ * The adapter intercepts `send()` and checks if the command is a
12
+ * ConverseCommand or InvokeModelCommand to extract factors.
13
+ *
14
+ * Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
15
+ */
16
+ import { sha256Truncated } from "../fingerprint.js";
17
+ /**
18
+ * Wrap a BedrockRuntimeClient with transparent witnessing.
19
+ *
20
+ * Usage:
21
+ * import { BedrockRuntimeClient, ConverseCommand } from "@aws-sdk/client-bedrock-runtime";
22
+ * import { Witness } from "@tenova/swt3-ai";
23
+ *
24
+ * const witness = new Witness({ endpoint, apiKey, tenantId });
25
+ * const client = witness.wrap(new BedrockRuntimeClient({ region: "us-east-1" }));
26
+ *
27
+ * const response = await client.send(new ConverseCommand({
28
+ * modelId: "anthropic.claude-3-5-sonnet-20241022-v2:0",
29
+ * messages: [{ role: "user", content: [{ text: "Hello" }] }],
30
+ * }));
31
+ */
32
+ export function wrapBedrock(client, witness) {
33
+ return new Proxy(client, {
34
+ get(target, prop) {
35
+ if (typeof prop === "symbol")
36
+ return Reflect.get(target, prop);
37
+ const real = Reflect.get(target, prop);
38
+ if (prop === "send" && typeof real === "function") {
39
+ return createSendInterceptor(real, witness, target);
40
+ }
41
+ return real;
42
+ },
43
+ });
44
+ }
45
+ function createSendInterceptor(realSend, witness, thisArg) {
46
+ return async function interceptedSend(...args) {
47
+ const command = args[0];
48
+ if (!command)
49
+ return realSend.call(thisArg, ...args);
50
+ // Detect command type by constructor name
51
+ const commandName = command.constructor?.name ?? "";
52
+ if (commandName === "ConverseCommand") {
53
+ return handleConverse(realSend, thisArg, command, witness, args);
54
+ }
55
+ if (commandName === "InvokeModelCommand") {
56
+ return handleInvokeModel(realSend, thisArg, command, witness, args);
57
+ }
58
+ // Not a command we intercept — pass through
59
+ return realSend.call(thisArg, ...args);
60
+ };
61
+ }
62
+ // ── Converse Command Handler ──────────────────────────────────────
63
+ async function handleConverse(realSend, thisArg, command, witness, args) {
64
+ const input = command.input ?? command;
65
+ const modelId = input.modelId ?? "unknown";
66
+ const messages = input.messages ?? [];
67
+ const promptText = extractConversePrompt(messages);
68
+ const promptHash = sha256Truncated(promptText);
69
+ const start = performance.now();
70
+ const response = await realSend.call(thisArg, ...args);
71
+ const elapsedMs = Math.round(performance.now() - start);
72
+ const resp = response;
73
+ const record = extractConverseRecord(resp, modelId, promptHash, elapsedMs);
74
+ witness.record(record);
75
+ return response;
76
+ }
77
+ // ── InvokeModel Command Handler ──────────────────────────────────
78
+ async function handleInvokeModel(realSend, thisArg, command, witness, args) {
79
+ const input = command.input ?? command;
80
+ const modelId = input.modelId ?? "unknown";
81
+ // Parse the body to get prompt
82
+ let body = {};
83
+ const rawBody = input.body;
84
+ if (typeof rawBody === "string") {
85
+ try {
86
+ body = JSON.parse(rawBody);
87
+ }
88
+ catch { /* empty */ }
89
+ }
90
+ else if (rawBody instanceof Uint8Array) {
91
+ try {
92
+ body = JSON.parse(new TextDecoder().decode(rawBody));
93
+ }
94
+ catch { /* empty */ }
95
+ }
96
+ const promptText = extractInvokePrompt(body, modelId);
97
+ const promptHash = sha256Truncated(promptText);
98
+ const start = performance.now();
99
+ const response = await realSend.call(thisArg, ...args);
100
+ const elapsedMs = Math.round(performance.now() - start);
101
+ const resp = response;
102
+ const record = extractInvokeRecord(resp, modelId, promptHash, elapsedMs);
103
+ witness.record(record);
104
+ return response;
105
+ }
106
+ // ── Prompt Extraction ─────────────────────────────────────────────
107
+ function extractConversePrompt(messages) {
108
+ const parts = [];
109
+ for (const msg of messages) {
110
+ const m = msg;
111
+ const content = m.content;
112
+ if (Array.isArray(content)) {
113
+ for (const block of content) {
114
+ const b = block;
115
+ if (b.text)
116
+ parts.push(b.text);
117
+ }
118
+ }
119
+ else if (typeof content === "string") {
120
+ parts.push(content);
121
+ }
122
+ }
123
+ return parts.join("\n");
124
+ }
125
+ function extractInvokePrompt(body, modelId) {
126
+ // Anthropic on Bedrock
127
+ const messages = body.messages;
128
+ if (messages?.length) {
129
+ const parts = [];
130
+ for (const msg of messages) {
131
+ const m = msg;
132
+ const content = m.content;
133
+ if (typeof content === "string") {
134
+ parts.push(content);
135
+ }
136
+ else if (Array.isArray(content)) {
137
+ for (const block of content) {
138
+ const b = block;
139
+ if (b.type === "text" && b.text)
140
+ parts.push(b.text);
141
+ }
142
+ }
143
+ }
144
+ if (parts.length)
145
+ return parts.join("\n");
146
+ }
147
+ // Amazon Titan
148
+ if (body.inputText)
149
+ return body.inputText;
150
+ // Meta Llama
151
+ if (body.prompt)
152
+ return body.prompt;
153
+ return JSON.stringify(body);
154
+ }
155
+ // ── Record Extraction ─────────────────────────────────────────────
156
+ function extractConverseRecord(response, modelId, promptHash, elapsedMs) {
157
+ let responseText = "";
158
+ let hasRefusal = false;
159
+ const output = response.output;
160
+ const message = output?.message;
161
+ const content = message?.content;
162
+ if (content) {
163
+ for (const block of content) {
164
+ if (block.text)
165
+ responseText += block.text;
166
+ }
167
+ }
168
+ const stopReason = response.stopReason;
169
+ if (stopReason === "content_filtered")
170
+ hasRefusal = true;
171
+ const usage = response.usage;
172
+ const inputTokens = usage?.inputTokens;
173
+ const outputTokens = usage?.outputTokens;
174
+ return {
175
+ modelId: modelId,
176
+ modelHash: sha256Truncated(modelId),
177
+ promptHash: promptHash,
178
+ responseHash: sha256Truncated(responseText || ""),
179
+ latencyMs: elapsedMs,
180
+ inputTokens: inputTokens ?? undefined,
181
+ outputTokens: outputTokens ?? undefined,
182
+ hasRefusal: hasRefusal,
183
+ provider: "bedrock",
184
+ systemFingerprint: undefined,
185
+ guardrailsActive: 0,
186
+ guardrailsRequired: 0,
187
+ guardrailPassed: true,
188
+ guardrailNames: [],
189
+ };
190
+ }
191
+ function extractInvokeRecord(response, modelId, promptHash, elapsedMs) {
192
+ let responseText = "";
193
+ let hasRefusal = false;
194
+ let inputTokens = null;
195
+ let outputTokens = null;
196
+ try {
197
+ let body = {};
198
+ const rawBody = response.body;
199
+ if (rawBody instanceof Uint8Array) {
200
+ body = JSON.parse(new TextDecoder().decode(rawBody));
201
+ }
202
+ else if (typeof rawBody === "string") {
203
+ body = JSON.parse(rawBody);
204
+ }
205
+ // Anthropic on Bedrock
206
+ if (body.content) {
207
+ const content = body.content;
208
+ if (Array.isArray(content)) {
209
+ for (const block of content) {
210
+ if (block.type === "text" && block.text)
211
+ responseText += block.text;
212
+ }
213
+ }
214
+ else if (typeof content === "string") {
215
+ responseText = content;
216
+ }
217
+ }
218
+ // Amazon Titan
219
+ else if (body.results) {
220
+ const results = body.results;
221
+ if (results[0]?.outputText)
222
+ responseText = results[0].outputText;
223
+ }
224
+ // Meta Llama
225
+ else if (body.generation) {
226
+ responseText = body.generation;
227
+ }
228
+ // Usage
229
+ const usage = body.usage;
230
+ if (usage) {
231
+ inputTokens = (usage.input_tokens ?? usage.inputTokens ?? null);
232
+ outputTokens = (usage.output_tokens ?? usage.outputTokens ?? null);
233
+ }
234
+ // Refusal
235
+ const stopReason = (body.stop_reason ?? body.stopReason ?? "");
236
+ if (stopReason.toLowerCase().includes("content_filter"))
237
+ hasRefusal = true;
238
+ }
239
+ catch {
240
+ // Parse failure — still witness with what we have
241
+ }
242
+ return {
243
+ modelId: modelId,
244
+ modelHash: sha256Truncated(modelId),
245
+ promptHash: promptHash,
246
+ responseHash: sha256Truncated(responseText || ""),
247
+ latencyMs: elapsedMs,
248
+ inputTokens: inputTokens ?? undefined,
249
+ outputTokens: outputTokens ?? undefined,
250
+ hasRefusal: hasRefusal,
251
+ provider: "bedrock",
252
+ systemFingerprint: undefined,
253
+ guardrailsActive: 0,
254
+ guardrailsRequired: 0,
255
+ guardrailPassed: true,
256
+ guardrailNames: [],
257
+ };
258
+ }
259
+ //# sourceMappingURL=bedrock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bedrock.js","sourceRoot":"","sources":["../../src/adapters/bedrock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * SWT3 AI Witness SDK — Factor Handoff (Local File Export).
3
+ *
4
+ * Writes factor data to local JSON files before the clearing engine strips
5
+ * them from the wire payload. If the write fails, clearing does NOT proceed.
6
+ *
7
+ * Spec: SWT3 Factor Handoff Protocol v1.0.0
8
+ */
9
+ import type { WitnessPayload, InferenceRecord } from "./types.js";
10
+ /**
11
+ * Write one JSON file per payload to the handoff directory.
12
+ *
13
+ * Throws on failure — the caller must NOT proceed with clearing
14
+ * if this function throws.
15
+ */
16
+ export declare function writeHandoffFiles(payloads: WitnessPayload[], inference: InferenceRecord, tenantId: string, handoffPath: string): void;
17
+ //# sourceMappingURL=handoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../src/handoff.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAoClE;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,cAAc,EAAE,EAC1B,SAAS,EAAE,eAAe,EAC1B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,IAAI,CA+BN"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * SWT3 AI Witness SDK — Factor Handoff (Local File Export).
3
+ *
4
+ * Writes factor data to local JSON files before the clearing engine strips
5
+ * them from the wire payload. If the write fails, clearing does NOT proceed.
6
+ *
7
+ * Spec: SWT3 Factor Handoff Protocol v1.0.0
8
+ */
9
+ import { writeFileSync, mkdirSync, renameSync, unlinkSync, chmodSync } from "node:fs";
10
+ import { join } from "node:path";
11
+ const HANDOFF_VERSION = "1.0.0";
12
+ /**
13
+ * Write one JSON file per payload to the handoff directory.
14
+ *
15
+ * Throws on failure — the caller must NOT proceed with clearing
16
+ * if this function throws.
17
+ */
18
+ export function writeHandoffFiles(payloads, inference, tenantId, handoffPath) {
19
+ mkdirSync(handoffPath, { recursive: true });
20
+ for (const payload of payloads) {
21
+ const record = buildHandoffRecord(payload, inference, tenantId);
22
+ const filename = `${payload.anchor_fingerprint}.json`;
23
+ const filepath = join(handoffPath, filename);
24
+ const tmpPath = filepath + ".tmp";
25
+ try {
26
+ writeFileSync(tmpPath, JSON.stringify(record, null, 2) + "\n", "utf-8");
27
+ // Set restrictive permissions (owner read/write only, 0o600)
28
+ try {
29
+ chmodSync(tmpPath, 0o600);
30
+ }
31
+ catch {
32
+ // chmod may not be supported on all platforms (e.g., Windows)
33
+ }
34
+ // Atomic rename
35
+ renameSync(tmpPath, filepath);
36
+ }
37
+ catch (err) {
38
+ // Clean up temp file on failure
39
+ try {
40
+ unlinkSync(tmpPath);
41
+ }
42
+ catch {
43
+ // ignore cleanup errors
44
+ }
45
+ throw err;
46
+ }
47
+ }
48
+ }
49
+ function buildHandoffRecord(payload, inference, tenantId) {
50
+ return {
51
+ handoff_version: HANDOFF_VERSION,
52
+ handoff_type: `clearing_level_${payload.clearing_level}`,
53
+ tenant_id: tenantId,
54
+ timestamp_iso: new Date(payload.anchor_epoch * 1000).toISOString(),
55
+ anchor_fingerprint: payload.anchor_fingerprint,
56
+ anchor_epoch: payload.anchor_epoch,
57
+ fingerprint_timestamp_ms: payload.fingerprint_timestamp_ms,
58
+ clearing_level: payload.clearing_level,
59
+ factors: {
60
+ procedure_id: payload.procedure_id,
61
+ factor_a: payload.factor_a,
62
+ factor_b: payload.factor_b,
63
+ factor_c: payload.factor_c,
64
+ },
65
+ metadata: {
66
+ ai_model_id: inference.modelId,
67
+ ai_model_hash: inference.modelHash,
68
+ ai_prompt_hash: inference.promptHash,
69
+ ai_response_hash: inference.responseHash,
70
+ ai_latency_ms: inference.latencyMs,
71
+ ai_input_tokens: inference.inputTokens,
72
+ ai_output_tokens: inference.outputTokens,
73
+ ai_provider: inference.provider,
74
+ ai_system_fingerprint: inference.systemFingerprint,
75
+ ai_guardrail_names: inference.guardrailNames ?? [],
76
+ ai_guardrails_active: inference.guardrailsActive,
77
+ ai_guardrails_required: inference.guardrailsRequired,
78
+ ai_guardrail_passed: inference.guardrailPassed,
79
+ },
80
+ };
81
+ }
82
+ //# sourceMappingURL=handoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../src/handoff.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -14,6 +14,8 @@ export interface WitnessConfig {
14
14
  guardrailsRequired: number;
15
15
  guardrailNames: string[];
16
16
  procedures?: string[];
17
+ factorHandoff?: "file";
18
+ factorHandoffPath?: string;
17
19
  }
18
20
  export interface WitnessPayload {
19
21
  procedure_id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB,EAAE,MAAM,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE;QACX,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,mDAAmD;AACnD,eAAO,MAAM,aAAa,aAQxB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB,EAAE,MAAM,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE;QACX,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,mDAAmD;AACnD,eAAO,MAAM,aAAa,aAQxB,CAAC"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4EH,mDAAmD;AACnD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IACnC,UAAU,EAAE,UAAU,EAAE,UAAU;IAClC,UAAU,EAAE,UAAU,EAAE,UAAU;IAClC,UAAU,EAAE,UAAU,EAAE,UAAU;IAClC,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE,WAAW;CACzB,CAAC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8EH,mDAAmD;AACnD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IACnC,UAAU,EAAE,UAAU,EAAE,UAAU;IAClC,UAAU,EAAE,UAAU,EAAE,UAAU;IAClC,UAAU,EAAE,UAAU,EAAE,UAAU;IAClC,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE,WAAW;CACzB,CAAC,CAAC"}
package/dist/witness.d.ts CHANGED
@@ -16,6 +16,8 @@
16
16
  *
17
17
  * // Graceful shutdown
18
18
  * await witness.flush();
19
+ *
20
+ * Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
19
21
  */
20
22
  import { type VercelOnFinishOptions } from "./adapters/vercel-ai.js";
21
23
  import type { WitnessReceipt, InferenceRecord } from "./types.js";
@@ -32,6 +34,8 @@ export interface WitnessOptions {
32
34
  guardrailsRequired?: number;
33
35
  guardrailNames?: string[];
34
36
  procedures?: string[];
37
+ factorHandoff?: "file";
38
+ factorHandoffPath?: string;
35
39
  }
36
40
  export declare class Witness {
37
41
  private config;
@@ -51,6 +55,10 @@ export declare class Witness {
51
55
  /**
52
56
  * Record a witnessed inference. Extracts factors, applies clearing,
53
57
  * and enqueues payloads for background flush.
58
+ *
59
+ * If factorHandoff is configured, factors are written to the handoff
60
+ * destination BEFORE clearing proceeds. If the handoff fails, the
61
+ * payload is NOT transmitted.
54
62
  */
55
63
  record(inference: InferenceRecord): void;
56
64
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"witness.d.ts","sourceRoot":"","sources":["../src/witness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH,OAAO,EAAwB,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC3F,OAAO,KAAK,EAAiC,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEjG,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAgB;gBAElB,OAAO,EAAE,cAAc;IAwBnC;;;;;;;;;OASG;IACH,IAAI,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO;IAoB9B;;;OAGG;IACH,MAAM,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IAoBxC;;;;;;;;;OASG;IACH,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI;IAI1E,yCAAyC;IACnC,KAAK,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAIxC,qDAAqD;IAC/C,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAIvC,kCAAkC;IAClC,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,2CAA2C;IAC3C,IAAI,QAAQ,IAAI,cAAc,EAAE,CAE/B;CACF"}
1
+ {"version":3,"file":"witness.d.ts","sourceRoot":"","sources":["../src/witness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AASH,OAAO,EAAwB,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC3F,OAAO,KAAK,EAAiC,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEjG,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAgB;gBAElB,OAAO,EAAE,cAAc;IAgCnC;;;;;;;;;OASG;IACH,IAAI,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO;IAyB9B;;;;;;;OAOG;IACH,MAAM,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IA2BxC;;;;;;;;;OASG;IACH,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI;IAI1E,yCAAyC;IACnC,KAAK,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAIxC,qDAAqD;IAC/C,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAIvC,kCAAkC;IAClC,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,2CAA2C;IAC3C,IAAI,QAAQ,IAAI,cAAc,EAAE,CAE/B;CACF"}
package/dist/witness.js CHANGED
@@ -16,11 +16,15 @@
16
16
  *
17
17
  * // Graceful shutdown
18
18
  * await witness.flush();
19
+ *
20
+ * Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
19
21
  */
20
22
  import { extractPayloads } from "./clearing.js";
21
23
  import { WitnessBuffer } from "./buffer.js";
24
+ import { writeHandoffFiles } from "./handoff.js";
22
25
  import { wrapOpenAI } from "./adapters/openai.js";
23
26
  import { wrapAnthropic } from "./adapters/anthropic.js";
27
+ import { wrapBedrock } from "./adapters/bedrock.js";
24
28
  import { createVercelOnFinish } from "./adapters/vercel-ai.js";
25
29
  export class Witness {
26
30
  config;
@@ -34,6 +38,12 @@ export class Witness {
34
38
  throw new Error("apiKey must start with 'axm_'");
35
39
  if (!options.tenantId)
36
40
  throw new Error("tenantId is required");
41
+ if (options.factorHandoff && options.factorHandoff !== "file") {
42
+ throw new Error("factorHandoff must be 'file' (other methods planned for v0.4.0)");
43
+ }
44
+ if (options.factorHandoff === "file" && !options.factorHandoffPath) {
45
+ throw new Error("factorHandoffPath is required when factorHandoff is 'file'");
46
+ }
37
47
  this.config = {
38
48
  endpoint: options.endpoint.replace(/\/+$/, ""),
39
49
  apiKey: options.apiKey,
@@ -47,6 +57,8 @@ export class Witness {
47
57
  guardrailsRequired: options.guardrailsRequired ?? 0,
48
58
  guardrailNames: options.guardrailNames ?? [],
49
59
  procedures: options.procedures,
60
+ factorHandoff: options.factorHandoff,
61
+ factorHandoffPath: options.factorHandoffPath,
50
62
  };
51
63
  this.buffer = new WitnessBuffer(this.config);
52
64
  }
@@ -72,11 +84,19 @@ export class Witness {
72
84
  if (name === "Anthropic" || (obj?.messages && !obj?.chat)) {
73
85
  return wrapAnthropic(client, this);
74
86
  }
75
- throw new TypeError(`Unsupported client: ${name || "unknown"}. Supported: OpenAI, Anthropic.`);
87
+ // AWS Bedrock: has client.send and client.config
88
+ if (name === "BedrockRuntimeClient" || (obj?.send && obj?.config)) {
89
+ return wrapBedrock(client, this);
90
+ }
91
+ throw new TypeError(`Unsupported client: ${name || "unknown"}. Supported: OpenAI, Anthropic, BedrockRuntimeClient.`);
76
92
  }
77
93
  /**
78
94
  * Record a witnessed inference. Extracts factors, applies clearing,
79
95
  * and enqueues payloads for background flush.
96
+ *
97
+ * If factorHandoff is configured, factors are written to the handoff
98
+ * destination BEFORE clearing proceeds. If the handoff fails, the
99
+ * payload is NOT transmitted.
80
100
  */
81
101
  record(inference) {
82
102
  // Merge guardrail config
@@ -86,6 +106,12 @@ export class Witness {
86
106
  inference.guardrailsRequired = this.config.guardrailsRequired;
87
107
  }
88
108
  const payloads = extractPayloads(inference, this.config.tenantId, this.config.clearingLevel, this.config.latencyThresholdMs, this.config.guardrailsRequired, this.config.procedures);
109
+ // Factor handoff: write full (uncleared) data to custody destination
110
+ // BEFORE enqueuing the cleared payload for transmission.
111
+ // If this fails, we do NOT proceed.
112
+ if (this.config.factorHandoff === "file" && this.config.factorHandoffPath) {
113
+ writeHandoffFiles(payloads, inference, this.config.tenantId, this.config.factorHandoffPath);
114
+ }
89
115
  this.buffer.enqueueMany(payloads);
90
116
  }
91
117
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"witness.js","sourceRoot":"","sources":["../src/witness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"witness.js","sourceRoot":"","sources":["../src/witness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAA8B,MAAM,yBAAyB,CAAC;AAoB3F,MAAM,OAAO,OAAO;IACV,MAAM,CAAgB;IACtB,MAAM,CAAgB;IAE9B,YAAY,OAAuB;QACjC,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACzF,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC/D,IAAI,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,OAAO,CAAC,aAAa,KAAK,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;QAED,IAAI,CAAC,MAAM,GAAG;YACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,CAAC;YACzC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;YACpC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,GAAG;YAC3C,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;YACjC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC;YACnC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,IAAI,KAAK;YACvD,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,IAAI,CAAC;YACnD,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE;YAC5C,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;SAC7C,CAAC;QAEF,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;;OASG;IACH,IAAI,CAAC,MAAe;QAClB,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,KAAK,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,MAAiC,CAAC;QAE9C,sCAAsC;QACtC,IAAI,IAAI,KAAK,QAAQ,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC;YACnC,OAAO,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;QAED,iCAAiC;QACjC,IAAI,IAAI,KAAK,WAAW,IAAI,CAAC,GAAG,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;YAC1D,OAAO,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;QAED,iDAAiD;QACjD,IAAI,IAAI,KAAK,sBAAsB,IAAI,CAAC,GAAG,EAAE,IAAI,IAAK,GAA+B,EAAE,MAAM,CAAC,EAAE,CAAC;YAC/F,OAAO,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,IAAI,SAAS,CACjB,uBAAuB,IAAI,IAAI,SAAS,uDAAuD,CAChG,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,SAA0B;QAC/B,yBAAyB;QACzB,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnF,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;YACtD,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;YAC/D,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;QAChE,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAC9B,SAAS,EACT,IAAI,CAAC,MAAM,CAAC,QAAQ,EACpB,IAAI,CAAC,MAAM,CAAC,aAAa,EACzB,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAC9B,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAC9B,IAAI,CAAC,MAAM,CAAC,UAAU,CACvB,CAAC;QAEF,qEAAqE;QACrE,yDAAyD;QACzD,oCAAoC;QACpC,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC1E,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC9F,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED;;;;;;;;;OASG;IACH,cAAc,CAAC,OAA+B;QAC5C,OAAO,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAA8B,CAAC;IAC1E,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,kCAAkC;IAClC,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B,CAAC;IAED,2CAA2C;IAC3C,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC9B,CAAC;CACF"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tenova/swt3-ai",
3
- "version": "0.1.0",
4
- "description": "SWT3 AI Witness SDK cryptographic attestation for AI inference",
3
+ "version": "0.2.1",
4
+ "description": "SWT3 AI Witness SDK: cryptographic attestation for AI inference",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "type": "module",
@@ -32,7 +32,7 @@
32
32
  "openai",
33
33
  "anthropic"
34
34
  ],
35
- "author": "TeNova <engineering@tenova.io>",
35
+ "author": "TeNova <engineering@tenovaai.com>",
36
36
  "license": "Apache-2.0",
37
37
  "repository": {
38
38
  "type": "git",
@@ -47,9 +47,9 @@
47
47
  }
48
48
  },
49
49
  "devDependencies": {
50
- "typescript": "^5.5.0",
51
- "vitest": "^2.0.0",
50
+ "openai": "^4.70.0",
52
51
  "tsx": "^4.0.0",
53
- "openai": "^4.70.0"
52
+ "typescript": "^5.5.0",
53
+ "vitest": "^4.1.2"
54
54
  }
55
55
  }