@n8n/ai-workflow-builder 1.12.0 → 1.13.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 (85) hide show
  1. package/dist/agents/planner.agent.d.ts +2 -2
  2. package/dist/agents/responder.agent.d.ts +24 -2
  3. package/dist/agents/responder.agent.js +33 -24
  4. package/dist/agents/responder.agent.js.map +1 -1
  5. package/dist/ai-workflow-builder-agent.service.d.ts +1 -0
  6. package/dist/ai-workflow-builder-agent.service.js +27 -0
  7. package/dist/ai-workflow-builder-agent.service.js.map +1 -1
  8. package/dist/build.tsbuildinfo +1 -1
  9. package/dist/code-builder/tools/code-builder-get.tool.d.ts +1 -1
  10. package/dist/code-builder/tools/code-builder-search.tool.d.ts +1 -1
  11. package/dist/code-builder/tools/get-suggested-nodes.tool.d.ts +1 -1
  12. package/dist/code-builder/triage.agent.js +6 -2
  13. package/dist/code-builder/triage.agent.js.map +1 -1
  14. package/dist/constants.d.ts +4 -0
  15. package/dist/constants.js +5 -1
  16. package/dist/constants.js.map +1 -1
  17. package/dist/multi-agent-workflow-subgraphs.d.ts +29 -8
  18. package/dist/parent-graph-state.d.ts +4 -1
  19. package/dist/parent-graph-state.js +12 -0
  20. package/dist/parent-graph-state.js.map +1 -1
  21. package/dist/prompts/agents/builder.prompt.js +5 -1
  22. package/dist/prompts/agents/builder.prompt.js.map +1 -1
  23. package/dist/prompts/agents/discovery.prompt.js +13 -0
  24. package/dist/prompts/agents/discovery.prompt.js.map +1 -1
  25. package/dist/prompts/agents/planner.prompt.js +9 -0
  26. package/dist/prompts/agents/planner.prompt.js.map +1 -1
  27. package/dist/prompts/agents/responder.prompt.js +1 -2
  28. package/dist/prompts/agents/responder.prompt.js.map +1 -1
  29. package/dist/prompts/agents/supervisor.prompt.js +15 -4
  30. package/dist/prompts/agents/supervisor.prompt.js.map +1 -1
  31. package/dist/prompts/builder/index.js +1 -1
  32. package/dist/prompts/index.js +1 -1
  33. package/dist/session-manager.service.d.ts +1 -0
  34. package/dist/session-manager.service.js +32 -24
  35. package/dist/session-manager.service.js.map +1 -1
  36. package/dist/subgraphs/builder.subgraph.d.ts +12 -8
  37. package/dist/subgraphs/discovery.subgraph.d.ts +80 -18
  38. package/dist/subgraphs/discovery.subgraph.js +56 -5
  39. package/dist/subgraphs/discovery.subgraph.js.map +1 -1
  40. package/dist/tools/builder-tools.js.map +1 -1
  41. package/dist/tools/get-documentation.tool.d.ts +1 -1
  42. package/dist/tools/get-node-examples.tool.d.ts +3 -3
  43. package/dist/tools/get-workflow-examples.tool.d.ts +1 -1
  44. package/dist/tools/helpers/progress.js +4 -0
  45. package/dist/tools/helpers/progress.js.map +1 -1
  46. package/dist/tools/helpers/response.d.ts +1 -1
  47. package/dist/tools/helpers/response.js +6 -2
  48. package/dist/tools/helpers/response.js.map +1 -1
  49. package/dist/tools/introspect.tool.d.ts +1 -1
  50. package/dist/tools/node-details.tool.d.ts +1 -1
  51. package/dist/tools/node-search.tool.d.ts +1 -1
  52. package/dist/tools/submit-questions.tool.d.ts +1 -1
  53. package/dist/tools/utils/allowed-domains.d.ts +2 -0
  54. package/dist/tools/utils/allowed-domains.js +210 -0
  55. package/dist/tools/utils/allowed-domains.js.map +1 -0
  56. package/dist/tools/utils/node-creation.utils.d.ts +0 -2
  57. package/dist/tools/utils/node-creation.utils.js +1 -11
  58. package/dist/tools/utils/node-creation.utils.js.map +1 -1
  59. package/dist/tools/utils/web-fetch-security.d.ts +21 -0
  60. package/dist/tools/utils/web-fetch-security.js +99 -0
  61. package/dist/tools/utils/web-fetch-security.js.map +1 -0
  62. package/dist/tools/utils/web-fetch.utils.d.ts +20 -0
  63. package/dist/tools/utils/web-fetch.utils.js +259 -0
  64. package/dist/tools/utils/web-fetch.utils.js.map +1 -0
  65. package/dist/tools/web-fetch.tool.d.ts +18 -0
  66. package/dist/tools/web-fetch.tool.js +260 -0
  67. package/dist/tools/web-fetch.tool.js.map +1 -0
  68. package/dist/types/discovery-types.d.ts +6 -0
  69. package/dist/types/planning.d.ts +14 -1
  70. package/dist/types/streaming.d.ts +8 -1
  71. package/dist/types/tools.d.ts +1 -0
  72. package/dist/utils/context-builders.js +11 -0
  73. package/dist/utils/context-builders.js.map +1 -1
  74. package/dist/utils/coordination-log.js +1 -1
  75. package/dist/utils/coordination-log.js.map +1 -1
  76. package/dist/utils/stream-processor.js +35 -2
  77. package/dist/utils/stream-processor.js.map +1 -1
  78. package/dist/utils/subgraph-helpers.d.ts +16 -4
  79. package/dist/utils/subgraph-helpers.js +85 -67
  80. package/dist/utils/subgraph-helpers.js.map +1 -1
  81. package/dist/workflow-builder-agent.d.ts +1 -0
  82. package/dist/workflow-builder-agent.js +61 -48
  83. package/dist/workflow-builder-agent.js.map +1 -1
  84. package/dist/workflow-state.d.ts +1 -1
  85. package/package.json +13 -9
