@tenova/swt3-mcp 0.1.0 → 0.5.2

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 (71) hide show
  1. package/README.md +162 -33
  2. package/dist/bin/swt3-mcp.js +3 -2
  3. package/dist/bin/swt3-mcp.js.map +1 -1
  4. package/dist/chain-verifier.d.ts +46 -0
  5. package/dist/chain-verifier.d.ts.map +1 -0
  6. package/dist/chain-verifier.js +210 -0
  7. package/dist/chain-verifier.js.map +1 -0
  8. package/dist/client.d.ts +4 -0
  9. package/dist/client.d.ts.map +1 -1
  10. package/dist/client.js.map +1 -1
  11. package/dist/config.d.ts +56 -6
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +151 -14
  14. package/dist/config.js.map +1 -1
  15. package/dist/density-policy.d.ts +55 -0
  16. package/dist/density-policy.d.ts.map +1 -0
  17. package/dist/density-policy.js +128 -0
  18. package/dist/density-policy.js.map +1 -0
  19. package/dist/redis-reader.d.ts +57 -0
  20. package/dist/redis-reader.d.ts.map +1 -0
  21. package/dist/redis-reader.js +254 -0
  22. package/dist/redis-reader.js.map +1 -0
  23. package/dist/server.d.ts +2 -2
  24. package/dist/server.d.ts.map +1 -1
  25. package/dist/server.js +555 -1
  26. package/dist/server.js.map +1 -1
  27. package/dist/state.d.ts +29 -0
  28. package/dist/state.d.ts.map +1 -0
  29. package/dist/state.js +20 -0
  30. package/dist/state.js.map +1 -0
  31. package/dist/tools/audit.d.ts +20 -0
  32. package/dist/tools/audit.d.ts.map +1 -0
  33. package/dist/tools/audit.js +102 -0
  34. package/dist/tools/audit.js.map +1 -0
  35. package/dist/tools/authorize.d.ts +19 -0
  36. package/dist/tools/authorize.d.ts.map +1 -0
  37. package/dist/tools/authorize.js +96 -0
  38. package/dist/tools/authorize.js.map +1 -0
  39. package/dist/tools/chain.d.ts +24 -0
  40. package/dist/tools/chain.d.ts.map +1 -0
  41. package/dist/tools/chain.js +114 -0
  42. package/dist/tools/chain.js.map +1 -0
  43. package/dist/tools/model.d.ts +33 -0
  44. package/dist/tools/model.d.ts.map +1 -0
  45. package/dist/tools/model.js +162 -0
  46. package/dist/tools/model.js.map +1 -0
  47. package/dist/tools/signup.d.ts +2 -2
  48. package/dist/tools/signup.d.ts.map +1 -1
  49. package/dist/tools/signup.js +10 -3
  50. package/dist/tools/signup.js.map +1 -1
  51. package/dist/tools/skill.d.ts +33 -0
  52. package/dist/tools/skill.d.ts.map +1 -0
  53. package/dist/tools/skill.js +168 -0
  54. package/dist/tools/skill.js.map +1 -0
  55. package/dist/tools/suggest.d.ts +15 -0
  56. package/dist/tools/suggest.d.ts.map +1 -0
  57. package/dist/tools/suggest.js +174 -0
  58. package/dist/tools/suggest.js.map +1 -0
  59. package/dist/tools/trust.d.ts +33 -0
  60. package/dist/tools/trust.d.ts.map +1 -0
  61. package/dist/tools/trust.js +213 -0
  62. package/dist/tools/trust.js.map +1 -0
  63. package/dist/tools/violation.d.ts +20 -0
  64. package/dist/tools/violation.d.ts.map +1 -0
  65. package/dist/tools/violation.js +97 -0
  66. package/dist/tools/violation.js.map +1 -0
  67. package/dist/tools/witness.d.ts +6 -1
  68. package/dist/tools/witness.d.ts.map +1 -1
  69. package/dist/tools/witness.js +19 -5
  70. package/dist/tools/witness.js.map +1 -1
  71. package/package.json +33 -3
package/README.md CHANGED
@@ -1,7 +1,117 @@
1
1
  # @tenova/swt3-mcp
2
2
 
