@muxoai/sdk 1.4.2 → 1.4.4

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 (40) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude-plugin/marketplace.json +2 -2
  3. package/README.md +15 -1
  4. package/dist/cli.js +217 -0
  5. package/dist/composio-catalog.d.ts +25 -0
  6. package/dist/composio-catalog.js +145 -0
  7. package/dist/config.d.ts +1 -0
  8. package/dist/config.js +1 -0
  9. package/dist/durable-workflow.d.ts +71 -4
  10. package/dist/durable-workflow.js +199 -5
  11. package/dist/engine.d.ts +110 -4
  12. package/dist/engine.js +603 -24
  13. package/dist/index.d.ts +3 -0
  14. package/dist/index.js +3 -0
  15. package/dist/mcp-schema.d.ts +14 -0
  16. package/dist/mcp-schema.js +85 -7
  17. package/dist/mcp.js +325 -5
  18. package/dist/memory-graph.d.ts +26 -2
  19. package/dist/memory-graph.js +127 -7
  20. package/dist/oss-suite.d.ts +401 -0
  21. package/dist/oss-suite.js +2065 -0
  22. package/dist/policy.js +59 -0
  23. package/dist/providers/composio-instant.js +54 -36
  24. package/dist/providers/composio-sdk.d.ts +10 -1
  25. package/dist/providers/composio-sdk.js +144 -31
  26. package/dist/sdk.d.ts +43 -1
  27. package/dist/sdk.js +85 -2
  28. package/dist/server.js +231 -3
  29. package/dist/skills-catalog.d.ts +66 -0
  30. package/dist/skills-catalog.js +801 -0
  31. package/dist/types.d.ts +51 -1
  32. package/dist/ui/console-html.js +23 -8
  33. package/dist/version.d.ts +1 -1
  34. package/dist/version.js +1 -1
  35. package/package.json +1 -1
  36. package/plugins/muxo/.claude-plugin/plugin.json +1 -1
  37. package/plugins/muxo/.codex-plugin/plugin.json +2 -2
  38. package/plugins/muxo/.cursor-plugin/plugin.json +1 -1
  39. package/plugins/muxo/plugin.json +2 -2
  40. package/plugins/muxo/skills/muxo/SKILL.md +13 -3
