@runtypelabs/cli 2.33.3 → 2.33.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 (2) hide show
  1. package/dist/index.js +485 -469
  2. package/package.json +5 -5
package/dist/index.js CHANGED
@@ -15351,7 +15351,7 @@ var recordCollectionSchemaSchema = external_exports.strictObject({
15351
15351
  additionalProperties: external_exports.boolean().optional()
15352
15352
  }).superRefine((schema, ctx) => addSemanticIssues(schema, ctx));
15353
15353
 
15354
- // ../shared/dist/chunk-XIYL3SKH.mjs
15354
+ // ../shared/dist/chunk-M7MDPQ5F.mjs
15355
15355
  var MCPServerCategory = {
15356
15356
  COMMUNICATION: "communication",
15357
15357
  PRODUCTIVITY: "productivity",
@@ -15600,6 +15600,449 @@ function separateToolIds(toolIds) {
15600
15600
  function isDataConnectionToolId(toolId) {
15601
15601
  return toolId.startsWith("dc:");
15602
15602
  }
15603
+ var SURFACE_TYPE_METADATA = {
15604
+ chat: {
15605
+ description: "Website widget, support bots, conversational interfaces. Uses Persona and can optionally accept WebMCP page tools discovered from document.modelContext.",
15606
+ useCases: [
15607
+ "customer support",
15608
+ "onboarding",
15609
+ "internal tools",
15610
+ "FAQ bots",
15611
+ "page-aware assistants"
15612
+ ],
15613
+ examples: [
15614
+ "Support chatbot",
15615
+ "Sales assistant widget",
15616
+ "Internal help desk",
15617
+ "Storefront assistant with browser-side cart/search tools"
15618
+ ],
15619
+ traits: {
15620
+ streaming: "required",
15621
+ messagesMutable: false,
15622
+ deliveryModel: "real_time",
15623
+ mediaSupport: "images",
15624
+ textMediaDelivery: "inline_html",
15625
+ interactiveUI: "generative",
15626
+ inboundMediaSupport: true,
15627
+ consumerType: "human",
15628
+ approvalAnswerable: true,
15629
+ reasoningVisibility: "pass_through",
15630
+ markdownDialect: "mdx",
15631
+ threadModel: "flat",
15632
+ senderIdentity: "anonymous",
15633
+ maxResponseLength: null,
15634
+ executionHint: null
15635
+ },
15636
+ behaviorTypeRef: "runtype://types/surface-configs"
15637
+ },
15638
+ api: {
15639
+ description: "Programmatic HTTP endpoints for backend integrations",
15640
+ useCases: ["backend automation", "third-party integrations", "data pipelines"],
15641
+ examples: ["REST API for data processing", "Webhook consumer", "Integration endpoint"],
15642
+ traits: {
15643
+ streaming: "optional",
15644
+ messagesMutable: false,
15645
+ deliveryModel: "sync",
15646
+ mediaSupport: "none",
15647
+ textMediaDelivery: "none",
15648
+ interactiveUI: "none",
15649
+ inboundMediaSupport: true,
15650
+ consumerType: "machine",
15651
+ approvalAnswerable: true,
15652
+ reasoningVisibility: "pass_through",
15653
+ markdownDialect: "none",
15654
+ threadModel: "flat",
15655
+ senderIdentity: "authenticated",
15656
+ maxResponseLength: null,
15657
+ executionHint: null
15658
+ },
15659
+ behaviorTypeRef: "runtype://types/surface-configs"
15660
+ },
15661
+ mcp: {
15662
+ description: "AI assistant integration (Cursor, Claude Code, etc.)",
15663
+ useCases: ["developer tools", "AI-powered workflows", "code assistants"],
15664
+ examples: ["Code review tool for Cursor", "Documentation assistant", "Database query tool"],
15665
+ traits: {
15666
+ streaming: "optional",
15667
+ messagesMutable: false,
15668
+ deliveryModel: "sync",
15669
+ mediaSupport: "none",
15670
+ textMediaDelivery: "none",
15671
+ interactiveUI: "none",
15672
+ inboundMediaSupport: false,
15673
+ consumerType: "agent",
15674
+ approvalAnswerable: true,
15675
+ reasoningVisibility: "pass_through",
15676
+ markdownDialect: "none",
15677
+ threadModel: "flat",
15678
+ senderIdentity: "authenticated",
15679
+ maxResponseLength: null,
15680
+ executionHint: null
15681
+ },
15682
+ behaviorTypeRef: "runtype://types/surface-configs"
15683
+ },
15684
+ email: {
15685
+ description: "Email-triggered processing and automated responses",
15686
+ useCases: ["email automation", "support ticket creation", "document processing"],
15687
+ examples: ["Auto-reply support agent", "Invoice processor", "Email-to-task converter"],
15688
+ traits: {
15689
+ streaming: "none",
15690
+ messagesMutable: false,
15691
+ deliveryModel: "async",
15692
+ // Email delivers no native attachments — the adapter ignores
15693
+ // OutboundMessage.media; images only render via inline HTML <img>.
15694
+ mediaSupport: "images",
15695
+ textMediaDelivery: "inline_html",
15696
+ interactiveUI: "none",
15697
+ inboundMediaSupport: true,
15698
+ consumerType: "human",
15699
+ approvalAnswerable: false,
15700
+ reasoningVisibility: "always_strip",
15701
+ markdownDialect: "html",
15702
+ threadModel: "reply_chain",
15703
+ senderIdentity: "verified",
15704
+ maxResponseLength: null,
15705
+ executionHint: "You are responding via email. Write in a professional, organized tone. Use clear paragraphs. Avoid bullet-point overload \u2014 prefer flowing prose where appropriate. Do not include reasoning traces, tool call narration, or internal process details in your response."
15706
+ },
15707
+ behaviorTypeRef: "runtype://types/surface-configs"
15708
+ },
15709
+ webhook: {
15710
+ description: "Event-driven processing from third-party services. Accepts JSON and form-encoded (application/x-www-form-urlencoded) payloads. Payloads are never treated as a Runtype envelope; the full parsed body is sent under `payload` in the execution message. Parsed top-level fields are also spread into flow inputs so `{{field}}` template variables resolve in prompt and api-call step bodies; optional `behavior.inputMapping` renames or deep-picks fields by dot path. Optional `behavior.response` returns a static HTTP body (e.g. empty TwiML) for providers that require specific ACK shapes \u2014 when set, the flow fires async.",
15711
+ useCases: ["event processing", "data sync", "notifications"],
15712
+ examples: [
15713
+ "Stripe payment handler",
15714
+ "GitHub event processor",
15715
+ "Twilio inbound SMS (empty TwiML ACK, no reply)",
15716
+ "Shopify order webhook (204 ACK)"
15717
+ ],
15718
+ traits: {
15719
+ streaming: "none",
15720
+ messagesMutable: false,
15721
+ deliveryModel: "sync",
15722
+ mediaSupport: "none",
15723
+ textMediaDelivery: "none",
15724
+ interactiveUI: "none",
15725
+ inboundMediaSupport: false,
15726
+ consumerType: "machine",
15727
+ approvalAnswerable: false,
15728
+ reasoningVisibility: "pass_through",
15729
+ markdownDialect: "none",
15730
+ threadModel: "flat",
15731
+ senderIdentity: "authenticated",
15732
+ maxResponseLength: null,
15733
+ executionHint: null
15734
+ },
15735
+ behaviorTypeRef: "runtype://types/surface-configs"
15736
+ },
15737
+ // @snake-case-ok: matches FPO schema surface type enum
15738
+ mcp_code: {
15739
+ description: "Code Mode MCP server for programmatic AI agent access",
15740
+ useCases: ["advanced agent integrations", "custom automation scripts"],
15741
+ examples: ["Programmatic flow executor", "Batch processing agent"],
15742
+ traits: {
15743
+ streaming: "optional",
15744
+ messagesMutable: false,
15745
+ deliveryModel: "sync",
15746
+ mediaSupport: "none",
15747
+ textMediaDelivery: "none",
15748
+ interactiveUI: "none",
15749
+ inboundMediaSupport: false,
15750
+ consumerType: "agent",
15751
+ approvalAnswerable: true,
15752
+ reasoningVisibility: "pass_through",
15753
+ markdownDialect: "none",
15754
+ threadModel: "flat",
15755
+ senderIdentity: "authenticated",
15756
+ maxResponseLength: null,
15757
+ executionHint: null
15758
+ },
15759
+ behaviorTypeRef: "runtype://types/surface-configs"
15760
+ },
15761
+ slack: {
15762
+ description: "Slack bot integration for team collaboration",
15763
+ useCases: ["team notifications", "internal tools", "workflow automation"],
15764
+ examples: ["Support bot in Slack", "Daily standup summarizer", "Alert channel manager"],
15765
+ traits: {
15766
+ streaming: "optional",
15767
+ messagesMutable: true,
15768
+ deliveryModel: "real_time",
15769
+ mediaSupport: "rich",
15770
+ textMediaDelivery: "link",
15771
+ interactiveUI: "forms",
15772
+ inboundMediaSupport: true,
15773
+ consumerType: "human",
15774
+ approvalAnswerable: false,
15775
+ reasoningVisibility: "always_strip",
15776
+ markdownDialect: "mrkdwn",
15777
+ threadModel: "threaded",
15778
+ senderIdentity: "authenticated",
15779
+ maxResponseLength: 4e3,
15780
+ executionHint: "You are responding in Slack. Be concise and direct \u2014 Slack messages should be scannable. Avoid lengthy prose. Do not include reasoning traces or tool call narration."
15781
+ },
15782
+ behaviorTypeRef: "runtype://types/surface-configs"
15783
+ },
15784
+ schedule: {
15785
+ description: "Optional management/presentation surface for scheduled jobs; executable cron or one-time triggers live in top-level schedules[] or Schedule records",
15786
+ useCases: [
15787
+ "schedule management UI",
15788
+ "scheduled report overview",
15789
+ "periodic monitoring dashboard"
15790
+ ],
15791
+ examples: [
15792
+ "Daily report schedule manager",
15793
+ "Weekly data sync overview",
15794
+ "Hourly health check monitor"
15795
+ ],
15796
+ traits: {
15797
+ streaming: "none",
15798
+ messagesMutable: false,
15799
+ deliveryModel: "async",
15800
+ mediaSupport: "none",
15801
+ textMediaDelivery: "none",
15802
+ interactiveUI: "none",
15803
+ inboundMediaSupport: false,
15804
+ consumerType: "machine",
15805
+ approvalAnswerable: false,
15806
+ reasoningVisibility: "always_strip",
15807
+ markdownDialect: "none",
15808
+ threadModel: "flat",
15809
+ senderIdentity: "authenticated",
15810
+ maxResponseLength: null,
15811
+ executionHint: null
15812
+ },
15813
+ behaviorTypeRef: "runtype://types/surface-configs"
15814
+ },
15815
+ sms: {
15816
+ description: "SMS messaging for mobile-first interactions",
15817
+ useCases: ["SMS support", "appointment reminders", "two-way texting"],
15818
+ examples: ["SMS support agent", "Appointment reminder bot", "Survey collector"],
15819
+ traits: {
15820
+ streaming: "none",
15821
+ messagesMutable: false,
15822
+ deliveryModel: "async",
15823
+ mediaSupport: "none",
15824
+ textMediaDelivery: "none",
15825
+ interactiveUI: "none",
15826
+ inboundMediaSupport: false,
15827
+ consumerType: "human",
15828
+ approvalAnswerable: false,
15829
+ reasoningVisibility: "always_strip",
15830
+ markdownDialect: "none",
15831
+ threadModel: "flat",
15832
+ senderIdentity: "verified",
15833
+ maxResponseLength: 160,
15834
+ executionHint: "You are responding via SMS. Be extremely brief \u2014 ideally one or two short sentences. Plain text only, no markdown, no lists. Get straight to the point. Do not include reasoning traces or process narration."
15835
+ }
15836
+ },
15837
+ imessage: {
15838
+ description: "iMessage messaging via Sendblue for Apple ecosystem interactions",
15839
+ useCases: ["customer support", "appointment reminders", "rich messaging", "two-way texting"],
15840
+ examples: ["iMessage support agent", "Appointment reminder bot", "Rich media messaging bot"],
15841
+ traits: {
15842
+ streaming: "none",
15843
+ messagesMutable: false,
15844
+ deliveryModel: "async",
15845
+ mediaSupport: "images",
15846
+ textMediaDelivery: "link",
15847
+ interactiveUI: "none",
15848
+ inboundMediaSupport: true,
15849
+ consumerType: "human",
15850
+ approvalAnswerable: false,
15851
+ reasoningVisibility: "always_strip",
15852
+ markdownDialect: "none",
15853
+ threadModel: "flat",
15854
+ senderIdentity: "verified",
15855
+ // ~4 short bubbles' worth of headroom. The adapter splits on paragraph
15856
+ // boundaries before sending; this cap signals to the model that long is
15857
+ // wrong without imposing a hard truncate that would clip mid-thought.
15858
+ maxResponseLength: 1200,
15859
+ executionHint: [
15860
+ "You are responding via iMessage. Hard rules:",
15861
+ "- Plain text only. No markdown \u2014 no **bold**, no # headings, no - bullets, no `code`, no > quotes, no fenced code blocks.",
15862
+ "- 1\u20133 sentences per reply, under 300 characters total when possible.",
15863
+ "- Texting tone: conversational, lowercase is fine, contractions welcome.",
15864
+ '- No greetings ("Hi!", "Hey there!") and no closings ("Let me know!", "Hope this helps!").',
15865
+ `- No AI disclaimers ("As an AI...", "I cannot...", "I'd be happy to help").`,
15866
+ "- One emoji max, only when it fits naturally.",
15867
+ "- For multi-part replies, separate logical chunks with a blank line \u2014 each chunk becomes its own bubble.",
15868
+ "- Do not include reasoning traces or process narration."
15869
+ ].join("\n")
15870
+ }
15871
+ },
15872
+ discord: {
15873
+ description: "Discord bot for community engagement",
15874
+ useCases: ["community support", "moderation", "server management"],
15875
+ examples: ["Community FAQ bot", "Moderation assistant", "Welcome bot"],
15876
+ traits: {
15877
+ streaming: "optional",
15878
+ messagesMutable: true,
15879
+ deliveryModel: "real_time",
15880
+ mediaSupport: "rich",
15881
+ textMediaDelivery: "link",
15882
+ interactiveUI: "buttons",
15883
+ inboundMediaSupport: true,
15884
+ consumerType: "human",
15885
+ approvalAnswerable: false,
15886
+ reasoningVisibility: "always_strip",
15887
+ markdownDialect: "markdown",
15888
+ threadModel: "threaded",
15889
+ senderIdentity: "authenticated",
15890
+ maxResponseLength: null,
15891
+ executionHint: "You are responding in a Discord server. Keep your tone friendly and community-appropriate. Markdown formatting is supported. Be concise. Do not include reasoning traces or tool call narration."
15892
+ }
15893
+ },
15894
+ whatsapp: {
15895
+ description: "WhatsApp Business integration for customer communication",
15896
+ useCases: ["customer support", "order updates", "appointment scheduling"],
15897
+ examples: ["WhatsApp support bot", "Order tracking assistant", "Booking agent"],
15898
+ traits: {
15899
+ streaming: "none",
15900
+ messagesMutable: false,
15901
+ deliveryModel: "async",
15902
+ mediaSupport: "rich",
15903
+ textMediaDelivery: "link",
15904
+ interactiveUI: "buttons",
15905
+ inboundMediaSupport: true,
15906
+ consumerType: "human",
15907
+ approvalAnswerable: false,
15908
+ reasoningVisibility: "always_strip",
15909
+ markdownDialect: "none",
15910
+ threadModel: "flat",
15911
+ senderIdentity: "verified",
15912
+ maxResponseLength: 1024,
15913
+ executionHint: "You are responding via WhatsApp. Keep responses concise and conversational \u2014 WhatsApp is a messaging app, not email. Plain text works best. Avoid lengthy explanations. Do not include reasoning traces or process narration."
15914
+ }
15915
+ },
15916
+ telegram: {
15917
+ description: "Telegram bot for messaging-based interactions",
15918
+ useCases: ["customer support", "notifications", "group management"],
15919
+ examples: ["Telegram support bot", "News alert bot", "Group admin assistant"],
15920
+ traits: {
15921
+ streaming: "none",
15922
+ messagesMutable: true,
15923
+ deliveryModel: "real_time",
15924
+ mediaSupport: "rich",
15925
+ textMediaDelivery: "native",
15926
+ interactiveUI: "buttons",
15927
+ inboundMediaSupport: true,
15928
+ consumerType: "human",
15929
+ approvalAnswerable: false,
15930
+ reasoningVisibility: "always_strip",
15931
+ markdownDialect: "html",
15932
+ threadModel: "flat",
15933
+ senderIdentity: "authenticated",
15934
+ maxResponseLength: 4096,
15935
+ executionHint: "You are responding via Telegram. Be clear and concise. Keep messages focused and avoid unnecessary verbosity. Do not include reasoning traces or tool call narration."
15936
+ }
15937
+ },
15938
+ messaging: {
15939
+ description: "Generic messaging surface for multi-channel delivery",
15940
+ useCases: ["multi-channel support", "unified messaging", "channel-agnostic bots"],
15941
+ examples: ["Multi-channel support bot", "Unified messaging gateway", "Channel router"],
15942
+ traits: {
15943
+ streaming: "optional",
15944
+ messagesMutable: false,
15945
+ deliveryModel: "real_time",
15946
+ mediaSupport: "images",
15947
+ textMediaDelivery: "link",
15948
+ interactiveUI: "none",
15949
+ inboundMediaSupport: false,
15950
+ consumerType: "human",
15951
+ approvalAnswerable: false,
15952
+ reasoningVisibility: "always_strip",
15953
+ markdownDialect: "none",
15954
+ threadModel: "flat",
15955
+ senderIdentity: "anonymous",
15956
+ maxResponseLength: null,
15957
+ executionHint: "You are responding via a messaging surface. Be clear and concise. Plain text is safest \u2014 avoid complex formatting. Do not include reasoning traces or tool call narration in your response."
15958
+ }
15959
+ },
15960
+ a2a: {
15961
+ description: "Agent-to-agent communication protocol",
15962
+ useCases: ["multi-agent workflows", "agent orchestration", "distributed processing"],
15963
+ examples: ["Agent coordinator", "Distributed pipeline", "Multi-agent research system"],
15964
+ traits: {
15965
+ streaming: "optional",
15966
+ messagesMutable: false,
15967
+ deliveryModel: "sync",
15968
+ mediaSupport: "none",
15969
+ textMediaDelivery: "none",
15970
+ interactiveUI: "none",
15971
+ inboundMediaSupport: false,
15972
+ consumerType: "agent",
15973
+ approvalAnswerable: true,
15974
+ reasoningVisibility: "pass_through",
15975
+ markdownDialect: "none",
15976
+ threadModel: "flat",
15977
+ senderIdentity: "authenticated",
15978
+ maxResponseLength: null,
15979
+ executionHint: null
15980
+ }
15981
+ },
15982
+ // @snake-case-ok: surface type identifier
15983
+ chrome_extension: {
15984
+ description: "Downloadable Manifest V3 Chrome extension embedding the agent in the browser side panel, with packaged browser tools (read page, fill forms, navigate tabs) executed locally via the WebMCP client-tool loop.",
15985
+ useCases: [
15986
+ "browser copilots",
15987
+ "page-aware assistants",
15988
+ "form filling and data extraction",
15989
+ "internal browser tooling"
15990
+ ],
15991
+ examples: [
15992
+ "CRM sidekick that reads and updates records on the page",
15993
+ "Research assistant that summarizes and compares open tabs",
15994
+ "Support agent that drafts replies inside a ticketing UI"
15995
+ ],
15996
+ traits: {
15997
+ streaming: "required",
15998
+ messagesMutable: false,
15999
+ deliveryModel: "real_time",
16000
+ mediaSupport: "images",
16001
+ textMediaDelivery: "inline_html",
16002
+ interactiveUI: "generative",
16003
+ inboundMediaSupport: true,
16004
+ consumerType: "human",
16005
+ approvalAnswerable: true,
16006
+ reasoningVisibility: "pass_through",
16007
+ markdownDialect: "mdx",
16008
+ threadModel: "flat",
16009
+ senderIdentity: "anonymous",
16010
+ maxResponseLength: null,
16011
+ executionHint: "You are running inside a Chrome extension side panel. You may have browser tools (chrome:*) to read the current page, interact with forms, and manage tabs \u2014 use them when the user asks about or wants to act on the page they are viewing. Mutating actions (clicking, filling, navigating) ask the user for confirmation before running."
16012
+ },
16013
+ behaviorTypeRef: "runtype://types/surface-configs"
16014
+ },
16015
+ "ag-ui": {
16016
+ description: "AG-UI protocol endpoint (agent-to-user event stream over SSE)",
16017
+ useCases: ["custom agent frontends", "CopilotKit / AG-UI clients", "embedded agent UIs"],
16018
+ examples: ["CopilotKit app", "Custom React agent UI", "AG-UI dojo client"],
16019
+ // Staging-test phase (`enable-ag-ui-surface` flag): keep the type out of
16020
+ // agent-facing catalogs until GA. Runtime trait lookups still resolve.
16021
+ hiddenFromCatalog: true,
16022
+ traits: {
16023
+ streaming: "required",
16024
+ messagesMutable: false,
16025
+ deliveryModel: "real_time",
16026
+ mediaSupport: "none",
16027
+ textMediaDelivery: "none",
16028
+ interactiveUI: "none",
16029
+ inboundMediaSupport: false,
16030
+ consumerType: "machine",
16031
+ approvalAnswerable: true,
16032
+ reasoningVisibility: "pass_through",
16033
+ markdownDialect: "markdown",
16034
+ threadModel: "flat",
16035
+ senderIdentity: "authenticated",
16036
+ maxResponseLength: null,
16037
+ executionHint: null
16038
+ }
16039
+ }
16040
+ };
16041
+ var EMAIL_HTML_CAPABILITY_HINT = [
16042
+ "## Channel capabilities",
16043
+ '- Formatting: author the reply as an HTML email body. Write well-formed HTML and put all styling in inline `style="..."` attributes (no `<style>` blocks, no external CSS). Use semantic tags freely: `<p>`, `<h1>`-`<h3>`, `<ul>`/`<ol>`/`<li>`, `<table>`, `<a>`, `<strong>`/`<em>`, `<blockquote>`, `<img>`. Do NOT emit `<script>`, `<iframe>`, `<head>`, `<body>`, or `<html>` wrappers: Runtype wraps your body in the email document and strips any active or unsafe content before sending.',
16044
+ '- Images: embed an image with `<img src="https://..." alt="...">` and it renders inline in the email. (Some clients ask the recipient to load remote images.)'
16045
+ ].join("\n");
15603
16046
  var ORTHOGONAL_PLATFORM_TOOLS = [
15604
16047
  {
15605
16048
  "id": "orthogonal:agentmail:create_draft",
@@ -32594,451 +33037,8 @@ var GRANOLA_INTEGRATION = {
32594
33037
  }
32595
33038
  ]
32596
33039
  };
32597
- var SURFACE_TYPE_METADATA = {
32598
- chat: {
32599
- description: "Website widget, support bots, conversational interfaces. Uses Persona and can optionally accept WebMCP page tools discovered from document.modelContext.",
32600
- useCases: [
32601
- "customer support",
32602
- "onboarding",
32603
- "internal tools",
32604
- "FAQ bots",
32605
- "page-aware assistants"
32606
- ],
32607
- examples: [
32608
- "Support chatbot",
32609
- "Sales assistant widget",
32610
- "Internal help desk",
32611
- "Storefront assistant with browser-side cart/search tools"
32612
- ],
32613
- traits: {
32614
- streaming: "required",
32615
- messagesMutable: false,
32616
- deliveryModel: "real_time",
32617
- mediaSupport: "images",
32618
- textMediaDelivery: "inline_html",
32619
- interactiveUI: "generative",
32620
- inboundMediaSupport: true,
32621
- consumerType: "human",
32622
- approvalAnswerable: true,
32623
- reasoningVisibility: "pass_through",
32624
- markdownDialect: "mdx",
32625
- threadModel: "flat",
32626
- senderIdentity: "anonymous",
32627
- maxResponseLength: null,
32628
- executionHint: null
32629
- },
32630
- behaviorTypeRef: "runtype://types/surface-configs"
32631
- },
32632
- api: {
32633
- description: "Programmatic HTTP endpoints for backend integrations",
32634
- useCases: ["backend automation", "third-party integrations", "data pipelines"],
32635
- examples: ["REST API for data processing", "Webhook consumer", "Integration endpoint"],
32636
- traits: {
32637
- streaming: "optional",
32638
- messagesMutable: false,
32639
- deliveryModel: "sync",
32640
- mediaSupport: "none",
32641
- textMediaDelivery: "none",
32642
- interactiveUI: "none",
32643
- inboundMediaSupport: true,
32644
- consumerType: "machine",
32645
- approvalAnswerable: true,
32646
- reasoningVisibility: "pass_through",
32647
- markdownDialect: "none",
32648
- threadModel: "flat",
32649
- senderIdentity: "authenticated",
32650
- maxResponseLength: null,
32651
- executionHint: null
32652
- },
32653
- behaviorTypeRef: "runtype://types/surface-configs"
32654
- },
32655
- mcp: {
32656
- description: "AI assistant integration (Cursor, Claude Code, etc.)",
32657
- useCases: ["developer tools", "AI-powered workflows", "code assistants"],
32658
- examples: ["Code review tool for Cursor", "Documentation assistant", "Database query tool"],
32659
- traits: {
32660
- streaming: "optional",
32661
- messagesMutable: false,
32662
- deliveryModel: "sync",
32663
- mediaSupport: "none",
32664
- textMediaDelivery: "none",
32665
- interactiveUI: "none",
32666
- inboundMediaSupport: false,
32667
- consumerType: "agent",
32668
- approvalAnswerable: true,
32669
- reasoningVisibility: "pass_through",
32670
- markdownDialect: "none",
32671
- threadModel: "flat",
32672
- senderIdentity: "authenticated",
32673
- maxResponseLength: null,
32674
- executionHint: null
32675
- },
32676
- behaviorTypeRef: "runtype://types/surface-configs"
32677
- },
32678
- email: {
32679
- description: "Email-triggered processing and automated responses",
32680
- useCases: ["email automation", "support ticket creation", "document processing"],
32681
- examples: ["Auto-reply support agent", "Invoice processor", "Email-to-task converter"],
32682
- traits: {
32683
- streaming: "none",
32684
- messagesMutable: false,
32685
- deliveryModel: "async",
32686
- // Email delivers no native attachments — the adapter ignores
32687
- // OutboundMessage.media; images only render via inline HTML <img>.
32688
- mediaSupport: "images",
32689
- textMediaDelivery: "inline_html",
32690
- interactiveUI: "none",
32691
- inboundMediaSupport: true,
32692
- consumerType: "human",
32693
- approvalAnswerable: false,
32694
- reasoningVisibility: "always_strip",
32695
- markdownDialect: "html",
32696
- threadModel: "reply_chain",
32697
- senderIdentity: "verified",
32698
- maxResponseLength: null,
32699
- executionHint: "You are responding via email. Write in a professional, organized tone. Use clear paragraphs. Avoid bullet-point overload \u2014 prefer flowing prose where appropriate. Do not include reasoning traces, tool call narration, or internal process details in your response."
32700
- },
32701
- behaviorTypeRef: "runtype://types/surface-configs"
32702
- },
32703
- webhook: {
32704
- description: "Event-driven processing from third-party services. Accepts JSON and form-encoded (application/x-www-form-urlencoded) payloads. Payloads are never treated as a Runtype envelope; the full parsed body is sent under `payload` in the execution message. Parsed top-level fields are also spread into flow inputs so `{{field}}` template variables resolve in prompt and api-call step bodies; optional `behavior.inputMapping` renames or deep-picks fields by dot path. Optional `behavior.response` returns a static HTTP body (e.g. empty TwiML) for providers that require specific ACK shapes \u2014 when set, the flow fires async.",
32705
- useCases: ["event processing", "data sync", "notifications"],
32706
- examples: [
32707
- "Stripe payment handler",
32708
- "GitHub event processor",
32709
- "Twilio inbound SMS (empty TwiML ACK, no reply)",
32710
- "Shopify order webhook (204 ACK)"
32711
- ],
32712
- traits: {
32713
- streaming: "none",
32714
- messagesMutable: false,
32715
- deliveryModel: "sync",
32716
- mediaSupport: "none",
32717
- textMediaDelivery: "none",
32718
- interactiveUI: "none",
32719
- inboundMediaSupport: false,
32720
- consumerType: "machine",
32721
- approvalAnswerable: false,
32722
- reasoningVisibility: "pass_through",
32723
- markdownDialect: "none",
32724
- threadModel: "flat",
32725
- senderIdentity: "authenticated",
32726
- maxResponseLength: null,
32727
- executionHint: null
32728
- },
32729
- behaviorTypeRef: "runtype://types/surface-configs"
32730
- },
32731
- // @snake-case-ok: matches FPO schema surface type enum
32732
- mcp_code: {
32733
- description: "Code Mode MCP server for programmatic AI agent access",
32734
- useCases: ["advanced agent integrations", "custom automation scripts"],
32735
- examples: ["Programmatic flow executor", "Batch processing agent"],
32736
- traits: {
32737
- streaming: "optional",
32738
- messagesMutable: false,
32739
- deliveryModel: "sync",
32740
- mediaSupport: "none",
32741
- textMediaDelivery: "none",
32742
- interactiveUI: "none",
32743
- inboundMediaSupport: false,
32744
- consumerType: "agent",
32745
- approvalAnswerable: true,
32746
- reasoningVisibility: "pass_through",
32747
- markdownDialect: "none",
32748
- threadModel: "flat",
32749
- senderIdentity: "authenticated",
32750
- maxResponseLength: null,
32751
- executionHint: null
32752
- },
32753
- behaviorTypeRef: "runtype://types/surface-configs"
32754
- },
32755
- slack: {
32756
- description: "Slack bot integration for team collaboration",
32757
- useCases: ["team notifications", "internal tools", "workflow automation"],
32758
- examples: ["Support bot in Slack", "Daily standup summarizer", "Alert channel manager"],
32759
- traits: {
32760
- streaming: "optional",
32761
- messagesMutable: true,
32762
- deliveryModel: "real_time",
32763
- mediaSupport: "rich",
32764
- textMediaDelivery: "link",
32765
- interactiveUI: "forms",
32766
- inboundMediaSupport: true,
32767
- consumerType: "human",
32768
- approvalAnswerable: false,
32769
- reasoningVisibility: "always_strip",
32770
- markdownDialect: "mrkdwn",
32771
- threadModel: "threaded",
32772
- senderIdentity: "authenticated",
32773
- maxResponseLength: 4e3,
32774
- executionHint: "You are responding in Slack. Be concise and direct \u2014 Slack messages should be scannable. Avoid lengthy prose. Do not include reasoning traces or tool call narration."
32775
- },
32776
- behaviorTypeRef: "runtype://types/surface-configs"
32777
- },
32778
- schedule: {
32779
- description: "Optional management/presentation surface for scheduled jobs; executable cron or one-time triggers live in top-level schedules[] or Schedule records",
32780
- useCases: [
32781
- "schedule management UI",
32782
- "scheduled report overview",
32783
- "periodic monitoring dashboard"
32784
- ],
32785
- examples: [
32786
- "Daily report schedule manager",
32787
- "Weekly data sync overview",
32788
- "Hourly health check monitor"
32789
- ],
32790
- traits: {
32791
- streaming: "none",
32792
- messagesMutable: false,
32793
- deliveryModel: "async",
32794
- mediaSupport: "none",
32795
- textMediaDelivery: "none",
32796
- interactiveUI: "none",
32797
- inboundMediaSupport: false,
32798
- consumerType: "machine",
32799
- approvalAnswerable: false,
32800
- reasoningVisibility: "always_strip",
32801
- markdownDialect: "none",
32802
- threadModel: "flat",
32803
- senderIdentity: "authenticated",
32804
- maxResponseLength: null,
32805
- executionHint: null
32806
- },
32807
- behaviorTypeRef: "runtype://types/surface-configs"
32808
- },
32809
- sms: {
32810
- description: "SMS messaging for mobile-first interactions",
32811
- useCases: ["SMS support", "appointment reminders", "two-way texting"],
32812
- examples: ["SMS support agent", "Appointment reminder bot", "Survey collector"],
32813
- traits: {
32814
- streaming: "none",
32815
- messagesMutable: false,
32816
- deliveryModel: "async",
32817
- mediaSupport: "none",
32818
- textMediaDelivery: "none",
32819
- interactiveUI: "none",
32820
- inboundMediaSupport: false,
32821
- consumerType: "human",
32822
- approvalAnswerable: false,
32823
- reasoningVisibility: "always_strip",
32824
- markdownDialect: "none",
32825
- threadModel: "flat",
32826
- senderIdentity: "verified",
32827
- maxResponseLength: 160,
32828
- executionHint: "You are responding via SMS. Be extremely brief \u2014 ideally one or two short sentences. Plain text only, no markdown, no lists. Get straight to the point. Do not include reasoning traces or process narration."
32829
- }
32830
- },
32831
- imessage: {
32832
- description: "iMessage messaging via Sendblue for Apple ecosystem interactions",
32833
- useCases: ["customer support", "appointment reminders", "rich messaging", "two-way texting"],
32834
- examples: ["iMessage support agent", "Appointment reminder bot", "Rich media messaging bot"],
32835
- traits: {
32836
- streaming: "none",
32837
- messagesMutable: false,
32838
- deliveryModel: "async",
32839
- mediaSupport: "images",
32840
- textMediaDelivery: "link",
32841
- interactiveUI: "none",
32842
- inboundMediaSupport: true,
32843
- consumerType: "human",
32844
- approvalAnswerable: false,
32845
- reasoningVisibility: "always_strip",
32846
- markdownDialect: "none",
32847
- threadModel: "flat",
32848
- senderIdentity: "verified",
32849
- // ~4 short bubbles' worth of headroom. The adapter splits on paragraph
32850
- // boundaries before sending; this cap signals to the model that long is
32851
- // wrong without imposing a hard truncate that would clip mid-thought.
32852
- maxResponseLength: 1200,
32853
- executionHint: [
32854
- "You are responding via iMessage. Hard rules:",
32855
- "- Plain text only. No markdown \u2014 no **bold**, no # headings, no - bullets, no `code`, no > quotes, no fenced code blocks.",
32856
- "- 1\u20133 sentences per reply, under 300 characters total when possible.",
32857
- "- Texting tone: conversational, lowercase is fine, contractions welcome.",
32858
- '- No greetings ("Hi!", "Hey there!") and no closings ("Let me know!", "Hope this helps!").',
32859
- `- No AI disclaimers ("As an AI...", "I cannot...", "I'd be happy to help").`,
32860
- "- One emoji max, only when it fits naturally.",
32861
- "- For multi-part replies, separate logical chunks with a blank line \u2014 each chunk becomes its own bubble.",
32862
- "- Do not include reasoning traces or process narration."
32863
- ].join("\n")
32864
- }
32865
- },
32866
- discord: {
32867
- description: "Discord bot for community engagement",
32868
- useCases: ["community support", "moderation", "server management"],
32869
- examples: ["Community FAQ bot", "Moderation assistant", "Welcome bot"],
32870
- traits: {
32871
- streaming: "optional",
32872
- messagesMutable: true,
32873
- deliveryModel: "real_time",
32874
- mediaSupport: "rich",
32875
- textMediaDelivery: "link",
32876
- interactiveUI: "buttons",
32877
- inboundMediaSupport: true,
32878
- consumerType: "human",
32879
- approvalAnswerable: false,
32880
- reasoningVisibility: "always_strip",
32881
- markdownDialect: "markdown",
32882
- threadModel: "threaded",
32883
- senderIdentity: "authenticated",
32884
- maxResponseLength: null,
32885
- executionHint: "You are responding in a Discord server. Keep your tone friendly and community-appropriate. Markdown formatting is supported. Be concise. Do not include reasoning traces or tool call narration."
32886
- }
32887
- },
32888
- whatsapp: {
32889
- description: "WhatsApp Business integration for customer communication",
32890
- useCases: ["customer support", "order updates", "appointment scheduling"],
32891
- examples: ["WhatsApp support bot", "Order tracking assistant", "Booking agent"],
32892
- traits: {
32893
- streaming: "none",
32894
- messagesMutable: false,
32895
- deliveryModel: "async",
32896
- mediaSupport: "rich",
32897
- textMediaDelivery: "link",
32898
- interactiveUI: "buttons",
32899
- inboundMediaSupport: true,
32900
- consumerType: "human",
32901
- approvalAnswerable: false,
32902
- reasoningVisibility: "always_strip",
32903
- markdownDialect: "none",
32904
- threadModel: "flat",
32905
- senderIdentity: "verified",
32906
- maxResponseLength: 1024,
32907
- executionHint: "You are responding via WhatsApp. Keep responses concise and conversational \u2014 WhatsApp is a messaging app, not email. Plain text works best. Avoid lengthy explanations. Do not include reasoning traces or process narration."
32908
- }
32909
- },
32910
- telegram: {
32911
- description: "Telegram bot for messaging-based interactions",
32912
- useCases: ["customer support", "notifications", "group management"],
32913
- examples: ["Telegram support bot", "News alert bot", "Group admin assistant"],
32914
- traits: {
32915
- streaming: "none",
32916
- messagesMutable: true,
32917
- deliveryModel: "real_time",
32918
- mediaSupport: "rich",
32919
- textMediaDelivery: "native",
32920
- interactiveUI: "buttons",
32921
- inboundMediaSupport: true,
32922
- consumerType: "human",
32923
- approvalAnswerable: false,
32924
- reasoningVisibility: "always_strip",
32925
- markdownDialect: "html",
32926
- threadModel: "flat",
32927
- senderIdentity: "authenticated",
32928
- maxResponseLength: 4096,
32929
- executionHint: "You are responding via Telegram. Be clear and concise. Keep messages focused and avoid unnecessary verbosity. Do not include reasoning traces or tool call narration."
32930
- }
32931
- },
32932
- messaging: {
32933
- description: "Generic messaging surface for multi-channel delivery",
32934
- useCases: ["multi-channel support", "unified messaging", "channel-agnostic bots"],
32935
- examples: ["Multi-channel support bot", "Unified messaging gateway", "Channel router"],
32936
- traits: {
32937
- streaming: "optional",
32938
- messagesMutable: false,
32939
- deliveryModel: "real_time",
32940
- mediaSupport: "images",
32941
- textMediaDelivery: "link",
32942
- interactiveUI: "none",
32943
- inboundMediaSupport: false,
32944
- consumerType: "human",
32945
- approvalAnswerable: false,
32946
- reasoningVisibility: "always_strip",
32947
- markdownDialect: "none",
32948
- threadModel: "flat",
32949
- senderIdentity: "anonymous",
32950
- maxResponseLength: null,
32951
- executionHint: "You are responding via a messaging surface. Be clear and concise. Plain text is safest \u2014 avoid complex formatting. Do not include reasoning traces or tool call narration in your response."
32952
- }
32953
- },
32954
- a2a: {
32955
- description: "Agent-to-agent communication protocol",
32956
- useCases: ["multi-agent workflows", "agent orchestration", "distributed processing"],
32957
- examples: ["Agent coordinator", "Distributed pipeline", "Multi-agent research system"],
32958
- traits: {
32959
- streaming: "optional",
32960
- messagesMutable: false,
32961
- deliveryModel: "sync",
32962
- mediaSupport: "none",
32963
- textMediaDelivery: "none",
32964
- interactiveUI: "none",
32965
- inboundMediaSupport: false,
32966
- consumerType: "agent",
32967
- approvalAnswerable: true,
32968
- reasoningVisibility: "pass_through",
32969
- markdownDialect: "none",
32970
- threadModel: "flat",
32971
- senderIdentity: "authenticated",
32972
- maxResponseLength: null,
32973
- executionHint: null
32974
- }
32975
- },
32976
- // @snake-case-ok: surface type identifier
32977
- chrome_extension: {
32978
- description: "Downloadable Manifest V3 Chrome extension embedding the agent in the browser side panel, with packaged browser tools (read page, fill forms, navigate tabs) executed locally via the WebMCP client-tool loop.",
32979
- useCases: [
32980
- "browser copilots",
32981
- "page-aware assistants",
32982
- "form filling and data extraction",
32983
- "internal browser tooling"
32984
- ],
32985
- examples: [
32986
- "CRM sidekick that reads and updates records on the page",
32987
- "Research assistant that summarizes and compares open tabs",
32988
- "Support agent that drafts replies inside a ticketing UI"
32989
- ],
32990
- traits: {
32991
- streaming: "required",
32992
- messagesMutable: false,
32993
- deliveryModel: "real_time",
32994
- mediaSupport: "images",
32995
- textMediaDelivery: "inline_html",
32996
- interactiveUI: "generative",
32997
- inboundMediaSupport: true,
32998
- consumerType: "human",
32999
- approvalAnswerable: true,
33000
- reasoningVisibility: "pass_through",
33001
- markdownDialect: "mdx",
33002
- threadModel: "flat",
33003
- senderIdentity: "anonymous",
33004
- maxResponseLength: null,
33005
- executionHint: "You are running inside a Chrome extension side panel. You may have browser tools (chrome:*) to read the current page, interact with forms, and manage tabs \u2014 use them when the user asks about or wants to act on the page they are viewing. Mutating actions (clicking, filling, navigating) ask the user for confirmation before running."
33006
- },
33007
- behaviorTypeRef: "runtype://types/surface-configs"
33008
- },
33009
- "ag-ui": {
33010
- description: "AG-UI protocol endpoint (agent-to-user event stream over SSE)",
33011
- useCases: ["custom agent frontends", "CopilotKit / AG-UI clients", "embedded agent UIs"],
33012
- examples: ["CopilotKit app", "Custom React agent UI", "AG-UI dojo client"],
33013
- // Staging-test phase (`enable-ag-ui-surface` flag): keep the type out of
33014
- // agent-facing catalogs until GA. Runtime trait lookups still resolve.
33015
- hiddenFromCatalog: true,
33016
- traits: {
33017
- streaming: "required",
33018
- messagesMutable: false,
33019
- deliveryModel: "real_time",
33020
- mediaSupport: "none",
33021
- textMediaDelivery: "none",
33022
- interactiveUI: "none",
33023
- inboundMediaSupport: false,
33024
- consumerType: "machine",
33025
- approvalAnswerable: true,
33026
- reasoningVisibility: "pass_through",
33027
- markdownDialect: "markdown",
33028
- threadModel: "flat",
33029
- senderIdentity: "authenticated",
33030
- maxResponseLength: null,
33031
- executionHint: null
33032
- }
33033
- }
33034
- };
33035
- var EMAIL_HTML_CAPABILITY_HINT = [
33036
- "## Channel capabilities",
33037
- '- Formatting: author the reply as an HTML email body. Write well-formed HTML and put all styling in inline `style="..."` attributes (no `<style>` blocks, no external CSS). Use semantic tags freely: `<p>`, `<h1>`-`<h3>`, `<ul>`/`<ol>`/`<li>`, `<table>`, `<a>`, `<strong>`/`<em>`, `<blockquote>`, `<img>`. Do NOT emit `<script>`, `<iframe>`, `<head>`, `<body>`, or `<html>` wrappers: Runtype wraps your body in the email document and strips any active or unsafe content before sending.',
33038
- '- Images: embed an image with `<img src="https://..." alt="...">` and it renders inline in the email. (Some clients ask the recipient to load remote images.)'
33039
- ].join("\n");
33040
33040
 
33041
- // ../shared/dist/chunk-ZUODFMLO.mjs
33041
+ // ../shared/dist/chunk-ZS5WVN6Q.mjs
33042
33042
  var DEFAULT_MODELS_FOR_NEW_ACCOUNTS = [
33043
33043
  // Mixlayer models
33044
33044
  {
@@ -40272,7 +40272,14 @@ var API_INPROCESS_CAPABILITY_MATRIX = {
40272
40272
  // independent branches that each claimed their own suffix, plus the
40273
40273
  // vendored-export re-fold pass. No bit changes with this bump; it exists so
40274
40274
  // the combined base carries one unambiguous version.
40275
- version: "2026-08-06.3",
40275
+ // Bumped 2026-08-08.1: graduates `transformDataMcpServers` (#6013) — the
40276
+ // flow-lane MCP discovery pre-pass now walks `transform-data` steps and binds
40277
+ // each declared server's discovered tools as sandbox callables under legacy's
40278
+ // `{canonicalServerId}_{toolName}` identifier. The bit re-folds on
40279
+ // `vendored-export` (it rides the same host `CodeModeExecutor` seam as
40280
+ // `transformDataCodeModeTools`) — see {@link VENDORED_EXPORT_REFOLDS}.
40281
+ // Rollback lever: revert the bit to `true` (plus its test).
40282
+ version: "2026-08-08.1",
40276
40283
  unsupportedStepTypes: ["wait-until", "crawl"],
40277
40284
  unsupportedFeatures: {
40278
40285
  approvalSteps: true,
@@ -40317,17 +40324,20 @@ var API_INPROCESS_CAPABILITY_MATRIX = {
40317
40324
  // classes the runtime flow lane still cannot faithfully run.
40318
40325
  // SUPPORTED as of 2026-08-06 (#6013): a `transform-data` step whose
40319
40326
  // `config.tools` carries a runtime tool pool binds those tools through the
40320
- // host `CodeModeExecutor` (`workerLoaderExecuteTransformWithTools`). The
40321
- // `mcpServers`-only case STAYS folded via the narrow
40322
- // `transformDataMcpServers` bit below (the runtime has no MCP discovery on
40323
- // transform steps, so an MCP tool pool would silently lose its tools).
40327
+ // host `CodeModeExecutor` (`workerLoaderExecuteTransformWithTools`).
40324
40328
  // Rollback lever: revert this bit to `true` (plus its test).
40325
40329
  transformDataCodeModeTools: false,
40326
- // #6013 narrow carve-out — the mcpServers-only transform code-mode case.
40327
- // `transformDataHasCodeModeTools` now fires only on `config.tools.mcpServers`,
40328
- // and this bit keeps that narrow case routed to legacy while the
40329
- // runtimeTools/toolIds cases graduate (bit above flipped false).
40330
- transformDataMcpServers: true,
40330
+ // SUPPORTED as of 2026-08-08 (#6013): the runtime flow lane's MCP discovery
40331
+ // pre-pass now walks `transform-data` steps alongside prompt steps
40332
+ // (`flow-engine.ts`) and merges each declared server's discovered tools into
40333
+ // the step's `config.tools.runtimeTools` — projected under LEGACY's
40334
+ // `{canonicalServerId}_{toolName}` code-step callable name and
40335
+ // `config.customServer` dispatch shape (`transformMcpPoolToolsForServer` in
40336
+ // `code-mode-executor.ts`), so authored scripts keep naming the same
40337
+ // callable. The `hasTransformDataCodeModeTools` FACT stays computed for
40338
+ // decision attribution but no longer folds.
40339
+ // Rollback lever: revert this bit to `true` (plus its test).
40340
+ transformDataMcpServers: false,
40331
40341
  unsupportedTransformExecution: true,
40332
40342
  // #6023 leg 1 (2026-08-05): a custom runtime tool requesting code_mode / a
40333
40343
  // non-JS language / a container-backed sandbox provider has no runtime-lane
@@ -40417,7 +40427,10 @@ var VENDORED_EXPORT_CAPABILITY_MATRIX = {
40417
40427
  // VENDORED_EXPORT_REFOLDS) — api-inprocess supports managed fetch methods
40418
40428
  // only because the api host wires `ManagedFetchExecutor`; no export bundle
40419
40429
  // does, so a firecrawl/massive fetch-url step fails as-shipped.
40420
- version: "2026-08-06.3",
40430
+ // Bumped 2026-08-08.1: `transformDataMcpServers` graduated on the base and
40431
+ // becomes the fourth documented re-fold here — the discovered tools still
40432
+ // need the host `CodeModeExecutor` to be bound as sandbox callables.
40433
+ version: "2026-08-08.1",
40421
40434
  unsupportedStepTypes: [
40422
40435
  // ── Carried over from api-inprocess: durable-host-only step types. A
40423
40436
  // self-contained container has no durable host (BYOC §3.3 / S0 — the
@@ -40535,9 +40548,10 @@ var VENDORED_EXPORT_CAPABILITY_MATRIX = {
40535
40548
  // code-with-tools fulfillment in the standard export — then flip to false and
40536
40549
  // drop from {@link VENDORED_EXPORT_REFOLDS}.
40537
40550
  transformDataCodeModeTools: true,
40538
- // The narrow mcpServers-only transform carve-out (#6013) is a base fold;
40539
- // carried over as `true` and restated for the same reason (no MCP discovery
40540
- // on transform steps).
40551
+ // VENDORED RE-FOLD (as of 2026-08-08.1, when the base graduated): a
40552
+ // transform step's DISCOVERED MCP tools are bound through the same host
40553
+ // `CodeModeExecutor` seam as the sibling bit above — discovery itself is
40554
+ // portable, the BINDING is not. Same graduation lever.
40541
40555
  transformDataMcpServers: true,
40542
40556
  unsupportedTransformExecution: true,
40543
40557
  // api-inprocess fold (G5); carried over.
@@ -47607,8 +47621,9 @@ authCommand.command("whoami").description("Display current user information").op
47607
47621
  }
47608
47622
  const usage = billingInfo.usage;
47609
47623
  if (usage) {
47610
- const limit = usage.executionsLimit ? `/${usage.executionsLimit}` : "";
47611
- fields.push({ label: "Executions", value: `${usage.executionsUsed ?? 0}${limit}` });
47624
+ const used = usage.executionsToday ?? usage.executionsThisMonth;
47625
+ const value = usage.executionsThisMonthAvailable === false || typeof used !== "number" ? "unavailable" : used.toLocaleString();
47626
+ fields.push({ label: "Executions today", value });
47612
47627
  }
47613
47628
  }
47614
47629
  setResultNode(React.createElement(EntityCard, { fields }));
@@ -70533,6 +70548,13 @@ import React24 from "react";
70533
70548
  import { render as render24 } from "ink";
70534
70549
  import { useState as useState41, useEffect as useEffect35 } from "react";
70535
70550
  import open5 from "open";
70551
+ function formatExecutionsToday(usage) {
70552
+ if (usage.executionsThisMonthAvailable === false) {
70553
+ return "unavailable";
70554
+ }
70555
+ const used = usage.executionsToday ?? usage.executionsThisMonth;
70556
+ return typeof used === "number" ? used.toLocaleString() : "unavailable";
70557
+ }
70536
70558
  var billingCommand = new Command26("billing").description("View billing and subscription info");
70537
70559
  billingCommand.command("status").description("Show current plan and usage").option("--json", "Output as JSON").option("--tty", "Force TTY mode").option("--no-tty", "Force non-TTY mode").action(async (options) => {
70538
70560
  const apiKey = await ensureAuth();
@@ -70552,11 +70574,8 @@ billingCommand.command("status").description("Show current plan and usage").opti
70552
70574
  ]);
70553
70575
  if (data.usage) {
70554
70576
  console.log();
70555
- const limit = data.usage.executionsLimit;
70556
- const used = data.usage.executionsUsed ?? 0;
70557
- const limitStr = limit ? `/${limit}` : "";
70558
70577
  printDetail("Usage", [
70559
- { label: "Executions", value: `${used}${limitStr}` }
70578
+ { label: "Executions today", value: formatExecutionsToday(data.usage) }
70560
70579
  ]);
70561
70580
  }
70562
70581
  if (data.limits) {
@@ -70592,10 +70611,7 @@ billingCommand.command("status").description("Show current plan and usage").opti
70592
70611
  { label: "Period end", value: data.currentPeriodEnd }
70593
70612
  ];
70594
70613
  if (data.usage) {
70595
- const limit = data.usage.executionsLimit;
70596
- const used = data.usage.executionsUsed ?? 0;
70597
- const limitStr = limit ? `/${limit}` : "";
70598
- fields.push({ label: "Executions", value: `${used}${limitStr}` });
70614
+ fields.push({ label: "Executions today", value: formatExecutionsToday(data.usage) });
70599
70615
  }
70600
70616
  if (data.limits) {
70601
70617
  if (data.limits.dailyLimit) fields.push({ label: "Daily limit", value: data.limits.dailyLimit });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runtypelabs/cli",
3
- "version": "2.33.3",
3
+ "version": "2.33.4",
4
4
  "description": "Command-line interface for Runtype AI platform",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -26,9 +26,9 @@
26
26
  "react": "^19.2.8",
27
27
  "rosie-skills": "0.8.1",
28
28
  "yaml": "^2.9.0",
29
- "@runtypelabs/ink-components": "0.3.6",
30
- "@runtypelabs/sdk": "6.6.2",
31
- "@runtypelabs/terminal-animations": "0.2.3"
29
+ "@runtypelabs/sdk": "6.6.3",
30
+ "@runtypelabs/terminal-animations": "0.2.3",
31
+ "@runtypelabs/ink-components": "0.3.6"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@modelcontextprotocol/server": "2.0.0",
@@ -43,7 +43,7 @@
43
43
  "tsx": "^4.7.1",
44
44
  "typescript": "^6.0.3",
45
45
  "vitest": "^4.1.0",
46
- "@runtypelabs/shared": "3.17.3"
46
+ "@runtypelabs/shared": "3.18.0"
47
47
  },
48
48
  "engines": {
49
49
  "node": ">=22.12.0"