@codemation/core-nodes 0.7.0 → 0.8.0

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 (54) hide show
  1. package/CHANGELOG.md +212 -0
  2. package/LICENSE +1 -37
  3. package/dist/index.cjs +962 -70
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.d.cts +537 -61
  6. package/dist/index.d.ts +537 -61
  7. package/dist/index.js +941 -69
  8. package/dist/index.js.map +1 -1
  9. package/dist/metadata.json +162 -0
  10. package/package.json +4 -3
  11. package/src/authoring/defineRestNode.types.ts +17 -2
  12. package/src/chatModels/CodemationChatModelConfig.ts +47 -0
  13. package/src/chatModels/CodemationChatModelFactory.ts +103 -0
  14. package/src/chatModels/ManagedModelFetcher.ts +23 -0
  15. package/src/http/HttpRequestExecutor.ts +10 -2
  16. package/src/http/SSRFBlockedError.ts +16 -0
  17. package/src/http/SsrfGuard.ts +141 -0
  18. package/src/http/httpRequest.types.ts +6 -0
  19. package/src/index.ts +4 -0
  20. package/src/nodes/AIAgentConfig.ts +66 -0
  21. package/src/nodes/AIAgentNode.ts +205 -27
  22. package/src/nodes/BM25Index.ts +90 -0
  23. package/src/nodes/CallbackNodeFactory.ts +7 -0
  24. package/src/nodes/CronTriggerFactory.ts +9 -1
  25. package/src/nodes/DeferredMetaToolStrategy.ts +200 -0
  26. package/src/nodes/DeferredMetaToolStrategyFactory.ts +18 -0
  27. package/src/nodes/HttpRequestNodeFactory.ts +10 -3
  28. package/src/nodes/ManualTriggerFactory.ts +16 -1
  29. package/src/nodes/SubWorkflowNode.ts +4 -0
  30. package/src/nodes/ToolLoadingStrategy.ts +28 -0
  31. package/src/nodes/WebhookTriggerFactory.ts +16 -2
  32. package/src/nodes/aggregate.ts +13 -2
  33. package/src/nodes/aiAgent.ts +9 -0
  34. package/src/nodes/assertion.ts +14 -1
  35. package/src/nodes/collections/collectionDeleteNode.types.ts +6 -0
  36. package/src/nodes/collections/collectionFindOneNode.types.ts +6 -0
  37. package/src/nodes/collections/collectionGetNode.types.ts +6 -0
  38. package/src/nodes/collections/collectionInsertNode.types.ts +6 -0
  39. package/src/nodes/collections/collectionListNode.types.ts +6 -0
  40. package/src/nodes/collections/collectionUpdateNode.types.ts +6 -0
  41. package/src/nodes/filter.ts +14 -2
  42. package/src/nodes/httpRequest.ts +72 -8
  43. package/src/nodes/if.ts +14 -2
  44. package/src/nodes/mapData.ts +13 -2
  45. package/src/nodes/merge.ts +9 -2
  46. package/src/nodes/noOp.ts +0 -1
  47. package/src/nodes/split.ts +13 -2
  48. package/src/nodes/subWorkflow.ts +16 -2
  49. package/src/nodes/switch.ts +18 -2
  50. package/src/nodes/testTrigger.ts +13 -0
  51. package/src/nodes/wait.ts +7 -1
  52. package/src/workflowAuthoring/WorkflowChatModelFactory.types.ts +4 -0
  53. package/src/workflows/AIAgentConnectionWorkflowExpander.ts +6 -3
  54. package/tsconfig.json +3 -1
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { AssistantModelMessage, ModelMessage, ToolModelMessage } from "ai";
1
+ import { AssistantModelMessage, ModelMessage, ToolModelMessage, ToolSet } from "ai";
2
2
  import { Cron, CronCallback } from "croner";
3
3
  import { ReadableStream } from "node:stream/web";
4
4
  import { ZodType, input, output, z } from "zod";
@@ -243,6 +243,8 @@ type ConnectionInvocationAppendArgs = Readonly<{
243
243
  status: NodeExecutionStatus;
244
244
  managedInput?: JsonValue;
245
245
  managedOutput?: JsonValue;
246
+ statusLabel?: string;
247
+ subjectName?: string;
246
248
  error?: NodeExecutionError;
247
249
  queuedAt?: string;
248
250
  startedAt?: string;
@@ -400,6 +402,26 @@ interface NodeConfigBase {
400
402
  * configs (e.g. `AssertionNodeConfig`, `StringEqualsAssertionNodeConfig`).
401
403
  */
402
404
  readonly emitsAssertions?: true;
405
+ /**
406
+ * Static configuration summary surfaced in the workflow inspector — the design-time
407
+ * "what does this node do" panel that renders before any run telemetry exists.
408
+ *
409
+ * Return 2–6 short label/value pairs derived from this config (method + url for an HTTP
410
+ * call, model + tool list for an agent, schedule + timezone for a cron trigger, etc.).
411
+ * Values are truncated by the UI; aim for one line each. Return `undefined` to opt out
412
+ * — the inspector hides the section when no rows are produced.
413
+ *
414
+ * Implement on the config class instance so the function can read sibling config fields.
415
+ * `defineNode({ inspectorSummary })` plumbs through to this.
416
+ */
417
+ inspectorSummary?(): ReadonlyArray<NodeInspectorSummaryRow> | undefined;
418
+ }
419
+ /**
420
+ * One row of a node's static configuration summary. See {@link NodeConfigBase.inspectorSummary}.
421
+ */
422
+ interface NodeInspectorSummaryRow {
423
+ readonly label: string;
424
+ readonly value: string;
403
425
  }
404
426
  declare const runnableNodeInputType: unique symbol;
405
427
  declare const runnableNodeOutputType: unique symbol;
@@ -623,32 +645,27 @@ interface TestTriggerNodeConfig<TOutputJson$1 = unknown> extends TriggerNodeConf
623
645
  caseLabel?(item: Item<TOutputJson$1>): string | undefined;
624
646
  }
625
647
  //#endregion
626
- //#region ../core/src/contracts/assertionTypes.d.ts
627
- /**
628
- * One assertion emitted by an assertion-emitting node (a node whose config sets
629
- * `emitsAssertions: true`). Each emitted item on `main` carries one of these as `item.json`.
630
- *
631
- * Pass/fail is derived from `score >= (passThreshold ?? 0.5)` — see {@link deriveAssertionPassed}.
632
- * The `errored` marker is for cases where the assertion code itself threw (distinct from
633
- * "the assertion was evaluated and the score was low") and is treated as a hard fail in rollups
634
- * regardless of `score`.
635
- */
636
- interface AssertionResult {
637
- readonly name: string;
638
- /** 0..1 score. Source of truth for pass/fail (compared against `passThreshold`). */
639
- readonly score: number;
640
- /** 0..1 threshold for "passed". When omitted, consumers default to 0.5. */
641
- readonly passThreshold?: number;
642
- /** True when evaluating the assertion threw — treated as fail regardless of `score`. */
643
- readonly errored?: true;
644
- /** What the assertion expected. Free-form JSON; UIs render with a JSON viewer. */
645
- readonly expected?: JsonValue;
646
- /** What the workflow actually produced. */
647
- readonly actual?: JsonValue;
648
- /** Short human-readable explanation, especially for fails / errors. */
649
- readonly message?: string;
650
- /** Bag of supplemental fields (e.g. judge prompt, judge raw response, comparison method). */
651
- readonly details?: Readonly<Record<string, JsonValue>>;
648
+ //#region ../core/src/contracts/CostTrackingTelemetryContract.d.ts
649
+ type CostTrackingComponent = "chat" | "ocr" | "rag";
650
+ interface CostTrackingUsageRecord {
651
+ readonly component: CostTrackingComponent;
652
+ readonly provider: string;
653
+ readonly operation: string;
654
+ readonly pricingKey: string;
655
+ readonly usageUnit: string;
656
+ readonly quantity: number;
657
+ readonly modelName?: string;
658
+ readonly attributes?: TelemetryAttributes;
659
+ }
660
+ interface CostTrackingPriceQuote {
661
+ readonly currency: string;
662
+ readonly currencyScale: number;
663
+ readonly estimatedAmountMinor: number;
664
+ readonly estimateKind: "catalog";
665
+ }
666
+ interface CostTrackingTelemetry {
667
+ captureUsage(args: CostTrackingUsageRecord): Promise<CostTrackingPriceQuote | undefined>;
668
+ forScope(scope: TelemetryScope): CostTrackingTelemetry;
652
669
  }
653
670
  //#endregion
654
671
  //#region ../core/src/contracts/telemetryTypes.d.ts
@@ -731,27 +748,87 @@ interface ExecutionTelemetry extends TelemetryScope {
731
748
  }>): NodeExecutionTelemetry;
