@elastic.io/mcp 1.0.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 (155) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +171 -0
  3. package/dist/api/client.d.ts +12 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +124 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/api/jsonapi.d.ts +28 -0
  8. package/dist/api/jsonapi.d.ts.map +1 -0
  9. package/dist/api/jsonapi.js +45 -0
  10. package/dist/api/jsonapi.js.map +1 -0
  11. package/dist/api/logger.d.ts +9 -0
  12. package/dist/api/logger.d.ts.map +1 -0
  13. package/dist/api/logger.js +46 -0
  14. package/dist/api/logger.js.map +1 -0
  15. package/dist/api/samples.d.ts +21 -0
  16. package/dist/api/samples.d.ts.map +1 -0
  17. package/dist/api/samples.js +465 -0
  18. package/dist/api/samples.js.map +1 -0
  19. package/dist/config.d.ts +16 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +49 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/embeddings/factory.d.ts +7 -0
  24. package/dist/embeddings/factory.d.ts.map +1 -0
  25. package/dist/embeddings/factory.js +25 -0
  26. package/dist/embeddings/factory.js.map +1 -0
  27. package/dist/embeddings/google.d.ts +19 -0
  28. package/dist/embeddings/google.d.ts.map +1 -0
  29. package/dist/embeddings/google.js +132 -0
  30. package/dist/embeddings/google.js.map +1 -0
  31. package/dist/embeddings/types.d.ts +27 -0
  32. package/dist/embeddings/types.d.ts.map +1 -0
  33. package/dist/embeddings/types.js +2 -0
  34. package/dist/embeddings/types.js.map +1 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +226 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/paths.d.ts +3 -0
  40. package/dist/paths.d.ts.map +1 -0
  41. package/dist/paths.js +10 -0
  42. package/dist/paths.js.map +1 -0
  43. package/dist/server.d.ts +29 -0
  44. package/dist/server.d.ts.map +1 -0
  45. package/dist/server.js +361 -0
  46. package/dist/server.js.map +1 -0
  47. package/dist/tools/confirmation.d.ts +41 -0
  48. package/dist/tools/confirmation.d.ts.map +1 -0
  49. package/dist/tools/confirmation.js +120 -0
  50. package/dist/tools/confirmation.js.map +1 -0
  51. package/dist/tools/constants.d.ts +31 -0
  52. package/dist/tools/constants.d.ts.map +1 -0
  53. package/dist/tools/constants.js +85 -0
  54. package/dist/tools/constants.js.map +1 -0
  55. package/dist/tools/definitions.d.ts +3 -0
  56. package/dist/tools/definitions.d.ts.map +1 -0
  57. package/dist/tools/definitions.js +883 -0
  58. package/dist/tools/definitions.js.map +1 -0
  59. package/dist/tools/handlers/auth.d.ts +3 -0
  60. package/dist/tools/handlers/auth.d.ts.map +1 -0
  61. package/dist/tools/handlers/auth.js +540 -0
  62. package/dist/tools/handlers/auth.js.map +1 -0
  63. package/dist/tools/handlers/component.d.ts +3 -0
  64. package/dist/tools/handlers/component.d.ts.map +1 -0
  65. package/dist/tools/handlers/component.js +145 -0
  66. package/dist/tools/handlers/component.js.map +1 -0
  67. package/dist/tools/handlers/data-sample.d.ts +3 -0
  68. package/dist/tools/handlers/data-sample.d.ts.map +1 -0
  69. package/dist/tools/handlers/data-sample.js +51 -0
  70. package/dist/tools/handlers/data-sample.js.map +1 -0
  71. package/dist/tools/handlers/dynamic.d.ts +3 -0
  72. package/dist/tools/handlers/dynamic.d.ts.map +1 -0
  73. package/dist/tools/handlers/dynamic.js +110 -0
  74. package/dist/tools/handlers/dynamic.js.map +1 -0
  75. package/dist/tools/handlers/flow.d.ts +9 -0
  76. package/dist/tools/handlers/flow.d.ts.map +1 -0
  77. package/dist/tools/handlers/flow.js +899 -0
  78. package/dist/tools/handlers/flow.js.map +1 -0
  79. package/dist/tools/handlers/log.d.ts +3 -0
  80. package/dist/tools/handlers/log.d.ts.map +1 -0
  81. package/dist/tools/handlers/log.js +61 -0
  82. package/dist/tools/handlers/log.js.map +1 -0
  83. package/dist/tools/handlers/organization.d.ts +3 -0
  84. package/dist/tools/handlers/organization.d.ts.map +1 -0
  85. package/dist/tools/handlers/organization.js +39 -0
  86. package/dist/tools/handlers/organization.js.map +1 -0
  87. package/dist/tools/handlers/raw.d.ts +3 -0
  88. package/dist/tools/handlers/raw.d.ts.map +1 -0
  89. package/dist/tools/handlers/raw.js +77 -0
  90. package/dist/tools/handlers/raw.js.map +1 -0
  91. package/dist/tools/handlers/search.d.ts +3 -0
  92. package/dist/tools/handlers/search.d.ts.map +1 -0
  93. package/dist/tools/handlers/search.js +82 -0
  94. package/dist/tools/handlers/search.js.map +1 -0
  95. package/dist/tools/handlers/session.d.ts +3 -0
  96. package/dist/tools/handlers/session.d.ts.map +1 -0
  97. package/dist/tools/handlers/session.js +15 -0
  98. package/dist/tools/handlers/session.js.map +1 -0
  99. package/dist/tools/handlers.d.ts +12 -0
  100. package/dist/tools/handlers.d.ts.map +1 -0
  101. package/dist/tools/handlers.js +197 -0
  102. package/dist/tools/handlers.js.map +1 -0
  103. package/dist/tools/helpers.d.ts +45 -0
  104. package/dist/tools/helpers.d.ts.map +1 -0
  105. package/dist/tools/helpers.js +195 -0
  106. package/dist/tools/helpers.js.map +1 -0
  107. package/dist/tools/types.d.ts +32 -0
  108. package/dist/tools/types.d.ts.map +1 -0
  109. package/dist/tools/types.js +2 -0
  110. package/dist/tools/types.js.map +1 -0
  111. package/dist/tools/validation.d.ts +24 -0
  112. package/dist/tools/validation.d.ts.map +1 -0
  113. package/dist/tools/validation.js +748 -0
  114. package/dist/tools/validation.js.map +1 -0
  115. package/dist/types/index.d.ts +47 -0
  116. package/dist/types/index.d.ts.map +1 -0
  117. package/dist/types/index.js +2 -0
  118. package/dist/types/index.js.map +1 -0
  119. package/dist/vectorstore/factory.d.ts +7 -0
  120. package/dist/vectorstore/factory.d.ts.map +1 -0
  121. package/dist/vectorstore/factory.js +25 -0
  122. package/dist/vectorstore/factory.js.map +1 -0
  123. package/dist/vectorstore/qdrant.d.ts +11 -0
  124. package/dist/vectorstore/qdrant.d.ts.map +1 -0
  125. package/dist/vectorstore/qdrant.js +107 -0
  126. package/dist/vectorstore/qdrant.js.map +1 -0
  127. package/dist/vectorstore/types.d.ts +28 -0
  128. package/dist/vectorstore/types.d.ts.map +1 -0
  129. package/dist/vectorstore/types.js +2 -0
  130. package/dist/vectorstore/types.js.map +1 -0
  131. package/package.json +51 -0
  132. package/resources/docs/component-test-scenarios.md +2468 -0
  133. package/resources/docs/credential-validation-gaps.md +35 -0
  134. package/resources/docs/debug-issues.md +71 -0
  135. package/resources/docs/deployment-and-scaling.md +136 -0
  136. package/resources/docs/flow-building-guide.md +565 -0
  137. package/resources/docs/packaging-plan.md +84 -0
  138. package/resources/docs/standardized-components-guide.md +66 -0
  139. package/resources/docs/system-instructions.md +177 -0
  140. package/resources/docs/unique-components.md +60 -0
  141. package/resources/docs/verified-creds-flow-ids.md +193 -0
  142. package/resources/flow-examples/batch-flow-1-collect.json +51 -0
  143. package/resources/flow-examples/batch-flow-2-process.json +70 -0
  144. package/resources/flow-examples/code-component-transform.json +65 -0
  145. package/resources/flow-examples/code-component-trigger.json +52 -0
  146. package/resources/flow-examples/code-component-with-credentials-trigger.json +53 -0
  147. package/resources/flow-examples/code-component-with-credentials.json +67 -0
  148. package/resources/flow-examples/filter-step.json +63 -0
  149. package/resources/flow-examples/polling-sync-trigger.json +50 -0
  150. package/resources/flow-examples/router-branching.json +94 -0
  151. package/resources/flow-examples/splitter-re-assemble.json +72 -0
  152. package/resources/flow-examples/splitter-split.json +68 -0
  153. package/resources/flow-examples/timer-query-action-sync.json +68 -0
  154. package/resources/flow-examples/webhook-async-sync.json +49 -0
  155. package/resources/flow-examples/webhook-request-reply.json +63 -0
