@tenova/swt3-ai 0.5.5 → 0.5.7

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 (78) hide show
  1. package/README.md +44 -15
  2. package/dist/adapters/a2a.d.ts +26 -0
  3. package/dist/adapters/a2a.d.ts.map +1 -0
  4. package/dist/adapters/a2a.js +86 -0
  5. package/dist/adapters/a2a.js.map +1 -0
  6. package/dist/adapters/cohere.d.ts +28 -0
  7. package/dist/adapters/cohere.d.ts.map +1 -0
  8. package/dist/adapters/cohere.js +292 -0
  9. package/dist/adapters/cohere.js.map +1 -0
  10. package/dist/adapters/crewai.d.ts +26 -0
  11. package/dist/adapters/crewai.d.ts.map +1 -0
  12. package/dist/adapters/crewai.js +78 -0
  13. package/dist/adapters/crewai.js.map +1 -0
  14. package/dist/adapters/foundry.d.ts +26 -0
  15. package/dist/adapters/foundry.d.ts.map +1 -0
  16. package/dist/adapters/foundry.js +118 -0
  17. package/dist/adapters/foundry.js.map +1 -0
  18. package/dist/adapters/google-adk.d.ts +25 -0
  19. package/dist/adapters/google-adk.d.ts.map +1 -0
  20. package/dist/adapters/google-adk.js +81 -0
  21. package/dist/adapters/google-adk.js.map +1 -0
  22. package/dist/adapters/ollama.d.ts +20 -0
  23. package/dist/adapters/ollama.d.ts.map +1 -1
  24. package/dist/adapters/ollama.js +22 -0
  25. package/dist/adapters/ollama.js.map +1 -1
  26. package/dist/adapters/qdrant.d.ts +28 -0
  27. package/dist/adapters/qdrant.d.ts.map +1 -0
  28. package/dist/adapters/qdrant.js +136 -0
  29. package/dist/adapters/qdrant.js.map +1 -0
  30. package/dist/chain.d.ts +33 -0
  31. package/dist/chain.d.ts.map +1 -0
  32. package/dist/chain.js +94 -0
  33. package/dist/chain.js.map +1 -0
  34. package/dist/clearing.d.ts +7 -2
  35. package/dist/clearing.d.ts.map +1 -1
  36. package/dist/clearing.js +16 -5
  37. package/dist/clearing.js.map +1 -1
  38. package/dist/cli.d.ts +1 -0
  39. package/dist/cli.d.ts.map +1 -1
  40. package/dist/cli.js +123 -6
  41. package/dist/cli.js.map +1 -1
  42. package/dist/config.d.ts.map +1 -1
  43. package/dist/config.js +15 -0
  44. package/dist/config.js.map +1 -1
  45. package/dist/demo.d.ts.map +1 -1
  46. package/dist/demo.js +173 -10
  47. package/dist/demo.js.map +1 -1
  48. package/dist/doctor.d.ts +1 -1
  49. package/dist/doctor.d.ts.map +1 -1
  50. package/dist/doctor.js +39 -16
  51. package/dist/doctor.js.map +1 -1
  52. package/dist/index.d.ts +9 -2
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +7 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/procedures.d.ts +20 -0
  57. package/dist/procedures.d.ts.map +1 -0
  58. package/dist/procedures.js +167 -0
  59. package/dist/procedures.js.map +1 -0
  60. package/dist/profile.d.ts +50 -0
  61. package/dist/profile.d.ts.map +1 -0
  62. package/dist/profile.js +109 -0
  63. package/dist/profile.js.map +1 -0
  64. package/dist/trust.d.ts +96 -2
  65. package/dist/trust.d.ts.map +1 -1
  66. package/dist/trust.js +200 -9
  67. package/dist/trust.js.map +1 -1
  68. package/dist/types.d.ts +120 -1
  69. package/dist/types.d.ts.map +1 -1
  70. package/dist/types.js +177 -1
  71. package/dist/types.js.map +1 -1
  72. package/dist/witness.d.ts +595 -0
  73. package/dist/witness.d.ts.map +1 -1
  74. package/dist/witness.js +1708 -202
  75. package/dist/witness.js.map +1 -1
  76. package/package.json +2 -2
  77. package/templates/healthcare-clinical.yaml +4 -0
  78. package/templates/multi-silicon.yaml +48 -0
