@marktoflow/gui 2.0.0-alpha.1
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/.turbo/turbo-build.log +26 -0
- package/.turbo/turbo-test.log +22 -0
- package/README.md +179 -0
- package/dist/client/assets/index-DwTI8opO.js +608 -0
- package/dist/client/assets/index-DwTI8opO.js.map +1 -0
- package/dist/client/assets/index-RoEdL6gO.css +1 -0
- package/dist/client/index.html +20 -0
- package/dist/client/vite.svg +9 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +56 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes/ai.js +50 -0
- package/dist/server/routes/ai.js.map +1 -0
- package/dist/server/routes/execute.js +62 -0
- package/dist/server/routes/execute.js.map +1 -0
- package/dist/server/routes/workflows.js +99 -0
- package/dist/server/routes/workflows.js.map +1 -0
- package/dist/server/server/index.js +95 -0
- package/dist/server/server/index.js.map +1 -0
- package/dist/server/server/routes/ai.js +87 -0
- package/dist/server/server/routes/ai.js.map +1 -0
- package/dist/server/server/routes/execute.js +63 -0
- package/dist/server/server/routes/execute.js.map +1 -0
- package/dist/server/server/routes/tools.js +518 -0
- package/dist/server/server/routes/tools.js.map +1 -0
- package/dist/server/server/routes/workflows.js +99 -0
- package/dist/server/server/routes/workflows.js.map +1 -0
- package/dist/server/server/services/AIService.js +69 -0
- package/dist/server/server/services/AIService.js.map +1 -0
- package/dist/server/server/services/FileWatcher.js +60 -0
- package/dist/server/server/services/FileWatcher.js.map +1 -0
- package/dist/server/server/services/WorkflowService.js +363 -0
- package/dist/server/server/services/WorkflowService.js.map +1 -0
- package/dist/server/server/services/agents/claude-code-provider.js +250 -0
- package/dist/server/server/services/agents/claude-code-provider.js.map +1 -0
- package/dist/server/server/services/agents/claude-provider.js +204 -0
- package/dist/server/server/services/agents/claude-provider.js.map +1 -0
- package/dist/server/server/services/agents/copilot-provider.js +227 -0
- package/dist/server/server/services/agents/copilot-provider.js.map +1 -0
- package/dist/server/server/services/agents/demo-provider.js +167 -0
- package/dist/server/server/services/agents/demo-provider.js.map +1 -0
- package/dist/server/server/services/agents/index.js +31 -0
- package/dist/server/server/services/agents/index.js.map +1 -0
- package/dist/server/server/services/agents/ollama-provider.js +220 -0
- package/dist/server/server/services/agents/ollama-provider.js.map +1 -0
- package/dist/server/server/services/agents/prompts.js +436 -0
- package/dist/server/server/services/agents/prompts.js.map +1 -0
- package/dist/server/server/services/agents/registry.js +242 -0
- package/dist/server/server/services/agents/registry.js.map +1 -0
- package/dist/server/server/services/agents/types.js +6 -0
- package/dist/server/server/services/agents/types.js.map +1 -0
- package/dist/server/server/websocket/index.js +85 -0
- package/dist/server/server/websocket/index.js.map +1 -0
- package/dist/server/services/AIService.d.ts +30 -0
- package/dist/server/services/AIService.d.ts.map +1 -0
- package/dist/server/services/AIService.js +216 -0
- package/dist/server/services/AIService.js.map +1 -0
- package/dist/server/services/FileWatcher.d.ts +10 -0
- package/dist/server/services/FileWatcher.d.ts.map +1 -0
- package/dist/server/services/FileWatcher.js +62 -0
- package/dist/server/services/FileWatcher.js.map +1 -0
- package/dist/server/services/WorkflowService.d.ts +54 -0
- package/dist/server/services/WorkflowService.d.ts.map +1 -0
- package/dist/server/services/WorkflowService.js +323 -0
- package/dist/server/services/WorkflowService.js.map +1 -0
- package/dist/server/shared/constants.js +175 -0
- package/dist/server/shared/constants.js.map +1 -0
- package/dist/server/shared/types.js +3 -0
- package/dist/server/shared/types.js.map +1 -0
- package/dist/server/websocket/index.d.ts +10 -0
- package/dist/server/websocket/index.d.ts.map +1 -0
- package/dist/server/websocket/index.js +85 -0
- package/dist/server/websocket/index.js.map +1 -0
- package/index.html +19 -0
- package/package.json +96 -0
- package/playwright.config.ts +27 -0
- package/postcss.config.js +6 -0
- package/public/vite.svg +9 -0
- package/src/client/App.tsx +520 -0
- package/src/client/components/Canvas/Canvas.tsx +405 -0
- package/src/client/components/Canvas/ExecutionOverlay.tsx +847 -0
- package/src/client/components/Canvas/NodeContextMenu.tsx +188 -0
- package/src/client/components/Canvas/OutputNode.tsx +111 -0
- package/src/client/components/Canvas/StepNode.tsx +106 -0
- package/src/client/components/Canvas/SubWorkflowNode.tsx +141 -0
- package/src/client/components/Canvas/Toolbar.tsx +189 -0
- package/src/client/components/Canvas/TriggerNode.tsx +128 -0
- package/src/client/components/Editor/InputsEditor.tsx +458 -0
- package/src/client/components/Editor/NewStepWizard.tsx +344 -0
- package/src/client/components/Editor/StepEditor.tsx +532 -0
- package/src/client/components/Editor/YamlEditor.tsx +160 -0
- package/src/client/components/Panels/PropertiesPanel.tsx +589 -0
- package/src/client/components/Prompt/ChangePreview.tsx +281 -0
- package/src/client/components/Prompt/PromptHistoryPanel.tsx +209 -0
- package/src/client/components/Prompt/PromptInput.tsx +108 -0
- package/src/client/components/Sidebar/Sidebar.tsx +343 -0
- package/src/client/components/common/Breadcrumb.tsx +40 -0
- package/src/client/components/common/Button.tsx +68 -0
- package/src/client/components/common/ContextMenu.tsx +202 -0
- package/src/client/components/common/KeyboardShortcuts.tsx +143 -0
- package/src/client/components/common/Modal.tsx +93 -0
- package/src/client/components/common/Tabs.tsx +57 -0
- package/src/client/components/common/ThemeToggle.tsx +63 -0
- package/src/client/components/index.ts +32 -0
- package/src/client/hooks/index.ts +4 -0
- package/src/client/hooks/useAIPrompt.ts +108 -0
- package/src/client/hooks/useCanvas.ts +247 -0
- package/src/client/hooks/useWebSocket.ts +164 -0
- package/src/client/hooks/useWorkflow.ts +138 -0
- package/src/client/main.tsx +10 -0
- package/src/client/stores/canvasStore.ts +348 -0
- package/src/client/stores/editorStore.ts +133 -0
- package/src/client/stores/executionStore.ts +440 -0
- package/src/client/stores/index.ts +4 -0
- package/src/client/stores/layoutStore.ts +103 -0
- package/src/client/stores/navigationStore.ts +49 -0
- package/src/client/stores/promptStore.ts +113 -0
- package/src/client/stores/themeStore.ts +75 -0
- package/src/client/stores/workflowStore.ts +177 -0
- package/src/client/styles/globals.css +346 -0
- package/src/client/utils/cn.ts +9 -0
- package/src/client/utils/index.ts +4 -0
- package/src/client/utils/serviceIcons.tsx +64 -0
- package/src/client/utils/stepValidation.ts +155 -0
- package/src/client/utils/workflowToGraph.ts +299 -0
- package/src/server/index.ts +114 -0
- package/src/server/routes/ai.ts +91 -0
- package/src/server/routes/execute.ts +71 -0
- package/src/server/routes/tools.ts +564 -0
- package/src/server/routes/workflows.ts +106 -0
- package/src/server/services/AIService.ts +105 -0
- package/src/server/services/FileWatcher.ts +69 -0
- package/src/server/services/WorkflowService.ts +441 -0
- package/src/server/services/agents/claude-code-provider.ts +320 -0
- package/src/server/services/agents/claude-provider.ts +248 -0
- package/src/server/services/agents/copilot-provider.ts +311 -0
- package/src/server/services/agents/demo-provider.ts +184 -0
- package/src/server/services/agents/index.ts +31 -0
- package/src/server/services/agents/ollama-provider.ts +267 -0
- package/src/server/services/agents/prompts.ts +482 -0
- package/src/server/services/agents/registry.ts +289 -0
- package/src/server/services/agents/types.ts +146 -0
- package/src/server/websocket/index.ts +104 -0
- package/src/shared/constants.ts +180 -0
- package/src/shared/types.ts +179 -0
- package/tailwind.config.ts +73 -0
- package/tests/e2e/app.spec.ts +90 -0
- package/tests/e2e/canvas.spec.ts +128 -0
- package/tests/e2e/workflow.spec.ts +185 -0
- package/tests/integration/api.test.ts +250 -0
- package/tests/integration/testApp.ts +31 -0
- package/tests/setup.ts +37 -0
- package/tests/unit/canvasStore.test.ts +502 -0
- package/tests/unit/components.test.tsx +151 -0
- package/tests/unit/executionStore.test.ts +527 -0
- package/tests/unit/layoutStore.test.ts +194 -0
- package/tests/unit/navigationStore.test.ts +152 -0
- package/tests/unit/stepValidation.test.ts +226 -0
- package/tests/unit/themeStore.test.ts +141 -0
- package/tests/unit/workflowToGraph.test.ts +289 -0
- package/tsconfig.json +29 -0
- package/tsconfig.server.json +28 -0
- package/vite.config.ts +31 -0
- package/vitest.config.ts +26 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Provider Registry
|
|
3
|
+
* Manages all available AI agent providers and provides a unified interface
|
|
4
|
+
*/
|
|
5
|
+
import { createClaudeProvider } from './claude-provider.js';
|
|
6
|
+
import { createClaudeCodeProvider } from './claude-code-provider.js';
|
|
7
|
+
import { createCopilotProvider } from './copilot-provider.js';
|
|
8
|
+
import { createDemoProvider } from './demo-provider.js';
|
|
9
|
+
import { createOllamaProvider } from './ollama-provider.js';
|
|
10
|
+
/**
|
|
11
|
+
* Registry of all available agent providers
|
|
12
|
+
*/
|
|
13
|
+
export class AgentRegistry {
|
|
14
|
+
providers = new Map();
|
|
15
|
+
activeProviderId = 'demo';
|
|
16
|
+
history = [];
|
|
17
|
+
constructor() {
|
|
18
|
+
// Register built-in providers
|
|
19
|
+
// SDK-based providers with automatic CLI authentication (recommended)
|
|
20
|
+
this.registerProvider({
|
|
21
|
+
id: 'claude-code',
|
|
22
|
+
name: 'Claude Code (SDK)',
|
|
23
|
+
factory: createClaudeCodeProvider,
|
|
24
|
+
});
|
|
25
|
+
this.registerProvider({
|
|
26
|
+
id: 'copilot',
|
|
27
|
+
name: 'GitHub Copilot (SDK)',
|
|
28
|
+
factory: createCopilotProvider,
|
|
29
|
+
});
|
|
30
|
+
// API key-based providers
|
|
31
|
+
this.registerProvider({
|
|
32
|
+
id: 'claude',
|
|
33
|
+
name: 'Claude (API Key)',
|
|
34
|
+
factory: createClaudeProvider,
|
|
35
|
+
});
|
|
36
|
+
// Local providers
|
|
37
|
+
this.registerProvider({
|
|
38
|
+
id: 'ollama',
|
|
39
|
+
name: 'Ollama (Local)',
|
|
40
|
+
factory: createOllamaProvider,
|
|
41
|
+
});
|
|
42
|
+
// Demo mode (always available)
|
|
43
|
+
this.registerProvider({
|
|
44
|
+
id: 'demo',
|
|
45
|
+
name: 'Demo Mode',
|
|
46
|
+
factory: createDemoProvider,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Register a new provider
|
|
51
|
+
*/
|
|
52
|
+
registerProvider(entry) {
|
|
53
|
+
const provider = entry.factory(entry.defaultConfig);
|
|
54
|
+
this.providers.set(entry.id, provider);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get all registered providers
|
|
58
|
+
*/
|
|
59
|
+
getProviders() {
|
|
60
|
+
return Array.from(this.providers.entries()).map(([id, provider]) => ({
|
|
61
|
+
id,
|
|
62
|
+
name: provider.name,
|
|
63
|
+
ready: provider.isReady(),
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get a specific provider
|
|
68
|
+
*/
|
|
69
|
+
getProvider(id) {
|
|
70
|
+
return this.providers.get(id);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get the active provider
|
|
74
|
+
*/
|
|
75
|
+
getActiveProvider() {
|
|
76
|
+
return this.providers.get(this.activeProviderId) || this.providers.get('demo');
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Set the active provider
|
|
80
|
+
*/
|
|
81
|
+
async setActiveProvider(id, config) {
|
|
82
|
+
const provider = this.providers.get(id);
|
|
83
|
+
if (!provider) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
if (config) {
|
|
87
|
+
await provider.initialize(config);
|
|
88
|
+
}
|
|
89
|
+
if (provider.isReady()) {
|
|
90
|
+
this.activeProviderId = id;
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get the active provider ID
|
|
97
|
+
*/
|
|
98
|
+
getActiveProviderId() {
|
|
99
|
+
return this.activeProviderId;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Auto-detect and set the best available provider
|
|
103
|
+
* Priority: SDK-based (auto-auth) > API key-based > Local > Demo
|
|
104
|
+
*/
|
|
105
|
+
async autoDetectProvider() {
|
|
106
|
+
// Try Claude Code SDK first (uses automatic CLI authentication)
|
|
107
|
+
const claudeCodeProvider = this.providers.get('claude-code');
|
|
108
|
+
if (claudeCodeProvider) {
|
|
109
|
+
await claudeCodeProvider.initialize({
|
|
110
|
+
options: {
|
|
111
|
+
cwd: process.cwd(),
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
if (claudeCodeProvider.isReady()) {
|
|
115
|
+
this.activeProviderId = 'claude-code';
|
|
116
|
+
return 'claude-code';
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Try GitHub Copilot SDK (uses automatic CLI authentication)
|
|
120
|
+
const copilotProvider = this.providers.get('copilot');
|
|
121
|
+
if (copilotProvider) {
|
|
122
|
+
await copilotProvider.initialize({
|
|
123
|
+
baseUrl: process.env.COPILOT_CLI_URL,
|
|
124
|
+
options: {
|
|
125
|
+
cliPath: process.env.COPILOT_CLI_PATH,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
if (copilotProvider.isReady()) {
|
|
129
|
+
this.activeProviderId = 'copilot';
|
|
130
|
+
return 'copilot';
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Try Claude with API key (requires ANTHROPIC_API_KEY)
|
|
134
|
+
const claudeProvider = this.providers.get('claude');
|
|
135
|
+
if (claudeProvider) {
|
|
136
|
+
await claudeProvider.initialize({
|
|
137
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
138
|
+
});
|
|
139
|
+
if (claudeProvider.isReady()) {
|
|
140
|
+
this.activeProviderId = 'claude';
|
|
141
|
+
return 'claude';
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Try Ollama (if running locally)
|
|
145
|
+
const ollamaProvider = this.providers.get('ollama');
|
|
146
|
+
if (ollamaProvider) {
|
|
147
|
+
await ollamaProvider.initialize({
|
|
148
|
+
baseUrl: process.env.OLLAMA_BASE_URL || 'http://localhost:11434',
|
|
149
|
+
});
|
|
150
|
+
if (ollamaProvider.isReady()) {
|
|
151
|
+
this.activeProviderId = 'ollama';
|
|
152
|
+
return 'ollama';
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Fall back to demo mode
|
|
156
|
+
this.activeProviderId = 'demo';
|
|
157
|
+
return 'demo';
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Process a prompt using the active provider
|
|
161
|
+
*/
|
|
162
|
+
async processPrompt(prompt, workflow) {
|
|
163
|
+
const provider = this.getActiveProvider();
|
|
164
|
+
const result = await provider.processPrompt(prompt, workflow);
|
|
165
|
+
// Record in history
|
|
166
|
+
this.history.unshift({
|
|
167
|
+
prompt,
|
|
168
|
+
response: result.explanation,
|
|
169
|
+
timestamp: new Date(),
|
|
170
|
+
success: !result.error,
|
|
171
|
+
provider: provider.id,
|
|
172
|
+
});
|
|
173
|
+
// Keep only last 50 items
|
|
174
|
+
if (this.history.length > 50) {
|
|
175
|
+
this.history = this.history.slice(0, 50);
|
|
176
|
+
}
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get suggestions using the active provider
|
|
181
|
+
*/
|
|
182
|
+
async getSuggestions(workflow, selectedStepId) {
|
|
183
|
+
const provider = this.getActiveProvider();
|
|
184
|
+
return provider.getSuggestions(workflow, selectedStepId);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Stream a prompt using the active provider (if supported)
|
|
188
|
+
*/
|
|
189
|
+
async streamPrompt(prompt, workflow, onChunk) {
|
|
190
|
+
const provider = this.getActiveProvider();
|
|
191
|
+
if (provider.streamPrompt) {
|
|
192
|
+
const result = await provider.streamPrompt(prompt, workflow, onChunk);
|
|
193
|
+
this.history.unshift({
|
|
194
|
+
prompt,
|
|
195
|
+
response: result.explanation,
|
|
196
|
+
timestamp: new Date(),
|
|
197
|
+
success: !result.error,
|
|
198
|
+
provider: provider.id,
|
|
199
|
+
});
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
// Fall back to non-streaming
|
|
203
|
+
return this.processPrompt(prompt, workflow);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Get prompt history
|
|
207
|
+
*/
|
|
208
|
+
getHistory(limit = 20) {
|
|
209
|
+
return this.history.slice(0, limit);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Clear history
|
|
213
|
+
*/
|
|
214
|
+
clearHistory() {
|
|
215
|
+
this.history = [];
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get provider status
|
|
219
|
+
*/
|
|
220
|
+
getStatus() {
|
|
221
|
+
return {
|
|
222
|
+
activeProvider: this.activeProviderId,
|
|
223
|
+
providers: Array.from(this.providers.entries()).map(([id, provider]) => ({
|
|
224
|
+
id,
|
|
225
|
+
name: provider.name,
|
|
226
|
+
...provider.getStatus(),
|
|
227
|
+
})),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// Singleton instance
|
|
232
|
+
let registryInstance = null;
|
|
233
|
+
export function getAgentRegistry() {
|
|
234
|
+
if (!registryInstance) {
|
|
235
|
+
registryInstance = new AgentRegistry();
|
|
236
|
+
}
|
|
237
|
+
return registryInstance;
|
|
238
|
+
}
|
|
239
|
+
export function createAgentRegistry() {
|
|
240
|
+
return new AgentRegistry();
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../../src/server/services/agents/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/server/services/agents/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
const clients = new Map();
|
|
2
|
+
export function setupWebSocket(io) {
|
|
3
|
+
io.on('connection', (socket) => {
|
|
4
|
+
console.log(`Client connected: ${socket.id}`);
|
|
5
|
+
// Initialize client state
|
|
6
|
+
clients.set(socket.id, {
|
|
7
|
+
subscribedWorkflows: new Set(),
|
|
8
|
+
subscribedExecutions: new Set(),
|
|
9
|
+
});
|
|
10
|
+
// Handle workflow subscription
|
|
11
|
+
socket.on('workflow:subscribe', (workflowPath) => {
|
|
12
|
+
const state = clients.get(socket.id);
|
|
13
|
+
if (state) {
|
|
14
|
+
state.subscribedWorkflows.add(workflowPath);
|
|
15
|
+
socket.join(`workflow:${workflowPath}`);
|
|
16
|
+
console.log(`Client ${socket.id} subscribed to workflow: ${workflowPath}`);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
socket.on('workflow:unsubscribe', (workflowPath) => {
|
|
20
|
+
const state = clients.get(socket.id);
|
|
21
|
+
if (state) {
|
|
22
|
+
state.subscribedWorkflows.delete(workflowPath);
|
|
23
|
+
socket.leave(`workflow:${workflowPath}`);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
// Handle execution subscription
|
|
27
|
+
socket.on('execution:subscribe', (runId) => {
|
|
28
|
+
const state = clients.get(socket.id);
|
|
29
|
+
if (state) {
|
|
30
|
+
state.subscribedExecutions.add(runId);
|
|
31
|
+
socket.join(`execution:${runId}`);
|
|
32
|
+
console.log(`Client ${socket.id} subscribed to execution: ${runId}`);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
socket.on('execution:unsubscribe', (runId) => {
|
|
36
|
+
const state = clients.get(socket.id);
|
|
37
|
+
if (state) {
|
|
38
|
+
state.subscribedExecutions.delete(runId);
|
|
39
|
+
socket.leave(`execution:${runId}`);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
// Handle disconnect
|
|
43
|
+
socket.on('disconnect', () => {
|
|
44
|
+
console.log(`Client disconnected: ${socket.id}`);
|
|
45
|
+
clients.delete(socket.id);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
// Helper functions to emit events
|
|
49
|
+
return {
|
|
50
|
+
// Emit to all clients subscribed to a workflow
|
|
51
|
+
emitWorkflowUpdate(workflowPath, data) {
|
|
52
|
+
io.to(`workflow:${workflowPath}`).emit('workflow:updated', {
|
|
53
|
+
path: workflowPath,
|
|
54
|
+
...data,
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
// Emit execution step update
|
|
58
|
+
emitExecutionStep(runId, data) {
|
|
59
|
+
io.to(`execution:${runId}`).emit('execution:step', {
|
|
60
|
+
runId,
|
|
61
|
+
...data,
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
// Emit execution completed
|
|
65
|
+
emitExecutionCompleted(runId, data) {
|
|
66
|
+
io.to(`execution:${runId}`).emit('execution:completed', {
|
|
67
|
+
runId,
|
|
68
|
+
...data,
|
|
69
|
+
});
|
|
70
|
+
},
|
|
71
|
+
// Emit AI processing status
|
|
72
|
+
emitAIProcessing(socketId, processing) {
|
|
73
|
+
io.to(socketId).emit('ai:processing', { processing });
|
|
74
|
+
},
|
|
75
|
+
// Emit AI response
|
|
76
|
+
emitAIResponse(socketId, response) {
|
|
77
|
+
io.to(socketId).emit('ai:response', response);
|
|
78
|
+
},
|
|
79
|
+
// Broadcast to all clients
|
|
80
|
+
broadcast(event, data) {
|
|
81
|
+
io.emit(event, data);
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/websocket/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
interface Workflow {
|
|
2
|
+
metadata: any;
|
|
3
|
+
steps: any[];
|
|
4
|
+
tools?: Record<string, any>;
|
|
5
|
+
inputs?: Record<string, any>;
|
|
6
|
+
}
|
|
7
|
+
interface PromptResult {
|
|
8
|
+
explanation: string;
|
|
9
|
+
workflow?: Workflow;
|
|
10
|
+
diff?: string;
|
|
11
|
+
}
|
|
12
|
+
interface PromptHistoryItem {
|
|
13
|
+
prompt: string;
|
|
14
|
+
response: string;
|
|
15
|
+
timestamp: Date;
|
|
16
|
+
success: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare class AIService {
|
|
19
|
+
private history;
|
|
20
|
+
private anthropic;
|
|
21
|
+
constructor();
|
|
22
|
+
processPrompt(prompt: string, workflow: Workflow): Promise<PromptResult>;
|
|
23
|
+
private parseAIResponse;
|
|
24
|
+
private generateDiff;
|
|
25
|
+
getHistory(): Promise<PromptHistoryItem[]>;
|
|
26
|
+
getSuggestions(workflow: Workflow, selectedStepId?: string): Promise<string[]>;
|
|
27
|
+
private simulateResponse;
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=AIService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIService.d.ts","sourceRoot":"","sources":["../../../src/server/services/AIService.ts"],"names":[],"mappings":"AAGA,UAAU,QAAQ;IAChB,QAAQ,EAAE,GAAG,CAAC;IACd,KAAK,EAAE,GAAG,EAAE,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED,UAAU,YAAY;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAyBD,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,SAAS,CAA0B;;IASrC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;IAkD9E,OAAO,CAAC,eAAe;IAoCvB,OAAO,CAAC,YAAY;IAkBd,UAAU,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAI1C,cAAc,CAClB,QAAQ,EAAE,QAAQ,EAClB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,EAAE,CAAC;IAmCpB,OAAO,CAAC,gBAAgB;CA6DzB"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
import { stringify as yamlStringify, parse as yamlParse } from 'yaml';
|
|
3
|
+
const SYSTEM_PROMPT = `You are an expert workflow automation assistant for Marktoflow, a markdown-based workflow automation framework.
|
|
4
|
+
|
|
5
|
+
Your role is to help users modify their workflows based on natural language requests. You should:
|
|
6
|
+
|
|
7
|
+
1. Understand the current workflow structure (YAML frontmatter with steps, inputs, tools)
|
|
8
|
+
2. Make precise modifications based on user requests
|
|
9
|
+
3. Explain what changes you made and why
|
|
10
|
+
|
|
11
|
+
When modifying workflows, follow these conventions:
|
|
12
|
+
- Each step has: id, name (optional), action (service.method), inputs, output_variable
|
|
13
|
+
- Actions use format: service.method (e.g., slack.chat.postMessage, github.pulls.get)
|
|
14
|
+
- Template variables use: {{ variable_name }} syntax
|
|
15
|
+
- Error handling can specify: action (stop/continue/retry), max_retries
|
|
16
|
+
- Conditions use JavaScript-like expressions
|
|
17
|
+
|
|
18
|
+
Available services: slack, github, jira, gmail, outlook, linear, notion, discord, airtable, confluence, http, claude, opencode, ollama
|
|
19
|
+
|
|
20
|
+
Respond with:
|
|
21
|
+
1. A brief explanation of the changes
|
|
22
|
+
2. The complete modified workflow in valid YAML format
|
|
23
|
+
|
|
24
|
+
Be concise and precise. Only make the requested changes.`;
|
|
25
|
+
export class AIService {
|
|
26
|
+
history = [];
|
|
27
|
+
anthropic = null;
|
|
28
|
+
constructor() {
|
|
29
|
+
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
30
|
+
if (apiKey) {
|
|
31
|
+
this.anthropic = new Anthropic({ apiKey });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async processPrompt(prompt, workflow) {
|
|
35
|
+
if (!this.anthropic) {
|
|
36
|
+
// Demo mode: simulate AI response
|
|
37
|
+
return this.simulateResponse(prompt, workflow);
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
// Convert workflow to YAML for better readability
|
|
41
|
+
const workflowYaml = yamlStringify(workflow, { indent: 2, lineWidth: 0 });
|
|
42
|
+
const response = await this.anthropic.messages.create({
|
|
43
|
+
model: 'claude-sonnet-4-20250514',
|
|
44
|
+
max_tokens: 4096,
|
|
45
|
+
system: SYSTEM_PROMPT,
|
|
46
|
+
messages: [
|
|
47
|
+
{
|
|
48
|
+
role: 'user',
|
|
49
|
+
content: `Current workflow:\n\`\`\`yaml\n${workflowYaml}\n\`\`\`\n\nUser request: ${prompt}`,
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
});
|
|
53
|
+
// Parse the response
|
|
54
|
+
const responseText = response.content
|
|
55
|
+
.filter((block) => block.type === 'text')
|
|
56
|
+
.map((block) => block.text)
|
|
57
|
+
.join('');
|
|
58
|
+
// Extract explanation and workflow from response
|
|
59
|
+
const result = this.parseAIResponse(responseText, workflow);
|
|
60
|
+
this.history.unshift({
|
|
61
|
+
prompt,
|
|
62
|
+
response: result.explanation,
|
|
63
|
+
timestamp: new Date(),
|
|
64
|
+
success: true,
|
|
65
|
+
});
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
this.history.unshift({
|
|
70
|
+
prompt,
|
|
71
|
+
response: error instanceof Error ? error.message : 'Unknown error',
|
|
72
|
+
timestamp: new Date(),
|
|
73
|
+
success: false,
|
|
74
|
+
});
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
parseAIResponse(responseText, originalWorkflow) {
|
|
79
|
+
// Try to extract YAML from the response
|
|
80
|
+
const yamlMatch = responseText.match(/```yaml\n([\s\S]*?)\n```/);
|
|
81
|
+
let modifiedWorkflow;
|
|
82
|
+
let explanation = responseText;
|
|
83
|
+
if (yamlMatch) {
|
|
84
|
+
try {
|
|
85
|
+
const parsedYaml = yamlParse(yamlMatch[1]);
|
|
86
|
+
// Validate that it has the expected workflow structure
|
|
87
|
+
if (parsedYaml && (parsedYaml.steps || parsedYaml.metadata)) {
|
|
88
|
+
modifiedWorkflow = parsedYaml;
|
|
89
|
+
// Extract explanation (text before the YAML block)
|
|
90
|
+
const explanationMatch = responseText.match(/^([\s\S]*?)```yaml/);
|
|
91
|
+
if (explanationMatch) {
|
|
92
|
+
explanation = explanationMatch[1].trim();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Failed to parse YAML, return just the explanation
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Generate diff if we have a modified workflow
|
|
101
|
+
let diff;
|
|
102
|
+
if (modifiedWorkflow) {
|
|
103
|
+
diff = this.generateDiff(originalWorkflow, modifiedWorkflow);
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
explanation,
|
|
107
|
+
workflow: modifiedWorkflow,
|
|
108
|
+
diff,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
generateDiff(original, modified) {
|
|
112
|
+
const originalStepIds = new Set(original.steps?.map((s) => s.id) || []);
|
|
113
|
+
const modifiedStepIds = new Set(modified.steps?.map((s) => s.id) || []);
|
|
114
|
+
const added = modified.steps?.filter((s) => !originalStepIds.has(s.id)) || [];
|
|
115
|
+
const removed = original.steps?.filter((s) => !modifiedStepIds.has(s.id)) || [];
|
|
116
|
+
let diff = '';
|
|
117
|
+
if (added.length > 0) {
|
|
118
|
+
diff += `+ Added ${added.length} step(s): ${added.map((s) => s.name || s.id).join(', ')}\n`;
|
|
119
|
+
}
|
|
120
|
+
if (removed.length > 0) {
|
|
121
|
+
diff += `- Removed ${removed.length} step(s): ${removed.map((s) => s.name || s.id).join(', ')}\n`;
|
|
122
|
+
}
|
|
123
|
+
return diff || 'No structural changes detected';
|
|
124
|
+
}
|
|
125
|
+
async getHistory() {
|
|
126
|
+
return this.history.slice(0, 20);
|
|
127
|
+
}
|
|
128
|
+
async getSuggestions(workflow, selectedStepId) {
|
|
129
|
+
const suggestions = [];
|
|
130
|
+
if (!workflow || !workflow.steps) {
|
|
131
|
+
return [
|
|
132
|
+
'Add your first step',
|
|
133
|
+
'Import a template workflow',
|
|
134
|
+
'Connect to a service',
|
|
135
|
+
];
|
|
136
|
+
}
|
|
137
|
+
// Generic suggestions
|
|
138
|
+
suggestions.push('Add error handling to all steps', 'Add a notification step at the end', 'Convert steps to a sub-workflow');
|
|
139
|
+
// Step-specific suggestions
|
|
140
|
+
if (selectedStepId) {
|
|
141
|
+
const step = workflow.steps.find((s) => s.id === selectedStepId);
|
|
142
|
+
if (step) {
|
|
143
|
+
if (!step.errorHandling) {
|
|
144
|
+
suggestions.push(`Add retry logic to "${step.name || step.id}"`);
|
|
145
|
+
}
|
|
146
|
+
suggestions.push(`Add a condition to "${step.name || step.id}"`, `Duplicate "${step.name || step.id}"`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return suggestions.slice(0, 5);
|
|
150
|
+
}
|
|
151
|
+
simulateResponse(prompt, workflow) {
|
|
152
|
+
const promptLower = prompt.toLowerCase();
|
|
153
|
+
let explanation = '';
|
|
154
|
+
let modifiedWorkflow = { ...workflow, steps: [...(workflow.steps || [])] };
|
|
155
|
+
// Simple pattern matching for demo purposes
|
|
156
|
+
if (promptLower.includes('add') && promptLower.includes('slack')) {
|
|
157
|
+
const newStep = {
|
|
158
|
+
id: `slack-${Date.now()}`,
|
|
159
|
+
name: 'Send Slack Notification',
|
|
160
|
+
action: 'slack.chat.postMessage',
|
|
161
|
+
inputs: {
|
|
162
|
+
channel: '#general',
|
|
163
|
+
text: 'Workflow completed successfully!',
|
|
164
|
+
},
|
|
165
|
+
outputVariable: 'slack_result',
|
|
166
|
+
};
|
|
167
|
+
modifiedWorkflow.steps.push(newStep);
|
|
168
|
+
explanation = 'Added a new Slack notification step at the end of the workflow. The message will be sent to #general channel.';
|
|
169
|
+
}
|
|
170
|
+
else if (promptLower.includes('add') && promptLower.includes('error')) {
|
|
171
|
+
modifiedWorkflow.steps = modifiedWorkflow.steps.map((step) => ({
|
|
172
|
+
...step,
|
|
173
|
+
errorHandling: {
|
|
174
|
+
action: 'retry',
|
|
175
|
+
maxRetries: 3,
|
|
176
|
+
},
|
|
177
|
+
}));
|
|
178
|
+
explanation = 'Added error handling with 3 retries to all steps in the workflow.';
|
|
179
|
+
}
|
|
180
|
+
else if (promptLower.includes('add') && promptLower.includes('condition')) {
|
|
181
|
+
if (modifiedWorkflow.steps.length > 0) {
|
|
182
|
+
modifiedWorkflow.steps[modifiedWorkflow.steps.length - 1] = {
|
|
183
|
+
...modifiedWorkflow.steps[modifiedWorkflow.steps.length - 1],
|
|
184
|
+
conditions: ['{{ previous_step.success === true }}'],
|
|
185
|
+
};
|
|
186
|
+
explanation = 'Added a condition to the last step to only run if the previous step succeeded.';
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
explanation = 'No steps to add conditions to. Please add some steps first.';
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else if (promptLower.includes('remove') || promptLower.includes('delete')) {
|
|
193
|
+
if (modifiedWorkflow.steps.length > 0) {
|
|
194
|
+
const removed = modifiedWorkflow.steps.pop();
|
|
195
|
+
explanation = `Removed the last step "${removed?.name || removed?.id}" from the workflow.`;
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
explanation = 'No steps to remove.';
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
explanation = `I understood your request: "${prompt}". In a full implementation, I would analyze the workflow and make the appropriate modifications. For now, this is running in demo mode without an API key.`;
|
|
203
|
+
}
|
|
204
|
+
this.history.unshift({
|
|
205
|
+
prompt,
|
|
206
|
+
response: explanation,
|
|
207
|
+
timestamp: new Date(),
|
|
208
|
+
success: true,
|
|
209
|
+
});
|
|
210
|
+
return {
|
|
211
|
+
explanation,
|
|
212
|
+
workflow: modifiedWorkflow,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=AIService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIService.js","sourceRoot":"","sources":["../../../src/server/services/AIService.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAsBtE,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;yDAqBmC,CAAC;AAE1D,MAAM,OAAO,SAAS;IACZ,OAAO,GAAwB,EAAE,CAAC;IAClC,SAAS,GAAqB,IAAI,CAAC;IAE3C;QACE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAC7C,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,QAAkB;QACpD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,kCAAkC;YAClC,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,CAAC;YACH,kDAAkD;YAClD,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;YAE1E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACpD,KAAK,EAAE,0BAA0B;gBACjC,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,aAAa;gBACrB,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,kCAAkC,YAAY,6BAA6B,MAAM,EAAE;qBAC7F;iBACF;aACF,CAAC,CAAC;YAEH,qBAAqB;YACrB,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO;iBAClC,MAAM,CAAC,CAAC,KAAK,EAAgC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;iBACtE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;iBAC1B,IAAI,CAAC,EAAE,CAAC,CAAC;YAEZ,iDAAiD;YACjD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YAE5D,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;gBACnB,MAAM;gBACN,QAAQ,EAAE,MAAM,CAAC,WAAW;gBAC5B,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;gBACnB,MAAM;gBACN,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;gBAClE,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,YAAoB,EAAE,gBAA0B;QACtE,wCAAwC;QACxC,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACjE,IAAI,gBAAsC,CAAC;QAC3C,IAAI,WAAW,GAAG,YAAY,CAAC;QAE/B,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3C,uDAAuD;gBACvD,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5D,gBAAgB,GAAG,UAAsB,CAAC;oBAC1C,mDAAmD;oBACnD,MAAM,gBAAgB,GAAG,YAAY,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;oBAClE,IAAI,gBAAgB,EAAE,CAAC;wBACrB,WAAW,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC3C,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,oDAAoD;YACtD,CAAC;QACH,CAAC;QAED,+CAA+C;QAC/C,IAAI,IAAwB,CAAC;QAC7B,IAAI,gBAAgB,EAAE,CAAC;YACrB,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO;YACL,WAAW;YACX,QAAQ,EAAE,gBAAgB;YAC1B,IAAI;SACL,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,QAAkB,EAAE,QAAkB;QACzD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACxE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAExE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9E,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAEhF,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,IAAI,WAAW,KAAK,CAAC,MAAM,aAAa,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9F,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,IAAI,aAAa,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACpG,CAAC;QAED,OAAO,IAAI,IAAI,gCAAgC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,QAAkB,EAClB,cAAuB;QAEvB,MAAM,WAAW,GAAa,EAAE,CAAC;QAEjC,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjC,OAAO;gBACL,qBAAqB;gBACrB,4BAA4B;gBAC5B,sBAAsB;aACvB,CAAC;QACJ,CAAC;QAED,sBAAsB;QACtB,WAAW,CAAC,IAAI,CACd,iCAAiC,EACjC,oCAAoC,EACpC,iCAAiC,CAClC,CAAC;QAEF,4BAA4B;QAC5B,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,CAAC;YACjE,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;oBACxB,WAAW,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;gBACnE,CAAC;gBACD,WAAW,CAAC,IAAI,CACd,uBAAuB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,GAAG,EAC9C,cAAc,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,GAAG,CACtC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IAEO,gBAAgB,CAAC,MAAc,EAAE,QAAkB;QACzD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,gBAAgB,GAAG,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAE3E,4CAA4C;QAC5C,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACjE,MAAM,OAAO,GAAG;gBACd,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE;gBACzB,IAAI,EAAE,yBAAyB;gBAC/B,MAAM,EAAE,wBAAwB;gBAChC,MAAM,EAAE;oBACN,OAAO,EAAE,UAAU;oBACnB,IAAI,EAAE,kCAAkC;iBACzC;gBACD,cAAc,EAAE,cAAc;aAC/B,CAAC;YACF,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrC,WAAW,GAAG,+GAA+G,CAAC;QAChI,CAAC;aAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACxE,gBAAgB,CAAC,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC7D,GAAG,IAAI;gBACP,aAAa,EAAE;oBACb,MAAM,EAAE,OAAO;oBACf,UAAU,EAAE,CAAC;iBACd;aACF,CAAC,CAAC,CAAC;YACJ,WAAW,GAAG,mEAAmE,CAAC;QACpF,CAAC;aAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5E,IAAI,gBAAgB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG;oBAC1D,GAAG,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC5D,UAAU,EAAE,CAAC,sCAAsC,CAAC;iBACrD,CAAC;gBACF,WAAW,GAAG,gFAAgF,CAAC;YACjG,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAG,6DAA6D,CAAC;YAC9E,CAAC;QACH,CAAC;aAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5E,IAAI,gBAAgB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;gBAC7C,WAAW,GAAG,0BAA0B,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,EAAE,sBAAsB,CAAC;YAC7F,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAG,qBAAqB,CAAC;YACtC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,+BAA+B,MAAM,6JAA6J,CAAC;QACnN,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACnB,MAAM;YACN,QAAQ,EAAE,WAAW;YACrB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,OAAO;YACL,WAAW;YACX,QAAQ,EAAE,gBAAgB;SAC3B,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Server as SocketIOServer } from 'socket.io';
|
|
2
|
+
export declare class FileWatcher {
|
|
3
|
+
private watcher;
|
|
4
|
+
private io;
|
|
5
|
+
private baseDir;
|
|
6
|
+
constructor(baseDir: string, io: SocketIOServer);
|
|
7
|
+
private setupListeners;
|
|
8
|
+
stop(): void;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=FileWatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileWatcher.d.ts","sourceRoot":"","sources":["../../../src/server/services/FileWatcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,WAAW,CAAC;AAG1D,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc;IAyB/C,OAAO,CAAC,cAAc;IAiCtB,IAAI;CAIL"}
|