@muxoai/platform 0.0.0-stage → 1.2.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 (173) hide show
  1. package/ARCHITECTURE.md +111 -0
  2. package/README.md +53 -2
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +527 -0
  5. package/dist/config.d.ts +20 -0
  6. package/dist/config.js +89 -0
  7. package/dist/engine.d.ts +128 -0
  8. package/dist/engine.js +709 -0
  9. package/dist/index.d.ts +7 -0
  10. package/dist/index.js +7 -0
  11. package/dist/mcp.d.ts +9 -0
  12. package/dist/mcp.js +401 -0
  13. package/dist/providers/composio-instant.d.ts +14 -0
  14. package/dist/providers/composio-instant.js +372 -0
  15. package/dist/providers/composio-sdk.d.ts +41 -0
  16. package/dist/providers/composio-sdk.js +514 -0
  17. package/dist/providers/microsoft-governance.d.ts +66 -0
  18. package/dist/providers/microsoft-governance.js +415 -0
  19. package/dist/providers/stripe-billing.d.ts +31 -0
  20. package/dist/providers/stripe-billing.js +168 -0
  21. package/dist/providers/stripe-projects.d.ts +53 -0
  22. package/dist/providers/stripe-projects.js +607 -0
  23. package/dist/providers/supermemory.d.ts +64 -0
  24. package/dist/providers/supermemory.js +224 -0
  25. package/dist/sdk.d.ts +115 -0
  26. package/dist/sdk.js +117 -0
  27. package/dist/server.d.ts +10 -0
  28. package/dist/server.js +816 -0
  29. package/dist/store.d.ts +200 -0
  30. package/dist/store.js +1260 -0
  31. package/dist/types.d.ts +273 -0
  32. package/dist/types.js +1 -0
  33. package/dist/ui/console-html.d.ts +2 -0
  34. package/dist/ui/console-html.js +2153 -0
  35. package/package.json +74 -4
  36. package/plugins/muxo/.app.json +8 -0
  37. package/plugins/muxo/.claude-plugin/plugin.json +16 -0
  38. package/plugins/muxo/.codex-plugin/plugin.json +51 -0
  39. package/plugins/muxo/.mcp.json +8 -0
  40. package/plugins/muxo/assets/logo.png +0 -0
  41. package/plugins/muxo/assets/logo.svg +6 -0
  42. package/plugins/muxo/hooks/hooks.json +27 -0
  43. package/plugins/muxo/hooks/session-start.sh +85 -0
  44. package/plugins/muxo/hooks/user-prompt-submit.sh +45 -0
  45. package/plugins/muxo/skills/muxo/SKILL.md +25 -0
  46. package/plugins/muxo/skills/muxo/references/cli.md +57 -0
  47. package/plugins/muxo/skills/muxo/references/mcp.md +25 -0
  48. package/src/catalogues/stripe-projects-catalog.json +9832 -0
  49. package/vendor/microsoft-governance/README.md +363 -0
  50. package/vendor/microsoft-governance/dist/audit.d.ts +26 -0
  51. package/vendor/microsoft-governance/dist/audit.d.ts.map +1 -0
  52. package/vendor/microsoft-governance/dist/audit.js +107 -0
  53. package/vendor/microsoft-governance/dist/audit.js.map +1 -0
  54. package/vendor/microsoft-governance/dist/cascade-containment.d.ts +84 -0
  55. package/vendor/microsoft-governance/dist/cascade-containment.d.ts.map +1 -0
  56. package/vendor/microsoft-governance/dist/cascade-containment.js +387 -0
  57. package/vendor/microsoft-governance/dist/cascade-containment.js.map +1 -0
  58. package/vendor/microsoft-governance/dist/client.d.ts +34 -0
  59. package/vendor/microsoft-governance/dist/client.d.ts.map +1 -0
  60. package/vendor/microsoft-governance/dist/client.js +112 -0
  61. package/vendor/microsoft-governance/dist/client.js.map +1 -0
  62. package/vendor/microsoft-governance/dist/context-poisoning.d.ts +58 -0
  63. package/vendor/microsoft-governance/dist/context-poisoning.d.ts.map +1 -0
  64. package/vendor/microsoft-governance/dist/context-poisoning.js +410 -0
  65. package/vendor/microsoft-governance/dist/context-poisoning.js.map +1 -0
  66. package/vendor/microsoft-governance/dist/credential-vault.d.ts +213 -0
  67. package/vendor/microsoft-governance/dist/credential-vault.d.ts.map +1 -0
  68. package/vendor/microsoft-governance/dist/credential-vault.js +567 -0
  69. package/vendor/microsoft-governance/dist/credential-vault.js.map +1 -0
  70. package/vendor/microsoft-governance/dist/discovery.d.ts +80 -0
  71. package/vendor/microsoft-governance/dist/discovery.d.ts.map +1 -0
  72. package/vendor/microsoft-governance/dist/discovery.js +404 -0
  73. package/vendor/microsoft-governance/dist/discovery.js.map +1 -0
  74. package/vendor/microsoft-governance/dist/encryption/channel.d.ts +29 -0
  75. package/vendor/microsoft-governance/dist/encryption/channel.d.ts.map +1 -0
  76. package/vendor/microsoft-governance/dist/encryption/channel.js +78 -0
  77. package/vendor/microsoft-governance/dist/encryption/channel.js.map +1 -0
  78. package/vendor/microsoft-governance/dist/encryption/index.d.ts +9 -0
  79. package/vendor/microsoft-governance/dist/encryption/index.d.ts.map +1 -0
  80. package/vendor/microsoft-governance/dist/encryption/index.js +23 -0
  81. package/vendor/microsoft-governance/dist/encryption/index.js.map +1 -0
  82. package/vendor/microsoft-governance/dist/encryption/mesh-client.d.ts +267 -0
  83. package/vendor/microsoft-governance/dist/encryption/mesh-client.d.ts.map +1 -0
  84. package/vendor/microsoft-governance/dist/encryption/mesh-client.js +1001 -0
  85. package/vendor/microsoft-governance/dist/encryption/mesh-client.js.map +1 -0
  86. package/vendor/microsoft-governance/dist/encryption/ratchet.d.ts +38 -0
  87. package/vendor/microsoft-governance/dist/encryption/ratchet.d.ts.map +1 -0
  88. package/vendor/microsoft-governance/dist/encryption/ratchet.js +223 -0
  89. package/vendor/microsoft-governance/dist/encryption/ratchet.js.map +1 -0
  90. package/vendor/microsoft-governance/dist/encryption/registry-client.d.ts +136 -0
  91. package/vendor/microsoft-governance/dist/encryption/registry-client.d.ts.map +1 -0
  92. package/vendor/microsoft-governance/dist/encryption/registry-client.js +369 -0
  93. package/vendor/microsoft-governance/dist/encryption/registry-client.js.map +1 -0
  94. package/vendor/microsoft-governance/dist/encryption/x3dh.d.ts +80 -0
  95. package/vendor/microsoft-governance/dist/encryption/x3dh.d.ts.map +1 -0
  96. package/vendor/microsoft-governance/dist/encryption/x3dh.js +238 -0
  97. package/vendor/microsoft-governance/dist/encryption/x3dh.js.map +1 -0
  98. package/vendor/microsoft-governance/dist/framework-adapter.d.ts +63 -0
  99. package/vendor/microsoft-governance/dist/framework-adapter.d.ts.map +1 -0
  100. package/vendor/microsoft-governance/dist/framework-adapter.js +253 -0
  101. package/vendor/microsoft-governance/dist/framework-adapter.js.map +1 -0
  102. package/vendor/microsoft-governance/dist/identity.d.ts +124 -0
  103. package/vendor/microsoft-governance/dist/identity.d.ts.map +1 -0
  104. package/vendor/microsoft-governance/dist/identity.js +446 -0
  105. package/vendor/microsoft-governance/dist/identity.js.map +1 -0
  106. package/vendor/microsoft-governance/dist/index.d.ts +39 -0
  107. package/vendor/microsoft-governance/dist/index.d.ts.map +1 -0
  108. package/vendor/microsoft-governance/dist/index.js +95 -0
  109. package/vendor/microsoft-governance/dist/index.js.map +1 -0
  110. package/vendor/microsoft-governance/dist/kill-switch.d.ts +22 -0
  111. package/vendor/microsoft-governance/dist/kill-switch.d.ts.map +1 -0
  112. package/vendor/microsoft-governance/dist/kill-switch.js +60 -0
  113. package/vendor/microsoft-governance/dist/kill-switch.js.map +1 -0
  114. package/vendor/microsoft-governance/dist/lifecycle.d.ts +50 -0
  115. package/vendor/microsoft-governance/dist/lifecycle.d.ts.map +1 -0
  116. package/vendor/microsoft-governance/dist/lifecycle.js +113 -0
  117. package/vendor/microsoft-governance/dist/lifecycle.js.map +1 -0
  118. package/vendor/microsoft-governance/dist/mcp.d.ts +41 -0
  119. package/vendor/microsoft-governance/dist/mcp.d.ts.map +1 -0
  120. package/vendor/microsoft-governance/dist/mcp.js +233 -0
  121. package/vendor/microsoft-governance/dist/mcp.js.map +1 -0
  122. package/vendor/microsoft-governance/dist/metrics.d.ts +123 -0
  123. package/vendor/microsoft-governance/dist/metrics.d.ts.map +1 -0
  124. package/vendor/microsoft-governance/dist/metrics.js +289 -0
  125. package/vendor/microsoft-governance/dist/metrics.js.map +1 -0
  126. package/vendor/microsoft-governance/dist/oci-manifest.d.ts +49 -0
  127. package/vendor/microsoft-governance/dist/oci-manifest.d.ts.map +1 -0
  128. package/vendor/microsoft-governance/dist/oci-manifest.js +182 -0
  129. package/vendor/microsoft-governance/dist/oci-manifest.js.map +1 -0
  130. package/vendor/microsoft-governance/dist/policy-backends/cedar.d.ts +15 -0
  131. package/vendor/microsoft-governance/dist/policy-backends/cedar.d.ts.map +1 -0
  132. package/vendor/microsoft-governance/dist/policy-backends/cedar.js +88 -0
  133. package/vendor/microsoft-governance/dist/policy-backends/cedar.js.map +1 -0
  134. package/vendor/microsoft-governance/dist/policy-backends/opa.d.ts +17 -0
  135. package/vendor/microsoft-governance/dist/policy-backends/opa.d.ts.map +1 -0
  136. package/vendor/microsoft-governance/dist/policy-backends/opa.js +74 -0
  137. package/vendor/microsoft-governance/dist/policy-backends/opa.js.map +1 -0
  138. package/vendor/microsoft-governance/dist/policy.d.ts +77 -0
  139. package/vendor/microsoft-governance/dist/policy.d.ts.map +1 -0
  140. package/vendor/microsoft-governance/dist/policy.js +760 -0
  141. package/vendor/microsoft-governance/dist/policy.js.map +1 -0
  142. package/vendor/microsoft-governance/dist/prompt-defense.d.ts +37 -0
  143. package/vendor/microsoft-governance/dist/prompt-defense.d.ts.map +1 -0
  144. package/vendor/microsoft-governance/dist/prompt-defense.js +229 -0
  145. package/vendor/microsoft-governance/dist/prompt-defense.js.map +1 -0
  146. package/vendor/microsoft-governance/dist/protocol-facets.d.ts +87 -0
  147. package/vendor/microsoft-governance/dist/protocol-facets.d.ts.map +1 -0
  148. package/vendor/microsoft-governance/dist/protocol-facets.js +728 -0
  149. package/vendor/microsoft-governance/dist/protocol-facets.js.map +1 -0
  150. package/vendor/microsoft-governance/dist/rings.d.ts +17 -0
  151. package/vendor/microsoft-governance/dist/rings.d.ts.map +1 -0
  152. package/vendor/microsoft-governance/dist/rings.js +61 -0
  153. package/vendor/microsoft-governance/dist/rings.js.map +1 -0
  154. package/vendor/microsoft-governance/dist/sandbox.d.ts +61 -0
  155. package/vendor/microsoft-governance/dist/sandbox.d.ts.map +1 -0
  156. package/vendor/microsoft-governance/dist/sandbox.js +199 -0
  157. package/vendor/microsoft-governance/dist/sandbox.js.map +1 -0
  158. package/vendor/microsoft-governance/dist/surface-parity.d.ts +45 -0
  159. package/vendor/microsoft-governance/dist/surface-parity.d.ts.map +1 -0
  160. package/vendor/microsoft-governance/dist/surface-parity.js +216 -0
  161. package/vendor/microsoft-governance/dist/surface-parity.js.map +1 -0
  162. package/vendor/microsoft-governance/dist/trust.d.ts +28 -0
  163. package/vendor/microsoft-governance/dist/trust.d.ts.map +1 -0
  164. package/vendor/microsoft-governance/dist/trust.js +209 -0
  165. package/vendor/microsoft-governance/dist/trust.js.map +1 -0
  166. package/vendor/microsoft-governance/dist/types.d.ts +422 -0
  167. package/vendor/microsoft-governance/dist/types.d.ts.map +1 -0
  168. package/vendor/microsoft-governance/dist/types.js +29 -0
  169. package/vendor/microsoft-governance/dist/types.js.map +1 -0
  170. package/vendor/microsoft-governance/dist/verify.d.ts +135 -0
  171. package/vendor/microsoft-governance/dist/verify.d.ts.map +1 -0
  172. package/vendor/microsoft-governance/dist/verify.js +356 -0
  173. package/vendor/microsoft-governance/dist/verify.js.map +1 -0