732
749
  }
733
750
  //#endregion
734
- //#region ../core/src/contracts/CostTrackingTelemetryContract.d.ts
735
- type CostTrackingComponent = "chat" | "ocr" | "rag";
736
- interface CostTrackingUsageRecord {
737
- readonly component: CostTrackingComponent;
738
- readonly provider: string;
739
- readonly operation: string;
740
- readonly pricingKey: string;
741
- readonly usageUnit: string;
742
- readonly quantity: number;
743
- readonly modelName?: string;
744
- readonly attributes?: TelemetryAttributes;
745
- }
746
- interface CostTrackingPriceQuote {
747
- readonly currency: string;
748
- readonly currencyScale: number;
749
- readonly estimatedAmountMinor: number;
750
- readonly estimateKind: "catalog";
751
+ //#region ../core/src/contracts/agentMcpTypes.d.ts
752
+ /**
753
+ * An opaque MCP tool map: keyed by serverId → (toolName → tool definition).
754
+ * Typed as unknown so core does not depend on the AI SDK's ToolSet type.
755
+ * AIAgentNode (in core-nodes, which does depend on ai) casts this to
756
+ * ReadonlyMap<string, ToolSet> before passing to DeferredMetaToolStrategyFactory.
757
+ */
758
+ type AgentMcpToolMap = ReadonlyMap<string, Readonly<Record<string, unknown>>>;
759
+ /**
760
+ * Contract implemented by the host. Resolves MCP server bindings for an agent run
761
+ * via the standard credential-binding table (one slot per declared server, keyed
762
+ * by `(workflowId, mcpConnectionNodeId, "credential")`), and returns a ready-to-use
763
+ * tool map with wrapped execute callbacks for telemetry and 403 detection.
764
+ * Core-nodes imports this interface so AIAgentNode can inject it without
765
+ * depending on the host.
766
+ */
767
+ interface AgentMcpIntegration {
768
+ /**
769
+ * Look up the credential binding per server, validate scopes, open pool
770
+ * connections, and return a tool map keyed by serverId. Each tool's
771
+ * execute callback includes:
772
+ * - Telemetry child span (mcp.server_id, mcp.tool_name attributes)
773
+ * - 403/permission error detection → emits a NeedsReconsentEvent span event
774
+ *
775
+ * Throws `AgentBindError` on validation failures (missing server, unbound
776
+ * credential slot, missing credential instance, insufficient scopes).
777
+ */
778
+ prepareMcpTools(args: {
779
+ readonly workflowId: WorkflowId;
780
+ readonly agentNodeId: NodeId;
781
+ readonly serverIds: ReadonlyArray<string>;
782
+ readonly pinnedMcpTools: readonly string[];
783
+ readonly emitSpanEvent: (event: TelemetrySpanEventRecord) => void;
784
+ readonly startChildSpan: (args: {
785
+ readonly name: string;
786
+ readonly attributes?: Record<string, string>;
787
+ }) => {
788
+ readonly end: (args?: {
789
+ status?: "ok" | "error";
790
+ statusMessage?: string;
791
+ }) => void;
792
+ };
793
+ /** Per-MCP-tool-call invocation appender. Optional; when omitted the wrapper emits only telemetry spans. */
794
+ readonly appendMcpInvocation?: (args: ConnectionInvocationAppendArgs) => Promise<void>;
795
+ /** Agent activation id to attach to each invocation record (used by canvas + inspector grouping). */
796
+ readonly parentAgentActivationId?: NodeActivationId;
797
+ /** Per-item iteration id when the agent runs inside a per-item loop. */
798
+ readonly iterationId?: NodeIterationId;
799
+ /** Item index (0-based) of the iteration that owns these tool calls. */
800
+ readonly itemIndex?: number;
801
+ /** Parent invocation id when this agent is itself executing as a sub-agent. */
802
+ readonly parentInvocationId?: ConnectionInvocationId;
803
+ }): Promise<AgentMcpToolMap>;
751
804
  }
752
- interface CostTrackingTelemetry {
753
- captureUsage(args: CostTrackingUsageRecord): Promise<CostTrackingPriceQuote | undefined>;
754
- forScope(scope: TelemetryScope): CostTrackingTelemetry;
805
+ //#endregion
806
+ //#region ../core/src/contracts/assertionTypes.d.ts
807
+ /**
808
+ * One assertion emitted by an assertion-emitting node (a node whose config sets
809
+ * `emitsAssertions: true`). Each emitted item on `main` carries one of these as `item.json`.
810
+ *
811
+ * Pass/fail is derived from `score >= (passThreshold ?? 0.5)` — see {@link deriveAssertionPassed}.
812
+ * The `errored` marker is for cases where the assertion code itself threw (distinct from
813
+ * "the assertion was evaluated and the score was low") and is treated as a hard fail in rollups
814
+ * regardless of `score`.
815
+ */
816
+ interface AssertionResult {
817
+ readonly name: string;
818
+ /** 0..1 score. Source of truth for pass/fail (compared against `passThreshold`). */
819
+ readonly score: number;
820
+ /** 0..1 threshold for "passed". When omitted, consumers default to 0.5. */
821
+ readonly passThreshold?: number;
822
+ /** True when evaluating the assertion threw — treated as fail regardless of `score`. */
823
+ readonly errored?: true;
824
+ /** What the assertion expected. Free-form JSON; UIs render with a JSON viewer. */
825
+ readonly expected?: JsonValue;
826
+ /** What the workflow actually produced. */
827
+ readonly actual?: JsonValue;
828
+ /** Short human-readable explanation, especially for fails / errors. */
829
+ readonly message?: string;
830
+ /** Bag of supplemental fields (e.g. judge prompt, judge raw response, comparison method). */
831
+ readonly details?: Readonly<Record<string, JsonValue>>;
755
832
  }
756
833
  //#endregion
757
834
  //#region ../core/src/contracts/webhookTypes.d.ts
@@ -767,6 +844,35 @@ interface TriggerInstanceId {
767
844
  nodeId: NodeId;
768
845
  }
769
846
  //#endregion
847
+ //#region ../core/src/contracts/mcpTypes.d.ts
848
+ type McpServerTransport = "http";
849
+ interface McpServerDeclaration {
850
+ /** Globally unique slug, e.g. "gmail". Workflow authors reference this. */
851
+ id: string;
852
+ displayName: string;
853
+ description: string;
854
+ transport: McpServerTransport;
855
+ url: string;
856
+ /**
857
+ * Credential types accepted by this MCP server, matching CredentialRequirement.acceptedTypes.
858
+ * Absent or empty means no credential is required.
859
+ */
860
+ acceptedCredentialTypes?: ReadonlyArray<string>;
861
+ /**
862
+ * Documentation only in MVP. The bind-time validator checks
863
+ * requiredScopes ⊆ CredentialInstance.scopesGranted.
864
+ */
865
+ requiredScopes?: string[];
866
+ /** Non-secret static headers merged onto every MCP request. */
867
+ staticHeaders?: Record<string, string>;
868
+ /**
869
+ * Overrides for tool descriptions advertised by the MCP server.
870
+ * Applied by the connection pool after tools/list.
871
+ * Key: exact tool name as returned by the server.
872
+ */
873
+ toolDescriptionOverrides?: Record<string, string>;
874
+ }
875
+ //#endregion
770
876
  //#region ../core/src/contracts/collectionTypes.d.ts
771
877
  /**
772
878
  * Represents a typed store for a single collection.
@@ -942,6 +1048,15 @@ interface NodeExecutionStatePublisher {
942
1048
  error: Error;
943
1049
  }): Promise<void>;
944
1050
  appendConnectionInvocation(args: ConnectionInvocationAppendArgs): Promise<void>;
1051
+ /**
1052
+ * Annotates the current snapshot for `nodeId` with the id of the child run spawned by a
1053
+ * SubWorkflow invocation. Called from `SubWorkflowNode.execute` after `runById` resolves.
1054
+ * The engine's subsequent `markCompleted` call preserves the value via `previous.childRunId`.
1055
+ */
1056
+ setChildRunId?(args: {
1057
+ nodeId: NodeId;
1058
+ childRunId: RunId;
1059
+ }): Promise<void>;
945
1060
  }
946
1061
  type BinaryBody = ReadableStream<Uint8Array> | AsyncIterable<Uint8Array> | Uint8Array | ArrayBuffer;
947
1062
  interface BinaryStorageReadResult {
@@ -1321,6 +1436,9 @@ interface AgentNodeConfig<TInputJson$1 = unknown, TOutputJson$1 = unknown> exten
1321
1436
  readonly outputSchema?: ZodType<TOutputJson$1>;
1322
1437
  }
1323
1438
  //#endregion
1439
+ //#region ../core/src/ai/AgentConnectionNodeCollector.d.ts
1440
+ type McpServerResolver = (id: string) => McpServerDeclaration | undefined;
1441
+ //#endregion
1324
1442
  //#region ../core/src/execution/ChildExecutionScopeFactory.d.ts
1325
1443
  /**
1326
1444
  * Builds a re-rooted child execution context for sub-agent (and other deeply-nested) invocations.
@@ -1447,6 +1565,12 @@ type HttpRequestSpec = Readonly<{
1447
1565
  responseBinarySlot?: string;
1448
1566
  /** Maximum allowed response size in bytes (checked against Content-Length before allocating). Defaults to 100 MiB. */
1449
1567
  responseSizeCapBytes?: number;
1568
+ /**
1569
+ * When `false` (default), requests whose target host resolves to an RFC-1918,
1570
+ * link-local (169.254/16), or loopback address are blocked to prevent SSRF attacks.
1571
+ * Set to `true` only for workflows that intentionally reach private infrastructure.
1572
+ */
1573
+ allowPrivateNetworkTargets?: boolean;
1450
1574
  /** Execution context — needed for binary attach. */
1451
1575
  ctx: NodeExecutionContext<RunnableNodeConfig<unknown, unknown>>;
1452
1576
  }>;
