@muxoai/sdk 1.2.3 → 1.4.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 (208) hide show
  1. package/.agents/plugins/marketplace.json +22 -0
  2. package/.claude-plugin/marketplace.json +32 -0
  3. package/.codex/config.toml +12 -0
  4. package/ARCHITECTURE.md +121 -0
  5. package/README.md +85 -31
  6. package/dist/clerk.d.ts +35 -0
  7. package/dist/clerk.js +201 -0
  8. package/dist/cli.d.ts +2 -0
  9. package/dist/cli.js +2380 -0
  10. package/dist/composio-catalog.d.ts +234 -0
  11. package/dist/composio-catalog.js +1894 -0
  12. package/dist/config.d.ts +36 -0
  13. package/dist/config.js +115 -0
  14. package/dist/durable-workflow.d.ts +45 -0
  15. package/dist/durable-workflow.js +90 -0
  16. package/dist/engine.d.ts +465 -0
  17. package/dist/engine.js +2560 -0
  18. package/dist/index.d.ts +7 -0
  19. package/dist/index.js +7 -0
  20. package/dist/mcp-schema.d.ts +286 -0
  21. package/dist/mcp-schema.js +2559 -0
  22. package/dist/mcp.d.ts +22 -0
  23. package/dist/mcp.js +1356 -0
  24. package/dist/memory-graph.d.ts +21 -0
  25. package/dist/memory-graph.js +173 -0
  26. package/dist/nl.d.ts +34 -0
  27. package/dist/nl.js +756 -0
  28. package/dist/oauth.d.ts +32 -0
  29. package/dist/oauth.js +134 -0
  30. package/dist/policy.d.ts +190 -0
  31. package/dist/policy.js +1597 -0
  32. package/dist/providers/composio-instant.d.ts +18 -0
  33. package/dist/providers/composio-instant.js +1169 -0
  34. package/dist/providers/composio-sdk.d.ts +162 -0
  35. package/dist/providers/composio-sdk.js +1395 -0
  36. package/dist/providers/microsoft-governance.d.ts +152 -0
  37. package/dist/providers/microsoft-governance.js +1062 -0
  38. package/dist/providers/stripe-billing.d.ts +83 -0
  39. package/dist/providers/stripe-billing.js +611 -0
  40. package/dist/providers/stripe-projects.d.ts +508 -0
  41. package/dist/providers/stripe-projects.js +3188 -0
  42. package/dist/providers/supermemory.d.ts +160 -0
  43. package/dist/providers/supermemory.js +778 -0
  44. package/dist/provisioning-managed.d.ts +50 -0
  45. package/dist/provisioning-managed.js +155 -0
  46. package/dist/sdk.d.ts +951 -0
  47. package/dist/sdk.js +748 -0
  48. package/dist/server.d.ts +10 -0
  49. package/dist/server.js +3575 -0
  50. package/dist/store.d.ts +348 -0
  51. package/dist/store.js +2323 -0
  52. package/dist/types.d.ts +593 -0
  53. package/dist/types.js +1 -0
  54. package/dist/ui/console-html.d.ts +64 -0
  55. package/dist/ui/console-html.js +3857 -0
  56. package/dist/ui/design-tokens.d.ts +177 -0
  57. package/dist/ui/design-tokens.js +210 -0
  58. package/dist/version.d.ts +1 -0
  59. package/dist/version.js +1 -0
  60. package/package.json +68 -7
  61. package/plugins/muxo/.app.json +8 -0
  62. package/plugins/muxo/.claude-plugin/plugin.json +16 -0
  63. package/plugins/muxo/.codex-plugin/plugin.json +64 -0
  64. package/plugins/muxo/.cursor-plugin/plugin.json +30 -0
  65. package/plugins/muxo/.mcp.json +8 -0
  66. package/plugins/muxo/assets/logo.png +0 -0
  67. package/plugins/muxo/assets/logo.svg +6 -0
  68. package/plugins/muxo/hooks/hooks.json +27 -0
  69. package/plugins/muxo/hooks/session-start.sh +97 -0
  70. package/plugins/muxo/hooks/user-prompt-submit.sh +58 -0
  71. package/plugins/muxo/mcp.json +28 -0
  72. package/plugins/muxo/plugin.json +116 -0
  73. package/plugins/muxo/skills/muxo/SKILL.md +153 -0
  74. package/plugins/muxo/skills/muxo/agents/openai.yaml +12 -0
  75. package/plugins/muxo/skills/muxo/references/cli.md +63 -0
  76. package/plugins/muxo/skills/muxo/references/mcp.md +37 -0
  77. package/plugins/muxo/skills/muxo-activity-summary/SKILL.md +81 -0
  78. package/plugins/muxo/skills/setup/SKILL.md +42 -0
  79. package/plugins/muxo/skills/setup/agents/openai.yaml +12 -0
  80. package/src/catalogues/stripe-projects-catalog.json +9972 -0
  81. package/vendor/microsoft-governance/README.md +363 -0
  82. package/vendor/microsoft-governance/dist/audit.d.ts +26 -0
  83. package/vendor/microsoft-governance/dist/audit.d.ts.map +1 -0
  84. package/vendor/microsoft-governance/dist/audit.js +107 -0
  85. package/vendor/microsoft-governance/dist/audit.js.map +1 -0
  86. package/vendor/microsoft-governance/dist/cascade-containment.d.ts +84 -0
  87. package/vendor/microsoft-governance/dist/cascade-containment.d.ts.map +1 -0
  88. package/vendor/microsoft-governance/dist/cascade-containment.js +387 -0
  89. package/vendor/microsoft-governance/dist/cascade-containment.js.map +1 -0
  90. package/vendor/microsoft-governance/dist/client.d.ts +34 -0
  91. package/vendor/microsoft-governance/dist/client.d.ts.map +1 -0
  92. package/vendor/microsoft-governance/dist/client.js +112 -0
  93. package/vendor/microsoft-governance/dist/client.js.map +1 -0
  94. package/vendor/microsoft-governance/dist/context-poisoning.d.ts +58 -0
  95. package/vendor/microsoft-governance/dist/context-poisoning.d.ts.map +1 -0
  96. package/vendor/microsoft-governance/dist/context-poisoning.js +410 -0
  97. package/vendor/microsoft-governance/dist/context-poisoning.js.map +1 -0
  98. package/vendor/microsoft-governance/dist/credential-vault.d.ts +213 -0
  99. package/vendor/microsoft-governance/dist/credential-vault.d.ts.map +1 -0
  100. package/vendor/microsoft-governance/dist/credential-vault.js +567 -0
  101. package/vendor/microsoft-governance/dist/credential-vault.js.map +1 -0
  102. package/vendor/microsoft-governance/dist/discovery.d.ts +80 -0
  103. package/vendor/microsoft-governance/dist/discovery.d.ts.map +1 -0
  104. package/vendor/microsoft-governance/dist/discovery.js +404 -0
  105. package/vendor/microsoft-governance/dist/discovery.js.map +1 -0
  106. package/vendor/microsoft-governance/dist/encryption/channel.d.ts +29 -0
  107. package/vendor/microsoft-governance/dist/encryption/channel.d.ts.map +1 -0
  108. package/vendor/microsoft-governance/dist/encryption/channel.js +78 -0
  109. package/vendor/microsoft-governance/dist/encryption/channel.js.map +1 -0
  110. package/vendor/microsoft-governance/dist/encryption/index.d.ts +9 -0
  111. package/vendor/microsoft-governance/dist/encryption/index.d.ts.map +1 -0
  112. package/vendor/microsoft-governance/dist/encryption/index.js +23 -0
  113. package/vendor/microsoft-governance/dist/encryption/index.js.map +1 -0
  114. package/vendor/microsoft-governance/dist/encryption/mesh-client.d.ts +267 -0
  115. package/vendor/microsoft-governance/dist/encryption/mesh-client.d.ts.map +1 -0
  116. package/vendor/microsoft-governance/dist/encryption/mesh-client.js +1001 -0
  117. package/vendor/microsoft-governance/dist/encryption/mesh-client.js.map +1 -0
  118. package/vendor/microsoft-governance/dist/encryption/ratchet.d.ts +38 -0
  119. package/vendor/microsoft-governance/dist/encryption/ratchet.d.ts.map +1 -0
  120. package/vendor/microsoft-governance/dist/encryption/ratchet.js +223 -0
  121. package/vendor/microsoft-governance/dist/encryption/ratchet.js.map +1 -0
  122. package/vendor/microsoft-governance/dist/encryption/registry-client.d.ts +136 -0
  123. package/vendor/microsoft-governance/dist/encryption/registry-client.d.ts.map +1 -0
  124. package/vendor/microsoft-governance/dist/encryption/registry-client.js +369 -0
  125. package/vendor/microsoft-governance/dist/encryption/registry-client.js.map +1 -0
  126. package/vendor/microsoft-governance/dist/encryption/x3dh.d.ts +80 -0
  127. package/vendor/microsoft-governance/dist/encryption/x3dh.d.ts.map +1 -0
  128. package/vendor/microsoft-governance/dist/encryption/x3dh.js +238 -0
  129. package/vendor/microsoft-governance/dist/encryption/x3dh.js.map +1 -0
  130. package/vendor/microsoft-governance/dist/framework-adapter.d.ts +63 -0
  131. package/vendor/microsoft-governance/dist/framework-adapter.d.ts.map +1 -0
  132. package/vendor/microsoft-governance/dist/framework-adapter.js +253 -0
  133. package/vendor/microsoft-governance/dist/framework-adapter.js.map +1 -0
  134. package/vendor/microsoft-governance/dist/identity.d.ts +124 -0
  135. package/vendor/microsoft-governance/dist/identity.d.ts.map +1 -0
  136. package/vendor/microsoft-governance/dist/identity.js +446 -0
  137. package/vendor/microsoft-governance/dist/identity.js.map +1 -0
  138. package/vendor/microsoft-governance/dist/index.d.ts +39 -0
  139. package/vendor/microsoft-governance/dist/index.d.ts.map +1 -0
  140. package/vendor/microsoft-governance/dist/index.js +95 -0
  141. package/vendor/microsoft-governance/dist/index.js.map +1 -0
  142. package/vendor/microsoft-governance/dist/kill-switch.d.ts +22 -0
  143. package/vendor/microsoft-governance/dist/kill-switch.d.ts.map +1 -0
  144. package/vendor/microsoft-governance/dist/kill-switch.js +60 -0
  145. package/vendor/microsoft-governance/dist/kill-switch.js.map +1 -0
  146. package/vendor/microsoft-governance/dist/lifecycle.d.ts +50 -0
  147. package/vendor/microsoft-governance/dist/lifecycle.d.ts.map +1 -0
  148. package/vendor/microsoft-governance/dist/lifecycle.js +113 -0
  149. package/vendor/microsoft-governance/dist/lifecycle.js.map +1 -0
  150. package/vendor/microsoft-governance/dist/mcp.d.ts +41 -0
  151. package/vendor/microsoft-governance/dist/mcp.d.ts.map +1 -0
  152. package/vendor/microsoft-governance/dist/mcp.js +233 -0
  153. package/vendor/microsoft-governance/dist/mcp.js.map +1 -0
  154. package/vendor/microsoft-governance/dist/metrics.d.ts +123 -0
  155. package/vendor/microsoft-governance/dist/metrics.d.ts.map +1 -0
  156. package/vendor/microsoft-governance/dist/metrics.js +289 -0
  157. package/vendor/microsoft-governance/dist/metrics.js.map +1 -0
  158. package/vendor/microsoft-governance/dist/oci-manifest.d.ts +49 -0
  159. package/vendor/microsoft-governance/dist/oci-manifest.d.ts.map +1 -0
  160. package/vendor/microsoft-governance/dist/oci-manifest.js +182 -0
  161. package/vendor/microsoft-governance/dist/oci-manifest.js.map +1 -0
  162. package/vendor/microsoft-governance/dist/policy-backends/cedar.d.ts +15 -0
  163. package/vendor/microsoft-governance/dist/policy-backends/cedar.d.ts.map +1 -0
  164. package/vendor/microsoft-governance/dist/policy-backends/cedar.js +88 -0
  165. package/vendor/microsoft-governance/dist/policy-backends/cedar.js.map +1 -0
  166. package/vendor/microsoft-governance/dist/policy-backends/opa.d.ts +17 -0
  167. package/vendor/microsoft-governance/dist/policy-backends/opa.d.ts.map +1 -0
  168. package/vendor/microsoft-governance/dist/policy-backends/opa.js +74 -0
  169. package/vendor/microsoft-governance/dist/policy-backends/opa.js.map +1 -0
  170. package/vendor/microsoft-governance/dist/policy.d.ts +77 -0
  171. package/vendor/microsoft-governance/dist/policy.d.ts.map +1 -0
  172. package/vendor/microsoft-governance/dist/policy.js +760 -0
  173. package/vendor/microsoft-governance/dist/policy.js.map +1 -0
  174. package/vendor/microsoft-governance/dist/prompt-defense.d.ts +37 -0
  175. package/vendor/microsoft-governance/dist/prompt-defense.d.ts.map +1 -0
  176. package/vendor/microsoft-governance/dist/prompt-defense.js +229 -0
  177. package/vendor/microsoft-governance/dist/prompt-defense.js.map +1 -0
  178. package/vendor/microsoft-governance/dist/protocol-facets.d.ts +87 -0
  179. package/vendor/microsoft-governance/dist/protocol-facets.d.ts.map +1 -0
  180. package/vendor/microsoft-governance/dist/protocol-facets.js +728 -0
  181. package/vendor/microsoft-governance/dist/protocol-facets.js.map +1 -0
  182. package/vendor/microsoft-governance/dist/rings.d.ts +17 -0
  183. package/vendor/microsoft-governance/dist/rings.d.ts.map +1 -0
  184. package/vendor/microsoft-governance/dist/rings.js +61 -0
  185. package/vendor/microsoft-governance/dist/rings.js.map +1 -0
  186. package/vendor/microsoft-governance/dist/sandbox.d.ts +61 -0
  187. package/vendor/microsoft-governance/dist/sandbox.d.ts.map +1 -0
  188. package/vendor/microsoft-governance/dist/sandbox.js +199 -0
  189. package/vendor/microsoft-governance/dist/sandbox.js.map +1 -0
  190. package/vendor/microsoft-governance/dist/surface-parity.d.ts +45 -0
  191. package/vendor/microsoft-governance/dist/surface-parity.d.ts.map +1 -0
  192. package/vendor/microsoft-governance/dist/surface-parity.js +216 -0
  193. package/vendor/microsoft-governance/dist/surface-parity.js.map +1 -0
  194. package/vendor/microsoft-governance/dist/trust.d.ts +28 -0
  195. package/vendor/microsoft-governance/dist/trust.d.ts.map +1 -0
  196. package/vendor/microsoft-governance/dist/trust.js +209 -0
  197. package/vendor/microsoft-governance/dist/trust.js.map +1 -0
  198. package/vendor/microsoft-governance/dist/types.d.ts +422 -0
  199. package/vendor/microsoft-governance/dist/types.d.ts.map +1 -0
  200. package/vendor/microsoft-governance/dist/types.js +29 -0
  201. package/vendor/microsoft-governance/dist/types.js.map +1 -0
  202. package/vendor/microsoft-governance/dist/verify.d.ts +135 -0
  203. package/vendor/microsoft-governance/dist/verify.d.ts.map +1 -0
  204. package/vendor/microsoft-governance/dist/verify.js +356 -0
  205. package/vendor/microsoft-governance/dist/verify.js.map +1 -0
  206. package/vendor/microsoft-governance/package.json +64 -0
  207. package/index.d.ts +0 -177
  208. package/index.js +0 -1
