@octo-cyber/workflow 0.5.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/controllers/ai-workflow-session.controller.d.ts +19 -0
- package/dist/controllers/ai-workflow-session.controller.d.ts.map +1 -0
- package/dist/controllers/ai-workflow-session.controller.js +135 -0
- package/dist/controllers/ai-workflow-session.controller.js.map +1 -0
- package/dist/controllers/credential.controller.d.ts +68 -0
- package/dist/controllers/credential.controller.d.ts.map +1 -0
- package/dist/controllers/credential.controller.js +303 -0
- package/dist/controllers/credential.controller.js.map +1 -0
- package/dist/controllers/index.d.ts +3 -0
- package/dist/controllers/index.d.ts.map +1 -0
- package/dist/controllers/index.js +8 -0
- package/dist/controllers/index.js.map +1 -0
- package/dist/controllers/workflow-ai.controller.d.ts +23 -0
- package/dist/controllers/workflow-ai.controller.d.ts.map +1 -0
- package/dist/controllers/workflow-ai.controller.js +164 -0
- package/dist/controllers/workflow-ai.controller.js.map +1 -0
- package/dist/controllers/workflow.controller.d.ts +66 -0
- package/dist/controllers/workflow.controller.d.ts.map +1 -0
- package/dist/controllers/workflow.controller.js +239 -0
- package/dist/controllers/workflow.controller.js.map +1 -0
- package/dist/core/expression-resolver.d.ts +49 -0
- package/dist/core/expression-resolver.d.ts.map +1 -0
- package/dist/core/expression-resolver.js +113 -0
- package/dist/core/expression-resolver.js.map +1 -0
- package/dist/core/node-registry.d.ts +24 -0
- package/dist/core/node-registry.d.ts.map +1 -0
- package/dist/core/node-registry.js +62 -0
- package/dist/core/node-registry.js.map +1 -0
- package/dist/core/workflow-executor.d.ts +50 -0
- package/dist/core/workflow-executor.d.ts.map +1 -0
- package/dist/core/workflow-executor.js +458 -0
- package/dist/core/workflow-executor.js.map +1 -0
- package/dist/entities/ai-workflow-session.entity.d.ts +17 -0
- package/dist/entities/ai-workflow-session.entity.d.ts.map +1 -0
- package/dist/entities/ai-workflow-session.entity.js +70 -0
- package/dist/entities/ai-workflow-session.entity.js.map +1 -0
- package/dist/entities/ai-workflow-version.entity.d.ts +18 -0
- package/dist/entities/ai-workflow-version.entity.d.ts.map +1 -0
- package/dist/entities/ai-workflow-version.entity.js +71 -0
- package/dist/entities/ai-workflow-version.entity.js.map +1 -0
- package/dist/entities/credential-definition.entity.d.ts +17 -0
- package/dist/entities/credential-definition.entity.d.ts.map +1 -0
- package/dist/entities/credential-definition.entity.js +66 -0
- package/dist/entities/credential-definition.entity.js.map +1 -0
- package/dist/entities/index.d.ts +9 -0
- package/dist/entities/index.d.ts.map +1 -0
- package/dist/entities/index.js +22 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/entities/workflow-definition.entity.d.ts +20 -0
- package/dist/entities/workflow-definition.entity.d.ts.map +1 -0
- package/dist/entities/workflow-definition.entity.js +85 -0
- package/dist/entities/workflow-definition.entity.js.map +1 -0
- package/dist/entities/workflow-execution.entity.d.ts +26 -0
- package/dist/entities/workflow-execution.entity.d.ts.map +1 -0
- package/dist/entities/workflow-execution.entity.js +99 -0
- package/dist/entities/workflow-execution.entity.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +96 -0
- package/dist/index.js.map +1 -0
- package/dist/n8n/cipher/cipher.d.ts +11 -0
- package/dist/n8n/cipher/cipher.d.ts.map +1 -0
- package/dist/n8n/cipher/cipher.js +54 -0
- package/dist/n8n/cipher/cipher.js.map +1 -0
- package/dist/n8n/controllers/n8n-session.controller.d.ts +20 -0
- package/dist/n8n/controllers/n8n-session.controller.d.ts.map +1 -0
- package/dist/n8n/controllers/n8n-session.controller.js +84 -0
- package/dist/n8n/controllers/n8n-session.controller.js.map +1 -0
- package/dist/n8n/index.d.ts +8 -0
- package/dist/n8n/index.d.ts.map +1 -0
- package/dist/n8n/index.js +14 -0
- package/dist/n8n/index.js.map +1 -0
- package/dist/n8n/launcher/n8n-launcher.d.ts +41 -0
- package/dist/n8n/launcher/n8n-launcher.d.ts.map +1 -0
- package/dist/n8n/launcher/n8n-launcher.js +186 -0
- package/dist/n8n/launcher/n8n-launcher.js.map +1 -0
- package/dist/n8n/nodes/OctoClaudeCliTool.node.d.ts +13 -0
- package/dist/n8n/nodes/OctoClaudeCliTool.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoClaudeCliTool.node.js +103 -0
- package/dist/n8n/nodes/OctoClaudeCliTool.node.js.map +1 -0
- package/dist/n8n/nodes/OctoCliChatModel.node.d.ts +14 -0
- package/dist/n8n/nodes/OctoCliChatModel.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoCliChatModel.node.js +431 -0
- package/dist/n8n/nodes/OctoCliChatModel.node.js.map +1 -0
- package/dist/n8n/nodes/OctoCodexCliTool.node.d.ts +13 -0
- package/dist/n8n/nodes/OctoCodexCliTool.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoCodexCliTool.node.js +100 -0
- package/dist/n8n/nodes/OctoCodexCliTool.node.js.map +1 -0
- package/dist/n8n/nodes/OctoGeminiCliTool.node.d.ts +13 -0
- package/dist/n8n/nodes/OctoGeminiCliTool.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoGeminiCliTool.node.js +91 -0
- package/dist/n8n/nodes/OctoGeminiCliTool.node.js.map +1 -0
- package/dist/n8n/nodes/OctoKnowledge.node.d.ts +6 -0
- package/dist/n8n/nodes/OctoKnowledge.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoKnowledge.node.js +95 -0
- package/dist/n8n/nodes/OctoKnowledge.node.js.map +1 -0
- package/dist/n8n/nodes/OctoNotification.node.d.ts +6 -0
- package/dist/n8n/nodes/OctoNotification.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoNotification.node.js +72 -0
- package/dist/n8n/nodes/OctoNotification.node.js.map +1 -0
- package/dist/n8n/nodes/OctoSyncBridge.node.d.ts +6 -0
- package/dist/n8n/nodes/OctoSyncBridge.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoSyncBridge.node.js +60 -0
- package/dist/n8n/nodes/OctoSyncBridge.node.js.map +1 -0
- package/dist/n8n/nodes/n8n-node-types.d.ts +111 -0
- package/dist/n8n/nodes/n8n-node-types.d.ts.map +1 -0
- package/dist/n8n/nodes/n8n-node-types.js +30 -0
- package/dist/n8n/nodes/n8n-node-types.js.map +1 -0
- package/dist/n8n/nodes/octo-cli-chat-model.svg +23 -0
- package/dist/n8n/nodes/package.json +16 -0
- package/dist/n8n/proxy/css-injector.d.ts +3 -0
- package/dist/n8n/proxy/css-injector.d.ts.map +1 -0
- package/dist/n8n/proxy/css-injector.js +62 -0
- package/dist/n8n/proxy/css-injector.js.map +1 -0
- package/dist/n8n/proxy/n8n-proxy.middleware.d.ts +12 -0
- package/dist/n8n/proxy/n8n-proxy.middleware.d.ts.map +1 -0
- package/dist/n8n/proxy/n8n-proxy.middleware.js +131 -0
- package/dist/n8n/proxy/n8n-proxy.middleware.js.map +1 -0
- package/dist/n8n/proxy/n8n-theme.css +45 -0
- package/dist/n8n/sync/n8n-user-sync.service.d.ts +75 -0
- package/dist/n8n/sync/n8n-user-sync.service.d.ts.map +1 -0
- package/dist/n8n/sync/n8n-user-sync.service.js +286 -0
- package/dist/n8n/sync/n8n-user-sync.service.js.map +1 -0
- package/dist/n8n/watcher/n8n-execution-watcher.d.ts +39 -0
- package/dist/n8n/watcher/n8n-execution-watcher.d.ts.map +1 -0
- package/dist/n8n/watcher/n8n-execution-watcher.js +110 -0
- package/dist/n8n/watcher/n8n-execution-watcher.js.map +1 -0
- package/dist/nodes/code.node.d.ts +24 -0
- package/dist/nodes/code.node.d.ts.map +1 -0
- package/dist/nodes/code.node.js +150 -0
- package/dist/nodes/code.node.js.map +1 -0
- package/dist/nodes/error-trigger.node.d.ts +15 -0
- package/dist/nodes/error-trigger.node.d.ts.map +1 -0
- package/dist/nodes/error-trigger.node.js +53 -0
- package/dist/nodes/error-trigger.node.js.map +1 -0
- package/dist/nodes/execute-command.node.d.ts +9 -0
- package/dist/nodes/execute-command.node.d.ts.map +1 -0
- package/dist/nodes/execute-command.node.js +81 -0
- package/dist/nodes/execute-command.node.js.map +1 -0
- package/dist/nodes/filter.node.d.ts +10 -0
- package/dist/nodes/filter.node.d.ts.map +1 -0
- package/dist/nodes/filter.node.js +95 -0
- package/dist/nodes/filter.node.js.map +1 -0
- package/dist/nodes/http-request.node.d.ts +11 -0
- package/dist/nodes/http-request.node.d.ts.map +1 -0
- package/dist/nodes/http-request.node.js +139 -0
- package/dist/nodes/http-request.node.js.map +1 -0
- package/dist/nodes/if.node.d.ts +13 -0
- package/dist/nodes/if.node.d.ts.map +1 -0
- package/dist/nodes/if.node.js +137 -0
- package/dist/nodes/if.node.js.map +1 -0
- package/dist/nodes/index.d.ts +12 -0
- package/dist/nodes/index.d.ts.map +1 -0
- package/dist/nodes/index.js +26 -0
- package/dist/nodes/index.js.map +1 -0
- package/dist/nodes/manual-trigger.node.d.ts +10 -0
- package/dist/nodes/manual-trigger.node.d.ts.map +1 -0
- package/dist/nodes/manual-trigger.node.js +36 -0
- package/dist/nodes/manual-trigger.node.js.map +1 -0
- package/dist/nodes/merge.node.d.ts +15 -0
- package/dist/nodes/merge.node.d.ts.map +1 -0
- package/dist/nodes/merge.node.js +99 -0
- package/dist/nodes/merge.node.js.map +1 -0
- package/dist/nodes/noop.node.d.ts +12 -0
- package/dist/nodes/noop.node.d.ts.map +1 -0
- package/dist/nodes/noop.node.js +32 -0
- package/dist/nodes/noop.node.js.map +1 -0
- package/dist/nodes/placeholder.node.d.ts +10 -0
- package/dist/nodes/placeholder.node.d.ts.map +1 -0
- package/dist/nodes/placeholder.node.js +50 -0
- package/dist/nodes/placeholder.node.js.map +1 -0
- package/dist/nodes/remove-duplicates.node.d.ts +9 -0
- package/dist/nodes/remove-duplicates.node.d.ts.map +1 -0
- package/dist/nodes/remove-duplicates.node.js +68 -0
- package/dist/nodes/remove-duplicates.node.js.map +1 -0
- package/dist/nodes/respond-to-webhook.node.d.ts +14 -0
- package/dist/nodes/respond-to-webhook.node.d.ts.map +1 -0
- package/dist/nodes/respond-to-webhook.node.js +116 -0
- package/dist/nodes/respond-to-webhook.node.js.map +1 -0
- package/dist/nodes/schedule-trigger.node.d.ts +9 -0
- package/dist/nodes/schedule-trigger.node.d.ts.map +1 -0
- package/dist/nodes/schedule-trigger.node.js +67 -0
- package/dist/nodes/schedule-trigger.node.js.map +1 -0
- package/dist/nodes/set.node.d.ts +12 -0
- package/dist/nodes/set.node.d.ts.map +1 -0
- package/dist/nodes/set.node.js +81 -0
- package/dist/nodes/set.node.js.map +1 -0
- package/dist/nodes/sort.node.d.ts +9 -0
- package/dist/nodes/sort.node.d.ts.map +1 -0
- package/dist/nodes/sort.node.js +61 -0
- package/dist/nodes/sort.node.js.map +1 -0
- package/dist/nodes/split-in-batches.node.d.ts +9 -0
- package/dist/nodes/split-in-batches.node.d.ts.map +1 -0
- package/dist/nodes/split-in-batches.node.js +53 -0
- package/dist/nodes/split-in-batches.node.js.map +1 -0
- package/dist/nodes/split-out.node.d.ts +9 -0
- package/dist/nodes/split-out.node.d.ts.map +1 -0
- package/dist/nodes/split-out.node.js +76 -0
- package/dist/nodes/split-out.node.js.map +1 -0
- package/dist/nodes/switch.node.d.ts +16 -0
- package/dist/nodes/switch.node.d.ts.map +1 -0
- package/dist/nodes/switch.node.js +156 -0
- package/dist/nodes/switch.node.js.map +1 -0
- package/dist/nodes/wait.node.d.ts +12 -0
- package/dist/nodes/wait.node.d.ts.map +1 -0
- package/dist/nodes/wait.node.js +81 -0
- package/dist/nodes/wait.node.js.map +1 -0
- package/dist/nodes/webhook.node.d.ts +9 -0
- package/dist/nodes/webhook.node.d.ts.map +1 -0
- package/dist/nodes/webhook.node.js +69 -0
- package/dist/nodes/webhook.node.js.map +1 -0
- package/dist/services/ai-workflow-session.service.d.ts +31 -0
- package/dist/services/ai-workflow-session.service.d.ts.map +1 -0
- package/dist/services/ai-workflow-session.service.js +118 -0
- package/dist/services/ai-workflow-session.service.js.map +1 -0
- package/dist/services/credential.service.d.ts +57 -0
- package/dist/services/credential.service.d.ts.map +1 -0
- package/dist/services/credential.service.js +155 -0
- package/dist/services/credential.service.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +14 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/push.service.d.ts +60 -0
- package/dist/services/push.service.d.ts.map +1 -0
- package/dist/services/push.service.js +121 -0
- package/dist/services/push.service.js.map +1 -0
- package/dist/services/workflow-ai.service.d.ts +61 -0
- package/dist/services/workflow-ai.service.d.ts.map +1 -0
- package/dist/services/workflow-ai.service.js +219 -0
- package/dist/services/workflow-ai.service.js.map +1 -0
- package/dist/services/workflow-context.service.d.ts +32 -0
- package/dist/services/workflow-context.service.d.ts.map +1 -0
- package/dist/services/workflow-context.service.js +155 -0
- package/dist/services/workflow-context.service.js.map +1 -0
- package/dist/services/workflow-engine.service.d.ts +90 -0
- package/dist/services/workflow-engine.service.d.ts.map +1 -0
- package/dist/services/workflow-engine.service.js +305 -0
- package/dist/services/workflow-engine.service.js.map +1 -0
- package/dist/services/workflow.service.d.ts +84 -0
- package/dist/services/workflow.service.d.ts.map +1 -0
- package/dist/services/workflow.service.js +241 -0
- package/dist/services/workflow.service.js.map +1 -0
- package/dist/triggers/cron-trigger.d.ts +39 -0
- package/dist/triggers/cron-trigger.d.ts.map +1 -0
- package/dist/triggers/cron-trigger.js +137 -0
- package/dist/triggers/cron-trigger.js.map +1 -0
- package/dist/triggers/index.d.ts +3 -0
- package/dist/triggers/index.d.ts.map +1 -0
- package/dist/triggers/index.js +8 -0
- package/dist/triggers/index.js.map +1 -0
- package/dist/triggers/webhook-trigger.d.ts +51 -0
- package/dist/triggers/webhook-trigger.d.ts.map +1 -0
- package/dist/triggers/webhook-trigger.js +122 -0
- package/dist/triggers/webhook-trigger.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/node.types.d.ts +313 -0
- package/dist/types/node.types.d.ts.map +1 -0
- package/dist/types/node.types.js +23 -0
- package/dist/types/node.types.js.map +1 -0
- package/dist/types/workflow.types.d.ts +153 -0
- package/dist/types/workflow.types.d.ts.map +1 -0
- package/dist/types/workflow.types.js +44 -0
- package/dist/types/workflow.types.js.map +1 -0
- package/dist/utils/n8n-converter.d.ts +52 -0
- package/dist/utils/n8n-converter.d.ts.map +1 -0
- package/dist/utils/n8n-converter.js +107 -0
- package/dist/utils/n8n-converter.js.map +1 -0
- package/dist/utils/n8n-node-map.d.ts +6 -0
- package/dist/utils/n8n-node-map.d.ts.map +1 -0
- package/dist/utils/n8n-node-map.js +59 -0
- package/dist/utils/n8n-node-map.js.map +1 -0
- package/dist/workflow.module.d.ts +40 -0
- package/dist/workflow.module.d.ts.map +1 -0
- package/dist/workflow.module.js +240 -0
- package/dist/workflow.module.js.map +1 -0
- package/package.json +97 -0
- package/web/components/ChatPanel.tsx +344 -0
- package/web/components/N8nIframe.tsx +119 -0
- package/web/components/SessionPanel.tsx +301 -0
- package/web/components/ToolPanel.tsx +404 -0
- package/web/components/WorkflowDiff.tsx +161 -0
- package/web/components/WorkflowGraph.tsx +158 -0
- package/web/components/WorkflowPreviewPanel.tsx +186 -0
- package/web/hooks/use-n8n-session.ts +46 -0
- package/web/index.ts +29 -0
- package/web/manifest.ts +16 -0
- package/web/messages/en-US.json +94 -0
- package/web/messages/zh-CN.json +94 -0
- package/web/pages/AiDesignPage.tsx +215 -0
- package/web/pages/CredentialsPage.tsx +7 -0
- package/web/pages/ExecutionsPage.tsx +7 -0
- package/web/pages/WorkflowsPage.tsx +7 -0
- package/web/services/workflow-ai-service.ts +173 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket push event types for real-time execution updates.
|
|
3
|
+
*/
|
|
4
|
+
export type PushEventType = 'executionStarted' | 'nodeExecuteBefore' | 'nodeExecuteAfter' | 'executionFinished';
|
|
5
|
+
export interface PushEvent {
|
|
6
|
+
type: PushEventType;
|
|
7
|
+
data: unknown;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Minimal WebSocket interface — compatible with the `ws` library
|
|
11
|
+
* and the native browser WebSocket.
|
|
12
|
+
*/
|
|
13
|
+
export interface IWebSocket {
|
|
14
|
+
send(data: string): void;
|
|
15
|
+
readyState: number;
|
|
16
|
+
close(): void;
|
|
17
|
+
/** ws library uses OPEN = 1 */
|
|
18
|
+
OPEN?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* PushService — manages WebSocket connections and broadcasts
|
|
22
|
+
* real-time execution events to connected clients.
|
|
23
|
+
*
|
|
24
|
+
* Used by WorkflowEngineService to push nodeExecuteBefore/After
|
|
25
|
+
* and executionStarted/Finished events.
|
|
26
|
+
*/
|
|
27
|
+
export declare class PushService {
|
|
28
|
+
private readonly connections;
|
|
29
|
+
private logger;
|
|
30
|
+
/**
|
|
31
|
+
* Register a WebSocket connection for a user.
|
|
32
|
+
* Replaces any existing connection for the same userId.
|
|
33
|
+
*/
|
|
34
|
+
addConnection(userId: string, ws: IWebSocket): void;
|
|
35
|
+
/**
|
|
36
|
+
* Remove a user's WebSocket connection.
|
|
37
|
+
*/
|
|
38
|
+
removeConnection(userId: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* Send a push event to a specific user.
|
|
41
|
+
*/
|
|
42
|
+
sendToUser(userId: string, type: PushEventType, data: unknown): void;
|
|
43
|
+
/**
|
|
44
|
+
* Broadcast a push event to all connected users.
|
|
45
|
+
*/
|
|
46
|
+
broadcast(type: PushEventType, data: unknown): void;
|
|
47
|
+
/**
|
|
48
|
+
* Get the number of active connections.
|
|
49
|
+
*/
|
|
50
|
+
get connectionCount(): number;
|
|
51
|
+
/**
|
|
52
|
+
* Check if a user has an active WebSocket connection.
|
|
53
|
+
*/
|
|
54
|
+
isConnected(userId: string): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Close all connections and clear the map.
|
|
57
|
+
*/
|
|
58
|
+
closeAll(): void;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=push.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.service.d.ts","sourceRoot":"","sources":["../../src/services/push.service.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,kBAAkB,GAClB,mBAAmB,GACnB,kBAAkB,GAClB,mBAAmB,CAAC;AAExB,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,IAAI,IAAI,CAAC;IACd,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID;;;;;;GAMG;AACH,qBACa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAC7D,OAAO,CAAC,MAAM,CAAqD;IAEnE;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,GAAG,IAAI;IAcnD;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKtC;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAiBpE;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAiBnD;;OAEG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAKpC;;OAEG;IACH,QAAQ,IAAI,IAAI;CAWjB"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PushService = void 0;
|
|
10
|
+
const core_1 = require("@octo/core");
|
|
11
|
+
const WS_OPEN = 1;
|
|
12
|
+
/**
|
|
13
|
+
* PushService — manages WebSocket connections and broadcasts
|
|
14
|
+
* real-time execution events to connected clients.
|
|
15
|
+
*
|
|
16
|
+
* Used by WorkflowEngineService to push nodeExecuteBefore/After
|
|
17
|
+
* and executionStarted/Finished events.
|
|
18
|
+
*/
|
|
19
|
+
let PushService = class PushService {
|
|
20
|
+
connections = new Map();
|
|
21
|
+
logger = core_1.Container.get(core_1.LoggerService).child('PushService');
|
|
22
|
+
/**
|
|
23
|
+
* Register a WebSocket connection for a user.
|
|
24
|
+
* Replaces any existing connection for the same userId.
|
|
25
|
+
*/
|
|
26
|
+
addConnection(userId, ws) {
|
|
27
|
+
// Close existing connection if any
|
|
28
|
+
const existing = this.connections.get(userId);
|
|
29
|
+
if (existing) {
|
|
30
|
+
try {
|
|
31
|
+
existing.close();
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// ignore close errors
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
this.connections.set(userId, ws);
|
|
38
|
+
this.logger.debug(`WebSocket connected: user=${userId} (total=${this.connections.size})`);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Remove a user's WebSocket connection.
|
|
42
|
+
*/
|
|
43
|
+
removeConnection(userId) {
|
|
44
|
+
this.connections.delete(userId);
|
|
45
|
+
this.logger.debug(`WebSocket disconnected: user=${userId} (total=${this.connections.size})`);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Send a push event to a specific user.
|
|
49
|
+
*/
|
|
50
|
+
sendToUser(userId, type, data) {
|
|
51
|
+
const ws = this.connections.get(userId);
|
|
52
|
+
if (!ws)
|
|
53
|
+
return;
|
|
54
|
+
if (ws.readyState === WS_OPEN) {
|
|
55
|
+
try {
|
|
56
|
+
ws.send(JSON.stringify({ type, data }));
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
this.logger.warn(`Failed to send push event to user=${userId}: ${err}`);
|
|
60
|
+
this.connections.delete(userId);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// Connection no longer open, clean up
|
|
65
|
+
this.connections.delete(userId);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Broadcast a push event to all connected users.
|
|
70
|
+
*/
|
|
71
|
+
broadcast(type, data) {
|
|
72
|
+
const message = JSON.stringify({ type, data });
|
|
73
|
+
for (const [userId, ws] of this.connections) {
|
|
74
|
+
if (ws.readyState === WS_OPEN) {
|
|
75
|
+
try {
|
|
76
|
+
ws.send(message);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
this.logger.warn(`Failed to broadcast to user=${userId}: ${err}`);
|
|
80
|
+
this.connections.delete(userId);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
this.connections.delete(userId);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get the number of active connections.
|
|
90
|
+
*/
|
|
91
|
+
get connectionCount() {
|
|
92
|
+
return this.connections.size;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check if a user has an active WebSocket connection.
|
|
96
|
+
*/
|
|
97
|
+
isConnected(userId) {
|
|
98
|
+
const ws = this.connections.get(userId);
|
|
99
|
+
return ws !== undefined && ws.readyState === WS_OPEN;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Close all connections and clear the map.
|
|
103
|
+
*/
|
|
104
|
+
closeAll() {
|
|
105
|
+
for (const [, ws] of this.connections) {
|
|
106
|
+
try {
|
|
107
|
+
ws.close();
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// ignore
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
this.connections.clear();
|
|
114
|
+
this.logger.info('All WebSocket connections closed');
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
exports.PushService = PushService;
|
|
118
|
+
exports.PushService = PushService = __decorate([
|
|
119
|
+
(0, core_1.Service)()
|
|
120
|
+
], PushService);
|
|
121
|
+
//# sourceMappingURL=push.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.service.js","sourceRoot":"","sources":["../../src/services/push.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { CliToolName } from '@octo/ai';
|
|
2
|
+
interface ConversationMessage {
|
|
3
|
+
role: 'user' | 'assistant';
|
|
4
|
+
content: string;
|
|
5
|
+
}
|
|
6
|
+
export interface WorkflowDesignRequest {
|
|
7
|
+
/** Natural language description of the desired workflow */
|
|
8
|
+
prompt: string;
|
|
9
|
+
/** Existing workflow JSON to modify (optional) */
|
|
10
|
+
currentWorkflowJson?: string;
|
|
11
|
+
/** Additional context (available nodes, constraints, etc.) */
|
|
12
|
+
context?: string;
|
|
13
|
+
/** Which AI tool to use (default: claude) */
|
|
14
|
+
tool?: CliToolName;
|
|
15
|
+
/** Model override */
|
|
16
|
+
model?: string;
|
|
17
|
+
/** Previous conversation turns for multi-round dialogue */
|
|
18
|
+
conversationHistory?: ConversationMessage[];
|
|
19
|
+
/** Associated session ID for auto-versioning */
|
|
20
|
+
sessionId?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface WorkflowDesignResult {
|
|
23
|
+
/** AI-generated explanation of the workflow */
|
|
24
|
+
explanation: string;
|
|
25
|
+
/** The n8n-compatible workflow JSON */
|
|
26
|
+
workflowJson: Record<string, unknown> | null;
|
|
27
|
+
/** Suggestions for improvement or follow-up */
|
|
28
|
+
suggestions: string[];
|
|
29
|
+
/** Whether the AI successfully generated a workflow */
|
|
30
|
+
success: boolean;
|
|
31
|
+
/** Error message if generation failed */
|
|
32
|
+
error?: string;
|
|
33
|
+
/** Execution duration in ms */
|
|
34
|
+
durationMs: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* WorkflowAiService — uses AI CLI tools to generate n8n workflow JSON
|
|
38
|
+
* from natural language descriptions.
|
|
39
|
+
*/
|
|
40
|
+
export declare class WorkflowAiService {
|
|
41
|
+
private readonly logger;
|
|
42
|
+
/** Default system prompt, used as fallback when database config is unavailable */
|
|
43
|
+
static readonly DEFAULT_SYSTEM_PROMPT = "You are an n8n workflow designer. Your task is to generate n8n workflow JSON based on user requirements.\n\n## Output Format\nYou MUST respond with a JSON object containing exactly these fields:\n{\n \"explanation\": \"A brief explanation of what the workflow does\",\n \"workflow\": { ... }, // n8n workflow JSON\n \"suggestions\": [\"suggestion 1\", \"suggestion 2\"]\n}\n\n## n8n Workflow JSON Structure\nA valid n8n workflow JSON has this structure:\n{\n \"name\": \"Workflow Name\",\n \"nodes\": [\n {\n \"parameters\": { ... },\n \"name\": \"Node Name\",\n \"type\": \"n8n-nodes-base.httpRequest\",\n \"typeVersion\": 1,\n \"position\": [x, y]\n }\n ],\n \"connections\": {\n \"Source Node Name\": {\n \"main\": [[{ \"node\": \"Target Node Name\", \"type\": \"main\", \"index\": 0 }]]\n }\n }\n}\n\n## Common n8n Node Types\n- n8n-nodes-base.manualTrigger \u2014 Manual execution trigger\n- n8n-nodes-base.scheduleTrigger \u2014 Cron/schedule trigger\n- n8n-nodes-base.webhook \u2014 Webhook trigger\n- n8n-nodes-base.httpRequest \u2014 Make HTTP requests\n- n8n-nodes-base.if \u2014 Conditional branching\n- n8n-nodes-base.code \u2014 Custom JavaScript/Python code\n- n8n-nodes-base.set \u2014 Set/transform data\n- n8n-nodes-base.merge \u2014 Merge multiple inputs\n- n8n-nodes-base.switch \u2014 Multi-way branching\n- n8n-nodes-base.noOp \u2014 No operation (pass-through)\n- n8n-nodes-base.wait \u2014 Wait/delay\n- @n8n/n8n-nodes-langchain.agent \u2014 AI Agent node\n- @n8n/n8n-nodes-langchain.chainLlm \u2014 LLM Chain node\n\n## Rules\n1. Always include a trigger node (manualTrigger if no specific trigger is needed)\n2. Node positions should be spaced at least 250px apart horizontally\n3. Use descriptive node names\n4. Include error handling where appropriate\n5. The workflow field must be valid n8n workflow JSON that can be imported directly";
|
|
44
|
+
/**
|
|
45
|
+
* Load the system prompt from system_configs table, falling back to the
|
|
46
|
+
* hardcoded default if the database read fails or returns null.
|
|
47
|
+
*/
|
|
48
|
+
getSystemPrompt(): Promise<string>;
|
|
49
|
+
/**
|
|
50
|
+
* Generate or modify an n8n workflow based on a natural language prompt.
|
|
51
|
+
*/
|
|
52
|
+
design(request: WorkflowDesignRequest): Promise<WorkflowDesignResult>;
|
|
53
|
+
private parseAiResponse;
|
|
54
|
+
/**
|
|
55
|
+
* Extract JSON object from AI output that may contain markdown fences
|
|
56
|
+
* or other text wrapping.
|
|
57
|
+
*/
|
|
58
|
+
private extractJson;
|
|
59
|
+
}
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=workflow-ai.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-ai.service.d.ts","sourceRoot":"","sources":["../../src/services/workflow-ai.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAK5C,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,mBAAmB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC5C,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7C,+CAA+C;IAC/C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBACa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoD;IAE3E,kFAAkF;IAClF,MAAM,CAAC,QAAQ,CAAC,qBAAqB,g4DAkD8C;IAEnF;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAkBxC;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAuE3E,OAAO,CAAC,eAAe;IAyCvB;;;OAGG;IACH,OAAO,CAAC,WAAW;CAsBpB"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var WorkflowAiService_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.WorkflowAiService = void 0;
|
|
11
|
+
const core_1 = require("@octo/core");
|
|
12
|
+
const ai_1 = require("@octo/ai");
|
|
13
|
+
/** SystemConfig key for the AI workflow designer system prompt */
|
|
14
|
+
const SYSTEM_PROMPT_CONFIG_KEY = 'workflow.ai.systemPrompt';
|
|
15
|
+
/**
|
|
16
|
+
* WorkflowAiService — uses AI CLI tools to generate n8n workflow JSON
|
|
17
|
+
* from natural language descriptions.
|
|
18
|
+
*/
|
|
19
|
+
let WorkflowAiService = class WorkflowAiService {
|
|
20
|
+
static { WorkflowAiService_1 = this; }
|
|
21
|
+
logger = core_1.Container.get(core_1.LoggerService).child('WorkflowAI');
|
|
22
|
+
/** Default system prompt, used as fallback when database config is unavailable */
|
|
23
|
+
static DEFAULT_SYSTEM_PROMPT = `You are an n8n workflow designer. Your task is to generate n8n workflow JSON based on user requirements.
|
|
24
|
+
|
|
25
|
+
## Output Format
|
|
26
|
+
You MUST respond with a JSON object containing exactly these fields:
|
|
27
|
+
{
|
|
28
|
+
"explanation": "A brief explanation of what the workflow does",
|
|
29
|
+
"workflow": { ... }, // n8n workflow JSON
|
|
30
|
+
"suggestions": ["suggestion 1", "suggestion 2"]
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
## n8n Workflow JSON Structure
|
|
34
|
+
A valid n8n workflow JSON has this structure:
|
|
35
|
+
{
|
|
36
|
+
"name": "Workflow Name",
|
|
37
|
+
"nodes": [
|
|
38
|
+
{
|
|
39
|
+
"parameters": { ... },
|
|
40
|
+
"name": "Node Name",
|
|
41
|
+
"type": "n8n-nodes-base.httpRequest",
|
|
42
|
+
"typeVersion": 1,
|
|
43
|
+
"position": [x, y]
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
"connections": {
|
|
47
|
+
"Source Node Name": {
|
|
48
|
+
"main": [[{ "node": "Target Node Name", "type": "main", "index": 0 }]]
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
## Common n8n Node Types
|
|
54
|
+
- n8n-nodes-base.manualTrigger — Manual execution trigger
|
|
55
|
+
- n8n-nodes-base.scheduleTrigger — Cron/schedule trigger
|
|
56
|
+
- n8n-nodes-base.webhook — Webhook trigger
|
|
57
|
+
- n8n-nodes-base.httpRequest — Make HTTP requests
|
|
58
|
+
- n8n-nodes-base.if — Conditional branching
|
|
59
|
+
- n8n-nodes-base.code — Custom JavaScript/Python code
|
|
60
|
+
- n8n-nodes-base.set — Set/transform data
|
|
61
|
+
- n8n-nodes-base.merge — Merge multiple inputs
|
|
62
|
+
- n8n-nodes-base.switch — Multi-way branching
|
|
63
|
+
- n8n-nodes-base.noOp — No operation (pass-through)
|
|
64
|
+
- n8n-nodes-base.wait — Wait/delay
|
|
65
|
+
- @n8n/n8n-nodes-langchain.agent — AI Agent node
|
|
66
|
+
- @n8n/n8n-nodes-langchain.chainLlm — LLM Chain node
|
|
67
|
+
|
|
68
|
+
## Rules
|
|
69
|
+
1. Always include a trigger node (manualTrigger if no specific trigger is needed)
|
|
70
|
+
2. Node positions should be spaced at least 250px apart horizontally
|
|
71
|
+
3. Use descriptive node names
|
|
72
|
+
4. Include error handling where appropriate
|
|
73
|
+
5. The workflow field must be valid n8n workflow JSON that can be imported directly`;
|
|
74
|
+
/**
|
|
75
|
+
* Load the system prompt from system_configs table, falling back to the
|
|
76
|
+
* hardcoded default if the database read fails or returns null.
|
|
77
|
+
*/
|
|
78
|
+
async getSystemPrompt() {
|
|
79
|
+
try {
|
|
80
|
+
const db = core_1.Container.get(core_1.DatabaseService);
|
|
81
|
+
const ds = db.getDataSource();
|
|
82
|
+
const rows = await ds.query('SELECT value FROM system_configs WHERE key = ?', [SYSTEM_PROMPT_CONFIG_KEY]);
|
|
83
|
+
if (rows.length > 0 && rows[0].value) {
|
|
84
|
+
return rows[0].value;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
this.logger.warn(`Failed to load system prompt from DB, using default: ${err}`);
|
|
89
|
+
}
|
|
90
|
+
return WorkflowAiService_1.DEFAULT_SYSTEM_PROMPT;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Generate or modify an n8n workflow based on a natural language prompt.
|
|
94
|
+
*/
|
|
95
|
+
async design(request) {
|
|
96
|
+
const executor = core_1.Container.get(ai_1.CliExecutorService);
|
|
97
|
+
const tool = request.tool ?? 'claude';
|
|
98
|
+
// Load system prompt from database (falls back to hardcoded default)
|
|
99
|
+
const systemPrompt = await this.getSystemPrompt();
|
|
100
|
+
// Build the full prompt
|
|
101
|
+
const parts = [systemPrompt];
|
|
102
|
+
if (request.currentWorkflowJson) {
|
|
103
|
+
parts.push('\n## Current Workflow (modify this)\n```json\n' +
|
|
104
|
+
request.currentWorkflowJson +
|
|
105
|
+
'\n```');
|
|
106
|
+
}
|
|
107
|
+
if (request.context) {
|
|
108
|
+
parts.push(`\n## Additional Context\n${request.context}`);
|
|
109
|
+
}
|
|
110
|
+
// Include conversation history for multi-round dialogue
|
|
111
|
+
if (request.conversationHistory?.length) {
|
|
112
|
+
parts.push('\n## Conversation History');
|
|
113
|
+
for (const msg of request.conversationHistory) {
|
|
114
|
+
const label = msg.role === 'user' ? 'User' : 'Assistant';
|
|
115
|
+
parts.push(`\n### ${label}\n${msg.content}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
parts.push(`\n## User Request\n${request.prompt}`);
|
|
119
|
+
parts.push('\nRespond with ONLY the JSON object. No markdown fences, no extra text.');
|
|
120
|
+
const fullPrompt = parts.join('\n');
|
|
121
|
+
try {
|
|
122
|
+
const result = await executor.execute({
|
|
123
|
+
tool,
|
|
124
|
+
prompt: fullPrompt,
|
|
125
|
+
model: request.model,
|
|
126
|
+
timeoutMs: 120_000,
|
|
127
|
+
jsonOutput: true,
|
|
128
|
+
});
|
|
129
|
+
if (!result.success) {
|
|
130
|
+
return {
|
|
131
|
+
explanation: '',
|
|
132
|
+
workflowJson: null,
|
|
133
|
+
suggestions: [],
|
|
134
|
+
success: false,
|
|
135
|
+
error: result.error ?? `AI CLI execution failed (exit code ${result.exitCode})`,
|
|
136
|
+
durationMs: result.durationMs,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return this.parseAiResponse(result.output, result.durationMs);
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
143
|
+
this.logger.error(`Workflow AI design failed: ${errorMsg}`);
|
|
144
|
+
return {
|
|
145
|
+
explanation: '',
|
|
146
|
+
workflowJson: null,
|
|
147
|
+
suggestions: [],
|
|
148
|
+
success: false,
|
|
149
|
+
error: errorMsg,
|
|
150
|
+
durationMs: 0,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
parseAiResponse(output, durationMs) {
|
|
155
|
+
// Try to extract JSON from the output
|
|
156
|
+
const jsonStr = this.extractJson(output);
|
|
157
|
+
if (!jsonStr) {
|
|
158
|
+
return {
|
|
159
|
+
explanation: output,
|
|
160
|
+
workflowJson: null,
|
|
161
|
+
suggestions: [],
|
|
162
|
+
success: false,
|
|
163
|
+
error: 'AI response did not contain valid JSON',
|
|
164
|
+
durationMs,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
const parsed = JSON.parse(jsonStr);
|
|
169
|
+
const explanation = parsed.explanation ?? '';
|
|
170
|
+
const workflow = parsed.workflow ?? null;
|
|
171
|
+
const suggestions = parsed.suggestions ?? [];
|
|
172
|
+
return {
|
|
173
|
+
explanation,
|
|
174
|
+
workflowJson: workflow,
|
|
175
|
+
suggestions: Array.isArray(suggestions) ? suggestions : [],
|
|
176
|
+
success: workflow !== null,
|
|
177
|
+
durationMs,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return {
|
|
182
|
+
explanation: output,
|
|
183
|
+
workflowJson: null,
|
|
184
|
+
suggestions: [],
|
|
185
|
+
success: false,
|
|
186
|
+
error: 'Failed to parse AI response JSON',
|
|
187
|
+
durationMs,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Extract JSON object from AI output that may contain markdown fences
|
|
193
|
+
* or other text wrapping.
|
|
194
|
+
*/
|
|
195
|
+
extractJson(text) {
|
|
196
|
+
// Try direct parse first
|
|
197
|
+
const trimmed = text.trim();
|
|
198
|
+
if (trimmed.startsWith('{')) {
|
|
199
|
+
return trimmed;
|
|
200
|
+
}
|
|
201
|
+
// Try to extract from markdown code block
|
|
202
|
+
const jsonBlockMatch = trimmed.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);
|
|
203
|
+
if (jsonBlockMatch?.[1]) {
|
|
204
|
+
return jsonBlockMatch[1].trim();
|
|
205
|
+
}
|
|
206
|
+
// Try to find the first { ... } block
|
|
207
|
+
const firstBrace = trimmed.indexOf('{');
|
|
208
|
+
const lastBrace = trimmed.lastIndexOf('}');
|
|
209
|
+
if (firstBrace !== -1 && lastBrace > firstBrace) {
|
|
210
|
+
return trimmed.slice(firstBrace, lastBrace + 1);
|
|
211
|
+
}
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
exports.WorkflowAiService = WorkflowAiService;
|
|
216
|
+
exports.WorkflowAiService = WorkflowAiService = WorkflowAiService_1 = __decorate([
|
|
217
|
+
(0, core_1.Service)()
|
|
218
|
+
], WorkflowAiService);
|
|
219
|
+
//# sourceMappingURL=workflow-ai.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-ai.service.js","sourceRoot":"","sources":["../../src/services/workflow-ai.service.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,qCAAgF;AAChF,iCAA8C;AAG9C,kEAAkE;AAClE,MAAM,wBAAwB,GAAG,0BAA0B,CAAC;AAuC5D;;;GAGG;AAEI,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;;IACX,MAAM,GAAG,gBAAS,CAAC,GAAG,CAAC,oBAAa,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAE3E,kFAAkF;IAClF,MAAM,CAAU,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oFAkD0C,CAAC;IAEnF;;;OAGG;IACH,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,gBAAS,CAAC,GAAG,CAAC,sBAAe,CAAC,CAAC;YAC1C,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CACzB,gDAAgD,EAChD,CAAC,wBAAwB,CAAC,CACC,CAAC;YAE9B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;gBACrC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wDAAwD,GAAG,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,mBAAiB,CAAC,qBAAqB,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,OAA8B;QACzC,MAAM,QAAQ,GAAG,gBAAS,CAAC,GAAG,CAAC,uBAAkB,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC;QAEtC,qEAAqE;QACrE,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAElD,wBAAwB;QACxB,MAAM,KAAK,GAAa,CAAC,YAAY,CAAC,CAAC;QAEvC,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CACR,gDAAgD;gBAChD,OAAO,CAAC,mBAAmB;gBAC3B,OAAO,CACR,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,4BAA4B,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,wDAAwD;QACxD,IAAI,OAAO,CAAC,mBAAmB,EAAE,MAAM,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YACxC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;gBAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;gBACzD,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,sBAAsB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;QAEtF,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;gBACpC,IAAI;gBACJ,MAAM,EAAE,UAAU;gBAClB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,SAAS,EAAE,OAAO;gBAClB,UAAU,EAAE,IAAI;aACjB,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO;oBACL,WAAW,EAAE,EAAE;oBACf,YAAY,EAAE,IAAI;oBAClB,WAAW,EAAE,EAAE;oBACf,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,sCAAsC,MAAM,CAAC,QAAQ,GAAG;oBAC/E,UAAU,EAAE,MAAM,CAAC,UAAU;iBAC9B,CAAC;YACJ,CAAC;YAED,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;YAC5D,OAAO;gBACL,WAAW,EAAE,EAAE;gBACf,YAAY,EAAE,IAAI;gBAClB,WAAW,EAAE,EAAE;gBACf,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,QAAQ;gBACf,UAAU,EAAE,CAAC;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,MAAc,EAAE,UAAkB;QACxD,sCAAsC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAEzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,WAAW,EAAE,MAAM;gBACnB,YAAY,EAAE,IAAI;gBAClB,WAAW,EAAE,EAAE;gBACf,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,wCAAwC;gBAC/C,UAAU;aACX,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;YAE9D,MAAM,WAAW,GAAI,MAAM,CAAC,WAAsB,IAAI,EAAE,CAAC;YACzD,MAAM,QAAQ,GAAI,MAAM,CAAC,QAAoC,IAAI,IAAI,CAAC;YACtE,MAAM,WAAW,GAAI,MAAM,CAAC,WAAwB,IAAI,EAAE,CAAC;YAE3D,OAAO;gBACL,WAAW;gBACX,YAAY,EAAE,QAAQ;gBACtB,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;gBAC1D,OAAO,EAAE,QAAQ,KAAK,IAAI;gBAC1B,UAAU;aACX,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,WAAW,EAAE,MAAM;gBACnB,YAAY,EAAE,IAAI;gBAClB,WAAW,EAAE,EAAE;gBACf,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,kCAAkC;gBACzC,UAAU;aACX,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,WAAW,CAAC,IAAY;QAC9B,yBAAyB;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,0CAA0C;QAC1C,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC3E,IAAI,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,CAAC;QAED,sCAAsC;QACtC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC;YAChD,OAAO,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;;AA1NU,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,cAAO,GAAE;GACG,iBAAiB,CA2N7B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface ApiDocModule {
|
|
2
|
+
moduleId: string;
|
|
3
|
+
moduleName: string;
|
|
4
|
+
docPath: string;
|
|
5
|
+
contentLength: number;
|
|
6
|
+
}
|
|
7
|
+
export interface AiToolInfo {
|
|
8
|
+
name: string;
|
|
9
|
+
displayName: string;
|
|
10
|
+
isAvailable: boolean;
|
|
11
|
+
models: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface N8nWorkflowSummary {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
active: boolean;
|
|
17
|
+
createdAt: string;
|
|
18
|
+
updatedAt: string;
|
|
19
|
+
}
|
|
20
|
+
export declare class WorkflowContextService {
|
|
21
|
+
private readonly logger;
|
|
22
|
+
private readonly packagesDir;
|
|
23
|
+
listAiTools(): Promise<AiToolInfo[]>;
|
|
24
|
+
listApiDocs(): Promise<ApiDocModule[]>;
|
|
25
|
+
getApiDocContent(moduleId: string): Promise<string>;
|
|
26
|
+
listN8nWorkflows(): Promise<N8nWorkflowSummary[]>;
|
|
27
|
+
getN8nWorkflow(workflowId: string): Promise<Record<string, unknown>>;
|
|
28
|
+
updateN8nWorkflow(workflowId: string, workflowJson: string): Promise<void>;
|
|
29
|
+
private getN8nApiUrl;
|
|
30
|
+
private getN8nHeaders;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=workflow-context.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-context.service.d.ts","sourceRoot":"","sources":["../../src/services/workflow-context.service.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBACa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyD;IAChF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAG1B;IAEI,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAkBpC,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAmCtC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAenD,gBAAgB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA+BjD,cAAc,CAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAiB7B,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IAuChB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,aAAa;CAatB"}
|