@@ -1611,6 +1735,58 @@ declare const oauth2ClientCredentialsType: Readonly<{
1611
1735
  readonly key: string;
1612
1736
  };
1613
1737
  //#endregion
1738
+ //#region src/http/SSRFBlockedError.d.ts
1739
+ /**
1740
+ * Thrown when an HTTP request target resolves to a private, link-local, or
1741
+ * loopback address and `allowPrivateNetworkTargets` is not set.
1742
+ */
1743
+ declare class SSRFBlockedError extends Error {
1744
+ readonly resolvedIp: string;
1745
+ constructor(host: string, resolvedIp: string);
1746
+ }
1747
+ //#endregion
1748
+ //#region src/http/SsrfGuard.d.ts
1749
+ /**
1750
+ * Guards HTTP requests against Server-Side Request Forgery (SSRF) by
1751
+ * DNS-resolving the target host and rejecting private/link-local/loopback
1752
+ * addresses.
1753
+ *
1754
+ * Blocked ranges:
1755
+ * - RFC-1918: 10/8, 172.16/12, 192.168/16
1756
+ * - Link-local: 169.254/16
1757
+ * - Loopback: 127/8, ::1
1758
+ *
1759
+ * When `allowedOutboundHosts` is set, every resolved DNS target must match
1760
+ * at least one entry in the list (exact hostname or `*.example.com` wildcard).
1761
+ * When unset, existing behaviour applies: private ranges blocked, public allowed.
1762
+ *
1763
+ * Call {@link check} before making any outbound HTTP request.
1764
+ * Pass `allowPrivate: true` to bypass the private-network guard for trusted workflows
1765
+ * (allowedOutboundHosts allowlist is still applied when set).
1766
+ */
1767
+ declare class SsrfGuard {
1768
+ private readonly allowedOutboundHosts?;
1769
+ constructor(allowedOutboundHosts?: ReadonlyArray<string> | undefined);
1770
+ /**
1771
+ * Resolves the host of `url` via DNS and throws {@link SSRFBlockedError}
1772
+ * if any resolved address falls in a blocked range, or if the host does not
1773
+ * match the operator-configured allowlist (when set).
1774
+ *
1775
+ * @param url - Fully-qualified URL of the intended request target.
1776
+ * @param allowPrivate - When `true`, the private-network check is skipped.
1777
+ * The allowedOutboundHosts check is still applied when set.
1778
+ */
1779
+ check(url: string, allowPrivate: boolean): Promise<void>;
1780
+ /**
1781
+ * Returns true when `host` matches at least one entry in `allowedOutboundHosts`.
1782
+ * Supports exact hostnames (`api.example.com`) and wildcard prefixes (`*.example.com`).
1783
+ */
1784
+ private isHostAllowed;
1785
+ private isPrivateAddress;
1786
+ private isPrivateIPv4;
1787
+ private isPrivateIPv6;
1788
+ }
1789
+ //#endregion
1614
1790
  //#region src/authoring/defineRestNode.types.d.ts
1615
1791
  type MaybePromise<T> = T | Promise<T>;
1616
1792
  /**
@@ -1696,6 +1872,14 @@ interface DefineRestNodeOptions<TKey$1 extends string, TCredentials extends Defi
1696
1872
  * @default "throw"
1697
1873
  */
1698
1874
  readonly errorPolicy?: RestNodeErrorPolicy;
1875
+ /**
1876
+ * Static configuration summary surfaced in the workflow inspector.
1877
+ * Receives the static config (empty record for defineRestNode — config lives on item input).
1878
+ * Most callers return rows based on the static `api` descriptor instead.
1879
+ */
1880
+ readonly inspectorSummary?: (args: Readonly<{
1881
+ config: Record<string, never>;
1882
+ }>) => ReadonlyArray<NodeInspectorSummaryRow> | undefined;
1699
1883
  }