3
+ > Listed on the [MCP Registry](https://github.com/modelcontextprotocol/servers) as `io.tenova/swt3-witness`
4
+
3
5
  MCP server for the SWT3 AI Witness protocol. Adds cryptographic compliance attestation to any MCP-compatible AI agent.
4
6
 
7
+ SWT3 (Sovereign Witness Traceability) works by hashing your AI's inputs and outputs locally, extracting numeric factors (latency, token count, guardrail status), and anchoring them into a cryptographic fingerprint that anyone can independently verify. Your prompts and responses never leave your machine. The auditor gets tamper-proof evidence. You keep your data.
8
+
9
+ ## Why This Exists
10
+
11
+ In 2026, attackers exploited MCP configuration injection in Flowise to achieve arbitrary code execution across thousands of AI workflow instances. A compromised third-party AI tool (Context.ai) pivoted into Vercel's internal systems. Microsoft disclosed RCE vulnerabilities in Semantic Kernel where a single prompt could execute commands on the host. 65% of firms reported AI agent security incidents. Only 14.4% of agents go live with full security approval.
12
+
13
+ Every tool call your agent makes is an attack surface. This server witnesses those calls, enforces tool-level policy gates, and produces a cryptographic evidence chain that proves what happened. If an agent is compromised, the audit trail is immutable. If a tool call violates policy, the gate blocks it before execution.
14
+
15
+ ## Trust Mesh -- Secure Agent-to-Agent Communication
16
+
17
+ Witnessing your own agent is step one. The next question is: can you trust the agent on the other side? Before two agents exchange data, invoke each other's tools, or share context, each side verifies the other's compliance posture. No anchor, no handshake.
18
+
19
+ **You run Agent A. Your partner runs Agent B. Here's what happens:**
20
+
21
+ ```
22
+ Your Agent (A) Partner's Agent (B)
23
+ | |
24
+ |--- presentCredential() --------->|
25
+ | |-- verifyTrust(credential)
26
+ | |-- signed? yes
27
+ | |-- procedures witnessed? 12 of 12
28
+ | |-- trust level? 2 (verified)
29
+ |<---------- GRANTED --------------|
30
+ | |
31
+ | (data exchange begins) |
32
+ | |
33
+ |<-- presentCredential() ----------|
34
+ |-- verifyTrust(credential) |
35
+ |-- signed? yes |
36
+ |-- trusted tenant? yes |
37
+ |------------ GRANTED ------------>|
38
+ | |
39
+ | (bidirectional trust) |
40
+ ```
41
+
42
+ **What each side needs:**
43
+
44
+ 1. Both agents install the SDK (`pip install swt3-ai` or `npm install @tenova/swt3-ai`)
45
+ 2. Both configure `.swt3.yaml` with signing keys and trust boundaries
46
+ 3. Both add each other's tenant to `trusted_tenants`
47
+ 4. Exchange signing keys out-of-band (env vars, secrets manager, KMS)
48
+ 5. Call `presentCredential()` / `verifyTrust()` before any data exchange
49
+
50
+ That's it. When you adopt the SWT3 witness layer, your partners and vendors must adopt it too in order to interact with your agents. Compliance becomes the connection protocol. Every agent in the mesh strengthens the network.
51
+
52
+ ```yaml
53
+ # Your .swt3.yaml
54
+ trust_mesh:
55
+ mode: strict
56
+ min_trust_level: 2
57
+ require_signature: true
58
+ trusted_tenants: ["PARTNER_B_TENANT"]
59
+
60
+ # Partner's .swt3.yaml
61
+ trust_mesh:
62
+ mode: strict
63
+ min_trust_level: 2
64
+ require_signature: true
65
+ trusted_tenants: ["YOUR_TENANT"]
66
+ ```
67
+
68
+ **Trust levels:**
69
+
70
+ | Level | Name | What It Means |
71
+ |-------|------|---------------|
72
+ | 1 | Basic | Valid credential, no signature verified |
73
+ | 2 | Verified | Credential + HMAC signature confirmed |
74
+ | 3 | Attested | Verified + hardware attestation + guardrails |
75
+ | 4 | Sovereign | Attested + clearing level 2+ |
76
+
77
+ Unsigned agents are capped at level 1. You decide the minimum level your agents accept. All verification is local. Zero cloud overhead. No data leaves until both sides clear the gate.
78
+
79
+ ## Policy-as-Code (swt3.yaml)
80
+
81
+ Define your entire witnessing policy in a YAML file. No constructor parameters, no environment variable sprawl:
82
+
83
+ ```bash
84
+ # Generate a config from a built-in profile
85
+ npx @tenova/swt3-mcp # reads .swt3.yaml automatically
86
+ ```
87
+
88
+ ```yaml
89
+ # .swt3.yaml
90
+ endpoint: https://sovereign.tenova.io
91
+ tenant_id: YOUR_TENANT
92
+ api_key_env: SWT3_API_KEY
93
+ clearing_level: 2
94
+ signing_key_env: SWT3_SIGNING_KEY
95
+ agent_id: my-agent
96
+
97
+ trust_mesh:
98
+ mode: strict
99
+ min_trust_level: 2
100
+ require_signature: true
101
+
102
+ mcp_policy:
103
+ require_witness: true
104
+ blocked_tools: ["shell_exec", "rm_rf"]
105
+ ```
106
+
107
+ Layer configs with `extends:` for environment-specific overrides. Three built-in profiles ship with the SDK: `eu-ai-act-high-risk`, `nist-ai-rmf`, and `minimal`.
108
+
109
+ Validate your config:
110
+
111
+ ```bash
112
+ npx swt3 doctor # 8 checks: YAML, env vars, profile, trust mesh
113
+ ```
114
+
5
115
  ## Zero-config start
6
116
 
7
117
  ```bash
@@ -10,6 +120,19 @@ npx @tenova/swt3-mcp
10
120
 
11
121
  That's it. No account, no API key, no configuration. The server starts in demo mode and mints local witness anchors immediately.
12
122
 
123
+ Ask your agent to witness an inference and you'll see:
124
+
125
+ ```
126
+ Verdict: PASS
127
+ Anchor: SWT3-DEMO-LOCAL-AI-AIINF1-PASS-1779146826-ed28dc4c2698
128
+ Procedure: AI-INF.1
129
+ Model: gpt-4o
130
+ Clearing Level: 1
131
+ Fingerprint: ed28dc4c2698
132
+ ```
133
+
134
+ That fingerprint is a SHA-256 hash of the tenant, procedure, factors, and timestamp. Anyone can recompute it independently. If it matches, the anchor is real. If a single bit changed, the hash breaks.
135
+
13
136
  When you're ready to persist anchors to the SWT3 ledger, use the `signup` tool from within your agent conversation -- no need to leave your editor.
14
137
 
15
138
  ## Setup
@@ -68,49 +191,55 @@ claude mcp add swt3 -- npx @tenova/swt3-mcp
68
191
  | **API key only** | `SWT3_API_KEY` | Tenant auto-resolved, anchors persisted |
69
192
  | **Full config** | `SWT3_API_KEY` + `SWT3_TENANT_ID` | Explicit tenant, anchors persisted |
70
193
 
71
- ## Tools
72
-
73
- ### witness_inference
194
+ ## Regulatory Coverage
74
195
 
75
- Mint a cryptographic witness anchor for an AI inference.
196
+ Every anchor maps to specific regulatory obligations:
76
197
 
77
- ```
78
- model_id: "gpt-4o" # required -- everything else is optional
79
- prompt: "What is 2+2?" # hashed locally, never sent to server
80
- response: "4" # hashed locally, never sent to server
81
- ```
198
+ - **EU AI Act**: Articles 9, 10, 12, 13, 14, 53, 72
199
+ - **NIST AI RMF**: GOVERN, MAP, MEASURE, MANAGE functions
200
+ - **OWASP Agentic Top 10**: Tool abuse, prompt injection, chain exploitation
201
+ - **CMMC**: Level 2 evidence automation for defense contractors
202
+ - **NIST 800-53**: SI-7 (integrity), AU-2/AU-3 (audit), AC controls
203
+ - **SR 11-7**: Model risk management for financial services
204
+ - **ISO 42001**: Annex A AI management controls
82
205
 
83
- Returns verdict (PASS/FAIL), anchor token, and verification URL.
206
+ ## Tools (18)
84
207
 
85
- ### verify_anchor
208
+ **Witnessing:**
209
+ `witness_inference` -- mint a cryptographic anchor for any AI inference. Prompt and response are hashed locally, never sent to the server. Returns verdict (PASS/FAIL), anchor token, and verification URL.
86
210
 
87
- Verify the cryptographic integrity of an existing anchor.
211
+ **Verification:**
212
+ `verify_anchor` -- verify the cryptographic integrity of an existing anchor.
88
213
 
89
- ```
90
- token: "SWT3-E-VULTR-AI-AIINF1-PASS-1700000000-96b7d56c0245"
91
- ```
214
+ **Trust Mesh:**
215
+ `verify_agent_trust` -- verify another agent's compliance credential.
216
+ `present_trust_credential` -- present your agent's credential for verification.
92
217
 
93
- ### list_procedures
218
+ **Audit Sessions:**
219
+ `start_audit_session` -- begin a scoped audit session with a session ID.
220
+ `end_audit_session` -- close the session and get a summary with Merkle root.
94
221
 
95
- Browse the UCT procedure registry. 151+ compliance controls.
222
+ **Agent Chains:**
223
+ `start_chain` -- initialize a multi-agent chain with a cycle ID.
224
+ `chain_handoff` -- record a handoff between agents in the chain.
225
+ `report_violation` -- report a policy violation with severity and category.
96
226
 
97
- ```
98
- namespace: "AI" # optional filter
99
- ```
227
+ **Model Governance:**
228
+ `witness_model_integrity` -- witness model weight hashes for tamper detection.
229
+ `witness_adapter_stack` -- witness LoRA/adapter configurations.
100
230
 
101
- ### check_posture
231
+ **Skill Attestation:**
232
+ `attest_skill_manifest` -- witness which skills and plugins are loaded.
233
+ `attest_memory_context` -- witness which memory sources the agent accesses.
102
234
 
103
- Check current tenant compliance posture. No arguments.
104
-
105
- ### signup
106
-
107
- Get a signup link to create a free account. No credentials pass through the AI.
108
-
109
- ```
110
- framework: "EU-AI-ACT" # optional (default: NIST-800-53)
111
- ```
235
+ **Authorization:**
236
+ `witness_authorization` -- witness pre-inference authorization decisions.
112
237
 
113
- Returns a browser URL. Complete signup there, copy your API key, add it to your MCP config.
238
+ **Discovery:**
239
+ `list_procedures` -- browse the UCT procedure registry (151+ controls).
240
+ `suggest_procedures` -- get recommended procedures based on your use case.
241
+ `check_posture` -- check current tenant compliance posture.
242
+ `signup` -- create a free account without leaving your editor.
114
243
 
115
244
  ## Environment variables (optional)
116
245
 
@@ -121,7 +250,7 @@ Returns a browser URL. Complete signup there, copy your API key, add it to your
121
250
  | `SWT3_ENDPOINT` | `https://sovereign.tenova.io` | Witness endpoint |
122
251
  | `SWT3_CLEARING_LEVEL` | `1` | Data clearing (0=analytics, 1=standard, 2=sensitive, 3=classified) |
123
252
  | `SWT3_AGENT_ID` | | Agent identity for AI-ID.1 |
124
- | `SWT3_SIGNING_KEY` | | HMAC-SHA256 signing key |
253
+ | `SWT3_SIGNING_KEY` | | HMAC-SHA256 signing key (register server-side for validation) |
125
254
 
126
255
  ## Clearing levels
127
256
 
@@ -143,4 +272,4 @@ Raw prompt and response text never leaves your machine at any clearing level.
143
272
 
144
273
  Apache 2.0. Patent pending.
145
274
 
146
- Built by [TeNova](https://tenova.io).
275
+ Built by [TeNova](https://tenova.io). Questions: engineering@tenovaai.com
@@ -15,8 +15,9 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
15
15
  import { loadConfig } from "../config.js";
16
16
  import { createServer } from "../server.js";
17
17
  try {
18
- const config = loadConfig();
19
- const server = createServer(config);
18
+ const bundle = loadConfig();
19
+ const config = bundle.config;
20
+ const server = createServer(config, bundle);
20
21
  const transport = new StdioServerTransport();
21
22
  if (config.demo) {
22
23
  process.stderr.write("swt3-mcp: running in demo mode (local-only anchors)\n" +
@@ -1 +1 @@
1
- {"version":3,"file":"swt3-mcp.js","sourceRoot":"","sources":["../../src/bin/swt3-mcp.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,IAAI,CAAC;IACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uDAAuD;YACvD,0DAA0D,CAC3D,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAc,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"swt3-mcp.js","sourceRoot":"","sources":["../../src/bin/swt3-mcp.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,IAAI,CAAC;IACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uDAAuD;YACvD,0DAA0D,CAC3D,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAc,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * SWT3 MCP Server: Anchor-Chain Verifier.
3
+ *
4
+ * Validates an agent's anchor chain before tool execution. Queries
5
+ * Redis reader (fast path) first, falls back to Supabase ledger (cold path).
6
+ * Integrates with the density policy engine for enforcement.
7
+ *
8
+ * Flow:
9
+ * 1. Query Redis in-memory index by agent_id / cycle_id
10
+ * 2. If insufficient, query ledger via AxiomClient
11
+ * 3. Check each anchor: not revoked, verdict=PASS, within gap limit
12
+ * 4. Evaluate density policy
13
+ * 5. Return structured result
14
+ *
15
+ * Patent pending.
16
+ */
17
+ import type { McpConfig } from "./config.js";
18
+ import type { AxiomClient } from "./client.js";
19
+ import { type DensityPolicy, type PolicyViolation } from "./density-policy.js";
20
+ export interface ChainVerifyResult {
21
+ valid: boolean;
22
+ anchorCount: number;
23
+ gaps: ChainGap[];
24
+ revoked: string[];
25
+ policyViolations: PolicyViolation[];
26
+ source: "redis" | "ledger" | "none";
27
+ reason?: string;
28
+ }
29
+ export interface ChainGap {
30
+ fromEpoch: number;
31
+ toEpoch: number;
32
+ gapSeconds: number;
33
+ }
34
+ /**
35
+ * Verify an agent's anchor chain. Called by the gatekeeper before tool execution.
36
+ *
37
+ * @param agentId - The presenting agent's ID
38
+ * @param cycleId - The active chain's cycle_id (optional)
39
+ * @param config - MCP config (for maxChainGapSeconds)
40
+ * @param client - AxiomClient for ledger fallback
41
+ * @param policy - Active density policy
42
+ * @param agentTokenCount - Total tokens reported by agent (optional)
43
+ * @param agentTrustLevel - Trust level from prior verify_agent_trust (optional)
44
+ */
45
+ export declare function verifyAnchorChain(agentId: string | undefined, cycleId: string | undefined, config: McpConfig, client: AxiomClient, policy: DensityPolicy, agentTokenCount?: number, agentTrustLevel?: number): Promise<ChainVerifyResult>;
46
+ //# sourceMappingURL=chain-verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain-verifier.d.ts","sourceRoot":"","sources":["../src/chain-verifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAC;AAI7B,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAkBD;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,aAAa,EACrB,eAAe,CAAC,EAAE,MAAM,EACxB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,iBAAiB,CAAC,CAyC5B"}
@@ -0,0 +1,210 @@
1
+ /**
2
+ * SWT3 MCP Server: Anchor-Chain Verifier.
3
+ *
4
+ * Validates an agent's anchor chain before tool execution. Queries
5
+ * Redis reader (fast path) first, falls back to Supabase ledger (cold path).
6
+ * Integrates with the density policy engine for enforcement.
7
+ *
8
+ * Flow:
9
+ * 1. Query Redis in-memory index by agent_id / cycle_id
10
+ * 2. If insufficient, query ledger via AxiomClient
11
+ * 3. Check each anchor: not revoked, verdict=PASS, within gap limit
12
+ * 4. Evaluate density policy
13
+ * 5. Return structured result
14
+ *
15
+ * Patent pending.
16
+ */
17
+ import { queryAnchors } from "./redis-reader.js";
18
+ import { signPayload } from "./fingerprint.js";
19
+ import { evaluatePolicy, } from "./density-policy.js";
20
+ // ── Main Verification Function ────────────────────────────────────────
21
+ /**
22
+ * Verify an agent's anchor chain. Called by the gatekeeper before tool execution.
23
+ *
24
+ * @param agentId - The presenting agent's ID
25
+ * @param cycleId - The active chain's cycle_id (optional)
26
+ * @param config - MCP config (for maxChainGapSeconds)
27
+ * @param client - AxiomClient for ledger fallback
28
+ * @param policy - Active density policy
29
+ * @param agentTokenCount - Total tokens reported by agent (optional)
30
+ * @param agentTrustLevel - Trust level from prior verify_agent_trust (optional)
31
+ */
32
+ export async function verifyAnchorChain(agentId, cycleId, config, client, policy, agentTokenCount, agentTrustLevel) {
33
+ // No identity to verify against
34
+ if (!agentId && !cycleId) {
35
+ return {
36
+ valid: false,
37
+ anchorCount: 0,
38
+ gaps: [],
39
+ revoked: [],
40
+ policyViolations: [],
41
+ source: "none",
42
+ reason: "no_agent_id_or_cycle_id",
43
+ };
44
+ }
45
+ // Step 1: Try Redis in-memory index (fast path)
46
+ const redisAnchors = queryAnchors(agentId, cycleId);
47
+ if (redisAnchors.length > 0) {
48
+ return evaluateChain(redisAnchors, "redis", config, policy, agentTokenCount, agentTrustLevel);
49
+ }
50
+ // Step 2: Fallback to ledger query
51
+ try {
52
+ const ledgerAnchors = await queryLedger(agentId, cycleId, config, client);
53
+ if (ledgerAnchors.length > 0) {
54
+ return evaluateChain(ledgerAnchors, "ledger", config, policy, agentTokenCount, agentTrustLevel);
55
+ }
56
+ }
57
+ catch {
58
+ // Ledger unavailable -- fail closed
59
+ }
60
+ // No anchors found anywhere
61
+ return {
62
+ valid: false,
63
+ anchorCount: 0,
64
+ gaps: [],
65
+ revoked: [],
66
+ policyViolations: [],
67
+ source: "none",
68
+ reason: "no_anchors_found",
69
+ };
70
+ }
71
+ // ── Chain Evaluation ──────────────────────────────────────────────────
72
+ function evaluateChain(anchors, source, config, policy, agentTokenCount, agentTrustLevel) {
73
+ // Sort by epoch ascending
74
+ const sorted = [...anchors].sort((a, b) => a.anchor_epoch - b.anchor_epoch);
75
+ // Check for revocations (AI-REV.1 anchors targeting chain members)
76
+ const revoked = [];
77
+ for (const anchor of sorted) {
78
+ if (anchor.procedure_id === "AI-REV.1") {
79
+ // This IS a revocation anchor -- extract target from observations or context
80
+ const obs = anchor.observations;
81
+ const target = obs?.revocation_target;
82
+ if (target)
83
+ revoked.push(target);
84
+ }
85
+ }
86
+ // Check for FAIL verdicts
87
+ const failAnchors = sorted.filter((a) => {
88
+ const verdict = "verdict" in a ? a.verdict : undefined;
89
+ return verdict === "FAIL" && a.procedure_id !== "AI-REV.1";
90
+ });
91
+ // Check chain gaps
92
+ const maxGap = config.maxChainGapSeconds ?? 60;
93
+ const gaps = [];
94
+ for (let i = 1; i < sorted.length; i++) {
95
+ const gap = sorted[i].anchor_epoch - sorted[i - 1].anchor_epoch;
96
+ if (gap > maxGap) {
97
+ gaps.push({
98
+ fromEpoch: sorted[i - 1].anchor_epoch,
99
+ toEpoch: sorted[i].anchor_epoch,
100
+ gapSeconds: gap,
101
+ });
102
+ }
103
+ }
104
+ // Check anchor freshness (most recent anchor must be within maxGap of now)
105
+ const nowEpoch = Math.floor(Date.now() / 1000);
106
+ const newestAnchor = sorted[sorted.length - 1];
107
+ const staleness = nowEpoch - newestAnchor.anchor_epoch;
108
+ if (staleness > maxGap) {
109
+ gaps.push({
110
+ fromEpoch: newestAnchor.anchor_epoch,
111
+ toEpoch: nowEpoch,
112
+ gapSeconds: staleness,
113
+ });
114
+ }
115
+ // Verify HMAC signatures when signing key is available and policy requires it
116
+ let signatureFailures = 0;
117
+ if (policy.require_signing_key && config.signingKey) {
118
+ for (const anchor of sorted) {
119
+ if (anchor.procedure_id === "AI-REV.1")
120
+ continue;
121
+ if (!anchor.payload_signature) {
122
+ signatureFailures++;
123
+ continue;
124
+ }
125
+ // Recompute HMAC and compare (same-tenant verification)
126
+ const agentId = "agent_id" in anchor ? anchor.agent_id : undefined;
127
+ const expected = signPayload(config.signingKey, anchor.anchor_fingerprint, agentId);
128
+ if (anchor.payload_signature !== expected) {
129
+ signatureFailures++;
130
+ }
131
+ }
132
+ }
133
+ // Convert to ChainAnchor for policy evaluation
134
+ const chainAnchors = sorted
135
+ .filter((a) => a.procedure_id !== "AI-REV.1")
136
+ .map((a) => ({
137
+ anchor_epoch: a.anchor_epoch,
138
+ provider: a.provider,
139
+ payload_signature: a.payload_signature,
140
+ ai_input_tokens: a.ai_input_tokens,
141
+ ai_output_tokens: a.ai_output_tokens,
142
+ }));
143
+ // Evaluate density policy
144
+ const policyResult = evaluatePolicy(policy, chainAnchors, agentTokenCount, agentTrustLevel);
145
+ // Determine validity
146
+ const valid = revoked.length === 0 &&
147
+ failAnchors.length === 0 &&
148
+ gaps.length === 0 &&
149
+ signatureFailures === 0 &&
150
+ policyResult.compliant;
151
+ let reason;
152
+ if (!valid) {
153
+ if (revoked.length > 0)
154
+ reason = "revoked_anchors";
155
+ else if (failAnchors.length > 0)
156
+ reason = "fail_verdicts_in_chain";
157
+ else if (gaps.length > 0)
158
+ reason = "chain_gap_exceeded";
159
+ else if (signatureFailures > 0)
160
+ reason = "signature_verification_failed";
161
+ else if (!policyResult.compliant)
162
+ reason = "density_policy_violation";
163
+ }
164
+ return {
165
+ valid,
166
+ anchorCount: sorted.length,
167
+ gaps,
168
+ revoked,
169
+ policyViolations: policyResult.violations,
170
+ source,
171
+ reason,
172
+ };
173
+ }
174
+ // ── Ledger Query (HTTP fallback) ──────────────────────────────────────
175
+ //
176
+ // OPEN CORE BOUNDARY: This function queries the Axiom Engine's
177
+ // proprietary chain verification endpoint. The endpoint performs
178
+ // authoritative verification against the sovereign witness ledger
179
+ // (multi-tenant, RLS-enforced, revocation-aware). This is the paywall:
180
+ // local Redis verification is best-effort; ledger verification is
181
+ // authoritative. Do NOT implement local ledger storage or self-contained
182
+ // verification that would bypass this boundary.
183
+ //
184
+ async function queryLedger(agentId, cycleId, config, client) {
185
+ const params = new URLSearchParams();
186
+ if (agentId)
187
+ params.set("agent_id", agentId);
188
+ if (cycleId)
189
+ params.set("cycle_id", cycleId);
190
+ params.set("limit", "100");
191
+ params.set("recent", "true");
192
+ const url = `/api/v1/ai-witness/chain?${params.toString()}`;
193
+ try {
194
+ const response = await fetch(`${config.endpoint}${url}`, {
195
+ headers: {
196
+ "Content-Type": "application/json",
197
+ Authorization: `Bearer ${config.apiKey}`,
198
+ },
199
+ signal: AbortSignal.timeout(5000),
200
+ });
201
+ if (!response.ok)
202
+ return [];
203
+ const data = (await response.json());
204
+ return data.anchors || [];
205
+ }
206
+ catch {
207
+ return [];
208
+ }
209
+ }
210
+ //# sourceMappingURL=chain-verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain-verifier.js","sourceRoot":"","sources":["../src/chain-verifier.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -25,6 +25,10 @@ export interface WitnessPayload {
25
25
  cycle_id?: string;
26
26
  payload_signature?: string;
27
27
  policy_version_hash?: string;
28
+ jurisdiction?: string;
29
+ legal_basis?: string;
30
+ purpose_class?: string;
31
+ witness_source?: string;
28
32
  }
29
33
  export interface WitnessReceipt {
30
34
  ok: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB,EAAE,MAAM,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAuB;gBAEnC,MAAM,EAAE,SAAS,EAAE,OAAO,GAAE,MAAc;IAMtD;;OAEG;IACH,mBAAmB,IAAI,MAAM,GAAG,IAAI;YAItB,OAAO;IAqCf,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAO7D,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAOpD,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IAapC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAI9C,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAaxD"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB,EAAE,MAAM,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAuB;gBAEnC,MAAM,EAAE,SAAS,EAAE,OAAO,GAAE,MAAc;IAMtD;;OAEG;IACH,mBAAmB,IAAI,MAAM,GAAG,IAAI;YAItB,OAAO;IAqCf,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAO7D,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAOpD,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IAapC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAI9C,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAaxD"}
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,11 +1,15 @@
1
1
  /**
2
- * SWT3 MCP Server Configuration from environment variables.
2
+ * SWT3 MCP Server -- Configuration.
3
3
  *
4
- * Three modes:
5
- * 1. Demo mode (no env vars) — local-only anchors, no account needed
6
- * 2. API key only — tenant auto-resolved from first API call
7
- * 3. Full config API key + explicit tenant ID
4
+ * Priority: env vars > YAML file > defaults
5
+ *
6
+ * Four modes:
7
+ * 1. Demo mode (no env vars, no YAML) -- local-only anchors, no account needed
8
+ * 2. YAML config (SWT3_CONFIG_FILE) -- one file governs MCP + SDK
9
+ * 3. API key only -- tenant auto-resolved from first API call
10
+ * 4. Full config -- API key + explicit tenant ID
8
11
  */
12
+ import type { DensityPolicy } from "./density-policy.js";
9
13
  export interface McpConfig {
10
14
  endpoint: string;
11
15
  apiKey: string;
@@ -14,6 +18,52 @@ export interface McpConfig {
14
18
  agentId?: string;
15
19
  signingKey?: string;
16
20
  demo: boolean;
21
+ /** Enable chain verification gatekeeper before tool execution. */
22
+ chainVerify: boolean;
23
+ /** Redis URL for stream reader (chain verification fast path). */
24
+ redisUrl: string;
25
+ /** Redis stream name for anchor consumption. */
26
+ redisStream: string;
27
+ /** Maximum seconds between consecutive anchors in a chain. */
28
+ maxChainGapSeconds: number;
29
+ /** SHA-256 hash of the config file (if loaded from YAML). */
30
+ configHash?: string;
31
+ }
32
+ export interface YamlTrustMesh {
33
+ trustedTenants: string[];
34
+ deniedAgents: string[];
35
+ deniedTenants: string[];
36
+ }
37
+ export interface McpToolPolicy {
38
+ /** Glob patterns for tools that MUST be witnessed. */
39
+ witnessedTools: string[];
40
+ /** Glob patterns for tools exempt from witnessing. */
41
+ exemptTools: string[];
42
+ /** Minimum trust level required before executing any MCP tool. */
43
+ requireTrustLevel: number;
44
+ /** Auto-witness all MCP tool calls without explicit wrapping. */
45
+ autoWitness: boolean;
46
+ /** Block tool execution if witnessing fails (true) or log-only (false). */
47
+ blockOnFailure: boolean;
48
+ /** Rate limit: "N/Xs" format (e.g., "4/30s"). */
49
+ maxVelocity?: string;
50
+ /** Maximum sequential dependent tool calls. */
51
+ maxChainDepth?: number;
52
+ /** Only these tools are permitted. Empty = all. */
53
+ toolAllowlist?: string[];
54
+ /** These tools are always blocked. */
55
+ toolBlocklist?: string[];
56
+ /** On enforcement error: true = block, false = log. Default true. */
57
+ failSecure?: boolean;
17
58
  }
18
- export declare function loadConfig(): McpConfig;
59
+ export interface McpConfigBundle {
60
+ config: McpConfig;
61
+ densityPolicy: DensityPolicy | null;
62
+ trustMesh: YamlTrustMesh | null;
63
+ mcpPolicy: McpToolPolicy | null;
64
+ }
65
+ /**
66
+ * Load configuration. Checks SWT3_CONFIG_FILE first, falls back to env vars.
67
+ */
68
+ export declare function loadConfig(): McpConfigBundle;
19
69
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,UAAU,IAAI,SAAS,CAkCtC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,kEAAkE;IAClE,WAAW,EAAE,OAAO,CAAC;IACrB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,kBAAkB,EAAE,MAAM,CAAC;IAC3B,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,sDAAsD;IACtD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,kEAAkE;IAClE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iEAAiE;IACjE,WAAW,EAAE,OAAO,CAAC;IACrB,2EAA2E;IAC3E,cAAc,EAAE,OAAO,CAAC;IACxB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,qEAAqE;IACrE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,SAAS,CAAC;IAClB,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;CACjC;AAwID;;GAEG;AACH,wBAAgB,UAAU,IAAI,eAAe,CAmD5C"}