@tenova/swt3-ai 0.3.4 → 0.3.5
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 +77 -2
- package/dist/adapters/anthropic.d.ts +32 -0
- package/dist/adapters/anthropic.d.ts.map +1 -0
- package/dist/adapters/anthropic.js +299 -0
- package/dist/adapters/anthropic.js.map +1 -0
- package/dist/adapters/bedrock.d.ts +33 -0
- package/dist/adapters/bedrock.d.ts.map +1 -0
- package/dist/adapters/bedrock.js +267 -0
- package/dist/adapters/bedrock.js.map +1 -0
- package/dist/adapters/openai.d.ts +19 -0
- package/dist/adapters/openai.d.ts.map +1 -0
- package/dist/adapters/openai.js +288 -0
- package/dist/adapters/openai.js.map +1 -0
- package/dist/adapters/vercel-ai.d.ts +64 -0
- package/dist/adapters/vercel-ai.d.ts.map +1 -0
- package/dist/adapters/vercel-ai.js +68 -0
- package/dist/adapters/vercel-ai.js.map +1 -0
- package/dist/buffer.d.ts +42 -0
- package/dist/buffer.d.ts.map +1 -0
- package/dist/buffer.js +161 -0
- package/dist/buffer.js.map +1 -0
- package/dist/clearing.d.ts +29 -0
- package/dist/clearing.d.ts.map +1 -0
- package/dist/clearing.js +308 -0
- package/dist/clearing.js.map +1 -0
- package/dist/demo.d.ts +11 -0
- package/dist/demo.d.ts.map +1 -0
- package/dist/demo.js +238 -0
- package/dist/demo.js.map +1 -0
- package/dist/fingerprint.d.ts +29 -0
- package/dist/fingerprint.d.ts.map +1 -0
- package/dist/fingerprint.js +57 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/handoff.d.ts +17 -0
- package/dist/handoff.d.ts.map +1 -0
- package/dist/handoff.js +82 -0
- package/dist/handoff.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/signing.d.ts +20 -0
- package/dist/signing.d.ts.map +1 -0
- package/dist/signing.js +28 -0
- package/dist/signing.js.map +1 -0
- package/dist/types.d.ts +98 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -0
- package/dist/witness.d.ts +142 -0
- package/dist/witness.d.ts.map +1 -0
- package/dist/witness.js +345 -0
- package/dist/witness.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vercel-ai.d.ts","sourceRoot":"","sources":["../../src/adapters/vercel-ai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C;;;GAGG;AACH,UAAU,oBAAoB;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE;QACR,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,IAAI,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC;IACF,6BAA6B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,qBAAqB;IACpC,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,qBAA0B,GAClC,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAoCxC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 AI Witness SDK — Vercel AI SDK Integration.
|
|
3
|
+
*
|
|
4
|
+
* Provides an `onFinish` callback factory for the Vercel AI SDK's
|
|
5
|
+
* `streamText()` and `generateText()` functions. This is the most
|
|
6
|
+
* idiomatic integration for Next.js / React developers.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* import { streamText } from "ai";
|
|
10
|
+
* import { openai } from "@ai-sdk/openai";
|
|
11
|
+
*
|
|
12
|
+
* const result = await streamText({
|
|
13
|
+
* model: openai("gpt-4o"),
|
|
14
|
+
* prompt: "Summarize this contract...",
|
|
15
|
+
* onFinish: witness.vercelOnFinish(),
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* The `onFinish` callback receives a normalized result regardless of
|
|
19
|
+
* provider (OpenAI, Anthropic, Google, custom), so this single hook
|
|
20
|
+
* works with any Vercel AI SDK provider — no per-provider adapters needed.
|
|
21
|
+
*
|
|
22
|
+
* Vercel AI SDK onFinish payload:
|
|
23
|
+
* {
|
|
24
|
+
* text: string, // Complete response text
|
|
25
|
+
* usage: { promptTokens, completionTokens },
|
|
26
|
+
* finishReason: "stop" | "length" | "content-filter" | "tool-calls" | ...,
|
|
27
|
+
* response: { id, model, timestamp, headers },
|
|
28
|
+
* experimental_providerMetadata?: { ... },
|
|
29
|
+
* }
|
|
30
|
+
*/
|
|
31
|
+
import { sha256Truncated } from "../fingerprint.js";
|
|
32
|
+
/**
|
|
33
|
+
* Create a Vercel AI SDK `onFinish` callback that witnesses the inference.
|
|
34
|
+
*
|
|
35
|
+
* Works with both `streamText()` and `generateText()`.
|
|
36
|
+
*/
|
|
37
|
+
export function createVercelOnFinish(witness, options = {}) {
|
|
38
|
+
const capturedStart = performance.now();
|
|
39
|
+
return (result) => {
|
|
40
|
+
const elapsedMs = Math.round(performance.now() - capturedStart);
|
|
41
|
+
const model = result.response?.model ?? options.modelId ?? "unknown";
|
|
42
|
+
const responseText = result.text ?? "";
|
|
43
|
+
// Prompt text: caller can provide it, or we hash empty
|
|
44
|
+
// (The Vercel AI SDK doesn't expose the prompt in onFinish,
|
|
45
|
+
// so the caller should pass it via options for full provenance)
|
|
46
|
+
const promptText = options.promptText ?? "";
|
|
47
|
+
// Detect content filtering / refusal
|
|
48
|
+
const hasRefusal = result.finishReason === "content-filter" ||
|
|
49
|
+
result.finishReason === "error";
|
|
50
|
+
const record = {
|
|
51
|
+
modelId: model,
|
|
52
|
+
modelHash: sha256Truncated(model),
|
|
53
|
+
promptHash: sha256Truncated(promptText),
|
|
54
|
+
responseHash: sha256Truncated(responseText),
|
|
55
|
+
latencyMs: elapsedMs,
|
|
56
|
+
inputTokens: result.usage?.promptTokens,
|
|
57
|
+
outputTokens: result.usage?.completionTokens,
|
|
58
|
+
guardrailsActive: 0,
|
|
59
|
+
guardrailsRequired: 0,
|
|
60
|
+
guardrailPassed: true,
|
|
61
|
+
hasRefusal,
|
|
62
|
+
provider: "vercel-ai",
|
|
63
|
+
guardrailNames: [],
|
|
64
|
+
};
|
|
65
|
+
witness.record(record);
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=vercel-ai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vercel-ai.js","sourceRoot":"","sources":["../../src/adapters/vercel-ai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AA+BpD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAgB,EAChB,UAAiC,EAAE;IAEnC,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAExC,OAAO,CAAC,MAA4B,EAAE,EAAE;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,IAAI,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC;QACrE,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QAEvC,uDAAuD;QACvD,4DAA4D;QAC5D,iEAAiE;QACjE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QAE5C,qCAAqC;QACrC,MAAM,UAAU,GACd,MAAM,CAAC,YAAY,KAAK,gBAAgB;YACxC,MAAM,CAAC,YAAY,KAAK,OAAO,CAAC;QAElC,MAAM,MAAM,GAAoB;YAC9B,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,eAAe,CAAC,KAAK,CAAC;YACjC,UAAU,EAAE,eAAe,CAAC,UAAU,CAAC;YACvC,YAAY,EAAE,eAAe,CAAC,YAAY,CAAC;YAC3C,SAAS,EAAE,SAAS;YACpB,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY;YACvC,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,gBAAgB;YAC5C,gBAAgB,EAAE,CAAC;YACnB,kBAAkB,EAAE,CAAC;YACrB,eAAe,EAAE,IAAI;YACrB,UAAU;YACV,QAAQ,EAAE,WAAW;YACrB,cAAc,EAAE,EAAE;SACnB,CAAC;QAEF,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/buffer.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 AI Witness SDK — Flush Buffer.
|
|
3
|
+
*
|
|
4
|
+
* Non-blocking buffer that collects witness payloads and flushes them
|
|
5
|
+
* to the /api/v1/witness/batch endpoint. Uses setTimeout for periodic
|
|
6
|
+
* flushing and a dead-letter array for resilience.
|
|
7
|
+
*
|
|
8
|
+
* Flight Recorder: When the endpoint is unreachable, payloads move to
|
|
9
|
+
* a dead-letter array and retry on the next cycle. Configurable cap
|
|
10
|
+
* prevents unbounded memory growth.
|
|
11
|
+
*/
|
|
12
|
+
import type { WitnessConfig, WitnessPayload, WitnessReceipt } from "./types.js";
|
|
13
|
+
export declare class WitnessBuffer {
|
|
14
|
+
private config;
|
|
15
|
+
private queue;
|
|
16
|
+
private deadLetter;
|
|
17
|
+
private maxRetryBuffer;
|
|
18
|
+
private allReceipts;
|
|
19
|
+
private timer;
|
|
20
|
+
private stopped;
|
|
21
|
+
private consecutiveFailures;
|
|
22
|
+
private ctaShown;
|
|
23
|
+
constructor(config: WitnessConfig, maxRetryBuffer?: number);
|
|
24
|
+
/** Add a single payload to the buffer. */
|
|
25
|
+
enqueue(payload: WitnessPayload): void;
|
|
26
|
+
/** Add multiple payloads. */
|
|
27
|
+
enqueueMany(payloads: WitnessPayload[]): void;
|
|
28
|
+
/** Force-flush all buffered payloads. */
|
|
29
|
+
flush(): Promise<WitnessReceipt[]>;
|
|
30
|
+
/** Stop the buffer and flush remaining payloads. */
|
|
31
|
+
stop(): Promise<WitnessReceipt[]>;
|
|
32
|
+
/** Number of payloads waiting (includes dead-letter). */
|
|
33
|
+
get pending(): number;
|
|
34
|
+
/** Payloads in dead-letter queue awaiting retry. */
|
|
35
|
+
get deadLetterCount(): number;
|
|
36
|
+
/** All receipts from completed flushes. */
|
|
37
|
+
get receipts(): WitnessReceipt[];
|
|
38
|
+
private startTimer;
|
|
39
|
+
private flushInternal;
|
|
40
|
+
private sendBatch;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=buffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffer.d.ts","sourceRoot":"","sources":["../src/buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAC;AAI/F,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,aAAa,EAAE,cAAc,SAA2B;IAM5E,0CAA0C;IAC1C,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAQtC,6BAA6B;IAC7B,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,IAAI;IAI7C,yCAAyC;IACnC,KAAK,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAIxC,oDAAoD;IAC9C,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAgBvC,yDAAyD;IACzD,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,oDAAoD;IACpD,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,2CAA2C;IAC3C,IAAI,QAAQ,IAAI,cAAc,EAAE,CAE/B;IAED,OAAO,CAAC,UAAU;YAYJ,aAAa;YAWb,SAAS;CAwFxB"}
|
package/dist/buffer.js
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 AI Witness SDK — Flush Buffer.
|
|
3
|
+
*
|
|
4
|
+
* Non-blocking buffer that collects witness payloads and flushes them
|
|
5
|
+
* to the /api/v1/witness/batch endpoint. Uses setTimeout for periodic
|
|
6
|
+
* flushing and a dead-letter array for resilience.
|
|
7
|
+
*
|
|
8
|
+
* Flight Recorder: When the endpoint is unreachable, payloads move to
|
|
9
|
+
* a dead-letter array and retry on the next cycle. Configurable cap
|
|
10
|
+
* prevents unbounded memory growth.
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_MAX_RETRY_BUFFER = 5000;
|
|
13
|
+
export class WitnessBuffer {
|
|
14
|
+
config;
|
|
15
|
+
queue = [];
|
|
16
|
+
deadLetter = [];
|
|
17
|
+
maxRetryBuffer;
|
|
18
|
+
allReceipts = [];
|
|
19
|
+
timer = null;
|
|
20
|
+
stopped = false;
|
|
21
|
+
consecutiveFailures = 0;
|
|
22
|
+
ctaShown = false;
|
|
23
|
+
constructor(config, maxRetryBuffer = DEFAULT_MAX_RETRY_BUFFER) {
|
|
24
|
+
this.config = config;
|
|
25
|
+
this.maxRetryBuffer = maxRetryBuffer;
|
|
26
|
+
this.startTimer();
|
|
27
|
+
}
|
|
28
|
+
/** Add a single payload to the buffer. */
|
|
29
|
+
enqueue(payload) {
|
|
30
|
+
if (this.stopped)
|
|
31
|
+
return;
|
|
32
|
+
this.queue.push(payload);
|
|
33
|
+
if (this.queue.length >= this.config.bufferSize) {
|
|
34
|
+
this.flushInternal();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Add multiple payloads. */
|
|
38
|
+
enqueueMany(payloads) {
|
|
39
|
+
for (const p of payloads)
|
|
40
|
+
this.enqueue(p);
|
|
41
|
+
}
|
|
42
|
+
/** Force-flush all buffered payloads. */
|
|
43
|
+
async flush() {
|
|
44
|
+
return this.flushInternal();
|
|
45
|
+
}
|
|
46
|
+
/** Stop the buffer and flush remaining payloads. */
|
|
47
|
+
async stop() {
|
|
48
|
+
if (this.stopped)
|
|
49
|
+
return [];
|
|
50
|
+
this.stopped = true;
|
|
51
|
+
if (this.timer) {
|
|
52
|
+
clearTimeout(this.timer);
|
|
53
|
+
this.timer = null;
|
|
54
|
+
}
|
|
55
|
+
const receipts = await this.flushInternal();
|
|
56
|
+
if (this.deadLetter.length > 0) {
|
|
57
|
+
console.warn(`[swt3-ai] Buffer stopped with ${this.deadLetter.length} payloads in dead-letter queue`);
|
|
58
|
+
}
|
|
59
|
+
return receipts;
|
|
60
|
+
}
|
|
61
|
+
/** Number of payloads waiting (includes dead-letter). */
|
|
62
|
+
get pending() {
|
|
63
|
+
return this.queue.length + this.deadLetter.length;
|
|
64
|
+
}
|
|
65
|
+
/** Payloads in dead-letter queue awaiting retry. */
|
|
66
|
+
get deadLetterCount() {
|
|
67
|
+
return this.deadLetter.length;
|
|
68
|
+
}
|
|
69
|
+
/** All receipts from completed flushes. */
|
|
70
|
+
get receipts() {
|
|
71
|
+
return [...this.allReceipts];
|
|
72
|
+
}
|
|
73
|
+
startTimer() {
|
|
74
|
+
if (this.stopped)
|
|
75
|
+
return;
|
|
76
|
+
this.timer = setTimeout(() => {
|
|
77
|
+
this.flushInternal().catch(() => { });
|
|
78
|
+
this.startTimer();
|
|
79
|
+
}, this.config.flushInterval * 1000);
|
|
80
|
+
// Unref so the timer doesn't keep the process alive
|
|
81
|
+
if (typeof this.timer === "object" && "unref" in this.timer) {
|
|
82
|
+
this.timer.unref();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async flushInternal() {
|
|
86
|
+
// Drain queue
|
|
87
|
+
const payloads = [...this.deadLetter, ...this.queue];
|
|
88
|
+
this.deadLetter = [];
|
|
89
|
+
this.queue = [];
|
|
90
|
+
if (payloads.length === 0)
|
|
91
|
+
return [];
|
|
92
|
+
return this.sendBatch(payloads);
|
|
93
|
+
}
|
|
94
|
+
async sendBatch(payloads) {
|
|
95
|
+
if (payloads.length === 0)
|
|
96
|
+
return [];
|
|
97
|
+
const url = `${this.config.endpoint}/api/v1/witness/batch`;
|
|
98
|
+
const body = JSON.stringify({ witnesses: payloads });
|
|
99
|
+
const headers = {
|
|
100
|
+
"Content-Type": "application/json",
|
|
101
|
+
Authorization: `Bearer ${this.config.apiKey}`,
|
|
102
|
+
};
|
|
103
|
+
let lastError = null;
|
|
104
|
+
for (let attempt = 0; attempt < this.config.maxRetries; attempt++) {
|
|
105
|
+
try {
|
|
106
|
+
const controller = new AbortController();
|
|
107
|
+
const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
|
|
108
|
+
const resp = await fetch(url, {
|
|
109
|
+
method: "POST",
|
|
110
|
+
headers,
|
|
111
|
+
body,
|
|
112
|
+
signal: controller.signal,
|
|
113
|
+
});
|
|
114
|
+
clearTimeout(timeoutId);
|
|
115
|
+
if (resp.status >= 400 && resp.status < 500) {
|
|
116
|
+
// Client error — don't retry, don't dead-letter
|
|
117
|
+
const text = await resp.text();
|
|
118
|
+
console.error(`[swt3-ai] Batch flush failed (${resp.status}): ${text.slice(0, 200)}`);
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
const result = (await resp.json());
|
|
122
|
+
const receipts = result.receipts ?? [];
|
|
123
|
+
this.allReceipts.push(...receipts);
|
|
124
|
+
this.consecutiveFailures = 0;
|
|
125
|
+
if (result.rejected > 0) {
|
|
126
|
+
console.warn(`[swt3-ai] Batch flush: ${result.accepted} accepted, ${result.rejected} rejected`);
|
|
127
|
+
}
|
|
128
|
+
if (!this.ctaShown && (result.accepted ?? 0) > 0) {
|
|
129
|
+
this.ctaShown = true;
|
|
130
|
+
console.info(`\n [SWT3] ${result.accepted} anchors delivered to ${this.config.endpoint}` +
|
|
131
|
+
`\n [SWT3] Dashboard & audit reports \u2192 https://sovereign.tenova.io/signup?ref=sdk` +
|
|
132
|
+
`\n [SWT3] EU AI Act deadline: Aug 2, 2026. Is your AI ready?\n`);
|
|
133
|
+
}
|
|
134
|
+
return receipts;
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
lastError = err instanceof Error ? err.message : String(err);
|
|
138
|
+
console.warn(`[swt3-ai] Batch flush attempt ${attempt + 1} failed: ${lastError}`);
|
|
139
|
+
// Exponential backoff: 1s, 2s, 4s
|
|
140
|
+
if (attempt < this.config.maxRetries - 1) {
|
|
141
|
+
await new Promise((r) => setTimeout(r, 2 ** attempt * 1000));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// All retries exhausted — move to dead-letter queue
|
|
146
|
+
this.consecutiveFailures++;
|
|
147
|
+
const before = this.deadLetter.length;
|
|
148
|
+
this.deadLetter.push(...payloads);
|
|
149
|
+
// Cap the dead-letter queue
|
|
150
|
+
if (this.deadLetter.length > this.maxRetryBuffer) {
|
|
151
|
+
const dropped = this.deadLetter.length - this.maxRetryBuffer;
|
|
152
|
+
this.deadLetter = this.deadLetter.slice(dropped);
|
|
153
|
+
console.error(`[swt3-ai] Dead-letter queue full: ${dropped} oldest payloads dropped (cap: ${this.maxRetryBuffer})`);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
console.warn(`[swt3-ai] Endpoint unreachable — ${payloads.length} payloads moved to dead-letter (total: ${this.deadLetter.length}). Error: ${lastError}`);
|
|
157
|
+
}
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffer.js","sourceRoot":"","sources":["../src/buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAEtC,MAAM,OAAO,aAAa;IAChB,MAAM,CAAgB;IACtB,KAAK,GAAqB,EAAE,CAAC;IAC7B,UAAU,GAAqB,EAAE,CAAC;IAClC,cAAc,CAAS;IACvB,WAAW,GAAqB,EAAE,CAAC;IACnC,KAAK,GAAyC,IAAI,CAAC;IACnD,OAAO,GAAG,KAAK,CAAC;IAChB,mBAAmB,GAAG,CAAC,CAAC;IACxB,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAAY,MAAqB,EAAE,cAAc,GAAG,wBAAwB;QAC1E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,0CAA0C;IAC1C,OAAO,CAAC,OAAuB;QAC7B,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAChD,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,WAAW,CAAC,QAA0B;QACpC,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9B,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CACV,iCAAiC,IAAI,CAAC,UAAU,CAAC,MAAM,gCAAgC,CACxF,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,yDAAyD;IACzD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IACpD,CAAC;IAED,oDAAoD;IACpD,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,2CAA2C;IAC3C,IAAI,QAAQ;QACV,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAEO,UAAU;QAChB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC3B,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACrC,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;QACrC,oDAAoD;QACpD,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3D,IAAI,CAAC,KAAwB,CAAC,KAAK,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,cAAc;QACd,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAEhB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAErC,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,QAA0B;QAChD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAErC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,uBAAuB,CAAC;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrD,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;SAC9C,CAAC;QAEF,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YAClE,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAE5E,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;oBAC5B,MAAM,EAAE,MAAM;oBACd,OAAO;oBACP,IAAI;oBACJ,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;gBAEH,YAAY,CAAC,SAAS,CAAC,CAAC;gBAExB,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBAC5C,gDAAgD;oBAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC/B,OAAO,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;oBACtF,OAAO,EAAE,CAAC;gBACZ,CAAC;gBAED,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAkB,CAAC;gBAEpD,MAAM,QAAQ,GAAqB,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACzD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;gBACnC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;gBAE7B,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;oBACxB,OAAO,CAAC,IAAI,CACV,0BAA0B,MAAM,CAAC,QAAQ,cAAc,MAAM,CAAC,QAAQ,WAAW,CAClF,CAAC;gBACJ,CAAC;gBAED,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;oBACjD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACrB,OAAO,CAAC,IAAI,CACV,cAAc,MAAM,CAAC,QAAQ,yBAAyB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;wBAC5E,wFAAwF;wBACxF,iEAAiE,CAClE,CAAC;gBACJ,CAAC;gBAED,OAAO,QAAQ,CAAC;YAClB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,SAAS,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO,CAAC,IAAI,CACV,iCAAiC,OAAO,GAAG,CAAC,YAAY,SAAS,EAAE,CACpE,CAAC;gBAEF,kCAAkC;gBAClC,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;oBACzC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;QACH,CAAC;QAED,oDAAoD;QACpD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QAElC,4BAA4B;QAC5B,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC;YAC7D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjD,OAAO,CAAC,KAAK,CACX,qCAAqC,OAAO,kCAAkC,IAAI,CAAC,cAAc,GAAG,CACrG,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CACV,oCAAoC,QAAQ,CAAC,MAAM,0CAA0C,IAAI,CAAC,UAAU,CAAC,MAAM,aAAa,SAAS,EAAE,CAC5I,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 AI Witness SDK — Clearing Engine (Levels 0-3).
|
|
3
|
+
*
|
|
4
|
+
* The "Sovereign Wire" protocol: controls what leaves the developer's
|
|
5
|
+
* infrastructure. Raw prompts/responses NEVER appear in payloads.
|
|
6
|
+
* Clearing operates on the wire payload, not the developer's response.
|
|
7
|
+
*
|
|
8
|
+
* Level 0 — Analytics: All metadata
|
|
9
|
+
* Level 1 — Standard: Hashes + model_id + ai_context
|
|
10
|
+
* Level 2 — Sensitive: Hashes + model_id only. ai_context DELETED.
|
|
11
|
+
* Level 3 — Classified: Factors only. model_id hashed. Everything else DELETED.
|
|
12
|
+
*/
|
|
13
|
+
import type { InferenceRecord, WitnessPayload } from "./types.js";
|
|
14
|
+
/**
|
|
15
|
+
* Extract witness payloads from an inference record.
|
|
16
|
+
* Applies clearing level to each payload via object destructuring (Level 2+
|
|
17
|
+
* fields are simply never assigned, guaranteeing they don't exist on the wire).
|
|
18
|
+
*/
|
|
19
|
+
export declare function extractPayloads(record: InferenceRecord, tenantId: string, clearingLevel: 0 | 1 | 2 | 3, latencyThresholdMs?: number, guardrailsRequired?: number, procedures?: string[], agentId?: string, signingKey?: string, cycleId?: string, policyVersionHash?: string): WitnessPayload[];
|
|
20
|
+
/**
|
|
21
|
+
* Mint an AI-GRD.3 (Gatekeeper Gate) payload.
|
|
22
|
+
*
|
|
23
|
+
* factor_a = required guardrail count
|
|
24
|
+
* factor_b = actual guardrail count at call time
|
|
25
|
+
* factor_c = 1 if gate passed, 0 if blocked
|
|
26
|
+
* Verdict: PASS if b >= a AND c == 1
|
|
27
|
+
*/
|
|
28
|
+
export declare function extractGatekeeperPayload(tenantId: string, required: number, active: number, gatePassed: boolean, clearingLevel: 0 | 1 | 2 | 3, agentId?: string, signingKey?: string, cycleId?: string, policyVersionHash?: string): WitnessPayload;
|
|
29
|
+
//# sourceMappingURL=clearing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clearing.d.ts","sourceRoot":"","sources":["../src/clearing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAElE;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAC5B,kBAAkB,GAAE,MAAc,EAClC,kBAAkB,GAAE,MAAU,EAC9B,UAAU,CAAC,EAAE,MAAM,EAAE,EACrB,OAAO,CAAC,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,iBAAiB,CAAC,EAAE,MAAM,GACzB,cAAc,EAAE,CAuNlB;AA6DD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,OAAO,EACnB,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAC5B,OAAO,CAAC,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,iBAAiB,CAAC,EAAE,MAAM,GACzB,cAAc,CAwBhB"}
|
package/dist/clearing.js
ADDED
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 AI Witness SDK — Clearing Engine (Levels 0-3).
|
|
3
|
+
*
|
|
4
|
+
* The "Sovereign Wire" protocol: controls what leaves the developer's
|
|
5
|
+
* infrastructure. Raw prompts/responses NEVER appear in payloads.
|
|
6
|
+
* Clearing operates on the wire payload, not the developer's response.
|
|
7
|
+
*
|
|
8
|
+
* Level 0 — Analytics: All metadata
|
|
9
|
+
* Level 1 — Standard: Hashes + model_id + ai_context
|
|
10
|
+
* Level 2 — Sensitive: Hashes + model_id only. ai_context DELETED.
|
|
11
|
+
* Level 3 — Classified: Factors only. model_id hashed. Everything else DELETED.
|
|
12
|
+
*/
|
|
13
|
+
import { mintFingerprint, sha256Truncated, timestampMs } from "./fingerprint.js";
|
|
14
|
+
import { signPayload } from "./signing.js";
|
|
15
|
+
/**
|
|
16
|
+
* Extract witness payloads from an inference record.
|
|
17
|
+
* Applies clearing level to each payload via object destructuring (Level 2+
|
|
18
|
+
* fields are simply never assigned, guaranteeing they don't exist on the wire).
|
|
19
|
+
*/
|
|
20
|
+
export function extractPayloads(record, tenantId, clearingLevel, latencyThresholdMs = 30000, guardrailsRequired = 0, procedures, agentId, signingKey, cycleId, policyVersionHash) {
|
|
21
|
+
const [ts, epoch] = timestampMs();
|
|
22
|
+
const payloads = [];
|
|
23
|
+
// Access control records produce only AI-ACC.1 (skip inference procedures)
|
|
24
|
+
if (record.accessTarget) {
|
|
25
|
+
let accFactors = [
|
|
26
|
+
{
|
|
27
|
+
procedureId: "AI-ACC.1",
|
|
28
|
+
factorA: 1,
|
|
29
|
+
factorB: !record.accessScope || record.accessGranted ? 1 : 0,
|
|
30
|
+
factorC: record.accessGranted ? 1 : 0,
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
if (procedures) {
|
|
34
|
+
const allowed = new Set(procedures);
|
|
35
|
+
accFactors = accFactors.filter((p) => allowed.has(p.procedureId));
|
|
36
|
+
}
|
|
37
|
+
for (const pf of accFactors) {
|
|
38
|
+
const fp = mintFingerprint(tenantId, pf.procedureId, pf.factorA, pf.factorB, pf.factorC, ts);
|
|
39
|
+
const payload = {
|
|
40
|
+
procedure_id: pf.procedureId,
|
|
41
|
+
factor_a: pf.factorA,
|
|
42
|
+
factor_b: pf.factorB,
|
|
43
|
+
factor_c: pf.factorC,
|
|
44
|
+
clearing_level: clearingLevel,
|
|
45
|
+
anchor_fingerprint: fp,
|
|
46
|
+
anchor_epoch: epoch,
|
|
47
|
+
fingerprint_timestamp_ms: ts,
|
|
48
|
+
};
|
|
49
|
+
if (clearingLevel <= 2) {
|
|
50
|
+
payload.ai_latency_ms = record.latencyMs;
|
|
51
|
+
}
|
|
52
|
+
if (clearingLevel <= 1) {
|
|
53
|
+
payload.ai_model_id = record.modelId;
|
|
54
|
+
const ctx = {
|
|
55
|
+
provider: "access",
|
|
56
|
+
access_target: record.accessTarget,
|
|
57
|
+
access_granted: record.accessGranted,
|
|
58
|
+
};
|
|
59
|
+
if (record.accessScope) {
|
|
60
|
+
ctx.access_scope = record.accessScope;
|
|
61
|
+
}
|
|
62
|
+
if (cycleId)
|
|
63
|
+
ctx.cycle_id = cycleId;
|
|
64
|
+
payload.ai_context = ctx;
|
|
65
|
+
}
|
|
66
|
+
if (agentId)
|
|
67
|
+
payload.agent_id = agentId;
|
|
68
|
+
if (cycleId)
|
|
69
|
+
payload.cycle_id = cycleId;
|
|
70
|
+
if (signingKey)
|
|
71
|
+
payload.payload_signature = signPayload(signingKey, fp, agentId);
|
|
72
|
+
if (policyVersionHash)
|
|
73
|
+
payload.policy_version_hash = policyVersionHash;
|
|
74
|
+
payloads.push(payload);
|
|
75
|
+
}
|
|
76
|
+
return payloads;
|
|
77
|
+
}
|
|
78
|
+
// Tool call records produce only AI-TOOL.1 (skip inference procedures)
|
|
79
|
+
if (record.toolName) {
|
|
80
|
+
let toolFactors = [
|
|
81
|
+
{ procedureId: "AI-TOOL.1", factorA: 1, factorB: record.latencyMs, factorC: record.hasRefusal ? 0 : 1 },
|
|
82
|
+
];
|
|
83
|
+
if (procedures) {
|
|
84
|
+
const allowed = new Set(procedures);
|
|
85
|
+
toolFactors = toolFactors.filter((p) => allowed.has(p.procedureId));
|
|
86
|
+
}
|
|
87
|
+
for (const pf of toolFactors) {
|
|
88
|
+
const fp = mintFingerprint(tenantId, pf.procedureId, pf.factorA, pf.factorB, pf.factorC, ts);
|
|
89
|
+
const payload = {
|
|
90
|
+
procedure_id: pf.procedureId,
|
|
91
|
+
factor_a: pf.factorA,
|
|
92
|
+
factor_b: pf.factorB,
|
|
93
|
+
factor_c: pf.factorC,
|
|
94
|
+
clearing_level: clearingLevel,
|
|
95
|
+
anchor_fingerprint: fp,
|
|
96
|
+
anchor_epoch: epoch,
|
|
97
|
+
fingerprint_timestamp_ms: ts,
|
|
98
|
+
};
|
|
99
|
+
if (clearingLevel <= 2) {
|
|
100
|
+
payload.ai_latency_ms = record.latencyMs;
|
|
101
|
+
}
|
|
102
|
+
if (clearingLevel <= 1) {
|
|
103
|
+
payload.ai_model_id = record.modelId;
|
|
104
|
+
const ctx = {
|
|
105
|
+
provider: "tool",
|
|
106
|
+
tool_name: record.toolName,
|
|
107
|
+
};
|
|
108
|
+
if (record.toolCallId) {
|
|
109
|
+
ctx.tool_call_id = record.toolCallId;
|
|
110
|
+
}
|
|
111
|
+
if (cycleId)
|
|
112
|
+
ctx.cycle_id = cycleId;
|
|
113
|
+
payload.ai_context = ctx;
|
|
114
|
+
}
|
|
115
|
+
if (agentId)
|
|
116
|
+
payload.agent_id = agentId;
|
|
117
|
+
if (cycleId)
|
|
118
|
+
payload.cycle_id = cycleId;
|
|
119
|
+
if (signingKey)
|
|
120
|
+
payload.payload_signature = signPayload(signingKey, fp, agentId);
|
|
121
|
+
if (policyVersionHash)
|
|
122
|
+
payload.policy_version_hash = policyVersionHash;
|
|
123
|
+
payloads.push(payload);
|
|
124
|
+
}
|
|
125
|
+
return payloads;
|
|
126
|
+
}
|
|
127
|
+
let procFactors = [
|
|
128
|
+
// AI-INF.1: Inference Provenance
|
|
129
|
+
{
|
|
130
|
+
procedureId: "AI-INF.1",
|
|
131
|
+
factorA: 1,
|
|
132
|
+
factorB: record.promptHash && record.responseHash ? 1 : 0,
|
|
133
|
+
factorC: 0,
|
|
134
|
+
},
|
|
135
|
+
// AI-INF.2: Inference Latency
|
|
136
|
+
{
|
|
137
|
+
procedureId: "AI-INF.2",
|
|
138
|
+
factorA: latencyThresholdMs,
|
|
139
|
+
factorB: record.latencyMs,
|
|
140
|
+
factorC: record.latencyMs > latencyThresholdMs ? 1 : 0,
|
|
141
|
+
},
|
|
142
|
+
// AI-MDL.1: Model Weight Integrity
|
|
143
|
+
{
|
|
144
|
+
procedureId: "AI-MDL.1",
|
|
145
|
+
factorA: 1,
|
|
146
|
+
factorB: record.modelHash ? 1 : 0,
|
|
147
|
+
factorC: 0,
|
|
148
|
+
},
|
|
149
|
+
// AI-MDL.2: Model Version Tracking
|
|
150
|
+
{
|
|
151
|
+
procedureId: "AI-MDL.2",
|
|
152
|
+
factorA: 1,
|
|
153
|
+
factorB: record.modelId ? 1 : 0,
|
|
154
|
+
factorC: 0,
|
|
155
|
+
},
|
|
156
|
+
];
|
|
157
|
+
// AI-GRD.1: Guardrail Enforcement (only if guardrails configured)
|
|
158
|
+
const grdRequired = guardrailsRequired || record.guardrailsRequired;
|
|
159
|
+
if (grdRequired > 0) {
|
|
160
|
+
procFactors.push({
|
|
161
|
+
procedureId: "AI-GRD.1",
|
|
162
|
+
factorA: grdRequired,
|
|
163
|
+
factorB: record.guardrailsActive,
|
|
164
|
+
factorC: record.guardrailPassed ? 1 : 0,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
// AI-GRD.2: Content Safety Filter
|
|
168
|
+
procFactors.push({
|
|
169
|
+
procedureId: "AI-GRD.2",
|
|
170
|
+
factorA: 1,
|
|
171
|
+
factorB: record.hasRefusal ? 0 : 1,
|
|
172
|
+
factorC: record.hasRefusal ? 1 : 0,
|
|
173
|
+
});
|
|
174
|
+
// AI-ID.1: Agent Identity Attestation (only when agentId is configured)
|
|
175
|
+
if (agentId) {
|
|
176
|
+
procFactors.push({
|
|
177
|
+
procedureId: "AI-ID.1",
|
|
178
|
+
factorA: 1,
|
|
179
|
+
factorB: 1,
|
|
180
|
+
factorC: 0,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
// Filter to requested procedures
|
|
184
|
+
if (procedures) {
|
|
185
|
+
const allowed = new Set(procedures);
|
|
186
|
+
procFactors = procFactors.filter((p) => allowed.has(p.procedureId));
|
|
187
|
+
}
|
|
188
|
+
// Build payloads with clearing applied
|
|
189
|
+
for (const pf of procFactors) {
|
|
190
|
+
const fp = mintFingerprint(tenantId, pf.procedureId, pf.factorA, pf.factorB, pf.factorC, ts);
|
|
191
|
+
// Base payload — always present regardless of clearing level
|
|
192
|
+
const payload = {
|
|
193
|
+
procedure_id: pf.procedureId,
|
|
194
|
+
factor_a: pf.factorA,
|
|
195
|
+
factor_b: pf.factorB,
|
|
196
|
+
factor_c: pf.factorC,
|
|
197
|
+
clearing_level: clearingLevel,
|
|
198
|
+
anchor_fingerprint: fp,
|
|
199
|
+
anchor_epoch: epoch,
|
|
200
|
+
fingerprint_timestamp_ms: ts,
|
|
201
|
+
};
|
|
202
|
+
// Apply clearing — use conditional assignment so Level 2+ fields
|
|
203
|
+
// are never set (not even as undefined). This guarantees they are
|
|
204
|
+
// absent from JSON.stringify output, not just null.
|
|
205
|
+
applyClearingLevel(payload, record, clearingLevel);
|
|
206
|
+
// agent_id and cycle_id survive all clearing levels (operational metadata)
|
|
207
|
+
if (agentId)
|
|
208
|
+
payload.agent_id = agentId;
|
|
209
|
+
if (cycleId)
|
|
210
|
+
payload.cycle_id = cycleId;
|
|
211
|
+
if (signingKey)
|
|
212
|
+
payload.payload_signature = signPayload(signingKey, fp, agentId);
|
|
213
|
+
if (policyVersionHash)
|
|
214
|
+
payload.policy_version_hash = policyVersionHash;
|
|
215
|
+
payloads.push(payload);
|
|
216
|
+
}
|
|
217
|
+
return payloads;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Apply clearing level to a payload using explicit field assignment.
|
|
221
|
+
*
|
|
222
|
+
* Level 0-1: All metadata assigned
|
|
223
|
+
* Level 2: Hashes + model_id only. ai_context NOT assigned (absent from wire).
|
|
224
|
+
* Level 3: model_id hashed. Hashes NOT assigned. No metadata.
|
|
225
|
+
*/
|
|
226
|
+
function applyClearingLevel(payload, record, level) {
|
|
227
|
+
if (level <= 2) {
|
|
228
|
+
// Levels 0-2: include hashes and metrics
|
|
229
|
+
payload.ai_prompt_hash = record.promptHash;
|
|
230
|
+
payload.ai_response_hash = record.responseHash;
|
|
231
|
+
payload.ai_latency_ms = record.latencyMs;
|
|
232
|
+
payload.ai_input_tokens = record.inputTokens;
|
|
233
|
+
payload.ai_output_tokens = record.outputTokens;
|
|
234
|
+
}
|
|
235
|
+
if (level <= 1) {
|
|
236
|
+
// Levels 0-1: include full ai_context + system prompt hash
|
|
237
|
+
payload.ai_model_id = record.modelId;
|
|
238
|
+
const ctx = {
|
|
239
|
+
provider: record.provider,
|
|
240
|
+
};
|
|
241
|
+
if (record.guardrailNames.length > 0) {
|
|
242
|
+
ctx.guardrails = record.guardrailNames;
|
|
243
|
+
}
|
|
244
|
+
if (record.systemFingerprint) {
|
|
245
|
+
ctx.system_fingerprint = record.systemFingerprint;
|
|
246
|
+
}
|
|
247
|
+
if (payload.cycle_id) {
|
|
248
|
+
ctx.cycle_id = payload.cycle_id;
|
|
249
|
+
}
|
|
250
|
+
payload.ai_context = ctx;
|
|
251
|
+
if (record.systemPromptHash) {
|
|
252
|
+
payload.ai_system_prompt_hash = record.systemPromptHash;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
else if (level === 2) {
|
|
256
|
+
// Level 2: model_id in cleartext, NO ai_context
|
|
257
|
+
payload.ai_model_id = record.modelId;
|
|
258
|
+
// ai_context is never assigned — absent from JSON
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
// Level 3: model_id HASHED, no hashes, no metadata
|
|
262
|
+
payload.ai_model_id = record.modelId
|
|
263
|
+
? sha256Truncated(record.modelId)
|
|
264
|
+
: undefined;
|
|
265
|
+
// Delete hash fields that were set above (Level 3 overrides Level 2 path)
|
|
266
|
+
delete payload.ai_prompt_hash;
|
|
267
|
+
delete payload.ai_response_hash;
|
|
268
|
+
delete payload.ai_latency_ms;
|
|
269
|
+
delete payload.ai_input_tokens;
|
|
270
|
+
delete payload.ai_output_tokens;
|
|
271
|
+
// ai_context is never assigned
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Mint an AI-GRD.3 (Gatekeeper Gate) payload.
|
|
276
|
+
*
|
|
277
|
+
* factor_a = required guardrail count
|
|
278
|
+
* factor_b = actual guardrail count at call time
|
|
279
|
+
* factor_c = 1 if gate passed, 0 if blocked
|
|
280
|
+
* Verdict: PASS if b >= a AND c == 1
|
|
281
|
+
*/
|
|
282
|
+
export function extractGatekeeperPayload(tenantId, required, active, gatePassed, clearingLevel, agentId, signingKey, cycleId, policyVersionHash) {
|
|
283
|
+
const [ts, epoch] = timestampMs();
|
|
284
|
+
const fa = required;
|
|
285
|
+
const fb = active;
|
|
286
|
+
const fc = gatePassed ? 1 : 0;
|
|
287
|
+
const fp = mintFingerprint(tenantId, "AI-GRD.3", fa, fb, fc, ts);
|
|
288
|
+
const payload = {
|
|
289
|
+
procedure_id: "AI-GRD.3",
|
|
290
|
+
factor_a: fa,
|
|
291
|
+
factor_b: fb,
|
|
292
|
+
factor_c: fc,
|
|
293
|
+
clearing_level: clearingLevel,
|
|
294
|
+
anchor_fingerprint: fp,
|
|
295
|
+
anchor_epoch: epoch,
|
|
296
|
+
fingerprint_timestamp_ms: ts,
|
|
297
|
+
};
|
|
298
|
+
if (agentId)
|
|
299
|
+
payload.agent_id = agentId;
|
|
300
|
+
if (cycleId)
|
|
301
|
+
payload.cycle_id = cycleId;
|
|
302
|
+
if (policyVersionHash)
|
|
303
|
+
payload.policy_version_hash = policyVersionHash;
|
|
304
|
+
if (signingKey)
|
|
305
|
+
payload.payload_signature = signPayload(signingKey, fp, agentId);
|
|
306
|
+
return payload;
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=clearing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clearing.js","sourceRoot":"","sources":["../src/clearing.ts"],"names":[],"mappings":"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"}
|
package/dist/demo.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SWT3 AI Witness SDK — Zero-Friction Demo
|
|
4
|
+
*
|
|
5
|
+
* Run with: npx @tenova/swt3-ai demo
|
|
6
|
+
* or: npx tsx node_modules/@tenova/swt3-ai/src/demo.ts
|
|
7
|
+
*
|
|
8
|
+
* No API keys. No account. No network calls.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=demo.d.ts.map
|