@tenova/swt3-ai 0.5.4 → 0.5.6

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 (66) hide show
  1. package/README.md +40 -18
  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/crewai.d.ts +26 -0
  7. package/dist/adapters/crewai.d.ts.map +1 -0
  8. package/dist/adapters/crewai.js +78 -0
  9. package/dist/adapters/crewai.js.map +1 -0
  10. package/dist/adapters/foundry.d.ts +26 -0
  11. package/dist/adapters/foundry.d.ts.map +1 -0
  12. package/dist/adapters/foundry.js +118 -0
  13. package/dist/adapters/foundry.js.map +1 -0
  14. package/dist/adapters/google-adk.d.ts +25 -0
  15. package/dist/adapters/google-adk.d.ts.map +1 -0
  16. package/dist/adapters/google-adk.js +81 -0
  17. package/dist/adapters/google-adk.js.map +1 -0
  18. package/dist/chain.d.ts +33 -0
  19. package/dist/chain.d.ts.map +1 -0
  20. package/dist/chain.js +94 -0
  21. package/dist/chain.js.map +1 -0
  22. package/dist/clearing.d.ts +7 -2
  23. package/dist/clearing.d.ts.map +1 -1
  24. package/dist/clearing.js +16 -5
  25. package/dist/clearing.js.map +1 -1
  26. package/dist/cli.d.ts +1 -0
  27. package/dist/cli.d.ts.map +1 -1
  28. package/dist/cli.js +123 -6
  29. package/dist/cli.js.map +1 -1
  30. package/dist/config.d.ts.map +1 -1
  31. package/dist/config.js +15 -0
  32. package/dist/config.js.map +1 -1
  33. package/dist/demo.d.ts.map +1 -1
  34. package/dist/demo.js +173 -10
  35. package/dist/demo.js.map +1 -1
  36. package/dist/doctor.d.ts +1 -1
  37. package/dist/doctor.d.ts.map +1 -1
  38. package/dist/doctor.js +39 -16
  39. package/dist/doctor.js.map +1 -1
  40. package/dist/index.d.ts +9 -2
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +7 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/procedures.d.ts +20 -0
  45. package/dist/procedures.d.ts.map +1 -0
  46. package/dist/procedures.js +162 -0
  47. package/dist/procedures.js.map +1 -0
  48. package/dist/profile.d.ts +50 -0
  49. package/dist/profile.d.ts.map +1 -0
  50. package/dist/profile.js +109 -0
  51. package/dist/profile.js.map +1 -0
  52. package/dist/trust.d.ts +96 -2
  53. package/dist/trust.d.ts.map +1 -1
  54. package/dist/trust.js +200 -9
  55. package/dist/trust.js.map +1 -1
  56. package/dist/types.d.ts +120 -1
  57. package/dist/types.d.ts.map +1 -1
  58. package/dist/types.js +173 -1
  59. package/dist/types.js.map +1 -1
  60. package/dist/witness.d.ts +547 -0
  61. package/dist/witness.d.ts.map +1 -1
  62. package/dist/witness.js +1557 -202
  63. package/dist/witness.js.map +1 -1
  64. package/package.json +2 -2
  65. package/templates/healthcare-clinical.yaml +4 -0
  66. package/templates/microsoft-foundry.yaml +61 -0