@@ -0,0 +1,20 @@
1
+ import { type BaseMessage } from '@langchain/core/messages';
2
+ export declare function isUrlInUserMessages(url: string, messages: BaseMessage[]): boolean;
3
+ export interface FetchResult {
4
+ status: 'success' | 'unsupported' | 'redirect_new_host';
5
+ body?: string;
6
+ finalUrl?: string;
7
+ httpStatus?: number;
8
+ contentType?: string;
9
+ reason?: string;
10
+ }
11
+ export interface ExtractedContent {
12
+ title: string;
13
+ content: string;
14
+ truncated: boolean;
15
+ truncateReason?: string;
16
+ }
17
+ export declare function normalizeHost(url: string): string;
18
+ export declare function isBlockedUrl(url: string): Promise<boolean>;
19
+ export declare function fetchUrl(url: string, signal?: AbortSignal): Promise<FetchResult>;
20
+ export declare function extractReadableContent(html: string, url: string): Promise<ExtractedContent>;
@@ -0,0 +1,259 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.isUrlInUserMessages = isUrlInUserMessages;
40
+ exports.normalizeHost = normalizeHost;
41
+ exports.isBlockedUrl = isBlockedUrl;
42
+ exports.fetchUrl = fetchUrl;
43
+ exports.extractReadableContent = extractReadableContent;
44
+ const messages_1 = require("@langchain/core/messages");
45
+ const dns_1 = __importDefault(require("dns"));
46
+ const util_1 = require("util");
47
+ const constants_1 = require("../../constants");
48
+ const resolve4 = (0, util_1.promisify)(dns_1.default.resolve4);
49
+ const resolve6 = (0, util_1.promisify)(dns_1.default.resolve6);
50
+ function normalizeUrlForComparison(url) {
51
+ return url.replace(/\/+$/, '');
52
+ }
53
+ function getMessageText(msg) {
54
+ if (typeof msg.content === 'string')
55
+ return msg.content;
56
+ if (Array.isArray(msg.content)) {
57
+ return msg.content
58
+ .filter((part) => typeof part === 'object' && part !== null && 'type' in part && part.type === 'text')
59
+ .map((part) => part.text)
60
+ .join(' ');
61
+ }
62
+ return '';
63
+ }
64
+ function isUrlInUserMessages(url, messages) {
65
+ const normalized = normalizeUrlForComparison(url);
66
+ for (const msg of messages) {
67
+ if (!(msg instanceof messages_1.HumanMessage))
68
+ continue;
69
+ const content = getMessageText(msg);
70
+ if (!content)
71
+ continue;
72
+ if (content.includes(url) || content.includes(normalized)) {
73
+ return true;
74
+ }
75
+ }
76
+ return false;
77
+ }
78
+ function normalizeHost(url) {
79
+ const parsed = new URL(url);
80
+ return parsed.hostname.toLowerCase().replace(/\.$/, '');
81
+ }
82
+ const PRIVATE_IPV4_RANGES = [
83
+ { start: [127, 0, 0, 0], mask: 8 },
84
+ { start: [10, 0, 0, 0], mask: 8 },
85
+ { start: [172, 16, 0, 0], mask: 12 },
86
+ { start: [192, 168, 0, 0], mask: 16 },
87
+ { start: [169, 254, 0, 0], mask: 16 },
88
+ { start: [0, 0, 0, 0], mask: 8 },
89
+ ];
90
+ function ipToNumber(parts) {
91
+ return ((parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3]) >>> 0;
92
+ }
93
+ function isPrivateIPv4(ip) {
94
+ const parts = ip.split('.').map(Number);
95
+ if (parts.length !== 4 || parts.some((p) => isNaN(p) || p < 0 || p > 255))
96
+ return false;
97
+ const ipNum = ipToNumber(parts);
98
+ for (const range of PRIVATE_IPV4_RANGES) {
99
+ const rangeStart = ipToNumber(range.start);
100
+ const mask = (0xffffffff << (32 - range.mask)) >>> 0;
101
+ if ((ipNum & mask) === (rangeStart & mask))
102
+ return true;
103
+ }
104
+ return false;
105
+ }
106
+ function isPrivateIPv6(ip) {
107
+ const normalized = ip.toLowerCase();
108
+ if (normalized === '::1')
109
+ return true;
110
+ if (normalized.startsWith('fe80:'))
111
+ return true;
112
+ if (normalized.startsWith('fc') || normalized.startsWith('fd'))
113
+ return true;
114
+ if (normalized.startsWith('::ffff:')) {
115
+ const v4 = normalized.slice(7);
116
+ return isPrivateIPv4(v4);
117
+ }
118
+ return false;
119
+ }
120
+ function isBlockedHostname(hostname) {
121
+ if (hostname === 'localhost' ||
122
+ hostname === '127.0.0.1' ||
123
+ hostname === '[::1]' ||
124
+ hostname === '::1') {
125
+ return true;
126
+ }
127
+ if (hostname.endsWith('.local') || hostname.endsWith('.internal')) {
128
+ return true;
129
+ }
130
+ if (hostname === '169.254.169.254' || hostname === 'metadata.google.internal') {
131
+ return true;
132
+ }
133
+ if (isPrivateIPv4(hostname))
134
+ return true;
135
+ if (isPrivateIPv6(hostname.replace(/^\[|\]$/g, '')))
136
+ return true;
137
+ return false;
138
+ }
139
+ async function isBlockedUrl(url) {
140
+ let parsed;
141
+ try {
142
+ parsed = new URL(url);
143
+ }
144
+ catch {
145
+ return true;
146
+ }
147
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
148
+ return true;
149
+ }
150
+ const hostname = parsed.hostname.toLowerCase().replace(/\.$/, '');
151
+ if (isBlockedHostname(hostname))
152
+ return true;
153
+ try {
154
+ const [v4Addrs, v6Addrs] = await Promise.allSettled([resolve4(hostname), resolve6(hostname)]);
155
+ const allIps = [];
156
+ if (v4Addrs.status === 'fulfilled')
157
+ allIps.push(...v4Addrs.value);
158
+ if (v6Addrs.status === 'fulfilled')
159
+ allIps.push(...v6Addrs.value);
160
+ if (allIps.length === 0)
161
+ return true;
162
+ for (const ip of allIps) {
163
+ if (isPrivateIPv4(ip) || isPrivateIPv6(ip))
164
+ return true;
165
+ }
166
+ }
167
+ catch {
168
+ return true;
169
+ }
170
+ return false;
171
+ }
172
+ async function fetchUrl(url, signal) {
173
+ const controller = new AbortController();
174
+ const timeout = setTimeout(() => controller.abort(), constants_1.WEB_FETCH_TIMEOUT_MS);
175
+ if (signal) {
176
+ signal.addEventListener('abort', () => controller.abort(), { once: true });
177
+ }
178
+ try {
179
+ const response = await fetch(url, {
180
+ signal: controller.signal,
181
+ redirect: 'follow',
182
+ headers: {
183
+ 'User-Agent': 'n8n-workflow-builder/1.0',
184
+ Accept: 'text/html,application/xhtml+xml,*/*',
185
+ },
186
+ });
187
+ const finalUrl = response.url;
188
+ const contentType = response.headers.get('content-type') ?? '';
189
+ if (contentType.includes('application/pdf')) {
190
+ return { status: 'unsupported', reason: 'pdf' };
191
+ }
192
+ const requestedHost = normalizeHost(url);
193
+ const finalHost = normalizeHost(finalUrl);
194
+ if (requestedHost !== finalHost) {
195
+ return { status: 'redirect_new_host', finalUrl };
196
+ }
197
+ const reader = response.body?.getReader();
198
+ if (!reader) {
199
+ return {
200
+ status: 'success',
201
+ body: '',
202
+ finalUrl,
203
+ httpStatus: response.status,
204
+ contentType,
205
+ };
206
+ }
207
+ const chunks = [];
208
+ let totalBytes = 0;
209
+ while (true) {
210
+ const { done, value } = await reader.read();
211
+ if (done)
212
+ break;
213
+ totalBytes += value.byteLength;
214
+ if (totalBytes > constants_1.WEB_FETCH_MAX_BYTES) {
215
+ void reader.cancel();
216
+ break;
217
+ }
218
+ chunks.push(value);
219
+ }
220
+ const body = new TextDecoder().decode(chunks.reduce((acc, chunk) => {
221
+ const merged = new Uint8Array(acc.length + chunk.length);
222
+ merged.set(acc);
223
+ merged.set(chunk, acc.length);
224
+ return merged;
225
+ }, new Uint8Array()));
226
+ return {
227
+ status: 'success',
228
+ body,
229
+ finalUrl,
230
+ httpStatus: response.status,
231
+ contentType,
232
+ };
233
+ }
234
+ finally {
235
+ clearTimeout(timeout);
236
+ }
237
+ }
238
+ async function extractReadableContent(html, url) {
239
+ const [{ JSDOM, VirtualConsole }, { Readability }, { default: TurndownService }] = await Promise.all([Promise.resolve().then(() => __importStar(require('jsdom'))), Promise.resolve().then(() => __importStar(require('@mozilla/readability'))), Promise.resolve().then(() => __importStar(require('turndown')))]);
240
+ const virtualConsole = new VirtualConsole();
241
+ const dom = new JSDOM(html, { url, virtualConsole });
242
+ const article = new Readability(dom.window.document, { keepClasses: true }).parse();
243
+ const title = article?.title ?? '';
244
+ const articleHtml = article?.content ?? '';
245
+ const turndownService = new TurndownService({
246
+ headingStyle: 'atx',
247
+ codeBlockStyle: 'fenced',
248
+ });
249
+ let content = articleHtml ? turndownService.turndown(articleHtml) : '';
250
+ let truncated = false;
251
+ let truncateReason;
252
+ if (content.length > constants_1.WEB_FETCH_MAX_CONTENT_CHARS) {
253
+ content = content.substring(0, constants_1.WEB_FETCH_MAX_CONTENT_CHARS);
254
+ truncated = true;
255
+ truncateReason = `Content truncated to ${constants_1.WEB_FETCH_MAX_CONTENT_CHARS} characters`;
256
+ }
257
+ return { title, content, truncated, truncateReason };
258
+ }
259
+ //# sourceMappingURL=web-fetch.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-fetch.utils.js","sourceRoot":"","sources":["../../../src/tools/utils/web-fetch.utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { z } from 'zod';
2
+ import type { BuilderToolBase } from '../utils/stream-processor';
3
+ import type { WebFetchSecurityManager } from './utils/web-fetch-security';
4
+ export declare const WEB_FETCH_TOOL: BuilderToolBase;
5
+ export declare function createWebFetchTool(createSecurity: () => WebFetchSecurityManager): {
6
+ toolName: string;
7
+ displayTitle: string;
8
+ getCustomDisplayTitle?: (values: Record<string, unknown>) => string;
9
+ tool: import("@langchain/core/tools").DynamicStructuredTool<z.ZodObject<{
10
+ url: z.ZodString;
11
+ }, "strip", z.ZodTypeAny, {
12
+ url: string;
13
+ }, {
14
+ url: string;
15
+ }>, unknown, {
16
+ url: string;
17
+ }, import("@langchain/langgraph").Command<unknown, Record<string, unknown>, string>, string>;
18
+ };
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WEB_FETCH_TOOL = void 0;
4
+ exports.createWebFetchTool = createWebFetchTool;
5
+ const tools_1 = require("@langchain/core/tools");
6
+ const langgraph_1 = require("@langchain/langgraph");
7
+ const crypto_1 = require("crypto");
8
+ const zod_1 = require("zod");
9
+ const constants_1 = require("../constants");
10
+ const errors_1 = require("../errors");
11
+ const progress_1 = require("../tools/helpers/progress");
12
+ const response_1 = require("../tools/helpers/response");
13
+ const web_fetch_utils_1 = require("./utils/web-fetch.utils");
14
+ function requestDomainApproval(domain, url) {
15
+ const requestId = (0, crypto_1.randomUUID)();
16
+ const resumeValue = (0, langgraph_1.interrupt)({
17
+ type: 'web_fetch_approval',
18
+ requestId,
19
+ url,
20
+ domain,
21
+ });
22
+ if (resumeValue.url !== url) {
23
+ return {
24
+ approved: false,
25
+ message: 'The approval response did not match the request. Please try again.',
26
+ };
27
+ }
28
+ if (resumeValue.action === 'deny') {
29
+ return {
30
+ approved: false,
31
+ message: `The user denied fetching content from ${domain}.`,
32
+ };
33
+ }
34
+ if (resumeValue.action !== 'allow_once' &&
35
+ resumeValue.action !== 'allow_domain' &&
36
+ resumeValue.action !== 'allow_all') {
37
+ return { approved: false, message: 'Invalid approval action. Please try again.' };
38
+ }
39
+ return { approved: true, action: resumeValue.action };
40
+ }
41
+ exports.WEB_FETCH_TOOL = {
42
+ toolName: 'web_fetch',
43
+ displayTitle: 'Fetching web content',
44
+ getCustomDisplayTitle: (args) => {
45
+ const url = typeof args.url === 'string' ? args.url : '';
46
+ if (!url)
47
+ return 'Fetching web content';
48
+ return `Fetching ${url}`;
49
+ },
50
+ };
51
+ const webFetchSchema = zod_1.z.object({
52
+ url: zod_1.z.string().url().describe('The URL to fetch content from'),
53
+ });
54
+ function createWebFetchTool(createSecurity) {
55
+ const dynamicTool = (0, tools_1.tool)(async (input, config) => {
56
+ const parsedArgs = typeof input === 'object' && input !== null ? input : {};
57
+ const customTitle = exports.WEB_FETCH_TOOL.getCustomDisplayTitle?.(parsedArgs);
58
+ const reporter = (0, progress_1.createProgressReporter)(config, exports.WEB_FETCH_TOOL.toolName, exports.WEB_FETCH_TOOL.displayTitle, customTitle);
59
+ try {
60
+ const validatedInput = webFetchSchema.parse(input);
61
+ const { url } = validatedInput;
62
+ reporter.start(validatedInput);
63
+ const security = createSecurity();
64
+ reporter.progress('Checking URL safety...');
65
+ const blocked = await (0, web_fetch_utils_1.isBlockedUrl)(url);
66
+ if (blocked) {
67
+ const message = 'This URL cannot be fetched because it points to a private or internal address.';
68
+ reporter.error({ message });
69
+ return (0, response_1.createSuccessResponse)(config, message, {
70
+ fetchedUrlContent: [{ url, status: 'error', title: '', content: message }],
71
+ });
72
+ }
73
+ if (!security.hasBudget()) {
74
+ const message = `Maximum of ${constants_1.WEB_FETCH_MAX_PER_TURN} web fetches per turn reached. Please continue without additional fetches.`;
75
+ reporter.error({ message });
76
+ return (0, response_1.createSuccessResponse)(config, message);
77
+ }
78
+ const host = (0, web_fetch_utils_1.normalizeHost)(url);
79
+ let userAction;
80
+ let redirectUserAction;
81
+ const hostAllowed = security.isHostAllowed(host, url);
82
+ if (!hostAllowed) {
83
+ const approval = requestDomainApproval(host, url);
84
+ if (!approval.approved) {
85
+ reporter.error({ message: approval.message });
86
+ return (0, response_1.createSuccessResponse)(config, approval.message, {
87
+ fetchedUrlContent: [
88
+ { url, status: 'error', title: '', content: approval.message },
89
+ ],
90
+ });
91
+ }
92
+ userAction = approval.action;
93
+ if (userAction === 'allow_domain') {
94
+ security.approveDomain(host);
95
+ }
96
+ else if (userAction === 'allow_all') {
97
+ security.approveAllDomains();
98
+ }
99
+ }
100
+ reporter.progress('Fetching content...');
101
+ const fetchResult = await (0, web_fetch_utils_1.fetchUrl)(url);
102
+ if (fetchResult.status === 'unsupported') {
103
+ security.recordFetch();
104
+ const message = `This content type is not supported: ${fetchResult.reason}. Only HTML pages can be fetched.`;
105
+ reporter.error({ message });
106
+ return (0, response_1.createSuccessResponse)(config, message, {
107
+ ...security.getStateUpdates(),
108
+ fetchedUrlContent: [{ url, status: 'error', title: '', content: message }],
109
+ });
110
+ }
111
+ if (fetchResult.status === 'redirect_new_host' && fetchResult.finalUrl) {
112
+ const newHost = (0, web_fetch_utils_1.normalizeHost)(fetchResult.finalUrl);
113
+ const redirectTitle = exports.WEB_FETCH_TOOL.getCustomDisplayTitle?.({
114
+ url: fetchResult.finalUrl,
115
+ });
116
+ if (redirectTitle) {
117
+ reporter.setCustomTitle(redirectTitle);
118
+ }
119
+ const redirectBlocked = await (0, web_fetch_utils_1.isBlockedUrl)(fetchResult.finalUrl);
120
+ if (redirectBlocked) {
121
+ security.recordFetch();
122
+ const message = `The URL redirected to ${newHost}, which points to a private address. Fetch blocked.`;
123
+ reporter.error({ message });
124
+ return (0, response_1.createSuccessResponse)(config, message, {
125
+ ...security.getStateUpdates(),
126
+ fetchedUrlContent: [{ url, status: 'error', title: '', content: message }],
127
+ });
128
+ }
129
+ if (!security.isHostAllowed(newHost, fetchResult.finalUrl)) {
130
+ const approval = requestDomainApproval(newHost, fetchResult.finalUrl);
131
+ if (!approval.approved) {
132
+ security.recordFetch();
133
+ reporter.error({ message: approval.message });
134
+ return (0, response_1.createSuccessResponse)(config, approval.message, {
135
+ ...security.getStateUpdates(),
136
+ fetchedUrlContent: [
137
+ { url, status: 'error', title: '', content: approval.message },
138
+ ],
139
+ });
140
+ }
141
+ redirectUserAction = approval.action;
142
+ if (redirectUserAction === 'allow_domain') {
143
+ security.approveDomain(newHost);
144
+ }
145
+ else if (redirectUserAction === 'allow_all') {
146
+ security.approveAllDomains();
147
+ }
148
+ }
149
+ const finalResult = await (0, web_fetch_utils_1.fetchUrl)(fetchResult.finalUrl);
150
+ if (finalResult.status !== 'success' || !finalResult.body) {
151
+ security.recordFetch();
152
+ const message = `Failed to fetch content from the redirected URL (${newHost}).`;
153
+ reporter.error({ message });
154
+ return (0, response_1.createSuccessResponse)(config, message, {
155
+ ...security.getStateUpdates(),
156
+ fetchedUrlContent: [{ url, status: 'error', title: '', content: message }],
157
+ });
158
+ }
159
+ Object.assign(fetchResult, finalResult);
160
+ fetchResult.finalUrl = finalResult.finalUrl;
161
+ }
162
+ if (!fetchResult.body) {
163
+ security.recordFetch();
164
+ const message = 'The page returned no content.';
165
+ reporter.error({ message });
166
+ return (0, response_1.createSuccessResponse)(config, message, {
167
+ ...security.getStateUpdates(),
168
+ fetchedUrlContent: [{ url, status: 'error', title: '', content: message }],
169
+ });
170
+ }
171
+ reporter.progress('Extracting content...');
172
+ const extracted = await (0, web_fetch_utils_1.extractReadableContent)(fetchResult.body, fetchResult.finalUrl ?? url);
173
+ const responseLines = [
174
+ '<web_fetch_result>',
175
+ `<url>${url}</url>`,
176
+ fetchResult.finalUrl && fetchResult.finalUrl !== url
177
+ ? `<final_url>${fetchResult.finalUrl}</final_url>`
178
+ : '',
179
+ `<title>${extracted.title}</title>`,
180
+ extracted.truncated ? `<note>${extracted.truncateReason}</note>` : '',
181
+ '<content>',
182
+ extracted.content,
183
+ '</content>',
184
+ '</web_fetch_result>',
185
+ ]
186
+ .filter(Boolean)
187
+ .join('\n');
188
+ security.recordFetch();
189
+ const stateUpdates = {
190
+ ...security.getStateUpdates(),
191
+ fetchedUrlContent: [
192
+ {
193
+ url,
194
+ status: 'success',
195
+ title: extracted.title,
196
+ content: extracted.content,
197
+ },
198
+ ],
199
+ };
200
+ reporter.complete({
201
+ status: 'success',
202
+ url,
203
+ finalUrl: fetchResult.finalUrl,
204
+ truncated: extracted.truncated,
205
+ });
206
+ return (0, response_1.createSuccessResponse)(config, responseLines, stateUpdates);
207
+ }
208
+ catch (error) {
209
+ if (error instanceof zod_1.z.ZodError) {
210
+ const validationError = new errors_1.ValidationError('Invalid URL input', {
211
+ extra: { errors: error.errors },
212
+ });
213
+ reporter.error(validationError);
214
+ return (0, response_1.createErrorResponse)(config, validationError);
215
+ }
216
+ if (error instanceof Error &&
217
+ (error.name === 'GraphInterrupt' || error.constructor.name === 'GraphInterrupt')) {
218
+ throw error;
219
+ }
220
+ const toolError = new errors_1.ToolExecutionError(error instanceof Error ? error.message : 'Failed to fetch URL', {
221
+ toolName: exports.WEB_FETCH_TOOL.toolName,
222
+ cause: error instanceof Error ? error : undefined,
223
+ });
224
+ reporter.error(toolError);
225
+ return (0, response_1.createErrorResponse)(config, toolError, {
226
+ fetchedUrlContent: [
227
+ {
228
+ url: input?.url ?? '',
229
+ status: 'error',
230
+ title: '',
231
+ content: toolError.message,
232
+ },
233
+ ],
234
+ });
235
+ }
236
+ }, {
237
+ name: exports.WEB_FETCH_TOOL.toolName,
238
+ description: `Fetch the content of a web page and extract its readable text.
239
+
240
+ Use when:
241
+ - User pastes a URL to documentation, API reference, or external resource
242
+ - You need external documentation to configure an HTTP Request node
243
+ - A node references an external URL with relevant configuration details
244
+
245
+ The tool will request user approval before fetching any URL.
246
+ After approval, it returns the page's readable text content.
247
+
248
+ Constraints:
249
+ - Only public HTTP/HTTPS URLs
250
+ - Maximum 3 fetches per conversation turn
251
+ - Only text content, PDFs, images, binaries are not supported
252
+ - Redirects to a different host may require separate approval`,
253
+ schema: webFetchSchema,
254
+ });
255
+ return {
256
+ tool: dynamicTool,
257
+ ...exports.WEB_FETCH_TOOL,
258
+ };
259
+ }
260
+ //# sourceMappingURL=web-fetch.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-fetch.tool.js","sourceRoot":"","sources":["../../src/tools/web-fetch.tool.ts"],"names":[],"mappings":"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"}
@@ -11,4 +11,10 @@ export interface DiscoveryContext {
11
11
  availableResources?: ResourceInfo[];
12
12
  }>;