package/README.md CHANGED
@@ -13,17 +13,44 @@ Works with OpenAI, Anthropic, AWS Bedrock, Vercel AI SDK, and any OpenAI-compati
13
13
 
14
14
  GPAI transparency obligations are enforceable now. EU AI Act high-risk enforcement begins **December 2, 2027**. This SDK gives you the evidence chain.
15
15
 
16
- ## What's New in v0.5.5
17
-
18
- - **Trust Mesh Hardened** -- 7 security layers: intra-tenant zero-trust, per-agent rate limiting, per-level freshness windows (SOVEREIGN requires 5-min anchors), verifiable boolean claims, deny list propagation with sentinel hooks. All opt-in, frictionless defaults unchanged.
19
- - **Key Attestation (AI-TRUST.3)** -- Bind signing keys to witness anchors. `generateKeyAttestation()` / `verifyKeyAttestation()`. Keys valid only while bound anchor is fresh. No certificate authority required.
20
- - **Challenge-Response Liveness** -- Prove live key possession via nonce-based challenges. `generateChallenge()` / `respondToChallenge()` / `verifyLivenessResponse()`. Defeats credential replay at ATTESTED/SOVEREIGN levels.
21
- - **4 New Adapters** -- Google ADK, CrewAI, A2A (Google Agent-to-Agent), Microsoft Foundry. 12 total integrations.
22
- - **Verify CLI** -- `swt3 verify --anchor <token>` recomputes fingerprint offline. Zero network calls.
23
- - **Bidirectional Framework Crosswalks** -- 222 mappings across 16 frameworks in machine-readable JSON.
24
- - **RFC 3161 Timestamps** -- Merkle rollups include RFC 3161 timestamp authority proof for legal non-repudiation.
25
- - **Microsoft Foundry Profile** -- Industry profile for Azure AI Foundry + AGT deployments.
26
- - **15 profiles**, 65 procedures, 41 namespaces, 12 integrations, 1,379 cross-language tests
16
+ ## What's New in v0.5.7
17
+
18
+ **Autonomous Agent Attestation** -- Autonomous agents make decisions, delegate tasks, consume resources, and cross jurisdictions without human intervention at every step. SWT3 witnesses each transition as immutable evidence. When an examiner asks "what did this agent do and who authorized it?", these procedures provide the cryptographic answer. Every delegation, capability change, autonomy transition, resource draw, and lifecycle event is attested independently of the agent's own logs.
19
+
20
+ - **Delegation Tree Attestation (AI-DEL.1)** -- `witnessDelegation()` attests authority delegation between agents: scope hash, depth from human authorization, TTL, cascade revocation, and sub-delegation control. Evidence for EU AI Act Art. 14 human oversight.
21
+ - **Capability Attestation (AI-CAP.1)** -- `witnessCapabilityAttestation()` attests declared vs observed agent capabilities with manifest hashing and drift detection. Autonomy level binding for Art. 15 robustness.
22
+ - **Autonomy Level Transition (AI-AUTO.3)** -- `witnessAutonomyTransition()` attests agent promotion and demotion between autonomy levels 0-3. Risk-triggered downgrades, HITL checkpoints, and transition justification.
23
+ - **Resource Consumption Attestation (AI-COST.1)** -- `witnessResourceConsumption()` attests token usage, API call counts, and estimated cost as compliance evidence. Budget threshold awareness without billing enforcement.
24
+ - **Lifecycle Event Attestation (AI-LCM.1)** -- `witnessLifecycle()` attests spawn, checkpoint, migrate, terminate, and crash events with context size and state hash.
25
+
26
+ ```typescript
27
+ // Autonomous agent lifecycle: spawn -> delegate -> attest capabilities -> transition -> terminate
28
+ witness.witnessLifecycle("spawn", { contextTokens: 0 });
29
+ witness.witnessDelegation({ scope: "fraud-review", delegator: "orchestrator", depth: 1, ttlSeconds: 3600 });
30
+ witness.witnessCapabilityAttestation({ manifest: ["tool:search", "tool:flag"], autonomyLevel: 2 });
31
+ witness.witnessAutonomyTransition({ fromLevel: 2, toLevel: 1, trigger: "risk_threshold" });
32
+ witness.witnessLifecycle("terminate", { contextTokens: 8400 });
33
+ ```
34
+
35
+ **Cross-Silicon Hardware Attestation** -- auto-detect and attest accelerator inventory across competing silicon vendors. 6 discovery paths: NVIDIA GPU (`nvidia-smi`), Google TPU (JAX), AMD MI (`rocm-smi`), AWS Trainium (`neuron-ls`), Intel Gaudi (`hl-smi`), and PCI fallback. New `multi-silicon` profile for workloads that migrate between vendors. When your model moves from NVIDIA to TPU, the attestation follows.
36
+
37
+ ```typescript
38
+ witness.witnessHardware(); // auto-detects silicon vendor, GPU count, VRAM, driver version
39
+ ```
40
+
41
+ **Endpoint Attestation** -- witness the infrastructure decisions that shape how agents operate across boundaries.
42
+
43
+ - **Agent Transaction Witnessing (AI-FIN.1)** -- `witnessTransaction()` for autonomous agent financial operations. Authorization type, amount, and settlement status anchored before execution.
44
+ - **Tool Permission Attestation (AI-TOOL.2)** -- `witnessToolPermissions()` attests runtime tool sets against agent charter. Detects permission drift and escalation.
45
+ - **Cross-Border Inference Routing (AI-JUR.1)** -- `witnessRouting()` witnesses routing decisions with ISO 3166 region codes and compliance status.
46
+
47
+ **Adapters**
48
+
49
+ - **Cohere Adapter** -- `wrapCohere()` for Cohere V2 API. Chat and streaming witnessed transparently.
50
+ - **Qdrant RAG Witness** -- `wrapQdrant()` for database-level RAG pipeline compliance. Every vector search mints AI-RAG.1.
51
+ - **Ollama 0.30+ Refresh** -- explicit `wrapOllama()` export, GGUF model name normalization.
52
+
53
+ 103 procedures, 54 namespaces, 28 frameworks, 15 profiles, 16 integrations, 7 languages
27
54
 
