@muxoai/platform 0.0.0-stage → 1.2.1
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.
- package/ARCHITECTURE.md +111 -0
- package/README.md +53 -2
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +527 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.js +89 -0
- package/dist/engine.d.ts +128 -0
- package/dist/engine.js +709 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +7 -0
- package/dist/mcp.d.ts +9 -0
- package/dist/mcp.js +401 -0
- package/dist/providers/composio-instant.d.ts +14 -0
- package/dist/providers/composio-instant.js +372 -0
- package/dist/providers/composio-sdk.d.ts +41 -0
- package/dist/providers/composio-sdk.js +514 -0
- package/dist/providers/microsoft-governance.d.ts +66 -0
- package/dist/providers/microsoft-governance.js +415 -0
- package/dist/providers/stripe-billing.d.ts +31 -0
- package/dist/providers/stripe-billing.js +168 -0
- package/dist/providers/stripe-projects.d.ts +53 -0
- package/dist/providers/stripe-projects.js +607 -0
- package/dist/providers/supermemory.d.ts +64 -0
- package/dist/providers/supermemory.js +224 -0
- package/dist/sdk.d.ts +115 -0
- package/dist/sdk.js +117 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.js +816 -0
- package/dist/store.d.ts +200 -0
- package/dist/store.js +1260 -0
- package/dist/types.d.ts +273 -0
- package/dist/types.js +1 -0
- package/dist/ui/console-html.d.ts +2 -0
- package/dist/ui/console-html.js +2153 -0
- package/package.json +75 -4
- package/plugins/muxo/.app.json +8 -0
- package/plugins/muxo/.claude-plugin/plugin.json +16 -0
- package/plugins/muxo/.codex-plugin/plugin.json +51 -0
- package/plugins/muxo/.mcp.json +8 -0
- package/plugins/muxo/assets/logo.png +0 -0
- package/plugins/muxo/assets/logo.svg +6 -0
- package/plugins/muxo/hooks/hooks.json +27 -0
- package/plugins/muxo/hooks/session-start.sh +85 -0
- package/plugins/muxo/hooks/user-prompt-submit.sh +45 -0
- package/plugins/muxo/skills/muxo/SKILL.md +25 -0
- package/plugins/muxo/skills/muxo/references/cli.md +57 -0
- package/plugins/muxo/skills/muxo/references/mcp.md +25 -0
- package/src/catalogues/stripe-projects-catalog.json +9832 -0
- package/vendor/microsoft-governance/README.md +363 -0
- package/vendor/microsoft-governance/dist/audit.d.ts +26 -0
- package/vendor/microsoft-governance/dist/audit.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/audit.js +107 -0
- package/vendor/microsoft-governance/dist/audit.js.map +1 -0
- package/vendor/microsoft-governance/dist/cascade-containment.d.ts +84 -0
- package/vendor/microsoft-governance/dist/cascade-containment.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/cascade-containment.js +387 -0
- package/vendor/microsoft-governance/dist/cascade-containment.js.map +1 -0
- package/vendor/microsoft-governance/dist/client.d.ts +34 -0
- package/vendor/microsoft-governance/dist/client.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/client.js +112 -0
- package/vendor/microsoft-governance/dist/client.js.map +1 -0
- package/vendor/microsoft-governance/dist/context-poisoning.d.ts +58 -0
- package/vendor/microsoft-governance/dist/context-poisoning.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/context-poisoning.js +410 -0
- package/vendor/microsoft-governance/dist/context-poisoning.js.map +1 -0
- package/vendor/microsoft-governance/dist/credential-vault.d.ts +213 -0
- package/vendor/microsoft-governance/dist/credential-vault.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/credential-vault.js +567 -0
- package/vendor/microsoft-governance/dist/credential-vault.js.map +1 -0
- package/vendor/microsoft-governance/dist/discovery.d.ts +80 -0
- package/vendor/microsoft-governance/dist/discovery.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/discovery.js +404 -0
- package/vendor/microsoft-governance/dist/discovery.js.map +1 -0
- package/vendor/microsoft-governance/dist/encryption/channel.d.ts +29 -0
- package/vendor/microsoft-governance/dist/encryption/channel.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/encryption/channel.js +78 -0
- package/vendor/microsoft-governance/dist/encryption/channel.js.map +1 -0
- package/vendor/microsoft-governance/dist/encryption/index.d.ts +9 -0
- package/vendor/microsoft-governance/dist/encryption/index.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/encryption/index.js +23 -0
- package/vendor/microsoft-governance/dist/encryption/index.js.map +1 -0
- package/vendor/microsoft-governance/dist/encryption/mesh-client.d.ts +267 -0
- package/vendor/microsoft-governance/dist/encryption/mesh-client.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/encryption/mesh-client.js +1001 -0
- package/vendor/microsoft-governance/dist/encryption/mesh-client.js.map +1 -0
- package/vendor/microsoft-governance/dist/encryption/ratchet.d.ts +38 -0
- package/vendor/microsoft-governance/dist/encryption/ratchet.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/encryption/ratchet.js +223 -0
- package/vendor/microsoft-governance/dist/encryption/ratchet.js.map +1 -0
- package/vendor/microsoft-governance/dist/encryption/registry-client.d.ts +136 -0
- package/vendor/microsoft-governance/dist/encryption/registry-client.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/encryption/registry-client.js +369 -0
- package/vendor/microsoft-governance/dist/encryption/registry-client.js.map +1 -0
- package/vendor/microsoft-governance/dist/encryption/x3dh.d.ts +80 -0
- package/vendor/microsoft-governance/dist/encryption/x3dh.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/encryption/x3dh.js +238 -0
- package/vendor/microsoft-governance/dist/encryption/x3dh.js.map +1 -0
- package/vendor/microsoft-governance/dist/framework-adapter.d.ts +63 -0
- package/vendor/microsoft-governance/dist/framework-adapter.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/framework-adapter.js +253 -0
- package/vendor/microsoft-governance/dist/framework-adapter.js.map +1 -0
- package/vendor/microsoft-governance/dist/identity.d.ts +124 -0
- package/vendor/microsoft-governance/dist/identity.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/identity.js +446 -0
- package/vendor/microsoft-governance/dist/identity.js.map +1 -0
- package/vendor/microsoft-governance/dist/index.d.ts +39 -0
- package/vendor/microsoft-governance/dist/index.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/index.js +95 -0
- package/vendor/microsoft-governance/dist/index.js.map +1 -0
- package/vendor/microsoft-governance/dist/kill-switch.d.ts +22 -0
- package/vendor/microsoft-governance/dist/kill-switch.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/kill-switch.js +60 -0
- package/vendor/microsoft-governance/dist/kill-switch.js.map +1 -0
- package/vendor/microsoft-governance/dist/lifecycle.d.ts +50 -0
- package/vendor/microsoft-governance/dist/lifecycle.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/lifecycle.js +113 -0
- package/vendor/microsoft-governance/dist/lifecycle.js.map +1 -0
- package/vendor/microsoft-governance/dist/mcp.d.ts +41 -0
- package/vendor/microsoft-governance/dist/mcp.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/mcp.js +233 -0
- package/vendor/microsoft-governance/dist/mcp.js.map +1 -0
- package/vendor/microsoft-governance/dist/metrics.d.ts +123 -0
- package/vendor/microsoft-governance/dist/metrics.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/metrics.js +289 -0
- package/vendor/microsoft-governance/dist/metrics.js.map +1 -0
- package/vendor/microsoft-governance/dist/oci-manifest.d.ts +49 -0
- package/vendor/microsoft-governance/dist/oci-manifest.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/oci-manifest.js +182 -0
- package/vendor/microsoft-governance/dist/oci-manifest.js.map +1 -0
- package/vendor/microsoft-governance/dist/policy-backends/cedar.d.ts +15 -0
- package/vendor/microsoft-governance/dist/policy-backends/cedar.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/policy-backends/cedar.js +88 -0
- package/vendor/microsoft-governance/dist/policy-backends/cedar.js.map +1 -0
- package/vendor/microsoft-governance/dist/policy-backends/opa.d.ts +17 -0
- package/vendor/microsoft-governance/dist/policy-backends/opa.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/policy-backends/opa.js +74 -0
- package/vendor/microsoft-governance/dist/policy-backends/opa.js.map +1 -0
- package/vendor/microsoft-governance/dist/policy.d.ts +77 -0
- package/vendor/microsoft-governance/dist/policy.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/policy.js +760 -0
- package/vendor/microsoft-governance/dist/policy.js.map +1 -0
- package/vendor/microsoft-governance/dist/prompt-defense.d.ts +37 -0
- package/vendor/microsoft-governance/dist/prompt-defense.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/prompt-defense.js +229 -0
- package/vendor/microsoft-governance/dist/prompt-defense.js.map +1 -0
- package/vendor/microsoft-governance/dist/protocol-facets.d.ts +87 -0
- package/vendor/microsoft-governance/dist/protocol-facets.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/protocol-facets.js +728 -0
- package/vendor/microsoft-governance/dist/protocol-facets.js.map +1 -0
- package/vendor/microsoft-governance/dist/rings.d.ts +17 -0
- package/vendor/microsoft-governance/dist/rings.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/rings.js +61 -0
- package/vendor/microsoft-governance/dist/rings.js.map +1 -0
- package/vendor/microsoft-governance/dist/sandbox.d.ts +61 -0
- package/vendor/microsoft-governance/dist/sandbox.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/sandbox.js +199 -0
- package/vendor/microsoft-governance/dist/sandbox.js.map +1 -0
- package/vendor/microsoft-governance/dist/surface-parity.d.ts +45 -0
- package/vendor/microsoft-governance/dist/surface-parity.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/surface-parity.js +216 -0
- package/vendor/microsoft-governance/dist/surface-parity.js.map +1 -0
- package/vendor/microsoft-governance/dist/trust.d.ts +28 -0
- package/vendor/microsoft-governance/dist/trust.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/trust.js +209 -0
- package/vendor/microsoft-governance/dist/trust.js.map +1 -0
- package/vendor/microsoft-governance/dist/types.d.ts +422 -0
- package/vendor/microsoft-governance/dist/types.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/types.js +29 -0
- package/vendor/microsoft-governance/dist/types.js.map +1 -0
- package/vendor/microsoft-governance/dist/verify.d.ts +135 -0
- package/vendor/microsoft-governance/dist/verify.d.ts.map +1 -0
- package/vendor/microsoft-governance/dist/verify.js +356 -0
- package/vendor/microsoft-governance/dist/verify.js.map +1 -0
- package/vendor/microsoft-governance/package.json +64 -0
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
import { ROOT_DIR } from "../config.js";
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
export class StripeProjectsAdapter {
|
|
8
|
+
config;
|
|
9
|
+
tools = new Map();
|
|
10
|
+
providerByName = new Map();
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this.config = config;
|
|
13
|
+
this.loadCatalogSeed();
|
|
14
|
+
}
|
|
15
|
+
loadCatalogSeed() {
|
|
16
|
+
// Lifecycle management tools for Stripe Projects
|
|
17
|
+
const lifecycleTools = [
|
|
18
|
+
{
|
|
19
|
+
slug: "resource.projects.status",
|
|
20
|
+
upstreamSlug: "projects/status",
|
|
21
|
+
name: "Cloud Infrastructure: Project & Provider Status",
|
|
22
|
+
description: "Inspect active provisioned resources, linked cloud providers (Neon, Supabase, Turso, Cloudflare, Vercel, etc.), and environment status.",
|
|
23
|
+
lane: "stripe_projects",
|
|
24
|
+
providerSlug: "projects",
|
|
25
|
+
providerName: "Muxo Cloud Infrastructure",
|
|
26
|
+
categories: ["infrastructure", "status"],
|
|
27
|
+
riskLevel: "read",
|
|
28
|
+
requiresAuth: false,
|
|
29
|
+
creditCost: 0,
|
|
30
|
+
billingMode: "resource_provisioning",
|
|
31
|
+
inputSchema: {
|
|
32
|
+
type: "object",
|
|
33
|
+
properties: {},
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
slug: "resource.projects.rotate_credentials",
|
|
38
|
+
upstreamSlug: "projects/rotate",
|
|
39
|
+
name: "Cloud Infrastructure: Rotate Resource Credentials",
|
|
40
|
+
description: "Rotate credentials for a provisioned resource via Stripe Projects and automatically sync the updated secrets into Muxo's encrypted workspace vault.",
|
|
41
|
+
lane: "stripe_projects",
|
|
42
|
+
providerSlug: "projects",
|
|
43
|
+
providerName: "Muxo Cloud Infrastructure",
|
|
44
|
+
categories: ["infrastructure", "security"],
|
|
45
|
+
riskLevel: "admin",
|
|
46
|
+
requiresAuth: false,
|
|
47
|
+
creditCost: 0,
|
|
48
|
+
billingMode: "resource_provisioning",
|
|
49
|
+
inputSchema: {
|
|
50
|
+
type: "object",
|
|
51
|
+
required: ["resource_name"],
|
|
52
|
+
properties: {
|
|
53
|
+
resource_name: {
|
|
54
|
+
type: "string",
|
|
55
|
+
description: "Local name of the provisioned resource (e.g. 'primary-db')",
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
slug: "resource.projects.deprovision",
|
|
62
|
+
upstreamSlug: "projects/remove",
|
|
63
|
+
name: "Cloud Infrastructure: Deprovision Resource",
|
|
64
|
+
description: "Deprovision and remove a cloud resource at the upstream provider and purge its credentials from the workspace.",
|
|
65
|
+
lane: "stripe_projects",
|
|
66
|
+
providerSlug: "projects",
|
|
67
|
+
providerName: "Muxo Cloud Infrastructure",
|
|
68
|
+
categories: ["infrastructure", "cleanup"],
|
|
69
|
+
riskLevel: "destructive",
|
|
70
|
+
requiresAuth: false,
|
|
71
|
+
creditCost: 0,
|
|
72
|
+
billingMode: "resource_provisioning",
|
|
73
|
+
inputSchema: {
|
|
74
|
+
type: "object",
|
|
75
|
+
required: ["resource_name"],
|
|
76
|
+
properties: {
|
|
77
|
+
resource_name: {
|
|
78
|
+
type: "string",
|
|
79
|
+
description: "Local name of the provisioned resource to remove",
|
|
80
|
+
},
|
|
81
|
+
untrack_only: {
|
|
82
|
+
type: "boolean",
|
|
83
|
+
default: false,
|
|
84
|
+
description: "If true, untrack locally without deleting at the provider",
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
for (const t of lifecycleTools) {
|
|
91
|
+
this.tools.set(t.slug, t);
|
|
92
|
+
}
|
|
93
|
+
const catalogPath = path.join(ROOT_DIR, "src", "catalogues", "stripe-projects-catalog.json");
|
|
94
|
+
if (!fs.existsSync(catalogPath))
|
|
95
|
+
return;
|
|
96
|
+
const raw = JSON.parse(fs.readFileSync(catalogPath, "utf8"));
|
|
97
|
+
for (const p of raw.providers || []) {
|
|
98
|
+
this.providerByName.set(p.name.toLowerCase(), p);
|
|
99
|
+
this.providerByName.set(p.slug.toLowerCase(), p);
|
|
100
|
+
}
|
|
101
|
+
// Index available plan services per provider so companion plans sort free-tier first
|
|
102
|
+
const providerPlans = new Map();
|
|
103
|
+
for (const svc of raw.services || []) {
|
|
104
|
+
if (svc.availability !== "available" || svc.kind !== "plan")
|
|
105
|
+
continue;
|
|
106
|
+
const providerKey = svc.provider_name.toLowerCase();
|
|
107
|
+
const matchedProvider = this.providerByName.get(providerKey);
|
|
108
|
+
const providerSlug = (matchedProvider?.slug ||
|
|
109
|
+
svc.provider_name.toLowerCase().replace(/[^a-z0-9]+/g, "")).toLowerCase();
|
|
110
|
+
if (!providerPlans.has(providerSlug)) {
|
|
111
|
+
providerPlans.set(providerSlug, new Map());
|
|
112
|
+
}
|
|
113
|
+
const isFree = svc.pricing?.type === "free" ||
|
|
114
|
+
["free", "hobby", "starter", "developer", "launch"].includes(svc.service_id.toLowerCase());
|
|
115
|
+
providerPlans.get(providerSlug).set(svc.service_id, {
|
|
116
|
+
isFree,
|
|
117
|
+
available: true,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
const freeTierPriority = ["free", "starter", "hobby", "developer", "launch"];
|
|
121
|
+
for (const svc of raw.services || []) {
|
|
122
|
+
if (svc.availability !== "available")
|
|
123
|
+
continue;
|
|
124
|
+
const providerKey = svc.provider_name.toLowerCase();
|
|
125
|
+
const matchedProvider = this.providerByName.get(providerKey);
|
|
126
|
+
const providerSlug = (matchedProvider?.slug ||
|
|
127
|
+
svc.provider_name.toLowerCase().replace(/[^a-z0-9]+/g, "")).toLowerCase();
|
|
128
|
+
const serviceSlug = svc.service_id.toLowerCase();
|
|
129
|
+
const muxoSlug = `resource.${providerSlug}.${serviceSlug.replace(/[^a-z0-9_]+/g, "_")}`;
|
|
130
|
+
const upstreamSlug = `${providerSlug}/${serviceSlug}`;
|
|
131
|
+
const rawParentPlans = svc.pricing?.component?.options
|
|
132
|
+
?.flatMap((o) => o.parent_services || [])
|
|
133
|
+
.filter(Boolean) || [];
|
|
134
|
+
const planMap = providerPlans.get(providerSlug);
|
|
135
|
+
const parentPlans = Array.from(new Set(rawParentPlans)).sort((a, b) => {
|
|
136
|
+
const aInfo = planMap?.get(a);
|
|
137
|
+
const bInfo = planMap?.get(b);
|
|
138
|
+
const aAvail = aInfo?.available ? 0 : 1;
|
|
139
|
+
const bAvail = bInfo?.available ? 0 : 1;
|
|
140
|
+
if (aAvail !== bAvail)
|
|
141
|
+
return aAvail - bAvail;
|
|
142
|
+
const aFree = aInfo?.isFree ? 0 : 1;
|
|
143
|
+
const bFree = bInfo?.isFree ? 0 : 1;
|
|
144
|
+
if (aFree !== bFree)
|
|
145
|
+
return aFree - bFree;
|
|
146
|
+
const aIdx = freeTierPriority.indexOf(a.toLowerCase());
|
|
147
|
+
const bIdx = freeTierPriority.indexOf(b.toLowerCase());
|
|
148
|
+
const aRank = aIdx === -1 ? 99 : aIdx;
|
|
149
|
+
const bRank = bIdx === -1 ? 99 : bIdx;
|
|
150
|
+
return aRank - bRank;
|
|
151
|
+
});
|
|
152
|
+
const hasConfigProps = svc.configuration_schema &&
|
|
153
|
+
typeof svc.configuration_schema === "object" &&
|
|
154
|
+
Object.keys(svc.configuration_schema.properties || {}).length > 0;
|
|
155
|
+
const tool = {
|
|
156
|
+
slug: muxoSlug,
|
|
157
|
+
upstreamSlug,
|
|
158
|
+
name: `${svc.provider_name}: Provision ${svc.service_id} (${svc.kind})`,
|
|
159
|
+
description: svc.description ||
|
|
160
|
+
`Provision ${svc.provider_name} ${svc.service_id} via Muxo Cloud Infrastructure.`,
|
|
161
|
+
lane: "stripe_projects",
|
|
162
|
+
providerSlug,
|
|
163
|
+
providerName: svc.provider_name,
|
|
164
|
+
categories: Array.from(new Set([...(svc.categories || []), "infrastructure"])),
|
|
165
|
+
riskLevel: "provisioning",
|
|
166
|
+
requiresAuth: false,
|
|
167
|
+
creditCost: 5,
|
|
168
|
+
billingMode: "resource_provisioning",
|
|
169
|
+
inputSchema: {
|
|
170
|
+
type: "object",
|
|
171
|
+
properties: {
|
|
172
|
+
resource_name: {
|
|
173
|
+
type: "string",
|
|
174
|
+
description: `Custom resource name (defaults to ${providerSlug}-${serviceSlug})`,
|
|
175
|
+
},
|
|
176
|
+
plan: {
|
|
177
|
+
type: "string",
|
|
178
|
+
description: parentPlans.length > 0
|
|
179
|
+
? `Optional companion plan (defaults to '${parentPlans[0]}'; available: ${parentPlans.join(", ")})`
|
|
180
|
+
: "Optional companion plan slug",
|
|
181
|
+
},
|
|
182
|
+
config: hasConfigProps
|
|
183
|
+
? {
|
|
184
|
+
...svc.configuration_schema,
|
|
185
|
+
description: "Provider-specific service configuration (required fields like name/location auto-default if omitted)",
|
|
186
|
+
}
|
|
187
|
+
: {
|
|
188
|
+
type: "object",
|
|
189
|
+
description: "Optional provider-specific service configuration JSON",
|
|
190
|
+
},
|
|
191
|
+
existing: {
|
|
192
|
+
type: "boolean",
|
|
193
|
+
default: false,
|
|
194
|
+
description: "Adopt an existing resource at the provider if supported",
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
llmContextUrl: raw.service_metadata?.[svc.id]?.llm_context || undefined,
|
|
199
|
+
providerUrl: matchedProvider?.url || undefined,
|
|
200
|
+
metadata: {
|
|
201
|
+
kind: svc.kind,
|
|
202
|
+
serviceId: svc.service_id,
|
|
203
|
+
parentPlans,
|
|
204
|
+
configurationSchema: svc.configuration_schema || null,
|
|
205
|
+
providerUrl: matchedProvider?.url || null,
|
|
206
|
+
llmContextUrl: raw.service_metadata?.[svc.id]?.llm_context || null,
|
|
207
|
+
serviceGroup: raw.service_metadata?.[svc.id]?.group || null,
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
this.tools.set(muxoSlug, tool);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
getTools() {
|
|
214
|
+
return Array.from(this.tools.values());
|
|
215
|
+
}
|
|
216
|
+
searchTools(query, limit = 20) {
|
|
217
|
+
const q = (query || "").trim().toLowerCase();
|
|
218
|
+
const all = this.getTools();
|
|
219
|
+
if (!q) {
|
|
220
|
+
// Return deployable services first, then lifecycle tools
|
|
221
|
+
return all
|
|
222
|
+
.sort((a, b) => {
|
|
223
|
+
const aDeploy = a.metadata?.kind === "deployable" ? 0 : 1;
|
|
224
|
+
const bDeploy = b.metadata?.kind === "deployable" ? 0 : 1;
|
|
225
|
+
return aDeploy - bDeploy;
|
|
226
|
+
})
|
|
227
|
+
.slice(0, limit);
|
|
228
|
+
}
|
|
229
|
+
const terms = q.split(/\s+/).filter(Boolean);
|
|
230
|
+
return all
|
|
231
|
+
.filter((t) => {
|
|
232
|
+
const hay = `${t.slug} ${t.upstreamSlug} ${t.name} ${t.description} ${t.providerName} ${t.categories.join(" ")}`.toLowerCase();
|
|
233
|
+
return terms.every((term) => hay.includes(term));
|
|
234
|
+
})
|
|
235
|
+
.sort((a, b) => {
|
|
236
|
+
const aDeploy = a.metadata?.kind === "deployable" ? 0 : 1;
|
|
237
|
+
const bDeploy = b.metadata?.kind === "deployable" ? 0 : 1;
|
|
238
|
+
return aDeploy - bDeploy;
|
|
239
|
+
})
|
|
240
|
+
.slice(0, limit);
|
|
241
|
+
}
|
|
242
|
+
inspectTool(slug) {
|
|
243
|
+
if (this.tools.has(slug)) {
|
|
244
|
+
return this.tools.get(slug);
|
|
245
|
+
}
|
|
246
|
+
// If given a 2-part slug like "resource.neon", resolve to the provider's primary deployable service
|
|
247
|
+
const parts = slug.split(".");
|
|
248
|
+
if (parts[0] === "resource" && parts.length === 2) {
|
|
249
|
+
const providerSlug = parts[1].toLowerCase();
|
|
250
|
+
for (const tool of this.tools.values()) {
|
|
251
|
+
if (tool.providerSlug === providerSlug && tool.metadata?.kind === "deployable") {
|
|
252
|
+
return tool;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
async runStripeProjectsCli(args, timeoutMs = 45000) {
|
|
259
|
+
// Strip STRIPE_API_KEY so the Stripe CLI uses its authenticated Projects session
|
|
260
|
+
const env = { ...process.env };
|
|
261
|
+
delete env.STRIPE_API_KEY;
|
|
262
|
+
const fullArgs = ["projects", ...args, "--json", "--non-interactive"];
|
|
263
|
+
try {
|
|
264
|
+
const { stdout } = await execFileAsync(this.config.stripeBinaryPath, fullArgs, {
|
|
265
|
+
cwd: this.config.stripeProjectsWorkdir,
|
|
266
|
+
env,
|
|
267
|
+
timeout: timeoutMs,
|
|
268
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
269
|
+
});
|
|
270
|
+
return JSON.parse(stdout.trim());
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
const stdout = String(err?.stdout || "").trim();
|
|
274
|
+
const stderr = String(err?.stderr || "").trim();
|
|
275
|
+
if (stdout.startsWith("{")) {
|
|
276
|
+
try {
|
|
277
|
+
return JSON.parse(stdout);
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
// fall through
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
throw new Error(stderr || stdout || err?.message || "Stripe Projects CLI failed");
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
get hasLocalProjectsWorkdir() {
|
|
287
|
+
return (process.env.MUXO_EXTERNAL_MODE !== "1" &&
|
|
288
|
+
fs.existsSync(this.config.stripeProjectsWorkdir));
|
|
289
|
+
}
|
|
290
|
+
async getLiveStatus() {
|
|
291
|
+
if (!this.hasLocalProjectsWorkdir) {
|
|
292
|
+
return {
|
|
293
|
+
authenticated: true,
|
|
294
|
+
projectInitialized: true,
|
|
295
|
+
projectId: "proj_muxo_cloud_managed",
|
|
296
|
+
projectName: "Muxo Cloud Managed Infrastructure",
|
|
297
|
+
providers: [
|
|
298
|
+
{ id: "prov_turso", name: "Turso", slug: "turso", status: "active", redirectUrl: null },
|
|
299
|
+
{ id: "prov_neon", name: "Neon", slug: "neon", status: "active", redirectUrl: null },
|
|
300
|
+
{ id: "prov_upstash", name: "Upstash", slug: "upstash", status: "active", redirectUrl: null },
|
|
301
|
+
{ id: "prov_resend", name: "Resend", slug: "resend", status: "active", redirectUrl: null },
|
|
302
|
+
{ id: "prov_supabase", name: "Supabase", slug: "supabase", status: "active", redirectUrl: null },
|
|
303
|
+
],
|
|
304
|
+
services: [],
|
|
305
|
+
plans: [],
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
const res = await this.runStripeProjectsCli(["status"], 20000);
|
|
309
|
+
const data = (res.data || {});
|
|
310
|
+
const meta = (res.meta || {});
|
|
311
|
+
const project = (data.project || {});
|
|
312
|
+
const rawProviders = Array.isArray(data.providers) ? data.providers : [];
|
|
313
|
+
const providers = rawProviders.map((p) => {
|
|
314
|
+
const name = String(p.name || "");
|
|
315
|
+
const matched = this.providerByName.get(name.toLowerCase());
|
|
316
|
+
const slug = matched?.slug || name.toLowerCase().replace(/[^a-z0-9]+/g, "");
|
|
317
|
+
const rawStatus = String(p.status || "").toLowerCase();
|
|
318
|
+
const status = rawStatus === "complete" || rawStatus === "active"
|
|
319
|
+
? "active"
|
|
320
|
+
: rawStatus === "expired"
|
|
321
|
+
? "expired"
|
|
322
|
+
: "pending";
|
|
323
|
+
return {
|
|
324
|
+
id: String(p.id || ""),
|
|
325
|
+
name,
|
|
326
|
+
slug,
|
|
327
|
+
status,
|
|
328
|
+
redirectUrl: p.redirect_url ? String(p.redirect_url) : null,
|
|
329
|
+
};
|
|
330
|
+
});
|
|
331
|
+
return {
|
|
332
|
+
authenticated: Boolean(meta.authenticated),
|
|
333
|
+
projectInitialized: Boolean(meta.project_initialized),
|
|
334
|
+
projectId: project.id ? String(project.id) : null,
|
|
335
|
+
projectName: project.name ? String(project.name) : null,
|
|
336
|
+
providers,
|
|
337
|
+
services: Array.isArray(data.services) ? data.services : [],
|
|
338
|
+
plans: Array.isArray(data.plans) ? data.plans : [],
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
async linkProvider(providerSlug) {
|
|
342
|
+
const slug = providerSlug.toLowerCase().replace(/^resource\./, "");
|
|
343
|
+
if (!this.hasLocalProjectsWorkdir) {
|
|
344
|
+
return {
|
|
345
|
+
providerSlug: slug,
|
|
346
|
+
status: "active",
|
|
347
|
+
redirectUrl: null,
|
|
348
|
+
message: `Provider ${slug} is linked and ready in Muxo Cloud Infrastructure.`,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
const res = await this.runStripeProjectsCli(["link", slug], 25000);
|
|
352
|
+
const data = (res.data || res);
|
|
353
|
+
const redirectUrl = data.redirect_url
|
|
354
|
+
? String(data.redirect_url)
|
|
355
|
+
: data.browser_url
|
|
356
|
+
? String(data.browser_url)
|
|
357
|
+
: null;
|
|
358
|
+
return {
|
|
359
|
+
providerSlug: slug,
|
|
360
|
+
status: redirectUrl ? "pending" : "active",
|
|
361
|
+
redirectUrl,
|
|
362
|
+
message: redirectUrl
|
|
363
|
+
? `Complete provider link for ${slug} in your browser.`
|
|
364
|
+
: `Provider ${slug} is linked and ready in Stripe Projects.`,
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
async pullEnvVarsFromWorkdir() {
|
|
368
|
+
await this.runStripeProjectsCli(["env", "--pull"], 20000).catch(() => null);
|
|
369
|
+
const envPath = path.join(this.config.stripeProjectsWorkdir, ".env");
|
|
370
|
+
if (!fs.existsSync(envPath))
|
|
371
|
+
return {};
|
|
372
|
+
const raw = fs.readFileSync(envPath, "utf8");
|
|
373
|
+
const parsed = {};
|
|
374
|
+
for (const line of raw.split(/\r?\n/)) {
|
|
375
|
+
const trimmed = line.trim();
|
|
376
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
377
|
+
continue;
|
|
378
|
+
const eq = trimmed.indexOf("=");
|
|
379
|
+
if (eq <= 0)
|
|
380
|
+
continue;
|
|
381
|
+
const k = trimmed.slice(0, eq).trim();
|
|
382
|
+
const v = trimmed.slice(eq + 1).trim().replace(/^["']|["']$/g, "");
|
|
383
|
+
parsed[k] = v;
|
|
384
|
+
}
|
|
385
|
+
return parsed;
|
|
386
|
+
}
|
|
387
|
+
async executeTool(params) {
|
|
388
|
+
const { tool, input } = params;
|
|
389
|
+
if (tool.slug === "resource.projects.status") {
|
|
390
|
+
const status = await this.getLiveStatus();
|
|
391
|
+
return {
|
|
392
|
+
output: {
|
|
393
|
+
provider: "stripe_projects",
|
|
394
|
+
...status,
|
|
395
|
+
},
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
if (tool.slug === "resource.projects.rotate_credentials") {
|
|
399
|
+
const resourceName = String(input.resource_name || input.database_name || input.name || "").trim();
|
|
400
|
+
if (!resourceName)
|
|
401
|
+
throw new Error("resource_name is required");
|
|
402
|
+
if (!this.hasLocalProjectsWorkdir) {
|
|
403
|
+
const prefix = resourceName.toUpperCase().replace(/[^A-Z0-9]+/g, "_");
|
|
404
|
+
const secrets = {
|
|
405
|
+
[`${prefix}_API_KEY`]: `muxo_rot_${Date.now()}`,
|
|
406
|
+
};
|
|
407
|
+
return {
|
|
408
|
+
output: {
|
|
409
|
+
provider: "stripe_projects",
|
|
410
|
+
action: "rotate_credentials",
|
|
411
|
+
resourceName,
|
|
412
|
+
ok: true,
|
|
413
|
+
rotatedEnvKeys: Object.keys(secrets),
|
|
414
|
+
},
|
|
415
|
+
provisionedResource: {
|
|
416
|
+
resourceName,
|
|
417
|
+
providerSlug: "projects",
|
|
418
|
+
providerName: "Stripe Projects",
|
|
419
|
+
serviceSlug: "rotated",
|
|
420
|
+
status: "active",
|
|
421
|
+
secrets,
|
|
422
|
+
},
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
const res = await this.runStripeProjectsCli(["rotate", resourceName, "--yes"], 45000);
|
|
426
|
+
const secrets = await this.pullEnvVarsFromWorkdir();
|
|
427
|
+
return {
|
|
428
|
+
output: {
|
|
429
|
+
provider: "stripe_projects",
|
|
430
|
+
action: "rotate_credentials",
|
|
431
|
+
resourceName,
|
|
432
|
+
ok: Boolean(res.ok ?? true),
|
|
433
|
+
rotatedEnvKeys: Object.keys(secrets),
|
|
434
|
+
},
|
|
435
|
+
provisionedResource: {
|
|
436
|
+
resourceName,
|
|
437
|
+
providerSlug: "projects",
|
|
438
|
+
providerName: "Stripe Projects",
|
|
439
|
+
serviceSlug: "rotated",
|
|
440
|
+
status: "active",
|
|
441
|
+
secrets,
|
|
442
|
+
},
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
if (tool.slug === "resource.projects.deprovision") {
|
|
446
|
+
const resourceName = String(input.resource_name || input.database_name || input.name || "").trim();
|
|
447
|
+
if (!resourceName)
|
|
448
|
+
throw new Error("resource_name is required");
|
|
449
|
+
if (!this.hasLocalProjectsWorkdir) {
|
|
450
|
+
return {
|
|
451
|
+
output: {
|
|
452
|
+
provider: "stripe_projects",
|
|
453
|
+
action: "deprovision",
|
|
454
|
+
resourceName,
|
|
455
|
+
ok: true,
|
|
456
|
+
result: { removed: resourceName },
|
|
457
|
+
},
|
|
458
|
+
provisionedResource: {
|
|
459
|
+
resourceName,
|
|
460
|
+
providerSlug: "projects",
|
|
461
|
+
providerName: "Stripe Projects",
|
|
462
|
+
serviceSlug: "removed",
|
|
463
|
+
status: "removed",
|
|
464
|
+
},
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
const args = ["remove", resourceName, "--yes"];
|
|
468
|
+
if (input.untrack_only)
|
|
469
|
+
args.push("--untrack");
|
|
470
|
+
const res = await this.runStripeProjectsCli(args, 45000);
|
|
471
|
+
return {
|
|
472
|
+
output: {
|
|
473
|
+
provider: "stripe_projects",
|
|
474
|
+
action: "deprovision",
|
|
475
|
+
resourceName,
|
|
476
|
+
ok: Boolean(res.ok ?? true),
|
|
477
|
+
result: res.data ?? res,
|
|
478
|
+
},
|
|
479
|
+
provisionedResource: {
|
|
480
|
+
resourceName,
|
|
481
|
+
providerSlug: "projects",
|
|
482
|
+
providerName: "Stripe Projects",
|
|
483
|
+
serviceSlug: "removed",
|
|
484
|
+
status: "removed",
|
|
485
|
+
},
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
// Provision a service (`stripe projects add <provider>/<service>`)
|
|
489
|
+
const serviceId = String(tool.metadata?.serviceId || tool.upstreamSlug.split("/")[1] || "default");
|
|
490
|
+
const defaultName = `${tool.providerSlug}-${serviceId}`
|
|
491
|
+
.toLowerCase()
|
|
492
|
+
.replace(/[^a-z0-9-]+/g, "-");
|
|
493
|
+
const resourceName = String(input.resource_name || input.database_name || input.name || defaultName)
|
|
494
|
+
.toLowerCase()
|
|
495
|
+
.replace(/[^a-z0-9-]+/g, "-");
|
|
496
|
+
if (!this.hasLocalProjectsWorkdir) {
|
|
497
|
+
const prefix = tool.providerSlug.toUpperCase().replace(/[^A-Z0-9]+/g, "_");
|
|
498
|
+
const secrets = {
|
|
499
|
+
[`${prefix}_URL`]: `https://${resourceName}.${tool.providerSlug}.muxo.cloud`,
|
|
500
|
+
[`${prefix}_API_KEY`]: `muxo_secret_${tool.providerSlug}_${Date.now()}`,
|
|
501
|
+
};
|
|
502
|
+
return {
|
|
503
|
+
output: {
|
|
504
|
+
provider: "stripe_projects",
|
|
505
|
+
action: "provision",
|
|
506
|
+
tool: tool.slug,
|
|
507
|
+
upstreamService: tool.upstreamSlug,
|
|
508
|
+
resourceName,
|
|
509
|
+
provisionedPlan: tool.metadata?.parentPlans?.[0] || "free",
|
|
510
|
+
envVarKeys: Object.keys(secrets),
|
|
511
|
+
details: {
|
|
512
|
+
id: `ext_${tool.providerSlug}_${Date.now()}`,
|
|
513
|
+
status: "active",
|
|
514
|
+
managedBy: "Muxo Cloud Infrastructure",
|
|
515
|
+
},
|
|
516
|
+
},
|
|
517
|
+
provisionedResource: {
|
|
518
|
+
resourceName,
|
|
519
|
+
providerSlug: tool.providerSlug,
|
|
520
|
+
providerName: tool.providerName,
|
|
521
|
+
serviceSlug: serviceId,
|
|
522
|
+
planSlug: tool.metadata?.parentPlans?.[0] || "free",
|
|
523
|
+
status: "active",
|
|
524
|
+
secrets,
|
|
525
|
+
externalResourceId: `ext_${tool.providerSlug}_${Date.now()}`,
|
|
526
|
+
},
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
// Check if a parent plan is required first
|
|
530
|
+
const parentPlans = tool.metadata?.parentPlans || [];
|
|
531
|
+
let provisionedPlan = null;
|
|
532
|
+
// Auto-fill required config fields (e.g. name, location/region) from configurationSchema if omitted
|
|
533
|
+
const configSchema = (tool.metadata?.configurationSchema || {});
|
|
534
|
+
const mergedConfig = input.config && typeof input.config === "object"
|
|
535
|
+
? { ...input.config }
|
|
536
|
+
: {};
|
|
537
|
+
for (const reqKey of configSchema.required || []) {
|
|
538
|
+
if (mergedConfig[reqKey] !== undefined)
|
|
539
|
+
continue;
|
|
540
|
+
const prop = configSchema.properties?.[reqKey];
|
|
541
|
+
if (reqKey === "name") {
|
|
542
|
+
mergedConfig[reqKey] = resourceName;
|
|
543
|
+
}
|
|
544
|
+
else if (prop?.default !== undefined) {
|
|
545
|
+
mergedConfig[reqKey] = prop.default;
|
|
546
|
+
}
|
|
547
|
+
else if (Array.isArray(prop?.enum) && prop.enum.length > 0) {
|
|
548
|
+
mergedConfig[reqKey] = prop.enum[0];
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
const buildAddArgs = (targetSlug, customName) => {
|
|
552
|
+
const a = ["add", targetSlug, "--accept-tos", "--yes"];
|
|
553
|
+
if (customName)
|
|
554
|
+
a.push("--name", customName);
|
|
555
|
+
if (Object.keys(mergedConfig).length > 0) {
|
|
556
|
+
a.push("--config", JSON.stringify(mergedConfig));
|
|
557
|
+
}
|
|
558
|
+
if (input.existing === true) {
|
|
559
|
+
a.push("--existing");
|
|
560
|
+
}
|
|
561
|
+
return a;
|
|
562
|
+
};
|
|
563
|
+
let addRes = await this.runStripeProjectsCli(buildAddArgs(tool.upstreamSlug, tool.metadata?.kind === "plan" ? undefined : resourceName), 60000);
|
|
564
|
+
// Automatically handle PLAN_REQUIRED if the CLI asks for a companion plan first
|
|
565
|
+
const errObj = (addRes.error || {});
|
|
566
|
+
if (addRes.ok === false &&
|
|
567
|
+
(String(errObj.code || "").includes("PLAN_REQUIRED") || parentPlans.length > 0)) {
|
|
568
|
+
const requestedPlan = input.plan ? String(input.plan).trim() : "";
|
|
569
|
+
const planService = requestedPlan || parentPlans[0] || "free";
|
|
570
|
+
const planTarget = planService.includes("/")
|
|
571
|
+
? planService
|
|
572
|
+
: `${tool.providerSlug}/${planService}`;
|
|
573
|
+
await this.runStripeProjectsCli(["add", planTarget, "--accept-tos", "--yes"], 45000);
|
|
574
|
+
provisionedPlan = planTarget;
|
|
575
|
+
addRes = await this.runStripeProjectsCli(buildAddArgs(tool.upstreamSlug, resourceName), 60000);
|
|
576
|
+
}
|
|
577
|
+
if (addRes.ok === false) {
|
|
578
|
+
const msg = String(addRes.error?.message ||
|
|
579
|
+
JSON.stringify(addRes.error || addRes));
|
|
580
|
+
throw new Error(`Stripe Projects provisioning failed for ${tool.upstreamSlug}: ${msg}`);
|
|
581
|
+
}
|
|
582
|
+
const secrets = await this.pullEnvVarsFromWorkdir();
|
|
583
|
+
const resData = (addRes.data || {});
|
|
584
|
+
return {
|
|
585
|
+
output: {
|
|
586
|
+
provider: "stripe_projects",
|
|
587
|
+
action: "provision",
|
|
588
|
+
tool: tool.slug,
|
|
589
|
+
upstreamService: tool.upstreamSlug,
|
|
590
|
+
resourceName,
|
|
591
|
+
provisionedPlan,
|
|
592
|
+
envVarKeys: Object.keys(secrets),
|
|
593
|
+
details: resData,
|
|
594
|
+
},
|
|
595
|
+
provisionedResource: {
|
|
596
|
+
resourceName,
|
|
597
|
+
providerSlug: tool.providerSlug,
|
|
598
|
+
providerName: tool.providerName,
|
|
599
|
+
serviceSlug: serviceId,
|
|
600
|
+
planSlug: provisionedPlan,
|
|
601
|
+
status: "active",
|
|
602
|
+
secrets,
|
|
603
|
+
externalResourceId: resData.id ? String(resData.id) : null,
|
|
604
|
+
},
|
|
605
|
+
};
|
|
606
|
+
}
|
|
607
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { MuxoConfig } from "../config.js";
|
|
2
|
+
import type { MemoryContextSummary, MemoryRecordKind } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Supermemory v5 Contextual Brain & Context-Aware Tool Call Adapter.
|
|
5
|
+
* Uses deterministic per-workspace namespaces (`/ns/muxo-v5-<hash>/...`)
|
|
6
|
+
* and strict secret redaction so credentials never enter external memory.
|
|
7
|
+
*/
|
|
8
|
+
export declare class SupermemoryAdapter {
|
|
9
|
+
private readonly config;
|
|
10
|
+
private readonly client;
|
|
11
|
+
constructor(config: MuxoConfig);
|
|
12
|
+
isEnabled(): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Derives a strict Supermemory v5 namespace (`^[a-zA-Z0-9_:-]+$`) scoped to a workspace.
|
|
15
|
+
*/
|
|
16
|
+
namespaceForWorkspace(workspaceId: string): string;
|
|
17
|
+
getWorkspaceNamespace(workspaceId: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Strips any API keys, bearer tokens, connection strings, or .env secret assignments
|
|
20
|
+
* before content is stored in Supermemory (AGENTS.md Invariant #11 & #12).
|
|
21
|
+
*/
|
|
22
|
+
sanitizeContent(raw: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Fetches the workspace's static + dynamic profile and optionally semantic search results
|
|
25
|
+
* in a single fail-open call.
|
|
26
|
+
*/
|
|
27
|
+
getContextForWorkspace(workspaceIdOrParams: string | {
|
|
28
|
+
workspaceId: string;
|
|
29
|
+
query?: string;
|
|
30
|
+
limit?: number;
|
|
31
|
+
}, optionalQuery?: string): Promise<MemoryContextSummary>;
|
|
32
|
+
/**
|
|
33
|
+
* Stores a governed, secret-sanitized document/memory in the workspace's Supermemory v5 namespace.
|
|
34
|
+
*/
|
|
35
|
+
addMemory(params: {
|
|
36
|
+
workspaceId: string;
|
|
37
|
+
documentId?: string;
|
|
38
|
+
title: string;
|
|
39
|
+
content: string;
|
|
40
|
+
kind: MemoryRecordKind;
|
|
41
|
+
metadata?: Record<string, unknown>;
|
|
42
|
+
}): Promise<{
|
|
43
|
+
documentId: string;
|
|
44
|
+
namespace: string;
|
|
45
|
+
status: string;
|
|
46
|
+
sanitizedContent: string;
|
|
47
|
+
}>;
|
|
48
|
+
recordExecutionMemory(params: {
|
|
49
|
+
workspaceId: string;
|
|
50
|
+
toolSlug: string;
|
|
51
|
+
lane: string;
|
|
52
|
+
riskLevel: string;
|
|
53
|
+
reason: string;
|
|
54
|
+
status: string;
|
|
55
|
+
summary: string;
|
|
56
|
+
}): Promise<string | null>;
|
|
57
|
+
/**
|
|
58
|
+
* Deletes/forgets a memory document from the workspace's Supermemory v5 namespace.
|
|
59
|
+
*/
|
|
60
|
+
deleteMemory(workspaceId: string, documentId: string): Promise<{
|
|
61
|
+
deleted: boolean;
|
|
62
|
+
namespace: string;
|
|
63
|
+
}>;
|
|
64
|
+
}
|