13
13
  bestPractices?: string;
14
+ fetchedUrlContent?: Array<{
15
+ url: string;
16
+ status: 'success' | 'error';
17
+ title: string;
18
+ content: string;
19
+ }>;
14
20
  }
@@ -32,8 +32,15 @@ export interface PlanInterruptValue {
32
32
  type: 'plan';
33
33
  plan: PlanOutput;
34
34
  }
35
- export type HITLInterruptValue = QuestionsInterruptValue | PlanInterruptValue;
35
+ export interface WebFetchApprovalInterruptValue {
36
+ type: 'web_fetch_approval';
37
+ requestId: string;
38
+ url: string;
39
+ domain: string;
40
+ }
41
+ export type HITLInterruptValue = QuestionsInterruptValue | PlanInterruptValue | WebFetchApprovalInterruptValue;
36
42
  export type PlanDecision = 'approve' | 'reject' | 'modify';
43
+ export type WebFetchDecision = 'allow_once' | 'allow_domain' | 'allow_all' | 'deny';
37
44
  export type HITLHistoryEntry = {
38
45
  type: 'questions_answered';
39
46
  afterMessageId?: string;
@@ -45,4 +52,10 @@ export type HITLHistoryEntry = {
45
52
  plan: PlanOutput;
46
53
  decision: PlanDecision;
47
54
  feedback?: string;
55
+ } | {
56
+ type: 'web_fetch_decided';
57
+ afterMessageId?: string;
58
+ url: string;
59
+ domain: string;
60
+ decision: WebFetchDecision;
48
61
  };
@@ -64,7 +64,14 @@ export interface AgentSuggestionChunk {
64
64
  text: string;
65
65
  suggestionId?: string;
66
66
  }
67
- export type StreamChunk = AgentMessageChunk | ToolProgressChunk | WorkflowUpdateChunk | ExecutionRequestChunk | SessionMessagesChunk | QuestionsChunk | PlanChunk | CodeDiffChunk | MessagesCompactedChunk | SummaryChunk | AgentSuggestionChunk;
67
+ export interface WebFetchApprovalChunk {
68
+ role: 'assistant';
69
+ type: 'web_fetch_approval';
70
+ requestId: string;
71
+ url: string;
72
+ domain: string;
73
+ }
74
+ export type StreamChunk = AgentMessageChunk | ToolProgressChunk | WorkflowUpdateChunk | ExecutionRequestChunk | SessionMessagesChunk | QuestionsChunk | PlanChunk | CodeDiffChunk | MessagesCompactedChunk | SummaryChunk | AgentSuggestionChunk | WebFetchApprovalChunk;
68
75
  export interface StreamOutput {
69
76
  messages: StreamChunk[];
70
77
  interruptId?: string;
@@ -29,6 +29,7 @@ export interface ProgressReporter {
29
29
  progress: (message: string, data?: Record<string, unknown>) => void;
30
30
  complete: <T>(output: T) => void;
31
31
  error: (error: ToolError) => void;
32
+ setCustomTitle: (title: string) => void;
32
33
  createBatchReporter: (scope: string) => BatchReporter;
33
34
  }
34
35
  export interface BatchReporter {