@muxoai/sdk 1.2.3 → 1.3.0

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 (183) hide show
  1. package/.agents/plugins/marketplace.json +22 -0
  2. package/.claude-plugin/marketplace.json +17 -0
  3. package/.codex/config.toml +5 -0
  4. package/ARCHITECTURE.md +111 -0
  5. package/README.md +21 -12
  6. package/dist/cli.d.ts +2 -0
  7. package/dist/cli.js +894 -0
  8. package/dist/config.d.ts +20 -0
  9. package/dist/config.js +89 -0
  10. package/dist/engine.d.ts +156 -0
  11. package/dist/engine.js +876 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.js +7 -0
  14. package/dist/mcp.d.ts +45 -0
  15. package/dist/mcp.js +914 -0
  16. package/dist/nl.d.ts +34 -0
  17. package/dist/nl.js +577 -0
  18. package/dist/providers/composio-instant.d.ts +14 -0
  19. package/dist/providers/composio-instant.js +814 -0
  20. package/dist/providers/composio-sdk.d.ts +41 -0
  21. package/dist/providers/composio-sdk.js +572 -0
  22. package/dist/providers/microsoft-governance.d.ts +66 -0
  23. package/dist/providers/microsoft-governance.js +415 -0
  24. package/dist/providers/stripe-billing.d.ts +41 -0
  25. package/dist/providers/stripe-billing.js +372 -0
  26. package/dist/providers/stripe-projects.d.ts +53 -0
  27. package/dist/providers/stripe-projects.js +636 -0
  28. package/dist/providers/supermemory.d.ts +64 -0
  29. package/dist/providers/supermemory.js +224 -0
  30. package/{index.d.ts → dist/sdk.d.ts} +77 -1
  31. package/dist/sdk.js +270 -0
  32. package/dist/server.d.ts +10 -0
  33. package/dist/server.js +1277 -0
  34. package/dist/store.d.ts +216 -0
  35. package/dist/store.js +1449 -0
  36. package/dist/types.d.ts +285 -0
  37. package/dist/types.js +1 -0
  38. package/dist/ui/console-html.d.ts +2 -0
  39. package/dist/ui/console-html.js +2343 -0
  40. package/package.json +66 -6
  41. package/plugins/muxo/.app.json +8 -0
  42. package/plugins/muxo/.claude-plugin/plugin.json +16 -0
  43. package/plugins/muxo/.codex-plugin/plugin.json +55 -0
  44. package/plugins/muxo/.mcp.json +40 -0
  45. package/plugins/muxo/assets/logo.png +0 -0
  46. package/plugins/muxo/assets/logo.svg +6 -0
  47. package/plugins/muxo/hooks/hooks.json +27 -0
  48. package/plugins/muxo/hooks/session-start.sh +85 -0
  49. package/plugins/muxo/hooks/user-prompt-submit.sh +45 -0
  50. package/plugins/muxo/mcp.json +38 -0
  51. package/plugins/muxo/plugin.json +59 -0
  52. package/plugins/muxo/skills/muxo/SKILL.md +25 -0
  53. package/plugins/muxo/skills/muxo/references/cli.md +57 -0
  54. package/plugins/muxo/skills/muxo/references/mcp.md +25 -0
  55. package/plugins/muxo/skills/setup/SKILL.md +28 -0
  56. package/src/catalogues/stripe-projects-catalog.json +9832 -0
  57. package/vendor/microsoft-governance/README.md +363 -0
  58. package/vendor/microsoft-governance/dist/audit.d.ts +26 -0
  59. package/vendor/microsoft-governance/dist/audit.d.ts.map +1 -0
  60. package/vendor/microsoft-governance/dist/audit.js +107 -0
  61. package/vendor/microsoft-governance/dist/audit.js.map +1 -0
  62. package/vendor/microsoft-governance/dist/cascade-containment.d.ts +84 -0
  63. package/vendor/microsoft-governance/dist/cascade-containment.d.ts.map +1 -0
  64. package/vendor/microsoft-governance/dist/cascade-containment.js +387 -0
  65. package/vendor/microsoft-governance/dist/cascade-containment.js.map +1 -0
  66. package/vendor/microsoft-governance/dist/client.d.ts +34 -0
  67. package/vendor/microsoft-governance/dist/client.d.ts.map +1 -0
  68. package/vendor/microsoft-governance/dist/client.js +112 -0
  69. package/vendor/microsoft-governance/dist/client.js.map +1 -0
  70. package/vendor/microsoft-governance/dist/context-poisoning.d.ts +58 -0
  71. package/vendor/microsoft-governance/dist/context-poisoning.d.ts.map +1 -0
  72. package/vendor/microsoft-governance/dist/context-poisoning.js +410 -0
  73. package/vendor/microsoft-governance/dist/context-poisoning.js.map +1 -0
  74. package/vendor/microsoft-governance/dist/credential-vault.d.ts +213 -0
  75. package/vendor/microsoft-governance/dist/credential-vault.d.ts.map +1 -0
  76. package/vendor/microsoft-governance/dist/credential-vault.js +567 -0
  77. package/vendor/microsoft-governance/dist/credential-vault.js.map +1 -0
  78. package/vendor/microsoft-governance/dist/discovery.d.ts +80 -0
  79. package/vendor/microsoft-governance/dist/discovery.d.ts.map +1 -0
  80. package/vendor/microsoft-governance/dist/discovery.js +404 -0
  81. package/vendor/microsoft-governance/dist/discovery.js.map +1 -0
  82. package/vendor/microsoft-governance/dist/encryption/channel.d.ts +29 -0
  83. package/vendor/microsoft-governance/dist/encryption/channel.d.ts.map +1 -0
  84. package/vendor/microsoft-governance/dist/encryption/channel.js +78 -0
  85. package/vendor/microsoft-governance/dist/encryption/channel.js.map +1 -0
  86. package/vendor/microsoft-governance/dist/encryption/index.d.ts +9 -0
  87. package/vendor/microsoft-governance/dist/encryption/index.d.ts.map +1 -0
  88. package/vendor/microsoft-governance/dist/encryption/index.js +23 -0
  89. package/vendor/microsoft-governance/dist/encryption/index.js.map +1 -0
  90. package/vendor/microsoft-governance/dist/encryption/mesh-client.d.ts +267 -0
  91. package/vendor/microsoft-governance/dist/encryption/mesh-client.d.ts.map +1 -0
  92. package/vendor/microsoft-governance/dist/encryption/mesh-client.js +1001 -0
  93. package/vendor/microsoft-governance/dist/encryption/mesh-client.js.map +1 -0
  94. package/vendor/microsoft-governance/dist/encryption/ratchet.d.ts +38 -0
  95. package/vendor/microsoft-governance/dist/encryption/ratchet.d.ts.map +1 -0
  96. package/vendor/microsoft-governance/dist/encryption/ratchet.js +223 -0
  97. package/vendor/microsoft-governance/dist/encryption/ratchet.js.map +1 -0
  98. package/vendor/microsoft-governance/dist/encryption/registry-client.d.ts +136 -0
  99. package/vendor/microsoft-governance/dist/encryption/registry-client.d.ts.map +1 -0
  100. package/vendor/microsoft-governance/dist/encryption/registry-client.js +369 -0
  101. package/vendor/microsoft-governance/dist/encryption/registry-client.js.map +1 -0
  102. package/vendor/microsoft-governance/dist/encryption/x3dh.d.ts +80 -0
  103. package/vendor/microsoft-governance/dist/encryption/x3dh.d.ts.map +1 -0
  104. package/vendor/microsoft-governance/dist/encryption/x3dh.js +238 -0
  105. package/vendor/microsoft-governance/dist/encryption/x3dh.js.map +1 -0
  106. package/vendor/microsoft-governance/dist/framework-adapter.d.ts +63 -0
  107. package/vendor/microsoft-governance/dist/framework-adapter.d.ts.map +1 -0
  108. package/vendor/microsoft-governance/dist/framework-adapter.js +253 -0
  109. package/vendor/microsoft-governance/dist/framework-adapter.js.map +1 -0
  110. package/vendor/microsoft-governance/dist/identity.d.ts +124 -0
  111. package/vendor/microsoft-governance/dist/identity.d.ts.map +1 -0
  112. package/vendor/microsoft-governance/dist/identity.js +446 -0
  113. package/vendor/microsoft-governance/dist/identity.js.map +1 -0
  114. package/vendor/microsoft-governance/dist/index.d.ts +39 -0
  115. package/vendor/microsoft-governance/dist/index.d.ts.map +1 -0
  116. package/vendor/microsoft-governance/dist/index.js +95 -0
  117. package/vendor/microsoft-governance/dist/index.js.map +1 -0
  118. package/vendor/microsoft-governance/dist/kill-switch.d.ts +22 -0
  119. package/vendor/microsoft-governance/dist/kill-switch.d.ts.map +1 -0
  120. package/vendor/microsoft-governance/dist/kill-switch.js +60 -0
  121. package/vendor/microsoft-governance/dist/kill-switch.js.map +1 -0
  122. package/vendor/microsoft-governance/dist/lifecycle.d.ts +50 -0
  123. package/vendor/microsoft-governance/dist/lifecycle.d.ts.map +1 -0
  124. package/vendor/microsoft-governance/dist/lifecycle.js +113 -0
  125. package/vendor/microsoft-governance/dist/lifecycle.js.map +1 -0
  126. package/vendor/microsoft-governance/dist/mcp.d.ts +41 -0
  127. package/vendor/microsoft-governance/dist/mcp.d.ts.map +1 -0
  128. package/vendor/microsoft-governance/dist/mcp.js +233 -0
  129. package/vendor/microsoft-governance/dist/mcp.js.map +1 -0
  130. package/vendor/microsoft-governance/dist/metrics.d.ts +123 -0
  131. package/vendor/microsoft-governance/dist/metrics.d.ts.map +1 -0
  132. package/vendor/microsoft-governance/dist/metrics.js +289 -0
  133. package/vendor/microsoft-governance/dist/metrics.js.map +1 -0
  134. package/vendor/microsoft-governance/dist/oci-manifest.d.ts +49 -0
  135. package/vendor/microsoft-governance/dist/oci-manifest.d.ts.map +1 -0
  136. package/vendor/microsoft-governance/dist/oci-manifest.js +182 -0
  137. package/vendor/microsoft-governance/dist/oci-manifest.js.map +1 -0
  138. package/vendor/microsoft-governance/dist/policy-backends/cedar.d.ts +15 -0
  139. package/vendor/microsoft-governance/dist/policy-backends/cedar.d.ts.map +1 -0
  140. package/vendor/microsoft-governance/dist/policy-backends/cedar.js +88 -0
  141. package/vendor/microsoft-governance/dist/policy-backends/cedar.js.map +1 -0
  142. package/vendor/microsoft-governance/dist/policy-backends/opa.d.ts +17 -0
  143. package/vendor/microsoft-governance/dist/policy-backends/opa.d.ts.map +1 -0
  144. package/vendor/microsoft-governance/dist/policy-backends/opa.js +74 -0
  145. package/vendor/microsoft-governance/dist/policy-backends/opa.js.map +1 -0
  146. package/vendor/microsoft-governance/dist/policy.d.ts +77 -0
  147. package/vendor/microsoft-governance/dist/policy.d.ts.map +1 -0
  148. package/vendor/microsoft-governance/dist/policy.js +760 -0
  149. package/vendor/microsoft-governance/dist/policy.js.map +1 -0
  150. package/vendor/microsoft-governance/dist/prompt-defense.d.ts +37 -0
  151. package/vendor/microsoft-governance/dist/prompt-defense.d.ts.map +1 -0
  152. package/vendor/microsoft-governance/dist/prompt-defense.js +229 -0
  153. package/vendor/microsoft-governance/dist/prompt-defense.js.map +1 -0
  154. package/vendor/microsoft-governance/dist/protocol-facets.d.ts +87 -0
  155. package/vendor/microsoft-governance/dist/protocol-facets.d.ts.map +1 -0
  156. package/vendor/microsoft-governance/dist/protocol-facets.js +728 -0
  157. package/vendor/microsoft-governance/dist/protocol-facets.js.map +1 -0
  158. package/vendor/microsoft-governance/dist/rings.d.ts +17 -0
  159. package/vendor/microsoft-governance/dist/rings.d.ts.map +1 -0
  160. package/vendor/microsoft-governance/dist/rings.js +61 -0
  161. package/vendor/microsoft-governance/dist/rings.js.map +1 -0
  162. package/vendor/microsoft-governance/dist/sandbox.d.ts +61 -0
  163. package/vendor/microsoft-governance/dist/sandbox.d.ts.map +1 -0
  164. package/vendor/microsoft-governance/dist/sandbox.js +199 -0
  165. package/vendor/microsoft-governance/dist/sandbox.js.map +1 -0
  166. package/vendor/microsoft-governance/dist/surface-parity.d.ts +45 -0
  167. package/vendor/microsoft-governance/dist/surface-parity.d.ts.map +1 -0
  168. package/vendor/microsoft-governance/dist/surface-parity.js +216 -0
  169. package/vendor/microsoft-governance/dist/surface-parity.js.map +1 -0
  170. package/vendor/microsoft-governance/dist/trust.d.ts +28 -0
  171. package/vendor/microsoft-governance/dist/trust.d.ts.map +1 -0
  172. package/vendor/microsoft-governance/dist/trust.js +209 -0
  173. package/vendor/microsoft-governance/dist/trust.js.map +1 -0
  174. package/vendor/microsoft-governance/dist/types.d.ts +422 -0
  175. package/vendor/microsoft-governance/dist/types.d.ts.map +1 -0
  176. package/vendor/microsoft-governance/dist/types.js +29 -0
  177. package/vendor/microsoft-governance/dist/types.js.map +1 -0
  178. package/vendor/microsoft-governance/dist/verify.d.ts +135 -0
  179. package/vendor/microsoft-governance/dist/verify.d.ts.map +1 -0
  180. package/vendor/microsoft-governance/dist/verify.js +356 -0
  181. package/vendor/microsoft-governance/dist/verify.js.map +1 -0
  182. package/vendor/microsoft-governance/package.json +64 -0
  183. package/index.js +0 -1
