@tenova/swt3-ai 0.5.5 → 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 (65) hide show
  1. package/README.md +16 -13
  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
package/README.md CHANGED
@@ -13,17 +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.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.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
27
28
 
28
29
  ## MCP Server -- Official Registry
29
30
 
@@ -704,7 +705,7 @@ Each inference produces anchors for these checks. Every check maps to a regulati
704
705
 
705
706
  ### EU AI Act Article Mapping
706
707
 
707
- 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:
708
709
 
709
710
  | Procedure | EU AI Act Article | Obligation | Demo | Production |
710
711
  |-----------|-------------------|------------|------|------------|
@@ -721,7 +722,7 @@ All 65 SWT3 AI witnessing procedures map to specific EU AI Act obligations:
721
722
  | AI-EXPL.1 | Art. 13(1) | Transparency & Explainability | -| ✓ |
722
723
  | AI-EXPL.2 | Art. 13(3b) | Confidence Calibration | -| ✓ |
723
724
 
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)
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)
725
726
 
726
727
  ## How Verdicts Work
727
728
 
@@ -1057,3 +1058,5 @@ Your prompts and responses **never leave your infrastructure**. The SDK computes
1057
1058
  *SWT3: Sovereign Witness Traceability. We don't run your models. We witness them.*
1058
1059
 
1059
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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- Client-side chain verification.
3
+ *
4
+ * Walk provenance reference chains using locally available data.
5
+ * No HTTP calls -- the caller provides a lookup map built from their payloads.
6
+ */
7
+ import type { AnchorReference, ChainSummary } from "./types.js";
8
+ /**
9
+ * Build a lookup map from an array of payload-like objects.
10
+ * Each object must have an `anchor_fingerprint` and optional `references` array.
11
+ */
12
+ export declare function buildLookup(payloads: Array<{
13
+ anchor_fingerprint: string;
14
+ references?: AnchorReference[];
15
+ }>): Map<string, AnchorReference[]>;
16
+ /**
17
+ * Walk a provenance chain starting from a fingerprint using BFS.
18
+ * Cycle-safe via visited set. Depth-limited via maxDepth.
19
+ *
20
+ * @param startFingerprint - The anchor to start from.
21
+ * @param lookup - Map from fingerprint to its references (from buildLookup).
22
+ * @param maxDepth - Maximum traversal depth (default 10).
23
+ */
24
+ export declare function walkChain(startFingerprint: string, lookup: Map<string, AnchorReference[]>, maxDepth?: number): ChainSummary;
25
+ /**
26
+ * Verify the integrity of a chain walk result.
27
+ * Returns whether the chain is intact and any issues found.
28
+ */
29
+ export declare function verifyChainIntegrity(chain: ChainSummary): {
30
+ intact: boolean;
31
+ issues: string[];
32
+ };
33
+ //# sourceMappingURL=chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../src/chain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAa,YAAY,EAAE,MAAM,YAAY,CAAC;AAE3E;;;GAGG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,KAAK,CAAC;IAAE,kBAAkB,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC,GAC9E,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAUhC;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,EACtC,QAAQ,SAAK,GACZ,YAAY,CAkDd;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAgB/F"}