package/dist/types.d.ts CHANGED
@@ -316,6 +316,9 @@ export interface TemporalGraphFact {
316
316
  confidence: number;
317
317
  validFrom: string;
318
318
  validTo: string | null;
319
+ transactionFrom?: string;
320
+ transactionTo?: string | null;
321
+ episodeId?: string | null;
319
322
  supersededById?: string | null;
320
323
  sourceKind: MemoryRecordKind | "system" | "manual";
321
324
  sourceReferenceId?: string | null;
@@ -324,10 +327,11 @@ export interface TemporalGraphFact {
324
327
  }
325
328
  export interface MemoryGraphNode {
326
329
  id: string;
327
- kind: "workspace" | "entity" | "preference" | "guardrail" | "connection" | "resource" | "tool" | "memory";
330
+ kind: "workspace" | "entity" | "preference" | "guardrail" | "connection" | "resource" | "tool" | "memory" | "episode";
328
331
  label: string;
329
332
  summary: string;
330
333
  status: "active" | "historical";
334
+ hopDistance?: number;
331
335
  metadata?: Record<string, unknown>;
332
336
  }
333
337
  export interface MemoryGraphEdge {
@@ -342,6 +346,9 @@ export interface MemoryGraphEdge {
342
346
  status: "active" | "historical";
343
347
  validFrom: string;
344
348
  validTo: string | null;
349
+ transactionFrom?: string;
350
+ transactionTo?: string | null;
351
+ episodeId?: string | null;
345
352
  supersededById: string | null;
346
353
  sourceKind: TemporalGraphFact["sourceKind"];
347
354
  sourceReferenceId: string | null;
@@ -351,11 +358,21 @@ export interface MemoryKnowledgeGraph {
351
358
  workspaceSlug: string;
352
359
  namespace: string;
353
360
  generatedAt: string;
361
+ asOf?: string | null;
362
+ focalEntity?: string | null;
363
+ maxHops?: number;
354
364
  query: string | null;
355
365
  nodes: MemoryGraphNode[];
356
366
  edges: MemoryGraphEdge[];
357
367
  activeEdges: MemoryGraphEdge[];
358
368
  historicalEdges: MemoryGraphEdge[];
369
+ subgraph?: {
370
+ focalEntity: string;
371
+ maxHops: number;
372
+ nodes: MemoryGraphNode[];
373
+ edges: MemoryGraphEdge[];
374
+ hopDistances: Record<string, number>;
375
+ } | null;
359
376
  stats: {
360
377
  nodesCount: number;
361
378
  activeEdgesCount: number;
@@ -363,6 +380,7 @@ export interface MemoryKnowledgeGraph {
363
380
  memoriesCount: number;
364
381
  resourcesCount: number;
365
382
  connectionsCount: number;
383
+ episodesCount?: number;
366
384
  };
367
385
  mermaid: string;
368
386
  explanation: HumanFriendlyExplanation;
@@ -423,6 +441,7 @@ export interface ByokKeyRecord {
423
441
  category: "llm" | "supplier";
424
442
  envVarName: string;
425
443
  keyPreview: string;
444
+ mcpGatewayUrl?: string | null;
426
445
  configured: boolean;
427
446
  updatedAt: string;
428
447
  }
@@ -481,6 +500,29 @@ export interface HumanHandoffDescriptor {
481
500
  oauthRedirectUrl: string | null;
482
501
  consoleUrl: string;
483
502
  }
503
+ export interface ApprovalImpactPreview {
504
+ whatChanges: string;
505
+ whoIsAffected: string;
506
+ targetEntity: string;
507
+ estimatedCostUsd: number;
508
+ creditCost: number;
509
+ fundingMode: "muxo_funded" | "byok";
510
+ costDisplay: string;
511
+ triggeredRule: string;
512
+ reversibility: "reversible" | "compensatable_saga" | "irreversible";
513
+ recoveryBehavior: string;
514
+ }
515
+ export interface BusinessReceiptSummary {
516
+ whatChanged: string;
517
+ whoAuthorized: string;
518
+ whatSucceeded: string;
519
+ whatRemainsUnresolved: string[];
520
+ costUsd: number;
521
+ creditsCharged: number;
522
+ fundingMode: "muxo_funded" | "byok";
523
+ costDisplay: string;
524
+ reconciliationStatus: "verified_complete" | "failed_zero_charge" | "cancelled" | "needs_reconciliation";
525
+ }
484
526
  export interface ActionPlan {
485
527
  id: string;
486
528
  workspaceId: string;
@@ -492,6 +534,9 @@ export interface ActionPlan {
492
534
  input: Record<string, unknown>;
493
535
  reason: string;
494
536
  creditCost: number;
537
+ estimatedCostUsd?: number;
538
+ changePreview?: ApprovalImpactPreview;
539
+ idempotencyKey?: string;
495
540
  approvalStatus: "auto_approved" | "pending_approval" | "approved" | "rejected" | "executed";
496
541
  approvedBy: string | null;
497
542
  approvedAt: string | null;
@@ -530,6 +575,9 @@ export interface ExecutionRun {
530
575
  errorMessage?: string | null;
531
576
  actionsMetered: number;
532
577
  creditsMetered: number;
578
+ estimatedCostUsd?: number;
579
+ idempotentReplay?: boolean;
580
+ reconciliationStatus?: "verified_complete" | "failed_zero_charge" | "cancelled" | "needs_reconciliation";
533
581
  durationMs: number | null;
534
582
  receiptId: string | null;
535
583
  startedAt: string;
@@ -568,6 +616,8 @@ export interface ExecutionReceipt {
568
616
  status: "succeeded" | "failed" | "cancelled";
569
617
  actionsMetered: number;
570
618
  creditsMetered: number;
619
+ estimatedCostUsd?: number;
620
+ businessSummary?: BusinessReceiptSummary;
571
621
  inputHash: string;
572
622
  outputHash: string;
573
623
  prevReceiptHash: string;
@@ -2753,7 +2753,7 @@ export function renderConsoleHtml() {
2753
2753
  <option value="anthropic">Anthropic (plain-English routing)</option>
2754
2754
  <option value="openrouter">OpenRouter (plain-English routing)</option>
2755
2755
  <option value="gemini">Google Gemini (plain-English routing)</option>
2756
- <option value="composio">Apps and instant tools (0 credits)</option>
2756
+ <option value="composio">Apps, MCP Gateway &amp; instant tools (0 credits)</option>
2757
2757
  <option value="stripe">Cloud infrastructure (0 credits)</option>
2758
2758
  <option value="supermemory">Workspace memory</option>
2759
2759
  <option value="firecrawl">Firecrawl (scrape and crawl)</option>
@@ -3312,17 +3312,17 @@ export function renderOAuthConsentHtml(opts) {
3312
3312
  </html>`;
3313
3313
  }
3314
3314
  const approvalCss = `
3315
- .approval-facts{display:grid;gap:8px;margin:18px 0 0;padding:0;list-style:none;text-align:left;font-size:14px}
3316
- .approval-facts li{display:flex;justify-content:space-between;gap:14px;padding:9px 12px;border:1px solid var(--color-border);border-radius:10px;background:var(--color-bg)}
3315
+ .approval-facts{display:grid;gap:6px;margin:12px 0 0;padding:0;list-style:none;text-align:left;font-size:13px}
3316
+ .approval-facts li{display:flex;justify-content:space-between;gap:12px;padding:6px 10px;border:1px solid var(--color-border);border-radius:8px;background:var(--color-bg)}
3317
3317
  .approval-facts .k{color:var(--color-muted);flex:none}
3318
3318
  .approval-facts .v{color:var(--color-text);font-weight:500;text-align:right;overflow-wrap:anywhere}
3319
- .approval-input{margin:14px 0 0;padding:12px;border:1px solid var(--color-border);border-radius:10px;background:var(--color-bg);font-family:var(--font-mono);font-size:12px;text-align:left;white-space:pre-wrap;overflow-wrap:anywhere;max-height:180px;overflow:auto}
3319
+ .approval-input{margin:10px 0 0;padding:10px;border:1px solid var(--color-border);border-radius:8px;background:var(--color-bg);font-family:var(--font-mono);font-size:12px;text-align:left;white-space:pre-wrap;overflow-wrap:anywhere;max-height:110px;overflow:auto}
3320
3320
  .approval-risk{display:inline-block;border-radius:999px;padding:3px 10px;font-size:12px;font-weight:600;text-transform:capitalize}
3321
3321
  .approval-risk[data-tone="ok"]{background:var(--color-ok-bg);color:var(--color-ok)}
3322
3322
  .approval-risk[data-tone="warn"]{background:var(--color-warn-bg);color:var(--color-warn)}
3323
3323
  .approval-risk[data-tone="strict"]{background:var(--color-danger-bg);color:var(--color-danger)}
3324
- .approval-note{margin-top:14px;color:var(--color-muted);font-size:13px}
3325
- .approval-done{margin-top:18px;text-align:left;font-size:14px}
3324
+ .approval-note{margin-top:10px;color:var(--color-muted);font-size:13px}
3325
+ .approval-done{margin-top:14px;text-align:left;font-size:14px}
3326
3326
  `;
3327
3327
  const approvalScript = String.raw `
3328
3328
  (function () {
@@ -3356,10 +3356,17 @@ const approvalScript = String.raw `
3356
3356
  function renderPlan() {
3357
3357
  show('approval-loading', false);
3358
3358
  show('approval-review', true);
3359
+ var preview = plan.changePreview || {};
3360
+ var credits = plan.creditCost != null ? plan.creditCost : 0;
3361
+ var usd = plan.estimatedCostUsd != null ? Number(plan.estimatedCostUsd).toFixed(2) : (credits * 0.01).toFixed(2);
3359
3362
  byId('approval-tool').textContent = plan.toolSlug || '';
3360
3363
  byId('approval-risk').textContent = plan.riskLevel + ' risk';
3361
3364
  byId('approval-risk').setAttribute('data-tone', riskTone(plan.riskLevel));
3362
- byId('approval-cost').textContent = String(plan.creditCost != null ? plan.creditCost : 0) + ' credits';
3365
+ byId('approval-what-changes').textContent = preview.whatChanges || plan.reason || ('Execute ' + (plan.toolSlug || 'action'));
3366
+ byId('approval-affected').textContent = preview.whoIsAffected || preview.targetEntity || 'Workspace integration';
3367
+ byId('approval-cost').textContent = preview.costDisplay || ('$' + usd + ' USD (' + credits + ' credits)');
3368
+ byId('approval-rule').textContent = preview.triggeredRule || (plan.decisionRecord && plan.decisionRecord.matchedRule) || 'Workspace approval policy';
3369
+ byId('approval-recovery').textContent = preview.recoveryBehavior || 'Execute-once idempotency; 0 credits charged on failure.';
3363
3370
  byId('approval-reason').textContent = plan.reason || '—';
3364
3371
  byId('approval-input').textContent = JSON.stringify(plan.input || {}, null, 2);
3365
3372
  var already = plan.approvalStatus === 'approved' || plan.approvalStatus === 'auto_approved';
@@ -3377,7 +3384,11 @@ const approvalScript = String.raw `
3377
3384
  show('approval-done', true);
3378
3385
  var html = '<p>' + esc(message) + '</p>';
3379
3386
  if (result && result.run) {
3387
+ var bs = (result.receipt && result.receipt.businessSummary) || {};
3380
3388
  html += '<ul class="approval-facts">'
3389
+ + (bs.whatChanged ? '<li><span class="k">What changed</span><span class="v">' + esc(bs.whatChanged) + '</span></li>' : '')
3390
+ + (bs.whoAuthorized ? '<li><span class="k">Authorized by</span><span class="v">' + esc(bs.whoAuthorized) + '</span></li>' : '')
3391
+ + (bs.costDisplay ? '<li><span class="k">Cost</span><span class="v">' + esc(bs.costDisplay) + '</span></li>' : '')
3381
3392
  + '<li><span class="k">Run</span><span class="v">' + esc(result.run.id) + ' · ' + esc(result.run.status) + '</span></li>'
3382
3393
  + (result.receipt ? '<li><span class="k">Receipt</span><span class="v">' + esc(result.receipt.id) + '</span></li>' : '')
3383
3394
  + '</ul>';
@@ -3542,8 +3553,12 @@ export function renderApprovalPageHtml(opts) {
3542
3553
  <div id="approval-review" hidden>
3543
3554
  <ul class="approval-facts">
3544
3555
  <li><span class="k">Action</span><span class="v" id="approval-tool"></span></li>
3556
+ <li><span class="k">What changes</span><span class="v" id="approval-what-changes"></span></li>
3557
+ <li><span class="k">Who is affected</span><span class="v" id="approval-affected"></span></li>
3545
3558
  <li><span class="k">Risk</span><span class="v"><span id="approval-risk" class="approval-risk" data-tone="warn"></span></span></li>
3546
- <li><span class="k">Cost</span><span class="v" id="approval-cost"></span></li>
3559
+ <li><span class="k">Estimated cost</span><span class="v" id="approval-cost"></span></li>
3560
+ <li><span class="k">Triggered rule</span><span class="v" id="approval-rule"></span></li>
3561
+ <li><span class="k">Recovery &amp; safety</span><span class="v" id="approval-recovery"></span></li>
3547
3562
  <li><span class="k">Reason</span><span class="v" id="approval-reason"></span></li>
3548
3563
  </ul>
3549
3564
  <pre id="approval-input" class="approval-input" aria-label="Tool input"></pre>
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const MUXO_VERSION = "1.4.2";
1
+ export declare const MUXO_VERSION = "1.4.4";
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const MUXO_VERSION = "1.4.2";
1
+ export const MUXO_VERSION = "1.4.4";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@muxoai/sdk",
3
- "version": "1.4.2",
3
+ "version": "1.4.4",
4
4
  "description": "Muxo — Unified Execution, Provisioning & Governance Platform over Composio, Stripe Projects, Microsoft Agent Governance & Supermemory",
5
5
  "private": false,
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "muxo",
3
- "version": "1.4.2",
3
+ "version": "1.4.4",
4
4
  "description": "Governed agent execution across 1,000+ Connected Apps (managed OAuth handoff), Instant Tools (search, scrape, crawl, SEO audit), live Cloud Infrastructure provisioning, Workspace Memory recall, and verifiable audit records.",
5
5
  "author": {
6
6
  "name": "Muxo AI LLC",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "muxo",
3
- "version": "1.4.2",
3
+ "version": "1.4.4",
4
4
  "description": "Your agent decides what to do — Muxo governs, provisions, remembers, and executes it. Unified access to 1,000+ Connected Apps (managed OAuth handoff), Instant Tools (search, scrape, crawl, SEO audit), live Cloud Infrastructure provisioning (Postgres, Redis, SQLite, Storage), Workspace Memory recall, and verifiable audit records.",
5
5
  "author": {
6
6
  "name": "Muxo AI LLC",
@@ -33,7 +33,7 @@
33
33
  "com.openai": {
34
34
  "onboardingSkill": "./skills/setup/SKILL.md",
35
35
  "publication": {
36
- "release_notes": "Muxo v1.4.2: Unified governed execution across 1,000+ Connected Apps, Instant web/SEO tools, 94 Stripe Projects Cloud Infrastructure services, MCP 2026-07-28 compliance, and Workspace Memory."
36
+ "release_notes": "Muxo v1.4.4: Unified governed execution across 1,000+ Connected Apps, Instant web/SEO tools, 94 Stripe Projects Cloud Infrastructure services, MCP 2026-07-28 compliance, and Workspace Memory."
37
37
  }
38
38
  }
39
39
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "muxo",
3
3
  "description": "Your agent decides what to do — Muxo governs, provisions, remembers, and executes it. Connect and operate 1,000+ external apps via managed OAuth, zero-auth Instant Tools (web search, scrape, crawl, SEO audit, remote workbench), live Cloud Infrastructure provisioning (Stripe Projects), and Workspace Memory from Cursor.",
4
- "version": "1.4.2",
4
+ "version": "1.4.4",
5
5
  "mcpServers": "../mcp.json",
6
6
  "skills": "../skills/",
7
7
  "author": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "muxo",
4
- "version": "1.4.2",
4
+ "version": "1.4.4",
5
5
  "description": "Your agent decides what to do — Muxo governs, provisions, remembers, and executes it. Unified access to 1,000+ Connected Apps (managed OAuth handoff), Instant Tools (search, scrape, crawl, SEO audit), live Cloud Infrastructure provisioning (Postgres, Redis, SQLite, Storage), Workspace Memory recall, and verifiable audit records.",
6
6
  "author": {
7
7
  "name": "Muxo AI LLC",
@@ -109,7 +109,7 @@
109
109
  "commerce_description": "This plugin does not sell retail products or process consumer checkout inside ChatGPT."
110
110
  },
111
111
  "publication": {
112
- "release_notes": "Muxo v1.4.2: Unified governed execution across 1,000+ Connected Apps, Instant web/SEO tools, 94 Stripe Projects Cloud Infrastructure services, MCP 2026-07-28 compliance, and Workspace Memory."
112
+ "release_notes": "Muxo v1.4.4: Unified governed execution across 1,000+ Connected Apps, Instant web/SEO tools, 94 Stripe Projects Cloud Infrastructure services, MCP 2026-07-28 compliance, and Workspace Memory."
113
113
  }
114
114
  }
115
115
  }
@@ -138,9 +138,19 @@ Users can operate every Muxo pillar in plain English through `POST /api/v1/do` (
138
138
 
139
139
  ### Context, MCP Resources & Prompts
140
140
  - **Inspect**: "Show my workspace context", "Explain current run context", or call `get_run_context({ query: "..." })` — returns credits, learned defaults, active guardrails, `llmPolicyBrief`, provisioned resources, and a ready-to-use `llmSystemPrompt` block.
141
- - **MCP Resources (`resources/read`)**: `muxo://policy/brief`, `muxo://governance/policy`, `muxo://context`, `muxo://memory/graph`.
142
- - **MCP Prompts (`prompts/get`)**: `context`, `policy_guardrails` (accepts optional `tool_slug`), `governed_execution`, `security_audit`.
143
- - REST equivalent: `GET/POST /api/v1/context`.
141
+ - **Plain-English OSS & Commercial Intent Router on `get_run_context` & `POST /api/v1/do`**: Pass any plain-English prompt to `get_run_context({ prompt: "..." })` or `POST /api/v1/do` (`{"prompt": "..."}`) without memorizing sub-action enums, workflow IDs, or playbook slugs:
142
+ - **Turnkey & Custom Saga Playbooks**: `"Run the fullstack cloud bootstrap playbook"`, `"List playbooks"`, or `"Create playbook daily-seo-slack that runs instant.seo.audit and app.slack.send_message"` (`POST /api/v1/playbooks`, `POST /api/v1/playbooks/:slug/run`).
143
+ - **Temporal Workflow Saga Rollback, Signals & History (`"latest"` supported)**: `"Rollback the latest workflow because staging healthcheck failed"`, `"Signal workflow latest human.approval.granted"`, `"Show Temporal history for latest workflow"` (`POST /api/v1/workflows/latest/rollback`, `/signal`, `/history`).
144
+ - **Graphiti Time-Travel & Multi-Hop BFS Memory Graph**: `"Show my knowledge graph as of 2026-10-20T00:00:00Z within 2 hops of workspace"` (`GET /api/v1/memory/graph?as_of=...&focal_entity=...&max_hops=2`).
145
+ - **AWS Cedar 4.0 & OPA Rego v1 Policy-as-Code**: `"Compile our guardrails to AWS Cedar"` or `"Evaluate Cedar policy for resource.turso.database with DROP TABLE users"` (`GET /api/v1/governance/cedar`, `POST /api/v1/governance/cedar/evaluate`).
146
+ - **OpenTelemetry GenAI 1.29.0 & Langfuse Traces**: `"Export OpenTelemetry traces and Langfuse batch"` (`GET /api/v1/telemetry/otlp`).
147
+ - **FinOps & Commercial Engineering ROI**: `"What is our ROI and how many engineering hours have we saved?"` (`GET /api/v1/analytics/roi`).
148
+ - **One-Shot Agent Harness Configurator & Presets**: `"Configure harness preset strict-production and only allow emails to @muxo.ai"` (`GET/POST /api/v1/harness/configure`, `get_run_context({ action: "configure_harness", preset: "strict-production", harness: "claude_code" })`).
149
+ - **MCP Resources (`resources/read`)**: `muxo://policy/brief`, `muxo://governance/policy`, `muxo://context`, `muxo://memory/graph`, `muxo://harness/config`, `muxo://playbooks`, `muxo://skills`, `muxo://skills/{skillSlug}`.
150
+ - **MCP Prompts (`prompts/get`)**: `context`, `policy_guardrails` (accepts optional `tool_slug`), `governed_execution`, `security_audit`, `harness_setup`, `commercial_playbook`.
151
+ - **Governed Domain & Workflow Skills Catalog (`muxo://skills/{skillSlug}`)**:
152
+ - Read domain playbooks & parameter pitfalls via MCP (`resources/read` on `muxo://skills/github-automation`, `muxo://skills/supabase-provisioning`, `muxo://skills/changelog-generator`, or `skills/get` on `skill://muxo/<slug>/SKILL.md`), REST (`GET /api/v1/skills`, `GET /api/v1/skills/:slug`, `GET /skills/:slug/SKILL.md`), or CLI (`muxo skills list`, `muxo skills show <slug>`, `muxo skills install <slug> --all-curated`).
153
+ - REST equivalent: `GET/POST /api/v1/context`, `GET/POST /api/v1/harness/configure`, `GET/POST /api/v1/playbooks`, `GET /api/v1/skills`.
144
154
 
145
155
  ### Receipts
146
156
  - **Explain / verify**: "Explain my latest receipt", "Verify receipt rcpt_...", "Show recent receipts" — returns the tamper-proof receipt with signature status and a plain-English explanation of action, cost, and funding mode.