@tenova/swt3-ai 0.3.4 → 0.4.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.
Files changed (58) hide show
  1. package/README.md +150 -18
  2. package/dist/adapters/anthropic.d.ts +32 -0
  3. package/dist/adapters/anthropic.d.ts.map +1 -0
  4. package/dist/adapters/anthropic.js +301 -0
  5. package/dist/adapters/anthropic.js.map +1 -0
  6. package/dist/adapters/bedrock.d.ts +33 -0
  7. package/dist/adapters/bedrock.d.ts.map +1 -0
  8. package/dist/adapters/bedrock.js +269 -0
  9. package/dist/adapters/bedrock.js.map +1 -0
  10. package/dist/adapters/openai.d.ts +19 -0
  11. package/dist/adapters/openai.d.ts.map +1 -0
  12. package/dist/adapters/openai.js +289 -0
  13. package/dist/adapters/openai.js.map +1 -0
  14. package/dist/adapters/vercel-ai.d.ts +64 -0
  15. package/dist/adapters/vercel-ai.d.ts.map +1 -0
  16. package/dist/adapters/vercel-ai.js +68 -0
  17. package/dist/adapters/vercel-ai.js.map +1 -0
  18. package/dist/buffer.d.ts +43 -0
  19. package/dist/buffer.d.ts.map +1 -0
  20. package/dist/buffer.js +172 -0
  21. package/dist/buffer.js.map +1 -0
  22. package/dist/clearing.d.ts +39 -0
  23. package/dist/clearing.d.ts.map +1 -0
  24. package/dist/clearing.js +338 -0
  25. package/dist/clearing.js.map +1 -0
  26. package/dist/demo.d.ts +11 -0
  27. package/dist/demo.d.ts.map +1 -0
  28. package/dist/demo.js +238 -0
  29. package/dist/demo.js.map +1 -0
  30. package/dist/exporters/otel.d.ts +36 -0
  31. package/dist/exporters/otel.d.ts.map +1 -0
  32. package/dist/exporters/otel.js +94 -0
  33. package/dist/exporters/otel.js.map +1 -0
  34. package/dist/fingerprint.d.ts +29 -0
  35. package/dist/fingerprint.d.ts.map +1 -0
  36. package/dist/fingerprint.js +57 -0
  37. package/dist/fingerprint.js.map +1 -0
  38. package/dist/handoff.d.ts +17 -0
  39. package/dist/handoff.d.ts.map +1 -0
  40. package/dist/handoff.js +82 -0
  41. package/dist/handoff.js.map +1 -0
  42. package/dist/index.d.ts +22 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +20 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/signing.d.ts +20 -0
  47. package/dist/signing.d.ts.map +1 -0
  48. package/dist/signing.js +28 -0
  49. package/dist/signing.js.map +1 -0
  50. package/dist/types.d.ts +108 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +20 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/witness.d.ts +193 -0
  55. package/dist/witness.d.ts.map +1 -0
  56. package/dist/witness.js +487 -0
  57. package/dist/witness.js.map +1 -0
  58. package/package.json +10 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../../src/exporters/otel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElE,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,WAAW,CAAM;gBAEb,OAAO,CAAC,EAAE,mBAAmB;IAezC;;;;OAIG;IACH,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,IAAI;IAoBpE,OAAO,CAAC,cAAc;CAiCvB"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- OpenTelemetry Exporter.