1700
1884
  /**
1701
1885
  * Declarative helper for creating thin API-wrapper nodes.
@@ -1859,6 +2043,77 @@ declare class OpenAiChatModelPresets {
1859
2043
  }
1860
2044
  declare const openAiChatModelPresets: OpenAiChatModelPresets;
1861
2045
  //#endregion
2046
+ //#region src/chatModels/CodemationChatModelConfig.d.ts
2047
+ /**
2048
+ * A platform-managed model entry as returned by GET /api/llm/managed-models.
2049
+ */
2050
+ interface ManagedModelDto {
2051
+ id: string;
2052
+ modelId: string;
2053
+ displayName: string;
2054
+ providerKey: string;
2055
+ inputCostPerMTok: number;
2056
+ outputCostPerMTok: number;
2057
+ contextWindow: number;
2058
+ tier: string;
2059
+ }
2060
+ /**
2061
+ * Bifrost-namespaced model ID. Kept as `string` so runtime-fetched model IDs
2062
+ * (from the CP allowlist) work without compile-time enumeration.
2063
+ * Story C replaced the prior hardcoded union with this open type.
2064
+ */
2065
+ type CodemationManagedModel = string;
2066
+ declare class CodemationChatModelConfig implements ChatModelConfig {
2067
+ readonly name: string;
2068
+ readonly model: CodemationManagedModel;
2069
+ readonly options?: Readonly<{
2070
+ temperature?: number;
2071
+ maxTokens?: number;
2072
+ }> | undefined;
2073
+ readonly type: typeof CodemationChatModelFactory;
2074
+ readonly presentation: AgentCanvasPresentation<CanvasIconName>;
2075
+ readonly provider = "codemation-managed";
2076
+ readonly modelName: string;
2077
+ constructor(name: string, model: CodemationManagedModel, presentationIn?: AgentCanvasPresentation<CanvasIconName>, options?: Readonly<{
2078
+ temperature?: number;
2079
+ maxTokens?: number;
2080
+ }> | undefined);
2081
+ }
2082
+ //#endregion
2083
+ //#region src/chatModels/CodemationChatModelFactory.d.ts
2084
+ declare class CodemationChatModelFactory implements ChatModelFactory<CodemationChatModelConfig> {
2085
+ create(args: Readonly<{
2086
+ config: CodemationChatModelConfig;
2087
+ ctx: NodeExecutionContext<any>;
2088
+ }>): Promise<ChatLanguageModel>;
2089
+ /**
2090
+ * Creates an HMAC-signed fetch wrapper for use with AI SDK's createOpenAI.
2091
+ * Each call signs the request body with the workspace pairing secret so the
2092
+ * LLM broker can authenticate the workspace without a user-managed API key.
2093
+ *
2094
+ * Mirrors HmacRequestSigner from @codemation/host/pairing without importing
2095
+ * that package (which would create a circular dependency since @codemation/host
2096
+ * depends on @codemation/core-nodes).
2097
+ */
2098
+ private buildHmacSignedFetch;
2099
+ /**
2100
+ * Produces a Codemation-Hmac v1 Authorization header value.
2101
+ * The algorithm must match HmacVerifier.computeSignature() in the control-plane.
2102
+ */
2103
+ private buildHmacAuthHeader;
2104
+ }
2105
+ //#endregion
2106
+ //#region src/chatModels/ManagedModelFetcher.d.ts
2107
+ /**
2108
+ * Fetches the active platform-managed model allowlist from the CP.
2109
+ * Reads CONTROL_PLANE_URL from the workspace process env.
2110
+ * Returns an empty array if the env var is absent or the fetch fails.
2111
+ * Cache the result per session — the allowlist changes infrequently.
2112
+ */
2113
+ declare class ManagedModelFetcher {
2114
+ fetch(): Promise<ManagedModelDto[]>;
2115
+ }
2116
+ //#endregion
1862
2117
  //#region src/nodes/aiAgentSupport.types.d.ts
