@runflow-ai/sdk 1.0.88 → 1.0.90

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 (71) hide show
  1. package/dist/core/api-client.d.ts +7 -0
  2. package/dist/core/api-client.d.ts.map +1 -1
  3. package/dist/core/api-client.js +72 -0
  4. package/dist/core/api-client.js.map +1 -1
  5. package/dist/core/helpers/observability-helpers.d.ts.map +1 -1
  6. package/dist/core/helpers/observability-helpers.js +3 -2
  7. package/dist/core/helpers/observability-helpers.js.map +1 -1
  8. package/dist/index.d.ts +6 -2
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +12 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/observability/execution.js +3 -1
  13. package/dist/observability/execution.js.map +1 -1
  14. package/dist/observability/index.d.ts +2 -2
  15. package/dist/observability/index.d.ts.map +1 -1
  16. package/dist/observability/index.js +3 -1
  17. package/dist/observability/index.js.map +1 -1
  18. package/dist/observability/logging.d.ts +43 -3
  19. package/dist/observability/logging.d.ts.map +1 -1
  20. package/dist/observability/logging.js +87 -10
  21. package/dist/observability/logging.js.map +1 -1
  22. package/dist/observability/trace-collector.d.ts.map +1 -1
  23. package/dist/observability/trace-collector.js +14 -0
  24. package/dist/observability/trace-collector.js.map +1 -1
  25. package/dist/tools/index.d.ts +4 -0
  26. package/dist/tools/index.d.ts.map +1 -1
  27. package/dist/tools/index.js +9 -1
  28. package/dist/tools/index.js.map +1 -1
  29. package/dist/tools/schedule/index.d.ts +54 -0
  30. package/dist/tools/schedule/index.d.ts.map +1 -0
  31. package/dist/tools/schedule/index.js +184 -0
  32. package/dist/tools/schedule/index.js.map +1 -0
  33. package/dist/tools/schedule/types.d.ts +38 -0
  34. package/dist/tools/schedule/types.d.ts.map +1 -0
  35. package/dist/tools/schedule/types.js +3 -0
  36. package/dist/tools/schedule/types.js.map +1 -0
  37. package/dist/tools/web-search/formatter.d.ts +7 -0
  38. package/dist/tools/web-search/formatter.d.ts.map +1 -0
  39. package/dist/tools/web-search/formatter.js +31 -0
  40. package/dist/tools/web-search/formatter.js.map +1 -0
  41. package/dist/tools/web-search/index.d.ts +29 -0
  42. package/dist/tools/web-search/index.d.ts.map +1 -0
  43. package/dist/tools/web-search/index.js +88 -0
  44. package/dist/tools/web-search/index.js.map +1 -0
  45. package/dist/tools/web-search/providers/exa.d.ts +5 -0
  46. package/dist/tools/web-search/providers/exa.d.ts.map +1 -0
  47. package/dist/tools/web-search/providers/exa.js +52 -0
  48. package/dist/tools/web-search/providers/exa.js.map +1 -0
  49. package/dist/tools/web-search/providers/index.d.ts +6 -0
  50. package/dist/tools/web-search/providers/index.d.ts.map +1 -0
  51. package/dist/tools/web-search/providers/index.js +28 -0
  52. package/dist/tools/web-search/providers/index.js.map +1 -0
  53. package/dist/tools/web-search/providers/serper.d.ts +5 -0
  54. package/dist/tools/web-search/providers/serper.d.ts.map +1 -0
  55. package/dist/tools/web-search/providers/serper.js +48 -0
  56. package/dist/tools/web-search/providers/serper.js.map +1 -0
  57. package/dist/tools/web-search/providers/tavily.d.ts +5 -0
  58. package/dist/tools/web-search/providers/tavily.d.ts.map +1 -0
  59. package/dist/tools/web-search/providers/tavily.js +48 -0
  60. package/dist/tools/web-search/providers/tavily.js.map +1 -0
  61. package/dist/tools/web-search/types.d.ts +26 -0
  62. package/dist/tools/web-search/types.d.ts.map +1 -0
  63. package/dist/tools/web-search/types.js +3 -0
  64. package/dist/tools/web-search/types.js.map +1 -0
  65. package/dist/types/all-types.d.ts +25 -0
  66. package/dist/types/all-types.d.ts.map +1 -1
  67. package/dist/workflows/workflow.d.ts +1 -0
  68. package/dist/workflows/workflow.d.ts.map +1 -1
  69. package/dist/workflows/workflow.js +37 -15
  70. package/dist/workflows/workflow.js.map +1 -1
  71. package/package.json +1 -1