@@ -0,0 +1,1894 @@
1
+ /** SDK-free Composio enterprise toolkit and trigger catalogue shared by the Node server and the edge worker. */
2
+ export const COMPOSIO_V3_WEBHOOK_EVENTS = [
3
+ "composio.trigger.message",
4
+ "composio.trigger.disabled",
5
+ "composio.connected_account.expired",
6
+ "composio.connected_account.activated",
7
+ ];
8
+ export const ENTERPRISE_TOOLKITS_CATALOG = [
9
+ {
10
+ slug: "github",
11
+ name: "GitHub",
12
+ description: "Repositories, pull requests, issues, releases, Actions workflows, and code search.",
13
+ categories: ["developer", "git", "devops"],
14
+ authSchemes: ["OAUTH2", "API_KEY"],
15
+ pinnedVersion: "20260901_00",
16
+ readOnlyScopes: ["repo:status", "public_repo", "read:org", "read:user"],
17
+ fullAccessScopes: ["repo", "workflow", "read:org", "admin:repo_hook"],
18
+ sampleActions: [
19
+ { upstreamSlug: "GITHUB_CREATE_AN_ISSUE", muxoSlug: "app.github.create_issue", name: "GitHub: Create Issue", riskLevel: "write" },
20
+ { upstreamSlug: "GITHUB_LIST_REPOSITORY_ISSUES", muxoSlug: "app.github.list_issues", name: "GitHub: List Issues", riskLevel: "read" },
21
+ ],
22
+ },
23
+ {
24
+ slug: "gmail",
25
+ name: "Gmail",
26
+ description: "Read threads, draft replies, search messages, and send transactional or support emails.",
27
+ categories: ["email", "communication", "google"],
28
+ authSchemes: ["OAUTH2"],
29
+ pinnedVersion: "20260901_00",
30
+ readOnlyScopes: ["https://www.googleapis.com/auth/gmail.readonly"],
31
+ fullAccessScopes: ["https://www.googleapis.com/auth/gmail.modify", "https://www.googleapis.com/auth/gmail.send"],
32
+ sampleActions: [
33
+ { upstreamSlug: "GMAIL_FETCH_EMAILS", muxoSlug: "app.gmail.list_messages", name: "Gmail: List Messages", riskLevel: "read" },
34
+ { upstreamSlug: "GMAIL_SEND_EMAIL", muxoSlug: "app.gmail.send_email", name: "Gmail: Send Email", riskLevel: "write" },
35
+ ],
36
+ },
37
+ {
38
+ slug: "slack",
39
+ name: "Slack",
40
+ description: "Post channel notifications, read thread context, and coordinate incident response.",
41
+ categories: ["messaging", "chat", "incident"],
42
+ authSchemes: ["OAUTH2"],
43
+ pinnedVersion: "20260901_00",
44
+ readOnlyScopes: ["channels:history", "channels:read", "users:read"],
45
+ fullAccessScopes: ["channels:history", "channels:read", "chat:write", "reactions:write"],
46
+ sampleActions: [
47
+ { upstreamSlug: "SLACK_SENDS_A_MESSAGE_TO_A_SLACK_CHANNEL", muxoSlug: "app.slack.send_message", name: "Slack: Send Channel Message", riskLevel: "write" },
48
+ ],
49
+ },
50
+ {
51
+ slug: "notion",
52
+ name: "Notion",
53
+ description: "Search workspaces, create knowledge base pages, and query structured databases.",
54
+ categories: ["docs", "wiki", "productivity"],
55
+ authSchemes: ["OAUTH2", "API_KEY"],
56
+ pinnedVersion: "20260901_00",
57
+ readOnlyScopes: ["read_content"],
58
+ fullAccessScopes: ["read_content", "update_content", "insert_content"],
59
+ sampleActions: [
60
+ { upstreamSlug: "NOTION_SEARCH_NOTION_PAGE", muxoSlug: "app.notion.search_pages", name: "Notion: Search Pages", riskLevel: "read" },
61
+ { upstreamSlug: "NOTION_CREATE_NOTION_PAGE", muxoSlug: "app.notion.create_page", name: "Notion: Create Page", riskLevel: "write" },
62
+ ],
63
+ },
64
+ {
65
+ slug: "linear",
66
+ name: "Linear",
67
+ description: "Create engineering issues, triage bugs, manage cycles, and track project roadmaps.",
68
+ categories: ["project_management", "engineering"],
69
+ authSchemes: ["OAUTH2", "API_KEY"],
70
+ pinnedVersion: "20260901_00",
71
+ readOnlyScopes: ["read"],
72
+ fullAccessScopes: ["read", "write", "issues:create"],
73
+ sampleActions: [
74
+ { upstreamSlug: "LINEAR_CREATE_LINEAR_ISSUE", muxoSlug: "app.linear.create_issue", name: "Linear: Create Issue", riskLevel: "write" },
75
+ ],
76
+ },
77
+ {
78
+ slug: "googlecalendar",
79
+ name: "Google Calendar",
80
+ description: "List upcoming meetings, check availability, and schedule calendar events.",
81
+ categories: ["calendar", "scheduling", "google"],
82
+ authSchemes: ["OAUTH2"],
83
+ pinnedVersion: "20260901_00",
84
+ readOnlyScopes: ["https://www.googleapis.com/auth/calendar.readonly"],
85
+ fullAccessScopes: ["https://www.googleapis.com/auth/calendar.events"],
86
+ sampleActions: [
87
+ { upstreamSlug: "GOOGLECALENDAR_EVENTS_LIST", muxoSlug: "app.googlecalendar.list_events", name: "Google Calendar: List Events", riskLevel: "read" },
88
+ { upstreamSlug: "GOOGLECALENDAR_CREATE_EVENT", muxoSlug: "app.googlecalendar.create_event", name: "Google Calendar: Create Event", riskLevel: "write" },
89
+ ],
90
+ },
91
+ {
92
+ slug: "hubspot",
93
+ name: "HubSpot CRM",
94
+ description: "Manage CRM contacts, deals, company records, and sales pipeline stages.",
95
+ categories: ["crm", "sales", "marketing"],
96
+ authSchemes: ["OAUTH2", "API_KEY"],
97
+ pinnedVersion: "20260901_00",
98
+ readOnlyScopes: ["crm.objects.contacts.read", "crm.objects.deals.read"],
99
+ fullAccessScopes: ["crm.objects.contacts.read", "crm.objects.contacts.write", "crm.objects.deals.write"],
100
+ sampleActions: [
101
+ { upstreamSlug: "HUBSPOT_SEARCH_CONTACTS", muxoSlug: "app.hubspot.search_contacts", name: "HubSpot: Search Contacts", riskLevel: "read" },
102
+ { upstreamSlug: "HUBSPOT_CREATE_CONTACT", muxoSlug: "app.hubspot.create_contact", name: "HubSpot: Create Contact", riskLevel: "write" },
103
+ ],
104
+ },
105
+ {
106
+ slug: "jira",
107
+ name: "Jira Software",
108
+ description: "Search JQL issues, create sprint tickets, transition workflows, and link incidents.",
109
+ categories: ["project_management", "engineering", "enterprise"],
110
+ authSchemes: ["OAUTH2", "API_KEY"],
111
+ pinnedVersion: "20260901_00",
112
+ readOnlyScopes: ["read:jira-work", "read:jira-user"],
113
+ fullAccessScopes: ["read:jira-work", "write:jira-work"],
114
+ sampleActions: [
115
+ { upstreamSlug: "JIRA_SEARCH_ISSUES", muxoSlug: "app.jira.search_issues", name: "Jira: Search Issues (JQL)", riskLevel: "read" },
116
+ { upstreamSlug: "JIRA_CREATE_ISSUE", muxoSlug: "app.jira.create_issue", name: "Jira: Create Issue", riskLevel: "write" },
117
+ ],
118
+ },
119
+ {
120
+ slug: "salesforce",
121
+ name: "Salesforce",
122
+ description: "Query SOQL objects, manage leads, accounts, opportunities, and enterprise cases.",
123
+ categories: ["crm", "enterprise", "sales"],
124
+ authSchemes: ["OAUTH2"],
125
+ pinnedVersion: "20260901_00",
126
+ readOnlyScopes: ["api", "refresh_token"],
127
+ fullAccessScopes: ["api", "full", "refresh_token"],
128
+ sampleActions: [
129
+ { upstreamSlug: "SALESFORCE_RUN_SOQL_QUERY", muxoSlug: "app.salesforce.soql_query", name: "Salesforce: Run SOQL Query", riskLevel: "read" },
130
+ { upstreamSlug: "SALESFORCE_CREATE_LEAD", muxoSlug: "app.salesforce.create_lead", name: "Salesforce: Create Lead", riskLevel: "write" },
131
+ ],
132
+ },
133
+ {
134
+ slug: "zendesk",
135
+ name: "Zendesk Support",
136
+ description: "Triage customer support tickets, post internal notes, and update ticket priority.",
137
+ categories: ["support", "customer_success", "helpdesk"],
138
+ authSchemes: ["OAUTH2", "API_KEY"],
139
+ pinnedVersion: "20260901_00",
140
+ readOnlyScopes: ["tickets:read", "users:read"],
141
+ fullAccessScopes: ["tickets:read", "tickets:write", "users:read"],
142
+ sampleActions: [
143
+ { upstreamSlug: "ZENDESK_LIST_TICKETS", muxoSlug: "app.zendesk.list_tickets", name: "Zendesk: List Tickets", riskLevel: "read" },
144
+ { upstreamSlug: "ZENDESK_REPLY_TICKET", muxoSlug: "app.zendesk.reply_ticket", name: "Zendesk: Reply to Ticket", riskLevel: "write" },
145
+ ],
146
+ },
147
+ {
148
+ slug: "shopify",
149
+ name: "Shopify",
150
+ description: "Inspect store orders, inventory levels, customer records, refunds, and provision hosted Shopify storefronts via Stripe Projects.",
151
+ categories: ["commerce", "orders", "retail", "stripe_projects", "infrastructure"],
152
+ authSchemes: ["OAUTH2", "API_KEY"],
153
+ pinnedVersion: "20260901_00",
154
+ readOnlyScopes: ["read_orders", "read_products", "read_customers"],
155
+ fullAccessScopes: ["read_orders", "write_orders", "read_products", "write_products"],
156
+ sampleActions: [
157
+ { upstreamSlug: "SHOPIFY_GET_ORDERS", muxoSlug: "app.shopify.list_orders", name: "Shopify: List Orders", riskLevel: "read" },
158
+ { upstreamSlug: "SHOPIFY_CREATE_REFUND", muxoSlug: "app.shopify.create_refund", name: "Shopify: Create Refund", riskLevel: "financial" },
159
+ { upstreamSlug: "shopify/store", muxoSlug: "resource.shopify.store", name: "Shopify: Provision Hosted Online Storefront (deployable)", riskLevel: "provisioning" },
160
+ ],
161
+ },
162
+ {
163
+ slug: "pagerduty",
164
+ name: "PagerDuty",
165
+ description: "Acknowledge on-call incidents, list escalation policies, and trigger alert paging.",
166
+ categories: ["incident", "devops", "sre"],
167
+ authSchemes: ["OAUTH2", "API_KEY"],
168
+ pinnedVersion: "20260901_00",
169
+ readOnlyScopes: ["incidents.read", "services.read"],
170
+ fullAccessScopes: ["incidents.read", "incidents.write", "services.read"],
171
+ sampleActions: [
172
+ { upstreamSlug: "PAGERDUTY_LIST_INCIDENTS", muxoSlug: "app.pagerduty.list_incidents", name: "PagerDuty: List Incidents", riskLevel: "read" },
173
+ { upstreamSlug: "PAGERDUTY_CREATE_INCIDENT", muxoSlug: "app.pagerduty.create_incident", name: "PagerDuty: Trigger Incident", riskLevel: "write" },
174
+ ],
175
+ },
176
+ {
177
+ slug: "discord",
178
+ name: "Discord",
179
+ description: "Send channel messages, manage server roles, and read guild threads.",
180
+ categories: ["communication", "chat", "messaging"],
181
+ authSchemes: ["OAUTH2"],
182
+ pinnedVersion: "20260901_00",
183
+ readOnlyScopes: ["identify", "guilds"],
184
+ fullAccessScopes: ["identify", "guilds", "bot", "messages.read"],
185
+ sampleActions: [
186
+ { upstreamSlug: "DISCORD_SEND_MESSAGE", muxoSlug: "app.discord.send_message", name: "Discord: Send Channel Message", riskLevel: "write" },
187
+ ],
188
+ },
189
+ {
190
+ slug: "googledrive",
191
+ name: "Google Drive",
192
+ description: "Search files and folders, manage permissions, and export workspace documents.",
193
+ categories: ["storage", "docs", "productivity", "google"],
194
+ authSchemes: ["OAUTH2"],
195
+ pinnedVersion: "20260901_00",
196
+ readOnlyScopes: ["https://www.googleapis.com/auth/drive.readonly"],
197
+ fullAccessScopes: ["https://www.googleapis.com/auth/drive"],
198
+ sampleActions: [
199
+ { upstreamSlug: "GOOGLEDRIVE_FIND_FILE", muxoSlug: "app.googledrive.search_files", name: "Google Drive: Search Files & Folders", riskLevel: "read" },
200
+ ],
201
+ },
202
+ {
203
+ slug: "airtable",
204
+ name: "Airtable",
205
+ description: "List, create, and update structured records across Airtable bases and tables.",
206
+ categories: ["database", "productivity"],
207
+ authSchemes: ["OAUTH2", "API_KEY"],
208
+ pinnedVersion: "20260901_00",
209
+ readOnlyScopes: ["data.records:read", "schema.bases:read"],
210
+ fullAccessScopes: ["data.records:read", "data.records:write", "schema.bases:read"],
211
+ sampleActions: [
212
+ { upstreamSlug: "AIRTABLE_LIST_RECORDS", muxoSlug: "app.airtable.list_records", name: "Airtable: List Base Records", riskLevel: "read" },
213
+ ],
214
+ },
215
+ {
216
+ slug: "sentry",
217
+ name: "Sentry",
218
+ description: "Inspect production issues, stack traces, release health, error events, and provision Sentry projects via Stripe Projects.",
219
+ categories: ["devops", "monitoring", "engineering", "stripe_projects", "infrastructure"],
220
+ authSchemes: ["API_KEY", "BEARER_TOKEN"],
221
+ pinnedVersion: "20260901_00",
222
+ readOnlyScopes: ["project:read", "event:read", "org:read"],
223
+ fullAccessScopes: ["project:read", "event:read", "event:write", "org:read"],
224
+ sampleActions: [
225
+ { upstreamSlug: "SENTRY_LIST_ISSUES", muxoSlug: "app.sentry.list_issues", name: "Sentry: List Project Issues", riskLevel: "read" },
226
+ { upstreamSlug: "sentry/project", muxoSlug: "resource.sentry.project", name: "Sentry: Provision Error Tracking & Performance Monitoring Project (deployable)", riskLevel: "provisioning" },
227
+ ],
228
+ },
229
+ ];
230
+ const SAMPLE_ACTION_SCHEMAS = {
231
+ "app.github.list_issues": {
232
+ type: "object",
233
+ required: ["owner", "repo"],
234
+ properties: {
235
+ owner: { type: "string", description: "Repository owner" },
236
+ repo: { type: "string", description: "Repository name" },
237
+ state: { type: "string", enum: ["open", "closed", "all"], default: "open" },
238
+ },
239
+ },
240
+ "app.slack.send_message": {
241
+ type: "object",
242
+ required: ["channel", "text"],
243
+ properties: {
244
+ channel: { type: "string", description: "Slack channel ID or name" },
245
+ text: { type: "string", description: "Message text" },
246
+ },
247
+ },
248
+ "app.notion.create_page": {
249
+ type: "object",
250
+ required: ["parent_id", "title"],
251
+ properties: {
252
+ parent_id: { type: "string", description: "Parent page or database ID" },
253
+ title: { type: "string", description: "Page title" },
254
+ content: { type: "string", description: "Markdown content" },
255
+ },
256
+ },
257
+ "app.googlecalendar.list_events": {
258
+ type: "object",
259
+ properties: {
260
+ calendarId: { type: "string", default: "primary" },
261
+ maxResults: { type: "number", default: 10 },
262
+ },
263
+ },
264
+ "app.googlecalendar.create_event": {
265
+ type: "object",
266
+ required: ["summary", "start_datetime", "end_datetime"],
267
+ properties: {
268
+ calendarId: { type: "string", default: "primary" },
269
+ summary: { type: "string", description: "Event title" },
270
+ start_datetime: { type: "string", description: "ISO 8601 start timestamp" },
271
+ end_datetime: { type: "string", description: "ISO 8601 end timestamp" },
272
+ },
273
+ },
274
+ "app.hubspot.search_contacts": {
275
+ type: "object",
276
+ properties: {
277
+ query: { type: "string", description: "Contact name, email, or company search query" },
278
+ limit: { type: "number", default: 10 },
279
+ },
280
+ },
281
+ "app.hubspot.create_contact": {
282
+ type: "object",
283
+ required: ["email"],
284
+ properties: {
285
+ email: { type: "string", description: "Contact email address" },
286
+ firstname: { type: "string" },
287
+ lastname: { type: "string" },
288
+ company: { type: "string" },
289
+ },
290
+ },
291
+ "app.jira.search_issues": {
292
+ type: "object",
293
+ properties: {
294
+ jql: { type: "string", description: "JQL query string" },
295
+ max_results: { type: "number", default: 25 },
296
+ },
297
+ },
298
+ "app.jira.create_issue": {
299
+ type: "object",
300
+ required: ["project_key", "summary"],
301
+ properties: {
302
+ project_key: { type: "string", description: "Jira project key (e.g. ENG)" },
303
+ summary: { type: "string", description: "Issue summary" },
304
+ description: { type: "string", description: "Issue description" },
305
+ issue_type: { type: "string", default: "Task" },
306
+ },
307
+ },
308
+ "app.salesforce.soql_query": {
309
+ type: "object",
310
+ required: ["query"],
311
+ properties: {
312
+ query: { type: "string", description: "SOQL query string" },
313
+ },
314
+ },
315
+ "app.salesforce.create_lead": {
316
+ type: "object",
317
+ required: ["LastName", "Company"],
318
+ properties: {
319
+ FirstName: { type: "string" },
320
+ LastName: { type: "string" },
321
+ Company: { type: "string" },
322
+ Email: { type: "string" },
323
+ },
324
+ },
325
+ "app.zendesk.list_tickets": {
326
+ type: "object",
327
+ properties: {
328
+ status: { type: "string", default: "open" },
329
+ per_page: { type: "number", default: 25 },
330
+ },
331
+ },
332
+ "app.zendesk.reply_ticket": {
333
+ type: "object",
334
+ required: ["ticket_id", "body"],
335
+ properties: {
336
+ ticket_id: { type: "number", description: "Zendesk ticket ID" },
337
+ body: { type: "string", description: "Reply comment text" },
338
+ public: { type: "boolean", default: true },
339
+ },
340
+ },
341
+ "app.shopify.list_orders": {
342
+ type: "object",
343
+ properties: {
344
+ status: { type: "string", default: "any" },
345
+ limit: { type: "number", default: 25 },
346
+ },
347
+ },
348
+ "app.shopify.create_refund": {
349
+ type: "object",
350
+ required: ["order_id"],
351
+ properties: {
352
+ order_id: { type: "string", description: "Shopify order ID" },
353
+ reason: { type: "string", description: "Refund reason" },
354
+ amount_cents: { type: "number", description: "Optional refund amount in cents" },
355
+ },
356
+ },
357
+ "app.pagerduty.list_incidents": {
358
+ type: "object",
359
+ properties: {
360
+ statuses: { type: "array", items: { type: "string" } },
361
+ limit: { type: "number", default: 25 },
362
+ },
363
+ },
364
+ "app.pagerduty.create_incident": {
365
+ type: "object",
366
+ required: ["title", "service_id"],
367
+ properties: {
368
+ title: { type: "string", description: "Incident summary title" },
369
+ service_id: { type: "string", description: "PagerDuty service ID" },
370
+ urgency: { type: "string", enum: ["high", "low"], default: "high" },
371
+ },
372
+ },
373
+ "app.discord.send_message": {
374
+ type: "object",
375
+ required: ["channel_id", "content"],
376
+ properties: {
377
+ channel_id: { type: "string", description: "Discord channel ID" },
378
+ content: { type: "string", description: "Message content" },
379
+ },
380
+ },
381
+ "app.googledrive.search_files": {
382
+ type: "object",
383
+ properties: {
384
+ query: { type: "string", description: "File or folder search query" },
385
+ pageSize: { type: "number", default: 10 },
386
+ },
387
+ },
388
+ "app.airtable.list_records": {
389
+ type: "object",
390
+ required: ["base_id", "table_name"],
391
+ properties: {
392
+ base_id: { type: "string", description: "Airtable Base ID" },
393
+ table_name: { type: "string", description: "Table name or ID" },
394
+ max_records: { type: "number", default: 20 },
395
+ },
396
+ },
397
+ "app.sentry.list_issues": {
398
+ type: "object",
399
+ properties: {
400
+ project_slug: { type: "string", description: "Sentry project slug" },
401
+ query: { type: "string", description: "Issue search query", default: "is:unresolved" },
402
+ },
403
+ },
404
+ };
405
+ export function getSampleActionSchema(muxoSlug, upstreamSlug) {
406
+ return (SAMPLE_ACTION_SCHEMAS[muxoSlug] ||
407
+ (upstreamSlug ? SAMPLE_ACTION_SCHEMAS[upstreamSlug] : undefined) || {
408
+ type: "object",
409
+ properties: {
410
+ query: { type: "string", description: "Search query or identifier" },
411
+ payload: { type: "object", description: "Structured action parameters" },
412
+ },
413
+ });
414
+ }
415
+ export const COMPOSIO_TRIGGER_CATALOGUE = [
416
+ {
417
+ slug: "GITHUB_COMMIT_EVENT",
418
+ providerSlug: "github",
419
+ name: "GitHub Commit Pushed",
420
+ description: "Fires when a commit is pushed to a monitored repository branch.",
421
+ config: {
422
+ type: "object",
423
+ required: ["owner", "repo"],
424
+ properties: {
425
+ owner: { type: "string", description: "Owner of the repository" },
426
+ repo: { type: "string", description: "Repository name" },
427
+ },
428
+ },
429
+ },
430
+ {
431
+ slug: "GITHUB_PULL_REQUEST_EVENT",
432
+ providerSlug: "github",
433
+ name: "GitHub Pull Request Event",
434
+ description: "Fires when a pull request is opened, synchronized, or merged.",
435
+ config: {
436
+ type: "object",
437
+ required: ["owner", "repo"],
438
+ properties: {
439
+ owner: { type: "string", description: "Owner of the repository" },
440
+ repo: { type: "string", description: "Repository name" },
441
+ },
442
+ },
443
+ },
444
+ {
445
+ slug: "SLACK_RECEIVE_MESSAGE",
446
+ providerSlug: "slack",
447
+ name: "Slack Channel Message Received",
448
+ description: "Fires when a new message is posted in a monitored Slack channel.",
449
+ config: {
450
+ type: "object",
451
+ properties: {
452
+ channel: { type: "string", description: "Slack channel ID to monitor" },
453
+ },
454
+ },
455
+ },
456
+ {
457
+ slug: "GMAIL_NEW_GMAIL_MESSAGE",
458
+ providerSlug: "gmail",
459
+ name: "Gmail New Inbound Email",
460
+ description: "Fires when a new email arrives in the connected Gmail inbox.",
461
+ config: {
462
+ type: "object",
463
+ properties: {
464
+ userId: { type: "string", default: "me", description: "Gmail userId (default: 'me')" },
465
+ labelIds: { type: "string", default: "INBOX", description: "Comma-separated Gmail label IDs" },
466
+ },
467
+ },
468
+ },
469
+ {
470
+ slug: "LINEAR_ISSUE_CREATED",
471
+ providerSlug: "linear",
472
+ name: "Linear Issue Created",
473
+ description: "Fires when a new issue is created in a Linear team.",
474
+ config: {
475
+ type: "object",
476
+ properties: {
477
+ team_id: { type: "string", description: "Linear team ID" },
478
+ },
479
+ },
480
+ },
481
+ {
482
+ slug: "HUBSPOT_CONTACT_CREATED",
483
+ providerSlug: "hubspot",
484
+ name: "HubSpot New CRM Contact",
485
+ description: "Fires when a new contact lead enters HubSpot CRM.",
486
+ config: {
487
+ type: "object",
488
+ properties: {},
489
+ },
490
+ },
491
+ ];
492
+ export function listComposioTriggerTypes(providerSlug) {
493
+ if (!providerSlug)
494
+ return COMPOSIO_TRIGGER_CATALOGUE.map((t) => ({ ...t }));
495
+ const p = providerSlug.toLowerCase().trim();
496
+ return COMPOSIO_TRIGGER_CATALOGUE.filter((c) => c.providerSlug === p).map((t) => ({ ...t }));
497
+ }
498
+ export function getComposioTriggerType(slug) {
499
+ const normalized = String(slug || "").toUpperCase().trim();
500
+ if (!normalized)
501
+ return null;
502
+ const found = COMPOSIO_TRIGGER_CATALOGUE.find((t) => t.slug === normalized);
503
+ if (found)
504
+ return { ...found };
505
+ const providerSlug = normalized.split("_")[0]?.toLowerCase() || "github";
506
+ return {
507
+ slug: normalized,
508
+ providerSlug,
509
+ name: normalized,
510
+ description: `Composio trigger ${normalized} for ${providerSlug}.`,
511
+ config: {
512
+ type: "object",
513
+ properties: {},
514
+ },
515
+ };
516
+ }
517
+ function timingSafeStringEqual(a, b) {
518
+ if (a.length !== b.length)
519
+ return false;
520
+ let diff = 0;
521
+ for (let i = 0; i < a.length; i += 1) {
522
+ diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
523
+ }
524
+ return diff === 0;
525
+ }
526
+ /**
527
+ * Verifies a Composio V3 webhook HMAC-SHA256 signature (`v1,<base64>`) across Node and Cloudflare Workers.
528
+ * Signing input: `${webhookId}.${webhookTimestamp}.${rawPayload}`
529
+ */
530
+ export async function verifyComposioWebhookSignature(params) {
531
+ const secret = String(params.secret || "").trim();
532
+ const signature = String(params.signatureHeader || "").trim();
533
+ const webhookId = String(params.webhookIdHeader || "").trim();
534
+ const webhookTimestamp = String(params.webhookTimestampHeader || "").trim();
535
+ if (!secret) {
536
+ return { verified: false, reason: "no_secret_configured" };
537
+ }
538
+ if (!signature || !webhookId || !webhookTimestamp) {
539
+ return { verified: false, reason: "missing_webhook_headers" };
540
+ }
541
+ const tolerance = params.toleranceSeconds ?? 300;
542
+ if (tolerance > 0) {
543
+ const tsSec = Number.parseInt(webhookTimestamp, 10);
544
+ if (!Number.isFinite(tsSec)) {
545
+ return { verified: false, reason: "invalid_webhook_timestamp" };
546
+ }
547
+ const ageSeconds = Math.abs(Date.now() - tsSec * 1000) / 1000;
548
+ if (ageSeconds > tolerance) {
549
+ return { verified: false, reason: "webhook_timestamp_expired" };
550
+ }
551
+ }
552
+ const v1Signatures = [];
553
+ for (const part of signature.split(" ")) {
554
+ const [ver, val] = part.split(",");
555
+ if (ver === "v1" && val) {
556
+ v1Signatures.push(val.trim());
557
+ }
558
+ }
559
+ if (v1Signatures.length === 0) {
560
+ return { verified: false, reason: "missing_v1_signature" };
561
+ }
562
+ const encoder = new TextEncoder();
563
+ const key = await crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
564
+ const signingInput = `${webhookId}.${webhookTimestamp}.${params.rawPayload}`;
565
+ const macBuffer = await crypto.subtle.sign("HMAC", key, encoder.encode(signingInput));
566
+ const bytes = new Uint8Array(macBuffer);
567
+ let binary = "";
568
+ for (let i = 0; i < bytes.byteLength; i += 1) {
569
+ binary += String.fromCharCode(bytes[i]);
570
+ }
571
+ const expectedBase64 = btoa(binary);
572
+ for (const candidate of v1Signatures) {
573
+ if (timingSafeStringEqual(candidate, expectedBase64)) {
574
+ return { verified: true };
575
+ }
576
+ }
577
+ return { verified: false, reason: "signature_mismatch" };
578
+ }
579
+ /**
580
+ * Normalizes Composio V3 webhook events (`composio.trigger.message`, `composio.trigger.disabled`,
581
+ * `composio.connected_account.expired`, `composio.connected_account.activated`) as well as direct
582
+ * trigger webhook payloads into a single canonical envelope.
583
+ */
584
+ export function parseComposioWebhookEnvelope(body, headers) {
585
+ const rawType = String(body.type || "").trim();
586
+ const isV3Event = rawType.startsWith("composio.");
587
+ const metadata = body.metadata && typeof body.metadata === "object"
588
+ ? body.metadata
589
+ : {};
590
+ const dataObj = body.data && typeof body.data === "object"
591
+ ? body.data
592
+ : body.payload && typeof body.payload === "object"
593
+ ? body.payload
594
+ : body;
595
+ const toolkitObj = dataObj.toolkit && typeof dataObj.toolkit === "object"
596
+ ? dataObj.toolkit
597
+ : {};
598
+ const triggerSlugRaw = String(metadata.trigger_slug ||
599
+ dataObj.trigger_slug ||
600
+ body.triggerSlug ||
601
+ body.trigger_slug ||
602
+ (isV3Event && rawType !== "composio.trigger.message" ? rawType.toUpperCase().replace(/\./g, "_") : "") ||
603
+ body.type ||
604
+ "GITHUB_COMMIT_EVENT")
605
+ .toUpperCase()
606
+ .trim();
607
+ const providerSlugRaw = String(toolkitObj.slug ||
608
+ metadata.toolkit_slug ||
609
+ dataObj.toolkit_slug ||
610
+ body.providerSlug ||
611
+ body.provider ||
612
+ (triggerSlugRaw.startsWith("COMPOSIO_") ? "composio" : triggerSlugRaw.split("_")[0]) ||
613
+ "github")
614
+ .toLowerCase()
615
+ .trim();
616
+ const triggerId = typeof metadata.trigger_id === "string"
617
+ ? metadata.trigger_id
618
+ : typeof dataObj.trigger_id === "string"
619
+ ? dataObj.trigger_id
620
+ : typeof body.triggerId === "string"
621
+ ? body.triggerId
622
+ : undefined;
623
+ const connectedAccountId = typeof metadata.connected_account_id === "string"
624
+ ? metadata.connected_account_id
625
+ : typeof dataObj.connected_account_id === "string"
626
+ ? dataObj.connected_account_id
627
+ : rawType.startsWith("composio.connected_account.") && typeof dataObj.id === "string"
628
+ ? dataObj.id
629
+ : typeof body.connectedAccountId === "string"
630
+ ? body.connectedAccountId
631
+ : undefined;
632
+ const userId = typeof metadata.user_id === "string" && metadata.user_id
633
+ ? metadata.user_id
634
+ : typeof dataObj.user_id === "string" && dataObj.user_id
635
+ ? dataObj.user_id
636
+ : typeof body.user_id === "string" && body.user_id
637
+ ? body.user_id
638
+ : typeof body.workspaceId === "string" && body.workspaceId
639
+ ? body.workspaceId
640
+ : undefined;
641
+ const projectId = typeof metadata.project_id === "string" ? metadata.project_id : undefined;
642
+ const orgId = typeof metadata.org_id === "string" ? metadata.org_id : undefined;
643
+ let connectionStatus;
644
+ if (rawType === "composio.connected_account.activated") {
645
+ connectionStatus = "active";
646
+ }
647
+ else if (rawType === "composio.connected_account.expired") {
648
+ connectionStatus = "expired";
649
+ }
650
+ else if (rawType === "composio.trigger.disabled") {
651
+ connectionStatus = "disabled";
652
+ }
653
+ const headerVer = String(headers?.webhookVersion || "").toUpperCase();
654
+ const webhookVersion = isV3Event || headerVer === "V3"
655
+ ? "V3"
656
+ : headerVer === "V2"
657
+ ? "V2"
658
+ : headerVer === "V1"
659
+ ? "V1"
660
+ : "direct";
661
+ return {
662
+ eventType: isV3Event ? rawType : "composio.trigger.message",
663
+ webhookVersion,
664
+ webhookId: (typeof headers?.webhookId === "string" && headers.webhookId) ||
665
+ (typeof body.id === "string" ? body.id : undefined),
666
+ timestamp: (typeof headers?.webhookTimestamp === "string" && headers.webhookTimestamp) ||
667
+ (typeof body.timestamp === "string" ? body.timestamp : undefined),
668
+ triggerId,
669
+ triggerSlug: triggerSlugRaw,
670
+ providerSlug: providerSlugRaw,
671
+ connectedAccountId,
672
+ connectionStatus,
673
+ userId,
674
+ projectId,
675
+ orgId,
676
+ payloadObj: dataObj,
677
+ };
678
+ }
679
+ export function filterComposioToolkits(params) {
680
+ const q = (params?.search || "").trim().toLowerCase();
681
+ const cat = (params?.category || "").trim().toLowerCase();
682
+ let list = [...ENTERPRISE_TOOLKITS_CATALOG, ...STRIPE_PROJECTS_TOOLKITS_CATALOG];
683
+ if (q) {
684
+ list = list.filter((t) => t.slug.includes(q) ||
685
+ t.name.toLowerCase().includes(q) ||
686
+ t.description.toLowerCase().includes(q) ||
687
+ t.categories.some((c) => c.toLowerCase().includes(q)) ||
688
+ t.sampleActions.some((a) => a.muxoSlug.toLowerCase().includes(q) ||
689
+ a.upstreamSlug.toLowerCase().includes(q) ||
690
+ a.name.toLowerCase().includes(q)));
691
+ }
692
+ if (cat) {
693
+ list = list.filter((t) => t.categories.some((c) => c.toLowerCase() === cat));
694
+ }
695
+ return list;
696
+ }
697
+ /** Least-privilege scopes for a custom auth config: explicit scopes win, then the toolkit's read-only or full set. */
698
+ export function composioAuthConfigScopes(toolkitSlug, scopeMode, customScopes) {
699
+ if (customScopes && customScopes.length > 0)
700
+ return customScopes;
701
+ const meta = ENTERPRISE_TOOLKITS_CATALOG.find((t) => t.slug === toolkitSlug) ||
702
+ STRIPE_PROJECTS_TOOLKITS_CATALOG.find((t) => t.slug === toolkitSlug);
703
+ return scopeMode === "read_only"
704
+ ? meta?.readOnlyScopes || ["read"]
705
+ : meta?.fullAccessScopes || ["read", "write"];
706
+ }
707
+ export function ensureOAuthCallbackParams(callbackUrl, workspaceId, providerSlug) {
708
+ try {
709
+ const parsed = new URL(callbackUrl);
710
+ if (workspaceId && !parsed.searchParams.get("workspace_id") && !parsed.searchParams.get("user_id")) {
711
+ parsed.searchParams.set("workspace_id", workspaceId);
712
+ }
713
+ if (providerSlug && !parsed.searchParams.get("provider") && !parsed.searchParams.get("toolkit")) {
714
+ parsed.searchParams.set("provider", providerSlug);
715
+ }
716
+ return parsed.toString();
717
+ }
718
+ catch {
719
+ return callbackUrl;
720
+ }
721
+ }
722
+ /**
723
+ * Normalizes upstream Composio hosted link URLs (`connect.composio.dev/link/lk_...`,
724
+ * `dashboard.composio.dev/link/lk_...`, `backend.composio.dev/api/v3/s/...`, or
725
+ * legacy `/oauth/connect/lk_...`) directly to Composio's native hosted OAuth URL
726
+ * (`https://connect.composio.dev/link/<token>`), avoiding intermediate custom pages.
727
+ */
728
+ export function wrapMuxoConnectUrl(rawUrl, _baseUrl, _params) {
729
+ if (!rawUrl)
730
+ return null;
731
+ const trimmed = String(rawUrl).trim();
732
+ if (!trimmed)
733
+ return null;
734
+ // Unwrap any legacy /oauth/connect/<token> or /connect/<token> URLs back to native Composio link
735
+ const wrappedMatch = trimmed.match(/\/(?:oauth\/)?connect\/(lk_[A-Za-z0-9_-]+|s_[A-Za-z0-9_-]+)/);
736
+ if (wrappedMatch) {
737
+ const token = wrappedMatch[1];
738
+ if (token.startsWith("s_")) {
739
+ return `https://backend.composio.dev/api/v3/s/${encodeURIComponent(token.slice(2))}`;
740
+ }
741
+ return `https://connect.composio.dev/link/${encodeURIComponent(token)}`;
742
+ }
743
+ const linkMatch = trimmed.match(/\/link\/(lk_[A-Za-z0-9_-]+)/);
744
+ if (linkMatch) {
745
+ return `https://connect.composio.dev/link/${encodeURIComponent(linkMatch[1])}`;
746
+ }
747
+ const shortMatch = trimmed.match(/\/api\/v3\/s\/([A-Za-z0-9_-]+)/);
748
+ if (shortMatch) {
749
+ return `https://backend.composio.dev/api/v3/s/${encodeURIComponent(shortMatch[1])}`;
750
+ }
751
+ return trimmed;
752
+ }
753
+ function formatToolkitDisplayName(slug) {
754
+ const clean = (slug || "app").toLowerCase().replace(/^app\./, "");
755
+ const known = ENTERPRISE_TOOLKITS_CATALOG.find((t) => t.slug === clean) ||
756
+ STRIPE_PROJECTS_TOOLKITS_CATALOG.find((t) => t.slug === clean);
757
+ if (known)
758
+ return known.name;
759
+ return clean.charAt(0).toUpperCase() + clean.slice(1);
760
+ }
761
+ export async function fetchMuxoConnectLinkMetadata(token, fallback) {
762
+ const cleanToken = String(token || "").trim();
763
+ const fallbackSlug = (fallback?.providerSlug || "github").toLowerCase().replace(/^app\./, "");
764
+ const defaultMeta = {
765
+ token: cleanToken,
766
+ toolkitSlug: fallbackSlug,
767
+ toolkitName: formatToolkitDisplayName(fallbackSlug),
768
+ connectedAccountId: fallback?.connectedAccountId || null,
769
+ authMode: "OAUTH2",
770
+ status: "INITIALIZING",
771
+ callbackUrl: fallback?.callbackUrl || null,
772
+ expectedInputFields: [],
773
+ };
774
+ if (!cleanToken || cleanToken.startsWith("s_") || cleanToken.startsWith("lk_test")) {
775
+ return defaultMeta;
776
+ }
777
+ try {
778
+ const res = await fetch(`https://backend.composio.dev/api/v3.1/internal/connected_accounts/link/${encodeURIComponent(cleanToken)}`, {
779
+ method: "GET",
780
+ headers: { Accept: "application/json" },
781
+ signal: AbortSignal.timeout(6000),
782
+ });
783
+ if (!res.ok)
784
+ return defaultMeta;
785
+ const data = (await res.json());
786
+ const tkSlug = String(data.toolkit?.slug || fallbackSlug).toLowerCase();
787
+ const tkName = String(data.toolkit?.name || formatToolkitDisplayName(tkSlug));
788
+ const rawFields = Array.isArray(data.connected_account?.expected_input_fields)
789
+ ? data.connected_account.expected_input_fields
790
+ : [];
791
+ const expectedInputFields = rawFields
792
+ .filter((f) => f && typeof f === "object" && typeof f.name === "string")
793
+ .map((f) => ({
794
+ name: String(f.name),
795
+ type: typeof f.type === "string" ? f.type : "text",
796
+ label: typeof f.displayName === "string"
797
+ ? f.displayName
798
+ : typeof f.label === "string"
799
+ ? f.label
800
+ : String(f.name),
801
+ description: typeof f.description === "string" ? f.description : undefined,
802
+ required: f.required !== false,
803
+ default: typeof f.default === "string" ? f.default : null,
804
+ }));
805
+ return {
806
+ token: cleanToken,
807
+ toolkitSlug: tkSlug,
808
+ toolkitName: tkName,
809
+ connectedAccountId: data.connected_account?.id || defaultMeta.connectedAccountId,
810
+ authMode: String(data.connected_account?.mode || "OAUTH2"),
811
+ status: String(data.connected_account?.status || "INITIALIZING"),
812
+ callbackUrl: data.connected_account?.callback_url || defaultMeta.callbackUrl,
813
+ expectedInputFields,
814
+ };
815
+ }
816
+ catch {
817
+ return defaultMeta;
818
+ }
819
+ }
820
+ async function resolveShortRedirectUrl(url) {
821
+ if (!url.includes("/api/v3/s/"))
822
+ return url;
823
+ try {
824
+ const res = await fetch(url, {
825
+ method: "GET",
826
+ redirect: "manual",
827
+ signal: AbortSignal.timeout(5000),
828
+ });
829
+ const loc = res.headers.get("location");
830
+ return loc || url;
831
+ }
832
+ catch {
833
+ return url;
834
+ }
835
+ }
836
+ export async function submitMuxoConnectLink(token, input = {}, fallback) {
837
+ const cleanToken = String(token || "").trim();
838
+ if (!cleanToken) {
839
+ return {
840
+ ok: false,
841
+ status: "FAILED",
842
+ redirectUrl: null,
843
+ connectedAccountId: null,
844
+ error: "Missing connection token.",
845
+ };
846
+ }
847
+ if (cleanToken.startsWith("s_")) {
848
+ const shortCode = cleanToken.slice(2);
849
+ const shortUrl = `https://backend.composio.dev/api/v3/s/${encodeURIComponent(shortCode)}`;
850
+ const resolved = await resolveShortRedirectUrl(shortUrl);
851
+ return {
852
+ ok: true,
853
+ status: "INITIATED",
854
+ redirectUrl: resolved,
855
+ connectedAccountId: fallback?.connectedAccountId || null,
856
+ };
857
+ }
858
+ if (cleanToken.startsWith("lk_test")) {
859
+ const cb = fallback?.callbackUrl ||
860
+ `https://api.muxo.ai/oauth/callback?workspace_id=${encodeURIComponent(fallback?.workspaceId || "ws_default")}&provider=${encodeURIComponent(fallback?.providerSlug || "github")}&status=success`;
861
+ return {
862
+ ok: true,
863
+ status: "ACTIVE",
864
+ redirectUrl: cb,
865
+ connectedAccountId: fallback?.connectedAccountId || `ca_${cleanToken}`,
866
+ };
867
+ }
868
+ try {
869
+ const res = await fetch(`https://backend.composio.dev/api/v3.1/internal/connected_accounts/link/${encodeURIComponent(cleanToken)}`, {
870
+ method: "POST",
871
+ headers: {
872
+ "Content-Type": "application/json",
873
+ Accept: "application/json",
874
+ },
875
+ body: JSON.stringify({ input: input || {} }),
876
+ signal: AbortSignal.timeout(8000),
877
+ });
878
+ const data = (await res.json().catch(() => ({})));
879
+ if (!res.ok) {
880
+ if (cleanToken.startsWith("lk_")) {
881
+ return {
882
+ ok: true,
883
+ status: "INITIATED",
884
+ redirectUrl: `https://connect.composio.dev/link/${encodeURIComponent(cleanToken)}`,
885
+ connectedAccountId: fallback?.connectedAccountId || null,
886
+ };
887
+ }
888
+ const errMsg = typeof data.error === "object" && data.error?.message
889
+ ? data.error.message
890
+ : typeof data.error === "string"
891
+ ? data.error
892
+ : data.message || `Authorization handoff failed (HTTP ${res.status})`;
893
+ return {
894
+ ok: false,
895
+ status: "FAILED",
896
+ redirectUrl: null,
897
+ connectedAccountId: fallback?.connectedAccountId || null,
898
+ error: errMsg,
899
+ };
900
+ }
901
+ if (data.redirect_url) {
902
+ const directUrl = await resolveShortRedirectUrl(data.redirect_url);
903
+ return {
904
+ ok: true,
905
+ status: data.status || "INITIATED",
906
+ redirectUrl: directUrl,
907
+ connectedAccountId: data.connected_account_id || fallback?.connectedAccountId || null,
908
+ };
909
+ }
910
+ const finalUrl = data.final_redirect_url ||
911
+ data.callback_url ||
912
+ fallback?.callbackUrl ||
913
+ "/";
914
+ return {
915
+ ok: true,
916
+ status: data.status || "ACTIVE",
917
+ redirectUrl: finalUrl,
918
+ connectedAccountId: data.connected_account_id || fallback?.connectedAccountId || null,
919
+ };
920
+ }
921
+ catch (err) {
922
+ if (cleanToken.startsWith("lk_")) {
923
+ return {
924
+ ok: true,
925
+ status: "INITIATED",
926
+ redirectUrl: `https://connect.composio.dev/link/${encodeURIComponent(cleanToken)}`,
927
+ connectedAccountId: fallback?.connectedAccountId || null,
928
+ };
929
+ }
930
+ return {
931
+ ok: false,
932
+ status: "FAILED",
933
+ redirectUrl: null,
934
+ connectedAccountId: fallback?.connectedAccountId || null,
935
+ error: err?.message || "Unable to reach upstream authorization service.",
936
+ };
937
+ }
938
+ }
939
+ const STRIPE_PROJECTS_PROVIDER_ALIASES = {
940
+ "customer.io": "customerio",
941
+ customer_io: "customerio",
942
+ "wordpress.com": "wordpress",
943
+ wordpresscom: "wordpress",
944
+ wordpress_com: "wordpress",
945
+ base44: "base44_projects",
946
+ "base-44": "base44_projects",
947
+ base_44: "base44_projects",
948
+ laravel: "laravel_cloud",
949
+ laravelcloud: "laravel_cloud",
950
+ "laravel-cloud": "laravel_cloud",
951
+ fly: "flyio",
952
+ "fly.io": "flyio",
953
+ "fly-io": "flyio",
954
+ "here.now": "herenow",
955
+ "here-now": "herenow",
956
+ here_now: "herenow",
957
+ planet_scale: "planetscale",
958
+ eleven_labs: "elevenlabs",
959
+ open_router: "openrouter",
960
+ browser_base: "browserbase",
961
+ super_memory: "supermemory",
962
+ agent_mail: "agentmail",
963
+ agent_phone: "agentphone",
964
+ revenue_cat: "revenuecat",
965
+ };
966
+ /**
967
+ * Canonical Stripe Projects Cloud Infrastructure providers (`stripe_projects` lane).
968
+ * These providers are provisioned and deployed directly through Stripe Projects
969
+ * (and/or Muxo instant cloud provisioning) without Composio OAuth handoffs.
970
+ */
971
+ export const STRIPE_PROJECTS_PROVIDER_SLUGS = new Set([
972
+ // Hosting, Edge, Sites & App Platforms (14)
973
+ "vercel",
974
+ "cloudflare",
975
+ "netlify",
976
+ "render",
977
+ "railway",
978
+ "flyio",
979
+ "herenow",
980
+ "createos",
981
+ "laravel_cloud",
982
+ "base44_projects",
983
+ "wordpress",
984
+ "squarespace",
985
+ "wix",
986
+ "gitlab",
987
+ // Databases, Vector DBs, Cache & Storage (9)
988
+ "turso",
989
+ "neon",
990
+ "supabase",
991
+ "upstash",
992
+ "prisma",
993
+ "planetscale",
994
+ "clickhouse",
995
+ "chroma",
996
+ "mongodb",
997
+ // Auth, Identity & Wallets (4)
998
+ "clerk",
999
+ "workos",
1000
+ "auth0",
1001
+ "privy",
1002
+ // Compute, Devboxes & Sandboxes (6)
1003
+ "e2b",
1004
+ "daytona",
1005
+ "blaxel",
1006
+ "modal",
1007
+ "runloop",
1008
+ "depot",
1009
+ // Browser & Web Automation (3)
1010
+ "browserbase",
1011
+ "steel",
1012
+ "kernel",
1013
+ // AI, Search, Scrape, Memory, Voice & Video Infrastructure (12)
1014
+ "exa",
1015
+ "firecrawl",
1016
+ "perplexity",
1017
+ "openrouter",
1018
+ "supermemory",
1019
+ "elevenlabs",
1020
+ "tabstack",
1021
+ "algolia",
1022
+ "parallel",
1023
+ "heygen",
1024
+ "athena",
1025
+ "chatbase",
1026
+ // Email, Messaging, Notifications & Physical Mail (8)
1027
+ "resend",
1028
+ "agentmail",
1029
+ "agentphone",
1030
+ "twilio",
1031
+ "customerio",
1032
+ "knock",
1033
+ "postalform",
1034
+ "quo",
1035
+ // Analytics, Observability, Workflows, Media & Domains (8)
1036
+ "posthog",
1037
+ "datadog",
1038
+ "inngest",
1039
+ "cloudinary",
1040
+ "spaceship",
1041
+ "amplitude",
1042
+ "mixpanel",
1043
+ "pydantic",
1044
+ // Feature Flags, Entitlements, Metering, Retention & Subscriptions (5)
1045
+ "schematic",
1046
+ "stigg",
1047
+ "metronome",
1048
+ "churnkey",
1049
+ "revenuecat",
1050
+ ]);
1051
+ export const STRIPE_PROJECTS_HOSTING_PROVIDERS = new Set([
1052
+ "vercel",
1053
+ "herenow",
1054
+ "netlify",
1055
+ "render",
1056
+ "cloudflare",
1057
+ "railway",
1058
+ "flyio",
1059
+ "createos",
1060
+ "laravel_cloud",
1061
+ "base44_projects",
1062
+ "wordpress",
1063
+ "squarespace",
1064
+ "wix",
1065
+ ]);
1066
+ export const STRIPE_PROJECTS_DATABASE_PROVIDERS = new Set([
1067
+ "turso",
1068
+ "neon",
1069
+ "supabase",
1070
+ "upstash",
1071
+ "prisma",
1072
+ "planetscale",
1073
+ "clickhouse",
1074
+ "chroma",
1075
+ "mongodb",
1076
+ ]);
1077
+ export const STRIPE_PROJECTS_MESSAGING_PROVIDERS = new Set([
1078
+ "resend",
1079
+ "agentmail",
1080
+ "agentphone",
1081
+ "twilio",
1082
+ "customerio",
1083
+ "knock",
1084
+ "postalform",
1085
+ "quo",
1086
+ ]);
1087
+ export const STRIPE_PROJECTS_AI_SEARCH_PROVIDERS = new Set([
1088
+ "exa",
1089
+ "firecrawl",
1090
+ "perplexity",
1091
+ "openrouter",
1092
+ "supermemory",
1093
+ "elevenlabs",
1094
+ "tabstack",
1095
+ "algolia",
1096
+ "parallel",
1097
+ "heygen",
1098
+ "athena",
1099
+ "chatbase",
1100
+ ]);
1101
+ export const STRIPE_PROJECTS_SANDBOX_BROWSER_PROVIDERS = new Set([
1102
+ "e2b",
1103
+ "daytona",
1104
+ "blaxel",
1105
+ "modal",
1106
+ "runloop",
1107
+ "depot",
1108
+ "browserbase",
1109
+ "steel",
1110
+ "kernel",
1111
+ ]);
1112
+ export const STRIPE_PROJECTS_CANONICAL_RESOURCE_SLUG = {
1113
+ // Hosting & Edge
1114
+ vercel: "resource.vercel.project",
1115
+ cloudflare: "resource.cloudflare.worker",
1116
+ netlify: "resource.netlify.project",
1117
+ render: "resource.render.static_site",
1118
+ railway: "resource.railway.hosting",
1119
+ flyio: "resource.flyio.app",
1120
+ herenow: "resource.herenow.hosting",
1121
+ createos: "resource.createos.project",
1122
+ laravel_cloud: "resource.laravel_cloud.application",
1123
+ base44_projects: "resource.base44_projects.app",
1124
+ wordpress: "resource.wordpress.site",
1125
+ squarespace: "resource.squarespace.domain",
1126
+ wix: "resource.wix.headless",
1127
+ gitlab: "resource.gitlab.project",
1128
+ // Databases & Storage
1129
+ turso: "resource.turso.database",
1130
+ neon: "resource.neon.postgres",
1131
+ supabase: "resource.supabase.project",
1132
+ upstash: "resource.upstash.redis",
1133
+ prisma: "resource.prisma.database",
1134
+ planetscale: "resource.planetscale.postgresql",
1135
+ clickhouse: "resource.clickhouse.clickhouse",
1136
+ chroma: "resource.chroma.database",
1137
+ mongodb: "resource.mongodb.atlas",
1138
+ // Auth & Wallets
1139
+ clerk: "resource.clerk.auth",
1140
+ workos: "resource.workos.auth",
1141
+ auth0: "resource.auth0.client",
1142
+ privy: "resource.privy.app",
1143
+ // Sandboxes & Compute
1144
+ e2b: "resource.e2b.sandboxes",
1145
+ daytona: "resource.daytona.sandbox",
1146
+ blaxel: "resource.blaxel.sandbox",
1147
+ modal: "resource.modal.serverless_gpu",
1148
+ runloop: "resource.runloop.sandbox",
1149
+ depot: "resource.depot.api",
1150
+ // Cloud Browsers
1151
+ browserbase: "resource.browserbase.project",
1152
+ steel: "resource.steel.browser",
1153
+ kernel: "resource.kernel.project",
1154
+ // AI, Search, Scrape, Memory, Voice & Video
1155
+ exa: "resource.exa.search",
1156
+ firecrawl: "resource.firecrawl.api",
1157
+ perplexity: "resource.perplexity.api",
1158
+ openrouter: "resource.openrouter.api",
1159
+ supermemory: "resource.supermemory.memory",
1160
+ elevenlabs: "resource.elevenlabs.tts",
1161
+ tabstack: "resource.tabstack.api",
1162
+ algolia: "resource.algolia.application",
1163
+ parallel: "resource.parallel.api",
1164
+ heygen: "resource.heygen.api",
1165
+ athena: "resource.athena.agents",
1166
+ chatbase: "resource.chatbase.agent",
1167
+ // Email, Messaging, Notifications & Mail
1168
+ resend: "resource.resend.email",
1169
+ agentmail: "resource.agentmail.api",
1170
+ agentphone: "resource.agentphone.number",
1171
+ twilio: "resource.twilio.email",
1172
+ customerio: "resource.customerio.workspace",
1173
+ knock: "resource.knock.project",
1174
+ postalform: "resource.postalform.mail",
1175
+ quo: "resource.quo.app",
1176
+ // Analytics, Observability, Workflows, Media & Domains
1177
+ posthog: "resource.posthog.analytics",
1178
+ datadog: "resource.datadog.observability",
1179
+ inngest: "resource.inngest.app",
1180
+ cloudinary: "resource.cloudinary.media",
1181
+ spaceship: "resource.spaceship.domain",
1182
+ amplitude: "resource.amplitude.analytics",
1183
+ mixpanel: "resource.mixpanel.analytics",
1184
+ pydantic: "resource.pydantic.logfire",
1185
+ // Feature Flags, Entitlements, Metering & Retention
1186
+ schematic: "resource.schematic.schematic_environment",
1187
+ stigg: "resource.stigg.environment",
1188
+ metronome: "resource.metronome.sandbox",
1189
+ churnkey: "resource.churnkey.retention",
1190
+ revenuecat: "resource.revenuecat.app",
1191
+ };
1192
+ /**
1193
+ * Multi-service deployable slugs supported per Stripe Projects provider.
1194
+ */
1195
+ export const STRIPE_PROJECTS_MULTI_SERVICE_MAP = {
1196
+ cloudflare: {
1197
+ worker: "resource.cloudflare.worker",
1198
+ workers: "resource.cloudflare.worker",
1199
+ d1: "resource.cloudflare.d1",
1200
+ kv: "resource.cloudflare.kv",
1201
+ r2: "resource.cloudflare.r2",
1202
+ bucket: "resource.cloudflare.r2",
1203
+ storage: "resource.cloudflare.r2",
1204
+ queues: "resource.cloudflare.queues",
1205
+ queue: "resource.cloudflare.queues",
1206
+ hyperdrive: "resource.cloudflare.hyperdrive",
1207
+ browser_run: "resource.cloudflare.browser_run",
1208
+ "browser-run": "resource.cloudflare.browser_run",
1209
+ workers_ai: "resource.cloudflare.workers_ai",
1210
+ "workers-ai": "resource.cloudflare.workers_ai",
1211
+ pages: "resource.cloudflare.pages",
1212
+ },
1213
+ railway: {
1214
+ hosting: "resource.railway.hosting",
1215
+ postgres: "resource.railway.postgres",
1216
+ postgresql: "resource.railway.postgres",
1217
+ redis: "resource.railway.redis",
1218
+ mongo: "resource.railway.mongo",
1219
+ mongodb: "resource.railway.mongo",
1220
+ bucket: "resource.railway.bucket",
1221
+ storage: "resource.railway.bucket",
1222
+ },
1223
+ render: {
1224
+ static_site: "resource.render.static_site",
1225
+ "static-site": "resource.render.static_site",
1226
+ web_service: "resource.render.web_service",
1227
+ "web-service": "resource.render.web_service",
1228
+ postgres: "resource.render.postgres",
1229
+ postgresql: "resource.render.postgres",
1230
+ },
1231
+ upstash: {
1232
+ redis: "resource.upstash.redis",
1233
+ vector: "resource.upstash.vector",
1234
+ qstash: "resource.upstash.qstash",
1235
+ search: "resource.upstash.search",
1236
+ },
1237
+ planetscale: {
1238
+ postgresql: "resource.planetscale.postgresql",
1239
+ postgres: "resource.planetscale.postgresql",
1240
+ mysql: "resource.planetscale.mysql",
1241
+ vitess: "resource.planetscale.mysql",
1242
+ },
1243
+ clickhouse: {
1244
+ clickhouse: "resource.clickhouse.clickhouse",
1245
+ analytics: "resource.clickhouse.clickhouse",
1246
+ postgres: "resource.clickhouse.postgres",
1247
+ },
1248
+ flyio: {
1249
+ app: "resource.flyio.app",
1250
+ mpg: "resource.flyio.mpg",
1251
+ postgres: "resource.flyio.mpg",
1252
+ },
1253
+ blaxel: {
1254
+ sandbox: "resource.blaxel.sandbox",
1255
+ agent_drive: "resource.blaxel.agent_drive",
1256
+ "agent-drive": "resource.blaxel.agent_drive",
1257
+ },
1258
+ stripe: {
1259
+ sandbox: "resource.stripe.sandbox",
1260
+ livemode: "resource.stripe.livemode",
1261
+ },
1262
+ };
1263
+ export const STRIPE_PROJECTS_DEPLOYABLE_CATALOG = [
1264
+ // Hosting & Edge
1265
+ { slug: "resource.vercel.project", upstreamSlug: "vercel/project", providerSlug: "vercel", providerName: "Vercel", serviceId: "project", name: "Vercel: Provision & Deploy Frontend / Static Site Project (deployable)", description: "Provision a Vercel project and optionally deploy static HTML, landing pages, or web files directly to a live URL via Stripe Projects Cloud Infrastructure (zero OAuth handoff required).", categories: ["compute", "hosting", "cdn", "deployment", "frontend", "static_site", "publish", "website", "infrastructure"], defaultPlan: "hobby", availablePlans: ["hobby", "pro"], providerUrl: "https://vercel.com", llmContextUrl: "https://vercel.com/llms.txt" },
1266
+ { slug: "resource.cloudflare.worker", upstreamSlug: "cloudflare/workers", providerSlug: "cloudflare", providerName: "Cloudflare", serviceId: "workers", name: "Cloudflare: Provision & Deploy Edge Worker / Static Site (deployable)", description: "Provision a Cloudflare Worker and optionally deploy static HTML or edge scripts via Stripe Projects (zero OAuth handoff).", categories: ["compute", "hosting", "edge", "cdn", "deployment", "infrastructure"], defaultPlan: "free", availablePlans: ["workers:free", "workers:paid"], providerUrl: "https://cloudflare.com", llmContextUrl: "https://developers.cloudflare.com/llms.txt" },
1267
+ { slug: "resource.cloudflare.d1", upstreamSlug: "cloudflare/d1", providerSlug: "cloudflare", providerName: "Cloudflare", serviceId: "d1", name: "Cloudflare: Provision D1 Serverless SQL Database (deployable)", description: "Provision a Cloudflare D1 serverless SQLite database and optionally apply SQL migrations via Stripe Projects.", categories: ["database", "sql", "sqlite", "edge", "infrastructure"], defaultPlan: "free", availablePlans: ["workers:free", "workers:paid"], providerUrl: "https://cloudflare.com", llmContextUrl: "https://developers.cloudflare.com/d1/llms.txt" },
1268
+ { slug: "resource.cloudflare.kv", upstreamSlug: "cloudflare/kv", providerSlug: "cloudflare", providerName: "Cloudflare", serviceId: "kv", name: "Cloudflare: Provision Workers KV Key-Value Store (deployable)", description: "Provision a globally distributed Cloudflare Workers KV namespace via Stripe Projects.", categories: ["database", "kv", "cache", "storage", "edge", "infrastructure"], defaultPlan: "free", availablePlans: ["workers:free", "workers:paid"], providerUrl: "https://cloudflare.com", llmContextUrl: "https://developers.cloudflare.com/kv/llms.txt" },
1269
+ { slug: "resource.cloudflare.r2", upstreamSlug: "cloudflare/r2", providerSlug: "cloudflare", providerName: "Cloudflare", serviceId: "r2", name: "Cloudflare: Provision R2 Zero-Egress Object Storage Bucket (deployable)", description: "Provision an S3-compatible Cloudflare R2 object storage bucket via Stripe Projects.", categories: ["storage", "object_storage", "cdn", "infrastructure"], defaultPlan: "free", availablePlans: ["workers:free", "workers:paid"], providerUrl: "https://cloudflare.com", llmContextUrl: "https://developers.cloudflare.com/r2/llms.txt" },
1270
+ { slug: "resource.cloudflare.queues", upstreamSlug: "cloudflare/queues", providerSlug: "cloudflare", providerName: "Cloudflare", serviceId: "queues", name: "Cloudflare: Provision Message Queue (deployable)", description: "Provision a Cloudflare Queue for guaranteed message delivery and background workers via Stripe Projects.", categories: ["queues", "messaging", "compute", "edge", "infrastructure"], defaultPlan: "paid", availablePlans: ["workers:paid"], providerUrl: "https://cloudflare.com", llmContextUrl: "https://developers.cloudflare.com/queues/llms.txt" },
1271
+ { slug: "resource.cloudflare.hyperdrive", upstreamSlug: "cloudflare/hyperdrive", providerSlug: "cloudflare", providerName: "Cloudflare", serviceId: "hyperdrive", name: "Cloudflare: Provision Hyperdrive Database Accelerator (deployable)", description: "Provision Cloudflare Hyperdrive connection pooling and query caching for Postgres/MySQL via Stripe Projects.", categories: ["database", "networking", "edge", "infrastructure"], defaultPlan: "free", availablePlans: ["workers:free", "workers:paid"], providerUrl: "https://cloudflare.com", llmContextUrl: "https://developers.cloudflare.com/hyperdrive/llms.txt" },
1272
+ { slug: "resource.cloudflare.browser_run", upstreamSlug: "cloudflare/browser-run", providerSlug: "cloudflare", providerName: "Cloudflare", serviceId: "browser-run", name: "Cloudflare: Provision Browser Rendering API (deployable)", description: "Provision headless Cloudflare Browser Rendering for Playwright/Puppeteer automation at the edge via Stripe Projects.", categories: ["browser", "automation", "edge", "infrastructure"], defaultPlan: "free", availablePlans: ["workers:free", "workers:paid"], providerUrl: "https://cloudflare.com", llmContextUrl: "https://developers.cloudflare.com/browser-rendering/llms.txt" },
1273
+ { slug: "resource.cloudflare.workers_ai", upstreamSlug: "cloudflare/workers-ai", providerSlug: "cloudflare", providerName: "Cloudflare", serviceId: "workers-ai", name: "Cloudflare: Provision Workers AI Serverless GPU Inference (deployable)", description: "Provision serverless GPU inference on Cloudflare Workers AI via Stripe Projects.", categories: ["ai", "inference", "edge", "infrastructure"], defaultPlan: "free", availablePlans: ["workers:free", "workers:paid"], providerUrl: "https://cloudflare.com", llmContextUrl: "https://developers.cloudflare.com/workers-ai/llms.txt" },
1274
+ { slug: "resource.cloudflare.pages", upstreamSlug: "cloudflare/pages", providerSlug: "cloudflare", providerName: "Cloudflare", serviceId: "pages", name: "Cloudflare: Provision & Deploy Cloudflare Pages Site (deployable)", description: "Provision and deploy a static or full-stack Cloudflare Pages project via Stripe Projects.", categories: ["hosting", "deployment", "frontend", "static_site", "cdn", "infrastructure"], defaultPlan: "free", availablePlans: ["workers:free", "workers:paid"], providerUrl: "https://cloudflare.com", llmContextUrl: "https://developers.cloudflare.com/pages/llms.txt" },
1275
+ { slug: "resource.netlify.project", upstreamSlug: "netlify/project", providerSlug: "netlify", providerName: "Netlify", serviceId: "project", name: "Netlify: Provision & Deploy Web Project / Static Site (deployable)", description: "Provision a Netlify site and optionally deploy static HTML/files directly to a live URL via Stripe Projects.", categories: ["compute", "hosting", "deployment", "frontend", "static_site", "publish", "website", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://netlify.com", llmContextUrl: "https://docs.netlify.com/llms.txt" },
1276
+ { slug: "resource.render.static_site", upstreamSlug: "render/static-site", providerSlug: "render", providerName: "Render", serviceId: "static-site", name: "Render: Provision & Deploy Static Site (deployable)", description: "Provision a Render static site and optionally publish HTML/files directly via Stripe Projects.", categories: ["compute", "hosting", "deployment", "frontend", "static_site", "publish", "website", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "professional"], providerUrl: "https://render.com", llmContextUrl: "https://render.com/docs/llms.txt" },
1277
+ { slug: "resource.render.web_service", upstreamSlug: "render/web-service", providerSlug: "render", providerName: "Render", serviceId: "web-service", name: "Render: Provision Managed Web Service (deployable)", description: "Provision a managed Render web service for Node, Python, Go, or Docker apps via Stripe Projects.", categories: ["compute", "hosting", "deployment", "containers", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "professional"], providerUrl: "https://render.com", llmContextUrl: "https://render.com/docs/llms.txt" },
1278
+ { slug: "resource.render.postgres", upstreamSlug: "render/postgres", providerSlug: "render", providerName: "Render", serviceId: "postgres", name: "Render: Provision Managed PostgreSQL Database (deployable)", description: "Provision a managed Render PostgreSQL database and apply SQL migrations via Stripe Projects.", categories: ["database", "postgresql", "sql", "migration", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "professional"], providerUrl: "https://render.com", llmContextUrl: "https://render.com/docs/llms.txt" },
1279
+ { slug: "resource.railway.hosting", upstreamSlug: "railway/hosting", providerSlug: "railway", providerName: "Railway", serviceId: "hosting", name: "Railway: Provision & Deploy Full-Stack Hosting Service (deployable)", description: "Provision Railway full-stack application hosting and optionally deploy HTML/files via Stripe Projects.", categories: ["compute", "hosting", "deployment", "containers", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://railway.com", llmContextUrl: "https://docs.railway.com/llms.txt" },
1280
+ { slug: "resource.railway.postgres", upstreamSlug: "railway/postgres", providerSlug: "railway", providerName: "Railway", serviceId: "postgres", name: "Railway: Provision Managed Postgres Database (deployable)", description: "Provision a Railway PostgreSQL database and optionally run SQL migrations via Stripe Projects.", categories: ["database", "postgresql", "sql", "migration", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://railway.com", llmContextUrl: "https://docs.railway.com/llms.txt" },
1281
+ { slug: "resource.railway.redis", upstreamSlug: "railway/redis", providerSlug: "railway", providerName: "Railway", serviceId: "redis", name: "Railway: Provision Managed Redis Cache (deployable)", description: "Provision a Railway Redis instance for caching, sessions, and queues via Stripe Projects.", categories: ["database", "redis", "cache", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://railway.com", llmContextUrl: "https://docs.railway.com/llms.txt" },
1282
+ { slug: "resource.railway.mongo", upstreamSlug: "railway/mongo", providerSlug: "railway", providerName: "Railway", serviceId: "mongo", name: "Railway: Provision Managed MongoDB Instance (deployable)", description: "Provision a Railway MongoDB document database via Stripe Projects.", categories: ["database", "mongodb", "nosql", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://railway.com", llmContextUrl: "https://docs.railway.com/llms.txt" },
1283
+ { slug: "resource.railway.bucket", upstreamSlug: "railway/bucket", providerSlug: "railway", providerName: "Railway", serviceId: "bucket", name: "Railway: Provision S3-Compatible Object Storage Bucket (deployable)", description: "Provision a Railway S3-compatible object storage bucket via Stripe Projects.", categories: ["storage", "object_storage", "s3", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://railway.com", llmContextUrl: "https://docs.railway.com/llms.txt" },
1284
+ { slug: "resource.flyio.app", upstreamSlug: "flyio/app", providerSlug: "flyio", providerName: "Fly.io", serviceId: "app", name: "Fly.io: Provision & Deploy Global MicroVM App (deployable)", description: "Provision a Fly.io MicroVM application and optionally deploy static/web assets via Stripe Projects.", categories: ["compute", "hosting", "deployment", "containers", "edge", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pay_as_you_go"], providerUrl: "https://fly.io", llmContextUrl: "https://fly.io/docs/llms.txt" },
1285
+ { slug: "resource.flyio.mpg", upstreamSlug: "flyio/mpg", providerSlug: "flyio", providerName: "Fly.io", serviceId: "mpg", name: "Fly.io: Provision Managed Postgres Cluster (deployable)", description: "Provision a Fly.io Managed Postgres (MPG) cluster and run SQL migrations via Stripe Projects.", categories: ["database", "postgresql", "sql", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pay_as_you_go"], providerUrl: "https://fly.io", llmContextUrl: "https://fly.io/docs/llms.txt" },
1286
+ { slug: "resource.herenow.hosting", upstreamSlug: "herenow/hosting", providerSlug: "herenow", providerName: "Here.now", serviceId: "hosting", name: "Here.now: Provision & Publish Instant Static Site Hosting (deployable)", description: "Provision Here.now instant web hosting and publish static HTML/files directly to a live URL via Stripe Projects.", categories: ["compute", "hosting", "deployment", "frontend", "static_site", "publish", "website", "infrastructure"], defaultPlan: "free", availablePlans: ["free"], providerUrl: "https://here.now", llmContextUrl: "https://here.now/llms.txt" },
1287
+ { slug: "resource.createos.project", upstreamSlug: "createos/project", providerSlug: "createos", providerName: "CreateOS", serviceId: "project", name: "CreateOS: Provision Unified Cloud Workspace & Hosting (deployable)", description: "Provision a CreateOS cloud project for deploying web apps, APIs, and agent services via Stripe Projects.", categories: ["compute", "hosting", "deployment", "ai", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://createos.nodeops.network", llmContextUrl: "https://createos.nodeops.network/llms.txt" },
1288
+ { slug: "resource.laravel_cloud.application", upstreamSlug: "laravel_cloud/application", providerSlug: "laravel_cloud", providerName: "Laravel Cloud", serviceId: "application", name: "Laravel Cloud: Provision Managed PHP/Laravel Application (deployable)", description: "Provision a managed Laravel Cloud application with autoscaling, zero-downtime deploys, and TLS via Stripe Projects.", categories: ["compute", "hosting", "php", "laravel", "deployment", "infrastructure"], defaultPlan: "starter", availablePlans: ["starter", "growth"], providerUrl: "https://cloud.laravel.com", llmContextUrl: "https://cloud.laravel.com/llms.txt" },
1289
+ { slug: "resource.base44_projects.app", upstreamSlug: "base44_projects/app", providerSlug: "base44_projects", providerName: "Base 44", serviceId: "app", name: "Base 44: Provision Full-Stack App Backend & Database (deployable)", description: "Provision a Base 44 full-stack application with built-in database, auth, storage, and hosting via Stripe Projects.", categories: ["compute", "hosting", "database", "auth", "storage", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://base44.com", llmContextUrl: "https://base44.com/llms.txt" },
1290
+ { slug: "resource.wordpress.site", upstreamSlug: "wordpress.com/site", providerSlug: "wordpress", providerName: "WordPress.com", serviceId: "site", name: "WordPress.com: Provision Managed WordPress Site (deployable)", description: "Provision a managed WordPress.com site with global CDN, REST API, and automated backups via Stripe Projects.", categories: ["compute", "hosting", "cms", "website", "publish", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "starter", "creator"], providerUrl: "https://wordpress.com", llmContextUrl: "https://developer.wordpress.com/llms.txt" },
1291
+ { slug: "resource.squarespace.domain", upstreamSlug: "squarespace/domain", providerSlug: "squarespace", providerName: "Squarespace", serviceId: "domain", name: "Squarespace: Provision Domain & Site Registration (deployable)", description: "Provision a Squarespace domain and website endpoint via Stripe Projects.", categories: ["domains", "hosting", "ecommerce", "website", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "business"], providerUrl: "https://squarespace.com" },
1292
+ { slug: "resource.wix.headless", upstreamSlug: "wix/headless", providerSlug: "wix", providerName: "Wix", serviceId: "headless", name: "Wix: Provision Headless Commerce, Bookings & CMS Project (deployable)", description: "Provision a Wix Headless project with eCommerce, Bookings, Events, and CMS APIs via Stripe Projects.", categories: ["ecommerce", "cms", "hosting", "website", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "core"], providerUrl: "https://wix.com", llmContextUrl: "https://dev.wix.com/llms.txt" },
1293
+ { slug: "resource.gitlab.project", upstreamSlug: "gitlab/project", providerSlug: "gitlab", providerName: "GitLab", serviceId: "project", name: "GitLab: Provision DevSecOps Repository & CI/CD Project (deployable)", description: "Provision a GitLab repository and CI/CD pipeline project via Stripe Projects.", categories: ["compute", "devops", "git", "ci_cd", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "premium"], providerUrl: "https://gitlab.com", llmContextUrl: "https://docs.gitlab.com/llms.txt" },
1294
+ // Databases, Vector DBs, Cache & Storage
1295
+ { slug: "resource.supabase.project", upstreamSlug: "supabase/project", providerSlug: "supabase", providerName: "Supabase", serviceId: "project", name: "Supabase: Provision & Migrate Managed Postgres, Auth & Vector Project (deployable)", description: "Provision a Supabase project (Postgres, Auth, Storage, Vector) and optionally apply SQL migrations/schema directly via Stripe Projects (zero OAuth handoff).", categories: ["database", "postgresql", "sql", "migration", "auth", "storage", "vector", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://supabase.com", llmContextUrl: "https://supabase.com/llms.txt" },
1296
+ { slug: "resource.turso.database", upstreamSlug: "turso/database", providerSlug: "turso", providerName: "Turso", serviceId: "database", name: "Turso: Provision & Migrate Edge SQLite / libSQL Database (deployable)", description: "Provision a Turso edge SQLite/libSQL database with vector search and optionally apply SQL migrations directly via Stripe Projects.", categories: ["database", "sqlite", "libsql", "sql", "migration", "edge", "infrastructure"], defaultPlan: "starter", availablePlans: ["starter", "developer", "scaler", "pro"], providerUrl: "https://turso.tech", llmContextUrl: "https://docs.turso.tech/llms.txt" },
1297
+ { slug: "resource.neon.postgres", upstreamSlug: "neon/postgres", providerSlug: "neon", providerName: "Neon", serviceId: "postgres", name: "Neon: Provision & Migrate Serverless Postgres Database (deployable)", description: "Provision a serverless Neon Postgres database with instant branching and optionally apply SQL migrations directly via Stripe Projects.", categories: ["database", "postgresql", "sql", "migration", "serverless", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "launch", "scale"], providerUrl: "https://neon.tech", llmContextUrl: "https://neon.tech/llms.txt" },
1298
+ { slug: "resource.upstash.redis", upstreamSlug: "upstash/redis", providerSlug: "upstash", providerName: "Upstash", serviceId: "redis", name: "Upstash: Provision Serverless Redis Cache & Rate Limiter (deployable)", description: "Provision a serverless Upstash Redis database with HTTP REST and global replication via Stripe Projects.", categories: ["database", "redis", "cache", "kv", "serverless", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "payg"], providerUrl: "https://upstash.com", llmContextUrl: "https://upstash.com/docs/llms.txt" },
1299
+ { slug: "resource.upstash.vector", upstreamSlug: "upstash/vector", providerSlug: "upstash", providerName: "Upstash", serviceId: "vector", name: "Upstash: Provision Serverless Vector Index for AI & RAG (deployable)", description: "Provision a serverless Upstash Vector index for embeddings, semantic search, and RAG via Stripe Projects.", categories: ["database", "vector", "ai", "search", "serverless", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "payg"], providerUrl: "https://upstash.com", llmContextUrl: "https://upstash.com/docs/vector/llms.txt" },
1300
+ { slug: "resource.upstash.qstash", upstreamSlug: "upstash/qstash", providerSlug: "upstash", providerName: "Upstash", serviceId: "qstash", name: "Upstash: Provision QStash Serverless HTTP Queue & Scheduler (deployable)", description: "Provision Upstash QStash serverless messaging, webhook retries, and cron schedules via Stripe Projects.", categories: ["queues", "messaging", "workflows", "serverless", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "payg"], providerUrl: "https://upstash.com", llmContextUrl: "https://upstash.com/docs/qstash/llms.txt" },
1301
+ { slug: "resource.upstash.search", upstreamSlug: "upstash/search", providerSlug: "upstash", providerName: "Upstash", serviceId: "search", name: "Upstash: Provision Serverless Full-Text & AI Search Index (deployable)", description: "Provision an Upstash Search index for full-text and hybrid semantic search via Stripe Projects.", categories: ["search", "database", "ai", "serverless", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "payg"], providerUrl: "https://upstash.com", llmContextUrl: "https://upstash.com/docs/llms.txt" },
1302
+ { slug: "resource.prisma.database", upstreamSlug: "prisma/database", providerSlug: "prisma", providerName: "Prisma", serviceId: "database", name: "Prisma: Provision & Migrate Managed Postgres Database (deployable)", description: "Provision a Prisma Postgres database with connection pooling and optionally apply SQL migrations via Stripe Projects.", categories: ["database", "postgresql", "sql", "migration", "orm", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "starter", "pro", "business"], providerUrl: "https://prisma.io", llmContextUrl: "https://prisma.io/llms.txt" },
1303
+ { slug: "resource.planetscale.postgresql", upstreamSlug: "planetscale/postgresql", providerSlug: "planetscale", providerName: "PlanetScale", serviceId: "postgresql", name: "PlanetScale: Provision & Migrate NVMe Managed PostgreSQL (deployable)", description: "Provision a high-performance PlanetScale PostgreSQL database and apply SQL migrations via Stripe Projects.", categories: ["database", "postgresql", "sql", "migration", "infrastructure"], defaultPlan: "starter", availablePlans: ["starter", "scaler"], providerUrl: "https://planetscale.com", llmContextUrl: "https://planetscale.com/docs/llms.txt" },
1304
+ { slug: "resource.planetscale.mysql", upstreamSlug: "planetscale/mysql", providerSlug: "planetscale", providerName: "PlanetScale", serviceId: "mysql", name: "PlanetScale: Provision & Migrate Vitess MySQL Database (deployable)", description: "Provision a horizontally sharded PlanetScale Vitess/MySQL database and apply SQL schema migrations via Stripe Projects.", categories: ["database", "mysql", "vitess", "sql", "migration", "infrastructure"], defaultPlan: "starter", availablePlans: ["starter", "scaler"], providerUrl: "https://planetscale.com", llmContextUrl: "https://planetscale.com/docs/llms.txt" },
1305
+ { slug: "resource.clickhouse.clickhouse", upstreamSlug: "clickhouse/clickhouse", providerSlug: "clickhouse", providerName: "ClickHouse", serviceId: "clickhouse", name: "ClickHouse: Provision Real-Time Columnar Analytics Database (deployable)", description: "Provision a ClickHouse real-time columnar analytics database and run SQL DDL/queries via Stripe Projects.", categories: ["database", "analytics", "sql", "olap", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "scale"], providerUrl: "https://clickhouse.com", llmContextUrl: "https://clickhouse.com/docs/llms.txt" },
1306
+ { slug: "resource.clickhouse.postgres", upstreamSlug: "clickhouse/postgres", providerSlug: "clickhouse", providerName: "ClickHouse", serviceId: "postgres", name: "ClickHouse: Provision Managed Postgres with ClickHouse Analytics (deployable)", description: "Provision a ClickHouse-integrated PostgreSQL instance for hybrid OLTP + OLAP workloads via Stripe Projects.", categories: ["database", "postgresql", "analytics", "sql", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "scale"], providerUrl: "https://clickhouse.com", llmContextUrl: "https://clickhouse.com/docs/llms.txt" },
1307
+ { slug: "resource.chroma.database", upstreamSlug: "chroma/database", providerSlug: "chroma", providerName: "Chroma", serviceId: "database", name: "Chroma: Provision AI Vector & Full-Text Database (deployable)", description: "Provision a serverless Chroma vector and full-text search database for embeddings and RAG via Stripe Projects.", categories: ["database", "vector", "ai", "search", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "starter"], providerUrl: "https://trychroma.com", llmContextUrl: "https://docs.trychroma.com/llms.txt" },
1308
+ { slug: "resource.mongodb.atlas", upstreamSlug: "mongodb/atlas", providerSlug: "mongodb", providerName: "MongoDB Atlas", serviceId: "atlas", name: "MongoDB Atlas: Provision Serverless Document & Vector Cluster (deployable)", description: "Provision a MongoDB Atlas document and vector search cluster via Stripe Projects.", categories: ["database", "mongodb", "nosql", "vector", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "dedicated"], providerUrl: "https://mongodb.com", llmContextUrl: "https://www.mongodb.com/docs/llms.txt" },
1309
+ // Auth, Identity & Wallets
1310
+ { slug: "resource.clerk.auth", upstreamSlug: "clerk/auth", providerSlug: "clerk", providerName: "Clerk", serviceId: "auth", name: "Clerk: Provision Authentication & User Management (deployable)", description: "Provision a Clerk authentication application with publishable and secret keys stored in the Muxo AES-256-GCM Vault.", categories: ["auth", "identity", "security", "infrastructure"], defaultPlan: "hobby", availablePlans: ["hobby", "pro"], providerUrl: "https://clerk.com", llmContextUrl: "https://clerk.com/llms.txt" },
1311
+ { slug: "resource.workos.auth", upstreamSlug: "workos/auth", providerSlug: "workos", providerName: "WorkOS", serviceId: "auth", name: "WorkOS: Provision Enterprise SSO, SCIM & RBAC (deployable)", description: "Provision a WorkOS environment for enterprise SSO, Directory Sync (SCIM), and AuthKit via Stripe Projects.", categories: ["auth", "enterprise", "sso", "scim", "security", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "enterprise"], providerUrl: "https://workos.com", llmContextUrl: "https://workos.com/llms.txt" },
1312
+ { slug: "resource.auth0.client", upstreamSlug: "auth0/client", providerSlug: "auth0", providerName: "Auth0/Okta", serviceId: "client", name: "Auth0/Okta: Provision Identity & Agent Auth Client (deployable)", description: "Provision an Auth0/Okta authentication client and tenant credentials via Stripe Projects.", categories: ["auth", "identity", "security", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "essential", "professional"], providerUrl: "https://auth0.com", llmContextUrl: "https://auth0.com/docs/llms.txt" },
1313
+ { slug: "resource.privy.app", upstreamSlug: "privy/app", providerSlug: "privy", providerName: "Privy", serviceId: "app", name: "Privy: Provision Embedded Wallets & Web3/Web2 Auth App (deployable)", description: "Provision a Privy authentication and embedded wallet application for users and AI agents via Stripe Projects.", categories: ["auth", "wallets", "crypto", "identity", "security", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "growth"], providerUrl: "https://privy.io", llmContextUrl: "https://docs.privy.io/llms.txt" },
1314
+ // Sandboxes, Devboxes & Build Compute
1315
+ { slug: "resource.e2b.sandboxes", upstreamSlug: "e2b/sandboxes", providerSlug: "e2b", providerName: "E2B", serviceId: "sandboxes", name: "E2B: Provision Secure Cloud Code Interpreter Sandboxes (deployable)", description: "Provision E2B isolated microVM sandboxes for AI code execution and computer use via Stripe Projects.", categories: ["compute", "sandbox", "ai", "code_execution", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://e2b.dev", llmContextUrl: "https://e2b.dev/docs/llms.txt" },
1316
+ { slug: "resource.daytona.sandbox", upstreamSlug: "daytona/sandbox", providerSlug: "daytona", providerName: "Daytona", serviceId: "sandbox", name: "Daytona: Provision Sub-90ms Secure AI Code Sandbox (deployable)", description: "Provision Daytona elastic development environments and AI code sandboxes via Stripe Projects.", categories: ["compute", "sandbox", "ai", "code_execution", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://daytona.io", llmContextUrl: "https://daytona.io/docs/llms.txt" },
1317
+ { slug: "resource.blaxel.sandbox", upstreamSlug: "blaxel/sandbox", providerSlug: "blaxel", providerName: "Blaxel", serviceId: "sandbox", name: "Blaxel: Provision Perpetual AI Agent Sandbox & Compute (deployable)", description: "Provision Blaxel perpetual sandboxes with instant standby/resume and MCP hosting via Stripe Projects.", categories: ["compute", "sandbox", "ai", "agents", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://blaxel.ai", llmContextUrl: "https://docs.blaxel.ai/llms.txt" },
1318
+ { slug: "resource.blaxel.agent_drive", upstreamSlug: "blaxel/agent-drive", providerSlug: "blaxel", providerName: "Blaxel", serviceId: "agent-drive", name: "Blaxel: Provision Agent Drive Persistent Filesystem (deployable)", description: "Provision Blaxel Agent Drive distributed persistent filesystem for AI agents and sandboxes via Stripe Projects.", categories: ["storage", "filesystem", "sandbox", "ai", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://blaxel.ai", llmContextUrl: "https://docs.blaxel.ai/llms.txt" },
1319
+ { slug: "resource.modal.serverless_gpu", upstreamSlug: "modal/serverless_gpu", providerSlug: "modal", providerName: "Modal", serviceId: "serverless_gpu", name: "Modal: Provision Serverless GPU & Container Compute (deployable)", description: "Provision Modal serverless GPU functions, sandboxes, and batch compute via Stripe Projects.", categories: ["compute", "gpu", "ai", "sandbox", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "team"], providerUrl: "https://modal.com", llmContextUrl: "https://modal.com/llms.txt" },
1320
+ { slug: "resource.runloop.sandbox", upstreamSlug: "runloop/sandbox", providerSlug: "runloop", providerName: "Runloop", serviceId: "sandbox", name: "Runloop: Provision AI Coding Devbox & Evaluation Sandbox (deployable)", description: "Provision Runloop cloud devboxes with snapshot/branching for coding agents via Stripe Projects.", categories: ["compute", "sandbox", "ai", "code_execution", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://runloop.ai", llmContextUrl: "https://docs.runloop.ai/llms.txt" },
1321
+ { slug: "resource.depot.api", upstreamSlug: "depot/api", providerSlug: "depot", providerName: "Depot", serviceId: "api", name: "Depot: Provision Accelerated Container & CI Build Infrastructure (deployable)", description: "Provision Depot remote Docker image builds and accelerated GitHub Actions runners via Stripe Projects.", categories: ["compute", "ci_cd", "containers", "devops", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "startup"], providerUrl: "https://depot.dev", llmContextUrl: "https://depot.dev/docs/llms.txt" },
1322
+ // Cloud Browsers & Web Automation
1323
+ { slug: "resource.browserbase.project", upstreamSlug: "browserbase/project", providerSlug: "browserbase", providerName: "Browserbase", serviceId: "project", name: "Browserbase: Provision Serverless Headless Browser Fleet (deployable)", description: "Provision a Browserbase project for Stagehand, Playwright, and stealth headless browser sessions via Stripe Projects.", categories: ["browser", "automation", "ai", "scrape", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "developer", "startup"], providerUrl: "https://browserbase.com", llmContextUrl: "https://docs.browserbase.com/llms.txt" },
1324
+ { slug: "resource.steel.browser", upstreamSlug: "steel/browser", providerSlug: "steel", providerName: "Steel", serviceId: "browser", name: "Steel: Provision Managed AI Agent Browser API (deployable)", description: "Provision a Steel headless browser API with anti-detection, proxies, and session management via Stripe Projects.", categories: ["browser", "automation", "ai", "scrape", "infrastructure"], defaultPlan: "plan-launch", availablePlans: ["plan-launch", "pro"], providerUrl: "https://steel.dev", llmContextUrl: "https://docs.steel.dev/llms.txt" },
1325
+ { slug: "resource.kernel.project", upstreamSlug: "kernel/project", providerSlug: "kernel", providerName: "KERNEL", serviceId: "project", name: "KERNEL: Provision Sub-Second Cloud Browser Infrastructure (deployable)", description: "Provision KERNEL instant cloud browsers for AI web agents via Stripe Projects.", categories: ["browser", "automation", "ai", "compute", "infrastructure"], defaultPlan: "developer", availablePlans: ["developer", "startup"], providerUrl: "https://onkernel.com", llmContextUrl: "https://docs.onkernel.com/llms.txt" },
1326
+ // AI, Search, Scrape, Memory, Voice & Video
1327
+ { slug: "resource.exa.search", upstreamSlug: "exa/api", providerSlug: "exa", providerName: "Exa", serviceId: "api", name: "Exa: Provision Neural Web Search & Grounding API (deployable)", description: "Provision an Exa neural search API key and optionally run live semantic web searches via Stripe Projects.", categories: ["search", "ai", "web", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://exa.ai", llmContextUrl: "https://docs.exa.ai/llms.txt" },
1328
+ { slug: "resource.firecrawl.api", upstreamSlug: "firecrawl/api", providerSlug: "firecrawl", providerName: "Firecrawl", serviceId: "api", name: "Firecrawl: Provision Web Crawl, Scrape & Markdown Extraction API (deployable)", description: "Provision a Firecrawl API key and optionally scrape/crawl URLs into LLM-ready Markdown via Stripe Projects.", categories: ["search", "scrape", "crawl", "ai", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "hobby", "standard"], providerUrl: "https://firecrawl.dev", llmContextUrl: "https://docs.firecrawl.dev/llms.txt" },
1329
+ { slug: "resource.perplexity.api", upstreamSlug: "perplexity/api", providerSlug: "perplexity", providerName: "Perplexity", serviceId: "api", name: "Perplexity: Provision Sonar Web-Grounded Search & Reasoning API (deployable)", description: "Provision a Perplexity Sonar API key for citation-backed web search and reasoning via Stripe Projects.", categories: ["search", "ai", "llm", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://perplexity.ai", llmContextUrl: "https://docs.perplexity.ai/llms.txt" },
1330
+ { slug: "resource.openrouter.api", upstreamSlug: "openrouter/api", providerSlug: "openrouter", providerName: "OpenRouter", serviceId: "api", name: "OpenRouter: Provision Unified Multi-Model LLM Gateway API (deployable)", description: "Provision an OpenRouter API key to route across 300+ frontier LLMs (OpenAI, Anthropic, Google, Meta) via Stripe Projects.", categories: ["ai", "llm", "inference", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "credits"], providerUrl: "https://openrouter.ai", llmContextUrl: "https://openrouter.ai/docs/llms.txt" },
1331
+ { slug: "resource.supermemory.memory", upstreamSlug: "supermemory/memory", providerSlug: "supermemory", providerName: "Supermemory", serviceId: "memory", name: "Supermemory: Provision Universal AI Memory & Knowledge Graph API (deployable)", description: "Provision a Supermemory semantic memory and knowledge graph API key via Stripe Projects.", categories: ["ai", "memory", "database", "search", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://supermemory.ai", llmContextUrl: "https://supermemory.ai/docs/llms.txt" },
1332
+ { slug: "resource.elevenlabs.tts", upstreamSlug: "elevenlabs/tts", providerSlug: "elevenlabs", providerName: "ElevenLabs", serviceId: "tts", name: "ElevenLabs: Provision AI Voice, Speech Synthesis & Audio Agents API (deployable)", description: "Provision an ElevenLabs text-to-speech, voice cloning, and conversational audio API key via Stripe Projects.", categories: ["ai", "audio", "voice", "tts", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "starter", "creator"], providerUrl: "https://elevenlabs.io", llmContextUrl: "https://elevenlabs.io/docs/llms.txt" },
1333
+ { slug: "resource.tabstack.api", upstreamSlug: "tabstack/api", providerSlug: "tabstack", providerName: "Tabstack", serviceId: "api", name: "Tabstack: Provision Mozilla Privacy-Focused Web Search & Extraction API (deployable)", description: "Provision a Tabstack web search and structured extraction API key by Mozilla via Stripe Projects.", categories: ["search", "ai", "browser", "scrape", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://tabstack.com", llmContextUrl: "https://tabstack.com/llms.txt" },
1334
+ { slug: "resource.algolia.application", upstreamSlug: "algolia/application", providerSlug: "algolia", providerName: "Algolia", serviceId: "application", name: "Algolia: Provision Hosted Instant Search & Discovery Application (deployable)", description: "Provision an Algolia search application with instant indexing and typo-tolerant query APIs via Stripe Projects.", categories: ["search", "ai", "database", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "grow"], providerUrl: "https://algolia.com", llmContextUrl: "https://www.algolia.com/doc/llms.txt" },
1335
+ { slug: "resource.parallel.api", upstreamSlug: "parallel/api", providerSlug: "parallel", providerName: "Parallel", serviceId: "api", name: "Parallel: Provision Deep Web Research & Synthesis Engine API (deployable)", description: "Provision a Parallel AI research and structured web synthesis API key via Stripe Projects.", categories: ["search", "ai", "research", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://parallel.ai", llmContextUrl: "https://docs.parallel.ai/llms.txt" },
1336
+ { slug: "resource.heygen.api", upstreamSlug: "heygen/api", providerSlug: "heygen", providerName: "HeyGen", serviceId: "api", name: "HeyGen: Provision AI Avatar Video Generation & Translation API (deployable)", description: "Provision a HeyGen API key for programmatic AI avatar video generation and localization via Stripe Projects.", categories: ["ai", "video", "media", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://heygen.com", llmContextUrl: "https://docs.heygen.com/llms.txt" },
1337
+ { slug: "resource.athena.agents", upstreamSlug: "athena/agents", providerSlug: "athena", providerName: "Athena AI", serviceId: "agents", name: "Athena AI: Provision Autonomous Analytics & Research Agents (deployable)", description: "Provision Athena AI autonomous agents for data analysis and enterprise workflows via Stripe Projects.", categories: ["ai", "agents", "analytics", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://athenaintel.com", llmContextUrl: "https://athenaintel.com/llms.txt" },
1338
+ { slug: "resource.chatbase.agent", upstreamSlug: "chatbase/agent", providerSlug: "chatbase", providerName: "Chatbase", serviceId: "agent", name: "Chatbase: Provision Custom Support & Knowledge AI Agent (deployable)", description: "Provision a Chatbase AI customer support and documentation agent trained on your data via Stripe Projects.", categories: ["ai", "agents", "support", "chat", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "hobby", "standard"], providerUrl: "https://chatbase.co", llmContextUrl: "https://chatbase.co/llms.txt" },
1339
+ // Email, Messaging, Notifications & Physical Mail
1340
+ { slug: "resource.resend.email", upstreamSlug: "resend/email", providerSlug: "resend", providerName: "Resend", serviceId: "email", name: "Resend: Provision & Send Transactional Email API (deployable)", description: "Provision Resend transactional email credentials and optionally send emails directly via Stripe Projects.", categories: ["email", "communications", "messaging", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://resend.com", llmContextUrl: "https://resend.com/docs/llms.txt" },
1341
+ { slug: "resource.agentmail.api", upstreamSlug: "agentmail/api", providerSlug: "agentmail", providerName: "AgentMail", serviceId: "api", name: "AgentMail: Provision Dedicated Email Inbox API for AI Agents (deployable)", description: "Provision an AgentMail programmable email inbox for AI agents and send/receive threads via Stripe Projects.", categories: ["email", "ai", "communications", "messaging", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://agentmail.to", llmContextUrl: "https://docs.agentmail.to/llms.txt" },
1342
+ { slug: "resource.agentphone.number", upstreamSlug: "agentphone/number", providerSlug: "agentphone", providerName: "AgentPhone", serviceId: "number", name: "AgentPhone: Provision Programmable Voice & SMS Phone Number for AI Agents (deployable)", description: "Provision a dedicated AgentPhone phone number for AI voice calls and SMS messaging via Stripe Projects.", categories: ["communications", "voice", "sms", "ai", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://agentphone.to", llmContextUrl: "https://agentphone.to/llms.txt" },
1343
+ { slug: "resource.twilio.email", upstreamSlug: "twilio/email", providerSlug: "twilio", providerName: "Twilio", serviceId: "email", name: "Twilio: Provision Programmable SMS, Voice & SendGrid Email API (deployable)", description: "Provision Twilio SMS, voice, and SendGrid email credentials and dispatch messages via Stripe Projects.", categories: ["communications", "email", "sms", "voice", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "payg"], providerUrl: "https://twilio.com", llmContextUrl: "https://www.twilio.com/docs/llms.txt" },
1344
+ { slug: "resource.customerio.workspace", upstreamSlug: "customerio/workspace", providerSlug: "customerio", providerName: "Customer.io", serviceId: "workspace", name: "Customer.io: Provision Event-Driven Messaging & Journeys Workspace (deployable)", description: "Provision a Customer.io messaging workspace for automated email, push, and SMS journeys via Stripe Projects.", categories: ["communications", "email", "notification", "marketing", "infrastructure"], defaultPlan: "builder:sandbox", availablePlans: ["builder:sandbox", "essentials"], providerUrl: "https://customer.io", llmContextUrl: "https://customer.io/docs/llms.txt" },
1345
+ { slug: "resource.knock.project", upstreamSlug: "knock/project", providerSlug: "knock", providerName: "Knock", serviceId: "project", name: "Knock: Provision Cross-Channel Notification Infrastructure (deployable)", description: "Provision a Knock notification project for in-app feeds, email, Slack, push, and SMS workflows via Stripe Projects.", categories: ["notification", "communications", "messaging", "infrastructure"], defaultPlan: "developer", availablePlans: ["developer", "starter"], providerUrl: "https://knock.app", llmContextUrl: "https://docs.knock.app/llms.txt" },
1346
+ { slug: "resource.postalform.mail", upstreamSlug: "postalform/mail", providerSlug: "postalform", providerName: "PostalForm", serviceId: "mail", name: "PostalForm: Provision Programmable USPS Physical Mail & Postcard API (deployable)", description: "Provision PostalForm API access to print and mail physical letters, checks, and postcards via USPS through Stripe Projects.", categories: ["communications", "mail", "operations", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "payg"], providerUrl: "https://postalform.com", llmContextUrl: "https://postalform.com/llms.txt" },
1347
+ { slug: "resource.quo.app", upstreamSlug: "quo/app", providerSlug: "quo", providerName: "Quo", serviceId: "app", name: "Quo: Provision Programmable Business Phone, Call & SMS Workspace (deployable)", description: "Provision a Quo (OpenPhone) programmable business phone, SMS, and call intelligence workspace via Stripe Projects.", categories: ["communications", "voice", "sms", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "starter"], providerUrl: "https://quo.com", llmContextUrl: "https://www.quo.com/docs/llms.txt" },
1348
+ // Analytics, Observability, Workflows, Media & Domains
1349
+ { slug: "resource.posthog.analytics", upstreamSlug: "posthog/analytics", providerSlug: "posthog", providerName: "PostHog", serviceId: "analytics", name: "PostHog: Provision Product Analytics, Session Replay & Feature Flags (deployable)", description: "Provision a PostHog project for product analytics, feature flags, A/B testing, and session replay via Stripe Projects.", categories: ["analytics", "observability", "feature_flags", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pay_as_you_go"], providerUrl: "https://posthog.com", llmContextUrl: "https://posthog.com/llms.txt" },
1350
+ { slug: "resource.datadog.observability", upstreamSlug: "datadog/observability", providerSlug: "datadog", providerName: "Datadog", serviceId: "observability", name: "Datadog: Provision Full-Stack APM, Logs & Infrastructure Monitoring (deployable)", description: "Provision Datadog observability (APM traces, logs, metrics, and synthetics) via Stripe Projects.", categories: ["observability", "monitoring", "devops", "infrastructure"], defaultPlan: "trial", availablePlans: ["trial", "pro"], providerUrl: "https://datadoghq.com", llmContextUrl: "https://docs.datadoghq.com/llms.txt" },
1351
+ { slug: "resource.inngest.app", upstreamSlug: "inngest/app", providerSlug: "inngest", providerName: "Inngest", serviceId: "app", name: "Inngest: Provision Durable Workflows, Background Jobs & Event Queues (deployable)", description: "Provision an Inngest application for durable step workflows, retries, and event-driven queues via Stripe Projects.", categories: ["workflows", "queues", "compute", "ai", "infrastructure"], defaultPlan: "hobby", availablePlans: ["hobby", "pro"], providerUrl: "https://inngest.com", llmContextUrl: "https://www.inngest.com/llms.txt" },
1352
+ { slug: "resource.cloudinary.media", upstreamSlug: "cloudinary/media", providerSlug: "cloudinary", providerName: "Cloudinary", serviceId: "media", name: "Cloudinary: Provision Programmable Image & Video CDN Pipeline (deployable)", description: "Provision a Cloudinary media optimization, transformation, and CDN environment via Stripe Projects.", categories: ["storage", "media", "cdn", "video", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "plus"], providerUrl: "https://cloudinary.com", llmContextUrl: "https://cloudinary.com/documentation/llms.txt" },
1353
+ { slug: "resource.spaceship.domain", upstreamSlug: "spaceship/domain", providerSlug: "spaceship", providerName: "Spaceship", serviceId: "domain", name: "Spaceship: Provision Domain Registration & Programmable DNS (deployable)", description: "Register and provision a domain name and DNS records with Spaceship via Stripe Projects.", categories: ["domains", "dns", "networking", "infrastructure"], defaultPlan: "free", availablePlans: ["free"], providerUrl: "https://spaceship.com" },
1354
+ { slug: "resource.amplitude.analytics", upstreamSlug: "amplitude/analytics", providerSlug: "amplitude", providerName: "Amplitude", serviceId: "analytics", name: "Amplitude: Provision Digital Analytics, Funnels & Experimentation (deployable)", description: "Provision an Amplitude analytics project for user journeys, retention cohorts, and experimentation via Stripe Projects.", categories: ["analytics", "product", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "plus"], providerUrl: "https://amplitude.com", llmContextUrl: "https://amplitude.com/docs/llms.txt" },
1355
+ { slug: "resource.mixpanel.analytics", upstreamSlug: "mixpanel/analytics", providerSlug: "mixpanel", providerName: "Mixpanel", serviceId: "analytics", name: "Mixpanel: Provision Event Analytics, Cohorts & Conversion Funnels (deployable)", description: "Provision a Mixpanel event analytics project with ingestion tokens stored in Muxo Vault via Stripe Projects.", categories: ["analytics", "product", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "growth"], providerUrl: "https://mixpanel.com", llmContextUrl: "https://docs.mixpanel.com/llms.txt" },
1356
+ { slug: "resource.pydantic.logfire", upstreamSlug: "pydantic/logfire", providerSlug: "pydantic", providerName: "Pydantic", serviceId: "logfire", name: "Pydantic Logfire: Provision OpenTelemetry & AI Agent Observability (deployable)", description: "Provision a Pydantic Logfire project for OpenTelemetry traces, Python/TS observability, and LLM monitoring via Stripe Projects.", categories: ["observability", "ai", "monitoring", "infrastructure"], defaultPlan: "personal", availablePlans: ["personal", "pro"], providerUrl: "https://pydantic.dev/logfire", llmContextUrl: "https://logfire.pydantic.dev/docs/llms.txt" },
1357
+ // Feature Flags, Entitlements, Metering, Retention & Subscriptions
1358
+ { slug: "resource.schematic.schematic_environment", upstreamSlug: "schematic/schematic-environment", providerSlug: "schematic", providerName: "Schematic", serviceId: "schematic-environment", name: "Schematic: Provision Feature Flags, Plan Entitlements & Usage Limits (deployable)", description: "Provision a Schematic environment for Stripe-synced feature flags, plan entitlements, and usage limits via Stripe Projects.", categories: ["feature_flags", "payments", "billing", "infrastructure"], defaultPlan: "schematic-free", availablePlans: ["schematic-free", "growth"], providerUrl: "https://schematichq.com", llmContextUrl: "https://docs.schematichq.com/llms.txt" },
1359
+ { slug: "resource.stigg.environment", upstreamSlug: "stigg/environment", providerSlug: "stigg", providerName: "Stigg", serviceId: "environment", name: "Stigg: Provision Monetization, Usage Metering & Entitlements Environment (deployable)", description: "Provision a Stigg environment for SaaS/AI pricing plans, credit wallets, and usage enforcement via Stripe Projects.", categories: ["feature_flags", "payments", "billing", "ai", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://stigg.io", llmContextUrl: "https://docs.stigg.io/llms.txt" },
1360
+ { slug: "resource.metronome.sandbox", upstreamSlug: "metronome/sandbox", providerSlug: "metronome", providerName: "Metronome", serviceId: "sandbox", name: "Metronome: Provision Usage-Based Billing & Real-Time Metering Sandbox (deployable)", description: "Provision a Metronome sandbox for usage-based billing, billable metrics, and rate cards via Stripe Projects.", categories: ["payments", "billing", "metering", "infrastructure"], defaultPlan: "free", availablePlans: ["free"], providerUrl: "https://metronome.com", llmContextUrl: "https://docs.metronome.com/llms.txt" },
1361
+ { slug: "resource.churnkey.retention", upstreamSlug: "churnkey/retention", providerSlug: "churnkey", providerName: "Churnkey", serviceId: "retention", name: "Churnkey: Provision Automated Subscription Retention & Failed Payment Recovery (deployable)", description: "Provision Churnkey cancel flows, precision dunning, and customer reactivation synced with Stripe via Stripe Projects.", categories: ["payments", "billing", "retention", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "growth"], providerUrl: "https://churnkey.co", llmContextUrl: "https://docs.churnkey.co/llms.txt" },
1362
+ { slug: "resource.revenuecat.app", upstreamSlug: "revenuecat/app", providerSlug: "revenuecat", providerName: "RevenueCat", serviceId: "app", name: "RevenueCat: Provision Cross-Platform In-App Subscriptions & Paywalls (deployable)", description: "Provision a RevenueCat project for iOS, Android, and Web subscription management and paywalls via Stripe Projects.", categories: ["payments", "billing", "subscriptions", "mobile", "infrastructure"], defaultPlan: "free", availablePlans: ["free", "pro"], providerUrl: "https://revenuecat.com", llmContextUrl: "https://www.revenuecat.com/docs/llms.txt" },
1363
+ // Dual-lane & Native Stripe Projects services
1364
+ { slug: "resource.sentry.project", upstreamSlug: "sentry/project", providerSlug: "sentry", providerName: "Sentry", serviceId: "project", name: "Sentry: Provision Error Tracking & Performance Monitoring Project (deployable)", description: "Provision a Sentry error tracking and performance monitoring project with DSN keys stored in Muxo Vault via Stripe Projects.", categories: ["observability", "monitoring", "devops", "infrastructure"], defaultPlan: "developer", availablePlans: ["developer", "team"], providerUrl: "https://sentry.io", llmContextUrl: "https://docs.sentry.io/llms.txt" },
1365
+ { slug: "resource.shopify.store", upstreamSlug: "shopify/store", providerSlug: "shopify", providerName: "Shopify", serviceId: "store", name: "Shopify: Provision Hosted Online Storefront (deployable)", description: "Provision a hosted Shopify online store directly from Stripe Projects with unified Stripe billing.", categories: ["ecommerce", "payments", "storefront", "infrastructure"], defaultPlan: "starter", availablePlans: ["starter", "basic"], providerUrl: "https://shopify.com", llmContextUrl: "https://shopify.dev/llms.txt" },
1366
+ { slug: "resource.composio.project", upstreamSlug: "composio/project", providerSlug: "composio", providerName: "Composio", serviceId: "project", name: "Composio: Provision Dedicated Agent Tool Router Project (deployable)", description: "Provision a Composio project for managed OAuth toolkits and triggers via Stripe Projects.", categories: ["ai", "agents", "integrations", "infrastructure"], defaultPlan: "hobby", availablePlans: ["hobby", "growth"], providerUrl: "https://composio.dev", llmContextUrl: "https://docs.composio.dev/llms.txt" },
1367
+ { slug: "resource.stripe.sandbox", upstreamSlug: "stripe/sandbox", providerSlug: "stripe", providerName: "Stripe", serviceId: "sandbox", name: "Stripe: Provision Isolated Test Sandbox API Keys (deployable)", description: "Provision Stripe sandbox API keys for test payments, customers, subscriptions, and invoices via Stripe Projects.", categories: ["payments", "billing", "stripe", "infrastructure"], defaultPlan: "free", availablePlans: ["free"], providerUrl: "https://stripe.com", llmContextUrl: "https://docs.stripe.com/llms.txt" },
1368
+ { slug: "resource.stripe.livemode", upstreamSlug: "stripe/livemode", providerSlug: "stripe", providerName: "Stripe", serviceId: "livemode", name: "Stripe: Provision Livemode Production API Keys (deployable)", description: "Provision Stripe livemode API keys to process payments, customers, subscriptions, and invoices via Stripe Projects.", categories: ["payments", "billing", "stripe", "infrastructure"], defaultPlan: "free", availablePlans: ["free"], providerUrl: "https://stripe.com", llmContextUrl: "https://docs.stripe.com/llms.txt" },
1369
+ ];
1370
+ /**
1371
+ * Stripe Projects Toolkits Catalog exposed alongside Enterprise Connected Apps in `/api/v1/toolkits`
1372
+ * and `filterComposioToolkits` so every Stripe Projects provider and its services are discoverable as toolkits.
1373
+ */
1374
+ export const STRIPE_PROJECTS_TOOLKITS_CATALOG = (() => {
1375
+ const byProvider = new Map();
1376
+ for (const item of STRIPE_PROJECTS_DEPLOYABLE_CATALOG) {
1377
+ // Skip sentry and shopify here because they are already in ENTERPRISE_TOOLKITS_CATALOG
1378
+ if (item.providerSlug === "sentry" || item.providerSlug === "shopify")
1379
+ continue;
1380
+ const list = byProvider.get(item.providerSlug) || [];
1381
+ list.push(item);
1382
+ byProvider.set(item.providerSlug, list);
1383
+ }
1384
+ const toolkits = [];
1385
+ for (const [providerSlug, entries] of byProvider.entries()) {
1386
+ const primary = entries[0];
1387
+ const allCategories = Array.from(new Set(["stripe_projects", "infrastructure", ...entries.flatMap((e) => e.categories)]));
1388
+ toolkits.push({
1389
+ slug: providerSlug,
1390
+ name: primary.providerName,
1391
+ description: primary.description,
1392
+ categories: allCategories,
1393
+ authSchemes: ["NO_AUTH", "API_KEY"],
1394
+ pinnedVersion: "20260930_sp",
1395
+ readOnlyScopes: ["projects:read"],
1396
+ fullAccessScopes: ["projects:read", "projects:provision", "projects:deploy"],
1397
+ lane: "stripe_projects",
1398
+ sampleActions: entries.map((e) => ({
1399
+ upstreamSlug: e.upstreamSlug,
1400
+ muxoSlug: e.slug,
1401
+ name: e.name,
1402
+ riskLevel: "provisioning",
1403
+ })),
1404
+ });
1405
+ }
1406
+ return toolkits;
1407
+ })();
1408
+ export function normalizeStripeProjectsProviderSlug(raw) {
1409
+ const clean = String(raw || "")
1410
+ .trim()
1411
+ .toLowerCase()
1412
+ .replace(/^(app\.|resource\.|projects\.)/, "");
1413
+ if (STRIPE_PROJECTS_PROVIDER_ALIASES[clean]) {
1414
+ return STRIPE_PROJECTS_PROVIDER_ALIASES[clean];
1415
+ }
1416
+ const slashHead = clean.split("/")[0] || "";
1417
+ if (STRIPE_PROJECTS_PROVIDER_ALIASES[slashHead]) {
1418
+ return STRIPE_PROJECTS_PROVIDER_ALIASES[slashHead];
1419
+ }
1420
+ const dotParts = slashHead.split(".");
1421
+ if (dotParts.length >= 2) {
1422
+ const twoDot = `${dotParts[0]}.${dotParts[1]}`;
1423
+ if (STRIPE_PROJECTS_PROVIDER_ALIASES[twoDot]) {
1424
+ return STRIPE_PROJECTS_PROVIDER_ALIASES[twoDot];
1425
+ }
1426
+ }
1427
+ const firstSegment = dotParts[0] || "";
1428
+ if (STRIPE_PROJECTS_PROVIDER_ALIASES[firstSegment]) {
1429
+ return STRIPE_PROJECTS_PROVIDER_ALIASES[firstSegment];
1430
+ }
1431
+ const normalized = firstSegment.replace(/[^a-z0-9_-]/g, "");
1432
+ return STRIPE_PROJECTS_PROVIDER_ALIASES[normalized] || normalized;
1433
+ }
1434
+ export function isStripeProjectsExclusiveProvider(rawSlug) {
1435
+ const provider = normalizeStripeProjectsProviderSlug(rawSlug);
1436
+ return Boolean(provider && STRIPE_PROJECTS_PROVIDER_SLUGS.has(provider));
1437
+ }
1438
+ export function isStripeProjectsHostingProvider(rawSlug) {
1439
+ const provider = normalizeStripeProjectsProviderSlug(rawSlug);
1440
+ return Boolean(provider && STRIPE_PROJECTS_HOSTING_PROVIDERS.has(provider));
1441
+ }
1442
+ export function isStripeProjectsDatabaseProvider(rawSlug) {
1443
+ const provider = normalizeStripeProjectsProviderSlug(rawSlug);
1444
+ return Boolean(provider && STRIPE_PROJECTS_DATABASE_PROVIDERS.has(provider));
1445
+ }
1446
+ function resolveMultiServiceSlug(provider, rawServiceOrAction) {
1447
+ const serviceMap = STRIPE_PROJECTS_MULTI_SERVICE_MAP[provider];
1448
+ if (!serviceMap)
1449
+ return null;
1450
+ const clean = rawServiceOrAction.trim().toLowerCase();
1451
+ if (!clean)
1452
+ return null;
1453
+ if (serviceMap[clean])
1454
+ return serviceMap[clean];
1455
+ const underscore = clean.replace(/[^a-z0-9]+/g, "_");
1456
+ if (serviceMap[underscore])
1457
+ return serviceMap[underscore];
1458
+ for (const [key, targetSlug] of Object.entries(serviceMap)) {
1459
+ const keyRegex = new RegExp(`(?:^|[_.-])${key.replace(/[-_]/g, "[-_]")}(?:$|[_.-])`, "i");
1460
+ if (keyRegex.test(clean)) {
1461
+ return targetSlug;
1462
+ }
1463
+ }
1464
+ return null;
1465
+ }
1466
+ /**
1467
+ * Resolves any tool or provider reference targeting a Stripe Projects provider
1468
+ * (including `app.vercel.deploy`, `app.vercel.create_deployment`, `resource.vercel.deploy`,
1469
+ * `vercel/deploy`, `app.netlify.deploy`, `app.turso.create_database`, `supabase_migration`,
1470
+ * `resource.cloudflare.d1`, `resource.upstash.vector`, `resource.railway.postgres`, etc.)
1471
+ * to its canonical `resource.<provider>.<service>` tool slug on the `stripe_projects` lane.
1472
+ */
1473
+ export function resolveStripeProjectsCanonicalToolSlug(rawSlug) {
1474
+ const lower = String(rawSlug || "").trim().toLowerCase();
1475
+ if (!lower)
1476
+ return null;
1477
+ if (lower.startsWith("billing.") || lower.startsWith("instant.") || lower.startsWith("resource.projects.")) {
1478
+ return null;
1479
+ }
1480
+ // Handle slash format like "vercel/project", "cloudflare/d1", "upstash/vector", "stripe/sandbox"
1481
+ if (lower.includes("/") && !lower.includes(".")) {
1482
+ const [rawProv, service = ""] = lower.split("/");
1483
+ const prov = normalizeStripeProjectsProviderSlug(rawProv || "");
1484
+ if (prov) {
1485
+ const multi = resolveMultiServiceSlug(prov, service);
1486
+ if (multi)
1487
+ return multi;
1488
+ if (STRIPE_PROJECTS_CANONICAL_RESOURCE_SLUG[prov]) {
1489
+ return STRIPE_PROJECTS_CANONICAL_RESOURCE_SLUG[prov];
1490
+ }
1491
+ if (prov === "shopify")
1492
+ return "resource.shopify.store";
1493
+ if (prov === "sentry")
1494
+ return "resource.sentry.project";
1495
+ if (prov === "composio")
1496
+ return "resource.composio.project";
1497
+ if (prov === "stripe")
1498
+ return "resource.stripe.sandbox";
1499
+ }
1500
+ }
1501
+ // Handle underscore format like "supabase_sql", "supabase_migration", "vercel_deploy", "cloudflare_d1"
1502
+ if (lower.includes("_") && !lower.includes(".") && !lower.includes("/")) {
1503
+ const DirectProv = normalizeStripeProjectsProviderSlug(lower);
1504
+ if (DirectProv && STRIPE_PROJECTS_CANONICAL_RESOURCE_SLUG[DirectProv]) {
1505
+ return STRIPE_PROJECTS_CANONICAL_RESOURCE_SLUG[DirectProv];
1506
+ }
1507
+ const firstPart = normalizeStripeProjectsProviderSlug(lower.split("_")[0] || "");
1508
+ const rest = lower.split("_").slice(1).join("_");
1509
+ if (firstPart) {
1510
+ const multi = resolveMultiServiceSlug(firstPart, rest);
1511
+ if (multi)
1512
+ return multi;
1513
+ if (STRIPE_PROJECTS_CANONICAL_RESOURCE_SLUG[firstPart]) {
1514
+ return STRIPE_PROJECTS_CANONICAL_RESOURCE_SLUG[firstPart];
1515
+ }
1516
+ }
1517
+ }
1518
+ const parts = lower.split(".");
1519
+ if (parts.length >= 2 && (parts[0] === "resource" || parts[0] === "projects" || parts[0] === "app")) {
1520
+ const prefix = parts[0];
1521
+ // Handle "resource.customer.io.workspace" or "resource.wordpress.com.site"
1522
+ let provider = normalizeStripeProjectsProviderSlug(parts[1] || "");
1523
+ let actionStartIdx = 2;
1524
+ if ((parts[1] === "customer" && parts[2] === "io") || (parts[1] === "wordpress" && parts[2] === "com") || (parts[1] === "fly" && parts[2] === "io") || (parts[1] === "here" && parts[2] === "now")) {
1525
+ provider = normalizeStripeProjectsProviderSlug(`${parts[1]}.${parts[2]}`);
1526
+ actionStartIdx = 3;
1527
+ }
1528
+ const action = parts.slice(actionStartIdx).join("_");
1529
+ const multi = resolveMultiServiceSlug(provider, action);
1530
+ if (multi)
1531
+ return multi;
1532
+ if (STRIPE_PROJECTS_CANONICAL_RESOURCE_SLUG[provider]) {
1533
+ return STRIPE_PROJECTS_CANONICAL_RESOURCE_SLUG[provider];
1534
+ }
1535
+ // Dual-purpose providers (shopify, sentry, composio, stripe): route to stripe_projects when resource.* or provisioning action
1536
+ if (provider === "shopify" && (prefix !== "app" || /^(store|create_store|provision)/.test(action))) {
1537
+ return "resource.shopify.store";
1538
+ }
1539
+ if (provider === "sentry" && (prefix !== "app" || /^(project|create_project|provision)/.test(action))) {
1540
+ return "resource.sentry.project";
1541
+ }
1542
+ if (provider === "composio" && (prefix !== "app" || /^(project|create_project|provision)/.test(action))) {
1543
+ return "resource.composio.project";
1544
+ }
1545
+ if (provider === "stripe" && prefix !== "app") {
1546
+ return action.includes("live") ? "resource.stripe.livemode" : "resource.stripe.sandbox";
1547
+ }
1548
+ }
1549
+ const normalizedSingle = normalizeStripeProjectsProviderSlug(lower);
1550
+ if (STRIPE_PROJECTS_CANONICAL_RESOURCE_SLUG[normalizedSingle]) {
1551
+ return STRIPE_PROJECTS_CANONICAL_RESOURCE_SLUG[normalizedSingle];
1552
+ }
1553
+ return null;
1554
+ }
1555
+ export function extractHostedHtmlFromInput(input) {
1556
+ const files = {};
1557
+ const envVars = {};
1558
+ const rawEnvSources = [
1559
+ input.env,
1560
+ input.envVars,
1561
+ input.env_vars,
1562
+ input.environment_variables,
1563
+ input.config && typeof input.config === "object"
1564
+ ? input.config.env
1565
+ : undefined,
1566
+ ];
1567
+ for (const src of rawEnvSources) {
1568
+ if (src && typeof src === "object" && !Array.isArray(src)) {
1569
+ for (const [k, v] of Object.entries(src)) {
1570
+ if (k && (typeof v === "string" || typeof v === "number" || typeof v === "boolean")) {
1571
+ envVars[k.trim()] = String(v);
1572
+ }
1573
+ }
1574
+ }
1575
+ }
1576
+ const rawFiles = input.files;
1577
+ if (Array.isArray(rawFiles)) {
1578
+ for (const item of rawFiles) {
1579
+ if (item && typeof item === "object") {
1580
+ const rec = item;
1581
+ const filePath = String(rec.path || rec.file || rec.filename || rec.name || "")
1582
+ .trim()
1583
+ .replace(/^\/+/, "");
1584
+ const fileContent = typeof rec.content === "string"
1585
+ ? rec.content
1586
+ : typeof rec.data === "string"
1587
+ ? rec.data
1588
+ : typeof rec.body === "string"
1589
+ ? rec.body
1590
+ : null;
1591
+ if (filePath && fileContent !== null) {
1592
+ files[filePath] = fileContent;
1593
+ }
1594
+ }
1595
+ }
1596
+ }
1597
+ else if (rawFiles && typeof rawFiles === "object") {
1598
+ for (const [k, v] of Object.entries(rawFiles)) {
1599
+ const cleanKey = k.trim().replace(/^\/+/, "");
1600
+ if (!cleanKey)
1601
+ continue;
1602
+ if (typeof v === "string") {
1603
+ files[cleanKey] = v;
1604
+ }
1605
+ else if (v && typeof v === "object") {
1606
+ const nested = v;
1607
+ const content = typeof nested.content === "string"
1608
+ ? nested.content
1609
+ : typeof nested.data === "string"
1610
+ ? nested.data
1611
+ : null;
1612
+ if (content !== null) {
1613
+ files[cleanKey] = content;
1614
+ }
1615
+ }
1616
+ }
1617
+ }
1618
+ const directHtml = typeof input.html === "string" && input.html.trim()
1619
+ ? input.html
1620
+ : typeof input.index_html === "string" && input.index_html.trim()
1621
+ ? input.index_html
1622
+ : typeof input.content === "string" && input.content.trim()
1623
+ ? input.content
1624
+ : typeof input.body === "string" && input.body.trim().startsWith("<")
1625
+ ? input.body
1626
+ : null;
1627
+ if (directHtml && !files["index.html"]) {
1628
+ files["index.html"] = directHtml;
1629
+ }
1630
+ const indexHtml = files["index.html"] ||
1631
+ files["public/index.html"] ||
1632
+ files["dist/index.html"] ||
1633
+ Object.entries(files).find(([k]) => k.endsWith(".html"))?.[1] ||
1634
+ directHtml ||
1635
+ null;
1636
+ return {
1637
+ html: indexHtml,
1638
+ files,
1639
+ envVars,
1640
+ };
1641
+ }
1642
+ export function extractDatabaseMigrationsFromInput(input) {
1643
+ const rawChunks = [];
1644
+ const cfg = input.config && typeof input.config === "object"
1645
+ ? input.config
1646
+ : {};
1647
+ const candidates = [
1648
+ input.sql,
1649
+ input.query,
1650
+ input.migration,
1651
+ input.schema,
1652
+ input.ddl,
1653
+ input.statement,
1654
+ cfg.sql,
1655
+ cfg.query,
1656
+ cfg.migration,
1657
+ cfg.schema,
1658
+ ];
1659
+ for (const c of candidates) {
1660
+ if (typeof c === "string" && c.trim()) {
1661
+ rawChunks.push(c.trim());
1662
+ }
1663
+ }
1664
+ const arrayCandidates = [
1665
+ input.statements,
1666
+ input.migrations,
1667
+ input.queries,
1668
+ cfg.statements,
1669
+ cfg.migrations,
1670
+ ];
1671
+ for (const arr of arrayCandidates) {
1672
+ if (Array.isArray(arr)) {
1673
+ for (const item of arr) {
1674
+ if (typeof item === "string" && item.trim()) {
1675
+ rawChunks.push(item.trim());
1676
+ }
1677
+ else if (item && typeof item === "object") {
1678
+ const obj = item;
1679
+ const sqlText = obj.sql || obj.query || obj.content || obj.statement;
1680
+ if (typeof sqlText === "string" && sqlText.trim()) {
1681
+ rawChunks.push(sqlText.trim());
1682
+ }
1683
+ }
1684
+ }
1685
+ }
1686
+ else if (arr && typeof arr === "object") {
1687
+ for (const v of Object.values(arr)) {
1688
+ if (typeof v === "string" && v.trim()) {
1689
+ rawChunks.push(v.trim());
1690
+ }
1691
+ }
1692
+ }
1693
+ }
1694
+ // Also check files map/array for .sql migration files
1695
+ if (input.files && typeof input.files === "object" && !Array.isArray(input.files)) {
1696
+ for (const [pathKey, content] of Object.entries(input.files)) {
1697
+ if (pathKey.toLowerCase().endsWith(".sql") && typeof content === "string" && content.trim()) {
1698
+ rawChunks.push(content.trim());
1699
+ }
1700
+ }
1701
+ }
1702
+ const tablesCreatedSet = new Set();
1703
+ const tableRegex = /create\s+table\s+(?:if\s+not\s+exists\s+)?([a-zA-Z0-9_."`]+)/gi;
1704
+ for (const chunk of rawChunks) {
1705
+ let match;
1706
+ while ((match = tableRegex.exec(chunk)) !== null) {
1707
+ if (match[1]) {
1708
+ tablesCreatedSet.add(match[1].replace(/["`]/g, ""));
1709
+ }
1710
+ }
1711
+ }
1712
+ return {
1713
+ hasMigrations: rawChunks.length > 0,
1714
+ sqlStatements: rawChunks,
1715
+ tablesCreated: Array.from(tablesCreatedSet),
1716
+ };
1717
+ }
1718
+ export function buildStandardStripeProjectsSecrets(params) {
1719
+ const { providerSlug, resourceName } = params;
1720
+ const safeName = resourceName.toLowerCase().replace(/[^a-z0-9-]+/g, "-");
1721
+ const safeTokenSuffix = safeName.replace(/[^a-z0-9]+/g, "_");
1722
+ const provUpper = providerSlug.toUpperCase().replace(/[^A-Z0-9]+/g, "_");
1723
+ const prefix = `${providerSlug}_${safeName}`.toUpperCase().replace(/[^A-Z0-9]+/g, "_");
1724
+ if (providerSlug === "supabase") {
1725
+ const supabaseUrl = `https://${safeName}.supabase.co`;
1726
+ const anonKey = `sb_publishable_${safeTokenSuffix}_anon`;
1727
+ const serviceRoleKey = `sb_secret_${safeTokenSuffix}_service_role`;
1728
+ const dbUrl = `postgresql://postgres@db.${safeName}.supabase.co:5432/postgres`;
1729
+ return {
1730
+ SUPABASE_URL: supabaseUrl,
1731
+ SUPABASE_ANON_KEY: anonKey,
1732
+ SUPABASE_SERVICE_ROLE_KEY: serviceRoleKey,
1733
+ NEXT_PUBLIC_SUPABASE_URL: supabaseUrl,
1734
+ NEXT_PUBLIC_SUPABASE_ANON_KEY: anonKey,
1735
+ DATABASE_URL: dbUrl,
1736
+ [`${prefix}_URL`]: supabaseUrl,
1737
+ [`${prefix}_ANON_KEY`]: anonKey,
1738
+ [`${prefix}_SERVICE_ROLE_KEY`]: serviceRoleKey,
1739
+ [`${prefix}_DATABASE_URL`]: dbUrl,
1740
+ };
1741
+ }
1742
+ if (providerSlug === "turso") {
1743
+ return {
1744
+ TURSO_DATABASE_URL: `libsql://${safeName}-muxo.turso.io`,
1745
+ TURSO_AUTH_TOKEN: `sp_live_turso_${safeTokenSuffix}`,
1746
+ [`${prefix}_URL`]: `libsql://${safeName}-muxo.turso.io`,
1747
+ [`${prefix}_API_KEY`]: `sp_live_turso_${safeTokenSuffix}`,
1748
+ };
1749
+ }
1750
+ if (providerSlug === "neon" || providerSlug === "prisma" || providerSlug === "planetscale") {
1751
+ const dbUrl = `postgresql://muxo@${safeName}.${providerSlug}.muxo.cloud:5432/neondb?sslmode=require`;
1752
+ return {
1753
+ DATABASE_URL: dbUrl,
1754
+ [`${provUpper}_DATABASE_URL`]: dbUrl,
1755
+ [`${prefix}_URL`]: dbUrl,
1756
+ [`${prefix}_API_KEY`]: `sp_live_${providerSlug}_${safeTokenSuffix}`,
1757
+ };
1758
+ }
1759
+ if (providerSlug === "upstash") {
1760
+ const restUrl = `https://${safeName}.upstash.io`;
1761
+ const token = `sp_live_upstash_${safeTokenSuffix}`;
1762
+ return {
1763
+ UPSTASH_REDIS_REST_URL: restUrl,
1764
+ UPSTASH_REDIS_REST_TOKEN: token,
1765
+ UPSTASH_VECTOR_REST_URL: restUrl,
1766
+ UPSTASH_VECTOR_REST_TOKEN: token,
1767
+ QSTASH_TOKEN: `qstash_${safeTokenSuffix}`,
1768
+ [`${prefix}_URL`]: restUrl,
1769
+ [`${prefix}_API_KEY`]: token,
1770
+ };
1771
+ }
1772
+ if (providerSlug === "clickhouse") {
1773
+ const hostUrl = `https://${safeName}.clickhouse.cloud:8443`;
1774
+ return {
1775
+ CLICKHOUSE_HOST: hostUrl,
1776
+ CLICKHOUSE_USER: "default",
1777
+ CLICKHOUSE_PASSWORD: `sp_live_clickhouse_${safeTokenSuffix}`,
1778
+ DATABASE_URL: hostUrl,
1779
+ [`${prefix}_URL`]: hostUrl,
1780
+ [`${prefix}_API_KEY`]: `sp_live_clickhouse_${safeTokenSuffix}`,
1781
+ };
1782
+ }
1783
+ if (providerSlug === "chroma") {
1784
+ const hostUrl = `https://api.trychroma.com`;
1785
+ return {
1786
+ CHROMA_HOST: hostUrl,
1787
+ CHROMA_API_KEY: `ck_${safeTokenSuffix}`,
1788
+ CHROMA_TENANT: safeName,
1789
+ CHROMA_DATABASE: "default_database",
1790
+ [`${prefix}_URL`]: hostUrl,
1791
+ [`${prefix}_API_KEY`]: `ck_${safeTokenSuffix}`,
1792
+ };
1793
+ }
1794
+ if (providerSlug === "mongodb") {
1795
+ const mongoUri = `mongodb+srv://muxo@${safeName}.mongodb.muxo.cloud/app?retryWrites=true&w=majority`;
1796
+ return {
1797
+ MONGODB_URI: mongoUri,
1798
+ DATABASE_URL: mongoUri,
1799
+ [`${prefix}_URL`]: mongoUri,
1800
+ [`${prefix}_API_KEY`]: `sp_live_mongodb_${safeTokenSuffix}`,
1801
+ };
1802
+ }
1803
+ if (providerSlug === "clerk") {
1804
+ return {
1805
+ NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: `pk_test_${safeTokenSuffix}`,
1806
+ CLERK_SECRET_KEY: `sk_test_${safeTokenSuffix}`,
1807
+ [`${prefix}_URL`]: `https://${safeName}.clerk.accounts.dev`,
1808
+ [`${prefix}_API_KEY`]: `sk_test_${safeTokenSuffix}`,
1809
+ };
1810
+ }
1811
+ if (providerSlug === "workos") {
1812
+ return {
1813
+ WORKOS_API_KEY: `sk_test_workos_${safeTokenSuffix}`,
1814
+ WORKOS_CLIENT_ID: `client_${safeTokenSuffix}`,
1815
+ [`${prefix}_URL`]: `https://api.workos.com`,
1816
+ [`${prefix}_API_KEY`]: `sk_test_workos_${safeTokenSuffix}`,
1817
+ };
1818
+ }
1819
+ if (providerSlug === "auth0") {
1820
+ return {
1821
+ AUTH0_DOMAIN: `${safeName}.us.auth0.com`,
1822
+ AUTH0_CLIENT_ID: `auth0_client_${safeTokenSuffix}`,
1823
+ AUTH0_CLIENT_SECRET: `auth0_secret_${safeTokenSuffix}`,
1824
+ [`${prefix}_URL`]: `https://${safeName}.us.auth0.com`,
1825
+ [`${prefix}_API_KEY`]: `auth0_secret_${safeTokenSuffix}`,
1826
+ };
1827
+ }
1828
+ if (providerSlug === "privy") {
1829
+ return {
1830
+ NEXT_PUBLIC_PRIVY_APP_ID: `cl_${safeTokenSuffix}`,
1831
+ PRIVY_APP_SECRET: `privy_secret_${safeTokenSuffix}`,
1832
+ [`${prefix}_URL`]: `https://auth.privy.io`,
1833
+ [`${prefix}_API_KEY`]: `privy_secret_${safeTokenSuffix}`,
1834
+ };
1835
+ }
1836
+ if (providerSlug === "stripe") {
1837
+ const isLive = safeName.includes("live");
1838
+ const sk = isLive ? `sk_live_${safeTokenSuffix}` : `sk_test_${safeTokenSuffix}`;
1839
+ const pk = isLive ? `pk_live_${safeTokenSuffix}` : `pk_test_${safeTokenSuffix}`;
1840
+ return {
1841
+ STRIPE_SECRET_KEY: sk,
1842
+ STRIPE_PUBLISHABLE_KEY: pk,
1843
+ NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: pk,
1844
+ [`${prefix}_URL`]: "https://api.stripe.com",
1845
+ [`${prefix}_API_KEY`]: sk,
1846
+ };
1847
+ }
1848
+ if (params.liveUrl) {
1849
+ return {
1850
+ [`${provUpper}_URL`]: params.liveUrl,
1851
+ [`${provUpper}_DEPLOYMENT_URL`]: params.liveUrl,
1852
+ DEPLOYMENT_URL: params.liveUrl,
1853
+ LIVE_URL: params.liveUrl,
1854
+ [`${prefix}_URL`]: params.liveUrl,
1855
+ [`${prefix}_DEPLOYMENT_URL`]: params.liveUrl,
1856
+ [`${prefix}_API_KEY`]: `sp_live_${providerSlug}_${safeTokenSuffix}`,
1857
+ };
1858
+ }
1859
+ return {
1860
+ [`${provUpper}_API_KEY`]: `sp_live_${providerSlug}_${safeTokenSuffix}`,
1861
+ [`${provUpper}_URL`]: `https://${safeName}.${providerSlug}.muxo.cloud`,
1862
+ [`${prefix}_URL`]: `https://${safeName}.${providerSlug}.muxo.cloud`,
1863
+ [`${prefix}_API_KEY`]: `sp_live_${providerSlug}_${safeTokenSuffix}`,
1864
+ };
1865
+ }
1866
+ export function renderDefaultHostedSiteHtml(params) {
1867
+ const safeTitle = String(params.resourceName || "muxo-site").replace(/[<>&"']/g, "");
1868
+ const safeProvider = String(params.providerName || params.providerSlug || "Stripe Projects").replace(/[<>&"']/g, "");
1869
+ return `<!doctype html>
1870
+ <html lang="en">
1871
+ <head>
1872
+ <meta charset="utf-8" />
1873
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
1874
+ <title>${safeTitle} — Hosted via Muxo + ${safeProvider}</title>
1875
+ <style>
1876
+ :root { color-scheme: dark; }
1877
+ body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, sans-serif; background: #090a0f; color: #f8fafc; display: grid; place-items: center; min-height: 100vh; padding: 24px; }
1878
+ .card { max-width: 640px; width: 100%; background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.1); border-radius: 16px; padding: 32px; box-shadow: 0 20px 50px rgba(0,0,0,0.45); }
1879
+ .badge { display: inline-flex; align-items: center; gap: 8px; padding: 4px 12px; border-radius: 999px; background: rgba(16,185,129,0.12); color: #34d399; font-size: 12px; font-weight: 600; letter-spacing: 0.02em; }
1880
+ h1 { margin: 16px 0 8px; font-size: 28px; letter-spacing: -0.02em; }
1881
+ p { margin: 0 0 16px; color: #94a3b8; line-height: 1.6; font-size: 15px; }
1882
+ code { background: rgba(255,255,255,0.06); padding: 2px 6px; border-radius: 6px; font-size: 13px; color: #e2e8f0; }
1883
+ </style>
1884
+ </head>
1885
+ <body>
1886
+ <main class="card">
1887
+ <span class="badge">LIVE · ${safeProvider.toUpperCase()} VIA STRIPE PROJECTS</span>
1888
+ <h1>${safeTitle}</h1>
1889
+ <p>This project is provisioned and live on <strong>${safeProvider}</strong> through Muxo Cloud Infrastructure (<code>stripe_projects</code>) with zero OAuth handoff required.</p>
1890
+ <p>Pass <code>html</code> or <code>files</code> to <code>resource.${params.providerSlug}.*</code> with <code>execute_provisioning</code> to update this site's content at <code>${params.liveUrl}</code>.</p>
1891
+ </main>
1892
+ </body>
1893
+ </html>`;
1894
+ }