1863
2118
  declare class AgentItemPortMap {
1864
2119
  static fromItem(item: Item): NodeInputsByPort;
@@ -2051,6 +2306,30 @@ interface AIAgentOptions<TInputJson$1 = unknown, _TOutputJson = unknown> {
2051
2306
  /** Engine applies with {@link RunnableNodeConfig.inputSchema} before {@link AIAgentNode.execute}. */
2052
2307
  readonly inputSchema?: ZodType<TInputJson$1>;
2053
2308
  readonly outputSchema?: ZodType<_TOutputJson>;
2309
+ /**
2310
+ * MCP servers to connect for this agent run. Each entry is the server id from
2311
+ * the MCP catalog (e.g. `"gmail"`). Credential instances are bound via the
2312
+ * standard credential-binding flow — each server materializes an MCP connection
2313
+ * node and the slot lives on that node, keyed by
2314
+ * `(workflowId, mcpConnectionNodeId, "credential")` (same shape as ChatModel and
2315
+ * Tool connection nodes). There is no inline credential field; bind through the
2316
+ * canvas credential dropdown before activation.
2317
+ */
2318
+ readonly mcpServers?: ReadonlyArray<string>;
2319
+ /**
2320
+ * Tool ids to always include without going through `find_tools`.
2321
+ * Format: `"serverId:toolName"` (e.g. `"gmail:send_message"`). Max 16.
2322
+ */
2323
+ readonly pinnedMcpTools?: readonly string[];
2324
+ /**
2325
+ * Source identifiers that should be treated as untrusted external content.
2326
+ * When an incoming `Item.json.__source` matches one of these values, every
2327
+ * user-role message is wrapped with an untrusted-source preamble so the LLM
2328
+ * treats the content as data rather than instructions (prompt-injection defense).
2329
+ *
2330
+ * Defaults to `["gmail", "ocr", "webhook"]` when unset.
2331
+ */
2332
+ readonly untrustedSources?: ReadonlyArray<string>;
2054
2333
  }
2055
2334
  /**
2056
2335
  * AI agent: credential bindings are keyed to connection-owned LLM/tool node ids (ConnectionNodeIdFactory),
@@ -2072,7 +2351,11 @@ declare class AIAgent<TInputJson$1 = unknown, TOutputJson$1 = unknown> implement
2072
2351
  readonly guardrails?: AgentGuardrailConfig;
2073
2352
  readonly inputSchema?: ZodType<TInputJson$1>;
2074
2353
  readonly outputSchema?: ZodType<TOutputJson$1>;
2354
+ readonly mcpServers?: ReadonlyArray<string>;
2355
+ readonly pinnedMcpTools?: readonly string[];
2356
+ readonly untrustedSources?: ReadonlyArray<string>;
2075
2357
  constructor(options: AIAgentOptions<TInputJson$1, TOutputJson$1>);
2358
+ inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow>;
2076
2359
  }
2077
2360
  //#endregion
2078
2361
  //#region src/nodes/AgentToolRepairPolicy.d.ts
@@ -2145,6 +2428,41 @@ declare class NodeBackedToolRuntime {
2145
2428
  private isMultiInputNode;
2146
2429
  }
2147
2430
  //#endregion
2431
+ //#region src/nodes/ToolLoadingStrategy.d.ts
2432
+ interface FindToolsResult {
2433
+ readonly serverId: string;
2434
+ readonly toolName: string;
2435
+ readonly description: string;
2436
+ readonly inputSchema: unknown;
2437
+ }
2438
+ interface ToolLoadingStrategyTurnContext {
2439
+ readonly turnIndex: number;
2440
+ readonly previousFoundToolIds?: ReadonlyArray<string>;
2441
+ }
2442
+ interface ToolLoadingStrategyInitInput {
2443
+ readonly nodeBackedTools: ToolSet;
2444
+ readonly mcpToolsByServer: ReadonlyMap<string, ToolSet>;
2445
+ readonly pinnedMcpTools?: ReadonlyArray<string>;
2446
+ }
2447
+ interface ToolLoadingStrategy {
2448
+ initialize(input: ToolLoadingStrategyInitInput): Promise<void>;
2449
+ getToolsForTurn(context: ToolLoadingStrategyTurnContext): ToolSet;
2450
+ ownsToolName(toolName: string): boolean;
2451
+ executeMetaTool(toolName: string, input: unknown): Promise<unknown>;
2452
+ recordFoundTools(results: ReadonlyArray<FindToolsResult>): void;
2453
+ getFoundToolIds(): ReadonlyArray<string>;
2454
+ }
2455
+ //#endregion
2456
+ //#region src/nodes/DeferredMetaToolStrategyFactory.d.ts
2457
+ /**
2458
+ * Factory for creating and initializing a DeferredMetaToolStrategy per agent execution.
2459
+ * Injected into AIAgentNode; each agent call creates its own initialized strategy instance.
2460
+ * BM25Index is constructed here (this file is a composition root via the Factory suffix).
2461
+ */
2462
+ declare class DeferredMetaToolStrategyFactory {
2463
+ create(input: ToolLoadingStrategyInitInput): Promise<ToolLoadingStrategy>;
2464
+ }
2465
+ //#endregion
2148
2466
  //#region src/nodes/AIAgentNode.d.ts
2149
2467
  declare class AIAgentNode implements RunnableNode<AIAgent<any, any>> {
2150
2468
  private readonly nodeResolver;
@@ -2152,15 +2470,18 @@ declare class AIAgentNode implements RunnableNode<AIAgent<any, any>> {
2152
2470
  private readonly executionHelpers;
2153
2471
  private readonly structuredOutputRunner;
2154
2472
  private readonly toolExecutionCoordinator;
2473
+ private readonly toolLoadingStrategyFactory;
2474
+ private readonly agentMcpIntegration;
2155
2475
  kind: "node";
2156
2476
  outputPorts: readonly ["main"];
2157
2477
  readonly inputSchema: z.ZodUnknown;
2158
2478
  private readonly connectionCredentialExecutionContextFactory;
2159
2479
  private readonly preparedByExecutionContext;
2160
- constructor(nodeResolver: NodeResolver, credentialSessions: CredentialSessionService, nodeBackedToolRuntime: NodeBackedToolRuntime, executionHelpers: AIAgentExecutionHelpersFactory, structuredOutputRunner: AgentStructuredOutputRunner, toolExecutionCoordinator: AgentToolExecutionCoordinator);
2480
+ constructor(nodeResolver: NodeResolver, credentialSessions: CredentialSessionService, nodeBackedToolRuntime: NodeBackedToolRuntime, executionHelpers: AIAgentExecutionHelpersFactory, structuredOutputRunner: AgentStructuredOutputRunner, toolExecutionCoordinator: AgentToolExecutionCoordinator, toolLoadingStrategyFactory: DeferredMetaToolStrategyFactory, agentMcpIntegration: AgentMcpIntegration);
2161
2481
  execute(args: RunnableNodeExecuteArgs<AIAgent<any, any>>): Promise<unknown>;
2162
2482
  private getOrPrepareExecution;
2163
2483
  private prepareExecution;
2484
+ private prepareMcpToolsByServer;
2164
2485
  private runAgentForItem;
2165
2486
  /**
2166
2487
  * Multi-turn loop:
@@ -2169,6 +2490,8 @@ declare class AIAgentNode implements RunnableNode<AIAgent<any, any>> {
2169
2490
  * connection-invocation recording / transient-error handling exactly like before).
2170
2491
  * - When the model returns no tool calls the loop ends with the model's text as the final answer.
2171
2492
  * - Respects `guardrails.maxTurns` and `guardrails.onTurnLimitReached`.
2493
+ * - Strategy-owned tool calls (e.g. `find_tools`) are dispatched via the strategy, not the
2494
+ * coordinator; their results are tracked so subsequent turns receive the discovered tools.
2172
2495
  */
2173
2496
  private runTurnLoopUntilFinalAnswer;
2174
2497
  private cannotExecuteAnotherToolRound;
@@ -2178,6 +2501,22 @@ declare class AIAgentNode implements RunnableNode<AIAgent<any, any>> {
2178
2501
  private buildOutputItem;
2179
2502
  private resolveTools;
2180
2503
  private createItemScopedTools;
2504
+ /**
2505
+ * Invoke a text turn using the merged tool set from item-scoped tools (coordinator-managed)
2506
+ * and strategy tools (find_tools + discovered MCP tools).
2507
+ * Strategy tools take precedence for names that overlap.
2508
+ */
2509
+ private invokeTextTurnWithStrategyTools;
2510
+ /**
2511
+ * Removes `execute` properties from ToolSet entries so the AI SDK does not
2512
+ * auto-execute them within `generateText`. Codemation owns all tool dispatch.
2513
+ */
2514
+ private stripExecuteCallbacks;
2515
+ /**
2516
+ * Builds a ToolSet from resolved tools for strategy initialization.
2517
+ * The strategy uses this for its "always-included" node-backed tool descriptions.
2518
+ */
2519
+ private buildToolSetFromResolved;
2181
2520
  /**
2182
2521
  * Builds an AI SDK {@link ToolSet} where every tool ships a pre-converted JSON Schema (via
2183
2522
  * {@link jsonSchema}) — not the raw Zod schema — and carries **no** `execute`. Two reasons:
@@ -2195,9 +2534,9 @@ declare class AIAgentNode implements RunnableNode<AIAgent<any, any>> {
2195
2534
  private buildToolSet;
2196
2535
  /**
2197
2536
  * One `generateText` turn (no auto tool execution) with Codemation-owned child-span telemetry
2198
- * and connection-invocation state recording.
2537
+ * and connection-invocation state recording. Accepts a pre-built ToolSet.
2199
2538
  */
2200
- private invokeTextTurn;
2539
+ private invokeTextTurnWithToolSet;
2201
2540
  /**
2202
2541
  * Structured-output turn: runs `generateText({ output: Output.object({ schema }) })` via the
2203
2542
  * structured-output runner. We keep this as a separate helper because the runner needs the raw
@@ -2228,6 +2567,13 @@ declare class AIAgentNode implements RunnableNode<AIAgent<any, any>> {
2228
2567
  private summarizeLlmMessages;
2229
2568
  private resultToJsonValue;
2230
2569
  private createPromptMessages;
2570
+ /**
2571
+ * When `item.json.__source` matches an entry in `config.untrustedSources`
2572
+ * (default: `["gmail", "ocr", "webhook"]`), wraps every user-role message
2573
+ * content with an untrusted-external-source preamble so the LLM treats the
2574
+ * content as data, not instructions.
2575
+ */
2576
+ private wrapUntrustedSourceMessages;
2231
2577
  private resolveToolRuntime;
2232
2578
  private isNodeBackedToolConfig;
2233
2579
  private isCallableToolConfig;
@@ -2236,6 +2582,61 @@ declare class AIAgentNode implements RunnableNode<AIAgent<any, any>> {
2236
2582
  private extractErrorDetails;
2237
2583
  }
2238
2584
  //#endregion
2585
+ //#region src/nodes/BM25Index.d.ts
2586
+ /**
2587
+ * Minimal BM25 (Okapi BM25) implementation for indexing MCP tool descriptions.
2588
+ *
2589
+ * Parameters: k1=1.5, b=0.75 (standard defaults).
2590
+ * Tokenisation: lowercase, split on non-alphanumerics, filter empties.
2591
+ */
2592
+ declare class BM25Index {
2593
+ private readonly k1;
2594
+ private readonly b;
2595
+ private readonly tf;
2596
+ private readonly df;
2597
+ private avgDocLen;
2598
+ /**
2599
+ * Add all documents at once. After calling this, search is available.
2600
+ * Documents are indexed in insertion order; search returns their indices.
2601
+ */
2602
+ add(docs: ReadonlyArray<string>): void;
2603
+ /**
2604
+ * Returns up to `limit` document indices ranked by BM25 score (highest first).
2605
+ * Returns an empty array if the index is empty or the query matches nothing.
2606
+ */
2607
+ search(query: string, limit: number): ReadonlyArray<number>;
2608
+ tokenize(text: string): string[];
2609
+ private docLen;
2610
+ }
2611
+ //#endregion
2612
+ //#region src/nodes/DeferredMetaToolStrategy.d.ts
2613
+ /**
2614
+ * Default tool-loading strategy: BM25-indexed MCP tool deferral via a `find_tools` meta-tool.
2615
+ *
2616
+ * - Node-backed tools and pinned MCP tools are always included in every turn.
2617
+ * - `find_tools(query, limit?)` is added to the tool set when MCP tools are indexed.
2618
+ * - Tools surfaced by `find_tools` are included in subsequent turns.
2619
+ *
2620
+ * Not DI-managed; instantiated per agent execution by DeferredMetaToolStrategyFactory.
2621
+ */
2622
+ declare class DeferredMetaToolStrategy implements ToolLoadingStrategy {
2623
+ private readonly bm25;
2624
+ private readonly warnFn;
2625
+ private nodeBackedTools;
2626
+ private pinnedTools;
2627
+ private mcpEntries;
2628
+ private toolsByServerId;
2629
+ private foundToolIds;
2630
+ constructor(bm25: BM25Index, warnFn: (message: string) => void);
2631
+ initialize(input: ToolLoadingStrategyInitInput): Promise<void>;
2632
+ getToolsForTurn(context: ToolLoadingStrategyTurnContext): ToolSet;
2633
+ ownsToolName(toolName: string): boolean;
2634
+ executeMetaTool(toolName: string, input: unknown): Promise<unknown>;
2635
+ recordFoundTools(results: ReadonlyArray<FindToolsResult>): void;
2636
+ getFoundToolIds(): ReadonlyArray<string>;
2637
+ private buildFindToolsDefinition;
2638
+ }
2639
+ //#endregion
2239
2640
  //#region src/nodes/AssertionNode.d.ts
2240
2641
  /**
2241
2642
  * Runs the author's `assertions` callback for each input item and emits one workflow `Item` per
@@ -2280,6 +2681,7 @@ declare class Assertion<TInputJson$1 = unknown> implements RunnableNodeConfig<TI
2280
2681
  readonly emitsAssertions: true;
2281
2682
  readonly assertions: AssertionOptions<TInputJson$1>["assertions"];
2282
2683
  constructor(options: AssertionOptions<TInputJson$1>);
2684
+ inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow> | undefined;
2283
2685
  }
2284
2686
  //#endregion
2285
2687
  //#region src/nodes/CallbackNode.d.ts
@@ -2318,6 +2720,7 @@ declare class Callback<TInputJson$1 = unknown, TOutputJson$1 = TInputJson$1> imp
2318
2720
  readonly declaredOutputPorts?: ReadonlyArray<string>;
2319
2721
  constructor(name?: string, callback?: CallbackHandler<TInputJson$1, TOutputJson$1>, idOrOptions?: string | CallbackOptions, options?: CallbackOptions);
2320
2722
  private static defaultCallback;
2723
+ inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow> | undefined;
2321
2724
  }
2322
2725
  //#endregion
2323
2726
  //#region src/nodes/HttpRequestNodeFactory.d.ts
@@ -2387,11 +2790,22 @@ declare class HttpRequest<TInputJson$1 = Readonly<{
2387
2790
  /** Request body specification. For canvas use, pass a JSON string in `body.data`. */
2388
2791
  body?: HttpBodySpec;
2389
2792
  /**
2390
- * Credential slot key. When set, the node resolves a credential via
2391
- * `ctx.getCredential(credentialSlot)` and applies it to the request.
2392
- * The slot must be declared in `getCredentialRequirements()`.
2793
+ * Credential slot.
2794
+ *
2795
+ * **String shorthand** (existing): `credentialSlot: "auth"` the slot accepts all four
2796
+ * default HTTP credential types (bearer, API-key, basic, OAuth2).
2797
+ *
2798
+ * **Object form** (new): narrows the accepted types to the caller-supplied list, useful
2799
+ * when only a subset of credential types makes sense for a specific endpoint.
2800
+ * ```ts
2801
+ * credentialSlot: { name: "auth", acceptedTypes: [bearerTokenCredentialType] }
2802
+ * ```
2803
+ * The slot must be declared in `getCredentialRequirements()`, which is wired automatically.
2393
2804
  */
2394
- credentialSlot?: string;
2805
+ credentialSlot?: string | Readonly<{
2806
+ name: string;
2807
+ acceptedTypes?: ReadonlyArray<AnyCredentialType>;
2808
+ }>;
2395
2809
  binaryName?: string;
2396
2810
  downloadMode?: HttpRequestDownloadMode;
2397
2811
  /**
@@ -2415,6 +2829,23 @@ declare class HttpRequest<TInputJson$1 = Readonly<{
2415
2829
  * Requests whose `Content-Length` exceeds this cap are rejected before the body is read.
2416
2830
  */
2417
2831
  responseSizeCapBytes?: number;
2832
+ /**
2833
+ * Operator-configurable outbound host allowlist.
2834
+ *
2835
+ * When set, every HTTP request target must match an entry in this list before the
2836
+ * request is made — requests to any other host are rejected with {@link SSRFBlockedError}.
2837
+ * Supports exact hostnames (`api.example.com`) and wildcard subdomain patterns
2838
+ * (`*.example.com` matches `sub.example.com` but not `example.com` itself).
2839
+ *
2840
+ * When unset (default), the existing SSRF private-network guard applies:
2841
+ * public hosts are allowed and private/loopback ranges are blocked.
2842
+ *
2843
+ * **Production warning**: when `NODE_ENV === "production"` and this is unset, a one-time
2844
+ * warning is logged at workflow startup.
2845
+ *
2846
+ * Setting this to an empty array `[]` is equivalent to "block everything".
2847
+ */
2848
+ allowedOutboundHosts?: ReadonlyArray<string>;
2418
2849
  id?: string;
2419
2850
  }>;
2420
2851
  readonly retryPolicy: RetryPolicySpec;
@@ -2441,11 +2872,22 @@ declare class HttpRequest<TInputJson$1 = Readonly<{
2441
2872
  /** Request body specification. For canvas use, pass a JSON string in `body.data`. */
2442
2873
  body?: HttpBodySpec;
2443
2874
  /**
2444
- * Credential slot key. When set, the node resolves a credential via
2445
- * `ctx.getCredential(credentialSlot)` and applies it to the request.
2446
- * The slot must be declared in `getCredentialRequirements()`.
2875
+ * Credential slot.
2876
+ *
2877
+ * **String shorthand** (existing): `credentialSlot: "auth"` the slot accepts all four
2878
+ * default HTTP credential types (bearer, API-key, basic, OAuth2).
2879
+ *
2880
+ * **Object form** (new): narrows the accepted types to the caller-supplied list, useful
2881
+ * when only a subset of credential types makes sense for a specific endpoint.
2882
+ * ```ts
2883
+ * credentialSlot: { name: "auth", acceptedTypes: [bearerTokenCredentialType] }
2884
+ * ```
2885
+ * The slot must be declared in `getCredentialRequirements()`, which is wired automatically.
2447
2886
  */
2448
- credentialSlot?: string;
2887
+ credentialSlot?: string | Readonly<{
2888
+ name: string;
2889
+ acceptedTypes?: ReadonlyArray<AnyCredentialType>;
2890
+ }>;
2449
2891
  binaryName?: string;
2450
2892
  downloadMode?: HttpRequestDownloadMode;
2451
2893
  /**
@@ -2469,6 +2911,23 @@ declare class HttpRequest<TInputJson$1 = Readonly<{
2469
2911
  * Requests whose `Content-Length` exceeds this cap are rejected before the body is read.
2470
2912
  */
2471
2913
  responseSizeCapBytes?: number;
2914
+ /**
2915
+ * Operator-configurable outbound host allowlist.
2916
+ *
2917
+ * When set, every HTTP request target must match an entry in this list before the
2918
+ * request is made — requests to any other host are rejected with {@link SSRFBlockedError}.
2919
+ * Supports exact hostnames (`api.example.com`) and wildcard subdomain patterns
2920
+ * (`*.example.com` matches `sub.example.com` but not `example.com` itself).
2921
+ *
2922
+ * When unset (default), the existing SSRF private-network guard applies:
2923
+ * public hosts are allowed and private/loopback ranges are blocked.
2924
+ *
2925
+ * **Production warning**: when `NODE_ENV === "production"` and this is unset, a one-time
2926
+ * warning is logged at workflow startup.
2927
+ *
2928
+ * Setting this to an empty array `[]` is equivalent to "block everything".
2929
+ */
2930
+ allowedOutboundHosts?: ReadonlyArray<string>;
2472
2931
  id?: string;
2473
2932
  }>, retryPolicy?: RetryPolicySpec);
2474
2933
  get id(): string | undefined;
@@ -2479,7 +2938,9 @@ declare class HttpRequest<TInputJson$1 = Readonly<{
2479
2938
  get responseFormat(): "json" | "text" | "binary" | undefined;
2480
2939
  get responseBinarySlot(): string;
2481
2940
  get responseSizeCapBytes(): number;
2941
+ get allowedOutboundHosts(): ReadonlyArray<string> | undefined;
2482
2942
  getCredentialRequirements(): ReadonlyArray<CredentialRequirement>;
2943
+ inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow>;
2483
2944
  }
2484
2945
  //#endregion
2485
2946
  //#region src/nodes/AggregateNode.d.ts
@@ -2502,6 +2963,7 @@ declare class Aggregate<TIn = unknown, TOut = unknown> implements RunnableNodeCo
2502
2963
  readonly keepBinaries: true;
2503
2964
  readonly icon: "builtin:aggregate-rows";
2504
2965
  constructor(name: string, aggregate: (items: Items<TIn>, ctx: NodeExecutionContext<Aggregate<TIn, TOut>>) => TOut | Promise<TOut>, id?: string | undefined);
2966
+ inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow> | undefined;
2505
2967
  }
2506
2968
  //#endregion
2507
2969
  //#region src/nodes/FilterNode.d.ts
@@ -2523,6 +2985,7 @@ declare class Filter<TIn = unknown> implements RunnableNodeConfig<TIn, TIn> {
2523
2985
  };
2524
2986
  readonly icon: "lucide:filter";
2525
2987
  constructor(name: string, predicate: (item: Item<TIn>, index: number, items: Items<TIn>, ctx: NodeExecutionContext<Filter<TIn>>) => boolean, id?: string | undefined);
2988
+ inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow> | undefined;
2526
2989
  }