28
55
  ## MCP Server -- Official Registry
29
56
 
@@ -93,7 +120,7 @@ All verification is local. Zero cloud overhead. No data exchanged until both age
93
120
 
94
121
  ## Offline Verification
95
122
 
96
- Verify any witness anchor without network calls. The fingerprint formula is deterministic and identical across all 6 SDK languages -- recompute it anywhere in microseconds.
123
+ Verify any witness anchor without network calls. The fingerprint formula is deterministic and identical across all 7 SDK languages -- recompute it anywhere in microseconds.
97
124
 
98
125
  ```typescript
99
126
  import { verifyAnchor } from "@tenova/swt3-ai";
@@ -107,7 +134,7 @@ const result = verifyAnchor(anchor, {
107
134
  // result.status: "CERTIFIED TRUTH" | "TAMPERED"
108
135
  ```
109
136
 
110
- Zero vendor dependency. Zero network calls. Works air-gapped. The same formula runs in Python, TypeScript, Rust, C#, and Ruby with identical output for identical inputs.
137
+ Zero vendor dependency. Zero network calls. Works air-gapped. The same formula runs in Python, TypeScript, Swift, Rust, C#, and Ruby with identical output for identical inputs.
111
138
 
112
139
  ## See It Work (No Account Needed)
113
140
 
@@ -704,7 +731,7 @@ Each inference produces anchors for these checks. Every check maps to a regulati
704
731
 
705
732
  ### EU AI Act Article Mapping
706
733
 
707
- All 65 SWT3 AI witnessing procedures map to specific EU AI Act obligations:
734
+ All 76 SWT3 AI witnessing procedures map to specific EU AI Act obligations:
708
735
 
709
736
  | Procedure | EU AI Act Article | Obligation | Demo | Production |
710
737
  |-----------|-------------------|------------|------|------------|
@@ -721,7 +748,7 @@ All 65 SWT3 AI witnessing procedures map to specific EU AI Act obligations:
721
748
  | AI-EXPL.1 | Art. 13(1) | Transparency & Explainability | -| ✓ |
