@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
@@ -0,0 +1,162 @@
1
+ /**
2
+ * SWT3 MCP Server: model integrity tools.
3
+ *
4
+ * witness_model_integrity (AI-MDL.5): Verify model weight file hash.
5
+ * witness_adapter_stack (AI-MDL.6): Attest active LoRA/PEFT adapters.
6
+ */
7
+ import { mintFingerprint, sha256Truncated, timestampMs, signPayload, } from "../fingerprint.js";
8
+ export async function handleWitnessModelIntegrity(args, config, client) {
9
+ const procedureId = "AI-MDL.5";
10
+ const clearingLevel = args.clearing_level ?? config.clearingLevel;
11
+ const match = args.expected_hash
12
+ ? args.weight_hash === args.expected_hash
13
+ : true;
14
+ const factorA = 1;
15
+ const factorB = match ? 1 : 0;
16
+ const factorC = 0;
17
+ const verdict = match ? "PASS" : "FAIL";
18
+ const [ts, epoch] = timestampMs();
19
+ const fp = mintFingerprint(config.tenantId, procedureId, factorA, factorB, factorC, ts);
20
+ const payload = {
21
+ procedure_id: procedureId,
22
+ factor_a: factorA,
23
+ factor_b: factorB,
24
+ factor_c: factorC,
25
+ clearing_level: clearingLevel,
26
+ anchor_fingerprint: fp,
27
+ anchor_epoch: epoch,
28
+ fingerprint_timestamp_ms: ts,
29
+ };
30
+ if (clearingLevel <= 1) {
31
+ payload.ai_model_id = args.model_id;
32
+ const ctx = {
33
+ provider: "model-weights",
34
+ file_hash: args.weight_hash,
35
+ };
36
+ if (args.expected_hash)
37
+ ctx.expected_hash = args.expected_hash;
38
+ if (args.format)
39
+ ctx.format = args.format;
40
+ if (args.file_size_bytes != null)
41
+ ctx.file_size_bytes = args.file_size_bytes;
42
+ payload.ai_context = ctx;
43
+ }
44
+ else if (clearingLevel === 2) {
45
+ payload.ai_model_id = args.model_id;
46
+ }
47
+ else {
48
+ payload.ai_model_id = sha256Truncated(args.model_id);
49
+ }
50
+ payload.witness_source = "mcp";
51
+ const agentId = args.agent_id || config.agentId;
52
+ if (agentId)
53
+ payload.agent_id = agentId;
54
+ if (args.cycle_id)
55
+ payload.cycle_id = args.cycle_id;
56
+ if (config.signingKey) {
57
+ payload.payload_signature = signPayload(config.signingKey, fp, agentId);
58
+ }
59
+ if (config.demo) {
60
+ const demoAnchor = `SWT3-DEMO-LOCAL-AI-${procedureId.replace(/[.-]/g, "")}-${verdict}-${epoch}-${fp}`;
61
+ return [
62
+ `[DEMO MODE: local only, not persisted]`,
63
+ ``,
64
+ `Model Weight Integrity`,
65
+ `Verdict: ${verdict}`,
66
+ `Anchor: ${demoAnchor}`,
67
+ `Model: ${args.model_id}`,
68
+ `Hash Match: ${match}`,
69
+ `Clearing Level: ${clearingLevel}`,
70
+ `Fingerprint: ${fp}`,
71
+ ].join("\n");
72
+ }
73
+ const receipt = await client.postWitness(payload);
74
+ if (receipt.tenant_id && !process.env.SWT3_TENANT_ID)
75
+ config.tenantId = receipt.tenant_id;
76
+ return [
77
+ `Model Weight Integrity`,
78
+ `Verdict: ${receipt.verdict}`,
79
+ `Anchor: ${receipt.swt3_anchor}`,
80
+ `Model: ${args.model_id}`,
81
+ `Hash Match: ${match}`,
82
+ `Clearing Level: ${receipt.clearing_level}`,
83
+ `Witnessed: ${receipt.witnessed_at}`,
84
+ `Verify: ${config.endpoint}${receipt.verification_url}`,
85
+ `Fingerprint: ${fp}`,
86
+ ].join("\n");
87
+ }
88
+ export async function handleWitnessAdapterStack(args, config, client) {
89
+ const procedureId = "AI-MDL.6";
90
+ const clearingLevel = args.clearing_level ?? config.clearingLevel;
91
+ const allVerified = args.adapters.length === 0 || args.adapters.every((a) => a.hash);
92
+ const factorA = args.adapters.length;
93
+ const factorB = allVerified ? 1 : 0;
94
+ const factorC = 0;
95
+ const verdict = allVerified ? "PASS" : "FAIL";
96
+ const [ts, epoch] = timestampMs();
97
+ const fp = mintFingerprint(config.tenantId, procedureId, factorA, factorB, factorC, ts);
98
+ const payload = {
99
+ procedure_id: procedureId,
100
+ factor_a: factorA,
101
+ factor_b: factorB,
102
+ factor_c: factorC,
103
+ clearing_level: clearingLevel,
104
+ anchor_fingerprint: fp,
105
+ anchor_epoch: epoch,
106
+ fingerprint_timestamp_ms: ts,
107
+ };
108
+ if (clearingLevel <= 1) {
109
+ payload.ai_model_id = args.base_model;
110
+ payload.ai_context = {
111
+ provider: "adapter",
112
+ base_model_id: args.base_model,
113
+ adapters: args.adapters,
114
+ };
115
+ }
116
+ else if (clearingLevel === 2) {
117
+ payload.ai_model_id = args.base_model;
118
+ }
119
+ else {
120
+ payload.ai_model_id = sha256Truncated(args.base_model);
121
+ }
122
+ payload.witness_source = "mcp";
123
+ const agentId = args.agent_id || config.agentId;
124
+ if (agentId)
125
+ payload.agent_id = agentId;
126
+ if (args.cycle_id)
127
+ payload.cycle_id = args.cycle_id;
128
+ if (config.signingKey) {
129
+ payload.payload_signature = signPayload(config.signingKey, fp, agentId);
130
+ }
131
+ if (config.demo) {
132
+ const demoAnchor = `SWT3-DEMO-LOCAL-AI-${procedureId.replace(/[.-]/g, "")}-${verdict}-${epoch}-${fp}`;
133
+ return [
134
+ `[DEMO MODE: local only, not persisted]`,
135
+ ``,
136
+ `Adapter Stack Attestation`,
137
+ `Verdict: ${verdict}`,
138
+ `Anchor: ${demoAnchor}`,
139
+ `Base Model: ${args.base_model}`,
140
+ `Adapters: ${args.adapters.length}`,
141
+ `All Verified: ${allVerified}`,
142
+ `Clearing Level: ${clearingLevel}`,
143
+ `Fingerprint: ${fp}`,
144
+ ].join("\n");
145
+ }
146
+ const receipt = await client.postWitness(payload);
147
+ if (receipt.tenant_id && !process.env.SWT3_TENANT_ID)
148
+ config.tenantId = receipt.tenant_id;
149
+ return [
150
+ `Adapter Stack Attestation`,
151
+ `Verdict: ${receipt.verdict}`,
152
+ `Anchor: ${receipt.swt3_anchor}`,
153
+ `Base Model: ${args.base_model}`,
154
+ `Adapters: ${args.adapters.length}`,
155
+ `All Verified: ${allVerified}`,
156
+ `Clearing Level: ${receipt.clearing_level}`,
157
+ `Witnessed: ${receipt.witnessed_at}`,
158
+ `Verify: ${config.endpoint}${receipt.verification_url}`,
159
+ `Fingerprint: ${fp}`,
160
+ ].join("\n");
161
+ }
162
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/tools/model.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,eAAe,EACf,eAAe,EACf,WAAW,EACX,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAe3B,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,IAAwB,EACxB,MAAiB,EACjB,MAAmB;IAEnB,MAAM,WAAW,GAAG,UAAU,CAAC;IAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,aAAa,CAAC;IAElE,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa;QAC9B,CAAC,CAAC,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,aAAa;QACzC,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,OAAO,GAAG,CAAC,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,CAAC,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAExC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,WAAW,EAAE,CAAC;IAClC,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAExF,MAAM,OAAO,GAAmB;QAC9B,YAAY,EAAE,WAAW;QACzB,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,OAAO;QACjB,cAAc,EAAE,aAAa;QAC7B,kBAAkB,EAAE,EAAE;QACtB,YAAY,EAAE,KAAK;QACnB,wBAAwB,EAAE,EAAE;KAC7B,CAAC;IAEF,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC;QACpC,MAAM,GAAG,GAA4B;YACnC,QAAQ,EAAE,eAAe;YACzB,SAAS,EAAE,IAAI,CAAC,WAAW;SAC5B,CAAC;QACF,IAAI,IAAI,CAAC,aAAa;YAAE,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QAC/D,IAAI,IAAI,CAAC,MAAM;YAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1C,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI;YAAE,GAAG,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;QAC7E,OAAO,CAAC,UAAU,GAAG,GAAG,CAAC;IAC3B,CAAC;SAAM,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC;IAChD,IAAI,OAAO;QAAE,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;IACxC,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IACpD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,sBAAsB,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,OAAO,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QACtG,OAAO;YACL,wCAAwC;YACxC,EAAE;YACF,wBAAwB;YACxB,YAAY,OAAO,EAAE;YACrB,WAAW,UAAU,EAAE;YACvB,UAAU,IAAI,CAAC,QAAQ,EAAE;YACzB,eAAe,KAAK,EAAE;YACtB,mBAAmB,aAAa,EAAE;YAClC,gBAAgB,EAAE,EAAE;SACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;QAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IAE1F,OAAO;QACL,wBAAwB;QACxB,YAAY,OAAO,CAAC,OAAO,EAAE;QAC7B,WAAW,OAAO,CAAC,WAAW,EAAE;QAChC,UAAU,IAAI,CAAC,QAAQ,EAAE;QACzB,eAAe,KAAK,EAAE;QACtB,mBAAmB,OAAO,CAAC,cAAc,EAAE;QAC3C,cAAc,OAAO,CAAC,YAAY,EAAE;QACpC,WAAW,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,gBAAgB,EAAE;QACvD,gBAAgB,EAAE,EAAE;KACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAYD,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,IAAsB,EACtB,MAAiB,EACjB,MAAmB;IAEnB,MAAM,WAAW,GAAG,UAAU,CAAC;IAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,aAAa,CAAC;IAElE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrF,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IACrC,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,CAAC,CAAC;IAClB,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAE9C,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,WAAW,EAAE,CAAC;IAClC,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAExF,MAAM,OAAO,GAAmB;QAC9B,YAAY,EAAE,WAAW;QACzB,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,OAAO;QACjB,cAAc,EAAE,aAAa;QAC7B,kBAAkB,EAAE,EAAE;QACtB,YAAY,EAAE,KAAK;QACnB,wBAAwB,EAAE,EAAE;KAC7B,CAAC;IAEF,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC;QACtC,OAAO,CAAC,UAAU,GAAG;YACnB,QAAQ,EAAE,SAAS;YACnB,aAAa,EAAE,IAAI,CAAC,UAAU;YAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;IACJ,CAAC;SAAM,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC;IAChD,IAAI,OAAO;QAAE,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;IACxC,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IACpD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,sBAAsB,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,OAAO,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QACtG,OAAO;YACL,wCAAwC;YACxC,EAAE;YACF,2BAA2B;YAC3B,YAAY,OAAO,EAAE;YACrB,WAAW,UAAU,EAAE;YACvB,eAAe,IAAI,CAAC,UAAU,EAAE;YAChC,aAAa,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YACnC,iBAAiB,WAAW,EAAE;YAC9B,mBAAmB,aAAa,EAAE;YAClC,gBAAgB,EAAE,EAAE;SACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;QAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IAE1F,OAAO;QACL,2BAA2B;QAC3B,YAAY,OAAO,CAAC,OAAO,EAAE;QAC7B,WAAW,OAAO,CAAC,WAAW,EAAE;QAChC,eAAe,IAAI,CAAC,UAAU,EAAE;QAChC,aAAa,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;QACnC,iBAAiB,WAAW,EAAE;QAC9B,mBAAmB,OAAO,CAAC,cAAc,EAAE;QAC3C,cAAc,OAAO,CAAC,YAAY,EAAE;QACpC,WAAW,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,gBAAgB,EAAE;QACvD,gBAAgB,EAAE,EAAE;KACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -1,8 +1,8 @@
1
1
  /**
2
- * SWT3 MCP Server signup tool.
2
+ * SWT3 MCP Server: signup tool.
3
3
  *
4
4
  * Directs the developer to the signup page without passing credentials
5
- * through the LLM context. Returns a URL the developer completes
5
+ * through the LLM context. Returns a URL. The developer completes
6
6
  * signup in their browser and copies the API key back.
7
7
  */
