@n8n/instance-ai 1.6.1 → 1.7.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 (113) hide show
  1. package/dist/agent/computer-use-prompt.js +33 -2
  2. package/dist/agent/computer-use-prompt.js.map +1 -1
  3. package/dist/agent/instance-agent.js +0 -1
  4. package/dist/agent/instance-agent.js.map +1 -1
  5. package/dist/agent/shared-prompts.d.ts +1 -1
  6. package/dist/agent/shared-prompts.js +1 -1
  7. package/dist/agent/shared-prompts.js.map +1 -1
  8. package/dist/agent/sub-agent-debriefing.d.ts +2 -2
  9. package/dist/agent/system-prompt.d.ts +0 -1
  10. package/dist/agent/system-prompt.js +14 -15
  11. package/dist/agent/system-prompt.js.map +1 -1
  12. package/dist/build.tsbuildinfo +1 -1
  13. package/dist/index.d.ts +2 -2
  14. package/dist/index.js +4 -2
  15. package/dist/index.js.map +1 -1
  16. package/dist/planned-tasks/planned-task-service.d.ts +3 -0
  17. package/dist/planned-tasks/planned-task-service.js +14 -7
  18. package/dist/planned-tasks/planned-task-service.js.map +1 -1
  19. package/dist/runtime/builder-sandbox-session-registry.d.ts +2 -0
  20. package/dist/runtime/builder-sandbox-session-registry.js +8 -1
  21. package/dist/runtime/builder-sandbox-session-registry.js.map +1 -1
  22. package/dist/runtime/resumable-stream-executor.d.ts +1 -0
  23. package/dist/runtime/resumable-stream-executor.js +7 -0
  24. package/dist/runtime/resumable-stream-executor.js.map +1 -1
  25. package/dist/runtime/run-state-registry.d.ts +11 -4
  26. package/dist/runtime/run-state-registry.js +14 -10
  27. package/dist/runtime/run-state-registry.js.map +1 -1
  28. package/dist/stream/consume-with-hitl.d.ts +2 -0
  29. package/dist/stream/consume-with-hitl.js +1 -0
  30. package/dist/stream/consume-with-hitl.js.map +1 -1
  31. package/dist/tools/attachments/parse-file.tool.d.ts +2 -2
  32. package/dist/tools/credentials.tool.d.ts +2 -2
  33. package/dist/tools/credentials.tool.js +6 -0
  34. package/dist/tools/credentials.tool.js.map +1 -1
  35. package/dist/tools/evals/analyze-agent-input-columns.service.d.ts +6 -0
  36. package/dist/tools/evals/analyze-agent-input-columns.service.js +17 -0
  37. package/dist/tools/evals/analyze-agent-input-columns.service.js.map +1 -0
  38. package/dist/tools/evals/column-ref-utils.d.ts +18 -0
  39. package/dist/tools/evals/column-ref-utils.js +116 -0
  40. package/dist/tools/evals/column-ref-utils.js.map +1 -0
  41. package/dist/tools/evals/describe-metric-for-workflow.service.d.ts +6 -0
  42. package/dist/tools/evals/describe-metric-for-workflow.service.js +108 -0
  43. package/dist/tools/evals/describe-metric-for-workflow.service.js.map +1 -0
  44. package/dist/tools/evals/detect-agent-named-refs.service.d.ts +9 -0
  45. package/dist/tools/evals/detect-agent-named-refs.service.js +67 -0
  46. package/dist/tools/evals/detect-agent-named-refs.service.js.map +1 -0
  47. package/dist/tools/evals/detect-ai-nodes.d.ts +7 -0
  48. package/dist/tools/evals/detect-ai-nodes.js +75 -0
  49. package/dist/tools/evals/detect-ai-nodes.js.map +1 -0
  50. package/dist/tools/evals/detect-tool-refs.service.d.ts +7 -0
  51. package/dist/tools/evals/detect-tool-refs.service.js +65 -0
  52. package/dist/tools/evals/detect-tool-refs.service.js.map +1 -0
  53. package/dist/tools/evals/eval-data-requirements.service.d.ts +19 -0
  54. package/dist/tools/evals/eval-data-requirements.service.js +167 -0
  55. package/dist/tools/evals/eval-data-requirements.service.js.map +1 -0
  56. package/dist/tools/evals/metric-catalog.d.ts +57 -0
  57. package/dist/tools/evals/metric-catalog.js +81 -0
  58. package/dist/tools/evals/metric-catalog.js.map +1 -0
  59. package/dist/tools/filesystem/create-tools-from-mcp-server.js +7 -1
  60. package/dist/tools/filesystem/create-tools-from-mcp-server.js.map +1 -1
  61. package/dist/tools/nodes/node-search-engine.types.d.ts +7 -0
  62. package/dist/tools/orchestration/build-workflow-agent.prompt.js +34 -223
  63. package/dist/tools/orchestration/build-workflow-agent.prompt.js.map +1 -1
  64. package/dist/tools/orchestration/build-workflow-agent.tool.d.ts +12 -1
  65. package/dist/tools/orchestration/build-workflow-agent.tool.js +130 -27
  66. package/dist/tools/orchestration/build-workflow-agent.tool.js.map +1 -1
  67. package/dist/tools/orchestration/delegate.schemas.d.ts +2 -2
  68. package/dist/tools/orchestration/plan-agent-prompt.d.ts +1 -1
  69. package/dist/tools/orchestration/plan-agent-prompt.js +7 -1
  70. package/dist/tools/orchestration/plan-agent-prompt.js.map +1 -1
  71. package/dist/tools/orchestration/plan.tool.js +21 -4
  72. package/dist/tools/orchestration/plan.tool.js.map +1 -1
  73. package/dist/tools/workflows/submit-workflow-identity.d.ts +6 -1
  74. package/dist/tools/workflows/submit-workflow-identity.js +17 -4
  75. package/dist/tools/workflows/submit-workflow-identity.js.map +1 -1
  76. package/dist/tools/workflows/submit-workflow.tool.d.ts +2 -2
  77. package/dist/tools/workflows/submit-workflow.tool.js +5 -1
  78. package/dist/tools/workflows/submit-workflow.tool.js.map +1 -1
  79. package/dist/tools/workflows.tool.js +19 -2
  80. package/dist/tools/workflows.tool.js.map +1 -1
  81. package/dist/tracing/langsmith-tracing.d.ts +2 -0
  82. package/dist/tracing/langsmith-tracing.js +29 -0
  83. package/dist/tracing/langsmith-tracing.js.map +1 -1
  84. package/dist/types.d.ts +0 -1
  85. package/dist/utils/eval-agents.d.ts +3 -0
  86. package/dist/utils/eval-agents.js +7 -0
  87. package/dist/utils/eval-agents.js.map +1 -1
  88. package/dist/utils/scrub-secrets.d.ts +1 -0
  89. package/dist/utils/scrub-secrets.js +19 -0
  90. package/dist/utils/scrub-secrets.js.map +1 -0
  91. package/dist/workflow-loop/guidance.js +2 -1
  92. package/dist/workflow-loop/guidance.js.map +1 -1
  93. package/dist/workflow-loop/index.d.ts +1 -0
  94. package/dist/workflow-loop/index.js +3 -1
  95. package/dist/workflow-loop/index.js.map +1 -1
  96. package/dist/workflow-loop/terminal-remediation-guard.d.ts +6 -0
  97. package/dist/workflow-loop/terminal-remediation-guard.js +18 -0
  98. package/dist/workflow-loop/terminal-remediation-guard.js.map +1 -0
  99. package/dist/workspace/builder-sandbox-factory.d.ts +2 -0
  100. package/dist/workspace/builder-sandbox-factory.js +12 -3
  101. package/dist/workspace/builder-sandbox-factory.js.map +1 -1
  102. package/dist/workspace/guarded-filesystem.d.ts +10 -0
  103. package/dist/workspace/guarded-filesystem.js +136 -0
  104. package/dist/workspace/guarded-filesystem.js.map +1 -0
  105. package/dist/workspace/sandbox-fs.js +34 -11
  106. package/dist/workspace/sandbox-fs.js.map +1 -1
  107. package/dist/workspace/sandbox-setup.d.ts +2 -0
  108. package/dist/workspace/sandbox-setup.js +35 -20
  109. package/dist/workspace/sandbox-setup.js.map +1 -1
  110. package/dist/workspace/template-telemetry.d.ts +23 -0
  111. package/dist/workspace/template-telemetry.js +180 -0
  112. package/dist/workspace/template-telemetry.js.map +1 -0
  113. package/package.json +20 -16
