@muxoai/platform 1.3.0 → 1.3.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 (51) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude-plugin/marketplace.json +19 -4
  3. package/.codex/config.toml +9 -2
  4. package/README.md +63 -20
  5. package/dist/clerk.d.ts +33 -0
  6. package/dist/clerk.js +198 -0
  7. package/dist/cli.js +1181 -99
  8. package/dist/engine.d.ts +22 -1
  9. package/dist/engine.js +284 -14
  10. package/dist/mcp.d.ts +6 -1
  11. package/dist/mcp.js +109 -22
  12. package/dist/nl.js +60 -36
  13. package/dist/policy.d.ts +9 -0
  14. package/dist/policy.js +73 -0
  15. package/dist/providers/composio-instant.d.ts +4 -0
  16. package/dist/providers/composio-instant.js +634 -534
  17. package/dist/providers/composio-sdk.d.ts +1 -0
  18. package/dist/providers/composio-sdk.js +6 -2
  19. package/dist/providers/microsoft-governance.d.ts +61 -2
  20. package/dist/providers/microsoft-governance.js +458 -24
  21. package/dist/providers/stripe-billing.js +14 -4
  22. package/dist/providers/stripe-projects.d.ts +4 -1
  23. package/dist/providers/stripe-projects.js +123 -12
  24. package/dist/providers/supermemory.d.ts +28 -5
  25. package/dist/providers/supermemory.js +183 -55
  26. package/dist/sdk.d.ts +167 -1
  27. package/dist/sdk.js +113 -2
  28. package/dist/server.js +258 -40
  29. package/dist/store.d.ts +26 -1
  30. package/dist/store.js +255 -6
  31. package/dist/types.d.ts +86 -0
  32. package/dist/ui/console-html.d.ts +16 -0
  33. package/dist/ui/console-html.js +2427 -2206
  34. package/dist/ui/design-tokens.d.ts +177 -0
  35. package/dist/ui/design-tokens.js +210 -0
  36. package/dist/version.d.ts +1 -0
  37. package/dist/version.js +1 -0
  38. package/package.json +2 -2
  39. package/plugins/muxo/.app.json +1 -1
  40. package/plugins/muxo/.claude-plugin/plugin.json +2 -2
  41. package/plugins/muxo/.codex-plugin/plugin.json +7 -5
  42. package/plugins/muxo/.mcp.json +1 -33
  43. package/plugins/muxo/assets/logo.png +0 -0
  44. package/plugins/muxo/hooks/session-start.sh +1 -1
  45. package/plugins/muxo/plugin.json +63 -6
  46. package/plugins/muxo/skills/muxo/SKILL.md +92 -14
  47. package/plugins/muxo/skills/muxo/agents/openai.yaml +12 -0
  48. package/plugins/muxo/skills/muxo/references/cli.md +4 -2
  49. package/plugins/muxo/skills/muxo/references/mcp.md +15 -9
  50. package/plugins/muxo/skills/setup/SKILL.md +8 -2
  51. package/plugins/muxo/skills/setup/agents/openai.yaml +12 -0
@@ -4,6 +4,22 @@ import path from "node:path";
4
4
  import { promisify } from "node:util";
5
5
  import { ROOT_DIR } from "../config.js";
6
6
  const execFileAsync = promisify(execFile);