3
+ *
4
+ * Exports SWT3 witness anchors as OpenTelemetry spans, allowing them to
5
+ * flow into existing observability pipelines (Datadog, Grafana, Jaeger,
6
+ * Honeycomb, etc.).
7
+ *
8
+ * Usage:
9
+ * import { Witness } from "@tenova/swt3-ai";
10
+ * import { OTelExporter } from "@tenova/swt3-ai/exporters/otel";
11
+ *
12
+ * const exporter = new OTelExporter({ tracerName: "swt3-witness" });
13
+ * const witness = new Witness({ ..., onFlush: exporter.export.bind(exporter) });
14
+ *
15
+ * Requires: npm install @opentelemetry/api
16
+ *
17
+ * Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
18
+ */
19
+ export class OTelExporter {
20
+ tracer;
21
+ traceModule;
22
+ constructor(options) {
23
+ const tracerName = options?.tracerName ?? "swt3-ai";
24
+ try {
25
+ // Dynamic require to avoid hard dependency
26
+ const trace = require("@opentelemetry/api").trace;
27
+ this.traceModule = require("@opentelemetry/api");
28
+ this.tracer = trace.getTracer(tracerName);
29
+ }
30
+ catch {
31
+ throw new Error("@opentelemetry/api is required for OTel export. " +
32
+ "Install with: npm install @opentelemetry/api");
33
+ }
34
+ }
35
+ /**
36
+ * Callback for Witness onFlush. Creates one span per anchor.
37
+ *
38
+ * Pass as: onFlush: exporter.export.bind(exporter)
39
+ */
40
+ export(payloads, receipts) {
41
+ for (let i = 0; i < payloads.length; i++) {
42
+ const payload = payloads[i];
43
+ const receipt = receipts[i] ?? null;
44
+ const spanName = `swt3.witness.${payload.procedure_id ?? "unknown"}`;
45
+ const attrs = this.spanAttributes(payload, receipt);
46
+ const span = this.tracer.startSpan(spanName, { attributes: attrs });
47
+ if (receipt && !receipt.ok) {
48
+ span.setStatus({
49
+ code: this.traceModule.SpanStatusCode.ERROR,
50
+ message: receipt.error ?? "",
51
+ });
52
+ }
53
+ span.end();
54
+ }
55
+ }
56
+ spanAttributes(payload, receipt) {
57
+ const attrs = {};
58
+ // Core anchor fields
59
+ if (payload.procedure_id)
60
+ attrs["swt3.procedure_id"] = payload.procedure_id;
61
+ if (payload.clearing_level != null)
62
+ attrs["swt3.clearing_level"] = payload.clearing_level;
63
+ if (payload.anchor_fingerprint)
64
+ attrs["swt3.fingerprint"] = payload.anchor_fingerprint;
65
+ if (payload.anchor_epoch)
66
+ attrs["swt3.epoch"] = payload.anchor_epoch;
67
+ // Factors
68
+ if (payload.factor_a != null)
69
+ attrs["swt3.factor_a"] = payload.factor_a;
70
+ if (payload.factor_b != null)
71
+ attrs["swt3.factor_b"] = payload.factor_b;
72
+ if (payload.factor_c != null)
73
+ attrs["swt3.factor_c"] = payload.factor_c;
74
+ // AI metadata (may be cleared depending on level)
75
+ if (payload.ai_model_id)
76
+ attrs["swt3.model_id"] = payload.ai_model_id;
77
+ if (payload.ai_latency_ms != null)
78
+ attrs["swt3.latency_ms"] = payload.ai_latency_ms;
79
+ // Identity (survives all clearing levels)
80
+ if (payload.agent_id)
81
+ attrs["swt3.agent_id"] = payload.agent_id;
82
+ if (payload.cycle_id)
83
+ attrs["swt3.cycle_id"] = payload.cycle_id;
84
+ // Receipt fields
85
+ if (receipt) {
86
+ if (receipt.verdict)
87
+ attrs["swt3.verdict"] = receipt.verdict;
88
+ if (receipt.swt3_anchor)
89
+ attrs["swt3.anchor"] = receipt.swt3_anchor;
90
+ }
91
+ return attrs;
92
+ }
93
+ }
94
+ //# sourceMappingURL=otel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel.js","sourceRoot":"","sources":["../../src/exporters/otel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AASH,MAAM,OAAO,YAAY;IACf,MAAM,CAAM;IACZ,WAAW,CAAM;IAEzB,YAAY,OAA6B;QACvC,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,SAAS,CAAC;QACpD,IAAI,CAAC;YACH,2CAA2C;YAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC;YAClD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,kDAAkD;gBAClD,8CAA8C,CAC/C,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,QAA0B,EAAE,QAA0B;QAC3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YACpC,MAAM,QAAQ,GAAG,gBAAgB,OAAO,CAAC,YAAY,IAAI,SAAS,EAAE,CAAC;YACrE,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEpD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;YAEpE,IAAI,OAAO,IAAI,CAAE,OAAe,CAAC,EAAE,EAAE,CAAC;gBACpC,IAAI,CAAC,SAAS,CAAC;oBACb,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK;oBAC3C,OAAO,EAAG,OAAe,CAAC,KAAK,IAAI,EAAE;iBACtC,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAEO,cAAc,CACpB,OAAuB,EACvB,OAA8B;QAE9B,MAAM,KAAK,GAA8C,EAAE,CAAC;QAE5D,qBAAqB;QACrB,IAAI,OAAO,CAAC,YAAY;YAAE,KAAK,CAAC,mBAAmB,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;QAC5E,IAAI,OAAO,CAAC,cAAc,IAAI,IAAI;YAAE,KAAK,CAAC,qBAAqB,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;QAC1F,IAAI,OAAO,CAAC,kBAAkB;YAAE,KAAK,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;QACvF,IAAI,OAAO,CAAC,YAAY;YAAE,KAAK,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;QAErE,UAAU;QACV,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI;YAAE,KAAK,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;QACxE,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI;YAAE,KAAK,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;QACxE,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI;YAAE,KAAK,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;QAExE,kDAAkD;QAClD,IAAI,OAAO,CAAC,WAAW;YAAE,KAAK,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;QACtE,IAAI,OAAO,CAAC,aAAa,IAAI,IAAI;YAAE,KAAK,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;QAEpF,0CAA0C;QAC1C,IAAI,OAAO,CAAC,QAAQ;YAAE,KAAK,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;QAChE,IAAI,OAAO,CAAC,QAAQ;YAAE,KAAK,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;QAEhE,iBAAiB;QACjB,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,OAAO;gBAAE,KAAK,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;YAC7D,IAAI,OAAO,CAAC,WAAW;gBAAE,KAAK,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;QACtE,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * SWT3 AI Witness SDK — Fingerprint minting and SHA-256 utilities.
3
+ *
4
+ * The fingerprint formula MUST match the Python SDK and the ingestion endpoint:
5
+ * SHA256("WITNESS:{tenant}:{proc}:{fa}:{fb}:{fc}:{ts_ms}").hex().slice(0, 12)
6
+ *
7
+ * Uses Node.js crypto module for server-side compatibility.
8
+ */
9
+ /**
10
+ * SHA-256 hash a string, return first `length` hex characters.
11
+ */
12
+ export declare function sha256Hex(data: string, length?: number): string;
13
+ /**
14
+ * SHA-256 hash a string, return first 16 hex chars (prompt/response hashing).
15
+ */
16
+ export declare function sha256Truncated(data: string, length?: number): string;
17
+ /**
18
+ * Mint an SWT3 anchor fingerprint.
19
+ *
20
+ * This MUST match the endpoint's `validateFingerprint()` and the Python SDK's
21
+ * `mint_fingerprint()`:
22
+ * SHA256("WITNESS:{tenant}:{proc}:{fa}:{fb}:{fc}:{ts_ms}").hex().slice(0, 12)
23
+ */
24
+ export declare function mintFingerprint(tenantId: string, procedureId: string, factorA: number, factorB: number, factorC: number, timestampMs: number): string;
25
+ /**
26
+ * Return [millisecond timestamp, epoch seconds] for anchor minting.
27
+ */
28
+ export declare function timestampMs(): [number, number];
29
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAEnE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAEzE;AAiBD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,MAAM,CAMR;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAI9C"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * SWT3 AI Witness SDK — Fingerprint minting and SHA-256 utilities.
3
+ *
4
+ * The fingerprint formula MUST match the Python SDK and the ingestion endpoint:
5
+ * SHA256("WITNESS:{tenant}:{proc}:{fa}:{fb}:{fc}:{ts_ms}").hex().slice(0, 12)
6
+ *
7
+ * Uses Node.js crypto module for server-side compatibility.
8
+ */
9
+ import { createHash } from "crypto";
10
+ /**
11
+ * SHA-256 hash a string, return first `length` hex characters.
12
+ */
13
+ export function sha256Hex(data, length = 64) {
14
+ return createHash("sha256").update(data, "utf-8").digest("hex").slice(0, length);
15
+ }
16
+ /**
17
+ * SHA-256 hash a string, return first 16 hex chars (prompt/response hashing).
18
+ */
19
+ export function sha256Truncated(data, length = 16) {
20
+ return sha256Hex(data, length);
21
+ }
22
+ /**
23
+ * Format a numeric factor for the fingerprint formula.
24
+ *
25
+ * CRITICAL: Must match Python's behavior exactly.
26
+ * Integer-valued floats → "1" (no decimal), true floats → "1.5"
27
+ * JavaScript JSON.stringify(1) → "1", JSON.stringify(1.5) → "1.5"
28
+ * so we can use String() which matches.
29
+ */
30
+ function numStr(v) {
31
+ if (Number.isInteger(v)) {
32
+ return String(v);
33
+ }
34
+ return String(v);
35
+ }
36
+ /**
37
+ * Mint an SWT3 anchor fingerprint.
38
+ *
39
+ * This MUST match the endpoint's `validateFingerprint()` and the Python SDK's
40
+ * `mint_fingerprint()`:
41
+ * SHA256("WITNESS:{tenant}:{proc}:{fa}:{fb}:{fc}:{ts_ms}").hex().slice(0, 12)
42
+ */
43
+ export function mintFingerprint(tenantId, procedureId, factorA, factorB, factorC, timestampMs) {
44
+ const fpInput = `WITNESS:${tenantId}:${procedureId}` +
45
+ `:${numStr(factorA)}:${numStr(factorB)}:${numStr(factorC)}` +
46
+ `:${timestampMs}`;
47
+ return createHash("sha256").update(fpInput, "utf-8").digest("hex").slice(0, 12);
48
+ }
49
+ /**
50
+ * Return [millisecond timestamp, epoch seconds] for anchor minting.
51
+ */
52
+ export function timestampMs() {
53
+ const ts = Date.now();
54
+ const epoch = Math.floor(ts / 1000);
55
+ return [ts, epoch];
56
+ }
57
+ //# sourceMappingURL=fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,SAAiB,EAAE;IACzD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACnF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,SAAiB,EAAE;IAC/D,OAAO,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,MAAM,CAAC,CAAS;IACvB,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAgB,EAChB,WAAmB,EACnB,OAAe,EACf,OAAe,EACf,OAAe,EACf,WAAmB;IAEnB,MAAM,OAAO,GACX,WAAW,QAAQ,IAAI,WAAW,EAAE;QACpC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE;QAC3D,IAAI,WAAW,EAAE,CAAC;IACpB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AACrB,CAAC"}
@@ -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;AAuClE;;;;;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":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACtF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,eAAe,GAAG,OAAO,CAAC;AAqChC;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAA0B,EAC1B,SAA0B,EAC1B,QAAgB,EAChB,WAAmB;IAEnB,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,kBAAkB,OAAO,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;QAElC,IAAI,CAAC;YACH,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;YAExE,6DAA6D;YAC7D,IAAI,CAAC;gBACH,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,8DAA8D;YAChE,CAAC;YAED,gBAAgB;YAChB,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,gCAAgC;YAChC,IAAI,CAAC;gBACH,UAAU,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,OAAuB,EACvB,SAA0B,EAC1B,QAAgB;IAEhB,OAAO;QACL,eAAe,EAAE,eAAe;QAChC,YAAY,EAAE,kBAAkB,OAAO,CAAC,cAAc,EAAE;QACxD,SAAS,EAAE,QAAQ;QACnB,aAAa,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;QAClE,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,wBAAwB,EAAE,OAAO,CAAC,wBAAwB;QAC1D,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,OAAO,EAAE;YACP,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B;QACD,QAAQ,EAAE;YACR,WAAW,EAAE,SAAS,CAAC,OAAO;YAC9B,aAAa,EAAE,SAAS,CAAC,SAAS;YAClC,cAAc,EAAE,SAAS,CAAC,UAAU;YACpC,gBAAgB,EAAE,SAAS,CAAC,YAAY;YACxC,aAAa,EAAE,SAAS,CAAC,SAAS;YAClC,eAAe,EAAE,SAAS,CAAC,WAAW;YACtC,gBAAgB,EAAE,SAAS,CAAC,YAAY;YACxC,WAAW,EAAE,SAAS,CAAC,QAAQ;YAC/B,qBAAqB,EAAE,SAAS,CAAC,iBAAiB;YAClD,kBAAkB,EAAE,SAAS,CAAC,cAAc,IAAI,EAAE;YAClD,oBAAoB,EAAE,SAAS,CAAC,gBAAgB;YAChD,sBAAsB,EAAE,SAAS,CAAC,kBAAkB;YACpD,mBAAmB,EAAE,SAAS,CAAC,eAAe;SAC/C;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @tenova/swt3-ai — SWT3 AI Witness SDK for TypeScript/Node.js
3
+ *
4
+ * Usage:
5
+ * import { Witness } from "@tenova/swt3-ai";
6
+ * import OpenAI from "openai";
7
+ *
8
+ * const witness = new Witness({
9
+ * endpoint: "https://sovereign.tenova.io",
10
+ * apiKey: "axm_live_...",
11
+ * tenantId: "YOUR_TENANT_ID",
12
+ * });
13
+ *
14
+ * const client = witness.wrap(new OpenAI()) as OpenAI;
15
+ */
16
+ export { Witness, GatekeeperError } from "./witness.js";
17
+ export type { WitnessOptions } from "./witness.js";
18
+ export type { WitnessConfig, WitnessPayload, WitnessReceipt, InferenceRecord, BatchResponse, } from "./types.js";
19
+ export { mintFingerprint, sha256Truncated, sha256Hex, timestampMs } from "./fingerprint.js";
20
+ export { extractPayloads, extractGatekeeperPayload, extractRevocationPayload, REVOCATION_REASONS } from "./clearing.js";
21
+ export { signPayload } from "./signing.js";
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EACV,aAAa,EACb,cAAc,EACd,cAAc,EACd,eAAe,EACf,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @tenova/swt3-ai — SWT3 AI Witness SDK for TypeScript/Node.js
3
+ *
4
+ * Usage:
5
+ * import { Witness } from "@tenova/swt3-ai";
6
+ * import OpenAI from "openai";
7
+ *
8
+ * const witness = new Witness({
9
+ * endpoint: "https://sovereign.tenova.io",
10
+ * apiKey: "axm_live_...",
11
+ * tenantId: "YOUR_TENANT_ID",
12
+ * });
13
+ *
14
+ * const client = witness.wrap(new OpenAI()) as OpenAI;
15
+ */
16
+ export { Witness, GatekeeperError } from "./witness.js";
17
+ export { mintFingerprint, sha256Truncated, sha256Hex, timestampMs } from "./fingerprint.js";
18
+ export { extractPayloads, extractGatekeeperPayload, extractRevocationPayload, REVOCATION_REASONS } from "./clearing.js";
19
+ export { signPayload } from "./signing.js";
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AASxD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * SWT3 AI Witness SDK - Payload Signing (HMAC-SHA256).
3
+ *
4
+ * Signs anchor fingerprints to prove which SDK instance minted them.
5
+ * The signature input is deterministic and must match the Python SDK.
6
+ */
7
+ /**
8
+ * Sign an anchor fingerprint with HMAC-SHA256.
9
+ *
10
+ * @param signingKey - Shared secret between SDK and server.
11
+ * @param anchorFingerprint - The 12-char hex fingerprint to sign.
12
+ * @param agentId - Optional agent identifier to bind to the signature.
13
+ * @returns 64-char hex HMAC-SHA256 digest.
14
+ *
15
+ * Message format:
16
+ * "{fingerprint}:{agentId}" if agentId is provided
17
+ * "{fingerprint}" if agentId is undefined
18
+ */
19
+ export declare function signPayload(signingKey: string, anchorFingerprint: string, agentId?: string): string;
20
+ //# sourceMappingURL=signing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signing.d.ts","sourceRoot":"","sources":["../src/signing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,iBAAiB,EAAE,MAAM,EACzB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAOR"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * SWT3 AI Witness SDK - Payload Signing (HMAC-SHA256).
3
+ *
4
+ * Signs anchor fingerprints to prove which SDK instance minted them.
5
+ * The signature input is deterministic and must match the Python SDK.
6
+ */
7
+ import { createHmac } from "node:crypto";
8
+ /**
9
+ * Sign an anchor fingerprint with HMAC-SHA256.
10
+ *
11
+ * @param signingKey - Shared secret between SDK and server.
12
+ * @param anchorFingerprint - The 12-char hex fingerprint to sign.
13
+ * @param agentId - Optional agent identifier to bind to the signature.
14
+ * @returns 64-char hex HMAC-SHA256 digest.
15
+ *
16
+ * Message format:
17
+ * "{fingerprint}:{agentId}" if agentId is provided
18
+ * "{fingerprint}" if agentId is undefined
19
+ */
20
+ export function signPayload(signingKey, anchorFingerprint, agentId) {
21
+ const message = agentId
22
+ ? `${anchorFingerprint}:${agentId}`
23
+ : anchorFingerprint;
24
+ return createHmac("sha256", signingKey)
25
+ .update(message, "utf-8")
26
+ .digest("hex");
27
+ }
28
+ //# sourceMappingURL=signing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signing.js","sourceRoot":"","sources":["../src/signing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW,CACzB,UAAkB,EAClB,iBAAyB,EACzB,OAAgB;IAEhB,MAAM,OAAO,GAAG,OAAO;QACrB,CAAC,CAAC,GAAG,iBAAiB,IAAI,OAAO,EAAE;QACnC,CAAC,CAAC,iBAAiB,CAAC;IACtB,OAAO,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC;SACpC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;SACxB,MAAM,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * SWT3 AI Witness SDK — Type definitions.
3
+ */
4
+ export interface WitnessConfig {
5
+ endpoint: string;
6
+ apiKey: string;
7
+ tenantId: string;
8
+ clearingLevel: 0 | 1 | 2 | 3;
9
+ bufferSize: number;
10
+ flushInterval: number;
11
+ timeout: number;
12
+ maxRetries: number;
13
+ latencyThresholdMs: number;
14
+ guardrailsRequired: number;
15
+ guardrailNames: string[];
16
+ procedures?: string[];
17
+ factorHandoff?: "file";
18
+ factorHandoffPath?: string;
19
+ agentId?: string;
20
+ signingKey?: string;
21
+ cycleId?: string;
22
+ policyVersion?: string;
23
+ jurisdiction?: string;
24
+ legalBasis?: string;
25
+ purposeClass?: string;
26
+ onFlush?: (payloads: WitnessPayload[], receipts: WitnessReceipt[]) => void;
27
+ }
28
+ export interface WitnessPayload {
29
+ procedure_id: string;
30
+ factor_a: number;
31
+ factor_b: number;
32
+ factor_c: number;
33
+ clearing_level: number;
34
+ anchor_fingerprint: string;
35
+ anchor_epoch: number;
36
+ fingerprint_timestamp_ms: number;
37
+ ai_model_id?: string;
38
+ ai_prompt_hash?: string;
39
+ ai_response_hash?: string;
40
+ ai_system_prompt_hash?: string;
41
+ ai_latency_ms?: number;
42
+ ai_input_tokens?: number;
43
+ ai_output_tokens?: number;
44
+ ai_context?: {
45
+ provider?: string;
46
+ guardrails?: string[];
47
+ system_fingerprint?: string;
48
+ tool_name?: string;
49
+ tool_call_id?: string;
50
+ access_target?: string;
51
+ access_scope?: string;
52
+ access_granted?: boolean;
53
+ cycle_id?: string;
54
+ };
55
+ agent_id?: string;
56
+ cycle_id?: string;
57
+ payload_signature?: string;
58
+ policy_version_hash?: string;
59
+ jurisdiction?: string;
60
+ legal_basis?: string;
61
+ purpose_class?: string;
62
+ authorization_id?: string;
63
+ revocation_target?: string;
64
+ revocation_reason?: string;
65
+ }
66
+ export interface WitnessReceipt {
67
+ procedure_id: string;
68
+ verdict: "PASS" | "FAIL" | string;
69
+ swt3_anchor: string;
70
+ clearing_level: number;
71
+ witnessed_at: string;
72
+ verification_url: string;
73
+ ok: boolean;
74
+ error?: string;
75
+ }
76
+ export interface BatchResponse {
77
+ ok: boolean;
78
+ tenant_id: string;
79
+ total: number;
80
+ accepted: number;
81
+ rejected: number;
82
+ receipts: WitnessReceipt[];
83
+ }
84
+ export interface InferenceRecord {
85
+ modelId: string;
86
+ modelHash: string;
87
+ promptHash: string;
88
+ responseHash: string;
89
+ latencyMs: number;
90
+ inputTokens?: number;
91
+ outputTokens?: number;
92
+ guardrailsActive: number;
93
+ guardrailsRequired: number;
94
+ guardrailPassed: boolean;
95
+ hasRefusal: boolean;
96
+ provider: string;
97
+ systemFingerprint?: string;
98
+ systemPromptHash?: string;
99
+ guardrailNames: string[];
100
+ toolName?: string;
101
+ toolCallId?: string;
102
+ accessTarget?: string;
103
+ accessGranted?: boolean;
104
+ accessScope?: string;
105
+ }
106
+ /** Valid AI procedure IDs from SWT3 Spec v1.2.0 */
107
+ export declare const AI_PROCEDURES: Set<string>;
108
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,20 @@
1
+ /**
2
+ * SWT3 AI Witness SDK — Type definitions.
3
+ */
4
+ /** Valid AI procedure IDs from SWT3 Spec v1.2.0 */
5
+ export const AI_PROCEDURES = new Set([
6
+ "AI-INF.1", "AI-INF.2", "AI-INF.3",
7
+ "AI-MDL.1", "AI-MDL.2", "AI-MDL.3",
8
+ "AI-GRD.1", "AI-GRD.2", "AI-GRD.3",
9
+ "AI-FAIR.1", "AI-FAIR.2",
10
+ "AI-DATA.1", "AI-DATA.2",
11
+ "AI-HITL.1", "AI-HITL.2",
12
+ "AI-EXPL.1", "AI-EXPL.2",
13
+ "AI-TOOL.1",
14
+ "AI-ID.1",
15
+ "AI-ACC.1",
16
+ "AI-REV.1",
17
+ "AI-SEC.1",
18
+ "AI-SEC.2",
19
+ ]);
20
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6GH,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;IACxB,WAAW;IACX,SAAS;IACT,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;CACX,CAAC,CAAC"}