8
8
  import type { McpConfig } from "../config.js";
@@ -1 +1 @@
1
- {"version":3,"file":"signup.d.ts","sourceRoot":"","sources":["../../src/tools/signup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,wBAAsB,YAAY,CAChC,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5B,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,MAAM,CAAC,CAkBjB"}
1
+ {"version":3,"file":"signup.d.ts","sourceRoot":"","sources":["../../src/tools/signup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,wBAAsB,YAAY,CAChC,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5B,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,MAAM,CAAC,CAyBjB"}
@@ -1,8 +1,8 @@
1
1
  /**
2
- * SWT3 MCP Server signup tool.
2
+ * SWT3 MCP Server: signup tool.
3
3
  *
4
4
  * Directs the developer to the signup page without passing credentials
5
- * through the LLM context. Returns a URL the developer completes
5
+ * through the LLM context. Returns a URL. The developer completes
6
6
  * signup in their browser and copies the API key back.
7
7
  */
8
8
  export async function handleSignup(args, config) {
@@ -13,7 +13,7 @@ export async function handleSignup(args, config) {
13
13
  ``,
14
14
  ` ${signupUrl}`,
15
15
  ``,
16
- `After signup, you'll see your API key (shown once copy it).`,
16
+ `After signup, you'll see your API key (shown once, copy it).`,
17
17
  `Then add it to your MCP config:`,
18
18
  ``,
19
19
  ` "env": {`,
@@ -21,6 +21,13 @@ export async function handleSignup(args, config) {
21
21
  ` }`,
22
22
  ``,
23
23
  `Restart your MCP client and the server switches to live mode automatically.`,
24
+ ``,
25
+ `SDKs available in 5 languages:`,
26
+ ` Python: pip install swt3-ai`,
27
+ ` TypeScript: npm install @tenova/swt3-ai`,
28
+ ` Rust: cargo add swt3-ai`,
29
+ ` C#: dotnet add package swt3-ai`,
30
+ ` Ruby: gem install swt3-ai`,
24
31
  ].join("\n");
25
32
  }
26
33
  //# sourceMappingURL=signup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signup.js","sourceRoot":"","sources":["../../src/tools/signup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAA4B,EAC5B,MAAiB;IAEjB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC;IAClD,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,QAAQ,6BAA6B,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;IAEjG,OAAO;QACL,6CAA6C;QAC7C,EAAE;QACF,KAAK,SAAS,EAAE;QAChB,EAAE;QACF,+DAA+D;QAC/D,iCAAiC;QACjC,EAAE;QACF,YAAY;QACZ,oCAAoC;QACpC,KAAK;QACL,EAAE;QACF,6EAA6E;KAC9E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"signup.js","sourceRoot":"","sources":["../../src/tools/signup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAA4B,EAC5B,MAAiB;IAEjB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC;IAClD,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,QAAQ,6BAA6B,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;IAEjG,OAAO;QACL,6CAA6C;QAC7C,EAAE;QACF,KAAK,SAAS,EAAE;QAChB,EAAE;QACF,8DAA8D;QAC9D,iCAAiC;QACjC,EAAE;QACF,YAAY;QACZ,oCAAoC;QACpC,KAAK;QACL,EAAE;QACF,6EAA6E;QAC7E,EAAE;QACF,gCAAgC;QAChC,mCAAmC;QACnC,2CAA2C;QAC3C,iCAAiC;QACjC,0CAA0C;QAC1C,mCAAmC;KACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * SWT3 MCP Server: skill attestation tools.
3
+ *
4
+ * attest_skill_manifest (AI-SKILL.1): Attest active skills/tools/plugins.
5
+ * attest_memory_context (AI-SKILL.2): Attest memory sources influencing decisions.
6
+ */
7
+ import type { McpConfig } from "../config.js";
8
+ import type { AxiomClient } from "../client.js";
9
+ interface SkillManifestArgs {
10
+ skills: Array<{
11
+ name: string;
12
+ version?: string;
13
+ hash?: string;
14
+ }>;
15
+ expected_manifest_hash?: string;
16
+ agent_id?: string;
17
+ cycle_id?: string;
18
+ clearing_level?: 0 | 1 | 2 | 3;
19
+ }
20
+ export declare function handleAttestSkillManifest(args: SkillManifestArgs, config: McpConfig, client: AxiomClient): Promise<string>;
21
+ interface MemoryContextArgs {
22
+ memory_sources: Array<{
23
+ type: string;
24
+ id?: string;
25
+ hash?: string;
26
+ }>;
27
+ agent_id?: string;
28
+ cycle_id?: string;
29
+ clearing_level?: 0 | 1 | 2 | 3;
30
+ }
31
+ export declare function handleAttestMemoryContext(args: MemoryContextArgs, config: McpConfig, client: AxiomClient): Promise<string>;
32
+ export {};
33
+ //# sourceMappingURL=skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/tools/skill.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,cAAc,CAAC;AAUhE,UAAU,iBAAiB;IACzB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAChC;AAED,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,CAuFjB;AAID,UAAU,iBAAiB;IACzB,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAChC;AAED,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,CAgFjB"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * SWT3 MCP Server: skill attestation tools.
3
+ *
4
+ * attest_skill_manifest (AI-SKILL.1): Attest active skills/tools/plugins.
5
+ * attest_memory_context (AI-SKILL.2): Attest memory sources influencing decisions.
6
+ */
7
+ import { mintFingerprint, sha256Truncated, timestampMs, signPayload, } from "../fingerprint.js";
8
+ export async function handleAttestSkillManifest(args, config, client) {
9
+ const procedureId = "AI-SKILL.1";
10
+ const clearingLevel = args.clearing_level ?? config.clearingLevel;
11
+ // Compute manifest hash from sorted skill hashes
12
+ const skillHashes = args.skills
13
+ .map((s) => s.hash || sha256Truncated(s.name))
14
+ .sort();
15
+ const computedManifest = sha256Truncated(skillHashes.join(":"));
16
+ const match = args.expected_manifest_hash
17
+ ? computedManifest === args.expected_manifest_hash
18
+ : true;
19
+ const factorA = args.skills.length;
20
+ const factorB = match ? 1 : 0;
21
+ const factorC = 0;
22
+ const verdict = match ? "PASS" : "FAIL";
23
+ const [ts, epoch] = timestampMs();
24
+ const fp = mintFingerprint(config.tenantId, procedureId, factorA, factorB, factorC, ts);
25
+ const payload = {
26
+ procedure_id: procedureId,
27
+ factor_a: factorA,
28
+ factor_b: factorB,
29
+ factor_c: factorC,
30
+ clearing_level: clearingLevel,
31
+ anchor_fingerprint: fp,
32
+ anchor_epoch: epoch,
33
+ fingerprint_timestamp_ms: ts,
34
+ };
35
+ if (clearingLevel <= 1) {
36
+ payload.ai_model_id = "skill-manifest";
37
+ payload.ai_context = {
38
+ provider: "skill-manifest",
39
+ skills: args.skills,
40
+ manifest_hash: computedManifest,
41
+ };
42
+ }
43
+ else if (clearingLevel === 2) {
44
+ payload.ai_model_id = "skill-manifest";
45
+ }
46
+ else {
47
+ payload.ai_model_id = sha256Truncated("skill-manifest");
48
+ }
49
+ payload.witness_source = "mcp";
50
+ const agentId = args.agent_id || config.agentId;
51
+ if (agentId)
52
+ payload.agent_id = agentId;
53
+ if (args.cycle_id)
54
+ payload.cycle_id = args.cycle_id;
55
+ if (config.signingKey) {
56
+ payload.payload_signature = signPayload(config.signingKey, fp, agentId);
57
+ }
58
+ if (config.demo) {
59
+ const demoAnchor = `SWT3-DEMO-LOCAL-AI-${procedureId.replace(/[.-]/g, "")}-${verdict}-${epoch}-${fp}`;
60
+ const skillNames = args.skills.map((s) => s.name).join(", ");
61
+ return [
62
+ `[DEMO MODE: local only, not persisted]`,
63
+ ``,
64
+ `Skill Manifest Attestation`,
65
+ `Verdict: ${verdict}`,
66
+ `Anchor: ${demoAnchor}`,
67
+ `Skills: ${skillNames}`,
68
+ `Count: ${args.skills.length}`,
69
+ `Manifest Hash: ${computedManifest}`,
70
+ `Clearing Level: ${clearingLevel}`,
71
+ `Fingerprint: ${fp}`,
72
+ ].join("\n");
73
+ }
74
+ const receipt = await client.postWitness(payload);
75
+ if (receipt.tenant_id && !process.env.SWT3_TENANT_ID)
76
+ config.tenantId = receipt.tenant_id;
77
+ const skillNames = args.skills.map((s) => s.name).join(", ");
78
+ return [
79
+ `Skill Manifest Attestation`,
80
+ `Verdict: ${receipt.verdict}`,
81
+ `Anchor: ${receipt.swt3_anchor}`,
82
+ `Skills: ${skillNames}`,
83
+ `Count: ${args.skills.length}`,
84
+ `Manifest Hash: ${computedManifest}`,
85
+ `Clearing Level: ${receipt.clearing_level}`,
86
+ `Witnessed: ${receipt.witnessed_at}`,
87
+ `Verify: ${config.endpoint}${receipt.verification_url}`,
88
+ `Fingerprint: ${fp}`,
89
+ ].join("\n");
90
+ }
91
+ export async function handleAttestMemoryContext(args, config, client) {
92
+ const procedureId = "AI-SKILL.2";
93
+ const clearingLevel = args.clearing_level ?? config.clearingLevel;
94
+ const allIdentified = args.memory_sources.length > 0 &&
95
+ args.memory_sources.every((s) => s.id || s.hash);
96
+ const factorA = args.memory_sources.length;
97
+ const factorB = allIdentified ? 1 : 0;
98
+ const factorC = 0;
99
+ const verdict = allIdentified ? "PASS" : "FAIL";
100
+ const [ts, epoch] = timestampMs();
101
+ const fp = mintFingerprint(config.tenantId, procedureId, factorA, factorB, factorC, ts);
102
+ const payload = {
103
+ procedure_id: procedureId,
104
+ factor_a: factorA,
105
+ factor_b: factorB,
106
+ factor_c: factorC,
107
+ clearing_level: clearingLevel,
108
+ anchor_fingerprint: fp,
109
+ anchor_epoch: epoch,
110
+ fingerprint_timestamp_ms: ts,
111
+ };
112
+ if (clearingLevel <= 1) {
113
+ payload.ai_model_id = "memory-context";
114
+ payload.ai_context = {
115
+ provider: "memory",
116
+ sources: args.memory_sources,
117
+ total_sources: args.memory_sources.length,
118
+ };
119
+ }
120
+ else if (clearingLevel === 2) {
121
+ payload.ai_model_id = "memory-context";
122
+ }
123
+ else {
124
+ payload.ai_model_id = sha256Truncated("memory-context");
125
+ }
126
+ payload.witness_source = "mcp";
127
+ const agentId = args.agent_id || config.agentId;
128
+ if (agentId)
129
+ payload.agent_id = agentId;
130
+ if (args.cycle_id)
131
+ payload.cycle_id = args.cycle_id;
132
+ if (config.signingKey) {
133
+ payload.payload_signature = signPayload(config.signingKey, fp, agentId);
134
+ }
135
+ if (config.demo) {
136
+ const demoAnchor = `SWT3-DEMO-LOCAL-AI-${procedureId.replace(/[.-]/g, "")}-${verdict}-${epoch}-${fp}`;
137
+ const sourceTypes = args.memory_sources.map((s) => s.type).join(", ");
138
+ return [
139
+ `[DEMO MODE: local only, not persisted]`,
140
+ ``,
141
+ `Memory Context Binding`,
142
+ `Verdict: ${verdict}`,
143
+ `Anchor: ${demoAnchor}`,
144
+ `Sources: ${sourceTypes}`,
145
+ `Count: ${args.memory_sources.length}`,
146
+ `All Identified: ${allIdentified}`,
147
+ `Clearing Level: ${clearingLevel}`,
148
+ `Fingerprint: ${fp}`,
149
+ ].join("\n");
150
+ }
151
+ const receipt = await client.postWitness(payload);
152
+ if (receipt.tenant_id && !process.env.SWT3_TENANT_ID)
153
+ config.tenantId = receipt.tenant_id;
154
+ const sourceTypes = args.memory_sources.map((s) => s.type).join(", ");
155
+ return [
156
+ `Memory Context Binding`,
157
+ `Verdict: ${receipt.verdict}`,
158
+ `Anchor: ${receipt.swt3_anchor}`,
159
+ `Sources: ${sourceTypes}`,
160
+ `Count: ${args.memory_sources.length}`,
161
+ `All Identified: ${allIdentified}`,
162
+ `Clearing Level: ${receipt.clearing_level}`,
163
+ `Witnessed: ${receipt.witnessed_at}`,
164
+ `Verify: ${config.endpoint}${receipt.verification_url}`,
165
+ `Fingerprint: ${fp}`,
166
+ ].join("\n");
167
+ }
168
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/tools/skill.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,eAAe,EACf,eAAe,EACf,WAAW,EACX,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAY3B,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,IAAuB,EACvB,MAAiB,EACjB,MAAmB;IAEnB,MAAM,WAAW,GAAG,YAAY,CAAC;IACjC,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,aAAa,CAAC;IAElE,iDAAiD;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM;SAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAC7C,IAAI,EAAE,CAAC;IACV,MAAM,gBAAgB,GAAG,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAEhE,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB;QACvC,CAAC,CAAC,gBAAgB,KAAK,IAAI,CAAC,sBAAsB;QAClD,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,CAAC,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAExC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,WAAW,EAAE,CAAC;IAClC,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAExF,MAAM,OAAO,GAAmB;QAC9B,YAAY,EAAE,WAAW;QACzB,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,OAAO;QACjB,cAAc,EAAE,aAAa;QAC7B,kBAAkB,EAAE,EAAE;QACtB,YAAY,EAAE,KAAK;QACnB,wBAAwB,EAAE,EAAE;KAC7B,CAAC;IAEF,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,WAAW,GAAG,gBAAgB,CAAC;QACvC,OAAO,CAAC,UAAU,GAAG;YACnB,QAAQ,EAAE,gBAAgB;YAC1B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,aAAa,EAAE,gBAAgB;SAChC,CAAC;IACJ,CAAC;SAAM,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,WAAW,GAAG,gBAAgB,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,WAAW,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC;IAChD,IAAI,OAAO;QAAE,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;IACxC,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IACpD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,sBAAsB,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,OAAO,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QACtG,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO;YACL,wCAAwC;YACxC,EAAE;YACF,4BAA4B;YAC5B,YAAY,OAAO,EAAE;YACrB,WAAW,UAAU,EAAE;YACvB,WAAW,UAAU,EAAE;YACvB,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAC9B,kBAAkB,gBAAgB,EAAE;YACpC,mBAAmB,aAAa,EAAE;YAClC,gBAAgB,EAAE,EAAE;SACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;QAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IAE1F,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO;QACL,4BAA4B;QAC5B,YAAY,OAAO,CAAC,OAAO,EAAE;QAC7B,WAAW,OAAO,CAAC,WAAW,EAAE;QAChC,WAAW,UAAU,EAAE;QACvB,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;QAC9B,kBAAkB,gBAAgB,EAAE;QACpC,mBAAmB,OAAO,CAAC,cAAc,EAAE;QAC3C,cAAc,OAAO,CAAC,YAAY,EAAE;QACpC,WAAW,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,gBAAgB,EAAE;QACvD,gBAAgB,EAAE,EAAE;KACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,IAAuB,EACvB,MAAiB,EACjB,MAAmB;IAEnB,MAAM,WAAW,GAAG,YAAY,CAAC;IACjC,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,aAAa,CAAC;IAElE,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;QAClD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;IAC3C,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,CAAC,CAAC;IAClB,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAEhD,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,WAAW,EAAE,CAAC;IAClC,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAExF,MAAM,OAAO,GAAmB;QAC9B,YAAY,EAAE,WAAW;QACzB,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,OAAO;QACjB,cAAc,EAAE,aAAa;QAC7B,kBAAkB,EAAE,EAAE;QACtB,YAAY,EAAE,KAAK;QACnB,wBAAwB,EAAE,EAAE;KAC7B,CAAC;IAEF,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,WAAW,GAAG,gBAAgB,CAAC;QACvC,OAAO,CAAC,UAAU,GAAG;YACnB,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,IAAI,CAAC,cAAc;YAC5B,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM;SAC1C,CAAC;IACJ,CAAC;SAAM,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,WAAW,GAAG,gBAAgB,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,WAAW,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC;IAChD,IAAI,OAAO;QAAE,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;IACxC,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IACpD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,sBAAsB,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,OAAO,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QACtG,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,OAAO;YACL,wCAAwC;YACxC,EAAE;YACF,wBAAwB;YACxB,YAAY,OAAO,EAAE;YACrB,WAAW,UAAU,EAAE;YACvB,YAAY,WAAW,EAAE;YACzB,UAAU,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;YACtC,mBAAmB,aAAa,EAAE;YAClC,mBAAmB,aAAa,EAAE;YAClC,gBAAgB,EAAE,EAAE;SACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;QAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IAE1F,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,OAAO;QACL,wBAAwB;QACxB,YAAY,OAAO,CAAC,OAAO,EAAE;QAC7B,WAAW,OAAO,CAAC,WAAW,EAAE;QAChC,YAAY,WAAW,EAAE;QACzB,UAAU,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;QACtC,mBAAmB,aAAa,EAAE;QAClC,mBAAmB,OAAO,CAAC,cAAc,EAAE;QAC3C,cAAc,OAAO,CAAC,YAAY,EAAE;QACpC,WAAW,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,gBAAgB,EAAE;QACvD,gBAAgB,EAAE,EAAE;KACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * SWT3 MCP Server: suggest_procedures tool.
3
+ *
4
+ * Advisory-only procedure suggestions based on context keywords.
5
+ * No network call. Never enforced. The agent decides what to witness.
6
+ */
7
+ interface SuggestArgs {
8
+ context: string;
9
+ model_id?: string;
10
+ data_classification?: string;
11
+ tools_used?: string[];
12
+ }
13
+ export declare function handleSuggest(args: SuggestArgs): string;
14
+ export {};
15
+ //# sourceMappingURL=suggest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../src/tools/suggest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AA2HD,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAmEvD"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * SWT3 MCP Server: suggest_procedures tool.
3
+ *
4
+ * Advisory-only procedure suggestions based on context keywords.
5
+ * No network call. Never enforced. The agent decides what to witness.
6
+ */
7
+ const KEYWORD_MAP = [
8
+ {
9
+ keywords: ["infer", "generat", "complet", "chat", "prompt", "response", "llm", "model", "gpt", "claude", "llama", "mistral"],
10
+ procedure: "AI-INF.1",
11
+ title: "Inference Provenance",
12
+ reason: "AI model inference detected -- witness the model, prompt hash, and response hash",
13
+ priority: 1,
14
+ },
15
+ {
16
+ keywords: ["drift", "version", "chang", "updat", "different model", "switch", "migrat"],
17
+ procedure: "AI-DFT.1",
18
+ title: "Model Drift Detection",
19
+ reason: "Model version or behavior change indicated -- witness for drift tracking",
20
+ priority: 2,
21
+ },
22
+ {
23
+ keywords: ["guard", "safety", "filter", "modera", "content filter", "refusal", "block", "harm"],
24
+ procedure: "AI-GRD.1",
25
+ title: "Guardrail Attestation",
26
+ reason: "Safety or content filtering context detected -- witness guardrail state",
27
+ priority: 2,
28
+ },
29
+ {
30
+ keywords: ["agent", "identity", "who am i", "multi-agent", "orchestrat", "delegat"],
31
+ procedure: "AI-ID.1",
32
+ title: "Agent Identity",
33
+ reason: "Agent identity or multi-agent context detected -- witness agent_id",
34
+ priority: 3,
35
+ },
36
+ {
37
+ keywords: ["access", "database", "api call", "fetch", "read", "write", "permiss", "authoriz", "pii", "credential"],
38
+ procedure: "AI-ACC.1",
39
+ title: "Access Control Witnessing",
40
+ reason: "Data or resource access detected -- witness the authorization decision",
41
+ priority: 2,
42
+ },
43
+ {
44
+ keywords: ["tool", "function call", "plugin", "action", "execut", "run command", "code interpret"],
45
+ procedure: "AI-TOOL.1",
46
+ title: "Tool Use Witnessing",
47
+ reason: "Tool or function call detected -- witness the tool invocation",
48
+ priority: 2,
49
+ },
50
+ {
51
+ keywords: ["revok", "recall", "retract", "correct", "error", "mistake", "withdraw", "undo"],
52
+ procedure: "AI-REV.1",
53
+ title: "Anchor Revocation",
54
+ reason: "Correction or recall context detected -- consider revoking a prior anchor",
55
+ priority: 3,
56
+ },
57
+ {
58
+ keywords: ["handoff", "transfer", "pass to", "chain", "pipeline", "next agent", "downstream"],
59
+ procedure: "AI-CHAIN.1",
60
+ title: "Chain-of-Custody Handoff",
61
+ reason: "Agent handoff or pipeline transfer detected -- witness custody transfer",
62
+ priority: 3,
63
+ },
64
+ {
65
+ keywords: ["rag", "retriev", "context", "document", "chunk", "vector", "embed", "search result", "knowledge base"],
66
+ procedure: "AI-RAG.1",
67
+ title: "RAG Context Provenance",
68
+ reason: "Retrieval-augmented generation detected -- witness source documents and relevance",
69
+ priority: 2,
70
+ },
71
+ {
72
+ keywords: ["train", "fine-tun", "dataset", "epoch", "checkpoint", "weight", "lora", "adapter", "unsloth"],
73
+ procedure: "AI-DATA.3",
74
+ title: "Training Data Statistics",
75
+ reason: "Training or fine-tuning context detected -- witness dataset properties",
76
+ priority: 3,
77
+ },
78
+ {
79
+ keywords: ["bias", "fairness", "disparity", "protected", "demographic", "equit", "discriminat"],
80
+ procedure: "AI-FAIR.3",
81
+ title: "Bias Assessment",
82
+ reason: "Fairness or bias evaluation detected -- witness assessment results",
83
+ priority: 3,
84
+ },
85
+ {
86
+ keywords: ["model card", "registry", "catalog", "model version", "deploy model", "serve model"],
87
+ procedure: "AI-MDL.1",
88
+ title: "Model Hash Integrity",
89
+ reason: "Model management context detected -- witness model identity and hash",
90
+ priority: 2,
91
+ },
92
+ {
93
+ keywords: ["violat", "policy breach", "forbidden", "prohibited", "restrict", "banned", "illegal"],
94
+ procedure: "AI-VIO.1",
95
+ title: "Policy Violation",
96
+ reason: "Policy violation or prohibited action detected -- witness with severity classification",
97
+ priority: 1,
98
+ },
99
+ {
100
+ keywords: ["skill", "capability", "manifest", "plugin list", "tool list", "function list"],
101
+ procedure: "AI-SKILL.1",
102
+ title: "Skill Manifest",
103
+ reason: "Agent capability or skill registration detected -- witness the manifest",
104
+ priority: 3,
105
+ },
106
+ {
107
+ keywords: ["thermal", "temperature", "cool", "overheat", "power draw", "watt", "energy", "node health", "residential", "edge node"],
108
+ procedure: "AI-ENV.1",
109
+ title: "Environmental Integrity",
110
+ reason: "Hardware environment or node health context detected -- witness thermal and power state",
111
+ priority: 3,
112
+ },
113
+ ];
114
+ export function handleSuggest(args) {
115
+ const context = [
116
+ args.context,
117
+ args.model_id || "",
118
+ args.data_classification || "",
119
+ ...(args.tools_used || []),
120
+ ].join(" ").toLowerCase();
121
+ const matches = [];
122
+ const seen = new Set();
123
+ for (const entry of KEYWORD_MAP) {
124
+ if (seen.has(entry.procedure))
125
+ continue;
126
+ const hit = entry.keywords.some((kw) => context.includes(kw));
127
+ if (hit) {
128
+ seen.add(entry.procedure);
129
+ matches.push({
130
+ procedure: entry.procedure,
131
+ title: entry.title,
132
+ reason: entry.reason,
133
+ priority: entry.priority,
134
+ });
135
+ }
136
+ }
137
+ // Always suggest AI-INF.1 if nothing else matched
138
+ if (matches.length === 0) {
139
+ matches.push({
140
+ procedure: "AI-INF.1",
141
+ title: "Inference Provenance",
142
+ reason: "Default recommendation -- witness any AI inference for baseline compliance",
143
+ priority: 1,
144
+ });
145
+ }
146
+ // Data classification boost
147
+ if (args.data_classification) {
148
+ const classification = args.data_classification.toLowerCase();
149
+ if (classification === "sensitive" || classification === "classified") {
150
+ if (!seen.has("AI-ACC.1")) {
151
+ matches.push({
152
+ procedure: "AI-ACC.1",
153
+ title: "Access Control Witnessing",
154
+ reason: `Data classified as ${args.data_classification} -- witness access decisions`,
155
+ priority: 1,
156
+ });
157
+ }
158
+ }
159
+ }
160
+ // Sort by priority
161
+ matches.sort((a, b) => a.priority - b.priority);
162
+ const lines = [
163
+ `Suggested Procedures (${matches.length}):`,
164
+ ``,
165
+ ];
166
+ for (const m of matches) {
167
+ lines.push(` ${m.procedure} -- ${m.title}`);
168
+ lines.push(` ${m.reason}`);
169
+ lines.push(``);
170
+ }
171
+ lines.push(`These are advisory only. Use witness_inference or the relevant tool to attest.`);
172
+ return lines.join("\n");
173
+ }
174
+ //# sourceMappingURL=suggest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../src/tools/suggest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,MAAM,WAAW,GAMZ;IACH;QACE,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC;QAC5H,SAAS,EAAE,UAAU;QACrB,KAAK,EAAE,sBAAsB;QAC7B,MAAM,EAAE,kFAAkF;QAC1F,QAAQ,EAAE,CAAC;KACZ;IACD;QACE,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,CAAC;QACvF,SAAS,EAAE,UAAU;QACrB,KAAK,EAAE,uBAAuB;QAC9B,MAAM,EAAE,0EAA0E;QAClF,QAAQ,EAAE,CAAC;KACZ;IACD;QACE,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC;QAC/F,SAAS,EAAE,UAAU;QACrB,KAAK,EAAE,uBAAuB;QAC9B,MAAM,EAAE,yEAAyE;QACjF,QAAQ,EAAE,CAAC;KACZ;IACD;QACE,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,CAAC;QACnF,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,gBAAgB;QACvB,MAAM,EAAE,oEAAoE;QAC5E,QAAQ,EAAE,CAAC;KACZ;IACD;QACE,QAAQ,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,CAAC;QAClH,SAAS,EAAE,UAAU;QACrB,KAAK,EAAE,2BAA2B;QAClC,MAAM,EAAE,wEAAwE;QAChF,QAAQ,EAAE,CAAC;KACZ;IACD;QACE,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,gBAAgB,CAAC;QAClG,SAAS,EAAE,WAAW;QACtB,KAAK,EAAE,qBAAqB;QAC5B,MAAM,EAAE,+DAA+D;QACvE,QAAQ,EAAE,CAAC;KACZ;IACD;QACE,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC;QAC3F,SAAS,EAAE,UAAU;QACrB,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,2EAA2E;QACnF,QAAQ,EAAE,CAAC;KACZ;IACD;QACE,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC;QAC7F,SAAS,EAAE,YAAY;QACvB,KAAK,EAAE,0BAA0B;QACjC,MAAM,EAAE,yEAAyE;QACjF,QAAQ,EAAE,CAAC;KACZ;IACD;QACE,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,gBAAgB,CAAC;QAClH,SAAS,EAAE,UAAU;QACrB,KAAK,EAAE,wBAAwB;QAC/B,MAAM,EAAE,mFAAmF;QAC3F,QAAQ,EAAE,CAAC;KACZ;IACD;QACE,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;QACzG,SAAS,EAAE,WAAW;QACtB,KAAK,EAAE,0BAA0B;QACjC,MAAM,EAAE,wEAAwE;QAChF,QAAQ,EAAE,CAAC;KACZ;IACD;QACE,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,CAAC;QAC/F,SAAS,EAAE,WAAW;QACtB,KAAK,EAAE,iBAAiB;QACxB,MAAM,EAAE,oEAAoE;QAC5E,QAAQ,EAAE,CAAC;KACZ;IACD;QACE,QAAQ,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,CAAC;QAC/F,SAAS,EAAE,UAAU;QACrB,KAAK,EAAE,sBAAsB;QAC7B,MAAM,EAAE,sEAAsE;QAC9E,QAAQ,EAAE,CAAC;KACZ;IACD;QACE,QAAQ,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC;QACjG,SAAS,EAAE,UAAU;QACrB,KAAK,EAAE,kBAAkB;QACzB,MAAM,EAAE,wFAAwF;QAChG,QAAQ,EAAE,CAAC;KACZ;IACD;QACE,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,CAAC;QAC1F,SAAS,EAAE,YAAY;QACvB,KAAK,EAAE,gBAAgB;QACvB,MAAM,EAAE,yEAAyE;QACjF,QAAQ,EAAE,CAAC;KACZ;IACD;QACE,QAAQ,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,CAAC;QACnI,SAAS,EAAE,UAAU;QACrB,KAAK,EAAE,yBAAyB;QAChC,MAAM,EAAE,yFAAyF;QACjG,QAAQ,EAAE,CAAC;KACZ;CACF,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,IAAiB;IAC7C,MAAM,OAAO,GAAG;QACd,IAAI,CAAC,OAAO;QACZ,IAAI,CAAC,QAAQ,IAAI,EAAE;QACnB,IAAI,CAAC,mBAAmB,IAAI,EAAE;QAC9B,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;KAC3B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAE1B,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;YAAE,SAAS;QACxC,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC;gBACX,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC;YACX,SAAS,EAAE,UAAU;YACrB,KAAK,EAAE,sBAAsB;YAC7B,MAAM,EAAE,4EAA4E;YACpF,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IAED,4BAA4B;IAC5B,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC;QAC9D,IAAI,cAAc,KAAK,WAAW,IAAI,cAAc,KAAK,YAAY,EAAE,CAAC;YACtE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC;oBACX,SAAS,EAAE,UAAU;oBACrB,KAAK,EAAE,2BAA2B;oBAClC,MAAM,EAAE,sBAAsB,IAAI,CAAC,mBAAmB,8BAA8B;oBACpF,QAAQ,EAAE,CAAC;iBACZ,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAEhD,MAAM,KAAK,GAAG;QACZ,yBAAyB,OAAO,CAAC,MAAM,IAAI;QAC3C,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;IAE7F,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}