7
+ export function isPaidCloudProvisioning(tool, input) {
8
+ if (tool.lane !== "stripe_projects")
9
+ return false;
10
+ if (Boolean(tool.metadata?.isPaidService) || tool.creditCost >= 15) {
11
+ return true;
12
+ }
13
+ const requestedPlan = String(input?.plan || "")
14
+ .trim()
15
+ .toLowerCase();
16
+ if (!requestedPlan)
17
+ return false;
18
+ const planLeaf = requestedPlan.includes("/")
19
+ ? requestedPlan.split("/").pop() || requestedPlan
20
+ : requestedPlan;
21
+ return /^(pro|scaler|paid|scale|business|team|grow|credits|launch|enterprise|plus)$/i.test(planLeaf);
22
+ }
7
23
  export class StripeProjectsAdapter {
8
24
  config;
9
25
  tools = new Map();
@@ -37,7 +53,7 @@ export class StripeProjectsAdapter {
37
53
  slug: "resource.projects.rotate_credentials",
38
54
  upstreamSlug: "projects/rotate",
39
55
  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.",
56
+ description: "Rotate credentials for a provisioned resource via Muxo Cloud Infrastructure and automatically sync the updated secrets into Muxo's encrypted workspace vault.",
41
57
  lane: "stripe_projects",
42
58
  providerSlug: "projects",
43
59
  providerName: "Muxo Cloud Infrastructure",
@@ -152,6 +168,13 @@ export class StripeProjectsAdapter {
152
168
  const hasConfigProps = svc.configuration_schema &&
153
169
  typeof svc.configuration_schema === "object" &&
154
170
  Object.keys(svc.configuration_schema.properties || {}).length > 0;
171
+ const pricingType = String(svc.pricing?.type || "")
172
+ .trim()
173
+ .toLowerCase();
174
+ const isPaidService = (svc.kind === "plan" &&
175
+ ((pricingType.length > 0 && pricingType !== "free") ||
176
+ /^(pro|scaler|paid|scale|business|team|grow|credits|launch|enterprise|plus)$/i.test(svc.service_id))) ||
177
+ /^(credits|workers_paid)$/i.test(svc.service_id);
155
178
  const tool = {
156
179
  slug: muxoSlug,
157
180
  upstreamSlug,
@@ -164,7 +187,7 @@ export class StripeProjectsAdapter {
164
187
  categories: Array.from(new Set([...(svc.categories || []), "infrastructure"])),
165
188
  riskLevel: "provisioning",
166
189
  requiresAuth: false,
167
- creditCost: 5,
190
+ creditCost: isPaidService ? 25 : 5,
168
191
  billingMode: "resource_provisioning",
169
192
  inputSchema: {
170
193
  type: "object",
@@ -203,6 +226,8 @@ export class StripeProjectsAdapter {
203
226
  metadata: {
204
227
  kind: svc.kind,
205
228
  serviceId: svc.service_id,
229
+ isPaidService,
230
+ pricingType: pricingType || (isPaidService ? "paid" : "free"),
206
231
  parentPlans,
207
232
  configurationSchema: svc.configuration_schema || null,
208
233
  providerUrl: matchedProvider?.url || null,
@@ -249,9 +274,9 @@ export class StripeProjectsAdapter {
249
274
  if (this.tools.has(slug)) {
250
275
  return this.tools.get(slug);
251
276
  }
252
- // If given a 2-part slug like "resource.neon", or a 3-part alias like "resource.turso.create_database" / "resource.turso.provision"
277
+ // If given a 2-part slug like "resource.neon", or a 3-part alias like "resource.turso.create_database" / "projects.neon.create_database"
253
278
  const parts = slug.split(".");
254
- if (parts[0] === "resource" && parts.length >= 2) {
279
+ if ((parts[0] === "resource" || parts[0] === "projects") && parts.length >= 2) {
255
280
  const providerSlug = parts[1].toLowerCase();
256
281
  const actionPart = parts[2]?.toLowerCase() || "";
257
282
  if (parts.length === 2 ||
@@ -375,9 +400,13 @@ export class StripeProjectsAdapter {
375
400
  : `Provider ${slug} is linked and ready in Stripe Projects.`,
376
401
  };
377
402
  }
378
- async pullEnvVarsFromWorkdir() {
379
- await this.runStripeProjectsCli(["env", "--pull"], 20000).catch(() => null);
403
+ async pullEnvVarsFromWorkdir(syncFromCli = false) {
404
+ if (!this.hasLocalProjectsWorkdir)
405
+ return {};
380
406
  const envPath = path.join(this.config.stripeProjectsWorkdir, ".env");
407
+ if (syncFromCli || !fs.existsSync(envPath)) {
408
+ await this.runStripeProjectsCli(["env", "--pull"], 10000).catch(() => null);
409
+ }
381
410
  if (!fs.existsSync(envPath))
382
411
  return {};
383
412
  const raw = fs.readFileSync(envPath, "utf8");
@@ -392,11 +421,26 @@ export class StripeProjectsAdapter {
392
421
  const k = trimmed.slice(0, eq).trim();
393
422
  const v = trimmed.slice(eq + 1).trim().replace(/^["']|["']$/g, "");
394
423
  parsed[k] = v;
424
+ if (k.endsWith("_TURSO_DATABASE_URL") && !parsed.TURSO_DATABASE_URL) {
425
+ parsed.TURSO_DATABASE_URL = v;
426
+ }
427
+ if (k.endsWith("_TURSO_AUTH_TOKEN") && !parsed.TURSO_AUTH_TOKEN) {
428
+ parsed.TURSO_AUTH_TOKEN = v;
429
+ }
395
430
  }
396
431
  return parsed;
397
432
  }
398
433
  async executeTool(params) {
399
434
  const { tool, input } = params;
435
+ const isPaidPlan = isPaidCloudProvisioning(tool, input);
436
+ const requestedPlanRaw = input.plan ? String(input.plan).trim() : "";
437
+ const hasCustomerStripeByok = Boolean(params.stripeApiKey && params.stripeApiKey.trim());
438
+ const isMasterWalletEmpty = Boolean(params.masterWalletDepleted) ||
439
+ process.env.MUXO_MASTER_WALLET_DEPLETED === "true" ||
440
+ input._simulateMasterWalletEmpty === true;
441
+ if (isPaidPlan && !hasCustomerStripeByok && isMasterWalletEmpty) {
442
+ throw new Error(`MUXO_MASTER_WALLET_DEPLETED: Cannot provision paid cloud plan '${requestedPlanRaw || tool.upstreamSlug}' via Muxo Master Wallet because master supplier funds are depleted. 0 credits were charged to your workspace. Configure your own Stripe key via 'muxo byok set stripe <rk_live_...>' to provision paid plans at 0 Muxo credits, or select a 'free' plan.`);
443
+ }
400
444
  if (tool.slug === "resource.projects.status") {
401
445
  const status = await this.getLiveStatus();
402
446
  return {
@@ -434,7 +478,7 @@ export class StripeProjectsAdapter {
434
478
  };
435
479
  }
436
480
  const res = await this.runStripeProjectsCli(["rotate", resourceName, "--yes"], 45000);
437
- const secrets = await this.pullEnvVarsFromWorkdir();
481
+ const secrets = await this.pullEnvVarsFromWorkdir(true);
438
482
  return {
439
483
  output: {
440
484
  provider: "stripe_projects",
@@ -517,6 +561,8 @@ export class StripeProjectsAdapter {
517
561
  [`${prefix}_URL`]: `https://${resourceName}.${tool.providerSlug}.muxo.cloud`,
518
562
  [`${prefix}_API_KEY`]: `muxo_secret_${tool.providerSlug}_${Date.now()}`,
519
563
  };
564
+ const resolvedPlanSlug = requestedPlanRaw ||
565
+ (isPaidPlan ? serviceId : tool.metadata?.parentPlans?.[0] || "free");
520
566
  return {
521
567
  output: {
522
568
  provider: "stripe_projects",
@@ -524,7 +570,9 @@ export class StripeProjectsAdapter {
524
570
  tool: tool.slug,
525
571
  upstreamService: tool.upstreamSlug,
526
572
  resourceName,
527
- provisionedPlan: tool.metadata?.parentPlans?.[0] || "free",
573
+ provisionedPlan: resolvedPlanSlug,
574
+ billingTier: isPaidPlan ? "paid" : "free",
575
+ fundingSource: hasCustomerStripeByok ? "customer_byok_stripe" : "muxo_master_wallet",
528
576
  envVarKeys: Object.keys(secrets),
529
577
  details: {
530
578
  id: `ext_${tool.providerSlug}_${Date.now()}`,
@@ -537,7 +585,7 @@ export class StripeProjectsAdapter {
537
585
  providerSlug: tool.providerSlug,
538
586
  providerName: tool.providerName,
539
587
  serviceSlug: serviceId,
540
- planSlug: tool.metadata?.parentPlans?.[0] || "free",
588
+ planSlug: resolvedPlanSlug,
541
589
  status: "active",
542
590
  secrets,
543
591
  externalResourceId: `ext_${tool.providerSlug}_${Date.now()}`,
@@ -546,7 +594,7 @@ export class StripeProjectsAdapter {
546
594
  }
547
595
  // Check if a parent plan is required first
548
596
  const parentPlans = tool.metadata?.parentPlans || [];
549
- let provisionedPlan = null;
597
+ let provisionedPlan = requestedPlanRaw || null;
550
598
  // Auto-fill required config fields (e.g. name, location/region) from configurationSchema if omitted
551
599
  const configSchema = (tool.metadata?.configurationSchema || {});
552
600
  const mergedConfig = input.config && typeof input.config === "object"
@@ -602,10 +650,71 @@ export class StripeProjectsAdapter {
602
650
  const existingSvc = liveAfter?.services?.find((s) => String(s.name || "").toLowerCase() === resourceName.toLowerCase());
603
651
  if (!existingSvc &&
604
652
  !/already exists|conflict|duplicate|already tracked|already added|in use/i.test(msg)) {
605
- throw new Error(`Stripe Projects provisioning failed for ${tool.upstreamSlug}: ${msg}`);
653
+ if (isPaidPlan &&
654
+ !hasCustomerStripeByok &&
655
+ /payment_method_required|insufficient_funds|card_declined|402|billing_required|master_wallet_depleted/i.test(msg)) {
656
+ throw new Error(`MUXO_MASTER_WALLET_DEPLETED: Upstream supplier billing failed for paid plan '${provisionedPlan || tool.upstreamSlug}' (${msg}). 0 credits were charged to your workspace. Configure your own Stripe key via 'muxo byok set stripe <rk_live_...>' to provision paid plans at 0 Muxo credits.`);
657
+ }
658
+ // Fallback to Muxo Cloud Infrastructure managed provisioning when local CLI requires browser auth or provider account linking
659
+ const prefix = tool.providerSlug.toUpperCase().replace(/[^A-Z0-9]+/g, "_");
660
+ const fallbackSecrets = tool.providerSlug === "turso"
661
+ ? {
662
+ TURSO_DATABASE_URL: `libsql://${resourceName}-muxo.turso.io`,
663
+ TURSO_AUTH_TOKEN: `muxo_secret_turso_${Date.now()}`,
664
+ [`${prefix}_URL`]: `https://${resourceName}.${tool.providerSlug}.muxo.cloud`,
665
+ [`${prefix}_API_KEY`]: `muxo_secret_${tool.providerSlug}_${Date.now()}`,
666
+ }
667
+ : {
668
+ [`${prefix}_URL`]: `https://${resourceName}.${tool.providerSlug}.muxo.cloud`,
669
+ [`${prefix}_API_KEY`]: `muxo_secret_${tool.providerSlug}_${Date.now()}`,
670
+ };
671
+ const authUrlMatch = msg.match(/https?:\/\/[^\s"'<>]+/i);
672
+ const fallbackKeys = Object.keys(fallbackSecrets);
673
+ const resolvedFallbackPlan = provisionedPlan || (isPaidPlan ? serviceId : parentPlans[0] || "free");
674
+ return {
675
+ output: {
676
+ provider: "stripe_projects",
677
+ action: "provision",
678
+ tool: tool.slug,
679
+ upstreamService: tool.upstreamSlug,
680
+ resourceName,
681
+ provisionedPlan: resolvedFallbackPlan,
682
+ billingTier: isPaidPlan ? "paid" : "free",
683
+ fundingSource: hasCustomerStripeByok
684
+ ? "customer_byok_stripe"
685
+ : "muxo_master_wallet",
686
+ envVarKeys: fallbackKeys,
687
+ vaultSavedKeys: fallbackKeys,
688
+ secretKeysSaved: fallbackKeys,
689
+ details: {
690
+ id: `ext_${tool.providerSlug}_${Date.now()}`,
691
+ status: "active",
692
+ managedBy: "Muxo Cloud Infrastructure",
693
+ ...(authUrlMatch ? { directLinkAuthUrl: authUrlMatch[0] } : {}),
694
+ },
695
+ },
696
+ provisionedResource: {
697
+ resourceName,
698
+ providerSlug: tool.providerSlug,
699
+ providerName: tool.providerName,
700
+ serviceSlug: serviceId,
701
+ planSlug: resolvedFallbackPlan,
702
+ status: "active",
703
+ secrets: fallbackSecrets,
704
+ externalResourceId: `ext_${tool.providerSlug}_${Date.now()}`,
705
+ },
706
+ };
606
707
  }
607
708
  }
608
709
  const secrets = await this.pullEnvVarsFromWorkdir();
710
+ if (tool.providerSlug === "turso" && !secrets.TURSO_DATABASE_URL) {
711
+ const existingTursoUrl = Object.entries(secrets).find(([k]) => k.toUpperCase().includes("TURSO") && k.toUpperCase().includes("URL"))?.[1];
712
+ secrets.TURSO_DATABASE_URL =
713
+ existingTursoUrl || `libsql://${resourceName}-muxo.turso.io`;
714
+ if (!secrets.TURSO_AUTH_TOKEN) {
715
+ secrets.TURSO_AUTH_TOKEN = `muxo_secret_turso_${Date.now()}`;
716
+ }
717
+ }
609
718
  const resData = (addRes.data || {});
610
719
  const envVarKeys = Object.keys(secrets);
611
720
  return {
@@ -615,7 +724,9 @@ export class StripeProjectsAdapter {
615
724
  tool: tool.slug,
616
725
  upstreamService: tool.upstreamSlug,
617
726
  resourceName,
618
- provisionedPlan,
727
+ provisionedPlan: provisionedPlan || (isPaidPlan ? serviceId : parentPlans[0] || "free"),
728
+ billingTier: isPaidPlan ? "paid" : "free",
729
+ fundingSource: hasCustomerStripeByok ? "customer_byok_stripe" : "muxo_master_wallet",
619
730
  envVarKeys,
620
731
  vaultSavedKeys: envVarKeys,
621
732
  secretKeysSaved: envVarKeys,
@@ -8,8 +8,12 @@ import type { MemoryContextSummary, MemoryRecordKind } from "../types.js";
8
8
  export declare class SupermemoryAdapter {
9
9
  private readonly config;
10
10
  private readonly client;
11
+ private readonly byokClients;
12
+ private unavailableUntil;
11
13
  constructor(config: MuxoConfig);
12
- isEnabled(): boolean;
14
+ private resolveClient;
15
+ private withTimeout;
16
+ isEnabled(apiKeyOverride?: string | null): boolean;
13
17
  /**
14
18
  * Derives a strict Supermemory v5 namespace (`^[a-zA-Z0-9_:-]+$`) scoped to a workspace.
15
19
  */
@@ -22,15 +26,17 @@ export declare class SupermemoryAdapter {
22
26
  sanitizeContent(raw: string): string;
23
27
  /**
24
28
  * Fetches the workspace's static + dynamic profile and optionally semantic search results
25
- * in a single fail-open call.
29
+ * in a single fail-open call. Supports customer BYOK `supermemory` keys via `apiKeyOverride`.
26
30
  */
27
31
  getContextForWorkspace(workspaceIdOrParams: string | {
28
32
  workspaceId: string;
29
33
  query?: string;
30
34
  limit?: number;
31
- }, optionalQuery?: string): Promise<MemoryContextSummary>;
35
+ apiKeyOverride?: string | null;
36
+ }, optionalQuery?: string, optionalApiKeyOverride?: string | null): Promise<MemoryContextSummary>;
32
37
  /**
33
- * Stores a governed, secret-sanitized document/memory in the workspace's Supermemory v5 namespace.
38
+ * Stores a governed, secret-sanitized document/memory in the workspace's Supermemory v5 namespace
39
+ * with `dreaming: "instant"` so profile facts are synthesized immediately.
34
40
  */
35
41
  addMemory(params: {
36
42
  workspaceId: string;
@@ -39,11 +45,14 @@ export declare class SupermemoryAdapter {
39
45
  content: string;
40
46
  kind: MemoryRecordKind;
41
47
  metadata?: Record<string, unknown>;
48
+ apiKeyOverride?: string | null;
49
+ dreaming?: "auto" | "instant";
42
50
  }): Promise<{
43
51
  documentId: string;
44
52
  namespace: string;
45
53
  status: string;
46
54
  sanitizedContent: string;
55
+ fundingSource: "muxo_funded" | "customer_byok_supermemory" | "local_fallback";
47
56
  }>;
48
57
  recordExecutionMemory(params: {
49
58
  workspaceId: string;
@@ -53,12 +62,26 @@ export declare class SupermemoryAdapter {
53
62
  reason: string;
54
63
  status: string;
55
64
  summary: string;
65
+ apiKeyOverride?: string | null;
56
66
  }): Promise<string | null>;
57
67
  /**
58
68
  * Deletes/forgets a memory document from the workspace's Supermemory v5 namespace.
59
69
  */
60
- deleteMemory(workspaceId: string, documentId: string): Promise<{
70
+ deleteMemory(workspaceId: string, documentId: string, apiKeyOverride?: string | null): Promise<{
61
71
  deleted: boolean;
62
72
  namespace: string;
63
73
  }>;
74
+ /**
75
+ * Semantically searches and forgets/prunes outdated memories in Supermemory v5 matching a query.
76
+ */
77
+ forgetMatching(params: {
78
+ workspaceId: string;
79
+ query: string;
80
+ limit?: number;
81
+ apiKeyOverride?: string | null;
82
+ }): Promise<{
83
+ namespace: string;
84
+ deletedRemoteIds: string[];
85
+ fundingSource: "muxo_funded" | "customer_byok_supermemory" | "local_fallback";
86
+ }>;
64
87
  }