2527
2990
  //#endregion
2528
2991
  //#region src/nodes/IfNode.d.ts
@@ -2544,6 +3007,7 @@ declare class If<TInputJson$1 = unknown> implements RunnableNodeConfig<TInputJso
2544
3007
  readonly icon: "lucide:split@rot=90";
2545
3008
  readonly declaredOutputPorts: readonly ["true", "false"];
2546
3009
  constructor(name: string, predicate: (item: Item<TInputJson$1>, index: number, items: Items<TInputJson$1>, ctx: NodeExecutionContext<If<TInputJson$1>>) => boolean, id?: string | undefined);
3010
+ inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow> | undefined;
2547
3011
  }
2548
3012
  //#endregion
2549
3013
  //#region src/nodes/IsTestRunNode.d.ts
@@ -2609,6 +3073,7 @@ declare class Switch<TInputJson$1 = unknown> implements RunnableNodeConfig<TInpu
2609
3073
  defaultCase: string;
2610
3074
  resolveCaseKey: SwitchCaseKeyResolver<TInputJson$1>;
2611
3075
  }>, id?: string | undefined);
3076
+ inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow>;
2612
3077
  }
2613
3078
  //#endregion
2614
3079
  //#region src/nodes/SplitNode.d.ts
@@ -2636,6 +3101,7 @@ declare class Split<TIn = unknown, TElem = unknown> implements RunnableNodeConfi
2636
3101
  readonly continueWhenEmptyOutput: true;