722
749
  | AI-EXPL.2 | Art. 13(3b) | Confidence Calibration | -| ✓ |
723
750
 
724
- The demo demonstrates 5 procedures using simulated data. All 65 are available in production with real inference data. 207 cross-language test vectors ensure fingerprint parity across Python, TypeScript, Rust, C#, and Ruby. [See live conformity →](https://sovereign.tenova.io/audit/axm_audit_demo_eu_ai_act_public)
751
+ The demo demonstrates 5 procedures using simulated data. All 76 are available in production with real inference data. 207 cross-language test vectors ensure fingerprint parity across Python, TypeScript, Swift, Rust, C#, and Ruby. [See live conformity →](https://sovereign.tenova.io/audit/axm_audit_demo_eu_ai_act_public)
725
752
 
726
753
  ## How Verdicts Work
727
754
 
@@ -1057,3 +1084,5 @@ Your prompts and responses **never leave your infrastructure**. The SDK computes
1057
1084
  *SWT3: Sovereign Witness Traceability. We don't run your models. We witness them.*
1058
1085
 
1059
1086
  SWT3 and Sovereign Witness Traceability are trademarks of Tenable Nova LLC. Patent pending. Apache 2.0 licensed.
1087
+
1088
+ This project is not affiliated with, endorsed by, or sponsored by any third-party AI provider. All third-party trademarks are the property of their respective owners: OpenAI and GPT (OpenAI, Inc.); Claude and Anthropic (Anthropic PBC); Google, Gemini, Vertex AI, and ADK (Google LLC); Azure, Foundry, and Microsoft (Microsoft Corporation); AWS and Bedrock (Amazon Web Services, Inc.); NVIDIA and Dynamo (NVIDIA Corporation); Meta and Llama (Meta Platforms, Inc.); Ollama (Ollama, Inc.); CrewAI (CrewAI, Inc.); Vercel and Next.js (Vercel, Inc.); MCP (Anthropic PBC); vLLM (vLLM Project). Use of these names is for identification and interoperability purposes only.
@@ -0,0 +1,26 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- A2A (Agent-to-Agent) Protocol Adapter.
3
+ *
4
+ * Wraps any object with a send() method (Google A2A protocol pattern),
5
+ * minting witness anchors on each inter-agent message without modifying
6
+ * the agent logic or adding protocol dependencies.
7
+ *
8
+ * Usage:
9
+ * import { wrapA2A } from "@tenova/swt3-ai/adapters/a2a";
10
+ * const witnessed = wrapA2A(agent, witness);
11
+ * const result = await witnessed.send({ text: "Analyze this data" });
12
+ *
13
+ * Duck-typed: works with any object that has a send() method.
14
+ * No A2A protocol import required.
15
+ *
16
+ * Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
17
+ */
18
+ import type { Witness } from "../witness.js";
19
+ export interface A2AAgent {
20
+ send(message: unknown, ...args: unknown[]): unknown;
21
+ handleMessage?(message: unknown, ...args: unknown[]): unknown;
22
+ name?: string;
23
+ model?: string;
24
+ }
25
+ export declare function wrapA2A<T extends A2AAgent>(agent: T, witness: Witness, modelId?: string): T;
26
+ //# sourceMappingURL=a2a.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a.d.ts","sourceRoot":"","sources":["../../src/adapters/a2a.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACpD,aAAa,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAgED,wBAAgB,OAAO,CAAC,CAAC,SAAS,QAAQ,EACxC,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,CAAC,CAUH"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- A2A (Agent-to-Agent) Protocol Adapter.
3
+ *
4
+ * Wraps any object with a send() method (Google A2A protocol pattern),
5
+ * minting witness anchors on each inter-agent message without modifying
6
+ * the agent logic or adding protocol dependencies.
7
+ *
8
+ * Usage:
9
+ * import { wrapA2A } from "@tenova/swt3-ai/adapters/a2a";
10
+ * const witnessed = wrapA2A(agent, witness);
11
+ * const result = await witnessed.send({ text: "Analyze this data" });
12
+ *
13
+ * Duck-typed: works with any object that has a send() method.
14
+ * No A2A protocol import required.
15
+ *
16
+ * Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
17
+ */
18
+ import { sha256Truncated } from "../fingerprint.js";
19
+ function resolveModelId(agent, explicit) {
20
+ if (explicit)
21
+ return explicit;
22
+ if (typeof process !== "undefined" && process.env.SWT3_MODEL_ID) {
23
+ return process.env.SWT3_MODEL_ID;
24
+ }
25
+ if (agent.model)
26
+ return agent.model;
27
+ if (agent.name)
28
+ return `a2a-${agent.name}`;
29
+ return "a2a-agent";
30
+ }
31
+ function stringifyMessage(msg) {
32
+ if (msg === null || msg === undefined)
33
+ return "";
34
+ if (typeof msg === "string")
35
+ return msg;
36
+ try {
37
+ return JSON.stringify(msg);
38
+ }
39
+ catch {
40
+ return String(msg);
41
+ }
42
+ }
43
+ function wrapMethod(target, methodName, witness, mid) {
44
+ const original = target[methodName];
45
+ if (typeof original !== "function")
46
+ return;
47
+ const bound = original.bind(target);
48
+ target[methodName] = (message, ...args) => {
49
+ const start = performance.now();
50
+ const result = bound(message, ...args);
51
+ const finish = (res) => {
52
+ const elapsed = Math.round(performance.now() - start);
53
+ const record = {
54
+ modelId: mid,
55
+ modelHash: sha256Truncated(mid),
56
+ promptHash: sha256Truncated(stringifyMessage(message)),
57
+ responseHash: sha256Truncated(stringifyMessage(res)),
58
+ latencyMs: elapsed,
59
+ inputTokens: 0,
60
+ outputTokens: 0,
61
+ guardrailsActive: 0,
62
+ guardrailsRequired: 0,
63
+ guardrailPassed: true,
64
+ hasRefusal: false,
65
+ provider: "a2a",
66
+ guardrailNames: [],
67
+ };
68
+ witness.record(record);
69
+ return res;
70
+ };
71
+ if (result && typeof result.then === "function") {
72
+ return result.then(finish);
73
+ }
74
+ return finish(result);
75
+ };
76
+ }
77
+ export function wrapA2A(agent, witness, modelId) {
78
+ const mid = resolveModelId(agent, modelId);
79
+ const wrapped = Object.create(agent);
80
+ wrapMethod(wrapped, "send", witness, mid);
81
+ if (agent.handleMessage) {
82
+ wrapMethod(wrapped, "handleMessage", witness, mid);
83
+ }
84
+ return wrapped;
85
+ }
86
+ //# sourceMappingURL=a2a.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a.js","sourceRoot":"","sources":["../../src/adapters/a2a.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- Cohere Adapter (ES6 Proxy).
3
+ *
4
+ * Wraps the Cohere client so that chat() and chatStream() are
5
+ * intercepted for witnessing. Flat API -- only one level of proxy.
6
+ *
7
+ * Cohere V2 response structure:
8
+ * response.message.content[0].text -> response text
9
+ * response.model -> string
10
+ * response.finishReason -> "COMPLETE" | "MAX_TOKENS" | "ERROR"
11
+ * response.usage.tokens.inputTokens / outputTokens
12
+ *
13
+ * Cohere streaming:
14
+ * chat_stream() returns an async iterable of events:
15
+ * message-start, content-delta, message-end
16
+ *
17
+ * Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
18
+ */
19
+ import type { Witness } from "../witness.js";
20
+ /**
21
+ * Wrap a Cohere client with an ES6 Proxy for transparent witnessing.
22
+ *
23
+ * Works with both sync and async Cohere clients. Intercepts:
24
+ * - chat() for non-streaming completions
25
+ * - chatStream() for streaming completions
26
+ */
27
+ export declare function wrapCohere(client: unknown, witness: Witness): unknown;
28
+ //# sourceMappingURL=cohere.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cohere.d.ts","sourceRoot":"","sources":["../../src/adapters/cohere.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAuBrE"}
@@ -0,0 +1,292 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- Cohere Adapter (ES6 Proxy).
3
+ *
4
+ * Wraps the Cohere client so that chat() and chatStream() are
5
+ * intercepted for witnessing. Flat API -- only one level of proxy.
6
+ *
7
+ * Cohere V2 response structure:
8
+ * response.message.content[0].text -> response text
9
+ * response.model -> string
10
+ * response.finishReason -> "COMPLETE" | "MAX_TOKENS" | "ERROR"
11
+ * response.usage.tokens.inputTokens / outputTokens
12
+ *
13
+ * Cohere streaming:
14
+ * chat_stream() returns an async iterable of events:
15
+ * message-start, content-delta, message-end
16
+ *
17
+ * Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
18
+ */
19
+ import { sha256Truncated } from "../fingerprint.js";
20
+ /**
21
+ * Wrap a Cohere client with an ES6 Proxy for transparent witnessing.
22
+ *
23
+ * Works with both sync and async Cohere clients. Intercepts:
24
+ * - chat() for non-streaming completions
25
+ * - chatStream() for streaming completions
26
+ */
27
+ export function wrapCohere(client, witness) {
28
+ return new Proxy(client, {
29
+ get(target, prop) {
30
+ if (typeof prop === "symbol")
31
+ return Reflect.get(target, prop);
32
+ const real = Reflect.get(target, prop);
33
+ if (prop === "chat") {
34
+ return createChatInterceptor(real, witness);
35
+ }
36
+ if (prop === "chatStream" || prop === "chat_stream") {
37
+ return createStreamInterceptor(real, witness);
38
+ }
39
+ return real;
40
+ },
41
+ });
42
+ }
43
+ // -- chat() interceptor -------------------------------------------------------
44
+ function createChatInterceptor(realMethod, witness) {
45
+ return function interceptedChat(...args) {
46
+ const kwargs = (args[0] ?? {});
47
+ const messages = kwargs.messages;
48
+ const model = kwargs.model ?? "unknown";
49
+ const promptText = extractPromptText(messages);
50
+ const promptHash = sha256Truncated(promptText);
51
+ // Hash system prompt separately (instruction drift detection)
52
+ const systemPromptText = extractSystemPrompt(messages);
53
+ const systemPromptHash = systemPromptText
54
+ ? sha256Truncated(systemPromptText)
55
+ : undefined;
56
+ // Gatekeeper pre-call check (strict mode only)
57
+ let authorizationId;
58
+ if (witness.strict) {
59
+ authorizationId = witness.gateCheck(messages, model);
60
+ }
61
+ const start = performance.now();
62
+ const result = realMethod.call(this, ...args);
63
+ // Result is Promise<ChatResponse>
64
+ return result.then((response) => {
65
+ const elapsedMs = Math.round(performance.now() - start);
66
+ const record = extractRecord(response, model, promptHash, elapsedMs, systemPromptHash);
67
+ witness.record(record, authorizationId);
68
+ return response;
69
+ });
70
+ };
71
+ }
72
+ // -- chatStream() interceptor -------------------------------------------------
73
+ function createStreamInterceptor(realMethod, witness) {
74
+ return function interceptedStream(...args) {
75
+ const kwargs = (args[0] ?? {});
76
+ const messages = kwargs.messages;
77
+ const model = kwargs.model ?? "unknown";
78
+ const promptText = extractPromptText(messages);
79
+ const promptHash = sha256Truncated(promptText);
80
+ const systemPromptText = extractSystemPrompt(messages);
81
+ const systemPromptHash = systemPromptText
82
+ ? sha256Truncated(systemPromptText)
83
+ : undefined;
84
+ let authorizationId;
85
+ if (witness.strict) {
86
+ authorizationId = witness.gateCheck(messages, model);
87
+ }
88
+ const start = performance.now();
89
+ const result = realMethod.call(this, ...args);
90
+ // chat_stream may return an async iterable directly or a Promise
91
+ if (result && typeof result.then === "function") {
92
+ return result.then((stream) => wrapCohereStream(stream, witness, model, promptHash, start, systemPromptHash, authorizationId));
93
+ }
94
+ return wrapCohereStream(result, witness, model, promptHash, start, systemPromptHash, authorizationId);
95
+ };
96
+ }
97
+ // -- Stream Accumulator -------------------------------------------------------
98
+ async function* streamAccumulator(stream, witness, model, promptHash, startTime, systemPromptHash, authorizationId) {
99
+ const textParts = [];
100
+ let actualModel = model;
101
+ let inputTokens;
102
+ let outputTokens;
103
+ for await (const event of stream) {
104
+ // Yield to developer immediately
105
+ yield event;
106
+ const e = event;
107
+ const type = e.type;
108
+ if (type === "message-start") {
109
+ const delta = e.delta;
110
+ if (delta) {
111
+ const message = delta.message;
112
+ if (message?.model)
113
+ actualModel = message.model;
114
+ }
115
+ }
116
+ if (type === "content-delta") {
117
+ const delta = e.delta;
118
+ if (delta) {
119
+ const message = delta.message;
120
+ if (message) {
121
+ const content = message.content;
122
+ if (content?.text) {
123
+ textParts.push(content.text);
124
+ }
125
+ }
126
+ }
127
+ }
128
+ if (type === "message-end") {
129
+ const delta = e.delta;
130
+ if (delta) {
131
+ const usage = delta.usage;
132
+ if (usage) {
133
+ const tokens = usage.tokens;
134
+ if (tokens) {
135
+ if (tokens.input_tokens !== undefined)
136
+ inputTokens = tokens.input_tokens;
137
+ if (tokens.output_tokens !== undefined)
138
+ outputTokens = tokens.output_tokens;
139
+ }
140
+ // Also check camelCase variants
141
+ if (tokens === undefined) {
142
+ if (usage.inputTokens !== undefined)
143
+ inputTokens = usage.inputTokens;
144
+ if (usage.outputTokens !== undefined)
145
+ outputTokens = usage.outputTokens;
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+ // Stream complete -- witness
152
+ const elapsedMs = Math.round(performance.now() - startTime);
153
+ const responseText = textParts.join("");
154
+ const record = {
155
+ modelId: actualModel,
156
+ modelHash: sha256Truncated(actualModel),
157
+ promptHash,
158
+ responseHash: sha256Truncated(responseText),
159
+ latencyMs: elapsedMs,
160
+ inputTokens,
161
+ outputTokens,
162
+ guardrailsActive: 0,
163
+ guardrailsRequired: 0,
164
+ guardrailPassed: true,
165
+ hasRefusal: false,
166
+ provider: "cohere",
167
+ guardrailNames: [],
168
+ systemPromptHash,
169
+ };
170
+ witness.record(record, authorizationId);
171
+ }
172
+ function wrapCohereStream(stream, witness, model, promptHash, startTime, systemPromptHash, authorizationId) {
173
+ const s = stream;
174
+ const gen = streamAccumulator(s, witness, model, promptHash, startTime, systemPromptHash, authorizationId);
175
+ return new Proxy(s, {
176
+ get(target, prop) {
177
+ if (prop === Symbol.asyncIterator) {
178
+ return () => gen;
179
+ }
180
+ const value = Reflect.get(target, prop);
181
+ if (typeof value === "function") {
182
+ return value.bind(target);
183
+ }
184
+ return value;
185
+ },
186
+ });
187
+ }
188
+ // -- Factor Extraction --------------------------------------------------------
189
+ function extractSystemPrompt(messages) {
190
+ if (!Array.isArray(messages))
191
+ return undefined;
192
+ for (const msg of messages) {
193
+ if (typeof msg !== "object" || msg === null)
194
+ continue;
195
+ const m = msg;
196
+ if (m.role !== "system")
197
+ continue;
198
+ const content = m.content;
199
+ if (typeof content === "string")
200
+ return content;
201
+ if (Array.isArray(content)) {
202
+ const parts = [];
203
+ for (const block of content) {
204
+ if (typeof block === "object" && block !== null) {
205
+ const b = block;
206
+ if (typeof b.text === "string")
207
+ parts.push(b.text);
208
+ }
209
+ }
210
+ return parts.length > 0 ? parts.join("\n") : undefined;
211
+ }
212
+ }
213
+ return undefined;
214
+ }
215
+ function extractPromptText(messages) {
216
+ const parts = [];
217
+ if (Array.isArray(messages)) {
218
+ for (const msg of messages) {
219
+ if (typeof msg !== "object" || msg === null)
220
+ continue;
221
+ const m = msg;
222
+ const content = m.content;
223
+ if (typeof content === "string") {
224
+ parts.push(content);
225
+ }
226
+ else if (Array.isArray(content)) {
227
+ for (const block of content) {
228
+ if (typeof block === "object" && block !== null) {
229
+ const b = block;
230
+ if (typeof b.text === "string")
231
+ parts.push(b.text);
232
+ }
233
+ }
234
+ }
235
+ }
236
+ }
237
+ return parts.join("\n");
238
+ }
239
+ function extractRecord(response, model, promptHash, elapsedMs, systemPromptHash) {
240
+ const r = response;
241
+ // Extract text from message.content
242
+ let responseText = "";
243
+ const message = r.message;
244
+ if (message) {
245
+ const content = message.content;
246
+ if (Array.isArray(content)) {
247
+ const texts = [];
248
+ for (const block of content) {
249
+ if (typeof block.text === "string")
250
+ texts.push(block.text);
251
+ }
252
+ responseText = texts.join("\n");
253
+ }
254
+ }
255
+ // Finish reason
256
+ const finishReason = r.finish_reason ?? r.finishReason ?? "";
257
+ const hasRefusal = !["COMPLETE", "MAX_TOKENS", "TOOL_CALL"].includes(finishReason);
258
+ // Token usage
259
+ const usage = r.usage;
260
+ let inputTokens;
261
+ let outputTokens;
262
+ if (usage) {
263
+ const tokens = usage.tokens;
264
+ if (tokens) {
265
+ inputTokens = tokens.input_tokens;
266
+ outputTokens = tokens.output_tokens;
267
+ // camelCase fallback
268
+ if (inputTokens === undefined)
269
+ inputTokens = tokens.inputTokens;
270
+ if (outputTokens === undefined)
271
+ outputTokens = tokens.outputTokens;
272
+ }
273
+ }
274
+ const actualModel = r.model ?? model;
275
+ return {
276
+ modelId: actualModel,
277
+ modelHash: sha256Truncated(actualModel),
278
+ promptHash,
279
+ responseHash: sha256Truncated(responseText),
280
+ latencyMs: elapsedMs,
281
+ inputTokens,
282
+ outputTokens,
283
+ guardrailsActive: 0,
284
+ guardrailsRequired: 0,
285
+ guardrailPassed: true,
286
+ hasRefusal,
287
+ provider: "cohere",
288
+ systemPromptHash,
289
+ guardrailNames: [],
290
+ };
291
+ }
292
+ //# sourceMappingURL=cohere.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cohere.js","sourceRoot":"","sources":["../../src/adapters/cohere.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- CrewAI Adapter.
3
+ *
4
+ * Wraps any object with a kickoff() method (CrewAI Crew pattern),
5
+ * minting witness anchors on each crew execution without modifying
6
+ * the crew logic or adding framework dependencies.
7
+ *
8
+ * Usage:
9
+ * import { wrapCrewAI } from "@tenova/swt3-ai/adapters/crewai";
10
+ * const witnessed = wrapCrewAI(crew, witness);
11
+ * const result = await witnessed.kickoff();
12
+ *
13
+ * Duck-typed: works with any object that has a kickoff() method.
14
+ * No crewai import required.
15
+ *
16
+ * Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
17
+ */
18
+ import type { Witness } from "../witness.js";
19
+ export interface CrewAICrew {
20
+ kickoff(inputs?: Record<string, unknown>): unknown;
21
+ name?: string;
22
+ agents?: unknown[];
23
+ tasks?: unknown[];
24
+ }
25
+ export declare function wrapCrewAI<T extends CrewAICrew>(crew: T, witness: Witness, modelId?: string): T;
26
+ //# sourceMappingURL=crewai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crewai.d.ts","sourceRoot":"","sources":["../../src/adapters/crewai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;CACnB;AAqBD,wBAAgB,UAAU,CAAC,CAAC,SAAS,UAAU,EAC7C,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,CAAC,CAyCH"}