@@ -0,0 +1,9 @@
1
+ import type { WorkflowJSON } from '@n8n/workflow-sdk';
2
+ export interface NamedRef {
3
+ nodeName: string;
4
+ field: string;
5
+ originalExpression: string;
6
+ column: string;
7
+ targetNodeName: string;
8
+ }
9
+ export declare function detectAgentNamedRefs(workflow: WorkflowJSON, agentNodeName: string): NamedRef[];
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectAgentNamedRefs = detectAgentNamedRefs;
4
+ const column_ref_utils_1 = require("./column-ref-utils");
5
+ function slug(name) {
6
+ const result = name
7
+ .toLowerCase()
8
+ .replace(/[^a-z0-9]+/g, '_')
9
+ .replace(/^_+|_+$/g, '');
10
+ return result.length > 0 ? result : 'node';
11
+ }
12
+ function detectAgentNamedRefs(workflow, agentNodeName) {
13
+ const node = (workflow.nodes ?? []).find((n) => (0, column_ref_utils_1.nodeHasName)(n) && n.name === agentNodeName);
14
+ if (!node) {
15
+ throw new Error(`Agent node "${agentNodeName}" not found in workflow`);
16
+ }
17
+ const targets = [agentNodeName, ...(0, column_ref_utils_1.findAgentSubComponents)(workflow, agentNodeName)];
18
+ const nodesByName = new Map((workflow.nodes ?? []).filter(column_ref_utils_1.nodeHasName).map((n) => [n.name, n]));
19
+ const targetMatches = new Map();
20
+ for (const target of targets) {
21
+ const tNode = nodesByName.get(target);
22
+ if (!tNode)
23
+ continue;
24
+ const matches = (0, column_ref_utils_1.collectStrings)(tNode.parameters).flatMap((text) => (0, column_ref_utils_1.extractNamedRefMatches)(text));
25
+ const dedup = new Map();
26
+ for (const m of matches) {
27
+ const key = `${m.nodeName}\x00${m.field}`;
28
+ if (!dedup.has(key))
29
+ dedup.set(key, m);
30
+ }
31
+ if (dedup.size > 0)
32
+ targetMatches.set(target, [...dedup.values()]);
33
+ }
34
+ const allPairs = new Map();
35
+ for (const matches of targetMatches.values()) {
36
+ for (const m of matches) {
37
+ const key = `${m.nodeName}\x00${m.field}`;
38
+ if (!allPairs.has(key)) {
39
+ allPairs.set(key, { nodeName: m.nodeName, field: m.field });
40
+ }
41
+ }
42
+ }
43
+ const byField = new Map();
44
+ for (const p of allPairs.values()) {
45
+ const arr = byField.get(p.field) ?? [];
46
+ arr.push(p);
47
+ byField.set(p.field, arr);
48
+ }
49
+ function columnFor(nodeName, field) {
50
+ const group = byField.get(field) ?? [];
51
+ return group.length === 1 ? field : `${slug(nodeName)}_${field}`;
52
+ }
53
+ const result = [];
54
+ for (const [target, matches] of targetMatches) {
55
+ for (const m of matches) {
56
+ result.push({
57
+ nodeName: m.nodeName,
58
+ field: m.field,
59
+ originalExpression: m.originalExpression,
60
+ column: columnFor(m.nodeName, m.field),
61
+ targetNodeName: target,
62
+ });
63
+ }
64
+ }
65
+ return result;
66
+ }
67
+ //# sourceMappingURL=detect-agent-named-refs.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-agent-named-refs.service.js","sourceRoot":"","sources":["../../../src/tools/evals/detect-agent-named-refs.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { WorkflowJSON } from '@n8n/workflow-sdk';
2
+ export interface DetectAiNodesResult {
3
+ isAiWorkflow: boolean;
4
+ aiNodeNames: string[];
5
+ alreadyConfigured: boolean;
6
+ }
7
+ export declare function detectAiNodes(workflow: WorkflowJSON): DetectAiNodesResult;
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectAiNodes = detectAiNodes;
4
+ const LANGCHAIN_TYPE_PREFIX = '@n8n/n8n-nodes-langchain.';
5
+ const EVALUATION_TYPES = new Set([
6
+ 'n8n-nodes-base.evaluation',
7
+ 'n8n-nodes-base.evaluationTrigger',
8
+ ]);
9
+ const ROOT_AI_TYPES = new Set([
10
+ `${LANGCHAIN_TYPE_PREFIX}agent`,
11
+ `${LANGCHAIN_TYPE_PREFIX}openAiAssistant`,
12
+ `${LANGCHAIN_TYPE_PREFIX}chainLlm`,
13
+ `${LANGCHAIN_TYPE_PREFIX}chainRetrievalQa`,
14
+ `${LANGCHAIN_TYPE_PREFIX}chainSummarization`,
15
+ `${LANGCHAIN_TYPE_PREFIX}informationExtractor`,
16
+ `${LANGCHAIN_TYPE_PREFIX}sentimentAnalysis`,
17
+ `${LANGCHAIN_TYPE_PREFIX}textClassifier`,
18
+ `${LANGCHAIN_TYPE_PREFIX}openAi`,
19
+ `${LANGCHAIN_TYPE_PREFIX}anthropic`,
20
+ `${LANGCHAIN_TYPE_PREFIX}googleGemini`,
21
+ `${LANGCHAIN_TYPE_PREFIX}ollama`,
22
+ `${LANGCHAIN_TYPE_PREFIX}alibabaCloud`,
23
+ `${LANGCHAIN_TYPE_PREFIX}miniMax`,
24
+ `${LANGCHAIN_TYPE_PREFIX}moonshot`,
25
+ ]);
26
+ const SUB_COMPONENT_PREFIXES = [
27
+ 'lm',
28
+ 'embedding',
29
+ 'memory',
30
+ 'tool',
31
+ 'outputparser',
32
+ 'document',
33
+ 'textsplitter',
34
+ 'vectorstore',
35
+ 'retriever',
36
+ 'chattrigger',
37
+ 'manualchattrigger',
38
+ ];
39
+ function isRootAgentType(type) {
40
+ return ROOT_AI_TYPES.has(type);
41
+ }
42
+ function isAnyLangchainNode(type) {
43
+ return type.startsWith(LANGCHAIN_TYPE_PREFIX);
44
+ }
45
+ function isLikelySubComponent(type) {
46
+ if (!type.startsWith(LANGCHAIN_TYPE_PREFIX))
47
+ return false;
48
+ const localPart = type.slice(LANGCHAIN_TYPE_PREFIX.length).toLowerCase();
49
+ return SUB_COMPONENT_PREFIXES.some((prefix) => localPart.startsWith(prefix));
50
+ }
51
+ function detectAiNodes(workflow) {
52
+ const aiNodeNames = [];
53
+ const fallbackCandidates = [];
54
+ let alreadyConfigured = false;
55
+ for (const node of workflow.nodes ?? []) {
56
+ if (!node.name)
57
+ continue;
58
+ if (isRootAgentType(node.type)) {
59
+ aiNodeNames.push(node.name);
60
+ }
61
+ else if (isAnyLangchainNode(node.type) && !isLikelySubComponent(node.type)) {
62
+ fallbackCandidates.push(node.name);
63
+ }
64
+ if (EVALUATION_TYPES.has(node.type)) {
65
+ alreadyConfigured = true;
66
+ }
67
+ }
68
+ const finalAiNodeNames = aiNodeNames.length > 0 ? aiNodeNames : fallbackCandidates;
69
+ return {
70
+ isAiWorkflow: finalAiNodeNames.length > 0,
71
+ aiNodeNames: finalAiNodeNames,
72
+ alreadyConfigured,
73
+ };
74
+ }
75
+ //# sourceMappingURL=detect-ai-nodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-ai-nodes.js","sourceRoot":"","sources":["../../../src/tools/evals/detect-ai-nodes.ts"],"names":[],"mappings":";;AA4EA,sCA6BC;AAvGD,MAAM,qBAAqB,GAAG,2BAA2B,CAAC;AAC1D,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAS;IACxC,2BAA2B;IAC3B,kCAAkC;CAClC,CAAC,CAAC;AASH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAS;IAErC,GAAG,qBAAqB,OAAO;IAC/B,GAAG,qBAAqB,iBAAiB;IACzC,GAAG,qBAAqB,UAAU;IAClC,GAAG,qBAAqB,kBAAkB;IAC1C,GAAG,qBAAqB,oBAAoB;IAC5C,GAAG,qBAAqB,sBAAsB;IAC9C,GAAG,qBAAqB,mBAAmB;IAC3C,GAAG,qBAAqB,gBAAgB;IAGxC,GAAG,qBAAqB,QAAQ;IAChC,GAAG,qBAAqB,WAAW;IACnC,GAAG,qBAAqB,cAAc;IACtC,GAAG,qBAAqB,QAAQ;IAChC,GAAG,qBAAqB,cAAc;IACtC,GAAG,qBAAqB,SAAS;IACjC,GAAG,qBAAqB,UAAU;CAClC,CAAC,CAAC;AAKH,MAAM,sBAAsB,GAAG;IAC9B,IAAI;IACJ,WAAW;IACX,QAAQ;IACR,MAAM;IACN,cAAc;IACd,UAAU;IACV,cAAc;IACd,aAAa;IACb,WAAW;IACX,aAAa;IACb,mBAAmB;CACnB,CAAC;AAQF,SAAS,eAAe,CAAC,IAAY;IACpC,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;AAC/C,CAAC;AAKD,SAAS,oBAAoB,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACzE,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,SAAgB,aAAa,CAAC,QAAsB;IACnD,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,kBAAkB,GAAa,EAAE,CAAC;IACxC,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,SAAS;QACzB,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAI9E,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,iBAAiB,GAAG,IAAI,CAAC;QAC1B,CAAC;IACF,CAAC;IAID,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAEnF,OAAO;QACN,YAAY,EAAE,gBAAgB,CAAC,MAAM,GAAG,CAAC;QACzC,WAAW,EAAE,gBAAgB;QAC7B,iBAAiB;KACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { WorkflowJSON } from '@n8n/workflow-sdk';
2
+ export interface ToolRef {
3
+ sourceNodeName: string;
4
+ field: string;
5
+ toolNodeName: string;
6
+ }
7
+ export declare function detectToolRefs(workflow: WorkflowJSON, agentNodeName: string): ToolRef[];
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectToolRefs = detectToolRefs;
4
+ const column_ref_utils_1 = require("./column-ref-utils");
5
+ function reachableDownstreamMain(workflow, startNodeName) {
6
+ const reached = new Set();
7
+ const queue = [startNodeName];
8
+ while (queue.length > 0) {
9
+ const current = queue.shift();
10
+ const slot = workflow.connections?.[current]?.main;
11
+ if (!Array.isArray(slot))
12
+ continue;
13
+ for (const inner of slot) {
14
+ if (!Array.isArray(inner))
15
+ continue;
16
+ for (const conn of inner) {
17
+ if (!(0, column_ref_utils_1.isRecord)(conn) || typeof conn.node !== 'string')
18
+ continue;
19
+ if (reached.has(conn.node))
20
+ continue;
21
+ reached.add(conn.node);
22
+ queue.push(conn.node);
23
+ }
24
+ }
25
+ }
26
+ return reached;
27
+ }
28
+ function detectToolRefs(workflow, agentNodeName) {
29
+ const agent = (workflow.nodes ?? []).find((n) => (0, column_ref_utils_1.nodeHasName)(n) && n.name === agentNodeName);
30
+ if (!agent) {
31
+ throw new Error(`Agent node "${agentNodeName}" not found in workflow`);
32
+ }
33
+ const subComponents = (0, column_ref_utils_1.findAgentSubComponents)(workflow, agentNodeName);
34
+ if (subComponents.length === 0)
35
+ return [];
36
+ const nodesByName = new Map((workflow.nodes ?? []).filter(column_ref_utils_1.nodeHasName).map((n) => [n.name, n]));
37
+ const downstream = reachableDownstreamMain(workflow, agentNodeName);
38
+ const seen = new Set();
39
+ const result = [];
40
+ for (const toolNodeName of subComponents) {
41
+ const toolNode = nodesByName.get(toolNodeName);
42
+ if (!toolNode)
43
+ continue;
44
+ const matches = (0, column_ref_utils_1.collectStrings)(toolNode.parameters).flatMap((text) => (0, column_ref_utils_1.extractNamedRefMatches)(text));
45
+ for (const m of matches) {
46
+ if (m.nodeName === agentNodeName)
47
+ continue;
48
+ if (downstream.has(m.nodeName))
49
+ continue;
50
+ if (!nodesByName.has(m.nodeName))
51
+ continue;
52
+ const key = `${toolNodeName}\x00${m.nodeName}\x00${m.field}`;
53
+ if (seen.has(key))
54
+ continue;
55
+ seen.add(key);
56
+ result.push({
57
+ sourceNodeName: m.nodeName,
58
+ field: m.field,
59
+ toolNodeName,
60
+ });
61
+ }
62
+ }
63
+ return result;
64
+ }
65
+ //# sourceMappingURL=detect-tool-refs.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-tool-refs.service.js","sourceRoot":"","sources":["../../../src/tools/evals/detect-tool-refs.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { WorkflowJSON } from '@n8n/workflow-sdk';
2
+ export interface EvalDataTarget {
3
+ dataTableId: string;
4
+ evaluationTriggerName: string;
5
+ targetNodeName?: string;
6
+ inputColumns: string[];
7
+ expectedOutputColumns: string[];
8
+ actualOutputColumns: string[];
9
+ metricNodeNames: string[];
10
+ expectedToActualPairs: Array<{
11
+ expectedColumn: string;
12
+ actualField: string;
13
+ }>;
14
+ }
15
+ export interface EvalDataRequirements {
16
+ targets: EvalDataTarget[];
17
+ reason?: string;
18
+ }
19
+ export declare function analyzeEvalDataRequirements(workflow: WorkflowJSON): EvalDataRequirements;
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.analyzeEvalDataRequirements = analyzeEvalDataRequirements;
4
+ const analyze_agent_input_columns_service_1 = require("./analyze-agent-input-columns.service");
5
+ const column_ref_utils_1 = require("./column-ref-utils");
6
+ const detect_ai_nodes_1 = require("./detect-ai-nodes");
7
+ function readOperation(node) {
8
+ const parameters = node.parameters;
9
+ if (!(0, column_ref_utils_1.isRecord)(parameters))
10
+ return undefined;
11
+ const operation = parameters.operation;
12
+ return typeof operation === 'string' ? operation : undefined;
13
+ }
14
+ function readDataTableId(node) {
15
+ const parameters = node.parameters;
16
+ if (!(0, column_ref_utils_1.isRecord)(parameters))
17
+ return undefined;
18
+ const dataTableId = parameters.dataTableId;
19
+ if (typeof dataTableId === 'string')
20
+ return dataTableId;
21
+ if (!(0, column_ref_utils_1.isRecord)(dataTableId))
22
+ return undefined;
23
+ const value = dataTableId.value;
24
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
25
+ }
26
+ function childNames(workflow, sourceName, outputIndex) {
27
+ const connectionsByType = workflow.connections?.[sourceName];
28
+ if (!connectionsByType || typeof connectionsByType !== 'object')
29
+ return [];
30
+ const main = connectionsByType.main;
31
+ if (!Array.isArray(main))
32
+ return [];
33
+ const slots = outputIndex === undefined
34
+ ? main
35
+ : [main[outputIndex]].filter((slot) => Array.isArray(slot));
36
+ return (0, column_ref_utils_1.unique)(slots.flatMap((slot) => {
37
+ if (!Array.isArray(slot))
38
+ return [];
39
+ return slot.flatMap((connection) => {
40
+ if (!(0, column_ref_utils_1.isRecord)(connection))
41
+ return [];
42
+ const node = connection.node;
43
+ return typeof node === 'string' ? [node] : [];
44
+ });
45
+ }));
46
+ }
47
+ function collectReachableNodeNames(workflow, startName) {
48
+ const seen = new Set();
49
+ const queue = [startName];
50
+ while (queue.length > 0) {
51
+ const current = queue.shift();
52
+ if (!current || seen.has(current))
53
+ continue;
54
+ seen.add(current);
55
+ for (const child of childNames(workflow, current)) {
56
+ if (!seen.has(child))
57
+ queue.push(child);
58
+ }
59
+ }
60
+ seen.delete(startName);
61
+ return [...seen];
62
+ }
63
+ function expectedColumnsFromMetricNodes(nodes) {
64
+ return (0, column_ref_utils_1.unique)(nodes.flatMap((node) => {
65
+ if (!(0, column_ref_utils_1.nodeTypeEndsWith)(node, 'evaluation') || readOperation(node) !== 'setMetrics')
66
+ return [];
67
+ const parameters = node.parameters;
68
+ if (!(0, column_ref_utils_1.isRecord)(parameters))
69
+ return [];
70
+ const expectedRaw = parameters.expectedAnswer;
71
+ return typeof expectedRaw === 'string' ? (0, column_ref_utils_1.extractJsonColumnRefs)(expectedRaw) : [];
72
+ }));
73
+ }
74
+ function actualColumnsFromSetOutputs(nodes) {
75
+ return (0, column_ref_utils_1.unique)(nodes.flatMap((node) => {
76
+ if (!(0, column_ref_utils_1.nodeTypeEndsWith)(node, 'evaluation') || readOperation(node) !== 'setOutputs')
77
+ return [];
78
+ const parameters = node.parameters;
79
+ if (!(0, column_ref_utils_1.isRecord)(parameters))
80
+ return [];
81
+ const outputs = parameters.outputs;
82
+ if (!(0, column_ref_utils_1.isRecord)(outputs))
83
+ return [];
84
+ const values = outputs.values;
85
+ if (!Array.isArray(values))
86
+ return [];
87
+ return values.flatMap((value) => {
88
+ if (!(0, column_ref_utils_1.isRecord)(value))
89
+ return [];
90
+ const outputName = value.outputName;
91
+ return typeof outputName === 'string' ? [outputName] : [];
92
+ });
93
+ }));
94
+ }
95
+ function pairsFromMetricNodes(nodes) {
96
+ const pairs = [];
97
+ for (const node of nodes) {
98
+ if (!(0, column_ref_utils_1.nodeTypeEndsWith)(node, 'evaluation') || readOperation(node) !== 'setMetrics')
99
+ continue;
100
+ const parameters = node.parameters;
101
+ if (!(0, column_ref_utils_1.isRecord)(parameters))
102
+ continue;
103
+ const expectedRaw = parameters.expectedAnswer;
104
+ const actualRaw = parameters.actualAnswer;
105
+ if (typeof expectedRaw !== 'string' || typeof actualRaw !== 'string')
106
+ continue;
107
+ const expectedRefs = (0, column_ref_utils_1.extractJsonColumnRefs)(expectedRaw).filter((ref) => ref.startsWith('expected'));
108
+ const actualRefs = (0, column_ref_utils_1.extractJsonColumnRefs)(actualRaw);
109
+ const len = Math.min(expectedRefs.length, actualRefs.length);
110
+ for (let i = 0; i < len; i++) {
111
+ pairs.push({ expectedColumn: expectedRefs[i], actualField: actualRefs[i] });
112
+ }
113
+ }
114
+ const map = new Map();
115
+ for (const p of pairs)
116
+ map.set(p.expectedColumn, p.actualField);
117
+ return [...map.entries()].map(([expectedColumn, actualField]) => ({
118
+ expectedColumn,
119
+ actualField,
120
+ }));
121
+ }
122
+ function firstReachableTargetNodeName(workflow, evalTriggerName) {
123
+ const reachableNodeNames = collectReachableNodeNames(workflow, evalTriggerName);
124
+ const reachableNameSet = new Set(reachableNodeNames);
125
+ const reachableNodes = (workflow.nodes ?? []).filter((node) => (0, column_ref_utils_1.nodeHasName)(node) && reachableNameSet.has(node.name));
126
+ const aiNodeNames = new Set((0, detect_ai_nodes_1.detectAiNodes)({ ...workflow, nodes: reachableNodes }).aiNodeNames);
127
+ return reachableNodeNames.find((name) => aiNodeNames.has(name));
128
+ }
129
+ function analyzeEvalDataRequirements(workflow) {
130
+ const evaluationTriggers = (workflow.nodes ?? []).filter((node) => (0, column_ref_utils_1.nodeHasName)(node) && (0, column_ref_utils_1.nodeTypeEndsWith)(node, 'evaluationTrigger'));
131
+ if (evaluationTriggers.length === 0) {
132
+ return { targets: [], reason: 'Workflow has no EvaluationTrigger nodes.' };
133
+ }
134
+ const targets = evaluationTriggers.flatMap((trigger) => {
135
+ const dataTableId = readDataTableId(trigger);
136
+ if (!dataTableId)
137
+ return [];
138
+ const reachableNames = new Set(collectReachableNodeNames(workflow, trigger.name));
139
+ const reachableNodes = (workflow.nodes ?? []).filter((node) => (0, column_ref_utils_1.nodeHasName)(node) && reachableNames.has(node.name));
140
+ const metricNodeNames = reachableNodes
141
+ .filter((node) => (0, column_ref_utils_1.nodeTypeEndsWith)(node, 'evaluation') && readOperation(node) === 'setMetrics')
142
+ .map((node) => node.name);
143
+ const targetNodeName = firstReachableTargetNodeName(workflow, trigger.name);
144
+ return [
145
+ {
146
+ dataTableId,
147
+ evaluationTriggerName: trigger.name,
148
+ targetNodeName,
149
+ inputColumns: targetNodeName
150
+ ? (0, analyze_agent_input_columns_service_1.analyzeAgentInputColumns)(workflow, targetNodeName).inputColumns
151
+ : [],
152
+ expectedOutputColumns: expectedColumnsFromMetricNodes(reachableNodes),
153
+ actualOutputColumns: actualColumnsFromSetOutputs(reachableNodes),
154
+ metricNodeNames,
155
+ expectedToActualPairs: pairsFromMetricNodes(reachableNodes),
156
+ },
157
+ ];
158
+ });
159
+ if (targets.length === 0) {
160
+ return {
161
+ targets: [],
162
+ reason: 'Workflow has EvaluationTrigger nodes, but none are wired to a DataTable id.',
163
+ };
164
+ }
165
+ return { targets };
166
+ }
167
+ //# sourceMappingURL=eval-data-requirements.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-data-requirements.service.js","sourceRoot":"","sources":["../../../src/tools/evals/eval-data-requirements.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { WorkflowJSON } from '@n8n/workflow-sdk';
2
+ export declare const METRIC_IDS: readonly ["correctness", "relevance", "tool_use", "helpfulness"];
3
+ export type MetricId = (typeof METRIC_IDS)[number];
4
+ export interface MetricCatalogEntry {
5
+ id: MetricId;
6
+ name: string;
7
+ kind: 'llm-judge';
8
+ cannedMetricKey: MetricId;
9
+ description: string;
10
+ prompt: string;
11
+ defaultEnabled: boolean;
12
+ requiresExpected: boolean;
13
+ }
14
+ export declare const METRIC_CATALOG: {
15
+ correctness: {
16
+ id: "correctness";
17
+ name: string;
18
+ kind: "llm-judge";
19
+ cannedMetricKey: "correctness";
20
+ description: string;
21
+ prompt: string;
22
+ defaultEnabled: true;
23
+ requiresExpected: true;
24
+ };
25
+ relevance: {
26
+ id: "relevance";
27
+ name: string;
28
+ kind: "llm-judge";
29
+ cannedMetricKey: "relevance";
30
+ description: string;
31
+ prompt: string;
32
+ defaultEnabled: false;
33
+ requiresExpected: false;
34
+ };
35
+ tool_use: {
36
+ id: "tool_use";
37
+ name: string;
38
+ kind: "llm-judge";
39
+ cannedMetricKey: "tool_use";
40
+ description: string;
41
+ prompt: string;
42
+ defaultEnabled: false;
43
+ requiresExpected: false;
44
+ };
45
+ helpfulness: {
46
+ id: "helpfulness";
47
+ name: string;
48
+ kind: "llm-judge";
49
+ cannedMetricKey: "helpfulness";
50
+ description: string;
51
+ prompt: string;
52
+ defaultEnabled: false;
53
+ requiresExpected: false;
54
+ };
55
+ };
56
+ export declare function getMetricsByIds(ids: string[]): MetricCatalogEntry[];
57
+ export declare function proposeDefaultMetricIds(workflow: WorkflowJSON, agentNodeName: string): MetricId[];
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.METRIC_CATALOG = exports.METRIC_IDS = void 0;
4
+ exports.getMetricsByIds = getMetricsByIds;
5
+ exports.proposeDefaultMetricIds = proposeDefaultMetricIds;
6
+ const column_ref_utils_1 = require("./column-ref-utils");
7
+ exports.METRIC_IDS = ['correctness', 'relevance', 'tool_use', 'helpfulness'];
8
+ exports.METRIC_CATALOG = {
9
+ correctness: {
10
+ id: 'correctness',
11
+ name: 'Correctness',
12
+ kind: 'llm-judge',
13
+ cannedMetricKey: 'correctness',
14
+ description: 'Judge whether the workflow output matches the expected ground-truth response.',
15
+ prompt: 'Given the input and expected output, rate from 0 to 1 how correct the actual output is.',
16
+ defaultEnabled: true,
17
+ requiresExpected: true,
18
+ },
19
+ relevance: {
20
+ id: 'relevance',
21
+ name: 'Relevance',
22
+ kind: 'llm-judge',
23
+ cannedMetricKey: 'relevance',
24
+ description: 'Judge whether retrieved context is relevant to the user query (RAG).',
25
+ prompt: 'Rate from 0 to 1 how relevant the retrieved documents are to the user query.',
26
+ defaultEnabled: false,
27
+ requiresExpected: false,
28
+ },
29
+ tool_use: {
30
+ id: 'tool_use',
31
+ name: 'Tool use',
32
+ kind: 'llm-judge',
33
+ cannedMetricKey: 'tool_use',
34
+ description: 'Judge whether the agent selected and used the correct tools for the input.',
35
+ prompt: 'Rate from 0 to 1 how appropriate the tool selection and arguments were for the user query.',
36
+ defaultEnabled: false,
37
+ requiresExpected: false,
38
+ },
39
+ helpfulness: {
40
+ id: 'helpfulness',
41
+ name: 'Helpfulness',
42
+ kind: 'llm-judge',
43
+ cannedMetricKey: 'helpfulness',
44
+ description: 'Judge whether the agent response is helpful to the user.',
45
+ prompt: 'Rate from 0 to 1 how helpful the response is to the user query.',
46
+ defaultEnabled: false,
47
+ requiresExpected: false,
48
+ },
49
+ };
50
+ function isMetricId(id) {
51
+ return exports.METRIC_IDS.includes(id);
52
+ }
53
+ function getMetricsByIds(ids) {
54
+ return ids.filter(isMetricId).map((id) => exports.METRIC_CATALOG[id]);
55
+ }
56
+ function agentHasTools(workflow, agentNodeName) {
57
+ const connections = workflow.connections ?? {};
58
+ for (const sourceConnections of Object.values(connections)) {
59
+ if (!(0, column_ref_utils_1.isRecord)(sourceConnections))
60
+ continue;
61
+ const aiTool = sourceConnections.ai_tool;
62
+ if (!Array.isArray(aiTool))
63
+ continue;
64
+ for (const slot of aiTool) {
65
+ if (!Array.isArray(slot))
66
+ continue;
67
+ for (const conn of slot) {
68
+ if ((0, column_ref_utils_1.isRecord)(conn) && conn.node === agentNodeName)
69
+ return true;
70
+ }
71
+ }
72
+ }
73
+ return false;
74
+ }
75
+ function proposeDefaultMetricIds(workflow, agentNodeName) {
76
+ const ids = ['correctness'];
77
+ if (agentHasTools(workflow, agentNodeName))
78
+ ids.push('tool_use');
79
+ return ids;
80
+ }
81
+ //# sourceMappingURL=metric-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metric-catalog.js","sourceRoot":"","sources":["../../../src/tools/evals/metric-catalog.ts"],"names":[],"mappings":";;;AAmEA,0CAEC;AAkBD,0DAIC;AAzFD,yDAA8C;AAEjC,QAAA,UAAU,GAAG,CAAC,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,CAAU,CAAC;AAc9E,QAAA,cAAc,GAAG;IAC7B,WAAW,EAAE;QACZ,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,WAAW;QACjB,eAAe,EAAE,aAAa;QAC9B,WAAW,EAAE,+EAA+E;QAC5F,MAAM,EACL,yFAAyF;QAC1F,cAAc,EAAE,IAAI;QACpB,gBAAgB,EAAE,IAAI;KACtB;IACD,SAAS,EAAE;QACV,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,WAAW;QACjB,eAAe,EAAE,WAAW;QAC5B,WAAW,EAAE,sEAAsE;QACnF,MAAM,EAAE,8EAA8E;QACtF,cAAc,EAAE,KAAK;QACrB,gBAAgB,EAAE,KAAK;KACvB;IACD,QAAQ,EAAE;QACT,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,WAAW;QACjB,eAAe,EAAE,UAAU;QAC3B,WAAW,EAAE,4EAA4E;QACzF,MAAM,EACL,4FAA4F;QAC7F,cAAc,EAAE,KAAK;QACrB,gBAAgB,EAAE,KAAK;KACvB;IACD,WAAW,EAAE;QACZ,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,WAAW;QACjB,eAAe,EAAE,aAAa;QAC9B,WAAW,EAAE,0DAA0D;QACvE,MAAM,EAAE,iEAAiE;QACzE,cAAc,EAAE,KAAK;QACrB,gBAAgB,EAAE,KAAK;KACvB;CAC8C,CAAC;AAEjD,SAAS,UAAU,CAAC,EAAU;IAC7B,OAAQ,kBAAgC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,SAAgB,eAAe,CAAC,GAAa;IAC5C,OAAO,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,sBAAc,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,aAAa,CAAC,QAAsB,EAAE,aAAqB;IACnE,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC;IAC/C,KAAK,MAAM,iBAAiB,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,IAAA,2BAAQ,EAAC,iBAAiB,CAAC;YAAE,SAAS;QAC3C,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,SAAS;QACrC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,SAAS;YACnC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACzB,IAAI,IAAA,2BAAQ,EAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa;oBAAE,OAAO,IAAI,CAAC;YAChE,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAgB,uBAAuB,CAAC,QAAsB,EAAE,aAAqB;IACpF,MAAM,GAAG,GAAe,CAAC,aAAa,CAAC,CAAC;IACxC,IAAI,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjE,OAAO,GAAG,CAAC;AACZ,CAAC"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createToolsFromLocalMcpServer = createToolsFromLocalMcpServer;
4
4
  const tools_1 = require("@mastra/core/tools");
5
5
  const api_types_1 = require("@n8n/api-types");
6
+ const credential_1 = require("@n8n/mcp-browser/dist/tools/credential");
6
7
  const nanoid_1 = require("nanoid");
7
8
  const zod_1 = require("zod");
8
9
  const zod_from_json_schema_v3_1 = require("zod-from-json-schema-v3");
@@ -115,7 +116,12 @@ function createToolsFromLocalMcpServer(server, logger) {
115
116
  }
116
117
  let inputSchema;
117
118
  try {
118
- inputSchema = (0, zod_from_json_schema_v3_1.convertJsonSchemaToZod)(mcpTool.inputSchema);
119
+ if (toolName === 'browser_create_credential') {
120
+ inputSchema = credential_1.browserCreateCredentialSchema;
121
+ }
122
+ else {
123
+ inputSchema = (0, zod_from_json_schema_v3_1.convertJsonSchemaToZod)(mcpTool.inputSchema);
124
+ }
119
125
  }
120
126
  catch {
121
127
  inputSchema = zod_1.z.record(zod_1.z.unknown());