@n8n/ai-workflow-builder 0.32.1 → 0.33.0-exp.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.
- package/dist/agents/responder.agent.d.ts +21 -0
- package/dist/agents/responder.agent.js +102 -0
- package/dist/agents/responder.agent.js.map +1 -0
- package/dist/agents/supervisor.agent.d.ts +31 -0
- package/dist/agents/supervisor.agent.js +104 -0
- package/dist/agents/supervisor.agent.js.map +1 -0
- package/dist/ai-workflow-builder-agent.service.d.ts +2 -1
- package/dist/ai-workflow-builder-agent.service.js +13 -4
- package/dist/ai-workflow-builder-agent.service.js.map +1 -1
- package/dist/build.tsbuildinfo +1 -1
- package/dist/chains/prompts/examples/basic/switch-node-examples.d.ts +1 -0
- package/dist/chains/prompts/examples/basic/switch-node-examples.js +128 -0
- package/dist/chains/prompts/examples/basic/switch-node-examples.js.map +1 -0
- package/dist/chains/prompts/node-types/switch-node.d.ts +1 -0
- package/dist/chains/prompts/node-types/switch-node.js +72 -0
- package/dist/chains/prompts/node-types/switch-node.js.map +1 -0
- package/dist/chains/prompts/prompt-builder.d.ts +1 -0
- package/dist/chains/prompts/prompt-builder.js +12 -0
- package/dist/chains/prompts/prompt-builder.js.map +1 -1
- package/dist/chains/prompts/prompt-config.js +1 -0
- package/dist/chains/prompts/prompt-config.js.map +1 -1
- package/dist/constants.d.ts +6 -0
- package/dist/constants.js +7 -1
- package/dist/constants.js.map +1 -1
- package/dist/llm-config.d.ts +1 -0
- package/dist/llm-config.js +20 -1
- package/dist/llm-config.js.map +1 -1
- package/dist/multi-agent-workflow-subgraphs.d.ts +122 -0
- package/dist/multi-agent-workflow-subgraphs.js +153 -0
- package/dist/multi-agent-workflow-subgraphs.js.map +1 -0
- package/dist/parent-graph-state.d.ts +27 -0
- package/dist/parent-graph-state.js +47 -0
- package/dist/parent-graph-state.js.map +1 -0
- package/dist/subgraphs/builder.subgraph.d.ts +122 -0
- package/dist/subgraphs/builder.subgraph.js +384 -0
- package/dist/subgraphs/builder.subgraph.js.map +1 -0
- package/dist/subgraphs/configurator.subgraph.d.ts +132 -0
- package/dist/subgraphs/configurator.subgraph.js +272 -0
- package/dist/subgraphs/configurator.subgraph.js.map +1 -0
- package/dist/subgraphs/discovery.subgraph.d.ts +158 -0
- package/dist/subgraphs/discovery.subgraph.js +487 -0
- package/dist/subgraphs/discovery.subgraph.js.map +1 -0
- package/dist/subgraphs/subgraph-interface.d.ts +23 -0
- package/dist/subgraphs/subgraph-interface.js +7 -0
- package/dist/subgraphs/subgraph-interface.js.map +1 -0
- package/dist/tools/best-practices/content-generation.js +38 -2
- package/dist/tools/best-practices/content-generation.js.map +1 -1
- package/dist/tools/builder-tools.d.ts +5 -2
- package/dist/tools/builder-tools.js +15 -25
- package/dist/tools/builder-tools.js.map +1 -1
- package/dist/tools/get-best-practices.tool.d.ts +1 -1
- package/dist/tools/get-workflow-examples.tool.d.ts +34 -0
- package/dist/tools/get-workflow-examples.tool.js +172 -0
- package/dist/tools/get-workflow-examples.tool.js.map +1 -0
- package/dist/tools/node-details.tool.d.ts +4 -4
- package/dist/tools/node-details.tool.js +30 -2
- package/dist/tools/node-details.tool.js.map +1 -1
- package/dist/tools/node-search.tool.d.ts +1 -1
- package/dist/tools/prompts/main-agent.prompt.d.ts +4 -0
- package/dist/tools/prompts/main-agent.prompt.js +113 -57
- package/dist/tools/prompts/main-agent.prompt.js.map +1 -1
- package/dist/tools/utils/markdown-workflow.utils.d.ts +14 -0
- package/dist/tools/utils/markdown-workflow.utils.js +174 -0
- package/dist/tools/utils/markdown-workflow.utils.js.map +1 -0
- package/dist/tools/utils/test/workflows/ai-assistant.workflow.d.ts +2 -0
- package/dist/tools/utils/test/workflows/ai-assistant.workflow.js +541 -0
- package/dist/tools/utils/test/workflows/ai-assistant.workflow.js.map +1 -0
- package/dist/tools/validate-configuration.tool.d.ts +4 -0
- package/dist/tools/validate-configuration.tool.js +70 -0
- package/dist/tools/validate-configuration.tool.js.map +1 -0
- package/dist/tools/validate-structure.tool.d.ts +4 -0
- package/dist/tools/validate-structure.tool.js +66 -0
- package/dist/tools/validate-structure.tool.js.map +1 -0
- package/dist/tools/web/templates.d.ts +7 -0
- package/dist/tools/web/templates.js +71 -0
- package/dist/tools/web/templates.js.map +1 -0
- package/dist/types/config.d.ts +1 -0
- package/dist/types/coordination.d.ts +42 -0
- package/dist/types/coordination.js +23 -0
- package/dist/types/coordination.js.map +1 -0
- package/dist/types/discovery-types.d.ts +14 -0
- package/dist/types/discovery-types.js +3 -0
- package/dist/types/discovery-types.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +15 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/langchain.d.ts +1 -0
- package/dist/types/langchain.js +8 -0
- package/dist/types/langchain.js.map +1 -1
- package/dist/types/tools.d.ts +20 -0
- package/dist/types/web/templates.d.ts +44 -0
- package/dist/types/web/templates.js +37 -0
- package/dist/types/web/templates.js.map +1 -0
- package/dist/utils/cache-control/helpers.d.ts +1 -0
- package/dist/utils/cache-control/helpers.js +36 -0
- package/dist/utils/cache-control/helpers.js.map +1 -1
- package/dist/utils/cache-control/index.d.ts +1 -1
- package/dist/utils/cache-control/index.js +2 -1
- package/dist/utils/cache-control/index.js.map +1 -1
- package/dist/utils/context-builders.d.ts +10 -0
- package/dist/utils/context-builders.js +71 -0
- package/dist/utils/context-builders.js.map +1 -0
- package/dist/utils/coordination-log.d.ts +15 -0
- package/dist/utils/coordination-log.js +75 -0
- package/dist/utils/coordination-log.js.map +1 -0
- package/dist/utils/operations-processor.d.ts +4 -2
- package/dist/utils/operations-processor.js.map +1 -1
- package/dist/utils/state-modifier.d.ts +32 -0
- package/dist/utils/state-modifier.js +112 -0
- package/dist/utils/state-modifier.js.map +1 -0
- package/dist/utils/state-reducers.d.ts +4 -0
- package/dist/utils/state-reducers.js +25 -0
- package/dist/utils/state-reducers.js.map +1 -0
- package/dist/utils/stream-processor.d.ts +6 -2
- package/dist/utils/stream-processor.js +138 -83
- package/dist/utils/stream-processor.js.map +1 -1
- package/dist/utils/subgraph-helpers.d.ts +16 -0
- package/dist/utils/subgraph-helpers.js +118 -0
- package/dist/utils/subgraph-helpers.js.map +1 -0
- package/dist/utils/token-usage.js +4 -1
- package/dist/utils/token-usage.js.map +1 -1
- package/dist/utils/tool-executor.js +55 -38
- package/dist/utils/tool-executor.js.map +1 -1
- package/dist/utils/workflow-validation.js +1 -0
- package/dist/utils/workflow-validation.js.map +1 -1
- package/dist/validation/checks/connections.js +6 -14
- package/dist/validation/checks/connections.js.map +1 -1
- package/dist/validation/checks/index.d.ts +2 -1
- package/dist/validation/checks/index.js +3 -1
- package/dist/validation/checks/index.js.map +1 -1
- package/dist/validation/checks/nodes.d.ts +4 -0
- package/dist/validation/checks/nodes.js +36 -0
- package/dist/validation/checks/nodes.js.map +1 -0
- package/dist/validation/checks/tools.js +0 -10
- package/dist/validation/checks/tools.js.map +1 -1
- package/dist/validation/checks/trigger.js +0 -6
- package/dist/validation/checks/trigger.js.map +1 -1
- package/dist/validation/programmatic.js +2 -0
- package/dist/validation/programmatic.js.map +1 -1
- package/dist/validation/types.d.ts +5 -1
- package/dist/validation/types.js +8 -0
- package/dist/validation/types.js.map +1 -1
- package/dist/workflow-builder-agent.d.ts +9 -0
- package/dist/workflow-builder-agent.js +44 -10
- package/dist/workflow-builder-agent.js.map +1 -1
- package/dist/workflow-state.d.ts +4 -2
- package/dist/workflow-state.js +9 -0
- package/dist/workflow-state.js.map +1 -1
- package/package.json +9 -8
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VALIDATE_STRUCTURE_TOOL = void 0;
|
|
4
|
+
exports.createValidateStructureTool = createValidateStructureTool;
|
|
5
|
+
const tools_1 = require("@langchain/core/tools");
|
|
6
|
+
const zod_1 = require("zod");
|
|
7
|
+
const checks_1 = require("../validation/checks");
|
|
8
|
+
const errors_1 = require("../errors");
|
|
9
|
+
const progress_1 = require("./helpers/progress");
|
|
10
|
+
const response_1 = require("./helpers/response");
|
|
11
|
+
const state_1 = require("./helpers/state");
|
|
12
|
+
const validateStructureSchema = zod_1.z.object({}).strict().default({});
|
|
13
|
+
exports.VALIDATE_STRUCTURE_TOOL = {
|
|
14
|
+
toolName: 'validate_structure',
|
|
15
|
+
displayTitle: 'Validating structure',
|
|
16
|
+
};
|
|
17
|
+
function createValidateStructureTool(parsedNodeTypes) {
|
|
18
|
+
const dynamicTool = (0, tools_1.tool)(async (input, config) => {
|
|
19
|
+
const reporter = (0, progress_1.createProgressReporter)(config, exports.VALIDATE_STRUCTURE_TOOL.toolName, exports.VALIDATE_STRUCTURE_TOOL.displayTitle);
|
|
20
|
+
try {
|
|
21
|
+
const validatedInput = validateStructureSchema.parse(input ?? {});
|
|
22
|
+
reporter.start(validatedInput);
|
|
23
|
+
const state = (0, state_1.getWorkflowState)();
|
|
24
|
+
(0, progress_1.reportProgress)(reporter, 'Validating structure');
|
|
25
|
+
const connectionViolations = (0, checks_1.validateConnections)(state.workflowJSON, parsedNodeTypes);
|
|
26
|
+
const triggerViolations = (0, checks_1.validateTrigger)(state.workflowJSON, parsedNodeTypes);
|
|
27
|
+
const allViolations = [...connectionViolations, ...triggerViolations];
|
|
28
|
+
let message;
|
|
29
|
+
if (allViolations.length === 0) {
|
|
30
|
+
message =
|
|
31
|
+
'Workflow structure is valid. All connections are correct and trigger node is present.';
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
message = `Found ${allViolations.length} structure issues:\n${allViolations.map((v) => `- ${v.description}`).join('\n')}`;
|
|
35
|
+
}
|
|
36
|
+
reporter.complete({ message });
|
|
37
|
+
return (0, response_1.createSuccessResponse)(config, message, {
|
|
38
|
+
structureValidation: { connections: connectionViolations, trigger: triggerViolations },
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (error instanceof zod_1.z.ZodError) {
|
|
43
|
+
const validationError = new errors_1.ValidationError('Invalid input parameters', {
|
|
44
|
+
extra: { errors: error.errors },
|
|
45
|
+
});
|
|
46
|
+
reporter.error(validationError);
|
|
47
|
+
return (0, response_1.createErrorResponse)(config, validationError);
|
|
48
|
+
}
|
|
49
|
+
const toolError = new errors_1.ToolExecutionError(error instanceof Error ? error.message : 'Failed to validate structure', {
|
|
50
|
+
toolName: exports.VALIDATE_STRUCTURE_TOOL.toolName,
|
|
51
|
+
cause: error instanceof Error ? error : undefined,
|
|
52
|
+
});
|
|
53
|
+
reporter.error(toolError);
|
|
54
|
+
return (0, response_1.createErrorResponse)(config, toolError);
|
|
55
|
+
}
|
|
56
|
+
}, {
|
|
57
|
+
name: exports.VALIDATE_STRUCTURE_TOOL.toolName,
|
|
58
|
+
description: 'Validate workflow structure (connections, trigger). Call after creating nodes/connections to check for issues.',
|
|
59
|
+
schema: validateStructureSchema,
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
tool: dynamicTool,
|
|
63
|
+
...exports.VALIDATE_STRUCTURE_TOOL,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=validate-structure.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-structure.tool.js","sourceRoot":"","sources":["../../src/tools/validate-structure.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TemplateSearchResponse, Category, TemplateFetchResponse } from '../../types';
|
|
2
|
+
export declare function fetchTemplateList(query: {
|
|
3
|
+
search?: string;
|
|
4
|
+
category?: Category;
|
|
5
|
+
rows?: number;
|
|
6
|
+
}): Promise<TemplateSearchResponse>;
|
|
7
|
+
export declare function fetchTemplateByID(id: number): Promise<TemplateFetchResponse>;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fetchTemplateList = fetchTemplateList;
|
|
4
|
+
exports.fetchTemplateByID = fetchTemplateByID;
|
|
5
|
+
const N8N_API_BASE_URL = 'https://api.n8n.io/api';
|
|
6
|
+
function isTemplateSearchResponse(data) {
|
|
7
|
+
if (typeof data !== 'object' || data === null)
|
|
8
|
+
return false;
|
|
9
|
+
const obj = data;
|
|
10
|
+
return typeof obj.totalWorkflows === 'number' && Array.isArray(obj.workflows);
|
|
11
|
+
}
|
|
12
|
+
function isTemplateFetchResponse(data) {
|
|
13
|
+
if (typeof data !== 'object' || data === null)
|
|
14
|
+
return false;
|
|
15
|
+
const obj = data;
|
|
16
|
+
return (typeof obj.id === 'number' &&
|
|
17
|
+
typeof obj.name === 'string' &&
|
|
18
|
+
typeof obj.workflow === 'object' &&
|
|
19
|
+
obj.workflow !== null);
|
|
20
|
+
}
|
|
21
|
+
function buildSearchQueryString(query) {
|
|
22
|
+
const params = new URLSearchParams();
|
|
23
|
+
params.append('price', '0');
|
|
24
|
+
params.append('combineWith', 'and');
|
|
25
|
+
params.append('sort', 'createdAt:desc,rank:desc');
|
|
26
|
+
params.append('rows', String(query.rows ?? 5));
|
|
27
|
+
params.append('page', '1');
|
|
28
|
+
if (query.search)
|
|
29
|
+
params.append('search', query.search);
|
|
30
|
+
if (query.category)
|
|
31
|
+
params.append('category', query.category);
|
|
32
|
+
return params.toString();
|
|
33
|
+
}
|
|
34
|
+
async function fetchTemplateList(query) {
|
|
35
|
+
const queryString = buildSearchQueryString(query);
|
|
36
|
+
const url = `${N8N_API_BASE_URL}/templates/search${queryString ? `?${queryString}` : ''}`;
|
|
37
|
+
const response = await fetch(url, {
|
|
38
|
+
method: 'GET',
|
|
39
|
+
headers: {
|
|
40
|
+
'Content-Type': 'application/json',
|
|
41
|
+
Accept: 'application/json',
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
throw new Error(`Failed to fetch templates: ${response.status} ${response.statusText}`);
|
|
46
|
+
}
|
|
47
|
+
const data = await response.json();
|
|
48
|
+
if (!isTemplateSearchResponse(data)) {
|
|
49
|
+
throw new Error('Invalid response format from templates API');
|
|
50
|
+
}
|
|
51
|
+
return data;
|
|
52
|
+
}
|
|
53
|
+
async function fetchTemplateByID(id) {
|
|
54
|
+
const url = `${N8N_API_BASE_URL}/workflows/templates/${id}`;
|
|
55
|
+
const response = await fetch(url, {
|
|
56
|
+
method: 'GET',
|
|
57
|
+
headers: {
|
|
58
|
+
'Content-Type': 'application/json',
|
|
59
|
+
Accept: 'application/json',
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
if (!response.ok) {
|
|
63
|
+
throw new Error(`Failed to fetch template ${id}: ${response.status} ${response.statusText}`);
|
|
64
|
+
}
|
|
65
|
+
const data = await response.json();
|
|
66
|
+
if (!isTemplateFetchResponse(data)) {
|
|
67
|
+
throw new Error(`Invalid response format from template ${id} API`);
|
|
68
|
+
}
|
|
69
|
+
return data;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/tools/web/templates.ts"],"names":[],"mappings":"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"}
|
package/dist/types/config.d.ts
CHANGED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export type SubgraphPhase = 'discovery' | 'builder' | 'configurator' | 'state_management';
|
|
2
|
+
export interface CoordinationLogEntry {
|
|
3
|
+
phase: SubgraphPhase;
|
|
4
|
+
status: 'completed' | 'error';
|
|
5
|
+
timestamp: number;
|
|
6
|
+
summary: string;
|
|
7
|
+
output?: string;
|
|
8
|
+
metadata: CoordinationMetadata;
|
|
9
|
+
}
|
|
10
|
+
export type CoordinationMetadata = DiscoveryMetadata | BuilderMetadata | ConfiguratorMetadata | StateManagementMetadata | ErrorMetadata;
|
|
11
|
+
export interface DiscoveryMetadata {
|
|
12
|
+
phase: 'discovery';
|
|
13
|
+
nodesFound: number;
|
|
14
|
+
nodeTypes: string[];
|
|
15
|
+
hasBestPractices: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface BuilderMetadata {
|
|
18
|
+
phase: 'builder';
|
|
19
|
+
nodesCreated: number;
|
|
20
|
+
connectionsCreated: number;
|
|
21
|
+
nodeNames: string[];
|
|
22
|
+
}
|
|
23
|
+
export interface ConfiguratorMetadata {
|
|
24
|
+
phase: 'configurator';
|
|
25
|
+
nodesConfigured: number;
|
|
26
|
+
hasSetupInstructions: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface ErrorMetadata {
|
|
29
|
+
phase: 'error';
|
|
30
|
+
failedSubgraph: SubgraphPhase;
|
|
31
|
+
errorMessage: string;
|
|
32
|
+
}
|
|
33
|
+
export interface StateManagementMetadata {
|
|
34
|
+
phase: 'state_management';
|
|
35
|
+
action: 'compact' | 'clear';
|
|
36
|
+
messagesRemoved?: number;
|
|
37
|
+
}
|
|
38
|
+
export declare function createDiscoveryMetadata(data: Omit<DiscoveryMetadata, 'phase'>): DiscoveryMetadata;
|
|
39
|
+
export declare function createBuilderMetadata(data: Omit<BuilderMetadata, 'phase'>): BuilderMetadata;
|
|
40
|
+
export declare function createConfiguratorMetadata(data: Omit<ConfiguratorMetadata, 'phase'>): ConfiguratorMetadata;
|
|
41
|
+
export declare function createErrorMetadata(data: Omit<ErrorMetadata, 'phase'>): ErrorMetadata;
|
|
42
|
+
export declare function createStateManagementMetadata(data: Omit<StateManagementMetadata, 'phase'>): StateManagementMetadata;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createDiscoveryMetadata = createDiscoveryMetadata;
|
|
4
|
+
exports.createBuilderMetadata = createBuilderMetadata;
|
|
5
|
+
exports.createConfiguratorMetadata = createConfiguratorMetadata;
|
|
6
|
+
exports.createErrorMetadata = createErrorMetadata;
|
|
7
|
+
exports.createStateManagementMetadata = createStateManagementMetadata;
|
|
8
|
+
function createDiscoveryMetadata(data) {
|
|
9
|
+
return { phase: 'discovery', ...data };
|
|
10
|
+
}
|
|
11
|
+
function createBuilderMetadata(data) {
|
|
12
|
+
return { phase: 'builder', ...data };
|
|
13
|
+
}
|
|
14
|
+
function createConfiguratorMetadata(data) {
|
|
15
|
+
return { phase: 'configurator', ...data };
|
|
16
|
+
}
|
|
17
|
+
function createErrorMetadata(data) {
|
|
18
|
+
return { phase: 'error', ...data };
|
|
19
|
+
}
|
|
20
|
+
function createStateManagementMetadata(data) {
|
|
21
|
+
return { phase: 'state_management', ...data };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=coordination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordination.js","sourceRoot":"","sources":["../../src/types/coordination.ts"],"names":[],"mappings":";;AAuFA,0DAEC;AAED,sDAEC;AAED,gEAIC;AAED,kDAEC;AAED,sEAIC;AAtBD,SAAgB,uBAAuB,CAAC,IAAsC;IAC7E,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,CAAC;AACxC,CAAC;AAED,SAAgB,qBAAqB,CAAC,IAAoC;IACzE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,SAAgB,0BAA0B,CACzC,IAAyC;IAEzC,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,SAAgB,mBAAmB,CAAC,IAAkC;IACrE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,SAAgB,6BAA6B,CAC5C,IAA4C;IAE5C,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,GAAG,IAAI,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { NodeConfigurationsMap } from './tools';
|
|
2
|
+
export interface DiscoveryContext {
|
|
3
|
+
nodesFound: Array<{
|
|
4
|
+
nodeName: string;
|
|
5
|
+
version: number;
|
|
6
|
+
reasoning: string;
|
|
7
|
+
connectionChangingParameters: Array<{
|
|
8
|
+
name: string;
|
|
9
|
+
possibleValues: Array<string | boolean | number>;
|
|
10
|
+
}>;
|
|
11
|
+
}>;
|
|
12
|
+
bestPractices?: string;
|
|
13
|
+
nodeConfigurations?: NodeConfigurationsMap;
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-types.js","sourceRoot":"","sources":["../../src/types/discovery-types.ts"],"names":[],"mappings":""}
|
package/dist/types/index.d.ts
CHANGED
package/dist/types/index.js
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
2
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./web/templates"), exports);
|
|
3
18
|
//# sourceMappingURL=index.js.map
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAcA,kDAAgC"}
|
package/dist/types/langchain.js
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.isAIMessage = isAIMessage;
|
|
4
|
+
exports.isBaseMessage = isBaseMessage;
|
|
4
5
|
function isAIMessage(msg) {
|
|
5
6
|
return msg.getType() === 'ai';
|
|
6
7
|
}
|
|
8
|
+
function isBaseMessage(value) {
|
|
9
|
+
return (typeof value === 'object' &&
|
|
10
|
+
value !== null &&
|
|
11
|
+
'getType' in value &&
|
|
12
|
+
typeof value.getType === 'function' &&
|
|
13
|
+
'content' in value);
|
|
14
|
+
}
|
|
7
15
|
//# sourceMappingURL=langchain.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"langchain.js","sourceRoot":"","sources":["../../src/types/langchain.ts"],"names":[],"mappings":";;AAEA,kCAEC;
|
|
1
|
+
{"version":3,"file":"langchain.js","sourceRoot":"","sources":["../../src/types/langchain.ts"],"names":[],"mappings":";;AAEA,kCAEC;AAMD,sCAQC;AAhBD,SAAgB,WAAW,CAAC,GAAgB;IAC3C,OAAO,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC;AAC/B,CAAC;AAMD,SAAgB,aAAa,CAAC,KAAc;IAC3C,OAAO,CACN,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,SAAS,IAAI,KAAK;QAClB,OAAQ,KAA8B,CAAC,OAAO,KAAK,UAAU;QAC7D,SAAS,IAAI,KAAK,CAClB,CAAC;AACH,CAAC"}
|
package/dist/types/tools.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { INodeParameters } from 'n8n-workflow';
|
|
|
2
2
|
import type { ZodIssue } from 'zod';
|
|
3
3
|
import type { PromptCategorization } from './categorization';
|
|
4
4
|
import type { AddedNode, NodeDetails, NodeSearchResult } from './nodes';
|
|
5
|
+
import type { SimpleWorkflow } from './workflow';
|
|
5
6
|
export type ProgressUpdateType = 'input' | 'output' | 'progress' | 'error';
|
|
6
7
|
export interface ProgressUpdate<T = Record<string, unknown>> {
|
|
7
8
|
type: ProgressUpdateType;
|
|
@@ -93,3 +94,22 @@ export interface RemoveConnectionOutput {
|
|
|
93
94
|
export interface CategorizePromptOutput {
|
|
94
95
|
categorization: PromptCategorization;
|
|
95
96
|
}
|
|
97
|
+
export interface WorkflowMetadata {
|
|
98
|
+
name: string;
|
|
99
|
+
description?: string;
|
|
100
|
+
workflow: SimpleWorkflow;
|
|
101
|
+
}
|
|
102
|
+
export interface NodeConfigurationEntry {
|
|
103
|
+
version: number;
|
|
104
|
+
parameters: INodeParameters;
|
|
105
|
+
}
|
|
106
|
+
export type NodeConfigurationsMap = Record<string, NodeConfigurationEntry[]>;
|
|
107
|
+
export interface GetWorkflowExamplesOutput {
|
|
108
|
+
examples: Array<{
|
|
109
|
+
name: string;
|
|
110
|
+
description?: string;
|
|
111
|
+
workflow: string;
|
|
112
|
+
}>;
|
|
113
|
+
totalResults: number;
|
|
114
|
+
nodeConfigurations: NodeConfigurationsMap;
|
|
115
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { SimpleWorkflow } from '../workflow';
|
|
2
|
+
export declare const categories: readonly ["AI", "AI Chatbot", "AI RAG", "AI Summarization", "Content Creation", "CRM", "Crypto Trading", "DevOps", "Document Extraction", "Document Ops", "Engineering", "File Management", "HR", "Internal Wiki", "Invoice Processing", "IT Ops", "Lead Generation", "Lead Nurturing", "Marketing", "Market Research", "Miscellaneous", "Multimodal AI", "Other", "Personal Productivity", "Project Management", "Sales", "SecOps", "Social Media", "Support", "Support Chatbot", "Ticket Management"];
|
|
3
|
+
export type Category = (typeof categories)[number];
|
|
4
|
+
export interface TemplateSearchQuery {
|
|
5
|
+
search?: string;
|
|
6
|
+
rows?: number;
|
|
7
|
+
page?: number;
|
|
8
|
+
sort?: string;
|
|
9
|
+
price?: number;
|
|
10
|
+
combineWith?: 'or' | 'and';
|
|
11
|
+
category?: Category;
|
|
12
|
+
}
|
|
13
|
+
export interface TemplateWorkflowDescription {
|
|
14
|
+
id: number;
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
price: number;
|
|
18
|
+
totalViews: number;
|
|
19
|
+
nodes: Array<{
|
|
20
|
+
id: number;
|
|
21
|
+
name: string;
|
|
22
|
+
displayName: string;
|
|
23
|
+
nodeCategories: Array<{
|
|
24
|
+
id: number;
|
|
25
|
+
name: string;
|
|
26
|
+
}>;
|
|
27
|
+
}>;
|
|
28
|
+
user: {
|
|
29
|
+
id: number;
|
|
30
|
+
name: string;
|
|
31
|
+
username: string;
|
|
32
|
+
verified: boolean;
|
|
33
|
+
bio: string;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export interface TemplateSearchResponse {
|
|
37
|
+
totalWorkflows: number;
|
|
38
|
+
workflows: TemplateWorkflowDescription[];
|
|
39
|
+
}
|
|
40
|
+
export interface TemplateFetchResponse {
|
|
41
|
+
id: number;
|
|
42
|
+
name: string;
|
|
43
|
+
workflow: SimpleWorkflow;
|
|
44
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.categories = void 0;
|
|
4
|
+
exports.categories = [
|
|
5
|
+
'AI',
|
|
6
|
+
'AI Chatbot',
|
|
7
|
+
'AI RAG',
|
|
8
|
+
'AI Summarization',
|
|
9
|
+
'Content Creation',
|
|
10
|
+
'CRM',
|
|
11
|
+
'Crypto Trading',
|
|
12
|
+
'DevOps',
|
|
13
|
+
'Document Extraction',
|
|
14
|
+
'Document Ops',
|
|
15
|
+
'Engineering',
|
|
16
|
+
'File Management',
|
|
17
|
+
'HR',
|
|
18
|
+
'Internal Wiki',
|
|
19
|
+
'Invoice Processing',
|
|
20
|
+
'IT Ops',
|
|
21
|
+
'Lead Generation',
|
|
22
|
+
'Lead Nurturing',
|
|
23
|
+
'Marketing',
|
|
24
|
+
'Market Research',
|
|
25
|
+
'Miscellaneous',
|
|
26
|
+
'Multimodal AI',
|
|
27
|
+
'Other',
|
|
28
|
+
'Personal Productivity',
|
|
29
|
+
'Project Management',
|
|
30
|
+
'Sales',
|
|
31
|
+
'SecOps',
|
|
32
|
+
'Social Media',
|
|
33
|
+
'Support',
|
|
34
|
+
'Support Chatbot',
|
|
35
|
+
'Ticket Management',
|
|
36
|
+
];
|
|
37
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/types/web/templates.ts"],"names":[],"mappings":";;;AAGa,QAAA,UAAU,GAAG;IACzB,IAAI;IACJ,YAAY;IACZ,QAAQ;IACR,kBAAkB;IAClB,kBAAkB;IAClB,KAAK;IACL,gBAAgB;IAChB,QAAQ;IACR,qBAAqB;IACrB,cAAc;IACd,aAAa;IACb,iBAAiB;IACjB,IAAI;IACJ,eAAe;IACf,oBAAoB;IACpB,QAAQ;IACR,iBAAiB;IACjB,gBAAgB;IAChB,WAAW;IACX,iBAAiB;IACjB,eAAe;IACf,eAAe;IACf,OAAO;IACP,uBAAuB;IACvB,oBAAoB;IACpB,OAAO;IACP,QAAQ;IACR,cAAc;IACd,SAAS;IACT,iBAAiB;IACjB,mBAAmB;CACV,CAAC"}
|
|
@@ -2,3 +2,4 @@ import type { BaseMessage } from '@langchain/core/messages';
|
|
|
2
2
|
export declare function findUserToolMessageIndices(messages: BaseMessage[]): number[];
|
|
3
3
|
export declare function cleanStaleWorkflowContext(messages: BaseMessage[], userToolIndices: number[]): void;
|
|
4
4
|
export declare function applyCacheControlMarkers(messages: BaseMessage[], userToolIndices: number[], workflowContext: string): void;
|
|
5
|
+
export declare function applySubgraphCacheMarkers(messages: BaseMessage[]): void;
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.findUserToolMessageIndices = findUserToolMessageIndices;
|
|
4
4
|
exports.cleanStaleWorkflowContext = cleanStaleWorkflowContext;
|
|
5
5
|
exports.applyCacheControlMarkers = applyCacheControlMarkers;
|
|
6
|
+
exports.applySubgraphCacheMarkers = applySubgraphCacheMarkers;
|
|
6
7
|
const messages_1 = require("@langchain/core/messages");
|
|
7
8
|
function isTextBlock(block) {
|
|
8
9
|
return (typeof block === 'object' &&
|
|
@@ -87,4 +88,39 @@ function applyCacheControlMarkers(messages, userToolIndices, workflowContext) {
|
|
|
87
88
|
}
|
|
88
89
|
}
|
|
89
90
|
}
|
|
91
|
+
function applySubgraphCacheMarkers(messages) {
|
|
92
|
+
const userToolIndices = findUserToolMessageIndices(messages);
|
|
93
|
+
if (userToolIndices.length === 0) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
let removedCount = 0;
|
|
97
|
+
for (const idx of userToolIndices) {
|
|
98
|
+
const message = messages[idx];
|
|
99
|
+
if (Array.isArray(message.content)) {
|
|
100
|
+
for (const block of message.content) {
|
|
101
|
+
if (hasCacheControl(block) && block.cache_control) {
|
|
102
|
+
delete block.cache_control;
|
|
103
|
+
removedCount++;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const lastIdx = userToolIndices[userToolIndices.length - 1];
|
|
109
|
+
const lastMessage = messages[lastIdx];
|
|
110
|
+
if (typeof lastMessage.content === 'string') {
|
|
111
|
+
lastMessage.content = [
|
|
112
|
+
{
|
|
113
|
+
type: 'text',
|
|
114
|
+
text: lastMessage.content,
|
|
115
|
+
cache_control: { type: 'ephemeral' },
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
}
|
|
119
|
+
else if (Array.isArray(lastMessage.content)) {
|
|
120
|
+
const lastBlock = lastMessage.content[lastMessage.content.length - 1];
|
|
121
|
+
if (isTextBlock(lastBlock)) {
|
|
122
|
+
lastBlock.cache_control = { type: 'ephemeral' };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
90
126
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/utils/cache-control/helpers.ts"],"names":[],"mappings":";;AAgCA,gEASC;AAiBD,8DA8BC;AAkBD,4DAuDC;
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/utils/cache-control/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { findUserToolMessageIndices, cleanStaleWorkflowContext, applyCacheControlMarkers, } from './helpers';
|
|
1
|
+
export { findUserToolMessageIndices, cleanStaleWorkflowContext, applyCacheControlMarkers, applySubgraphCacheMarkers, } from './helpers';
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.applyCacheControlMarkers = exports.cleanStaleWorkflowContext = exports.findUserToolMessageIndices = void 0;
|
|
3
|
+
exports.applySubgraphCacheMarkers = exports.applyCacheControlMarkers = exports.cleanStaleWorkflowContext = exports.findUserToolMessageIndices = void 0;
|
|
4
4
|
var helpers_1 = require("./helpers");
|
|
5
5
|
Object.defineProperty(exports, "findUserToolMessageIndices", { enumerable: true, get: function () { return helpers_1.findUserToolMessageIndices; } });
|
|
6
6
|
Object.defineProperty(exports, "cleanStaleWorkflowContext", { enumerable: true, get: function () { return helpers_1.cleanStaleWorkflowContext; } });
|
|
7
7
|
Object.defineProperty(exports, "applyCacheControlMarkers", { enumerable: true, get: function () { return helpers_1.applyCacheControlMarkers; } });
|
|
8
|
+
Object.defineProperty(exports, "applySubgraphCacheMarkers", { enumerable: true, get: function () { return helpers_1.applySubgraphCacheMarkers; } });
|
|
8
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/cache-control/index.ts"],"names":[],"mappings":";;;AASA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/cache-control/index.ts"],"names":[],"mappings":";;;AASA,qCAKmB;AAJlB,qHAAA,0BAA0B,OAAA;AAC1B,oHAAA,yBAAyB,OAAA;AACzB,mHAAA,wBAAwB,OAAA;AACxB,oHAAA,yBAAyB,OAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { HumanMessage } from '@langchain/core/messages';
|
|
2
|
+
import type { DiscoveryContext } from '../types/discovery-types';
|
|
3
|
+
import type { SimpleWorkflow } from '../types/workflow';
|
|
4
|
+
import type { ChatPayload } from '../workflow-builder-agent';
|
|
5
|
+
export declare function buildWorkflowSummary(workflow: SimpleWorkflow): string;
|
|
6
|
+
export declare function buildWorkflowJsonBlock(workflow: SimpleWorkflow): string;
|
|
7
|
+
export declare function buildDiscoveryContextBlock(discoveryContext: DiscoveryContext | null, includeBestPractices?: boolean): string;
|
|
8
|
+
export declare function buildExecutionContextBlock(workflowContext: ChatPayload['workflowContext'] | undefined): string;
|
|
9
|
+
export declare function buildExecutionSchemaBlock(workflowContext: ChatPayload['workflowContext'] | undefined): string;
|
|
10
|
+
export declare function createContextMessage(contextParts: string[]): HumanMessage;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildWorkflowSummary = buildWorkflowSummary;
|
|
4
|
+
exports.buildWorkflowJsonBlock = buildWorkflowJsonBlock;
|
|
5
|
+
exports.buildDiscoveryContextBlock = buildDiscoveryContextBlock;
|
|
6
|
+
exports.buildExecutionContextBlock = buildExecutionContextBlock;
|
|
7
|
+
exports.buildExecutionSchemaBlock = buildExecutionSchemaBlock;
|
|
8
|
+
exports.createContextMessage = createContextMessage;
|
|
9
|
+
const messages_1 = require("@langchain/core/messages");
|
|
10
|
+
const trim_workflow_context_1 = require("./trim-workflow-context");
|
|
11
|
+
function buildWorkflowSummary(workflow) {
|
|
12
|
+
if (workflow.nodes.length === 0) {
|
|
13
|
+
return 'No nodes in workflow';
|
|
14
|
+
}
|
|
15
|
+
const nodeList = workflow.nodes.map((n) => `- ${n.name} (${n.type})`).join('\n');
|
|
16
|
+
return `${workflow.nodes.length} existing nodes:\n${nodeList}`;
|
|
17
|
+
}
|
|
18
|
+
function buildWorkflowJsonBlock(workflow) {
|
|
19
|
+
const trimmed = (0, trim_workflow_context_1.trimWorkflowJSON)(workflow);
|
|
20
|
+
return [
|
|
21
|
+
'<current_workflow_json>',
|
|
22
|
+
JSON.stringify(trimmed, null, 2),
|
|
23
|
+
'</current_workflow_json>',
|
|
24
|
+
'<note>Large property values may be trimmed. Use get_node_parameter tool for full details.</note>',
|
|
25
|
+
].join('\n');
|
|
26
|
+
}
|
|
27
|
+
function buildDiscoveryContextBlock(discoveryContext, includeBestPractices = true) {
|
|
28
|
+
if (!discoveryContext)
|
|
29
|
+
return '';
|
|
30
|
+
const parts = [];
|
|
31
|
+
if (discoveryContext.nodesFound.length > 0) {
|
|
32
|
+
parts.push('Discovered Nodes:');
|
|
33
|
+
discoveryContext.nodesFound.forEach(({ nodeName, version, reasoning, connectionChangingParameters }) => {
|
|
34
|
+
const params = connectionChangingParameters.length > 0
|
|
35
|
+
? ` [Connection params: ${connectionChangingParameters.map((p) => p.name).join(', ')}]`
|
|
36
|
+
: '';
|
|
37
|
+
parts.push(`- ${nodeName} v${version}: ${reasoning}${params}`);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
if (includeBestPractices && discoveryContext.bestPractices) {
|
|
41
|
+
parts.push('', 'Best Practices:', discoveryContext.bestPractices);
|
|
42
|
+
}
|
|
43
|
+
return parts.join('\n');
|
|
44
|
+
}
|
|
45
|
+
function buildExecutionContextBlock(workflowContext) {
|
|
46
|
+
const executionData = workflowContext?.executionData ?? {};
|
|
47
|
+
const executionSchema = workflowContext?.executionSchema ?? [];
|
|
48
|
+
return [
|
|
49
|
+
'<execution_data>',
|
|
50
|
+
JSON.stringify(executionData, null, 2),
|
|
51
|
+
'</execution_data>',
|
|
52
|
+
'',
|
|
53
|
+
'<execution_schema>',
|
|
54
|
+
JSON.stringify(executionSchema, null, 2),
|
|
55
|
+
'</execution_schema>',
|
|
56
|
+
].join('\n');
|
|
57
|
+
}
|
|
58
|
+
function buildExecutionSchemaBlock(workflowContext) {
|
|
59
|
+
const executionSchema = workflowContext?.executionSchema ?? [];
|
|
60
|
+
if (executionSchema.length === 0)
|
|
61
|
+
return '';
|
|
62
|
+
return [
|
|
63
|
+
'<execution_schema>',
|
|
64
|
+
JSON.stringify(executionSchema, null, 2),
|
|
65
|
+
'</execution_schema>',
|
|
66
|
+
].join('\n');
|
|
67
|
+
}
|
|
68
|
+
function createContextMessage(contextParts) {
|
|
69
|
+
return new messages_1.HumanMessage({ content: contextParts.filter(Boolean).join('\n\n') });
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=context-builders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-builders.js","sourceRoot":"","sources":["../../src/utils/context-builders.ts"],"names":[],"mappings":";;AAeA,oDAOC;AAKD,wDAQC;AAUD,gEA0BC;AAUD,gEAeC;AAKD,8DAYC;AAUD,oDAEC;AA7HD,uDAAwD;AAKxD,mEAA2D;AAU3D,SAAgB,oBAAoB,CAAC,QAAwB;IAC5D,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,sBAAsB,CAAC;IAC/B,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjF,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,qBAAqB,QAAQ,EAAE,CAAC;AAChE,CAAC;AAKD,SAAgB,sBAAsB,CAAC,QAAwB;IAC9D,MAAM,OAAO,GAAG,IAAA,wCAAgB,EAAC,QAAQ,CAAC,CAAC;IAC3C,OAAO;QACN,yBAAyB;QACzB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAChC,0BAA0B;QAC1B,kGAAkG;KAClG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAUD,SAAgB,0BAA0B,CACzC,gBAAyC,EACzC,oBAAoB,GAAG,IAAI;IAE3B,IAAI,CAAC,gBAAgB;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,gBAAgB,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAClC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,4BAA4B,EAAE,EAAE,EAAE;YAClE,MAAM,MAAM,GACX,4BAA4B,CAAC,MAAM,GAAG,CAAC;gBACtC,CAAC,CAAC,wBAAwB,4BAA4B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBACvF,CAAC,CAAC,EAAE,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,KAAK,OAAO,KAAK,SAAS,GAAG,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC,CACD,CAAC;IACH,CAAC;IAED,IAAI,oBAAoB,IAAI,gBAAgB,CAAC,aAAa,EAAE,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAUD,SAAgB,0BAA0B,CACzC,eAA2D;IAE3D,MAAM,aAAa,GAAG,eAAe,EAAE,aAAa,IAAI,EAAE,CAAC;IAC3D,MAAM,eAAe,GAAG,eAAe,EAAE,eAAe,IAAI,EAAE,CAAC;IAE/D,OAAO;QACN,kBAAkB;QAClB,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,mBAAmB;QACnB,EAAE;QACF,oBAAoB;QACpB,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,qBAAqB;KACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAKD,SAAgB,yBAAyB,CACxC,eAA2D;IAE3D,MAAM,eAAe,GAAG,eAAe,EAAE,eAAe,IAAI,EAAE,CAAC;IAE/D,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE5C,OAAO;QACN,oBAAoB;QACpB,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,qBAAqB;KACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAUD,SAAgB,oBAAoB,CAAC,YAAsB;IAC1D,OAAO,IAAI,uBAAY,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACjF,CAAC"}
|