@runtypelabs/cli 2.33.3 → 2.33.5

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 +533 -483
  2. package/package.json +3 -3
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
  {
@@ -33170,7 +33170,7 @@ var CONTEXT_STEP_TYPES = [
33170
33170
  ];
33171
33171
  var FLOW_STEP_TYPES = ["prompt", ...CONTEXT_STEP_TYPES];
33172
33172
 
33173
- // ../shared/dist/chunk-MATCHJ7V.mjs
33173
+ // ../shared/dist/chunk-XCUZAGPM.mjs
33174
33174
  function getNestedValue(obj, path20) {
33175
33175
  let normalizedPath = path20;
33176
33176
  normalizedPath = normalizedPath.replace(/^\$\.?/, "");
@@ -33227,6 +33227,15 @@ var SYSTEM_VARIABLES = /* @__PURE__ */ new Set([
33227
33227
  // it as undeclared and the executors don't report it as "unresolved" before
33228
33228
  // injection runs.
33229
33229
  "_tools",
33230
+ // Multi-tenancy identity vars. `createContextVariables` populates both
33231
+ // spread-conditionally (`_endUser` for the individual human, `_tenant` for the
33232
+ // customer org between `_user` and `_endUser`), and the dispatch schema
33233
+ // documents them — but they were missing here, so `{{_endUser.email}}` /
33234
+ // `{{_tenant.id}}` validated as UNDECLARED_VARIABLE_REFERENCE with a
33235
+ // remediation ("declare it as a flow input") that is impossible: the `inputs`
33236
+ // schema rejects keys starting with `_`.
33237
+ "_endUser",
33238
+ "_tenant",
33230
33239
  ...MESSAGE_VARIABLES
33231
33240
  ]);
33232
33241
  var SECRET_REF_PATTERN = /\{\{secret:([A-Z][A-Z0-9_]*[A-Z0-9])\}\}/g;
@@ -40272,7 +40281,14 @@ var API_INPROCESS_CAPABILITY_MATRIX = {
40272
40281
  // independent branches that each claimed their own suffix, plus the
40273
40282
  // vendored-export re-fold pass. No bit changes with this bump; it exists so
40274
40283
  // the combined base carries one unambiguous version.
40275
- version: "2026-08-06.3",
40284
+ // Bumped 2026-08-08.1: graduates `transformDataMcpServers` (#6013) — the
40285
+ // flow-lane MCP discovery pre-pass now walks `transform-data` steps and binds
40286
+ // each declared server's discovered tools as sandbox callables under legacy's
40287
+ // `{canonicalServerId}_{toolName}` identifier. The bit re-folds on
40288
+ // `vendored-export` (it rides the same host `CodeModeExecutor` seam as
40289
+ // `transformDataCodeModeTools`) — see {@link VENDORED_EXPORT_REFOLDS}.
40290
+ // Rollback lever: revert the bit to `true` (plus its test).
40291
+ version: "2026-08-08.1",
40276
40292
  unsupportedStepTypes: ["wait-until", "crawl"],
40277
40293
  unsupportedFeatures: {
40278
40294
  approvalSteps: true,
@@ -40317,17 +40333,20 @@ var API_INPROCESS_CAPABILITY_MATRIX = {
40317
40333
  // classes the runtime flow lane still cannot faithfully run.
40318
40334
  // SUPPORTED as of 2026-08-06 (#6013): a `transform-data` step whose
40319
40335
  // `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).
40336
+ // host `CodeModeExecutor` (`workerLoaderExecuteTransformWithTools`).
40324
40337
  // Rollback lever: revert this bit to `true` (plus its test).
40325
40338
  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,
40339
+ // SUPPORTED as of 2026-08-08 (#6013): the runtime flow lane's MCP discovery
40340
+ // pre-pass now walks `transform-data` steps alongside prompt steps
40341
+ // (`flow-engine.ts`) and merges each declared server's discovered tools into
40342
+ // the step's `config.tools.runtimeTools` — projected under LEGACY's
40343
+ // `{canonicalServerId}_{toolName}` code-step callable name and
40344
+ // `config.customServer` dispatch shape (`transformMcpPoolToolsForServer` in
40345
+ // `code-mode-executor.ts`), so authored scripts keep naming the same
40346
+ // callable. The `hasTransformDataCodeModeTools` FACT stays computed for
40347
+ // decision attribution but no longer folds.
40348
+ // Rollback lever: revert this bit to `true` (plus its test).
40349
+ transformDataMcpServers: false,
40331
40350
  unsupportedTransformExecution: true,
40332
40351
  // #6023 leg 1 (2026-08-05): a custom runtime tool requesting code_mode / a
40333
40352
  // non-JS language / a container-backed sandbox provider has no runtime-lane
@@ -40374,14 +40393,16 @@ var API_INPROCESS_CAPABILITY_MATRIX = {
40374
40393
  // flow lane to legacy for the common case — the opposite of runtime-primary.
40375
40394
  // The runtime lane already carries Layer-1 resilience natively
40376
40395
  // (`withModelCallResilience`: TTFT + idle watchdog + bounded same-model
40377
- // retry — packages/runtime prompt-executor.ts), so the residual delta is
40378
- // narrow: on a retryable platform-key failure that survives Layer 1 with no
40379
- // partial output, the runtime surfaces the step error where legacy would
40380
- // additionally swap upstream/model. That is an availability nicety, not a
40381
- // semantic difference — and unlike the folds above it cannot silently
40382
- // produce a WRONG result. `hasImplicitPlatformFallbackCandidate` is still
40383
- // computed for decision attribution. Rollback lever: flip this bit to `true`
40384
- // (plus its test) to restore the fold.
40396
+ // retry — packages/runtime prompt-executor.ts), and since the fallback-chain
40397
+ // port it ALSO synthesizes the implicit chain itself: on a retryable
40398
+ // platform-key failure that survives Layer 1 with no partial output, the
40399
+ // runtime flow engine runs the SAME shared gate and chain builder as legacy
40400
+ // (`shouldSynthesizePlatformDefaultFallback` / `getPlatformDefaultStallFallback`,
40401
+ // applied in packages/runtime flow-engine.ts) and swaps upstream/model too —
40402
+ // so the residual delta the original rationale described is closed.
40403
+ // `hasImplicitPlatformFallbackCandidate` is still computed for decision
40404
+ // attribution. Rollback lever: flip this bit to `true` (plus its test) to
40405
+ // restore the fold.
40385
40406
  implicitPlatformFallback: false,
40386
40407
  // §A1 parity-audit BRIDGE fold: a prompt step's `toolIds` carrying a
40387
40408
  // reference class the runtime lane can neither materialize at export nor
@@ -40417,7 +40438,10 @@ var VENDORED_EXPORT_CAPABILITY_MATRIX = {
40417
40438
  // VENDORED_EXPORT_REFOLDS) — api-inprocess supports managed fetch methods
40418
40439
  // only because the api host wires `ManagedFetchExecutor`; no export bundle
40419
40440
  // does, so a firecrawl/massive fetch-url step fails as-shipped.
40420
- version: "2026-08-06.3",
40441
+ // Bumped 2026-08-08.1: `transformDataMcpServers` graduated on the base and
40442
+ // becomes the fourth documented re-fold here — the discovered tools still
40443
+ // need the host `CodeModeExecutor` to be bound as sandbox callables.
40444
+ version: "2026-08-08.1",
40421
40445
  unsupportedStepTypes: [
40422
40446
  // ── Carried over from api-inprocess: durable-host-only step types. A
40423
40447
  // self-contained container has no durable host (BYOC §3.3 / S0 — the
@@ -40427,11 +40451,17 @@ var VENDORED_EXPORT_CAPABILITY_MATRIX = {
40427
40451
  "wait-until",
40428
40452
  "crawl",
40429
40453
  // ── Hosted-service / DB-backed record & email steps (BYOC §7.2). A
40430
- // self-contained container has no hosted RecordStore / EmailSender; the
40431
- // Hosted endpoints are PROPOSED, not built, and S0 shows send-email /
40432
- // record steps fail in BOTH default and wired configs (no Bundled mode).
40433
- // Graduation lever: build the Hosted endpoints OR ship a Bundled
40434
- // RecordStore/EmailSender in the standard export — then remove.
40454
+ // self-contained container has no hosted RecordStore / EmailSender, and S0
40455
+ // shows send-email / record steps fail in BOTH default and wired configs
40456
+ // (no Bundled mode). The Hosted ENDPOINTS themselves are now built and
40457
+ // mounted (`/v1/runtime/email`, `/v1/runtime/records`, `/v1/runtime/search`)
40458
+ // and the runtime ships `HostedEmailSender` against them — so that half of
40459
+ // the original graduation lever is met. What is still missing is the
40460
+ // fulfillment: the standard export wires no EmailSender / RecordStore (the
40461
+ // runtime falls back to its NoOp sender), and a Hosted client needs a
40462
+ // customer-supplied Runtype API key an export does not carry. Graduation
40463
+ // lever: wire a Hosted or Bundled RecordStore/EmailSender into the standard
40464
+ // export — then remove.
40435
40465
  "send-email",
40436
40466
  "upsert-record",
40437
40467
  "update-record",
@@ -40535,9 +40565,10 @@ var VENDORED_EXPORT_CAPABILITY_MATRIX = {
40535
40565
  // code-with-tools fulfillment in the standard export — then flip to false and
40536
40566
  // drop from {@link VENDORED_EXPORT_REFOLDS}.
40537
40567
  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).
40568
+ // VENDORED RE-FOLD (as of 2026-08-08.1, when the base graduated): a
40569
+ // transform step's DISCOVERED MCP tools are bound through the same host
40570
+ // `CodeModeExecutor` seam as the sibling bit above — discovery itself is
40571
+ // portable, the BINDING is not. Same graduation lever.
40541
40572
  transformDataMcpServers: true,
40542
40573
  unsupportedTransformExecution: true,
40543
40574
  // api-inprocess fold (G5); carried over.
@@ -45073,10 +45104,27 @@ var credentialProxyConfigSchema = external_exports.object({
45073
45104
  });
45074
45105
  var LOCAL_INFERENCE_PROTOCOL_VERSION = 1;
45075
45106
  var LocalInferenceSurfaceSchema = external_exports.enum(["playground", "flows", "agents"]);
45107
+ var LocalModelCapabilitiesSchema = external_exports.object({
45108
+ streaming: external_exports.boolean(),
45109
+ structuredOutput: external_exports.enum(["none", "json", "json_schema"]),
45110
+ tools: external_exports.enum(["none", "single", "parallel"]),
45111
+ vision: external_exports.boolean(),
45112
+ maxContextTokens: external_exports.number().int().positive().optional(),
45113
+ maxOutputTokens: external_exports.number().int().positive().optional(),
45114
+ supportedSampling: external_exports.array(external_exports.enum(["temperature", "top_p", "seed"])).optional()
45115
+ });
45116
+ var LocalInferenceModelSnapshotSchema = external_exports.object({
45117
+ backend: external_exports.literal("ollama"),
45118
+ model: external_exports.string().trim().min(1).max(256),
45119
+ capabilities: LocalModelCapabilitiesSchema,
45120
+ capabilityRevision: external_exports.string().regex(/^sha256:[0-9a-f]{64}$/)
45121
+ });
45076
45122
  var LocalInferenceSelectionSchema = external_exports.object({
45077
45123
  sessionId: external_exports.string().uuid(),
45078
45124
  model: external_exports.string().trim().min(1).max(256),
45079
45125
  backend: external_exports.literal("ollama"),
45126
+ /** Optional only for protocol-v1 dashboards during the rolling upgrade. */
45127
+ capabilityRevision: external_exports.string().regex(/^sha256:[0-9a-f]{64}$/).optional(),
45080
45128
  /**
45081
45129
  * Dashboard surface that created the session. Optional during the rolling
45082
45130
  * upgrade from protocol v1 clients; new clients always send it.
@@ -47607,8 +47655,9 @@ authCommand.command("whoami").description("Display current user information").op
47607
47655
  }
47608
47656
  const usage = billingInfo.usage;
47609
47657
  if (usage) {
47610
- const limit = usage.executionsLimit ? `/${usage.executionsLimit}` : "";
47611
- fields.push({ label: "Executions", value: `${usage.executionsUsed ?? 0}${limit}` });
47658
+ const used = usage.executionsToday ?? usage.executionsThisMonth;
47659
+ const value = usage.executionsThisMonthAvailable === false || typeof used !== "number" ? "unavailable" : used.toLocaleString();
47660
+ fields.push({ label: "Executions today", value });
47612
47661
  }
47613
47662
  }
47614
47663
  setResultNode(React.createElement(EntityCard, { fields }));
@@ -70533,6 +70582,13 @@ import React24 from "react";
70533
70582
  import { render as render24 } from "ink";
70534
70583
  import { useState as useState41, useEffect as useEffect35 } from "react";
70535
70584
  import open5 from "open";
70585
+ function formatExecutionsToday(usage) {
70586
+ if (usage.executionsThisMonthAvailable === false) {
70587
+ return "unavailable";
70588
+ }
70589
+ const used = usage.executionsToday ?? usage.executionsThisMonth;
70590
+ return typeof used === "number" ? used.toLocaleString() : "unavailable";
70591
+ }
70536
70592
  var billingCommand = new Command26("billing").description("View billing and subscription info");
70537
70593
  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
70594
  const apiKey = await ensureAuth();
@@ -70552,11 +70608,8 @@ billingCommand.command("status").description("Show current plan and usage").opti
70552
70608
  ]);
70553
70609
  if (data.usage) {
70554
70610
  console.log();
70555
- const limit = data.usage.executionsLimit;
70556
- const used = data.usage.executionsUsed ?? 0;
70557
- const limitStr = limit ? `/${limit}` : "";
70558
70611
  printDetail("Usage", [
70559
- { label: "Executions", value: `${used}${limitStr}` }
70612
+ { label: "Executions today", value: formatExecutionsToday(data.usage) }
70560
70613
  ]);
70561
70614
  }
70562
70615
  if (data.limits) {
@@ -70592,10 +70645,7 @@ billingCommand.command("status").description("Show current plan and usage").opti
70592
70645
  { label: "Period end", value: data.currentPeriodEnd }
70593
70646
  ];
70594
70647
  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}` });
70648
+ fields.push({ label: "Executions today", value: formatExecutionsToday(data.usage) });
70599
70649
  }
70600
70650
  if (data.limits) {
70601
70651
  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.5",
4
4
  "description": "Command-line interface for Runtype AI platform",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -27,7 +27,7 @@
27
27
  "rosie-skills": "0.8.1",
28
28
  "yaml": "^2.9.0",
29
29
  "@runtypelabs/ink-components": "0.3.6",
30
- "@runtypelabs/sdk": "6.6.2",
30
+ "@runtypelabs/sdk": "7.0.0",
31
31
  "@runtypelabs/terminal-animations": "0.2.3"
32
32
  },
33
33
  "devDependencies": {
@@ -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.19.0"
47
47
  },
48
48
  "engines": {
49
49
  "node": ">=22.12.0"