@@ -0,0 +1,415 @@
1
+ import crypto from "node:crypto";
2
+ import { AgentIdentity, AuditLogger, McpSecurityScanner, PolicyEngine, } from "../../vendor/microsoft-governance/dist/index.js";
3
+ const SDK_VERSION = "5.0.0";
4
+ const POLICY_ID = "muxo-microsoft-agent-governance-v5";
5
+ // PKCS#8 DER prefix for a 32-byte Ed25519 private key seed (OID 1.3.101.112)
6
+ const ED25519_PKCS8_PREFIX = Buffer.from([
7
+ 0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70,
8
+ 0x04, 0x22, 0x04, 0x20,
9
+ ]);
10
+ function deriveDeterministicIdentity(seedMaterial, agentId, capabilities, opts) {
11
+ const rawSeed = crypto
12
+ .createHmac("sha256", seedMaterial)
13
+ .update(`muxo-ed25519-agent-identity:${agentId}`)
14
+ .digest();
15
+ const pkcs8Der = Buffer.concat([ED25519_PKCS8_PREFIX, rawSeed]);
16
+ const privateKeyObj = crypto.createPrivateKey({
17
+ key: pkcs8Der,
18
+ format: "der",
19
+ type: "pkcs8",
20
+ });
21
+ const publicKeyObj = crypto.createPublicKey(privateKeyObj);
22
+ const pubDer = Buffer.from(publicKeyObj.export({ type: "spki", format: "der" }));
23
+ const privDer = Buffer.from(privateKeyObj.export({ type: "pkcs8", format: "der" }));
24
+ const fingerprint = crypto
25
+ .createHash("sha256")
26
+ .update(pubDer)
27
+ .digest("hex")
28
+ .slice(0, 16);
29
+ const did = `did:agentmesh:${agentId}:${fingerprint}`;
30
+ return AgentIdentity.fromJSON({
31
+ did,
32
+ publicKey: pubDer.toString("base64"),
33
+ privateKey: privDer.toString("base64"),
34
+ capabilities,
35
+ name: opts.name || agentId,
36
+ organization: opts.organization || "muxo.ai",
37
+ createdAt: opts.createdAt || new Date().toISOString(),
38
+ });
39
+ }
40
+ export class MicrosoftGovernanceAdapter {
41
+ scanner;
42
+ seedMaterial;
43
+ auditLoggers = new Map();
44
+ identities = new Map();
45
+ defaultIdentity;
46
+ constructor(seed) {
47
+ this.scanner = new McpSecurityScanner();
48
+ this.seedMaterial = Buffer.isBuffer(seed)
49
+ ? seed
50
+ : Buffer.from(String(seed ||
51
+ process.env.MUXO_VAULT_SECRET ||
52
+ process.env.COMPOSIO_API_KEY ||
53
+ "muxo-governance-ed25519-seed-v5"), "utf8");
54
+ this.defaultIdentity = deriveDeterministicIdentity(this.seedMaterial, "muxo-control-plane", [
55
+ "instant.*",
56
+ "app.*",
57
+ "resource.*",
58
+ "mcp.execute",
59
+ "governance.verify",
60
+ ], {
61
+ name: "Muxo Control Plane Agent",
62
+ organization: "muxo.ai",
63
+ });
64
+ }
65
+ /**
66
+ * Returns (or deterministically derives) the Ed25519 AgentIdentity (`did:agentmesh:...`) for a workspace.
67
+ */
68
+ getWorkspaceIdentity(workspace) {
69
+ let identity = this.identities.get(workspace.id);
70
+ if (!identity) {
71
+ identity = deriveDeterministicIdentity(this.seedMaterial, `muxo-workspace-${workspace.slug || workspace.id}`, [
72
+ "instant.*",
73
+ "app.*",
74
+ "resource.*",
75
+ "mcp.execute",
76
+ "governance.verify",
77
+ ], {
78
+ name: `${workspace.name} Agent Boundary`,
79
+ organization: workspace.id,
80
+ createdAt: workspace.createdAt,
81
+ });
82
+ this.identities.set(workspace.id, identity);
83
+ }
84
+ return identity;
85
+ }
86
+ /**
87
+ * Returns (or lazily initializes) the SHA-256 hash-chained AuditLogger for a workspace.
88
+ */
89
+ getWorkspaceAuditLogger(workspaceId) {
90
+ let logger = this.auditLoggers.get(workspaceId);
91
+ if (!logger) {
92
+ logger = new AuditLogger();
93
+ this.auditLoggers.set(workspaceId, logger);
94
+ }
95
+ return logger;
96
+ }
97
+ /**
98
+ * Compiles the workspace's GovernancePolicy into a declarative Microsoft PolicyEngine instance.
99
+ */
100
+ createPolicyEngine(policy) {
101
+ const engine = new PolicyEngine();
102
+ const rules = [];
103
+ for (const blockedSlug of policy.blockedToolSlugs || []) {
104
+ const normalized = blockedSlug.trim();
105
+ if (!normalized)
106
+ continue;
107
+ rules.push({
108
+ name: `deny-blocked-tool-${normalized.replace(/[^a-zA-Z0-9_-]/g, "_")}`,
109
+ ruleAction: "deny",
110
+ priority: 100,
111
+ condition: {
112
+ tool_slug: normalized,
113
+ },
114
+ });
115
+ }
116
+ if (policy.mode === "enforce") {
117
+ for (const risk of policy.requireApprovalFor || []) {
118
+ rules.push({
119
+ name: `require-owner-approval-for-${risk}`,
120
+ ruleAction: "require_approval",
121
+ priority: 80,
122
+ condition: {
123
+ risk_level: risk,
124
+ owner_approved: false,
125
+ },
126
+ });
127
+ }
128
+ }
129
+ rules.push({
130
+ name: "allow-governed-action",
131
+ ruleAction: "allow",
132
+ priority: 10,
133
+ condition: {
134
+ workspace_active: true,
135
+ },
136
+ });
137
+ engine.loadJson(JSON.stringify({
138
+ apiVersion: "governance.toolkit/v1",
139
+ name: POLICY_ID,
140
+ version: "5.0.0",
141
+ description: "Muxo Unified Execution Boundary Policy",
142
+ scope: "tenant",
143
+ default_action: "deny",
144
+ rules,
145
+ }));
146
+ return engine;
147
+ }
148
+ /**
149
+ * Runs the full Microsoft Agent Governance pipeline:
150
+ * Agent ──► McpSecurityScanner ──► PolicyEngine ──► AgentIdentity (Ed25519 DID) ──► AuditLogger ──► DecisionRecord
151
+ */
152
+ evaluateAction(params) {
153
+ const { workspace, actorId, tool, input, reason, stage } = params;
154
+ const ownerApproved = Boolean(params.ownerApproved);
155
+ const decidedAt = new Date().toISOString();
156
+ // 1. McpSecurityScanner: inspect tool definition + input arguments for prompt injection / exfiltration
157
+ const serializedInput = JSON.stringify(input || {});
158
+ const scanResult = this.scanner.scan({
159
+ name: tool.slug,
160
+ description: `${tool.description}\nReason: ${reason}\nArgs: ${serializedInput}`,
161
+ parameters: tool.inputSchema,
162
+ });
163
+ const extraFindings = (scanResult.threats || []).map((t) => ({
164
+ category: String(t.type || "mcp_scan"),
165
+ severity: String(t.severity || "medium"),
166
+ description: String(t.description || "Security scanner finding"),
167
+ }));
168
+ // Additional argument-level prompt-injection / secret-exfiltration heuristics
169
+ const suspiciousPatterns = [
170
+ {
171
+ regex: /ignore\s+(all\s+)?previous\s+instructions/i,
172
+ category: "prompt_injection",
173
+ severity: "high",
174
+ description: "Detected prompt injection override phrase in tool arguments or reason",
175
+ },
176
+ {
177
+ regex: /(cat|curl|wget)\s+.*(\/etc\/passwd|\.env|id_rsa|AWS_SECRET_ACCESS_KEY)/i,
178
+ category: "credential_exfiltration",
179
+ severity: "high",
180
+ description: "Detected credential or sensitive file exfiltration pattern in arguments",
181
+ },
182
+ ];
183
+ for (const pat of suspiciousPatterns) {
184
+ if (pat.regex.test(serializedInput) || pat.regex.test(reason)) {
185
+ extraFindings.push({
186
+ category: pat.category,
187
+ severity: pat.severity,
188
+ description: pat.description,
189
+ });
190
+ }
191
+ }
192
+ const highSeverityFinding = extraFindings.some((f) => f.severity === "high" || f.severity === "critical");
193
+ // 2. PolicyEngine: evaluate declarative rules against tool slug, risk level, and approval state
194
+ const policy = workspace.policy;
195
+ const policyEngine = this.createPolicyEngine(policy);
196
+ const identity = this.getWorkspaceIdentity(workspace);
197
+ const policyDecision = policyEngine.evaluatePolicy(identity.did, {
198
+ tool_slug: tool.slug,
199
+ risk_level: tool.riskLevel,
200
+ lane: tool.lane,
201
+ stage,
202
+ owner_approved: ownerApproved,
203
+ workspace_active: true,
204
+ });
205
+ let finalDecision = policyDecision.action === "deny"
206
+ ? "deny"
207
+ : policyDecision.action === "require_approval"
208
+ ? "require_approval"
209
+ : "allow";
210
+ // Block explicitly blocked tools even in monitor mode, or high-severity injection findings in enforce mode
211
+ if ((policy.blockedToolSlugs || []).includes(tool.slug) ||
212
+ (highSeverityFinding && policy.mode === "enforce")) {
213
+ finalDecision = "deny";
214
+ }
215
+ // 3. AuditLogger: append tamper-evident SHA-256 hash-chained log entry
216
+ const auditLogger = this.getWorkspaceAuditLogger(workspace.id);
217
+ const auditDecision = finalDecision === "deny" ? "deny" : "allow";
218
+ const auditEntry = auditLogger.log({
219
+ agentId: identity.did,
220
+ action: `${stage}.${tool.riskLevel}:${tool.slug}`,
221
+ decision: auditDecision,
222
+ skillAuditMetadata: {
223
+ skillName: tool.slug,
224
+ skillOrigin: tool.lane,
225
+ provenanceSourceTrust: "trusted",
226
+ },
227
+ });
228
+ const chainVerified = auditLogger.verify();
229
+ // 4. AgentIdentity (Ed25519 DID): cryptographically sign the decision record
230
+ const bindingHash = crypto
231
+ .createHash("sha256")
232
+ .update(JSON.stringify({
233
+ workspaceId: workspace.id,
234
+ actorId,
235
+ toolSlug: tool.slug,
236
+ riskLevel: tool.riskLevel,
237
+ stage,
238
+ input,
239
+ finalDecision,
240
+ auditHash: auditEntry.hash,
241
+ decidedAt,
242
+ }))
243
+ .digest("hex");
244
+ const signaturePayload = [
245
+ POLICY_ID,
246
+ identity.did,
247
+ workspace.id,
248
+ actorId,
249
+ tool.slug,
250
+ tool.riskLevel,
251
+ finalDecision,
252
+ auditEntry.hash,
253
+ auditEntry.previousHash,
254
+ bindingHash,
255
+ decidedAt,
256
+ ].join("|");
257
+ const sigBytes = identity.sign(Buffer.from(signaturePayload, "utf8"));
258
+ const ed25519Signature = Buffer.from(sigBytes).toString("hex");
259
+ const publicKeyHex = Buffer.from(identity.publicKey).toString("hex");
260
+ const verdict = finalDecision === "require_approval" ? "escalate" : finalDecision;
261
+ const decisionReason = finalDecision === "deny"
262
+ ? highSeverityFinding
263
+ ? `Blocked by McpSecurityScanner: ${extraFindings.map((f) => f.description).join("; ")}`
264
+ : `Denied by policy rule ${policyDecision.matchedRule || "default"}`
265
+ : finalDecision === "require_approval"
266
+ ? `Escalated for human owner approval (${tool.riskLevel} risk lane)`
267
+ : `Allowed by Microsoft Agent Governance (${policyDecision.matchedRule || "allow-governed-action"})`;
268
+ return {
269
+ id: `dec_${crypto.randomBytes(8).toString("hex")}`,
270
+ sdk: "@microsoft/agent-governance-sdk",
271
+ sdkVersion: SDK_VERSION,
272
+ policyId: POLICY_ID,
273
+ mode: policy.mode,
274
+ agentDid: identity.did,
275
+ agentPublicKey: publicKeyHex,
276
+ actorId,
277
+ workspaceId: workspace.id,
278
+ action: `${stage}.${tool.riskLevel}:${tool.slug}`,
279
+ riskLevel: tool.riskLevel,
280
+ decision: finalDecision,
281
+ verdict,
282
+ reason: decisionReason,
283
+ matchedRule: policyDecision.matchedRule ?? null,
284
+ securityScan: {
285
+ safe: scanResult.safe && !highSeverityFinding,
286
+ riskLevel: highSeverityFinding
287
+ ? "high"
288
+ : scanResult.risk_score > 50
289
+ ? "medium"
290
+ : "low",
291
+ findingsCount: extraFindings.length,
292
+ findings: extraFindings,
293
+ },
294
+ auditEntry: {
295
+ timestamp: auditEntry.timestamp,
296
+ agentId: auditEntry.agentId,
297
+ action: auditEntry.action,
298
+ decision: auditDecision,
299
+ hash: auditEntry.hash,
300
+ previousHash: auditEntry.previousHash,
301
+ chainVerified,
302
+ },
303
+ ed25519Signature,
304
+ signature: ed25519Signature,
305
+ bindingHash,
306
+ decidedAt,
307
+ };
308
+ }
309
+ evaluatePlan(params) {
310
+ return this.evaluateAction({
311
+ ...params,
312
+ stage: "plan",
313
+ });
314
+ }
315
+ evaluateExecution(params) {
316
+ return this.evaluateAction({
317
+ workspace: params.workspace,
318
+ actorId: params.actorId,
319
+ tool: params.tool,
320
+ input: params.plan.input,
321
+ reason: params.plan.reason,
322
+ stage: "execute",
323
+ ownerApproved: params.plan.approvalStatus === "approved" ||
324
+ params.plan.approvalStatus === "auto_approved",
325
+ });
326
+ }
327
+ /**
328
+ * Verifies a DecisionRecord's Ed25519 signature and the workspace's SHA-256 audit hash chain.
329
+ */
330
+ verifyDecisionRecord(workspaceOrRecord, maybeRecord) {
331
+ const record = maybeRecord || workspaceOrRecord;
332
+ const workspace = maybeRecord ? workspaceOrRecord : undefined;
333
+ const identity = workspace
334
+ ? this.getWorkspaceIdentity(workspace)
335
+ : this.identities.get(record.workspaceId) || this.defaultIdentity;
336
+ const stagePrefix = record.action.split(":")[0] || "";
337
+ const toolSlug = record.action.slice(stagePrefix.length + 1);
338
+ const signaturePayload = [
339
+ record.policyId,
340
+ record.agentDid,
341
+ record.workspaceId,
342
+ record.actorId,
343
+ toolSlug,
344
+ record.riskLevel,
345
+ record.decision,
346
+ record.auditEntry.hash,
347
+ record.auditEntry.previousHash,
348
+ record.bindingHash,
349
+ record.decidedAt,
350
+ ].join("|");
351
+ let ed25519Verified = false;
352
+ try {
353
+ if (identity.did === record.agentDid) {
354
+ ed25519Verified = identity.verify(Buffer.from(signaturePayload, "utf8"), Buffer.from(record.ed25519Signature, "hex"));
355
+ }
356
+ else if (record.agentPublicKey && record.ed25519Signature) {
357
+ const pubKeyObj = crypto.createPublicKey({
358
+ key: Buffer.from(record.agentPublicKey, "hex"),
359
+ format: "der",
360
+ type: "spki",
361
+ });
362
+ ed25519Verified = crypto.verify(null, Buffer.from(signaturePayload, "utf8"), pubKeyObj, Buffer.from(record.ed25519Signature, "hex"));
363
+ }
364
+ }
365
+ catch {
366
+ ed25519Verified = false;
367
+ }
368
+ const auditLogger = this.getWorkspaceAuditLogger(record.workspaceId);
369
+ const auditChainVerified = auditLogger.verify();
370
+ return ed25519Verified && auditChainVerified;
371
+ }
372
+ getStatus(workspace) {
373
+ const identity = workspace
374
+ ? this.getWorkspaceIdentity(workspace)
375
+ : this.identities.values().next().value || this.defaultIdentity;
376
+ let totalEntries = 0;
377
+ let allVerified = true;
378
+ for (const logger of this.auditLoggers.values()) {
379
+ totalEntries += logger.length;
380
+ if (!logger.verify())
381
+ allVerified = false;
382
+ }
383
+ return {
384
+ sdk: "@microsoft/agent-governance-sdk",
385
+ sdkVersion: SDK_VERSION,
386
+ policyId: POLICY_ID,
387
+ pipeline: "Agent ──► McpSecurityScanner ──► PolicyEngine ──► AgentIdentity (Ed25519 DID) ──► AuditLogger ──► DecisionRecord",
388
+ agentDid: identity.did,
389
+ publicKeyHex: Buffer.from(identity.publicKey).toString("hex"),
390
+ auditEntriesCount: totalEntries,
391
+ auditChainIntegrity: allVerified,
392
+ };
393
+ }
394
+ /**
395
+ * Returns a live governance status report for a workspace.
396
+ */
397
+ getGovernanceStatus(workspace) {
398
+ const identity = this.getWorkspaceIdentity(workspace);
399
+ const auditLogger = this.getWorkspaceAuditLogger(workspace.id);
400
+ const entries = auditLogger.getEntries();
401
+ return {
402
+ sdk: "@microsoft/agent-governance-sdk",
403
+ sdkVersion: SDK_VERSION,
404
+ policyId: POLICY_ID,
405
+ pipeline: "Agent ──► McpSecurityScanner ──► PolicyEngine ──► AgentIdentity (Ed25519 DID) ──► AuditLogger ──► DecisionRecord",
406
+ agentIdentity: identity.toJSON(),
407
+ policy: workspace.policy,
408
+ auditChain: {
409
+ entriesCount: entries.length,
410
+ chainVerified: auditLogger.verify(),
411
+ recentEntries: entries.slice(-15).reverse(),
412
+ },
413
+ };
414
+ }
415
+ }
@@ -0,0 +1,41 @@
1
+ import type { MuxoConfig } from "../config.js";
2
+ import type { MuxoStore } from "../store.js";
3
+ import type { ToolDescriptor, Workspace } from "../types.js";
4
+ export declare class StripeBillingAdapter {
5
+ private readonly config;
6
+ private readonly store;
7
+ private resolvedStarterPriceId;
8
+ private resolvedCreditsPriceId;
9
+ constructor(config: MuxoConfig, store: MuxoStore);
10
+ private getEffectiveStripeKey;
11
+ get isConfigured(): boolean;
12
+ listTools(): ToolDescriptor[];
13
+ private stripeRequest;
14
+ ensurePrices(workspaceId?: string): Promise<{
15
+ starterPriceId: string;
16
+ creditsPriceId: string;
17
+ }>;
18
+ createCheckoutSession(params: {
19
+ workspace: Workspace;
20
+ customerEmail: string;
21
+ kind: "starter_subscription" | "credit_topup";
22
+ credits?: number;
23
+ returnBaseUrl?: string;
24
+ }): Promise<{
25
+ sessionId: string;
26
+ url: string;
27
+ mode: "stripe_live" | "muxo_instant_checkout";
28
+ }>;
29
+ verifyAndFulfillCheckoutSession(sessionId: string, fallbackWorkspaceId?: string, fallbackKind?: "starter_subscription" | "credit_topup"): Promise<{
30
+ fulfilled: boolean;
31
+ workspace: Workspace | null;
32
+ kind: string;
33
+ }>;
34
+ executeTool(params: {
35
+ workspace: Workspace;
36
+ customerEmail: string;
37
+ toolSlug: string;
38
+ input: Record<string, unknown>;
39
+ }): Promise<Record<string, unknown>>;
40
+ verifyWebhookSignature(rawBody: string, signatureHeader: string): boolean;
41
+ }