@runtypelabs/cli 2.16.5 → 2.16.6

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 +1014 -34
  2. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -15732,6 +15732,213 @@ var productConfigurationSummarySchema = external_exports.object({
15732
15732
  var ORGANIZATION_INTEGRATION_PROVIDERS = ["slack", "telegram", "discord", "linear", "github"];
15733
15733
  var integrationProviderSchema = external_exports.enum(ORGANIZATION_INTEGRATION_PROVIDERS);
15734
15734
  var integrationStatusSchema = external_exports.enum(["active", "revoked", "pending"]);
15735
+ var FILTER_OPERATORS = [
15736
+ "eq",
15737
+ "neq",
15738
+ "gt",
15739
+ "gte",
15740
+ "lt",
15741
+ "lte",
15742
+ "between",
15743
+ "contains",
15744
+ "startsWith",
15745
+ "endsWith",
15746
+ "in",
15747
+ "notIn",
15748
+ "isSet",
15749
+ "isNotSet",
15750
+ "isTrue",
15751
+ "isFalse",
15752
+ "withinLastDays",
15753
+ "olderThanDays"
15754
+ ];
15755
+ var FIELD_NAME_RE = /^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$/;
15756
+ var filterFieldSchema = external_exports.string().regex(FIELD_NAME_RE, "Invalid field name");
15757
+ var recordFilterConditionSchema = external_exports.object({
15758
+ field: filterFieldSchema,
15759
+ op: external_exports.enum(FILTER_OPERATORS),
15760
+ value: external_exports.unknown().optional()
15761
+ });
15762
+ var recordFilterGroupSchema = external_exports.lazy(
15763
+ () => external_exports.object({
15764
+ op: external_exports.enum(["and", "or"]),
15765
+ conditions: external_exports.array(external_exports.union([recordFilterConditionSchema, recordFilterGroupSchema])).min(1).max(50)
15766
+ })
15767
+ );
15768
+ var recordFilterSchema = external_exports.object({
15769
+ type: external_exports.string().min(1).max(255),
15770
+ where: external_exports.union([recordFilterConditionSchema, recordFilterGroupSchema]).optional()
15771
+ });
15772
+ var MCPServerCategory = {
15773
+ COMMUNICATION: "communication",
15774
+ PRODUCTIVITY: "productivity",
15775
+ DEVELOPMENT: "development",
15776
+ PROJECT_MANAGEMENT: "project_management"
15777
+ };
15778
+ var agentSubagentConfigSchema = external_exports.object({
15779
+ /**
15780
+ * Pool of tool IDs the parent is permitted to grant to ad-hoc subagents.
15781
+ * Supports exact IDs, wildcards (`mcp:*`, `builtin:*`, `platform:*`), and
15782
+ * runtime-tool names. Must be a SUBSET of the parent's resolved tools —
15783
+ * validated at dispatch (no privilege escalation).
15784
+ */
15785
+ toolPool: external_exports.array(external_exports.string()),
15786
+ /** Default for spawned subagent loops. Default 5. */
15787
+ defaultMaxTurns: external_exports.number().optional(),
15788
+ /** Hard cap a spawned subagent can request. Default 10. */
15789
+ maxTurnsLimit: external_exports.number().optional(),
15790
+ /** Hard ceiling on total spawns per top-level parent invocation. Default 5. */
15791
+ maxSpawnsPerRun: external_exports.number().optional(),
15792
+ /** Default model for spawned subagents. Defaults to parent's model. */
15793
+ defaultModel: external_exports.string().optional(),
15794
+ /**
15795
+ * Whether a spawned subagent can itself spawn subagents. Default `false`
15796
+ * (Anthropic-aligned). Even when `true`, MAX_NESTED_DEPTH still bounds the
15797
+ * recursion tree.
15798
+ */
15799
+ allowNesting: external_exports.boolean().optional(),
15800
+ /** Default per-spawn timeout. Default 300_000 (5 min). */
15801
+ defaultTimeoutMs: external_exports.number().optional()
15802
+ });
15803
+ var codeModeConfigSchema = external_exports.object({
15804
+ /** Tool IDs available in the sandbox (subset of agent's tools, supports wildcards like `mcp:*`) */
15805
+ toolPool: external_exports.array(external_exports.string()),
15806
+ /** Optional custom description prefix for the synthesized tool */
15807
+ description: external_exports.string().optional(),
15808
+ /** Sandbox execution timeout in ms (default 60000) */
15809
+ timeoutMs: external_exports.number().optional()
15810
+ });
15811
+ var toolLimitSchema = external_exports.object({
15812
+ maxCalls: external_exports.number().optional(),
15813
+ required: external_exports.boolean().optional()
15814
+ });
15815
+ var approvalConfigSchema = external_exports.object({
15816
+ /** Tools that require user approval before execution.
15817
+ * string[]: tool names/patterns ("send_email", "mcp:*", "builtin:*")
15818
+ * true: all tools require approval
15819
+ * false/undefined: no approval required (default) */
15820
+ require: external_exports.union([external_exports.array(external_exports.string()), external_exports.boolean()]).optional(),
15821
+ /** Timeout in ms for approval response (default: 300000 = 5 min) */
15822
+ timeout: external_exports.number().optional()
15823
+ });
15824
+ var toolSearchConfigSchema = external_exports.object({
15825
+ /** Explicit opt-in/out. When omitted, auto-activates if tool count >= threshold. */
15826
+ enabled: external_exports.boolean().optional(),
15827
+ /** Tool count at which search activates (default: 20) */
15828
+ threshold: external_exports.number().optional(),
15829
+ /** Tool names or IDs that should always be in the hot set */
15830
+ alwaysLoaded: external_exports.array(external_exports.string()).optional()
15831
+ });
15832
+ var agentToolsConfigSchema = external_exports.object({
15833
+ /** IDs of tools to enable (builtin:*, mcp:*, platform:*, platform:orthogonal:*, custom tool IDs) */
15834
+ toolIds: external_exports.array(external_exports.string()).optional(),
15835
+ /** Per-tool parameter configurations, keyed by tool ID */
15836
+ toolConfigs: external_exports.record(external_exports.string(), external_exports.custom()).optional(),
15837
+ /** Inline tool definitions (no DB storage needed) */
15838
+ runtimeTools: external_exports.array(external_exports.custom()).optional(),
15839
+ /** Runtime MCP server connections */
15840
+ mcpServers: external_exports.array(external_exports.custom()).optional(),
15841
+ /** Maximum tool calls per execution (renamed from maxTurns in agents) */
15842
+ maxToolCalls: external_exports.number().optional(),
15843
+ /** Tool calling strategy */
15844
+ toolCallStrategy: external_exports.enum(["auto", "required", "none"]).optional(),
15845
+ /** Allow parallel tool execution */
15846
+ parallelCalls: external_exports.boolean().optional(),
15847
+ /** Per-tool call limits */
15848
+ perToolLimits: external_exports.record(external_exports.string(), toolLimitSchema).optional(),
15849
+ /** Human-in-the-loop approval configuration */
15850
+ approval: approvalConfigSchema.optional(),
15851
+ /**
15852
+ * Opt-in: enables agent-driven dynamic subagent spawning. When set, the
15853
+ * prompt-step tool-prep layer synthesizes a `spawn_subagent` tool into the
15854
+ * AI-SDK tool list with a dynamically-generated description listing the
15855
+ * tools the parent's LLM can grant. See `AgentSubagentConfig` for fields.
15856
+ */
15857
+ subagentConfig: agentSubagentConfigSchema.optional(),
15858
+ /**
15859
+ * Opt-in: enables a synthesized `code_mode` tool that lets agents execute
15860
+ * JavaScript code in a sandboxed V8 isolate with access to a subset of
15861
+ * the agent's tools. The LLM writes code that calls tool functions
15862
+ * deterministically instead of making individual tool calls.
15863
+ */
15864
+ codeModeConfig: codeModeConfigSchema.optional(),
15865
+ /**
15866
+ * Tool search configuration. When total tool count exceeds the threshold,
15867
+ * deferred loading activates: only a "hot set" of tools is sent to the model
15868
+ * each turn, and a synthetic `tool_search` meta-tool lets the model discover
15869
+ * and load additional tools on demand.
15870
+ *
15871
+ * Auto-activates when omitted and total tool count >= 20.
15872
+ * Set `enabled: false` to force all tools to be sent regardless of count.
15873
+ */
15874
+ toolSearch: toolSearchConfigSchema.optional()
15875
+ });
15876
+ var CreateToolSchema = external_exports.object({
15877
+ name: external_exports.string().min(1).max(100),
15878
+ description: external_exports.string().min(1).max(500),
15879
+ toolType: external_exports.enum(["flow", "custom", "external", "graphql", "mcp", "local", "subagent"]),
15880
+ parametersSchema: external_exports.record(external_exports.string(), external_exports.any()),
15881
+ config: external_exports.record(external_exports.string(), external_exports.any())
15882
+ });
15883
+ var ExecuteToolSchema = external_exports.object({
15884
+ // toolId is redundant with the URL path param (/v1/tools/:id/execute) and optional
15885
+ // so MCP/SDK callers that only send { parameters } aren't rejected at validation.
15886
+ toolId: external_exports.string().optional(),
15887
+ parameters: external_exports.record(external_exports.string(), external_exports.any()),
15888
+ context: external_exports.object({
15889
+ flowExecutionId: external_exports.string().optional(),
15890
+ stepId: external_exports.string().optional(),
15891
+ userId: external_exports.string()
15892
+ }).optional()
15893
+ });
15894
+ var contextFallbackSchema = external_exports.union([
15895
+ external_exports.object({ type: external_exports.literal("retry"), delay: external_exports.number().optional() }),
15896
+ external_exports.object({
15897
+ type: external_exports.literal("step"),
15898
+ stepType: external_exports.string(),
15899
+ stepConfig: external_exports.record(external_exports.string(), external_exports.unknown()),
15900
+ delay: external_exports.number().optional()
15901
+ }),
15902
+ external_exports.object({
15903
+ type: external_exports.literal("flow"),
15904
+ flowId: external_exports.string(),
15905
+ inputs: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
15906
+ delay: external_exports.number().optional()
15907
+ })
15908
+ ]);
15909
+ var contextErrorHandlingConfigSchema = external_exports.union([
15910
+ external_exports.enum(["fail", "continue", "default"]),
15911
+ external_exports.object({
15912
+ onError: external_exports.enum(["fail", "continue", "fallback", "default"]),
15913
+ fallbacks: external_exports.array(contextFallbackSchema).optional()
15914
+ })
15915
+ ]);
15916
+ var httpConfigSchema = external_exports.object({
15917
+ url: external_exports.string().min(1, "URL is required"),
15918
+ method: external_exports.enum(["GET", "POST", "PUT", "DELETE", "PATCH"]).optional(),
15919
+ headers: external_exports.record(external_exports.string(), external_exports.string()).optional(),
15920
+ body: external_exports.string().optional(),
15921
+ timeout: external_exports.number().optional()
15922
+ });
15923
+ var authConfigSchema = external_exports.object({
15924
+ type: external_exports.enum(["none", "bearer", "basic", "api-key", "custom"]),
15925
+ token: external_exports.string().optional(),
15926
+ username: external_exports.string().optional(),
15927
+ password: external_exports.string().optional(),
15928
+ apiKey: external_exports.string().optional(),
15929
+ headerName: external_exports.string().optional(),
15930
+ customHeaders: external_exports.record(external_exports.string(), external_exports.string()).optional()
15931
+ });
15932
+ var pdfOptionsConfigSchema = external_exports.object({
15933
+ format: external_exports.enum(["A4", "Letter"]).optional(),
15934
+ landscape: external_exports.boolean().optional(),
15935
+ margin: external_exports.object({
15936
+ top: external_exports.string().optional(),
15937
+ bottom: external_exports.string().optional(),
15938
+ left: external_exports.string().optional(),
15939
+ right: external_exports.string().optional()
15940
+ }).optional()
15941
+ });
15735
15942
  var setVariableConfigSchema = external_exports.object({
15736
15943
  variableName: external_exports.string().min(1, "Variable name is required"),
15737
15944
  // The object branch is modeled as a record (rather than the historical
@@ -15739,9 +15946,651 @@ var setVariableConfigSchema = external_exports.object({
15739
15946
  // a bare `{}` is a supertype of `string | number | boolean` and would absorb
15740
15947
  // them, degrading `value` to `{}`. A record accepts exactly the same inputs as
15741
15948
  // the prior `z.object({})` (any plain object, never an array or primitive).
15742
- value: external_exports.union([external_exports.string(), external_exports.number(), external_exports.boolean(), external_exports.record(external_exports.string(), external_exports.unknown())]),
15949
+ //
15950
+ // `null` is accepted: clearing a variable (`value: null`) is a legitimate
15951
+ // idiom (commonly the "else" branch of a conditional — `draft_email = null`,
15952
+ // `skip_label`, etc.). The runtime normalizer already permits it
15953
+ // (`context-steps-normalizer.ts` rejects only `undefined`), and the executor
15954
+ // sets the variable to `null` without issue; the schema was the only layer
15955
+ // rejecting it. Required so nested set-variable steps validate when the
15956
+ // recursive conditional union lands (see
15957
+ // `docs/features/planning/2026-06-04-conditional-nested-step-strict-validation.md`).
15958
+ value: external_exports.union([external_exports.string(), external_exports.number(), external_exports.boolean(), external_exports.null(), external_exports.record(external_exports.string(), external_exports.unknown())]),
15743
15959
  valueTemplate: external_exports.string().optional()
15744
15960
  });
15961
+ var sendStreamConfigSchema = external_exports.object({
15962
+ message: external_exports.string().min(1, "Message is required")
15963
+ });
15964
+ var fetchGithubConfigSchema = external_exports.object({
15965
+ repository: external_exports.string().min(1, "Repository is required"),
15966
+ path: external_exports.string().optional(),
15967
+ branch: external_exports.string().optional(),
15968
+ token: external_exports.string().optional(),
15969
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
15970
+ streamOutput: external_exports.boolean().optional(),
15971
+ contentType: external_exports.enum(["raw", "metadata", "both"]).optional(),
15972
+ // Ingestor service configuration
15973
+ includePatterns: external_exports.array(external_exports.string()).optional(),
15974
+ excludePatterns: external_exports.array(external_exports.string()).optional(),
15975
+ compress: external_exports.boolean().optional(),
15976
+ style: external_exports.enum(["xml", "json", "markdown"]).optional()
15977
+ });
15978
+ var apiCallConfigSchema = external_exports.object({
15979
+ http: httpConfigSchema,
15980
+ auth: authConfigSchema.optional(),
15981
+ requestTemplate: external_exports.string().optional(),
15982
+ responseMapping: external_exports.record(external_exports.string(), external_exports.string()).optional(),
15983
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
15984
+ streamOutput: external_exports.boolean().optional(),
15985
+ errorHandling: contextErrorHandlingConfigSchema.optional(),
15986
+ defaultValue: external_exports.any().optional()
15987
+ });
15988
+ var executeAgentConfigSchema = external_exports.object({
15989
+ agentId: external_exports.string().min(1, "Agent ID is required"),
15990
+ message: external_exports.string().min(1, "Message is required"),
15991
+ outputVariable: external_exports.string().optional(),
15992
+ variables: external_exports.record(external_exports.string(), external_exports.string()).optional(),
15993
+ maxTurns: external_exports.number().int().positive().optional(),
15994
+ timeout: external_exports.number().int().positive().optional(),
15995
+ errorHandling: contextErrorHandlingConfigSchema.optional(),
15996
+ defaultValue: external_exports.any().optional()
15997
+ });
15998
+ var firecrawlConfigSchema = external_exports.object({
15999
+ formats: external_exports.array(external_exports.enum(["markdown", "html", "rawHtml", "screenshot", "links", "json"])).optional(),
16000
+ actions: external_exports.array(
16001
+ external_exports.object({
16002
+ type: external_exports.enum(["click", "write", "press", "wait", "screenshot"]),
16003
+ selector: external_exports.string().optional(),
16004
+ text: external_exports.string().optional(),
16005
+ key: external_exports.string().optional(),
16006
+ milliseconds: external_exports.number().optional(),
16007
+ fullPage: external_exports.boolean().optional()
16008
+ })
16009
+ ).optional(),
16010
+ location: external_exports.object({
16011
+ country: external_exports.string().optional(),
16012
+ languages: external_exports.array(external_exports.string()).optional()
16013
+ }).optional(),
16014
+ maxAge: external_exports.number().optional(),
16015
+ storeInCache: external_exports.boolean().optional(),
16016
+ onlyMainContent: external_exports.boolean().optional(),
16017
+ // The Firecrawl executor (`apps/api/src/lib/context-steps/firecrawl-fetch.ts`)
16018
+ // accepts EITHER a JSON-schema object OR a JSON string it `JSON.parse`s at
16019
+ // runtime — so the validator must accept both, or it would reject a
16020
+ // string-form `jsonSchema` that executes correctly.
16021
+ jsonSchema: external_exports.union([external_exports.string(), external_exports.record(external_exports.string(), external_exports.unknown())]).optional(),
16022
+ jsonPrompt: external_exports.string().optional()
16023
+ });
16024
+ var fetchUrlConfigSchema = external_exports.object({
16025
+ http: httpConfigSchema,
16026
+ auth: authConfigSchema.optional(),
16027
+ responseType: external_exports.enum(["json", "text", "xml"]).optional(),
16028
+ markdownIfAvailable: external_exports.boolean().optional(),
16029
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
16030
+ streamOutput: external_exports.boolean().optional(),
16031
+ errorHandling: contextErrorHandlingConfigSchema.optional(),
16032
+ defaultValue: external_exports.any().optional(),
16033
+ // Firecrawl integration
16034
+ fetchMethod: external_exports.enum(["standard", "firecrawl"]).optional(),
16035
+ firecrawl: firecrawlConfigSchema.optional()
16036
+ });
16037
+ var crawlOptionsConfigSchema = external_exports.object({
16038
+ includePatterns: external_exports.array(external_exports.string()).optional(),
16039
+ excludePatterns: external_exports.array(external_exports.string()).optional(),
16040
+ allowSubdomains: external_exports.boolean().optional(),
16041
+ allowExternalLinks: external_exports.boolean().optional(),
16042
+ ignoreSitemap: external_exports.boolean().optional(),
16043
+ sitemapOnly: external_exports.boolean().optional()
16044
+ }).catchall(external_exports.any());
16045
+ var crawlAuthenticateConfigSchema = external_exports.object({
16046
+ username: external_exports.string().optional(),
16047
+ password: external_exports.string().optional()
16048
+ }).catchall(external_exports.any());
16049
+ var crawlJsonOptionsConfigSchema = external_exports.object({
16050
+ schema: external_exports.record(external_exports.string(), external_exports.any()).optional(),
16051
+ prompt: external_exports.string().optional()
16052
+ }).catchall(external_exports.any());
16053
+ var crawlConfigSchema = external_exports.object({
16054
+ url: external_exports.string().min(1, "URL is required"),
16055
+ limit: external_exports.number().int().positive().optional(),
16056
+ depth: external_exports.number().int().nonnegative().optional(),
16057
+ source: external_exports.string().optional(),
16058
+ formats: external_exports.array(external_exports.string()).optional(),
16059
+ render: external_exports.boolean().optional(),
16060
+ maxAge: external_exports.number().int().nonnegative().optional(),
16061
+ modifiedSince: external_exports.string().optional(),
16062
+ options: crawlOptionsConfigSchema.optional(),
16063
+ authenticate: crawlAuthenticateConfigSchema.optional(),
16064
+ cookies: external_exports.array(external_exports.record(external_exports.string(), external_exports.any())).optional(),
16065
+ setExtraHTTPHeaders: external_exports.record(external_exports.string(), external_exports.string()).optional(),
16066
+ gotoOptions: external_exports.record(external_exports.string(), external_exports.any()).optional(),
16067
+ waitForSelector: external_exports.string().optional(),
16068
+ rejectResourceTypes: external_exports.array(external_exports.string()).optional(),
16069
+ rejectRequestPattern: external_exports.union([external_exports.string(), external_exports.array(external_exports.string())]).optional(),
16070
+ userAgent: external_exports.string().optional(),
16071
+ jsonOptions: crawlJsonOptionsConfigSchema.optional(),
16072
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
16073
+ streamOutput: external_exports.boolean().optional(),
16074
+ errorHandling: contextErrorHandlingConfigSchema.optional(),
16075
+ defaultValue: external_exports.any().optional(),
16076
+ pollIntervalMs: external_exports.number().int().min(1).optional(),
16077
+ completionTimeoutMs: external_exports.number().int().positive().optional(),
16078
+ // Executor-only flag the validator previously stripped on `.parse()`; the
16079
+ // normalizer already carries it through. When true (default), crawl submits
16080
+ // and pauses the flow for async DO polling; false = legacy synchronous polling.
16081
+ asyncCrawl: external_exports.boolean().optional()
16082
+ });
16083
+ var searchConfigSchema = external_exports.object({
16084
+ provider: external_exports.string().min(1, "Search provider is required"),
16085
+ query: external_exports.string().min(1, "Search query is required"),
16086
+ temperature: external_exports.number().min(0).max(2).optional(),
16087
+ maxTokens: external_exports.number().positive().optional(),
16088
+ maxResults: external_exports.number().positive().optional(),
16089
+ returnCitations: external_exports.boolean().optional(),
16090
+ dateRange: external_exports.object({
16091
+ from: external_exports.string().optional(),
16092
+ to: external_exports.string().optional()
16093
+ }).optional(),
16094
+ allowedDomains: external_exports.array(external_exports.string()).optional(),
16095
+ blockedDomains: external_exports.array(external_exports.string()).optional(),
16096
+ userLocation: external_exports.object({
16097
+ country: external_exports.string().optional(),
16098
+ region: external_exports.string().optional()
16099
+ }).optional(),
16100
+ sources: external_exports.array(
16101
+ external_exports.object({
16102
+ type: external_exports.string(),
16103
+ country: external_exports.string().optional(),
16104
+ safeSearch: external_exports.boolean().optional(),
16105
+ xHandles: external_exports.array(external_exports.string()).optional(),
16106
+ allowedWebsites: external_exports.array(external_exports.string()).optional(),
16107
+ excludedWebsites: external_exports.array(external_exports.string()).optional()
16108
+ })
16109
+ ).optional(),
16110
+ // Exa-specific options (executor-only; previously stripped by the validator)
16111
+ exaSearchType: external_exports.enum(["auto", "neural", "keyword"]).optional(),
16112
+ exaContents: external_exports.object({
16113
+ text: external_exports.boolean().optional(),
16114
+ summary: external_exports.boolean().optional(),
16115
+ highlights: external_exports.boolean().optional()
16116
+ }).optional(),
16117
+ exaCategory: external_exports.string().optional(),
16118
+ exaNumResults: external_exports.number().optional(),
16119
+ exaIncludeDomains: external_exports.array(external_exports.string()).optional(),
16120
+ exaExcludeDomains: external_exports.array(external_exports.string()).optional(),
16121
+ exaStartCrawlDate: external_exports.string().optional(),
16122
+ exaEndCrawlDate: external_exports.string().optional(),
16123
+ exaStartPublishedDate: external_exports.string().optional(),
16124
+ exaEndPublishedDate: external_exports.string().optional(),
16125
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
16126
+ streamOutput: external_exports.boolean().optional(),
16127
+ errorHandling: contextErrorHandlingConfigSchema.optional(),
16128
+ defaultValue: external_exports.any().optional()
16129
+ });
16130
+ var sendTextConfigSchema = external_exports.object({
16131
+ from: external_exports.string().min(1, "From is required"),
16132
+ to: external_exports.string().min(1, "To is required"),
16133
+ message: external_exports.string().min(1, "Message is required"),
16134
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
16135
+ streamOutput: external_exports.boolean().optional(),
16136
+ errorHandling: contextErrorHandlingConfigSchema.optional(),
16137
+ defaultValue: external_exports.any().optional()
16138
+ });
16139
+ var sendEventConfigSchema = external_exports.object({
16140
+ provider: external_exports.enum(["posthog", "google-analytics", "amplitude", "segment"]),
16141
+ eventName: external_exports.string().min(1, "Event name is required"),
16142
+ properties: external_exports.record(external_exports.string(), external_exports.string()).optional(),
16143
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
16144
+ streamOutput: external_exports.boolean().optional(),
16145
+ errorHandling: contextErrorHandlingConfigSchema.optional(),
16146
+ defaultValue: external_exports.any().optional()
16147
+ });
16148
+ var storeAssetConfigSchema = external_exports.object({
16149
+ url: external_exports.string().min(1).optional(),
16150
+ content: external_exports.string().min(1).optional(),
16151
+ filename: external_exports.string().optional(),
16152
+ contentType: external_exports.string().optional(),
16153
+ visibility: external_exports.enum(["public", "private"]).optional(),
16154
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
16155
+ streamOutput: external_exports.boolean().optional(),
16156
+ errorHandling: contextErrorHandlingConfigSchema.optional(),
16157
+ defaultValue: external_exports.any().optional()
16158
+ });
16159
+ var generatePdfConfigSchema = external_exports.object({
16160
+ html: external_exports.string().min(1).optional(),
16161
+ markdown: external_exports.string().min(1).optional(),
16162
+ filename: external_exports.string().optional(),
16163
+ visibility: external_exports.enum(["public", "private"]).optional(),
16164
+ pdfOptions: pdfOptionsConfigSchema.optional(),
16165
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
16166
+ streamOutput: external_exports.boolean().optional(),
16167
+ errorHandling: contextErrorHandlingConfigSchema.optional(),
16168
+ defaultValue: external_exports.any().optional()
16169
+ });
16170
+ var templateConfigSchema = external_exports.object({
16171
+ template: external_exports.string().min(1, "Template body is required"),
16172
+ inputs: external_exports.record(external_exports.string(), external_exports.string()).optional(),
16173
+ outputFormat: external_exports.enum(["html", "email-html", "markdown", "pdf", "text"]),
16174
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
16175
+ partials: external_exports.record(
16176
+ external_exports.string().regex(/^[a-zA-Z_][a-zA-Z0-9_-]*$/, "Partial keys must be simple identifiers"),
16177
+ external_exports.string()
16178
+ ).optional(),
16179
+ pdfOptions: pdfOptionsConfigSchema.optional(),
16180
+ asArtifact: external_exports.boolean().optional(),
16181
+ streamOutput: external_exports.boolean().optional(),
16182
+ errorHandling: contextErrorHandlingConfigSchema.optional(),
16183
+ defaultValue: external_exports.any().optional(),
16184
+ sampleData: external_exports.array(
16185
+ external_exports.object({
16186
+ name: external_exports.string().min(1),
16187
+ data: external_exports.record(external_exports.string(), external_exports.unknown())
16188
+ })
16189
+ ).optional()
16190
+ });
16191
+ var comparisonOperatorSchema = external_exports.enum(["=", "!=", ">", "<", ">=", "<=", "exists", "not-exists"]);
16192
+ var waitUntilSuccessCriteriaSchema = external_exports.object({
16193
+ type: external_exports.enum(["status", "json_path", "body_contains", "expression"]).optional(),
16194
+ status: external_exports.number().optional(),
16195
+ statusCode: external_exports.number().optional(),
16196
+ jsonPath: external_exports.string().optional(),
16197
+ expectedValue: external_exports.any().optional(),
16198
+ operator: comparisonOperatorSchema.optional(),
16199
+ bodyContains: external_exports.string().optional(),
16200
+ expression: external_exports.string().optional()
16201
+ }).refine(
16202
+ (data) => {
16203
+ if (!data.type || data.type === "status") {
16204
+ return true;
16205
+ }
16206
+ if (data.type === "json_path") {
16207
+ return !!data.jsonPath;
16208
+ }
16209
+ if (data.type === "body_contains") {
16210
+ return !!data.bodyContains;
16211
+ }
16212
+ if (data.type === "expression") {
16213
+ return !!data.expression;
16214
+ }
16215
+ return true;
16216
+ },
16217
+ {
16218
+ message: "Success criteria is missing required fields"
16219
+ }
16220
+ );
16221
+ var waitUntilPollConfigSchema = external_exports.object({
16222
+ enabled: external_exports.boolean().optional(),
16223
+ http: httpConfigSchema,
16224
+ auth: authConfigSchema.optional(),
16225
+ intervalMs: external_exports.union([external_exports.number().int().min(100), external_exports.string().min(1)]).optional(),
16226
+ maxAttempts: external_exports.number().int().min(1).optional(),
16227
+ responseType: external_exports.enum(["json", "text"]).optional(),
16228
+ success: waitUntilSuccessCriteriaSchema.optional()
16229
+ });
16230
+ var waitUntilConfigSchema = external_exports.object({
16231
+ delayMs: external_exports.union([external_exports.number().nonnegative(), external_exports.string().min(1)]).optional(),
16232
+ poll: waitUntilPollConfigSchema.optional(),
16233
+ continueOnTimeout: external_exports.boolean().optional(),
16234
+ errorHandling: contextErrorHandlingConfigSchema.optional(),
16235
+ defaultValue: external_exports.any().optional(),
16236
+ outputVariable: external_exports.string().optional(),
16237
+ streamOutput: external_exports.boolean().optional()
16238
+ });
16239
+ var generateEmbeddingVectorStoreConfigSchema = external_exports.object({
16240
+ destination: external_exports.enum(["weaviate", "vectorize", "pinecone"]),
16241
+ weaviateConfig: external_exports.object({
16242
+ configId: external_exports.string().optional(),
16243
+ className: external_exports.string(),
16244
+ uuid: external_exports.string().optional(),
16245
+ properties: external_exports.record(external_exports.string(), external_exports.string()).optional()
16246
+ }).optional(),
16247
+ vectorizeConfig: external_exports.object({
16248
+ configId: external_exports.string().optional(),
16249
+ idTemplate: external_exports.string(),
16250
+ namespace: external_exports.string().optional(),
16251
+ metadata: external_exports.record(external_exports.string(), external_exports.string()).optional()
16252
+ }).optional(),
16253
+ pineconeConfig: external_exports.object({
16254
+ configId: external_exports.string().optional(),
16255
+ idTemplate: external_exports.string(),
16256
+ namespace: external_exports.string().optional(),
16257
+ metadata: external_exports.record(external_exports.string(), external_exports.string()).optional()
16258
+ }).optional()
16259
+ });
16260
+ var generateEmbeddingConfigSchema = external_exports.object({
16261
+ inputSource: external_exports.enum(["text", "variable", "record"]).optional().default("text"),
16262
+ text: external_exports.string().optional(),
16263
+ variableName: external_exports.string().optional(),
16264
+ recordId: external_exports.string().optional(),
16265
+ recordType: external_exports.string().optional(),
16266
+ recordName: external_exports.string().optional(),
16267
+ textField: external_exports.string().optional(),
16268
+ storeInRecord: external_exports.boolean().optional(),
16269
+ embeddingModel: external_exports.string().optional(),
16270
+ maxLength: external_exports.number().int().positive().optional(),
16271
+ inputMode: external_exports.enum(["single", "batch"]).optional(),
16272
+ inputVariable: external_exports.string().optional(),
16273
+ itemAlias: external_exports.string().optional(),
16274
+ textTemplate: external_exports.string().optional(),
16275
+ batchSize: external_exports.number().int().positive().optional(),
16276
+ vectorStore: generateEmbeddingVectorStoreConfigSchema.optional(),
16277
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
16278
+ streamOutput: external_exports.boolean().optional()
16279
+ });
16280
+ var vectorSearchConfigSchema = external_exports.object({
16281
+ query: external_exports.string().min(1, "Query is required"),
16282
+ embeddingModel: external_exports.string().optional(),
16283
+ vectorStore: external_exports.enum(["pgvector", "weaviate", "vectorize", "pinecone"]).optional(),
16284
+ weaviateConfig: external_exports.object({
16285
+ configId: external_exports.string().optional(),
16286
+ className: external_exports.string()
16287
+ }).optional(),
16288
+ vectorizeConfig: external_exports.object({
16289
+ configId: external_exports.string().optional(),
16290
+ namespace: external_exports.string().optional()
16291
+ }).optional(),
16292
+ pineconeConfig: external_exports.object({
16293
+ configId: external_exports.string().optional(),
16294
+ namespace: external_exports.string().optional()
16295
+ }).optional(),
16296
+ limit: external_exports.number().int().positive().optional(),
16297
+ threshold: external_exports.number().min(0).max(1).optional(),
16298
+ recordType: external_exports.string().optional(),
16299
+ metadataFilters: external_exports.record(external_exports.string(), external_exports.any()).optional(),
16300
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
16301
+ streamOutput: external_exports.boolean().optional(),
16302
+ includeEmbedding: external_exports.boolean().optional(),
16303
+ includeMetadata: external_exports.boolean().optional()
16304
+ });
16305
+ var toolCallConfigSchema = external_exports.object({
16306
+ toolId: external_exports.string().min(1, "Tool ID is required"),
16307
+ parameters: external_exports.record(external_exports.string(), external_exports.any()),
16308
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
16309
+ streamOutput: external_exports.boolean().optional(),
16310
+ maxRetries: external_exports.number().int().min(0).optional(),
16311
+ timeout: external_exports.number().int().positive().optional(),
16312
+ onError: external_exports.enum(["fail", "continue", "retry"]).optional()
16313
+ });
16314
+ var storeVectorConfigSchema = external_exports.object({
16315
+ vectorsSource: external_exports.string().optional(),
16316
+ inputMode: external_exports.enum(["single", "batch"]).optional(),
16317
+ inputVariable: external_exports.string().optional(),
16318
+ itemAlias: external_exports.string().optional(),
16319
+ batchSize: external_exports.number().int().positive().optional(),
16320
+ destination: external_exports.enum(["pgvector", "weaviate", "vectorize", "pinecone"]),
16321
+ weaviateConfig: external_exports.object({
16322
+ configId: external_exports.string().optional(),
16323
+ className: external_exports.string(),
16324
+ uuid: external_exports.string().optional(),
16325
+ properties: external_exports.record(external_exports.string(), external_exports.string()).optional()
16326
+ }).optional(),
16327
+ vectorizeConfig: external_exports.object({
16328
+ configId: external_exports.string().optional(),
16329
+ id: external_exports.string(),
16330
+ namespace: external_exports.string().optional(),
16331
+ metadata: external_exports.record(external_exports.string(), external_exports.string()).optional()
16332
+ }).optional(),
16333
+ pineconeConfig: external_exports.object({
16334
+ configId: external_exports.string().optional(),
16335
+ id: external_exports.string(),
16336
+ namespace: external_exports.string().optional(),
16337
+ metadata: external_exports.record(external_exports.string(), external_exports.string()).optional()
16338
+ }).optional(),
16339
+ weaviateConfigId: external_exports.string().optional(),
16340
+ weaviateClassName: external_exports.string().optional(),
16341
+ vectorizeConfigId: external_exports.string().optional(),
16342
+ vectorizeNamespace: external_exports.string().optional(),
16343
+ pineconeConfigId: external_exports.string().optional(),
16344
+ pineconeNamespace: external_exports.string().optional(),
16345
+ idTemplate: external_exports.string().optional(),
16346
+ metadata: external_exports.record(external_exports.string(), external_exports.string()).optional(),
16347
+ outputVariable: external_exports.string().optional(),
16348
+ streamOutput: external_exports.boolean().optional(),
16349
+ errorHandling: contextErrorHandlingConfigSchema.optional(),
16350
+ defaultValue: external_exports.any().optional()
16351
+ });
16352
+ var upsertRecordConfigSchema = external_exports.object({
16353
+ recordType: external_exports.string().min(1, "Record type is required"),
16354
+ recordName: external_exports.string().optional(),
16355
+ sourceVariable: external_exports.string().min(1, "Source variable is required"),
16356
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
16357
+ streamOutput: external_exports.boolean().optional(),
16358
+ mergeStrategy: external_exports.enum(["merge", "replace"]).optional(),
16359
+ errorHandling: contextErrorHandlingConfigSchema.optional(),
16360
+ defaultValue: external_exports.any().optional(),
16361
+ contentField: external_exports.string().optional(),
16362
+ inputMode: external_exports.enum(["single", "batch"]).optional(),
16363
+ inputVariable: external_exports.string().optional(),
16364
+ itemAlias: external_exports.string().optional(),
16365
+ metadataMapping: external_exports.record(external_exports.string(), external_exports.string()).optional(),
16366
+ batchSize: external_exports.number().int().positive().optional()
16367
+ });
16368
+ var sendEmailConfigSchema = external_exports.object({
16369
+ from: external_exports.string().optional(),
16370
+ to: external_exports.string().min(1, "To recipients are required"),
16371
+ subject: external_exports.string().min(1, "Subject is required"),
16372
+ replyTo: external_exports.string().optional(),
16373
+ cc: external_exports.string().optional(),
16374
+ bcc: external_exports.string().optional(),
16375
+ html: external_exports.string().optional(),
16376
+ text: external_exports.string().optional(),
16377
+ attachments: external_exports.array(
16378
+ external_exports.object({
16379
+ filename: external_exports.string(),
16380
+ content: external_exports.string(),
16381
+ contentType: external_exports.string().optional()
16382
+ })
16383
+ ).optional(),
16384
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
16385
+ streamOutput: external_exports.boolean().optional(),
16386
+ errorHandling: contextErrorHandlingConfigSchema.optional(),
16387
+ defaultValue: external_exports.any().optional()
16388
+ });
16389
+ var paginateApiConfigSchema = external_exports.object({
16390
+ // API configuration (supports both the detailed `url` and the UI `http` format)
16391
+ url: external_exports.string().optional(),
16392
+ http: external_exports.object({
16393
+ url: external_exports.string().min(1),
16394
+ method: external_exports.enum(["GET", "POST", "PUT", "DELETE", "PATCH"]).optional(),
16395
+ headers: external_exports.record(external_exports.string(), external_exports.string()).optional(),
16396
+ body: external_exports.string().optional(),
16397
+ timeout: external_exports.number().optional()
16398
+ }).optional(),
16399
+ method: external_exports.enum(["GET", "POST"]).optional(),
16400
+ headers: external_exports.record(external_exports.string(), external_exports.string()).optional(),
16401
+ body: external_exports.string().optional(),
16402
+ // Authentication — `api_key` is a string literal value (snake_case wire token),
16403
+ // not an object key, so it needs no `@snake-case-ok` decorator.
16404
+ authType: external_exports.enum(["none", "bearer", "api_key", "basic", "oauth2"]).optional(),
16405
+ authConfig: external_exports.object({
16406
+ bearerToken: external_exports.string().optional(),
16407
+ apiKeyHeader: external_exports.string().optional(),
16408
+ apiKeyValue: external_exports.string().optional(),
16409
+ basicUsername: external_exports.string().optional(),
16410
+ basicPassword: external_exports.string().optional(),
16411
+ oauth2TokenUrl: external_exports.string().optional(),
16412
+ oauth2ClientId: external_exports.string().optional(),
16413
+ oauth2ClientSecret: external_exports.string().optional(),
16414
+ oauth2Scopes: external_exports.array(external_exports.string()).optional()
16415
+ }).optional(),
16416
+ paginationType: external_exports.enum(["cursor", "offset", "page", "link_header"]).optional(),
16417
+ paginationConfig: external_exports.object({
16418
+ cursorPath: external_exports.string().optional(),
16419
+ cursorParam: external_exports.string().optional(),
16420
+ offsetParam: external_exports.string().optional(),
16421
+ limitParam: external_exports.string().optional(),
16422
+ limit: external_exports.number().int().positive().optional(),
16423
+ totalPath: external_exports.string().optional(),
16424
+ pageParam: external_exports.string().optional(),
16425
+ perPageParam: external_exports.string().optional(),
16426
+ perPage: external_exports.number().int().positive().optional(),
16427
+ totalPagesPath: external_exports.string().optional()
16428
+ }).optional(),
16429
+ // Simplified (UI) pagination settings
16430
+ pageSize: external_exports.number().int().positive().optional(),
16431
+ maxPages: external_exports.number().int().positive().optional(),
16432
+ offsetParam: external_exports.string().optional(),
16433
+ limitParam: external_exports.string().optional(),
16434
+ cursorParam: external_exports.string().optional(),
16435
+ cursorPath: external_exports.string().optional(),
16436
+ pageParam: external_exports.string().optional(),
16437
+ startPage: external_exports.number().int().optional(),
16438
+ // Entity extraction
16439
+ entitiesPath: external_exports.string().optional(),
16440
+ entityPath: external_exports.string().optional(),
16441
+ entityIdPath: external_exports.string().optional(),
16442
+ // Safety limits + rate limiting
16443
+ maxEntities: external_exports.number().int().positive().optional(),
16444
+ requestDelayMs: external_exports.number().int().nonnegative().optional(),
16445
+ retryOnRateLimit: external_exports.boolean().optional(),
16446
+ maxRetries: external_exports.number().int().min(0).optional(),
16447
+ // Output
16448
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
16449
+ includeMetadata: external_exports.boolean().optional(),
16450
+ streamOutput: external_exports.boolean().optional(),
16451
+ errorHandling: contextErrorHandlingConfigSchema.optional(),
16452
+ defaultValue: external_exports.any().optional()
16453
+ });
16454
+ var retrieveRecordConfigSchema = external_exports.object({
16455
+ retrievalMode: external_exports.enum(["id", "query"]).optional(),
16456
+ recordType: external_exports.string().optional(),
16457
+ recordName: external_exports.string().optional(),
16458
+ recordId: external_exports.string().optional(),
16459
+ // Chip-based filter for richer query mode (metadata + top-level columns).
16460
+ // Coexists with recordType/recordName so old saved flows keep working;
16461
+ // when both are present, recordFilter wins in the executor.
16462
+ recordFilter: recordFilterSchema.optional(),
16463
+ fieldsToInclude: external_exports.string().optional(),
16464
+ fieldsToExclude: external_exports.string().optional(),
16465
+ availableFields: external_exports.array(external_exports.string()).optional(),
16466
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
16467
+ fields: external_exports.array(external_exports.string()).optional(),
16468
+ includeMetadata: external_exports.boolean().optional(),
16469
+ streamOutput: external_exports.boolean().optional()
16470
+ });
16471
+ var updateRecordConfigSchema = external_exports.object({
16472
+ recordId: external_exports.string().optional(),
16473
+ recordType: external_exports.string().optional(),
16474
+ recordName: external_exports.string().optional(),
16475
+ // Same chip filter as retrieve-record. Executor takes the first match
16476
+ // (ordered by updatedAt desc). Validate-time check rejects malformed
16477
+ // filters early instead of waiting for the compiler at execute time.
16478
+ recordFilter: recordFilterSchema.optional(),
16479
+ updates: external_exports.record(external_exports.string(), external_exports.any()),
16480
+ updatesTemplate: external_exports.string().optional(),
16481
+ mergeStrategy: external_exports.enum(["merge", "replace", "deep-merge"]),
16482
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
16483
+ streamOutput: external_exports.boolean().optional(),
16484
+ includeFullRecord: external_exports.boolean().optional(),
16485
+ errorHandling: contextErrorHandlingConfigSchema.optional(),
16486
+ defaultValue: external_exports.any().optional()
16487
+ });
16488
+ var transformDataNetworkAccessSchema = external_exports.union([
16489
+ external_exports.literal("off"),
16490
+ external_exports.literal("on"),
16491
+ external_exports.object({ allowedHostnames: external_exports.array(external_exports.string()).min(1) })
16492
+ ]);
16493
+ var transformDataConfigSchema = external_exports.object({
16494
+ // Not used at runtime — all flow variables are passed to the script regardless.
16495
+ inputVariables: external_exports.array(external_exports.string()).optional(),
16496
+ script: external_exports.string().min(1, "Script is required"),
16497
+ outputVariable: external_exports.string().min(1, "Output variable is required"),
16498
+ streamOutput: external_exports.boolean().optional(),
16499
+ sandboxProvider: external_exports.enum(["quickjs", "daytona", "cloudflare-worker", "runtype-sandbox", "cloudflare-sandbox"]).optional(),
16500
+ language: external_exports.enum(["javascript", "typescript", "python"]).optional(),
16501
+ // `inputMode: 'variable'` resolves `script` (and `packageJson`) as a template
16502
+ // before execution; `'code'` (default) treats `script` as literal source.
16503
+ inputMode: external_exports.enum(["code", "variable"]).optional(),
16504
+ // package.json content (daytona / runtype-sandbox); respects `inputMode`.
16505
+ packageJson: external_exports.string().optional(),
16506
+ // Sandbox persistence (daytona / runtype-sandbox).
16507
+ persistSandbox: external_exports.boolean().optional(),
16508
+ reuseSandboxId: external_exports.string().optional(),
16509
+ networkAccess: transformDataNetworkAccessSchema.optional(),
16510
+ errorHandling: contextErrorHandlingConfigSchema.optional(),
16511
+ defaultValue: external_exports.any().optional(),
16512
+ // Tool access for code steps (cloudflare-worker sandbox only). Narrow 4-field
16513
+ // shape the validator has always accepted; the full tool shapes are validated
16514
+ // by the runtime-tools layer.
16515
+ tools: external_exports.object({
16516
+ toolIds: external_exports.array(external_exports.string()).optional(),
16517
+ toolConfigs: external_exports.record(external_exports.string(), external_exports.any()).optional(),
16518
+ runtimeTools: external_exports.array(external_exports.any()).optional(),
16519
+ mcpServers: external_exports.array(external_exports.any()).optional()
16520
+ }).optional()
16521
+ });
16522
+ var promptMessageSchema = external_exports.object({
16523
+ role: external_exports.enum(["system", "user", "assistant"]),
16524
+ content: external_exports.union([external_exports.string(), external_exports.array(external_exports.unknown())])
16525
+ });
16526
+ var promptPreviousMessagesSchema = external_exports.union([external_exports.string(), external_exports.array(promptMessageSchema)]);
16527
+ var promptFallbackSchema = external_exports.union([
16528
+ external_exports.object({ type: external_exports.literal("retry"), delay: external_exports.number().optional() }),
16529
+ external_exports.object({
16530
+ type: external_exports.literal("model"),
16531
+ model: external_exports.string(),
16532
+ temperature: external_exports.number().optional(),
16533
+ maxTokens: external_exports.number().optional(),
16534
+ topP: external_exports.number().optional(),
16535
+ topK: external_exports.number().optional(),
16536
+ frequencyPenalty: external_exports.number().optional(),
16537
+ presencePenalty: external_exports.number().optional(),
16538
+ seed: external_exports.number().optional(),
16539
+ delay: external_exports.number().optional()
16540
+ }),
16541
+ external_exports.object({ type: external_exports.literal("message"), message: external_exports.string(), delay: external_exports.number().optional() })
16542
+ ]);
16543
+ var promptFallbackTriggerSchema = external_exports.union([
16544
+ external_exports.object({ type: external_exports.literal("error") }),
16545
+ external_exports.object({ type: external_exports.literal("empty-output") }),
16546
+ external_exports.object({ type: external_exports.literal("slow"), afterMs: external_exports.number().optional() })
16547
+ ]);
16548
+ var promptErrorHandlingConfigSchema = external_exports.union([
16549
+ external_exports.enum(["fail", "continue", "fallback", "default"]),
16550
+ external_exports.object({
16551
+ onError: external_exports.enum(["fail", "continue", "fallback"]),
16552
+ fallbacks: external_exports.array(promptFallbackSchema).optional(),
16553
+ triggers: external_exports.array(promptFallbackTriggerSchema).optional()
16554
+ })
16555
+ ]);
16556
+ var promptConfigSchema = external_exports.object({
16557
+ // Validation only requires a non-empty string here. The non-blocking
16558
+ // model-advisory pass in `flow-validator.ts` (`collectModelAdvisoryIssues`)
16559
+ // additionally emits warnings/recommendations for deprecated, non-routed,
16560
+ // capability-mismatched, or not-enabled models — sourced from the model
16561
+ // registry. Keep that pass in lockstep per `.claude/rules/flow-validation.md`.
16562
+ model: external_exports.string().min(1, "Model is required"),
16563
+ text: external_exports.string().optional(),
16564
+ userPrompt: external_exports.string().optional(),
16565
+ systemPrompt: external_exports.string().optional(),
16566
+ responseFormat: external_exports.enum(["default", "json", "markdown", "html", "xml", "text"]).optional(),
16567
+ outputVariable: external_exports.string().optional(),
16568
+ temperature: external_exports.number().min(0).max(2).optional(),
16569
+ maxTokens: external_exports.number().positive().optional(),
16570
+ topP: external_exports.number().min(0).max(1).optional(),
16571
+ topK: external_exports.number().int().min(1).max(500).optional(),
16572
+ frequencyPenalty: external_exports.number().min(-2).max(2).optional(),
16573
+ presencePenalty: external_exports.number().min(-2).max(2).optional(),
16574
+ seed: external_exports.number().int().optional(),
16575
+ // Canonical object form is the Phase-1 `agentToolsConfigSchema`. The
16576
+ // `z.array(z.unknown())` arm preserves a legacy ARRAY `tools` shape
16577
+ // (`[{ toolId }]` / `string[]`) that predates the object form — it exists in
16578
+ // production (1 live flow + 6 version snapshots) and validated under the prior
16579
+ // `z.any()`, so the union keeps it accepted rather than newly rejecting it. The
16580
+ // runtime's tool resolver reads object keys, so an array `tools` resolves to no
16581
+ // tools (unchanged behavior). Object inputs always match the first arm.
16582
+ tools: external_exports.union([agentToolsConfigSchema, external_exports.array(external_exports.unknown())]).optional(),
16583
+ artifacts: external_exports.object({
16584
+ enabled: external_exports.literal(true),
16585
+ types: external_exports.array(external_exports.enum(["markdown", "component"])).min(1)
16586
+ }).optional(),
16587
+ reasoning: external_exports.boolean().optional(),
16588
+ previousMessages: promptPreviousMessagesSchema.optional(),
16589
+ streamOutput: external_exports.boolean().optional(),
16590
+ errorHandling: promptErrorHandlingConfigSchema.optional(),
16591
+ mode: external_exports.string().optional()
16592
+ // UI mode (task, agent, etc.)
16593
+ });
15745
16594
  var SERIALIZED_HELPERS_SOURCE = `
15746
16595
  // Transform helper functions (from packages/shared/src/transform-helpers.ts)
15747
16596
  const helpers = (function createHelpers() {
@@ -16130,30 +16979,6 @@ function resolveModelSecretNames(model) {
16130
16979
  }
16131
16980
  return [];
16132
16981
  }
16133
- var MCPServerCategory = {
16134
- COMMUNICATION: "communication",
16135
- PRODUCTIVITY: "productivity",
16136
- DEVELOPMENT: "development",
16137
- PROJECT_MANAGEMENT: "project_management"
16138
- };
16139
- var CreateToolSchema = external_exports.object({
16140
- name: external_exports.string().min(1).max(100),
16141
- description: external_exports.string().min(1).max(500),
16142
- toolType: external_exports.enum(["flow", "custom", "external", "graphql", "mcp", "local", "subagent"]),
16143
- parametersSchema: external_exports.record(external_exports.string(), external_exports.any()),
16144
- config: external_exports.record(external_exports.string(), external_exports.any())
16145
- });
16146
- var ExecuteToolSchema = external_exports.object({
16147
- // toolId is redundant with the URL path param (/v1/tools/:id/execute) and optional
16148
- // so MCP/SDK callers that only send { parameters } aren't rejected at validation.
16149
- toolId: external_exports.string().optional(),
16150
- parameters: external_exports.record(external_exports.string(), external_exports.any()),
16151
- context: external_exports.object({
16152
- flowExecutionId: external_exports.string().optional(),
16153
- stepId: external_exports.string().optional(),
16154
- userId: external_exports.string()
16155
- }).optional()
16156
- });
16157
16982
  var EMIT_ARTIFACT_MARKDOWN_TOOL_ID = "emit_artifact_markdown";
16158
16983
  var EMIT_ARTIFACT_COMPONENT_TOOL_ID = "emit_artifact_component";
16159
16984
  var EMIT_ARTIFACT_MARKDOWN_FULL_ID = `builtin:${EMIT_ARTIFACT_MARKDOWN_TOOL_ID}`;
@@ -27155,7 +27980,8 @@ var BuiltInToolCategory = {
27155
27980
  COMMERCE: "commerce",
27156
27981
  BROWSER: "browser",
27157
27982
  SANDBOX: "sandbox",
27158
- MESSAGING: "messaging"
27983
+ MESSAGING: "messaging",
27984
+ TEMPORAL: "temporal"
27159
27985
  };
27160
27986
  var BuiltInToolIdPrefix = {
27161
27987
  BUILTIN: "builtin",
@@ -27170,7 +27996,8 @@ var BuiltInToolGroup = {
27170
27996
  RECORD_MANAGEMENT: "record_management",
27171
27997
  UCP_COMMERCE: "ucp_commerce",
27172
27998
  SANDBOX_USE: "sandbox_use",
27173
- SANDBOX_SESSION: "sandbox_session"
27999
+ SANDBOX_SESSION: "sandbox_session",
28000
+ TEMPORAL: "temporal"
27174
28001
  };
27175
28002
  var BROWSER_RUN_DOCUMENTATION_URL = "https://developers.cloudflare.com/browser-run/quick-actions/";
27176
28003
  var BROWSER_SESSION_DOCUMENTATION_URL = "https://developers.cloudflare.com/browser-run/cdp/";
@@ -28728,6 +29555,133 @@ var CORE_BUILTIN_TOOLS_REGISTRY = [
28728
29555
  executionHint: "platform",
28729
29556
  hidden: true
28730
29557
  },
29558
+ // Temporal — ground the agent in real-world time. Platform-executed, stateless,
29559
+ // provider-agnostic. Timezone defaults follow a layered precedence resolved
29560
+ // api-side (call param > conversation timezone > agent default > UTC).
29561
+ {
29562
+ id: "get_current_time",
29563
+ name: "Get Current Time",
29564
+ description: 'Get the current date and time. LLMs have no clock and no sense of "now" beyond their training cutoff \u2014 call this whenever the current date/time matters. Returns the instant in a specific IANA timezone (e.g. "America/New_York", "Asia/Tokyo"). When `timezone` is omitted, the resolved default is used (the conversation\'s timezone if set, otherwise the agent default, otherwise UTC). Returns ISO 8601 (UTC), plus the local date, 24-hour time, year/month/day, weekday name, Unix seconds, and the resolved timezone.',
29565
+ category: BuiltInToolCategory.TEMPORAL,
29566
+ toolGroup: BuiltInToolGroup.TEMPORAL,
29567
+ providers: [BuiltInToolProvider.MULTI],
29568
+ parametersSchema: {
29569
+ type: "object",
29570
+ properties: {
29571
+ timezone: {
29572
+ type: "string",
29573
+ description: 'Optional IANA timezone name (e.g. "America/New_York", "Europe/London", "Asia/Tokyo"). Defaults to the resolved zone (conversation > agent default > UTC). Invalid zones fall back to UTC.'
29574
+ }
29575
+ },
29576
+ required: []
29577
+ },
29578
+ executionHint: "platform",
29579
+ requiresApiKey: false
29580
+ },
29581
+ {
29582
+ id: "convert_time",
29583
+ name: "Convert Time Between Zones",
29584
+ description: 'Convert a wall-clock time from one IANA timezone to another, with daylight-saving handled automatically. Provide `time` as "YYYY-MM-DD HH:mm" or "HH:mm" (today is assumed when the date is omitted), plus the source and target IANA timezones. Returns the rendered local time in each zone and the whole-hour offset between them.',
29585
+ category: BuiltInToolCategory.TEMPORAL,
29586
+ toolGroup: BuiltInToolGroup.TEMPORAL,
29587
+ providers: [BuiltInToolProvider.MULTI],
29588
+ parametersSchema: {
29589
+ type: "object",
29590
+ properties: {
29591
+ time: {
29592
+ type: "string",
29593
+ description: 'The wall-clock time to convert, as "YYYY-MM-DD HH:mm[:ss]" or "HH:mm[:ss]" (the current date in the source zone is assumed when only a time is given).'
29594
+ },
29595
+ sourceTimezone: {
29596
+ type: "string",
29597
+ description: 'IANA timezone the `time` is expressed in (e.g. "America/New_York").'
29598
+ },
29599
+ targetTimezone: {
29600
+ type: "string",
29601
+ description: 'IANA timezone to convert the `time` into (e.g. "Asia/Tokyo").'
29602
+ }
29603
+ },
29604
+ required: ["time", "sourceTimezone", "targetTimezone"]
29605
+ },
29606
+ executionHint: "platform",
29607
+ requiresApiKey: false
29608
+ },
29609
+ {
29610
+ id: "time_difference",
29611
+ name: "Time Difference",
29612
+ description: 'Compute the elapsed time between two instants \u2014 a stopwatch for the agent. Provide `from` (ISO 8601 / RFC 3339); `to` defaults to now if omitted. Returns the signed duration in milliseconds, a `direction` of "past" or "future" (relative to `from`), and a humanized string like "6 hours 30 minutes".',
29613
+ category: BuiltInToolCategory.TEMPORAL,
29614
+ toolGroup: BuiltInToolGroup.TEMPORAL,
29615
+ providers: [BuiltInToolProvider.MULTI],
29616
+ parametersSchema: {
29617
+ type: "object",
29618
+ properties: {
29619
+ from: {
29620
+ type: "string",
29621
+ description: 'Start instant, ISO 8601 / RFC 3339 (e.g. "2026-06-03T12:00:00Z").'
29622
+ },
29623
+ to: {
29624
+ type: "string",
29625
+ description: "End instant, ISO 8601 / RFC 3339. Defaults to the current time when omitted."
29626
+ }
29627
+ },
29628
+ required: ["from"]
29629
+ },
29630
+ executionHint: "platform",
29631
+ requiresApiKey: false
29632
+ },
29633
+ {
29634
+ id: "set_timezone",
29635
+ name: "Set Conversation Timezone",
29636
+ description: `Remember the user's timezone for this conversation. Call this once you learn where the user is (e.g. they say "I'm in Tokyo" or mention a local time), passing the matching IANA timezone (e.g. "Asia/Tokyo"). From then on the time tools and any time-awareness context default to their local zone. Only meaningful inside a conversation.`,
29637
+ category: BuiltInToolCategory.TEMPORAL,
29638
+ toolGroup: BuiltInToolGroup.TEMPORAL,
29639
+ providers: [BuiltInToolProvider.MULTI],
29640
+ parametersSchema: {
29641
+ type: "object",
29642
+ properties: {
29643
+ timezone: {
29644
+ type: "string",
29645
+ description: `The user's IANA timezone name (e.g. "America/New_York", "Asia/Tokyo", "Europe/London").`
29646
+ }
29647
+ },
29648
+ required: ["timezone"]
29649
+ },
29650
+ executionHint: "platform",
29651
+ requiresApiKey: false
29652
+ },
29653
+ {
29654
+ id: "set_reminder",
29655
+ name: "Set Reminder",
29656
+ description: 'Schedule yourself to run again later with a follow-up message \u2014 a durable "wake me later". Provide a `message` (the instruction you\'ll receive when it fires) plus exactly one of `at` (an absolute RFC 3339 / ISO 8601 timestamp, e.g. "2026-06-04T09:00:00Z") or `inSeconds` (a relative delay, e.g. 3600 for one hour). Optionally pass `timezone` to interpret a zone-less `at`. The reminder runs as a one-time scheduled execution of this same agent; when it fires you receive the message and can act on it (including reaching out to the user via your messaging or email tools). Only available to agents (not standalone flow steps).',
29657
+ category: BuiltInToolCategory.TEMPORAL,
29658
+ toolGroup: BuiltInToolGroup.TEMPORAL,
29659
+ providers: [BuiltInToolProvider.MULTI],
29660
+ parametersSchema: {
29661
+ type: "object",
29662
+ properties: {
29663
+ message: {
29664
+ type: "string",
29665
+ description: "The follow-up instruction delivered to you when the reminder fires (becomes the kickoff message of the scheduled run)."
29666
+ },
29667
+ at: {
29668
+ type: "string",
29669
+ description: 'Absolute fire time, RFC 3339 / ISO 8601 (e.g. "2026-06-04T09:00:00Z"). Provide this OR `inSeconds`, not both.'
29670
+ },
29671
+ inSeconds: {
29672
+ type: "number",
29673
+ description: "Relative delay in seconds from now (e.g. 3600 = one hour). Provide this OR `at`, not both."
29674
+ },
29675
+ timezone: {
29676
+ type: "string",
29677
+ description: 'IANA timezone used to interpret a zone-less `at` value (e.g. "America/New_York"). Ignored when `at` already carries an offset or `inSeconds` is used.'
29678
+ }
29679
+ },
29680
+ required: ["message"]
29681
+ },
29682
+ executionHint: "platform",
29683
+ requiresApiKey: false
29684
+ },
28731
29685
  // Asset Storage — mirror files onto Runtype's CDN from a URL or inline bytes
28732
29686
  {
28733
29687
  id: "store_asset",
@@ -32529,6 +33483,9 @@ var MODEL_FAMILY_PROVIDER_IDS = {
32529
33483
  "nemotron-3-super-120b-a12b": {
32530
33484
  "vercel": "nvidia/nemotron-3-super-120b-a12b"
32531
33485
  },
33486
+ "nemotron-3-ultra-550b-a55b": {
33487
+ "vercel": "nvidia/nemotron-3-ultra-550b-a55b"
33488
+ },
32532
33489
  "nemotron-nano-12b-v2-vl": {
32533
33490
  "vercel": "nvidia/nemotron-nano-12b-v2-vl"
32534
33491
  },
@@ -33777,12 +34734,28 @@ var artifactConfigSchema = external_exports.object({
33777
34734
  enabled: external_exports.literal(true),
33778
34735
  types: external_exports.array(external_exports.enum(["markdown", "component"])).min(1)
33779
34736
  });
34737
+ var temporalConfigSchema = external_exports.object({
34738
+ injectElapsed: external_exports.boolean().optional(),
34739
+ elapsedThresholdSeconds: external_exports.number().int().min(0).optional(),
34740
+ groundNow: external_exports.boolean().optional(),
34741
+ timezone: external_exports.string().optional()
34742
+ });
33780
34743
  var agentRuntimeConfigSchema = external_exports.object({
33781
34744
  model: external_exports.string().optional(),
33782
34745
  systemPrompt: external_exports.string().optional(),
33783
34746
  temperature: external_exports.number().min(0).max(2).optional(),
33784
34747
  ...samplingConfigSchema,
33785
- // Unified tools configuration (nested under 'tools')
34748
+ // Unified tools configuration (nested under 'tools').
34749
+ //
34750
+ // This is the **createAgent / FPO-v2 create-form** projection of the canonical
34751
+ // `agentToolsConfigSchema` (`tool-types.ts`). It is kept separate on purpose —
34752
+ // it carries create-time constraints (`.int().min().max()`), a create-form
34753
+ // `runtimeTools.toolType` enum (`advisor`/`search` instead of the canonical
34754
+ // `RuntimeToolDefinition` union), and does NOT yet accept `toolSearch`.
34755
+ // Collapsing it onto the canonical leaves would change createAgent validation,
34756
+ // so the two are pinned by review + the planning doc rather than a shared
34757
+ // import. Adding `toolSearch` here (to match the canonical schema + the runtime
34758
+ // wire form) is a tracked follow-up.
33786
34759
  tools: external_exports.object({
33787
34760
  toolIds: external_exports.array(external_exports.string()).optional(),
33788
34761
  toolConfigs: external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), external_exports.unknown())).optional(),
@@ -33874,7 +34847,14 @@ var agentRuntimeConfigSchema = external_exports.object({
33874
34847
  }).optional()
33875
34848
  }).optional(),
33876
34849
  errorHandling: errorHandlingSchema,
33877
- loggingPolicy: external_exports.enum(["default", "on", "off"]).optional()
34850
+ loggingPolicy: external_exports.enum(["default", "on", "off"]).optional(),
34851
+ // Opt-in temporal awareness. `injectElapsed` turns on the automatic
34852
+ // "time has passed" decorator (a `<temporal_context>` block prepended to
34853
+ // the user turn at dispatch, gated on turn ≥ 2 and a gap ≥
34854
+ // `elapsedThresholdSeconds`). `groundNow` additionally surfaces the current
34855
+ // datetime in that block. `timezone` is the agent's DEFAULT IANA zone —
34856
+ // the layered tool/decorator resolution overrides it per-conversation.
34857
+ temporal: temporalConfigSchema.optional()
33878
34858
  });
33879
34859
  var SECRET_REF_PATTERN = /\{\{secret:([A-Z][A-Z0-9_]*[A-Z0-9])\}\}/g;
33880
34860
  function extractSecretReferences(template) {
@@ -33939,7 +34919,7 @@ var agentToolSchema = external_exports.object({
33939
34919
  description: external_exports.string().optional(),
33940
34920
  config: external_exports.record(external_exports.string(), external_exports.any()).optional()
33941
34921
  });
33942
- var agentSubagentConfigSchema = external_exports.object({
34922
+ var agentSubagentConfigSchema2 = external_exports.object({
33943
34923
  toolPool: external_exports.array(external_exports.string()).optional(),
33944
34924
  defaultMaxTurns: external_exports.number().int().positive().optional(),
33945
34925
  maxSpawnsPerRun: external_exports.number().int().positive().optional(),
@@ -34009,7 +34989,7 @@ var agentMcpServerSchema = external_exports.object({
34009
34989
  transport: external_exports.enum(["streamable_http", "rest"]).optional(),
34010
34990
  enabled: external_exports.boolean().optional()
34011
34991
  });
34012
- var agentToolsConfigSchema = external_exports.object({
34992
+ var agentToolsConfigSchema2 = external_exports.object({
34013
34993
  toolIds: external_exports.array(external_exports.string()).optional(),
34014
34994
  toolConfigs: external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), external_exports.any())).optional(),
34015
34995
  runtimeTools: external_exports.array(external_exports.object({
@@ -34031,7 +35011,7 @@ var agentToolsConfigSchema = external_exports.object({
34031
35011
  maxCalls: external_exports.number().int().positive().optional(),
34032
35012
  required: external_exports.boolean().optional()
34033
35013
  })).optional(),
34034
- subagentConfig: agentSubagentConfigSchema.optional(),
35014
+ subagentConfig: agentSubagentConfigSchema2.optional(),
34035
35015
  codeModeConfig: external_exports.object({
34036
35016
  toolPool: external_exports.array(external_exports.string()).optional(),
34037
35017
  description: external_exports.string().optional(),
@@ -34071,7 +35051,7 @@ var agentDefinitionSchema = external_exports.object({
34071
35051
  seed: external_exports.number().int().optional(),
34072
35052
  // Tools — legacy simple array, or the full config object
34073
35053
  tools: external_exports.array(agentToolSchema).optional(),
34074
- toolsConfig: agentToolsConfigSchema.optional(),
35054
+ toolsConfig: agentToolsConfigSchema2.optional(),
34075
35055
  // Advanced config
34076
35056
  loopConfig: agentLoopConfigSchema.optional(),
34077
35057
  reasoning: external_exports.union([external_exports.boolean(), agentReasoningConfigSchema]).optional(),
@@ -34082,7 +35062,7 @@ var agentDefinitionSchema = external_exports.object({
34082
35062
  model: external_exports.string(),
34083
35063
  systemPrompt: external_exports.string().optional()
34084
35064
  }).optional(),
34085
- subagentConfig: agentSubagentConfigSchema.optional(),
35065
+ subagentConfig: agentSubagentConfigSchema2.optional(),
34086
35066
  capabilityToolRefs: external_exports.array(capabilityToolRefSchema).optional(),
34087
35067
  // External / managed agent configs
34088
35068
  externalConfig: agentExternalConfigSchema.optional(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runtypelabs/cli",
3
- "version": "2.16.5",
3
+ "version": "2.16.6",
4
4
  "description": "Command-line interface for Runtype AI platform",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -20,9 +20,9 @@
20
20
  "react": "^19.2.4",
21
21
  "micromatch": "^4.0.8",
22
22
  "rosie-skills": "0.8.1",
23
- "yaml": "^2.8.3",
23
+ "yaml": "^2.9.0",
24
24
  "@runtypelabs/ink-components": "0.3.2",
25
- "@runtypelabs/sdk": "4.0.3",
25
+ "@runtypelabs/sdk": "4.0.4",
26
26
  "@runtypelabs/terminal-animations": "0.2.1"
27
27
  },
28
28
  "devDependencies": {
@@ -36,7 +36,7 @@
36
36
  "tsx": "^4.7.1",
37
37
  "typescript": "^5.3.3",
38
38
  "vitest": "^4.1.0",
39
- "@runtypelabs/shared": "1.9.0"
39
+ "@runtypelabs/shared": "1.10.2"
40
40
  },
41
41
  "engines": {
42
42
  "node": ">=22.0.0"