2637
3102
  readonly icon: "builtin:split-rows";
2638
3103
  constructor(name: string, getElements: (item: Item<TIn>, ctx: NodeExecutionContext<Split<TIn, TElem>>) => readonly TElem[], id?: string | undefined);
3104
+ inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow> | undefined;
2639
3105
  }
2640
3106
  //#endregion
2641
3107
  //#region src/nodes/CronTriggerFactory.d.ts
@@ -2666,6 +3132,7 @@ declare class CronTrigger implements TriggerNodeConfig<CronTickJson> {
2666
3132
  get schedule(): string;
2667
3133
  get timezone(): string | undefined;
2668
3134
  createJob(callback: CronCallback): Cron;
3135
+ inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow>;
2669
3136
  }
2670
3137
  //#endregion
2671
3138
  //#region src/nodes/CronTriggerNode.d.ts
@@ -2707,6 +3174,7 @@ declare class ManualTrigger<TOutputJson$1 = unknown> implements TriggerNodeConfi
2707
3174
  constructor(name: string, defaultItems: ManualTriggerDefaultValue<TOutputJson$1>, id?: string);
2708
3175
  private static resolveDefaultItems;
2709
3176
  private static resolveId;
3177
+ inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow>;
2710
3178
  }
2711
3179
  //#endregion
2712
3180
  //#region src/nodes/MapDataNode.d.ts
@@ -2737,6 +3205,7 @@ declare class MapData<TInputJson$1 = unknown, TOutputJson$1 = unknown> implement
2737
3205
  readonly keepBinaries: boolean;
2738
3206
  constructor(name: string, map: (item: Item<TInputJson$1>, ctx: NodeExecutionContext<MapData<TInputJson$1, TOutputJson$1>>) => TOutputJson$1, options?: MapDataOptions);
2739
3207
  get id(): string | undefined;
3208
+ inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow> | undefined;
2740
3209
  }
2741
3210
  //#endregion
2742
3211
  //#region src/nodes/MergeNode.d.ts
@@ -2770,6 +3239,7 @@ declare class Merge<TInputJson$1 = unknown, TOutputJson$1 = TInputJson$1> implem
2770
3239
  */
2771
3240
  prefer?: ReadonlyArray<InputPortKey>;
2772
3241
  }>, id?: string | undefined);
3242
+ inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow>;
2773
3243
  }
2774
3244
  //#endregion
2775
3245
  //#region src/nodes/NoOpNode.d.ts
@@ -2812,9 +3282,11 @@ declare class SubWorkflow<TInputJson$1 = unknown, TOutputJson$1 = unknown> imple
2812
3282
  readonly id?: string | undefined;
2813
3283
  readonly kind: "node";
2814
3284
  readonly type: TypeToken<unknown>;
3285
+ readonly icon = "lucide:workflow";
2815
3286
  constructor(name: string, workflowId: string, upstreamRefs?: Array<{
2816
3287
  nodeId: NodeId;
2817
3288
  } | UpstreamRefPlaceholder> | undefined, startAt?: NodeId | undefined, id?: string | undefined);
3289
+ inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow>;
2818
3290
  }
2819
3291
  //#endregion
2820
3292
  //#region src/nodes/TestTriggerNode.d.ts
@@ -2880,6 +3352,7 @@ declare class TestTrigger<TOutputJson$1 = unknown> implements TestTriggerNodeCon
2880
3352
  private readonly credentialRequirements;
2881
3353
  constructor(options: TestTriggerOptions<TOutputJson$1>);
2882
3354
  getCredentialRequirements(): ReadonlyArray<CredentialRequirement>;
3355
+ inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow> | undefined;
2883
3356
  }
2884
3357
  //#endregion
2885
3358
  //#region src/nodes/WaitDurationFactory.d.ts
@@ -2908,6 +3381,7 @@ declare class Wait<TItemJson = unknown> implements RunnableNodeConfig<TItemJson,
2908
3381
  readonly continueWhenEmptyOutput: true;
2909
3382
  readonly icon: "lucide:hourglass";
2910
3383
  constructor(name: string, milliseconds: number, id?: string | undefined);
3384
+ inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow>;
2911
3385
  }
2912
3386
  //#endregion
2913
3387
  //#region src/nodes/webhookRespondNowAndContinueError.d.ts
@@ -2937,7 +3411,7 @@ declare class WebhookTrigger<TSchema extends WebhookInputSchema | undefined = un
2937
3411
  readonly id?: string | undefined;