@@ -0,0 +1,514 @@
1
+ const CURATED_APP_TOOLS = [
2
+ {
3
+ slug: "app.github.create_issue",
4
+ upstreamSlug: "GITHUB_CREATE_AN_ISSUE",
5
+ name: "GitHub: Create Issue",
6
+ description: "Create a new issue in a GitHub repository using the workspace's connected GitHub account.",
7
+ lane: "composio_sdk",
8
+ providerSlug: "github",
9
+ providerName: "GitHub",
10
+ categories: ["developer_tools", "version_control"],
11
+ riskLevel: "write",
12
+ requiresAuth: true,
13
+ creditCost: 0,
14
+ billingMode: "customer_oauth",
15
+ inputSchema: {
16
+ type: "object",
17
+ required: ["owner", "repo", "title"],
18
+ properties: {
19
+ owner: { type: "string", description: "Repository owner or organization" },
20
+ repo: { type: "string", description: "Repository name" },
21
+ title: { type: "string", description: "Issue title" },
22
+ body: { type: "string", description: "Issue body in Markdown" },
23
+ },
24
+ },
25
+ },
26
+ {
27
+ slug: "app.github.list_pull_requests",
28
+ upstreamSlug: "GITHUB_LIST_PULL_REQUESTS",
29
+ name: "GitHub: List Pull Requests",
30
+ description: "List pull requests in a repository with state and branch filters.",
31
+ lane: "composio_sdk",
32
+ providerSlug: "github",
33
+ providerName: "GitHub",
34
+ categories: ["developer_tools", "version_control"],
35
+ riskLevel: "read",
36
+ requiresAuth: true,
37
+ creditCost: 0,
38
+ billingMode: "customer_oauth",
39
+ inputSchema: {
40
+ type: "object",
41
+ required: ["owner", "repo"],
42
+ properties: {
43
+ owner: { type: "string", description: "Repository owner" },
44
+ repo: { type: "string", description: "Repository name" },
45
+ state: { type: "string", enum: ["open", "closed", "all"], default: "open" },
46
+ },
47
+ },
48
+ },
49
+ {
50
+ slug: "app.gmail.send_email",
51
+ upstreamSlug: "GMAIL_SEND_EMAIL",
52
+ name: "Gmail: Send Email",
53
+ description: "Send an email through the workspace's connected Gmail account.",
54
+ lane: "composio_sdk",
55
+ providerSlug: "gmail",
56
+ providerName: "Gmail",
57
+ categories: ["email", "communication"],
58
+ riskLevel: "write",
59
+ requiresAuth: true,
60
+ creditCost: 0,
61
+ billingMode: "customer_oauth",
62
+ inputSchema: {
63
+ type: "object",
64
+ required: ["recipient_email", "subject", "body"],
65
+ properties: {
66
+ recipient_email: { type: "string", description: "Recipient email address" },
67
+ subject: { type: "string", description: "Email subject line" },
68
+ body: { type: "string", description: "Email body content" },
69
+ },
70
+ },
71
+ },
72
+ {
73
+ slug: "app.gmail.fetch_emails",
74
+ upstreamSlug: "GMAIL_FETCH_EMAILS",
75
+ name: "Gmail: Fetch Emails",
76
+ description: "List and search emails in the connected Gmail inbox.",
77
+ lane: "composio_sdk",
78
+ providerSlug: "gmail",
79
+ providerName: "Gmail",
80
+ categories: ["email", "communication"],
81
+ riskLevel: "read",
82
+ requiresAuth: true,
83
+ creditCost: 0,
84
+ billingMode: "customer_oauth",
85
+ inputSchema: {
86
+ type: "object",
87
+ properties: {
88
+ query: { type: "string", description: "Gmail search query (e.g. 'is:unread')" },
89
+ max_results: { type: "number", default: 10 },
90
+ },
91
+ },
92
+ },
93
+ {
94
+ slug: "app.slack.send_message",
95
+ upstreamSlug: "SLACK_SENDS_A_MESSAGE_TO_A_SLACK_CHANNEL",
96
+ name: "Slack: Send Channel Message",
97
+ description: "Post a message to a Slack channel using the connected Slack workspace.",
98
+ lane: "composio_sdk",
99
+ providerSlug: "slack",
100
+ providerName: "Slack",
101
+ categories: ["messaging", "team_chat"],
102
+ riskLevel: "write",
103
+ requiresAuth: true,
104
+ creditCost: 0,
105
+ billingMode: "customer_oauth",
106
+ inputSchema: {
107
+ type: "object",
108
+ required: ["channel", "text"],
109
+ properties: {
110
+ channel: { type: "string", description: "Slack channel ID or name" },
111
+ text: { type: "string", description: "Message text (Markdown supported)" },
112
+ },
113
+ },
114
+ },
115
+ {
116
+ slug: "app.notion.search_pages",
117
+ upstreamSlug: "NOTION_SEARCH_NOTION_PAGE",
118
+ name: "Notion: Search Pages & Databases",
119
+ description: "Search across pages and databases in the connected Notion workspace.",
120
+ lane: "composio_sdk",
121
+ providerSlug: "notion",
122
+ providerName: "Notion",
123
+ categories: ["knowledge", "productivity"],
124
+ riskLevel: "read",
125
+ requiresAuth: true,
126
+ creditCost: 0,
127
+ billingMode: "customer_oauth",
128
+ inputSchema: {
129
+ type: "object",
130
+ properties: {
131
+ query: { type: "string", description: "Search query text" },
132
+ },
133
+ },
134
+ },
135
+ {
136
+ slug: "app.linear.create_issue",
137
+ upstreamSlug: "LINEAR_CREATE_LINEAR_ISSUE",
138
+ name: "Linear: Create Issue",
139
+ description: "Create a tracked issue in a Linear team.",
140
+ lane: "composio_sdk",
141
+ providerSlug: "linear",
142
+ providerName: "Linear",
143
+ categories: ["project_management", "developer_tools"],
144
+ riskLevel: "write",
145
+ requiresAuth: true,
146
+ creditCost: 0,
147
+ billingMode: "customer_oauth",
148
+ inputSchema: {
149
+ type: "object",
150
+ required: ["team_id", "title"],
151
+ properties: {
152
+ team_id: { type: "string", description: "Linear team ID" },
153
+ title: { type: "string", description: "Issue title" },
154
+ description: { type: "string", description: "Detailed issue description" },
155
+ },
156
+ },
157
+ },
158
+ {
159
+ slug: "app.googlecalendar.list_events",
160
+ upstreamSlug: "GOOGLECALENDAR_EVENTS_LIST",
161
+ name: "Google Calendar: List Upcoming Events",
162
+ description: "Retrieve upcoming events from the connected Google Calendar.",
163
+ lane: "composio_sdk",
164
+ providerSlug: "googlecalendar",
165
+ providerName: "Google Calendar",
166
+ categories: ["calendar", "productivity"],
167
+ riskLevel: "read",
168
+ requiresAuth: true,
169
+ creditCost: 0,
170
+ billingMode: "customer_oauth",
171
+ inputSchema: {
172
+ type: "object",
173
+ properties: {
174
+ calendarId: { type: "string", default: "primary" },
175
+ maxResults: { type: "number", default: 10 },
176
+ },
177
+ },
178
+ },
179
+ ];
180
+ function classifyComposioRisk(slug, tags = []) {
181
+ const upper = `${slug} ${tags.join(" ")}`.toUpperCase();
182
+ if (/(DELETE|REMOVE|DESTROY|DROP|PURGE|REVOKE)/.test(upper))
183
+ return "destructive";
184
+ if (/(ADMIN|PERMISSION|ROLE|MEMBER|ORG|WEBHOOK)/.test(upper))
185
+ return "admin";
186
+ if (/(PAY|REFUND|INVOICE|CHARGE|TRANSFER|BILLING)/.test(upper))
187
+ return "financial";
188
+ if (/(GET|LIST|SEARCH|FETCH|READ|INSPECT|FIND|QUERY|VIEW)/.test(upper))
189
+ return "read";
190
+ return "write";
191
+ }
192
+ export class ComposioSdkAdapter {
193
+ config;
194
+ liveToolsCache = new Map();
195
+ constructor(config) {
196
+ this.config = config;
197
+ for (const tool of CURATED_APP_TOOLS) {
198
+ this.liveToolsCache.set(tool.slug, tool);
199
+ }
200
+ }
201
+ get headers() {
202
+ return {
203
+ "x-api-key": this.config.composioApiKey,
204
+ "Content-Type": "application/json",
205
+ };
206
+ }
207
+ getCuratedTools() {
208
+ return Array.from(this.liveToolsCache.values());
209
+ }
210
+ async searchTools(query, limit = 15) {
211
+ const q = (query || "").trim().toLowerCase();
212
+ const localMatches = this.getCuratedTools().filter((t) => {
213
+ if (!q)
214
+ return true;
215
+ return (t.slug.toLowerCase().includes(q) ||
216
+ t.name.toLowerCase().includes(q) ||
217
+ t.description.toLowerCase().includes(q) ||
218
+ t.providerSlug.toLowerCase().includes(q));
219
+ });
220
+ if (!q || !this.config.composioApiKey) {
221
+ return localMatches.slice(0, limit);
222
+ }
223
+ try {
224
+ const url = new URL(`${this.config.composioBaseUrl}/tools`);
225
+ url.searchParams.set("search", q);
226
+ url.searchParams.set("limit", String(Math.min(limit, 15)));
227
+ const res = await fetch(url.toString(), {
228
+ headers: this.headers,
229
+ signal: AbortSignal.timeout(4500),
230
+ });
231
+ if (!res.ok)
232
+ return localMatches.slice(0, limit);
233
+ const data = (await res.json());
234
+ const items = Array.isArray(data.items) ? data.items : [];
235
+ const merged = new Map();
236
+ for (const m of localMatches)
237
+ merged.set(m.slug, m);
238
+ for (const item of items) {
239
+ const upstreamSlug = String(item.slug || item.name || "");
240
+ if (!upstreamSlug)
241
+ continue;
242
+ const toolkitObj = (item.toolkit || {});
243
+ const providerSlug = String(toolkitObj.slug || upstreamSlug.split("_")[0] || "app").toLowerCase();
244
+ const providerName = String(toolkitObj.name || providerSlug.charAt(0).toUpperCase() + providerSlug.slice(1));
245
+ const actionPart = upstreamSlug
246
+ .toLowerCase()
247
+ .replace(new RegExp(`^${providerSlug}_`), "");
248
+ const muxoSlug = `app.${providerSlug}.${actionPart}`;
249
+ const tool = {
250
+ slug: muxoSlug,
251
+ upstreamSlug,
252
+ name: `${providerName}: ${String(item.name || actionPart)}`,
253
+ description: String(item.description || `Execute ${upstreamSlug} via Composio`),
254
+ lane: "composio_sdk",
255
+ providerSlug,
256
+ providerName,
257
+ categories: Array.isArray(item.tags) ? item.tags.map(String) : [providerSlug],
258
+ riskLevel: classifyComposioRisk(upstreamSlug, Array.isArray(item.tags) ? item.tags.map(String) : []),
259
+ requiresAuth: !Boolean(item.no_auth),
260
+ creditCost: 0,
261
+ billingMode: "customer_oauth",
262
+ inputSchema: item.input_parameters || {
263
+ type: "object",
264
+ properties: {},
265
+ },
266
+ };
267
+ this.liveToolsCache.set(muxoSlug, tool);
268
+ if (!merged.has(muxoSlug)) {
269
+ merged.set(muxoSlug, tool);
270
+ }
271
+ }
272
+ return Array.from(merged.values()).slice(0, limit);
273
+ }
274
+ catch {
275
+ return localMatches.slice(0, limit);
276
+ }
277
+ }
278
+ async inspectTool(slug) {
279
+ if (this.liveToolsCache.has(slug)) {
280
+ return this.liveToolsCache.get(slug);
281
+ }
282
+ if (!slug.startsWith("app.") || !this.config.composioApiKey)
283
+ return null;
284
+ const parts = slug.split(".");
285
+ const query = parts.slice(1).join(" ");
286
+ const matches = await this.searchTools(query, 10);
287
+ return matches.find((m) => m.slug === slug) || matches[0] || null;
288
+ }
289
+ async startConnection(params) {
290
+ const providerSlug = params.providerSlug.toLowerCase().replace(/^app\./, "");
291
+ const providerName = providerSlug.charAt(0).toUpperCase() + providerSlug.slice(1);
292
+ const callbackUrl = params.callbackUrl ||
293
+ `${this.config.baseUrl}/oauth/callback?workspace_id=${encodeURIComponent(params.workspaceId)}&provider=${encodeURIComponent(providerSlug)}`;
294
+ if (!this.config.composioApiKey) {
295
+ const externalAccountId = `ca_ext_${providerSlug}_${params.workspaceId.slice(-8)}`;
296
+ return {
297
+ providerSlug,
298
+ providerName,
299
+ status: "pending",
300
+ redirectUrl: `${callbackUrl}&connected_account_id=${encodeURIComponent(externalAccountId)}`,
301
+ callbackUrl,
302
+ externalAccountId,
303
+ message: `Open the authorization URL to connect ${providerName} to your Muxo workspace.`,
304
+ };
305
+ }
306
+ // 1. Try creating a Composio Tool Router Session & link for the workspace user
307
+ try {
308
+ const sessionRes = await fetch(`${this.config.composioBaseUrl}/tool_router/session`, {
309
+ method: "POST",
310
+ headers: this.headers,
311
+ body: JSON.stringify({
312
+ user_id: params.workspaceId,
313
+ toolkits: { enable: [providerSlug] },
314
+ }),
315
+ signal: AbortSignal.timeout(8000),
316
+ });
317
+ if (sessionRes.ok) {
318
+ const sessionData = (await sessionRes.json());
319
+ const sessionId = sessionData.session_id;
320
+ if (sessionId) {
321
+ const linkRes = await fetch(`${this.config.composioBaseUrl}/tool_router/session/${sessionId}/link`, {
322
+ method: "POST",
323
+ headers: this.headers,
324
+ body: JSON.stringify({
325
+ toolkit: providerSlug,
326
+ callback_url: callbackUrl,
327
+ }),
328
+ signal: AbortSignal.timeout(8000),
329
+ });
330
+ if (linkRes.ok) {
331
+ const linkData = (await linkRes.json());
332
+ if (linkData.redirect_url) {
333
+ return {
334
+ providerSlug,
335
+ providerName,
336
+ status: "pending",
337
+ redirectUrl: linkData.redirect_url,
338
+ callbackUrl,
339
+ externalAccountId: linkData.connected_account_id || sessionId,
340
+ message: `Open the authorization URL to connect ${providerName} to your Muxo workspace.`,
341
+ };
342
+ }
343
+ }
344
+ }
345
+ }
346
+ }
347
+ catch {
348
+ // Fall through to auth_configs / connected_accounts flow
349
+ }
350
+ // 2. Fallback: look up or create an auth_config for the toolkit and initiate connected_accounts
351
+ const authCfgRes = await fetch(`${this.config.composioBaseUrl}/auth_configs?toolkit_slug=${encodeURIComponent(providerSlug)}&limit=5`, {
352
+ headers: this.headers,
353
+ signal: AbortSignal.timeout(6000),
354
+ });
355
+ if (authCfgRes.ok) {
356
+ const authCfgData = (await authCfgRes.json());
357
+ const authConfigId = authCfgData.items?.[0]?.id;
358
+ if (authConfigId) {
359
+ const connRes = await fetch(`${this.config.composioBaseUrl}/connected_accounts`, {
360
+ method: "POST",
361
+ headers: this.headers,
362
+ body: JSON.stringify({
363
+ auth_config: { id: authConfigId },
364
+ connection: {
365
+ user_id: params.workspaceId,
366
+ callback_url: callbackUrl,
367
+ },
368
+ }),
369
+ signal: AbortSignal.timeout(8000),
370
+ });
371
+ if (connRes.ok) {
372
+ const connData = (await connRes.json());
373
+ const redirectUrl = connData.redirect_url || connData.connectionData?.val?.redirectUrl || null;
374
+ return {
375
+ providerSlug,
376
+ providerName,
377
+ status: "pending",
378
+ redirectUrl,
379
+ callbackUrl,
380
+ externalAccountId: connData.id || null,
381
+ message: redirectUrl
382
+ ? `Complete ${providerName} OAuth authorization in your browser.`
383
+ : `Created ${providerName} connection request (${connData.id}).`,
384
+ };
385
+ }
386
+ }
387
+ }
388
+ throw new Error(`Could not initiate managed OAuth flow for toolkit '${providerSlug}'.`);
389
+ }
390
+ async getConnectedAccountStatus(externalAccountId) {
391
+ if (!this.config.composioApiKey || !externalAccountId)
392
+ return null;
393
+ try {
394
+ const res = await fetch(`${this.config.composioBaseUrl}/connected_accounts/${encodeURIComponent(externalAccountId)}`, {
395
+ headers: this.headers,
396
+ signal: AbortSignal.timeout(5000),
397
+ });
398
+ if (!res.ok)
399
+ return null;
400
+ const item = (await res.json());
401
+ const toolkit = (item.toolkit || {});
402
+ const slug = String(toolkit.slug || item.toolkit_slug || "unknown").toLowerCase();
403
+ const rawStatus = String(item.status || "INITIALIZING").toUpperCase();
404
+ const status = rawStatus === "ACTIVE"
405
+ ? "active"
406
+ : rawStatus === "EXPIRED" || rawStatus === "FAILED"
407
+ ? "expired"
408
+ : "pending";
409
+ return {
410
+ id: String(item.id || externalAccountId),
411
+ providerSlug: slug,
412
+ status,
413
+ };
414
+ }
415
+ catch {
416
+ return null;
417
+ }
418
+ }
419
+ async listLiveConnections(workspaceId) {
420
+ if (!this.config.composioApiKey)
421
+ return [];
422
+ try {
423
+ const url = new URL(`${this.config.composioBaseUrl}/connected_accounts`);
424
+ url.searchParams.set("user_ids", workspaceId);
425
+ url.searchParams.set("limit", "50");
426
+ const res = await fetch(url.toString(), {
427
+ headers: this.headers,
428
+ signal: AbortSignal.timeout(5000),
429
+ });
430
+ if (!res.ok)
431
+ return [];
432
+ const data = (await res.json());
433
+ const items = Array.isArray(data.items) ? data.items : [];
434
+ const rank = {
435
+ active: 3,
436
+ pending: 2,
437
+ expired: 1,
438
+ };
439
+ const bySlug = new Map();
440
+ for (const item of items) {
441
+ const toolkit = (item.toolkit || {});
442
+ const slug = String(toolkit.slug || item.toolkit_slug || "unknown").toLowerCase();
443
+ const rawStatus = String(item.status || "INITIALIZING").toUpperCase();
444
+ const status = rawStatus === "ACTIVE"
445
+ ? "active"
446
+ : rawStatus === "EXPIRED" || rawStatus === "FAILED"
447
+ ? "expired"
448
+ : "pending";
449
+ const candidate = {
450
+ providerSlug: slug,
451
+ providerName: slug.charAt(0).toUpperCase() + slug.slice(1),
452
+ status,
453
+ externalAccountId: String(item.id || ""),
454
+ };
455
+ const existing = bySlug.get(slug);
456
+ if (!existing || rank[candidate.status] > rank[existing.status]) {
457
+ bySlug.set(slug, candidate);
458
+ }
459
+ }
460
+ return Array.from(bySlug.values());
461
+ }
462
+ catch {
463
+ return [];
464
+ }
465
+ }
466
+ async executeTool(params) {
467
+ if (!this.config.composioApiKey) {
468
+ if (!params.connectedAccountId) {
469
+ throw new Error(`Execution failed for ${params.tool.slug}: No active OAuth connection for ${params.tool.providerSlug}. Authorize '${params.tool.providerSlug}' first via start_connection (or 'muxo link ${params.tool.providerSlug}') and wait_for_connection.`);
470
+ }
471
+ return {
472
+ provider: "composio_sdk",
473
+ tool: params.tool.slug,
474
+ upstreamTool: params.tool.upstreamSlug,
475
+ connectedAccountId: params.connectedAccountId,
476
+ data: {
477
+ status: "executed",
478
+ connectedAccountId: params.connectedAccountId,
479
+ arguments: params.input,
480
+ executedAt: new Date().toISOString(),
481
+ },
482
+ };
483
+ }
484
+ const body = {
485
+ user_id: params.workspaceId,
486
+ arguments: params.input,
487
+ };
488
+ if (params.connectedAccountId) {
489
+ body.connected_account_id = params.connectedAccountId;
490
+ }
491
+ const res = await fetch(`${this.config.composioBaseUrl}/tools/execute/${encodeURIComponent(params.tool.upstreamSlug)}`, {
492
+ method: "POST",
493
+ headers: this.headers,
494
+ body: JSON.stringify(body),
495
+ signal: AbortSignal.timeout(25000),
496
+ });
497
+ const payload = (await res.json().catch(() => ({})));
498
+ if (!res.ok || payload.error || payload.successful === false) {
499
+ const rawErr = typeof payload.error === "string"
500
+ ? payload.error
501
+ : JSON.stringify(payload.error || payload.message || `HTTP ${res.status}`);
502
+ const sanitizedErr = rawErr
503
+ .replace(/COMPOSIO_INITIATE_CONNECTION/g, "start_connection")
504
+ .replace(/\/api\/v3\/connected_accounts/g, "/api/v1/connections/start");
505
+ throw new Error(`Execution failed for ${params.tool.slug}: ${sanitizedErr}. Authorize '${params.tool.providerSlug}' first via start_connection (or 'muxo link ${params.tool.providerSlug}') and wait_for_connection.`);
506
+ }
507
+ return {
508
+ provider: "composio_sdk",
509
+ tool: params.tool.slug,
510
+ upstreamTool: params.tool.upstreamSlug,
511
+ data: payload.data ?? payload,
512
+ };
513
+ }
514
+ }
@@ -0,0 +1,66 @@
1
+ import { AgentIdentity, AuditLogger } from "../../vendor/microsoft-governance/dist/index.js";
2
+ import type { ActionPlan, GovernanceDecisionRecord, MuxoTool, Workspace } from "../types.js";
3
+ export declare class MicrosoftGovernanceAdapter {
4
+ private readonly scanner;
5
+ private readonly seedMaterial;
6
+ private readonly auditLoggers;
7
+ private readonly identities;
8
+ private readonly defaultIdentity;
9
+ constructor(seed?: string | Buffer);
10
+ /**
11
+ * Returns (or deterministically derives) the Ed25519 AgentIdentity (`did:agentmesh:...`) for a workspace.
12
+ */
13
+ getWorkspaceIdentity(workspace: Workspace): AgentIdentity;
14
+ /**
15
+ * Returns (or lazily initializes) the SHA-256 hash-chained AuditLogger for a workspace.
16
+ */
17
+ getWorkspaceAuditLogger(workspaceId: string): AuditLogger;
18
+ /**
19
+ * Compiles the workspace's GovernancePolicy into a declarative Microsoft PolicyEngine instance.
20
+ */
21
+ private createPolicyEngine;
22
+ /**
23
+ * Runs the full Microsoft Agent Governance pipeline:
24
+ * Agent ──► McpSecurityScanner ──► PolicyEngine ──► AgentIdentity (Ed25519 DID) ──► AuditLogger ──► DecisionRecord
25
+ */
26
+ evaluateAction(params: {
27
+ workspace: Workspace;
28
+ actorId: string;
29
+ tool: MuxoTool;
30
+ input: Record<string, unknown>;
31
+ reason: string;
32
+ stage: "plan" | "execute";
33
+ ownerApproved?: boolean;
34
+ }): GovernanceDecisionRecord;
35
+ evaluatePlan(params: {
36
+ workspace: Workspace;
37
+ actorId: string;
38
+ tool: MuxoTool;
39
+ input: Record<string, unknown>;
40
+ reason: string;
41
+ }): GovernanceDecisionRecord;
42
+ evaluateExecution(params: {
43
+ workspace: Workspace;
44
+ actorId: string;
45
+ plan: ActionPlan;
46
+ tool: MuxoTool;
47
+ }): GovernanceDecisionRecord;
48
+ /**
49
+ * Verifies a DecisionRecord's Ed25519 signature and the workspace's SHA-256 audit hash chain.
50
+ */
51
+ verifyDecisionRecord(workspaceOrRecord: Workspace | GovernanceDecisionRecord, maybeRecord?: GovernanceDecisionRecord): boolean;
52
+ getStatus(workspace?: Workspace): {
53
+ sdk: string;
54
+ sdkVersion: string;
55
+ policyId: string;
56
+ pipeline: string;
57
+ agentDid: string;
58
+ publicKeyHex: string;
59
+ auditEntriesCount: number;
60
+ auditChainIntegrity: boolean;
61
+ };
62
+ /**
63
+ * Returns a live governance status report for a workspace.
64
+ */
65
+ getGovernanceStatus(workspace: Workspace): Record<string, unknown>;
66
+ }