@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.
- package/README.md +16 -13
- package/dist/adapters/a2a.d.ts +26 -0
- package/dist/adapters/a2a.d.ts.map +1 -0
- package/dist/adapters/a2a.js +86 -0
- package/dist/adapters/a2a.js.map +1 -0
- package/dist/adapters/crewai.d.ts +26 -0
- package/dist/adapters/crewai.d.ts.map +1 -0
- package/dist/adapters/crewai.js +78 -0
- package/dist/adapters/crewai.js.map +1 -0
- package/dist/adapters/foundry.d.ts +26 -0
- package/dist/adapters/foundry.d.ts.map +1 -0
- package/dist/adapters/foundry.js +118 -0
- package/dist/adapters/foundry.js.map +1 -0
- package/dist/adapters/google-adk.d.ts +25 -0
- package/dist/adapters/google-adk.d.ts.map +1 -0
- package/dist/adapters/google-adk.js +81 -0
- package/dist/adapters/google-adk.js.map +1 -0
- package/dist/chain.d.ts +33 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +94 -0
- package/dist/chain.js.map +1 -0
- package/dist/clearing.d.ts +7 -2
- package/dist/clearing.d.ts.map +1 -1
- package/dist/clearing.js +16 -5
- package/dist/clearing.js.map +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +123 -6
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +15 -0
- package/dist/config.js.map +1 -1
- package/dist/demo.d.ts.map +1 -1
- package/dist/demo.js +173 -10
- package/dist/demo.js.map +1 -1
- package/dist/doctor.d.ts +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +39 -16
- package/dist/doctor.js.map +1 -1
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/procedures.d.ts +20 -0
- package/dist/procedures.d.ts.map +1 -0
- package/dist/procedures.js +162 -0
- package/dist/procedures.js.map +1 -0
- package/dist/profile.d.ts +50 -0
- package/dist/profile.d.ts.map +1 -0
- package/dist/profile.js +109 -0
- package/dist/profile.js.map +1 -0
- package/dist/trust.d.ts +96 -2
- package/dist/trust.d.ts.map +1 -1
- package/dist/trust.js +200 -9
- package/dist/trust.js.map +1 -1
- package/dist/types.d.ts +120 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +173 -1
- package/dist/types.js.map +1 -1
- package/dist/witness.d.ts +547 -0
- package/dist/witness.d.ts.map +1 -1
- package/dist/witness.js +1557 -202
- package/dist/witness.js.map +1 -1
- package/package.json +2 -2
- 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.
|
|
17
|
-
|
|
18
|
-
- **
|
|
19
|
-
- **
|
|
20
|
-
- **
|
|
21
|
-
- **
|
|
22
|
-
- **
|
|
23
|
-
- **
|
|
24
|
-
- **
|
|
25
|
-
- **
|
|
26
|
-
- **
|
|
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
|
|
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
|
|
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"}
|
package/dist/chain.d.ts
ADDED
|
@@ -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"}
|