@@ -0,0 +1,46 @@
1
+ import fs from 'fs';
2
+ // Write to file only when LOG_FILE env var is set (for local development)
3
+ const LOG_FILE = process.env.LOG_FILE;
4
+ const LogLevels = {
5
+ DEBUG: 0,
6
+ INFO: 1,
7
+ WARN: 2,
8
+ ERROR: 3,
9
+ };
10
+ // Default log level is INFO, or can be overridden by LOG_LEVEL env var
11
+ const currentLevelName = process.env.LOG_LEVEL?.toUpperCase() || 'INFO';
12
+ const currentLevel = LogLevels[currentLevelName] !== undefined ? LogLevels[currentLevelName] : 1;
13
+ function writeLog(level, message, ...args) {
14
+ if (LogLevels[level] < currentLevel) {
15
+ return;
16
+ }
17
+ const timestamp = new Date().toISOString();
18
+ // Format message with optional args
19
+ let formattedMessage = message;
20
+ if (args.length > 0) {
21
+ formattedMessage += ' ' + args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' ');
22
+ }
23
+ const formattedLine = `[${level}] ${formattedMessage}\n`;
24
+ if (LOG_FILE) {
25
+ try {
26
+ fs.appendFileSync(LOG_FILE, `[${timestamp}] ${formattedLine}`);
27
+ }
28
+ catch (err) {
29
+ process.stderr.write(`Failed to write to log file: ${String(err)}\n`);
30
+ }
31
+ }
32
+ // Stdio MCP transport uses stdout for protocol,
33
+ // so diagnostics always go to stderr.
34
+ process.stderr.write(formattedLine);
35
+ }
36
+ export const logger = {
37
+ debug: (message, ...args) => writeLog('DEBUG', message, ...args),
38
+ info: (message, ...args) => writeLog('INFO', message, ...args),
39
+ warn: (message, ...args) => writeLog('WARN', message, ...args),
40
+ error: (message, ...args) => writeLog('ERROR', message, ...args),
41
+ };
42
+ // Maintain compatibility with existing code calling logMcp
43
+ export function logMcp(message) {
44
+ logger.info(message);
45
+ }
46
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/api/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,0EAA0E;AAC1E,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AAItC,MAAM,SAAS,GAA6B;IAC1C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,uEAAuE;AACvE,MAAM,gBAAgB,GAAc,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,EAAe,IAAI,MAAM,CAAC;AAChG,MAAM,YAAY,GAAG,SAAS,CAAC,gBAAgB,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjG,SAAS,QAAQ,CAAC,KAAe,EAAE,OAAe,EAAE,GAAG,IAAW;IAChE,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,YAAY,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE3C,oCAAoC;IACpC,IAAI,gBAAgB,GAAG,OAAO,CAAC;IAC/B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,gBAAgB,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CACvC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAC5D,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACd,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,KAAK,KAAK,gBAAgB,IAAI,CAAC;IAEzD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC;YACH,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,sCAAsC;IACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/E,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC7E,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC7E,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAChF,CAAC;AAEF,2DAA2D;AAC3D,MAAM,UAAU,MAAM,CAAC,OAAe;IACpC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,21 @@
1
+ export declare const SAMPLES_COLLECTION_NAME = "flow_samples";
2
+ export declare function formatFlowToMarkdown(flow: any): string;
3
+ /**
4
+ * Formats a single flow step configuration into Markdown.
5
+ */
6
+ export declare function formatStepToMarkdown(flow: any, stepId: string, config: any): string;
7
+ /**
8
+ * Ingests an array of raw flow sample objects, converts them to Markdown,
9
+ * generates embeddings, and uploads them to the 'flow_samples' Qdrant collection.
10
+ */
11
+ export declare function ingestFlowSamples(flows: any[], purge?: boolean): Promise<void>;
12
+ declare class IngestionQueue {
13
+ private queue;
14
+ private processing;
15
+ private purgedInCurrentSession;
16
+ enqueue(flows: any[], purge: boolean): Promise<void>;
17
+ private processNext;
18
+ }
19
+ export declare const ingestionQueue: IngestionQueue;
20
+ export {};
21
+ //# sourceMappingURL=samples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"samples.d.ts","sourceRoot":"","sources":["../../src/api/samples.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,uBAAuB,iBAAiB,CAAC;AAwEtD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,CA2ItD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,MAAM,CAyHnF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA8H3F;AAED,cAAM,cAAc;IAClB,OAAO,CAAC,KAAK,CAAgG;IAC7G,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,sBAAsB,CAAS;IAEjC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAU5C,WAAW;CA6B1B;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
@@ -0,0 +1,465 @@
1
+ import crypto from 'crypto';
2
+ import { getEmbeddingProvider } from '../embeddings/factory.js';
3
+ import { getVectorStore } from '../vectorstore/factory.js';
4
+ import { logger } from './logger.js';
5
+ export const SAMPLES_COLLECTION_NAME = 'flow_samples';
6
+ /**
7
+ * Deterministically generates a UUID from a string seed.
8
+ */
9
+ function generateDeterministicUuid(input) {
10
+ const hash = crypto.createHash('md5').update(input).digest('hex');
11
+ return `${hash.substring(0, 8)}-${hash.substring(8, 12)}-${hash.substring(12, 16)}-${hash.substring(16, 20)}-${hash.substring(20, 32)}`;
12
+ }
13
+ /**
14
+ * Formats a raw JSON schema string from metadata into a clean, human-readable list of fields.
15
+ */
16
+ function formatMetadataSchema(metadataStr) {
17
+ try {
18
+ const parsed = typeof metadataStr === 'string' ? JSON.parse(metadataStr) : metadataStr;
19
+ let output = '';
20
+ if (parsed.in && parsed.in.properties) {
21
+ output += ' * Input Schema Fields:\n';
22
+ const requiredFields = Array.isArray(parsed.in.required) ? parsed.in.required : [];
23
+ for (const [key, value] of Object.entries(parsed.in.properties)) {
24
+ if (!value || typeof value !== 'object')
25
+ continue;
26
+ const val = value;
27
+ const title = val.title ? ` (${val.title})` : '';
28
+ const isRequired = val.required === true || requiredFields.includes(key);
29
+ const req = isRequired ? ' - required' : '';
30
+ output += ` - ${key}${title}: ${val.type || 'unknown'}${req}\n`;
31
+ }
32
+ }
33
+ if (parsed.out && parsed.out.properties) {
34
+ output += ' * Output Schema Fields:\n';
35
+ const requiredFields = Array.isArray(parsed.out.required) ? parsed.out.required : [];
36
+ for (const [key, value] of Object.entries(parsed.out.properties)) {
37
+ if (!value || typeof value !== 'object')
38
+ continue;
39
+ const val = value;
40
+ const title = val.title ? ` (${val.title})` : '';
41
+ const isRequired = val.required === true || requiredFields.includes(key);
42
+ const req = isRequired ? ' - required' : '';
43
+ output += ` - ${key}${title}: ${val.type || 'unknown'}${req}\n`;
44
+ }
45
+ }
46
+ return output;
47
+ }
48
+ catch (err) {
49
+ return ' * (Failed to parse metadata schema)\n';
50
+ }
51
+ }
52
+ /**
53
+ * Summarizes a select model options list to prevent token bloat.
54
+ */
55
+ function formatSelectModel(selectModelObj) {
56
+ if (!selectModelObj || typeof selectModelObj !== 'object')
57
+ return '';
58
+ let output = ' * Select Model Options:\n';
59
+ for (const [key, val] of Object.entries(selectModelObj)) {
60
+ if (val && typeof val === 'object') {
61
+ const options = Object.keys(val);
62
+ const sample = options.slice(0, 10).join(', ');
63
+ const more = options.length > 10 ? ` (and ${options.length - 10} more)` : '';
64
+ output += ` - ${key}: [${sample}${more}]\n`;
65
+ }
66
+ else {
67
+ output += ` - ${key}: ${val}\n`;
68
+ }
69
+ }
70
+ return output;
71
+ }
72
+ export function formatFlowToMarkdown(flow) {
73
+ const name = flow.name || 'Unnamed Flow';
74
+ const desc = flow.description || 'No description provided';
75
+ const type = flow.type || 'ordinary';
76
+ const status = flow.status || 'inactive';
77
+ let markdown = `# Flow Sample: ${name}\n`;
78
+ markdown += `**Description**: ${desc}\n`;
79
+ markdown += `**Type**: ${type}\n`;
80
+ markdown += `**Status**: ${status}\n\n`;
81
+ const data = flow.data || {};
82
+ const steps = {};
83
+ const mappers = {};
84
+ for (const [key, val] of Object.entries(data)) {
85
+ if (key.startsWith('mapper:')) {
86
+ mappers[key] = val;
87
+ }
88
+ else {
89
+ steps[key] = val;
90
+ }
91
+ }
92
+ markdown += `## Step Configurations (Static Node Fields)\n`;
93
+ for (const [stepId, config] of Object.entries(steps)) {
94
+ if (!config || typeof config !== 'object')
95
+ continue;
96
+ // Filter out internal and credentials/secrets references
97
+ const filteredConfig = {};
98
+ for (const [k, v] of Object.entries(config)) {
99
+ if (['secretId', 'apiKey', 'password', 'token', 'auth', 'oauth', '_selectedDataSamples'].includes(k)) {
100
+ continue;
101
+ }
102
+ filteredConfig[k] = v;
103
+ }
104
+ const resolvedMeta = filteredConfig.resolvedMetadata;
105
+ const resolvedSelect = filteredConfig.resolvedSelectModel;
106
+ const compName = filteredConfig.componentName;
107
+ const stepName = filteredConfig.stepName;
108
+ const compFunc = filteredConfig.function;
109
+ const compId = filteredConfig.componentId;
110
+ delete filteredConfig.resolvedMetadata;
111
+ delete filteredConfig.resolvedSelectModel;
112
+ delete filteredConfig.componentName;
113
+ delete filteredConfig.stepName;
114
+ delete filteredConfig.function;
115
+ delete filteredConfig.componentId;
116
+ const displayName = stepName
117
+ ? `${stepName} [${compFunc || 'action'}]`
118
+ : (compName
119
+ ? `${compName} - ${compFunc || 'action'}`
120
+ : (compFunc ? `[${compFunc}]` : ''));
121
+ const stepLabel = displayName ? `${stepId} (${displayName})` : stepId;
122
+ markdown += `### Step: ${stepLabel}\n`;
123
+ if (compId) {
124
+ markdown += `*Component ID: ${compId}*\n\n`;
125
+ }
126
+ markdown += `#### Browser UI Configuration (What a User configures in the UI settings & fields)\n`;
127
+ markdown += `- **Selected Action / Trigger ID**: \`${compFunc || 'action'}\`\n`;
128
+ markdown += `- **Step Settings / Static Fields (Configured directly in the browser settings panel)**:\n`;
129
+ if (Object.keys(filteredConfig).length > 0) {
130
+ for (const [k, v] of Object.entries(filteredConfig)) {
131
+ markdown += ` - \`${k}\`: \`${typeof v === 'object' ? JSON.stringify(v) : v}\`\n`;
132
+ }
133
+ }
134
+ else {
135
+ markdown += ` - (No static settings configured)\n`;
136
+ }
137
+ markdown += `\n`;
138
+ markdown += `#### REST API Payload Representation (What an LLM/Agent sends to the API)\n`;
139
+ markdown += `This represents the Node structure inside the \`graph.nodes\` array:\n`;
140
+ const nodePayload = {
141
+ id: stepId,
142
+ component_id: compId || 'unknown',
143
+ command: compFunc || 'action',
144
+ name: stepName || compName || stepId,
145
+ fields: filteredConfig
146
+ };
147
+ markdown += `\`\`\`json\n${JSON.stringify(nodePayload, null, 2)}\n\`\`\`\n\n`;
148
+ if (resolvedMeta && resolvedMeta.metadata) {
149
+ markdown += `**Expected Input/Output Schema (Reference Only - do NOT configure in Node's fields)**:\n`;
150
+ markdown += formatMetadataSchema(resolvedMeta.metadata);
151
+ markdown += '\n';
152
+ }
153
+ if (resolvedSelect && resolvedSelect.selectModel) {
154
+ markdown += `**Static Select Model Options (Reference Only)**:\n`;
155
+ markdown += formatSelectModel(resolvedSelect.selectModel);
156
+ markdown += '\n';
157
+ }
158
+ }
159
+ markdown += `## Connection Mappings (JSONata Edges)\n`;
160
+ for (const [mapperId, config] of Object.entries(mappers)) {
161
+ if (!config || typeof config !== 'object')
162
+ continue;
163
+ const sourceAndTarget = mapperId.replace('mapper:', '').split(':');
164
+ const sourceStep = sourceAndTarget[0] || 'unknown';
165
+ const targetStep = sourceAndTarget[1] || 'unknown';
166
+ markdown += `### Connection: from "${sourceStep}" to "${targetStep}"\n`;
167
+ const mapperStr = config.mapper
168
+ ? (typeof config.mapper === 'string' ? config.mapper : JSON.stringify(config.mapper, null, 2))
169
+ : '';
170
+ markdown += `#### Browser UI Configuration (What a User configures in the UI mapping screen)\n`;
171
+ markdown += `The user maps input fields of the target step "${targetStep}" to preceding steps' outputs:\n`;
172
+ if (config.mapper && typeof config.mapper === 'object') {
173
+ for (const [k, v] of Object.entries(config.mapper)) {
174
+ markdown += `- Map Target Input Field \`${k}\` to expression: \`${v}\`\n`;
175
+ }
176
+ }
177
+ else if (config.mapper) {
178
+ markdown += `- Mapped expression: \`${config.mapper}\`\n`;
179
+ }
180
+ else {
181
+ markdown += `- (No fields mapped)\n`;
182
+ }
183
+ markdown += `\n`;
184
+ markdown += `#### REST API Payload Representation (What an LLM/Agent sends to the API)\n`;
185
+ markdown += `This represents the Edge structure inside the \`graph.edges\` array:\n`;
186
+ const edgePayload = {
187
+ id: mapperId.replace('mapper:', ''),
188
+ source: sourceStep,
189
+ target: targetStep,
190
+ config: {
191
+ mapper_type: 'jsonata',
192
+ mapper: mapperStr
193
+ }
194
+ };
195
+ markdown += `\`\`\`json\n${JSON.stringify(edgePayload, null, 2)}\n\`\`\`\n\n`;
196
+ }
197
+ return markdown;
198
+ }
199
+ /**
200
+ * Formats a single flow step configuration into Markdown.
201
+ */
202
+ export function formatStepToMarkdown(flow, stepId, config) {
203
+ const name = flow.name || 'Unnamed Flow';
204
+ const desc = flow.description || 'No description provided';
205
+ const type = flow.type || 'ordinary';
206
+ if (stepId.startsWith('mapper:')) {
207
+ const sourceAndTarget = stepId.replace('mapper:', '').split(':');
208
+ const sourceStep = sourceAndTarget[0] || 'unknown';
209
+ const targetStep = sourceAndTarget[1] || 'unknown';
210
+ let markdown = `# Flow Connection Mapping: from "${sourceStep}" to "${targetStep}" in Flow "${name}"\n`;
211
+ markdown += `**Parent Flow ID**: ${flow._id || flow.id}\n`;
212
+ markdown += `**Parent Flow Description**: ${desc}\n\n`;
213
+ const mapperStr = config.mapper
214
+ ? (typeof config.mapper === 'string' ? config.mapper : JSON.stringify(config.mapper, null, 2))
215
+ : '';
216
+ markdown += `### Browser UI Configuration (What a User configures in the UI mapping screen)\n`;
217
+ markdown += `The user maps input fields of the target step "${targetStep}" to preceding steps' outputs:\n`;
218
+ if (config.mapper && typeof config.mapper === 'object') {
219
+ for (const [k, v] of Object.entries(config.mapper)) {
220
+ markdown += `- Map Target Input Field \`${k}\` to expression: \`${v}\`\n`;
221
+ }
222
+ }
223
+ else if (config.mapper) {
224
+ markdown += `- Mapped expression: \`${config.mapper}\`\n`;
225
+ }
226
+ else {
227
+ markdown += `- (No fields mapped)\n`;
228
+ }
229
+ markdown += `\n`;
230
+ markdown += `### REST API Payload Representation (What an LLM/Agent sends to the API)\n`;
231
+ markdown += `This represents the Edge structure inside the \`graph.edges\` array:\n`;
232
+ const edgePayload = {
233
+ id: stepId.replace('mapper:', ''),
234
+ source: sourceStep,
235
+ target: targetStep,
236
+ config: {
237
+ mapper_type: 'jsonata',
238
+ mapper: mapperStr
239
+ }
240
+ };
241
+ markdown += `\`\`\`json\n${JSON.stringify(edgePayload, null, 2)}\n\`\`\`\n`;
242
+ return markdown;
243
+ }
244
+ else {
245
+ let markdown = `# Flow Step: ${stepId} in Flow "${name}"\n`;
246
+ markdown += `**Parent Flow ID**: ${flow._id || flow.id}\n`;
247
+ markdown += `**Parent Flow Description**: ${desc}\n`;
248
+ markdown += `**Parent Flow Type**: ${type}\n\n`;
249
+ // Filter out internal and credentials/secrets references
250
+ const filteredConfig = {};
251
+ for (const [k, v] of Object.entries(config)) {
252
+ if (['secretId', 'apiKey', 'password', 'token', 'auth', 'oauth', '_selectedDataSamples'].includes(k)) {
253
+ continue;
254
+ }
255
+ filteredConfig[k] = v;
256
+ }
257
+ const resolvedMeta = filteredConfig.resolvedMetadata;
258
+ const resolvedSelect = filteredConfig.resolvedSelectModel;
259
+ const compName = filteredConfig.componentName;
260
+ const stepName = filteredConfig.stepName;
261
+ const compFunc = filteredConfig.function;
262
+ const compId = filteredConfig.componentId;
263
+ delete filteredConfig.resolvedMetadata;
264
+ delete filteredConfig.resolvedSelectModel;
265
+ delete filteredConfig.componentName;
266
+ delete filteredConfig.stepName;
267
+ delete filteredConfig.function;
268
+ delete filteredConfig.componentId;
269
+ const displayName = stepName
270
+ ? `${stepName} [${compFunc || 'action'}]`
271
+ : (compName
272
+ ? `${compName} - ${compFunc || 'action'}`
273
+ : (compFunc ? `[${compFunc}]` : ''));
274
+ const stepLabel = displayName ? `${stepId} (${displayName})` : stepId;
275
+ markdown += `## Step: ${stepLabel}\n`;
276
+ if (compId) {
277
+ markdown += `*Component ID: ${compId}*\n\n`;
278
+ }
279
+ markdown += `### Browser UI Configuration (What a User configures in the UI settings & fields)\n`;
280
+ markdown += `- **Selected Action / Trigger ID**: \`${compFunc || 'action'}\`\n`;
281
+ markdown += `- **Step Settings / Static Fields (Configured directly in the browser settings panel)**:\n`;
282
+ if (Object.keys(filteredConfig).length > 0) {
283
+ for (const [k, v] of Object.entries(filteredConfig)) {
284
+ markdown += ` - \`${k}\`: \`${typeof v === 'object' ? JSON.stringify(v) : v}\`\n`;
285
+ }
286
+ }
287
+ else {
288
+ markdown += ` - (No static settings configured)\n`;
289
+ }
290
+ markdown += `\n`;
291
+ markdown += `### REST API Payload Representation (What an LLM/Agent sends to the API)\n`;
292
+ markdown += `This represents the Node structure inside the \`graph.nodes\` array:\n`;
293
+ const nodePayload = {
294
+ id: stepId,
295
+ component_id: compId || 'unknown',
296
+ command: compFunc || 'action',
297
+ name: stepName || compName || stepId,
298
+ fields: filteredConfig
299
+ };
300
+ markdown += `\`\`\`json\n${JSON.stringify(nodePayload, null, 2)}\n\`\`\`\n\n`;
301
+ if (resolvedMeta && resolvedMeta.metadata) {
302
+ markdown += `**Expected Input/Output Schema (Reference Only - do NOT configure in Node's fields)**:\n`;
303
+ markdown += formatMetadataSchema(resolvedMeta.metadata);
304
+ markdown += '\n';
305
+ }
306
+ if (resolvedSelect && resolvedSelect.selectModel) {
307
+ markdown += `**Static Select Model Options (Reference Only)**:\n`;
308
+ markdown += formatSelectModel(resolvedSelect.selectModel);
309
+ markdown += '\n';
310
+ }
311
+ return markdown;
312
+ }
313
+ }
314
+ /**
315
+ * Ingests an array of raw flow sample objects, converts them to Markdown,
316
+ * generates embeddings, and uploads them to the 'flow_samples' Qdrant collection.
317
+ */
318
+ export async function ingestFlowSamples(flows, purge = false) {
319
+ if (!Array.isArray(flows) || flows.length === 0) {
320
+ logger.info('[Samples Ingest] No flows to ingest.');
321
+ return;
322
+ }
323
+ logger.info(`[Samples Ingest] Starting ingestion for ${flows.length} flow samples...`);
324
+ const provider = getEmbeddingProvider();
325
+ const vectorStore = getVectorStore();
326
+ const dimensions = provider.getDimensions();
327
+ if (purge) {
328
+ logger.info(`[Samples Ingest] Purge requested. Clearing collection "${SAMPLES_COLLECTION_NAME}"...`);
329
+ await vectorStore.purge(SAMPLES_COLLECTION_NAME);
330
+ }
331
+ await vectorStore.initialize(dimensions, SAMPLES_COLLECTION_NAME);
332
+ const itemsToEmbed = [];
333
+ for (const flow of flows) {
334
+ // Standardize flow input (sometimes it might be wrapped under a "result" key)
335
+ const flowObj = flow.result || flow;
336
+ const flowId = flowObj._id || flowObj.id;
337
+ if (!flowId) {
338
+ logger.warn('[Samples Ingest] Flow object is missing ID, skipping.');
339
+ continue;
340
+ }
341
+ // 1. Ingest entire flow point
342
+ const flowMarkdown = formatFlowToMarkdown(flowObj);
343
+ const flowPointId = generateDeterministicUuid(String(flowId));
344
+ itemsToEmbed.push({
345
+ id: flowPointId,
346
+ text: flowMarkdown,
347
+ payload: {
348
+ type: 'flow_sample',
349
+ flow_id: String(flowId),
350
+ name: flowObj.name || 'Unnamed Flow',
351
+ description: flowObj.description || '',
352
+ content: flowMarkdown,
353
+ },
354
+ });
355
+ // 2. Ingest step/edge points
356
+ const data = flowObj.data || {};
357
+ for (const [stepId, stepConfig] of Object.entries(data)) {
358
+ if (!stepConfig || typeof stepConfig !== 'object')
359
+ continue;
360
+ const isEdge = stepId.startsWith('mapper:');
361
+ const stepMarkdown = formatStepToMarkdown(flowObj, stepId, stepConfig);
362
+ const stepPointId = generateDeterministicUuid(`${flowId}_${stepId}`);
363
+ const configObj = stepConfig;
364
+ itemsToEmbed.push({
365
+ id: stepPointId,
366
+ text: stepMarkdown,
367
+ payload: {
368
+ type: isEdge ? 'flow_edge' : 'flow_step',
369
+ flow_id: String(flowId),
370
+ flow_name: flowObj.name || 'Unnamed Flow',
371
+ step_id: stepId,
372
+ step_name: configObj.stepName || '',
373
+ component_id: configObj.componentId || '',
374
+ function: configObj.function || '',
375
+ content: stepMarkdown,
376
+ },
377
+ });
378
+ }
379
+ }
380
+ if (itemsToEmbed.length === 0) {
381
+ logger.warn('[Samples Ingest] No valid items to embed.');
382
+ return;
383
+ }
384
+ logger.info(`[Samples Ingest] Found ${itemsToEmbed.length} items to embed. Running batch requests...`);
385
+ const batchSize = 100; // Gemini supports up to 100 texts in a single batch request
386
+ const vectors = [];
387
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
388
+ for (let i = 0; i < itemsToEmbed.length; i += batchSize) {
389
+ const chunk = itemsToEmbed.slice(i, i + batchSize);
390
+ const chunkTexts = chunk.map(item => item.text);
391
+ logger.info(`[Samples Ingest] Embedding batch: items ${i + 1} to ${Math.min(i + batchSize, itemsToEmbed.length)} of ${itemsToEmbed.length}...`);
392
+ try {
393
+ const chunkVectors = await provider.embedBatch(chunkTexts);
394
+ vectors.push(...chunkVectors);
395
+ }
396
+ catch (err) {
397
+ logger.error(`[Samples Ingest] Failed to generate batch embeddings for index range ${i} - ${i + chunk.length}:`, err);
398
+ throw err;
399
+ }
400
+ // Add a 5-second delay between consecutive batch requests to respect the 15 RPM rate limit
401
+ if (i + batchSize < itemsToEmbed.length) {
402
+ await sleep(5000);
403
+ }
404
+ }
405
+ const pendingPoints = [];
406
+ for (let i = 0; i < itemsToEmbed.length; i++) {
407
+ const vector = vectors[i];
408
+ if (vector) {
409
+ pendingPoints.push({
410
+ id: itemsToEmbed[i].id,
411
+ vector,
412
+ payload: itemsToEmbed[i].payload,
413
+ });
414
+ }
415
+ }
416
+ if (pendingPoints.length > 0) {
417
+ logger.info(`[Samples Ingest] Upserting ${pendingPoints.length} points to Qdrant collection "${SAMPLES_COLLECTION_NAME}"...`);
418
+ await vectorStore.upsert(pendingPoints, SAMPLES_COLLECTION_NAME);
419
+ logger.info(`[Samples Ingest] Ingestion of ${pendingPoints.length} points completed successfully.`);
420
+ }
421
+ else {
422
+ logger.warn('[Samples Ingest] No valid points were embedded.');
423
+ }
424
+ }
425
+ class IngestionQueue {
426
+ queue = [];
427
+ processing = false;
428
+ purgedInCurrentSession = false;
429
+ async enqueue(flows, purge) {
430
+ return new Promise((resolve, reject) => {
431
+ this.queue.push({ flows, purge, resolve, reject });
432
+ if (!this.processing) {
433
+ this.purgedInCurrentSession = false; // Reset for new session
434
+ this.processNext();
435
+ }
436
+ });
437
+ }
438
+ async processNext() {
439
+ if (this.queue.length === 0) {
440
+ this.processing = false;
441
+ this.purgedInCurrentSession = false;
442
+ return;
443
+ }
444
+ this.processing = true;
445
+ const task = this.queue.shift();
446
+ if (task) {
447
+ logger.info(`[Ingestion Queue] Processing next batch: ${task.flows.length} flows (purge=${task.purge}). Remaining in queue: ${this.queue.length}`);
448
+ const shouldPurge = task.purge && !this.purgedInCurrentSession;
449
+ if (shouldPurge) {
450
+ this.purgedInCurrentSession = true;
451
+ }
452
+ try {
453
+ await ingestFlowSamples(task.flows, shouldPurge);
454
+ task.resolve();
455
+ }
456
+ catch (err) {
457
+ task.reject(err);
458
+ }
459
+ }
460
+ // Delay 5 seconds before processing the next batch to respect Gemini rate limits
461
+ setTimeout(() => this.processNext(), 5000);
462
+ }
463
+ }
464
+ export const ingestionQueue = new IngestionQueue();
465
+ //# sourceMappingURL=samples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"samples.js","sourceRoot":"","sources":["../../src/api/samples.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface Config {
2
+ embeddingProvider: string;
3
+ embeddingProviderApiKey: string;
4
+ vectorStore: string;
5
+ vectorStoreUrl: string;
6
+ vectorStoreApiKey?: string;
7
+ port: number;
8
+ nodeEnv: string;
9
+ elasticioApiEmail?: string;
10
+ elasticioApiKey?: string;
11
+ elasticioApiBaseUrl: string;
12
+ logLevel: string;
13
+ }
14
+ export declare const config: Config;
15
+ export declare function validateConfigOnStartup(): void;
16
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,MAAM;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB,EAAE,MAAM,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AA6BD,eAAO,MAAM,MAAM,EAAE,MAYpB,CAAC;AAEF,wBAAgB,uBAAuB,IAAI,IAAI,CAI9C"}
package/dist/config.js ADDED
@@ -0,0 +1,49 @@
1
+ import dotenv from 'dotenv';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
5
+ dotenv.config({ path: path.resolve(__dirname, '../.env') });
6
+ function getEnv(key, fallbackKeys = [], defaultValue) {
7
+ if (process.env[key] !== undefined) {
8
+ return process.env[key];
9
+ }
10
+ for (const fallback of fallbackKeys) {
11
+ if (process.env[fallback] !== undefined) {
12
+ return process.env[fallback];
13
+ }
14
+ }
15
+ if (defaultValue !== undefined) {
16
+ return defaultValue;
17
+ }
18
+ throw new Error(`Configuration Error: Missing required environment variable '${key}'${fallbackKeys.length > 0 ? ` (tried fallbacks: ${fallbackKeys.join(', ')})` : ''}`);
19
+ }
20
+ function getOptionalEnv(key, fallbackKeys = [], defaultValue) {
21
+ if (process.env[key] !== undefined) {
22
+ return process.env[key];
23
+ }
24
+ for (const fallback of fallbackKeys) {
25
+ if (process.env[fallback] !== undefined) {
26
+ return process.env[fallback];
27
+ }
28
+ }
29
+ return defaultValue;
30
+ }
31
+ export const config = {
32
+ embeddingProvider: getEnv('EMBEDDING_PROVIDER', [], 'google'),
33
+ embeddingProviderApiKey: getOptionalEnv('EMBEDDING_PROVIDER_API_KEY') ?? '',
34
+ vectorStore: getEnv('VECTOR_STORE', [], 'qdrant'),
35
+ vectorStoreUrl: getOptionalEnv('VECTOR_STORE_URL') ?? '',
36
+ vectorStoreApiKey: getOptionalEnv('VECTOR_STORE_API_KEY'),
37
+ port: parseInt(getEnv('PORT', [], '9473'), 10),
38
+ nodeEnv: getEnv('NODE_ENV', [], 'development'),
39
+ elasticioApiEmail: getOptionalEnv('ELASTICIO_API_EMAIL'),
40
+ elasticioApiKey: getOptionalEnv('ELASTICIO_API_KEY'),
41
+ elasticioApiBaseUrl: getEnv('ELASTICIO_API_BASE_URL', [], 'https://api.elastic.io/v2'),
42
+ logLevel: getEnv('LOG_LEVEL', [], 'INFO'),
43
+ };
44
+ export function validateConfigOnStartup() {
45
+ if (!config.embeddingProviderApiKey || !config.vectorStoreUrl) {
46
+ process.stderr.write('[WARN] EMBEDDING_PROVIDER_API_KEY and/or VECTOR_STORE_URL not set — semantic search tools (search_documentation, search_flow_samples, search_flow_steps) will be unavailable.\n');
47
+ }
48
+ }
49
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}