2938
3412
  readonly kind: "trigger";
2939
3413
  readonly type: TypeToken<unknown>;
2940
- readonly icon = "lucide:webhook";
3414
+ readonly icon = "lucide:globe";
2941
3415
  constructor(name: string, args: Readonly<{
2942
3416
  endpointKey: string;
2943
3417
  methods: ReadonlyArray<HttpMethod>;
@@ -2948,6 +3422,7 @@ declare class WebhookTrigger<TSchema extends WebhookInputSchema | undefined = un
2948
3422
  get inputSchema(): TSchema | undefined;
2949
3423
  parseJsonBody(body: unknown): unknown;
2950
3424
  private static defaultHandler;
3425
+ inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow>;
2951
3426
  }
2952
3427
  //#endregion
2953
3428
  //#region src/nodes/webhookTriggerNode.d.ts
@@ -3118,7 +3593,8 @@ declare class ConnectionCredentialNodeConfigFactory {
3118
3593
  */
3119
3594
  declare class AIAgentConnectionWorkflowExpander {
3120
3595
  private readonly connectionCredentialNodeConfigFactory;
3121
- constructor(connectionCredentialNodeConfigFactory: ConnectionCredentialNodeConfigFactory);
3596
+ private readonly mcpServerResolver?;
3597
+ constructor(connectionCredentialNodeConfigFactory: ConnectionCredentialNodeConfigFactory, mcpServerResolver?: McpServerResolver | undefined);
3122
3598
  expand(workflow: WorkflowDefinition): WorkflowDefinition;
3123
3599
  private createConnectionsByParentAndName;
3124
3600
  private collectExistingChildIds;
@@ -3188,5 +3664,5 @@ declare const collectionDeleteNode: DefinedNode<"collection-delete", {
3188
3664
  id: string;
3189
3665
  }, undefined>;
3190
3666
  //#endregion
3191
- export { AIAgent, AIAgentConnectionWorkflowExpander, AIAgentExecutionHelpersFactory, AIAgentNode, AgentItemPortMap, AgentMessageFactory, AgentOutputFactory, AgentStructuredOutputRepairPromptFactory, AgentStructuredOutputRunner, AgentToolCallPortMap, AgentToolErrorClassifier, AgentToolExecutionCoordinator, AgentToolRepairExhaustedError, AgentToolRepairPolicy, Aggregate, AggregateNode, Assertion, AssertionNode, AssertionOptions, BinaryRef, Callback, CallbackHandler, CallbackNode, CallbackOptions, CallbackResultNormalizer, CanvasIconName, ConnectionCredentialExecutionContextFactory, ConnectionCredentialNode, ConnectionCredentialNodeConfig, ConnectionCredentialNodeConfigFactory, CredentialSession, CronTickJson, CronTrigger, CronTriggerNode, DefineRestNodeOptions, type ExecutedToolCall, Filter, FilterNode, HTTP_REQUEST_ACCEPTED_CREDENTIAL_TYPES, HttpBodySpec, HttpCredentialDelta, HttpRequest, HttpRequestDownloadMode, HttpRequestNode, HttpRequestOutputJson, HttpRequestResult, HttpRequestSpec, If, IfNode, IsTestRun, IsTestRunNode, type ItemScopedToolBinding, ManualTrigger, ManualTriggerNode, MapData, MapDataNode, MapDataOptions, Merge, MergeMode, MergeNode, NoOp, NoOpNode, OpenAIChatModelConfig, OpenAIChatModelFactory, OpenAiChatModelPresets, OpenAiCredentialSession, OpenAiStrictJsonSchemaFactory, type PlannedToolCall, type ResolvedTool, RestNodeApi, RestNodeErrorPolicy, RestNodeRequestShape, RestNodeResponseContext, Split, SplitNode, SubWorkflow, SubWorkflowNode, Switch, SwitchCaseKeyResolver, SwitchNode, TestTrigger, TestTriggerNode, TestTriggerOptions, Wait, WaitDuration, WaitNode, WebhookRespondNowAndContinueError, WebhookRespondNowError, WebhookTrigger, WebhookTriggerNode, type WorkflowAgentMessages, type WorkflowAgentOptions, WorkflowAuthoringBuilder, WorkflowBranchBuilder, WorkflowChain, apiKeyCredentialType, basicAuthCredentialType, bearerTokenCredentialType, collectionDeleteNode, collectionFindOneNode, collectionGetNode, collectionInsertNode, collectionListNode, collectionUpdateNode, createWorkflowBuilder, defineRestNode, oauth2ClientCredentialsType, openAiChatModelPresets, registerCoreNodes, workflow };
3667
+ export { AIAgent, AIAgentConnectionWorkflowExpander, AIAgentExecutionHelpersFactory, AIAgentNode, AgentItemPortMap, AgentMessageFactory, AgentOutputFactory, AgentStructuredOutputRepairPromptFactory, AgentStructuredOutputRunner, AgentToolCallPortMap, AgentToolErrorClassifier, AgentToolExecutionCoordinator, AgentToolRepairExhaustedError, AgentToolRepairPolicy, Aggregate, AggregateNode, Assertion, AssertionNode, AssertionOptions, BM25Index, BinaryRef, Callback, CallbackHandler, CallbackNode, CallbackOptions, CallbackResultNormalizer, CanvasIconName, CodemationChatModelConfig, CodemationChatModelFactory, CodemationManagedModel, ConnectionCredentialExecutionContextFactory, ConnectionCredentialNode, ConnectionCredentialNodeConfig, ConnectionCredentialNodeConfigFactory, CredentialSession, CronTickJson, CronTrigger, CronTriggerNode, DeferredMetaToolStrategy, DeferredMetaToolStrategyFactory, DefineRestNodeOptions, type ExecutedToolCall, Filter, FilterNode, type FindToolsResult, HTTP_REQUEST_ACCEPTED_CREDENTIAL_TYPES, HttpBodySpec, HttpCredentialDelta, HttpRequest, HttpRequestDownloadMode, HttpRequestNode, HttpRequestOutputJson, HttpRequestResult, HttpRequestSpec, If, IfNode, IsTestRun, IsTestRunNode, type ItemScopedToolBinding, ManagedModelDto, ManagedModelFetcher, ManualTrigger, ManualTriggerNode, MapData, MapDataNode, MapDataOptions, Merge, MergeMode, MergeNode, NoOp, NoOpNode, OpenAIChatModelConfig, OpenAIChatModelFactory, OpenAiChatModelPresets, OpenAiCredentialSession, OpenAiStrictJsonSchemaFactory, type PlannedToolCall, type ResolvedTool, RestNodeApi, RestNodeErrorPolicy, RestNodeRequestShape, RestNodeResponseContext, SSRFBlockedError, Split, SplitNode, SsrfGuard, SubWorkflow, SubWorkflowNode, Switch, SwitchCaseKeyResolver, SwitchNode, TestTrigger, TestTriggerNode, TestTriggerOptions, type ToolLoadingStrategy, type ToolLoadingStrategyInitInput, type ToolLoadingStrategyTurnContext, Wait, WaitDuration, WaitNode, WebhookRespondNowAndContinueError, WebhookRespondNowError, WebhookTrigger, WebhookTriggerNode, type WorkflowAgentMessages, type WorkflowAgentOptions, WorkflowAuthoringBuilder, WorkflowBranchBuilder, WorkflowChain, apiKeyCredentialType, basicAuthCredentialType, bearerTokenCredentialType, collectionDeleteNode, collectionFindOneNode, collectionGetNode, collectionInsertNode, collectionListNode, collectionUpdateNode, createWorkflowBuilder, defineRestNode, oauth2ClientCredentialsType, openAiChatModelPresets, registerCoreNodes, workflow };
3192
3668
  //# sourceMappingURL=index.d.ts.map