@@ -0,0 +1,7 @@
1
+ import { WebSearchResponse } from './types';
2
+ /**
3
+ * Format a WebSearchResponse as markdown for LLM consumption.
4
+ * Kept concise to avoid token waste.
5
+ */
6
+ export declare function formatForLLM(response: WebSearchResponse): string;
7
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../../src/tools/web-search/formatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CA2BhE"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatForLLM = formatForLLM;
4
+ /**
5
+ * Format a WebSearchResponse as markdown for LLM consumption.
6
+ * Kept concise to avoid token waste.
7
+ */
8
+ function formatForLLM(response) {
9
+ const lines = [];
10
+ if (response.answer) {
11
+ lines.push(`**Answer:** ${response.answer}`);
12
+ lines.push('');
13
+ }
14
+ if (!response.results || response.results.length === 0) {
15
+ lines.push('No results found.');
16
+ return lines.join('\n');
17
+ }
18
+ lines.push('**Search Results:**');
19
+ lines.push('');
20
+ response.results.forEach((result, index) => {
21
+ const num = index + 1;
22
+ lines.push(`${num}. [${result.title}](${result.url})`);
23
+ lines.push(` ${result.snippet}`);
24
+ if (result.publishedDate) {
25
+ lines.push(` *Published: ${result.publishedDate}*`);
26
+ }
27
+ lines.push('');
28
+ });
29
+ return lines.join('\n').trimEnd();
30
+ }
31
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../../src/tools/web-search/formatter.ts"],"names":[],"mappings":";;AAMA,oCA2BC;AA/BD;;;GAGG;AACH,SAAgB,YAAY,CAAC,QAA2B;IACtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACzC,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC;QACxD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { WebSearchConfig, WebSearchResponse } from './types';
2
+ import type { RunflowTool } from '../../types';
3
+ export type { WebSearchConfig, WebSearchResponse, WebSearchResult, WebSearchProvider } from './types';
4
+ /**
5
+ * Execute a web search programmatically.
6
+ *
7
+ * - Standalone mode: if `config.apiKey` is provided, calls the search provider directly.
8
+ * - Platform mode: uses the Runflow platform connector infrastructure (no apiKey needed).
9
+ *
10
+ * @example
11
+ * // Standalone (direct API key)
12
+ * const result = await webSearch('latest AI news', { provider: 'tavily', apiKey: 'tvly-...' });
13
+ *
14
+ * // Platform connector
15
+ * const result = await webSearch('latest AI news', { connector: 'tavily-default' });
16
+ */
17
+ export declare function webSearch(query: string, config?: WebSearchConfig): Promise<WebSearchResponse>;
18
+ /**
19
+ * Create a RunflowTool that performs web searches, ready for use in agents.
20
+ *
21
+ * @example
22
+ * import { Agent, createWebSearchTool } from '@runflow-ai/sdk';
23
+ *
24
+ * const agent = new Agent({
25
+ * tools: [createWebSearchTool({ provider: 'tavily', apiKey: process.env.TAVILY_API_KEY })],
26
+ * });
27
+ */
28
+ export declare function createWebSearchTool(config?: WebSearchConfig): RunflowTool;
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/web-search/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAK7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEtG;;;;;;;;;;;;GAYG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,eAAoB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAiC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,eAAoB,GAAG,WAAW,CA8B7E"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.webSearch = webSearch;
4
+ exports.createWebSearchTool = createWebSearchTool;
5
+ const zod_1 = require("zod");
6
+ const providers_1 = require("./providers");
7
+ const formatter_1 = require("./formatter");
8
+ const tool_creator_1 = require("../tool-creator");
9
+ const api_client_1 = require("../../core/api-client");
10
+ /**
11
+ * Execute a web search programmatically.
12
+ *
13
+ * - Standalone mode: if `config.apiKey` is provided, calls the search provider directly.
14
+ * - Platform mode: uses the Runflow platform connector infrastructure (no apiKey needed).
15
+ *
16
+ * @example
17
+ * // Standalone (direct API key)
18
+ * const result = await webSearch('latest AI news', { provider: 'tavily', apiKey: 'tvly-...' });
19
+ *
20
+ * // Platform connector
21
+ * const result = await webSearch('latest AI news', { connector: 'tavily-default' });
22
+ */
23
+ async function webSearch(query, config = {}) {
24
+ const provider = config.provider ?? 'tavily';
25
+ // Standalone mode: direct provider call
26
+ if (config.apiKey) {
27
+ const adapter = (0, providers_1.getSearchProvider)(provider);
28
+ return adapter.search(query, config);
29
+ }
30
+ // Platform mode: use connector infrastructure
31
+ const api = (0, api_client_1.createRunflowAPIClient)();
32
+ const connectorSlug = config.connector ?? `${provider}-default`;
33
+ const rawResponse = await api.connector(connectorSlug, 'search', {
34
+ query,
35
+ maxResults: config.maxResults,
36
+ searchDepth: config.searchDepth,
37
+ includeContent: config.includeContent,
38
+ });
39
+ // Normalize the connector response into WebSearchResponse
40
+ // The platform connector is expected to return a compatible shape.
41
+ // If the platform returns a non-standard shape, adapt it here.
42
+ if (rawResponse && Array.isArray(rawResponse.results)) {
43
+ return rawResponse;
44
+ }
45
+ // Fallback: wrap raw results if the connector returns a different shape
46
+ return {
47
+ query,
48
+ results: Array.isArray(rawResponse) ? rawResponse : [],
49
+ answer: rawResponse?.answer,
50
+ };
51
+ }
52
+ /**
53
+ * Create a RunflowTool that performs web searches, ready for use in agents.
54
+ *
55
+ * @example
56
+ * import { Agent, createWebSearchTool } from '@runflow-ai/sdk';
57
+ *
58
+ * const agent = new Agent({
59
+ * tools: [createWebSearchTool({ provider: 'tavily', apiKey: process.env.TAVILY_API_KEY })],
60
+ * });
61
+ */
62
+ function createWebSearchTool(config = {}) {
63
+ const inputSchema = zod_1.z.object({
64
+ query: zod_1.z.string().describe('The search query to look up on the internet'),
65
+ maxResults: zod_1.z
66
+ .number()
67
+ .optional()
68
+ .describe('Maximum number of results to return (default: 5)'),
69
+ });
70
+ const tool = (0, tool_creator_1.createTool)({
71
+ id: 'web_search',
72
+ description: 'Search the internet for current information. Use this when you need up-to-date data, facts, news, or information not in your training data.',
73
+ inputSchema,
74
+ execute: async ({ context }) => {
75
+ const mergedConfig = {
76
+ ...config,
77
+ maxResults: context.maxResults ?? config.maxResults,
78
+ };
79
+ const response = await webSearch(context.query, mergedConfig);
80
+ return (0, formatter_1.formatForLLM)(response);
81
+ },
82
+ });
83
+ // Attach metadata for introspection
84
+ tool._isWebSearchTool = true;
85
+ tool._provider = config.provider ?? 'tavily';
86
+ return tool;
87
+ }
88
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/web-search/index.ts"],"names":[],"mappings":";;AAwBA,8BAoCC;AAYD,kDA8BC;AAtGD,6BAAwB;AAExB,2CAAgD;AAChD,2CAA2C;AAC3C,kDAA6C;AAC7C,sDAA+D;AAM/D;;;;;;;;;;;;GAYG;AACI,KAAK,UAAU,SAAS,CAC7B,KAAa,EACb,SAA0B,EAAE;IAE5B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAE7C,wCAAwC;IACxC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,IAAA,6BAAiB,EAAC,QAAQ,CAAC,CAAC;QAC5C,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,8CAA8C;IAC9C,MAAM,GAAG,GAAG,IAAA,mCAAsB,GAAE,CAAC;IAErC,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,QAAQ,UAAU,CAAC;IAChE,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,aAAa,EAAE,QAAQ,EAAE;QAC/D,KAAK;QACL,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC,CAAC;IAEH,0DAA0D;IAC1D,mEAAmE;IACnE,+DAA+D;IAC/D,IAAI,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QACtD,OAAO,WAAgC,CAAC;IAC1C,CAAC;IAED,wEAAwE;IACxE,OAAO;QACL,KAAK;QACL,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;QACtD,MAAM,EAAE,WAAW,EAAE,MAAM;KAC5B,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,mBAAmB,CAAC,SAA0B,EAAE;IAC9D,MAAM,WAAW,GAAG,OAAC,CAAC,MAAM,CAAC;QAC3B,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QACzE,UAAU,EAAE,OAAC;aACV,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,kDAAkD,CAAC;KAChE,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,IAAA,yBAAU,EAAC;QACtB,EAAE,EAAE,YAAY;QAChB,WAAW,EACT,6IAA6I;QAC/I,WAAW;QACX,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,MAAM,YAAY,GAAoB;gBACpC,GAAG,MAAM;gBACT,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU;aACpD,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YAC9D,OAAO,IAAA,wBAAY,EAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;KACF,CAAC,CAAC;IAEH,oCAAoC;IACnC,IAAY,CAAC,gBAAgB,GAAG,IAAI,CAAC;IACrC,IAAY,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAEtD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { SearchProviderAdapter, WebSearchConfig, WebSearchResponse } from '../types';
2
+ export declare class ExaProvider implements SearchProviderAdapter {
3
+ search(query: string, config: WebSearchConfig): Promise<WebSearchResponse>;
4
+ }
5
+ //# sourceMappingURL=exa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exa.d.ts","sourceRoot":"","sources":["../../../../src/tools/web-search/providers/exa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,iBAAiB,EAAmB,MAAM,UAAU,CAAC;AAoBtG,qBAAa,WAAY,YAAW,qBAAqB;IACjD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAqDjF"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExaProvider = void 0;
4
+ class ExaProvider {
5
+ async search(query, config) {
6
+ const apiKey = config.apiKey;
7
+ if (!apiKey) {
8
+ throw new Error('Exa API key is required');
9
+ }
10
+ const body = {
11
+ query,
12
+ numResults: config.maxResults ?? 5,
13
+ contents: {
14
+ text: config.includeContent ?? false,
15
+ highlights: true,
16
+ },
17
+ type: 'neural',
18
+ };
19
+ const response = await fetch('https://api.exa.ai/search', {
20
+ method: 'POST',
21
+ headers: {
22
+ 'Content-Type': 'application/json',
23
+ 'x-api-key': apiKey,
24
+ },
25
+ body: JSON.stringify(body),
26
+ });
27
+ if (!response.ok) {
28
+ const errorText = await response.text();
29
+ throw new Error(`Exa API error ${response.status}: ${errorText}`);
30
+ }
31
+ const data = (await response.json());
32
+ const results = data.results.map((r) => {
33
+ const snippet = r.highlights && r.highlights.length > 0
34
+ ? r.highlights.map((h) => h.text).join(' ... ')
35
+ : (r.text ?? '');
36
+ return {
37
+ title: r.title,
38
+ url: r.url,
39
+ snippet,
40
+ content: r.text,
41
+ score: r.score,
42
+ publishedDate: r.publishedDate,
43
+ };
44
+ });
45
+ return {
46
+ query,
47
+ results,
48
+ };
49
+ }
50
+ }
51
+ exports.ExaProvider = ExaProvider;
52
+ //# sourceMappingURL=exa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exa.js","sourceRoot":"","sources":["../../../../src/tools/web-search/providers/exa.ts"],"names":[],"mappings":";;;AAoBA,MAAa,WAAW;IACtB,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,MAAuB;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,IAAI,GAAG;YACX,KAAK;YACL,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;YAClC,QAAQ,EAAE;gBACR,IAAI,EAAE,MAAM,CAAC,cAAc,IAAI,KAAK;gBACpC,UAAU,EAAE,IAAI;aACjB;YACD,IAAI,EAAE,QAAQ;SACf,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,2BAA2B,EAAE;YACxD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,MAAM;aACpB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAC;QAEvD,MAAM,OAAO,GAAsB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACxD,MAAM,OAAO,GACX,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;gBACrC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC/C,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAErB,OAAO;gBACL,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,OAAO;gBACP,OAAO,EAAE,CAAC,CAAC,IAAI;gBACf,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,aAAa,EAAE,CAAC,CAAC,aAAa;aAC/B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,KAAK;YACL,OAAO;SACR,CAAC;IACJ,CAAC;CACF;AAtDD,kCAsDC"}
@@ -0,0 +1,6 @@
1
+ import { SearchProviderAdapter, WebSearchProvider } from '../types';
2
+ export declare function getSearchProvider(name: WebSearchProvider): SearchProviderAdapter;
3
+ export { TavilyProvider } from './tavily';
4
+ export { ExaProvider } from './exa';
5
+ export { SerperProvider } from './serper';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tools/web-search/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAKpE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,GAAG,qBAAqB,CAahF;AAED,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SerperProvider = exports.ExaProvider = exports.TavilyProvider = void 0;
4
+ exports.getSearchProvider = getSearchProvider;
5
+ const tavily_1 = require("./tavily");
6
+ const exa_1 = require("./exa");
7
+ const serper_1 = require("./serper");
8
+ function getSearchProvider(name) {
9
+ switch (name) {
10
+ case 'tavily':
11
+ return new tavily_1.TavilyProvider();
12
+ case 'exa':
13
+ return new exa_1.ExaProvider();
14
+ case 'serper':
15
+ return new serper_1.SerperProvider();
16
+ default: {
17
+ const _exhaustive = name;
18
+ throw new Error(`Unknown web search provider: ${_exhaustive}`);
19
+ }
20
+ }
21
+ }
22
+ var tavily_2 = require("./tavily");
23
+ Object.defineProperty(exports, "TavilyProvider", { enumerable: true, get: function () { return tavily_2.TavilyProvider; } });
24
+ var exa_2 = require("./exa");
25
+ Object.defineProperty(exports, "ExaProvider", { enumerable: true, get: function () { return exa_2.ExaProvider; } });
26
+ var serper_2 = require("./serper");
27
+ Object.defineProperty(exports, "SerperProvider", { enumerable: true, get: function () { return serper_2.SerperProvider; } });
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/tools/web-search/providers/index.ts"],"names":[],"mappings":";;;AAKA,8CAaC;AAjBD,qCAA0C;AAC1C,+BAAoC;AACpC,qCAA0C;AAE1C,SAAgB,iBAAiB,CAAC,IAAuB;IACvD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,IAAI,uBAAc,EAAE,CAAC;QAC9B,KAAK,KAAK;YACR,OAAO,IAAI,iBAAW,EAAE,CAAC;QAC3B,KAAK,QAAQ;YACX,OAAO,IAAI,uBAAc,EAAE,CAAC;QAC9B,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,IAAI,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,gCAAgC,WAAW,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC;AAED,mCAA0C;AAAjC,wGAAA,cAAc,OAAA;AACvB,6BAAoC;AAA3B,kGAAA,WAAW,OAAA;AACpB,mCAA0C;AAAjC,wGAAA,cAAc,OAAA"}
@@ -0,0 +1,5 @@
1
+ import { SearchProviderAdapter, WebSearchConfig, WebSearchResponse } from '../types';
2
+ export declare class SerperProvider implements SearchProviderAdapter {
3
+ search(query: string, config: WebSearchConfig): Promise<WebSearchResponse>;
4
+ }
5
+ //# sourceMappingURL=serper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serper.d.ts","sourceRoot":"","sources":["../../../../src/tools/web-search/providers/serper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,iBAAiB,EAAmB,MAAM,UAAU,CAAC;AAqBtG,qBAAa,cAAe,YAAW,qBAAqB;IACpD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAgDjF"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SerperProvider = void 0;
4
+ class SerperProvider {
5
+ async search(query, config) {
6
+ const apiKey = config.apiKey;
7
+ if (!apiKey) {
8
+ throw new Error('Serper API key is required');
9
+ }
10
+ const body = {
11
+ q: query,
12
+ num: config.maxResults ?? 5,
13
+ };
14
+ const response = await fetch('https://google.serper.dev/search', {
15
+ method: 'POST',
16
+ headers: {
17
+ 'Content-Type': 'application/json',
18
+ 'X-API-KEY': apiKey,
19
+ },
20
+ body: JSON.stringify(body),
21
+ });
22
+ if (!response.ok) {
23
+ const errorText = await response.text();
24
+ throw new Error(`Serper API error ${response.status}: ${errorText}`);
25
+ }
26
+ const data = (await response.json());
27
+ const results = (data.organic ?? []).map((r) => ({
28
+ title: r.title,
29
+ url: r.link,
30
+ snippet: r.snippet,
31
+ publishedDate: r.date,
32
+ }));
33
+ let answer;
34
+ if (data.answerBox) {
35
+ answer =
36
+ data.answerBox.answer ??
37
+ data.answerBox.snippet ??
38
+ data.answerBox.title;
39
+ }
40
+ return {
41
+ query,
42
+ results,
43
+ answer,
44
+ };
45
+ }
46
+ }
47
+ exports.SerperProvider = SerperProvider;
48
+ //# sourceMappingURL=serper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serper.js","sourceRoot":"","sources":["../../../../src/tools/web-search/providers/serper.ts"],"names":[],"mappings":";;;AAqBA,MAAa,cAAc;IACzB,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,MAAuB;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,IAAI,GAAG;YACX,CAAC,EAAE,KAAK;YACR,GAAG,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;SAC5B,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kCAAkC,EAAE;YAC/D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,MAAM;aACpB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;QAE1D,MAAM,OAAO,GAAsB,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClE,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,GAAG,EAAE,CAAC,CAAC,IAAI;YACX,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,aAAa,EAAE,CAAC,CAAC,IAAI;SACtB,CAAC,CAAC,CAAC;QAEJ,IAAI,MAA0B,CAAC;QAC/B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM;gBACJ,IAAI,CAAC,SAAS,CAAC,MAAM;oBACrB,IAAI,CAAC,SAAS,CAAC,OAAO;oBACtB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QACzB,CAAC;QAED,OAAO;YACL,KAAK;YACL,OAAO;YACP,MAAM;SACP,CAAC;IACJ,CAAC;CACF;AAjDD,wCAiDC"}
@@ -0,0 +1,5 @@
1
+ import { SearchProviderAdapter, WebSearchConfig, WebSearchResponse } from '../types';
2
+ export declare class TavilyProvider implements SearchProviderAdapter {
3
+ search(query: string, config: WebSearchConfig): Promise<WebSearchResponse>;
4
+ }
5
+ //# sourceMappingURL=tavily.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tavily.d.ts","sourceRoot":"","sources":["../../../../src/tools/web-search/providers/tavily.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,iBAAiB,EAAmB,MAAM,UAAU,CAAC;AAiBtG,qBAAa,cAAe,YAAW,qBAAqB;IACpD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA+CjF"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TavilyProvider = void 0;
4
+ class TavilyProvider {
5
+ async search(query, config) {
6
+ const apiKey = config.apiKey;
7
+ if (!apiKey) {
8
+ throw new Error('Tavily API key is required');
9
+ }
10
+ // Note: Tavily API requires the key in the request body (their API design).
11
+ // When using platform mode, the key is managed server-side via the connector.
12
+ const body = {
13
+ api_key: apiKey,
14
+ query,
15
+ max_results: config.maxResults ?? 5,
16
+ search_depth: config.searchDepth ?? 'basic',
17
+ include_raw_content: config.includeContent ?? false,
18
+ include_answer: true,
19
+ };
20
+ const response = await fetch('https://api.tavily.com/search', {
21
+ method: 'POST',
22
+ headers: {
23
+ 'Content-Type': 'application/json',
24
+ },
25
+ body: JSON.stringify(body),
26
+ });
27
+ if (!response.ok) {
28
+ const errorText = await response.text();
29
+ throw new Error(`Tavily API error ${response.status}: ${errorText}`);
30
+ }
31
+ const data = (await response.json());
32
+ const results = data.results.map((r) => ({
33
+ title: r.title,
34
+ url: r.url,
35
+ snippet: r.content,
36
+ content: r.raw_content,
37
+ score: r.score,
38
+ publishedDate: r.published_date,
39
+ }));
40
+ return {
41
+ query: data.query,
42
+ results,
43
+ answer: data.answer,
44
+ };
45
+ }
46
+ }
47
+ exports.TavilyProvider = TavilyProvider;
48
+ //# sourceMappingURL=tavily.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tavily.js","sourceRoot":"","sources":["../../../../src/tools/web-search/providers/tavily.ts"],"names":[],"mappings":";;;AAiBA,MAAa,cAAc;IACzB,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,MAAuB;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,4EAA4E;QAC5E,8EAA8E;QAC9E,MAAM,IAAI,GAAG;YACX,OAAO,EAAE,MAAM;YACf,KAAK;YACL,WAAW,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;YACnC,YAAY,EAAE,MAAM,CAAC,WAAW,IAAI,OAAO;YAC3C,mBAAmB,EAAE,MAAM,CAAC,cAAc,IAAI,KAAK;YACnD,cAAc,EAAE,IAAI;SACrB,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,+BAA+B,EAAE;YAC5D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;QAE1D,MAAM,OAAO,GAAsB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1D,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,OAAO,EAAE,CAAC,CAAC,WAAW;YACtB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,aAAa,EAAE,CAAC,CAAC,cAAc;SAChC,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO;YACP,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;CACF;AAhDD,wCAgDC"}
@@ -0,0 +1,26 @@
1
+ export interface WebSearchResult {
2
+ title: string;
3
+ url: string;
4
+ snippet: string;
5
+ content?: string;
6
+ score?: number;
7
+ publishedDate?: string;
8
+ }
9
+ export interface WebSearchResponse {
10
+ query: string;
11
+ results: WebSearchResult[];
12
+ answer?: string;
13
+ }
14
+ export type WebSearchProvider = 'tavily' | 'exa' | 'serper';
15
+ export interface WebSearchConfig {
16
+ provider?: WebSearchProvider;
17
+ apiKey?: string;
18
+ maxResults?: number;
19
+ searchDepth?: 'basic' | 'advanced';
20
+ includeContent?: boolean;
21
+ connector?: string;
22
+ }
23
+ export interface SearchProviderAdapter {
24
+ search(query: string, config: WebSearchConfig): Promise<WebSearchResponse>;
25
+ }
26
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tools/web-search/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE5D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACnC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC5E"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tools/web-search/types.ts"],"names":[],"mappings":""}
@@ -295,6 +295,25 @@ export interface RunflowAPIClient {
295
295
  credentials: {
296
296
  getByName(name: string): Promise<CredentialResponse>;
297
297
  };
298
+ schedules: {
299
+ create<T = any>(config: T): Promise<{
300
+ success: boolean;
301
+ data: any;
302
+ }>;
303
+ list(): Promise<{
304
+ success: boolean;
305
+ data: any[];
306
+ total: number;
307
+ }>;
308
+ update<T = any>(id: string, config: T): Promise<{
309
+ success: boolean;
310
+ data: any;
311
+ }>;
312
+ cancel(id: string): Promise<{
313
+ success: boolean;
314
+ deleted: boolean;
315
+ }>;
316
+ };
298
317
  sendTraces(request: TraceRequest): Promise<TraceResponse>;
299
318
  sendEvents(request: EventsRequest): Promise<EventsResponse>;
300
319
  log(message: string, data?: any): void;
@@ -596,6 +615,8 @@ export interface WorkflowConfig {
596
615
  options?: WorkflowOptions;
597
616
  /** Transform step results into the final workflow output before schema validation */
598
617
  outputTransform?: (stepResults: Record<string, any>, input: any) => any;
618
+ /** Observability settings for this workflow (same controls as Agent) */
619
+ observability?: ObservabilityMode | ObservabilityConfig;
599
620
  }
600
621
  export interface WorkflowStep {
601
622
  id: string;
@@ -842,8 +863,12 @@ export interface TraceMetadata {
842
863
  presencePenalty?: number;
843
864
  };
844
865
  workflowId?: string;
866
+ workflowName?: string;
845
867
  stepId?: string;
846
868
  stepType?: string;
869
+ stepNumber?: number;
870
+ totalSteps?: number;
871
+ _traceType?: string;
847
872
  toolName?: string;
848
873
  toolType?: string;
849
874
  toolsUsed?: string[];