package/README.md CHANGED
@@ -13,19 +13,18 @@ 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.4
17
-
18
- - **ML-DSA-65 (FIPS 204) post-quantum signing** -- Optional alongside HMAC-SHA256. Configure via `signingAlgorithm: "ml-dsa-65"` in constructor or `signing_algorithm: "ml-dsa-65"` in .swt3.yaml. Cross-language parity (same seed produces same keys in Python, TypeScript). `npm install @noble/post-quantum`
19
- - **Self-hosted deployment** -- [SWT3 Gateway](#self-hosted-deployment) (Go reverse proxy, zero-latency, Helm chart) and full platform container (UBI 9, Iron Bank compatible, air-gap export). Deploy everything inside your VPC.
20
- - **Chain Enforcer** -- 5-layer policy witnessing: tool blocklist/allowlist, velocity limiting, chain depth, token budgets. Every policy violation minted as an anchor. [Details](#agent-cost-governance)
21
- - **Agent Cost Governance** -- per-session token budgets with `max_tokens_per_session`. Halt and record on exceeded. `cost-conscious` profile ships built-in. [Details](#agent-cost-governance)
22
- - **Sentinel Client** -- IPC integration with the independent evidence custody daemon. Protected WAL, cross-process budgets, key isolation. Evidence the agent cannot tamper with.
23
- - **AI-MARK.1** -- Content provenance witnessing (text, image, audio with C2PA/watermark/metadata tagging)
24
- - **AI-BASE.1** -- Agent behavioral baseline (deviation scoring against established patterns)
25
- - **AI-LIC.1** -- License provenance witnessing (model, adapter, and data license composition with SPDX)
26
- - **14 Built-in Profiles** -- 7 framework profiles + 7 industry verticals (fintech, healthcare, insurance, telecom, defense/govcon, content platform, autonomous systems)
27
- - **NSA MCP Security Mapping** -- [7 of 9 NSA AISC recommendations](https://sovereign.tenova.io/guides/nsa-mcp-security-mapping.html) addressed at the SDK layer (CSI U/OO/6030316-26, May 2026)
28
- - **65 procedures**, 41 namespaces, 207 cross-language test vectors
16
+ ## What's New in v0.5.6
17
+
18
+ - **METAGOV Namespace** -- 8 procedures for recursive governance: governance config attestation, layer registration, policy downgrade detection, circular dependency detection (Kahn's algorithm), governance authorization, emergency override, federation sync, attestation purity verification.
19
+ - **Japan AI Promotion Act** -- 17th regulatory framework. 10 procedure mappings to Japan's AI Promotion Act and AI Utilization Guidelines.
20
+ - **Model Trust Profiles** -- `verifyTrust()` / `presentCredential()` for AI-TRUST.1 and AI-TRUST.2 anchors. Chain verification across multi-agent handoffs.
21
+ - **Anchor References** -- Link related anchors with `anchor_refs` for causal chains and dependency tracking.
22
+ - **Coverage Scoring** -- `getCoverageScore()` computes namespace and framework coverage from minted anchors.
23
+ - **CLI: `swt3 procedures`** -- List and filter UCT procedures by namespace or JSON output. `swt3 quickstart` generates a working example script.
24
+ - **MCP Framework Filter** -- `list_procedures` tool now accepts `--framework` parameter for regulatory-scoped queries.
25
+ - **Lifecycle Stage** -- `LIFECYCLE_STAGE_CODES` for AI-MDL.5 model weight witnessing across all 5 languages.
26
+ - **Bidirectional Crosswalks** -- 420+ mappings across 17 frameworks in machine-readable JSON.
27
+ - **15 profiles**, 88 procedures, 47 namespaces, 12 integrations
29
28
 
30
29
  ## MCP Server -- Official Registry
31
30
 
@@ -93,6 +92,24 @@ trust_mesh:
93
92
 
94
93
  All verification is local. Zero cloud overhead. No data exchanged until both agents clear the trust gate. Unsigned agents are capped at TRUST_BASIC (level 1). Add signing keys for verified trust. Add hardware attestation for sovereign trust.
95
94
 
95
+ ## Offline Verification
96
+
97
+ Verify any witness anchor without network calls. The fingerprint formula is deterministic and identical across all 6 SDK languages -- recompute it anywhere in microseconds.
98
+
99
+ ```typescript
100
+ import { verifyAnchor } from "@tenova/swt3-ai";
101
+
102
+ const result = verifyAnchor(anchor, {
103
+ tenantId: "MY_TENANT",
104
+ procedureId: "AI-INF.1",
105
+ factorA: 1, factorB: 1, factorC: 0,
106
+ timestampMs: 1773316622000,
107
+ });
108
+ // result.status: "CERTIFIED TRUTH" | "TAMPERED"
109
+ ```
110
+
111
+ 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.
112
+
96
113
  ## See It Work (No Account Needed)
97
114
 
98
115
  ```bash
@@ -688,7 +705,7 @@ Each inference produces anchors for these checks. Every check maps to a regulati
688
705
 
689
706
  ### EU AI Act Article Mapping
690
707
 
691
- All 65 SWT3 AI witnessing procedures map to specific EU AI Act obligations:
708
+ All 76 SWT3 AI witnessing procedures map to specific EU AI Act obligations:
692
709
 
693
710
  | Procedure | EU AI Act Article | Obligation | Demo | Production |
694
711
  |-----------|-------------------|------------|------|------------|
@@ -705,7 +722,7 @@ All 65 SWT3 AI witnessing procedures map to specific EU AI Act obligations:
705
722
  | AI-EXPL.1 | Art. 13(1) | Transparency & Explainability | -| ✓ |
706
723
  | AI-EXPL.2 | Art. 13(3b) | Confidence Calibration | -| ✓ |
707
724
 
708
- 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)
725
+ 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, Rust, C#, and Ruby. [See live conformity →](https://sovereign.tenova.io/audit/axm_audit_demo_eu_ai_act_public)
709
726
 
710
727
  ## How Verdicts Work
711
728
 
@@ -1029,12 +1046,17 @@ Your prompts and responses **never leave your infrastructure**. The SDK computes
1029
1046
  - [Design Rationale](https://sovereign.tenova.io/guides/swt3-design-rationale.html) -- why every protocol decision was made
1030
1047
  - [UCT Registry](https://sovereign.tenova.io/registry) -- full procedure catalog with factor definitions
1031
1048
  - [Anchor Verifier](https://sovereign.tenova.io/verify) -- verify any anchor, zero server calls
1032
- - [Five Eyes Agentic AI Overlay](https://sovereign.tenova.io/guides/five-eyes-overlay.html) -- CISA/NSA guidance mapped to SWT3 procedures
1033
- - [CMMC Compliance Overlay](https://sovereign.tenova.io/guides/cmmc-overlay.html) -- clearing levels mapped to CMMC and NIST 800-171
1034
- - [SR 11-7 Model Risk Overlay](https://sovereign.tenova.io/guides/sr-11-7-overlay.html) -- clearing levels mapped to SR 11-7 requirements
1049
+ - [Before & After](https://sovereign.tenova.io/guides/developer-before-after.html) -- manual audit evidence vs. cryptographic witness anchors
1050
+ - [Integration Patterns](https://sovereign.tenova.io/guides/developer-integration-patterns.html) -- 8 instrumentation patterns mapped to regulatory requirements
1051
+ - [What Your Auditor Sees](https://sovereign.tenova.io/guides/developer-auditor-bridge.html) -- both sides of a witness anchor, developer to auditor
1052
+ - [CI/CD Integration](https://sovereign.tenova.io/guides/developer-cicd-guide.html) -- validate compliance configuration in your pipeline
1053
+ - [Assessment Mapping](https://sovereign.tenova.io/registry/assessment.html) -- which procedures satisfy which regulatory requirements
1054
+ - [All 65 Guides](https://sovereign.tenova.io/guides/) -- regulatory crosswalks, assessor walkthroughs, integration guides
1035
1055
 
1036
1056
  ---
1037
1057
 
1038
1058
  *SWT3: Sovereign Witness Traceability. We don't run your models. We witness them.*
1039
1059
 
1040
1060
  SWT3 and Sovereign Witness Traceability are trademarks of Tenable Nova LLC. Patent pending. Apache 2.0 licensed.
1061
+
1062
+ 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,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"}
@@ -0,0 +1,78 @@
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 { sha256Truncated } from "../fingerprint.js";
19
+ function resolveModelId(crew, 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 (crew.name)
26
+ return `crewai-${crew.name}`;
27
+ return "crewai-crew";
28
+ }
29
+ function stringifyResult(result) {
30
+ if (result === null || result === undefined)
31
+ return "";
32
+ if (typeof result === "string")
33
+ return result;
34
+ try {
35
+ return JSON.stringify(result);
36
+ }
37
+ catch {
38
+ return String(result);
39
+ }
40
+ }
41
+ export function wrapCrewAI(crew, witness, modelId) {
42
+ const mid = resolveModelId(crew, modelId);
43
+ const originalKickoff = crew.kickoff.bind(crew);
44
+ const agentCount = Array.isArray(crew.agents) ? crew.agents.length : 0;
45
+ const taskCount = Array.isArray(crew.tasks) ? crew.tasks.length : 0;
46
+ const wrapped = Object.create(crew);
47
+ wrapped.kickoff = (inputs) => {
48
+ const start = performance.now();
49
+ const inputStr = inputs ? JSON.stringify(inputs) : "kickoff";
50
+ const result = originalKickoff(inputs);
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(inputStr),
57
+ responseHash: sha256Truncated(stringifyResult(res)),
58
+ latencyMs: elapsed,
59
+ inputTokens: agentCount,
60
+ outputTokens: taskCount,
61
+ guardrailsActive: 0,
62
+ guardrailsRequired: 0,
63
+ guardrailPassed: true,
64
+ hasRefusal: false,
65
+ provider: "crewai",
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
+ return wrapped;
77
+ }
78
+ //# sourceMappingURL=crewai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crewai.js","sourceRoot":"","sources":["../../src/adapters/crewai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- Microsoft Foundry Adapter.
3
+ *
4
+ * Wraps any object with an execute() method (Microsoft Agent Framework pattern),
5
+ * minting witness anchors on each agent execution without modifying
6
+ * the agent logic or adding framework dependencies.
7
+ *
8
+ * Usage:
9
+ * import { wrapFoundry } from "@tenova/swt3-ai/adapters/foundry";
10
+ * const witnessed = wrapFoundry(agent, witness);
11
+ * const result = await witnessed.execute("Summarize this document");
12
+ *
13
+ * Duck-typed: works with any object that has an execute() method.
14
+ * No Microsoft SDK 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 FoundryAgent {
20
+ execute(prompt: unknown, ...args: unknown[]): unknown;
21
+ interceptToolCall?(toolName: string, toolInput: unknown, ...args: unknown[]): unknown;
22
+ name?: string;
23
+ model?: string;
24
+ }
25
+ export declare function wrapFoundry<T extends FoundryAgent>(agent: T, witness: Witness, modelId?: string): T;
26
+ //# sourceMappingURL=foundry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foundry.d.ts","sourceRoot":"","sources":["../../src/adapters/foundry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACtD,iBAAiB,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACtF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiGD,wBAAgB,WAAW,CAAC,CAAC,SAAS,YAAY,EAChD,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,CAAC,CAUH"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- Microsoft Foundry Adapter.
3
+ *
4
+ * Wraps any object with an execute() method (Microsoft Agent Framework pattern),
5
+ * minting witness anchors on each agent execution without modifying
6
+ * the agent logic or adding framework dependencies.
7
+ *
8
+ * Usage:
9
+ * import { wrapFoundry } from "@tenova/swt3-ai/adapters/foundry";
10
+ * const witnessed = wrapFoundry(agent, witness);
11
+ * const result = await witnessed.execute("Summarize this document");
12
+ *
13
+ * Duck-typed: works with any object that has an execute() method.
14
+ * No Microsoft SDK 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 `foundry-${agent.name}`;
29
+ return "foundry-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
+ if (methodName === "execute") {
49
+ target[methodName] = (prompt, ...args) => {
50
+ const start = performance.now();
51
+ const result = bound(prompt, ...args);
52
+ const finish = (res) => {
53
+ const elapsed = Math.round(performance.now() - start);
54
+ const record = {
55
+ modelId: mid,
56
+ modelHash: sha256Truncated(mid),
57
+ promptHash: sha256Truncated(stringifyMessage(prompt)),
58
+ responseHash: sha256Truncated(stringifyMessage(res)),
59
+ latencyMs: elapsed,
60
+ inputTokens: 0,
61
+ outputTokens: 0,
62
+ guardrailsActive: 0,
63
+ guardrailsRequired: 0,
64
+ guardrailPassed: true,
65
+ hasRefusal: false,
66
+ provider: "microsoft-foundry",
67
+ guardrailNames: [],
68
+ };
69
+ witness.record(record);
70
+ return res;
71
+ };
72
+ if (result && typeof result.then === "function") {
73
+ return result.then(finish);
74
+ }
75
+ return finish(result);
76
+ };
77
+ }
78
+ else {
79
+ target[methodName] = (toolName, toolInput, ...args) => {
80
+ const start = performance.now();
81
+ const result = bound(toolName, toolInput, ...args);
82
+ const finish = (res) => {
83
+ const elapsed = Math.round(performance.now() - start);
84
+ const record = {
85
+ modelId: mid,
86
+ modelHash: sha256Truncated(mid),
87
+ promptHash: sha256Truncated(`${toolName}:${stringifyMessage(toolInput)}`),
88
+ responseHash: sha256Truncated(stringifyMessage(res)),
89
+ latencyMs: elapsed,
90
+ inputTokens: 0,
91
+ outputTokens: 0,
92
+ guardrailsActive: 0,
93
+ guardrailsRequired: 0,
94
+ guardrailPassed: true,
95
+ hasRefusal: false,
96
+ provider: "microsoft-foundry",
97
+ guardrailNames: [],
98
+ };
99
+ witness.record(record);
100
+ return res;
101
+ };
102
+ if (result && typeof result.then === "function") {
103
+ return result.then(finish);
104
+ }
105
+ return finish(result);
106
+ };
107
+ }
108
+ }
109
+ export function wrapFoundry(agent, witness, modelId) {
110
+ const mid = resolveModelId(agent, modelId);
111
+ const wrapped = Object.create(agent);
112
+ wrapMethod(wrapped, "execute", witness, mid);
113
+ if (agent.interceptToolCall) {
114
+ wrapMethod(wrapped, "interceptToolCall", witness, mid);
115
+ }
116
+ return wrapped;
117
+ }
118
+ //# sourceMappingURL=foundry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foundry.js","sourceRoot":"","sources":["../../src/adapters/foundry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- Google ADK (Agent Development Kit) Adapter.
3
+ *
4
+ * Wraps any object with a run() method (Google ADK Agent pattern),
5
+ * minting witness anchors on each agent execution without modifying
6
+ * the agent logic or adding framework dependencies.
7
+ *
8
+ * Usage:
9
+ * import { wrapGoogleADK } from "@tenova/swt3-ai/adapters/google-adk";
10
+ * const witnessed = wrapGoogleADK(agent, witness);
11
+ * const result = await witnessed.run("What is the weather?");
12
+ *
13
+ * Duck-typed: works with any object that has a run() method.
14
+ * No google-adk 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 GoogleADKAgent {
20
+ run(prompt: string, ...args: unknown[]): unknown;
21
+ model?: string;
22
+ name?: string;
23
+ }
24
+ export declare function wrapGoogleADK<T extends GoogleADKAgent>(agent: T, witness: Witness, modelId?: string): T;
25
+ //# sourceMappingURL=google-adk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-adk.d.ts","sourceRoot":"","sources":["../../src/adapters/google-adk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAuBD,wBAAgB,aAAa,CAAC,CAAC,SAAS,cAAc,EACpD,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,CAAC,CAuCH"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- Google ADK (Agent Development Kit) Adapter.
3
+ *
4
+ * Wraps any object with a run() method (Google ADK Agent pattern),
5
+ * minting witness anchors on each agent execution without modifying
6
+ * the agent logic or adding framework dependencies.
7
+ *
8
+ * Usage:
9
+ * import { wrapGoogleADK } from "@tenova/swt3-ai/adapters/google-adk";
10
+ * const witnessed = wrapGoogleADK(agent, witness);
11
+ * const result = await witnessed.run("What is the weather?");
12
+ *
13
+ * Duck-typed: works with any object that has a run() method.
14
+ * No google-adk 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") {
23
+ if (process.env.SWT3_MODEL_ID)
24
+ return process.env.SWT3_MODEL_ID;
25
+ if (process.env.GOOGLE_ADK_MODEL)
26
+ return process.env.GOOGLE_ADK_MODEL;
27
+ }
28
+ if (agent.model)
29
+ return agent.model;
30
+ if (agent.name)
31
+ return `google-adk-${agent.name}`;
32
+ return "google-adk-agent";
33
+ }
34
+ function stringifyResult(result) {
35
+ if (result === null || result === undefined)
36
+ return "";
37
+ if (typeof result === "string")
38
+ return result;
39
+ try {
40
+ return JSON.stringify(result);
41
+ }
42
+ catch {
43
+ return String(result);
44
+ }
45
+ }
46
+ export function wrapGoogleADK(agent, witness, modelId) {
47
+ const mid = resolveModelId(agent, modelId);
48
+ const originalRun = agent.run.bind(agent);
49
+ const wrapped = Object.create(agent);
50
+ wrapped.run = (prompt, ...args) => {
51
+ const start = performance.now();
52
+ const result = originalRun(prompt, ...args);
53
+ const finish = (res) => {
54
+ const elapsed = Math.round(performance.now() - start);
55
+ const record = {
56
+ modelId: mid,
57
+ modelHash: sha256Truncated(mid),
58
+ promptHash: sha256Truncated(prompt),
59
+ responseHash: sha256Truncated(stringifyResult(res)),
60
+ latencyMs: elapsed,
61
+ inputTokens: 0,
62
+ outputTokens: 0,
63
+ guardrailsActive: 0,
64
+ guardrailsRequired: 0,
65
+ guardrailPassed: true,
66
+ hasRefusal: false,
67
+ provider: "google-adk",
68
+ guardrailNames: [],
69
+ };
70
+ witness.record(record);
71
+ return res;
72
+ };
73
+ // Handle both sync and async run() methods
74
+ if (result && typeof result.then === "function") {
75
+ return result.then(finish);
76
+ }
77
+ return finish(result);
78
+ };
79
+ return wrapped;
80
+ }
81
+ //# sourceMappingURL=google-adk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-adk.js","sourceRoot":"","sources":["../../src/adapters/google-adk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAQpD,SAAS,cAAc,CAAC,KAAqB,EAAE,QAAiB;IAC9D,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QAChE,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACxE,CAAC;IACD,IAAI,KAAK,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC;IACpC,IAAI,KAAK,CAAC,IAAI;QAAE,OAAO,cAAc,KAAK,CAAC,IAAI,EAAE,CAAC;IAClD,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,SAAS,eAAe,CAAC,MAAe;IACtC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACvD,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,KAAQ,EACR,OAAgB,EAChB,OAAgB;IAEhB,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE1C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAM,CAAC;IAE1C,OAAO,CAAC,GAAG,GAAG,CAAC,MAAc,EAAE,GAAG,IAAe,EAAW,EAAE;QAC5D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;QAE5C,MAAM,MAAM,GAAG,CAAC,GAAY,EAAW,EAAE;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;YACtD,MAAM,MAAM,GAAoB;gBAC9B,OAAO,EAAE,GAAG;gBACZ,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC;gBAC/B,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC;gBACnC,YAAY,EAAE,eAAe,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;gBACnD,SAAS,EAAE,OAAO;gBAClB,WAAW,EAAE,CAAC;gBACd,YAAY,EAAE,CAAC;gBACf,gBAAgB,EAAE,CAAC;gBACnB,kBAAkB,EAAE,CAAC;gBACrB,eAAe,EAAE,IAAI;gBACrB,UAAU,EAAE,KAAK;gBACjB,QAAQ,EAAE,YAAY;gBACtB,cAAc,EAAE,EAAE;aACnB,CAAC;YACF,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvB,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;QAEF,2CAA2C;QAC3C,IAAI,MAAM,IAAI,OAAQ,MAAc,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACzD,OAAQ,MAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC"}