@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.
Files changed (165) hide show
  1. package/.turbo/turbo-build.log +26 -0
  2. package/.turbo/turbo-test.log +22 -0
  3. package/README.md +179 -0
  4. package/dist/client/assets/index-DwTI8opO.js +608 -0
  5. package/dist/client/assets/index-DwTI8opO.js.map +1 -0
  6. package/dist/client/assets/index-RoEdL6gO.css +1 -0
  7. package/dist/client/index.html +20 -0
  8. package/dist/client/vite.svg +9 -0
  9. package/dist/server/index.d.ts +3 -0
  10. package/dist/server/index.d.ts.map +1 -0
  11. package/dist/server/index.js +56 -0
  12. package/dist/server/index.js.map +1 -0
  13. package/dist/server/routes/ai.js +50 -0
  14. package/dist/server/routes/ai.js.map +1 -0
  15. package/dist/server/routes/execute.js +62 -0
  16. package/dist/server/routes/execute.js.map +1 -0
  17. package/dist/server/routes/workflows.js +99 -0
  18. package/dist/server/routes/workflows.js.map +1 -0
  19. package/dist/server/server/index.js +95 -0
  20. package/dist/server/server/index.js.map +1 -0
  21. package/dist/server/server/routes/ai.js +87 -0
  22. package/dist/server/server/routes/ai.js.map +1 -0
  23. package/dist/server/server/routes/execute.js +63 -0
  24. package/dist/server/server/routes/execute.js.map +1 -0
  25. package/dist/server/server/routes/tools.js +518 -0
  26. package/dist/server/server/routes/tools.js.map +1 -0
  27. package/dist/server/server/routes/workflows.js +99 -0
  28. package/dist/server/server/routes/workflows.js.map +1 -0
  29. package/dist/server/server/services/AIService.js +69 -0
  30. package/dist/server/server/services/AIService.js.map +1 -0
  31. package/dist/server/server/services/FileWatcher.js +60 -0
  32. package/dist/server/server/services/FileWatcher.js.map +1 -0
  33. package/dist/server/server/services/WorkflowService.js +363 -0
  34. package/dist/server/server/services/WorkflowService.js.map +1 -0
  35. package/dist/server/server/services/agents/claude-code-provider.js +250 -0
  36. package/dist/server/server/services/agents/claude-code-provider.js.map +1 -0
  37. package/dist/server/server/services/agents/claude-provider.js +204 -0
  38. package/dist/server/server/services/agents/claude-provider.js.map +1 -0
  39. package/dist/server/server/services/agents/copilot-provider.js +227 -0
  40. package/dist/server/server/services/agents/copilot-provider.js.map +1 -0
  41. package/dist/server/server/services/agents/demo-provider.js +167 -0
  42. package/dist/server/server/services/agents/demo-provider.js.map +1 -0
  43. package/dist/server/server/services/agents/index.js +31 -0
  44. package/dist/server/server/services/agents/index.js.map +1 -0
  45. package/dist/server/server/services/agents/ollama-provider.js +220 -0
  46. package/dist/server/server/services/agents/ollama-provider.js.map +1 -0
  47. package/dist/server/server/services/agents/prompts.js +436 -0
  48. package/dist/server/server/services/agents/prompts.js.map +1 -0
  49. package/dist/server/server/services/agents/registry.js +242 -0
  50. package/dist/server/server/services/agents/registry.js.map +1 -0
  51. package/dist/server/server/services/agents/types.js +6 -0
  52. package/dist/server/server/services/agents/types.js.map +1 -0
  53. package/dist/server/server/websocket/index.js +85 -0
  54. package/dist/server/server/websocket/index.js.map +1 -0
  55. package/dist/server/services/AIService.d.ts +30 -0
  56. package/dist/server/services/AIService.d.ts.map +1 -0
  57. package/dist/server/services/AIService.js +216 -0
  58. package/dist/server/services/AIService.js.map +1 -0
  59. package/dist/server/services/FileWatcher.d.ts +10 -0
  60. package/dist/server/services/FileWatcher.d.ts.map +1 -0
  61. package/dist/server/services/FileWatcher.js +62 -0
  62. package/dist/server/services/FileWatcher.js.map +1 -0
  63. package/dist/server/services/WorkflowService.d.ts +54 -0
  64. package/dist/server/services/WorkflowService.d.ts.map +1 -0
  65. package/dist/server/services/WorkflowService.js +323 -0
  66. package/dist/server/services/WorkflowService.js.map +1 -0
  67. package/dist/server/shared/constants.js +175 -0
  68. package/dist/server/shared/constants.js.map +1 -0
  69. package/dist/server/shared/types.js +3 -0
  70. package/dist/server/shared/types.js.map +1 -0
  71. package/dist/server/websocket/index.d.ts +10 -0
  72. package/dist/server/websocket/index.d.ts.map +1 -0
  73. package/dist/server/websocket/index.js +85 -0
  74. package/dist/server/websocket/index.js.map +1 -0
  75. package/index.html +19 -0
  76. package/package.json +96 -0
  77. package/playwright.config.ts +27 -0
  78. package/postcss.config.js +6 -0
  79. package/public/vite.svg +9 -0
  80. package/src/client/App.tsx +520 -0
  81. package/src/client/components/Canvas/Canvas.tsx +405 -0
  82. package/src/client/components/Canvas/ExecutionOverlay.tsx +847 -0
  83. package/src/client/components/Canvas/NodeContextMenu.tsx +188 -0
  84. package/src/client/components/Canvas/OutputNode.tsx +111 -0
  85. package/src/client/components/Canvas/StepNode.tsx +106 -0
  86. package/src/client/components/Canvas/SubWorkflowNode.tsx +141 -0
  87. package/src/client/components/Canvas/Toolbar.tsx +189 -0
  88. package/src/client/components/Canvas/TriggerNode.tsx +128 -0
  89. package/src/client/components/Editor/InputsEditor.tsx +458 -0
  90. package/src/client/components/Editor/NewStepWizard.tsx +344 -0
  91. package/src/client/components/Editor/StepEditor.tsx +532 -0
  92. package/src/client/components/Editor/YamlEditor.tsx +160 -0
  93. package/src/client/components/Panels/PropertiesPanel.tsx +589 -0
  94. package/src/client/components/Prompt/ChangePreview.tsx +281 -0
  95. package/src/client/components/Prompt/PromptHistoryPanel.tsx +209 -0
  96. package/src/client/components/Prompt/PromptInput.tsx +108 -0
  97. package/src/client/components/Sidebar/Sidebar.tsx +343 -0
  98. package/src/client/components/common/Breadcrumb.tsx +40 -0
  99. package/src/client/components/common/Button.tsx +68 -0
  100. package/src/client/components/common/ContextMenu.tsx +202 -0
  101. package/src/client/components/common/KeyboardShortcuts.tsx +143 -0
  102. package/src/client/components/common/Modal.tsx +93 -0
  103. package/src/client/components/common/Tabs.tsx +57 -0
  104. package/src/client/components/common/ThemeToggle.tsx +63 -0
  105. package/src/client/components/index.ts +32 -0
  106. package/src/client/hooks/index.ts +4 -0
  107. package/src/client/hooks/useAIPrompt.ts +108 -0
  108. package/src/client/hooks/useCanvas.ts +247 -0
  109. package/src/client/hooks/useWebSocket.ts +164 -0
  110. package/src/client/hooks/useWorkflow.ts +138 -0
  111. package/src/client/main.tsx +10 -0
  112. package/src/client/stores/canvasStore.ts +348 -0
  113. package/src/client/stores/editorStore.ts +133 -0
  114. package/src/client/stores/executionStore.ts +440 -0
  115. package/src/client/stores/index.ts +4 -0
  116. package/src/client/stores/layoutStore.ts +103 -0
  117. package/src/client/stores/navigationStore.ts +49 -0
  118. package/src/client/stores/promptStore.ts +113 -0
  119. package/src/client/stores/themeStore.ts +75 -0
  120. package/src/client/stores/workflowStore.ts +177 -0
  121. package/src/client/styles/globals.css +346 -0
  122. package/src/client/utils/cn.ts +9 -0
  123. package/src/client/utils/index.ts +4 -0
  124. package/src/client/utils/serviceIcons.tsx +64 -0
  125. package/src/client/utils/stepValidation.ts +155 -0
  126. package/src/client/utils/workflowToGraph.ts +299 -0
  127. package/src/server/index.ts +114 -0
  128. package/src/server/routes/ai.ts +91 -0
  129. package/src/server/routes/execute.ts +71 -0
  130. package/src/server/routes/tools.ts +564 -0
  131. package/src/server/routes/workflows.ts +106 -0
  132. package/src/server/services/AIService.ts +105 -0
  133. package/src/server/services/FileWatcher.ts +69 -0
  134. package/src/server/services/WorkflowService.ts +441 -0
  135. package/src/server/services/agents/claude-code-provider.ts +320 -0
  136. package/src/server/services/agents/claude-provider.ts +248 -0
  137. package/src/server/services/agents/copilot-provider.ts +311 -0
  138. package/src/server/services/agents/demo-provider.ts +184 -0
  139. package/src/server/services/agents/index.ts +31 -0
  140. package/src/server/services/agents/ollama-provider.ts +267 -0
  141. package/src/server/services/agents/prompts.ts +482 -0
  142. package/src/server/services/agents/registry.ts +289 -0
  143. package/src/server/services/agents/types.ts +146 -0
  144. package/src/server/websocket/index.ts +104 -0
  145. package/src/shared/constants.ts +180 -0
  146. package/src/shared/types.ts +179 -0
  147. package/tailwind.config.ts +73 -0
  148. package/tests/e2e/app.spec.ts +90 -0
  149. package/tests/e2e/canvas.spec.ts +128 -0
  150. package/tests/e2e/workflow.spec.ts +185 -0
  151. package/tests/integration/api.test.ts +250 -0
  152. package/tests/integration/testApp.ts +31 -0
  153. package/tests/setup.ts +37 -0
  154. package/tests/unit/canvasStore.test.ts +502 -0
  155. package/tests/unit/components.test.tsx +151 -0
  156. package/tests/unit/executionStore.test.ts +527 -0
  157. package/tests/unit/layoutStore.test.ts +194 -0
  158. package/tests/unit/navigationStore.test.ts +152 -0
  159. package/tests/unit/stepValidation.test.ts +226 -0
  160. package/tests/unit/themeStore.test.ts +141 -0
  161. package/tests/unit/workflowToGraph.test.ts +289 -0
  162. package/tsconfig.json +29 -0
  163. package/tsconfig.server.json +28 -0
  164. package/vite.config.ts +31 -0
  165. package/vitest.config.ts +26 -0
@@ -0,0 +1,99 @@
1
+ import { Router } from 'express';
2
+ import { WorkflowService } from '../services/WorkflowService.js';
3
+ const router = Router();
4
+ const workflowService = new WorkflowService();
5
+ // List all workflows
6
+ router.get('/', async (_req, res) => {
7
+ try {
8
+ const workflows = await workflowService.listWorkflows();
9
+ res.json({ workflows });
10
+ }
11
+ catch (error) {
12
+ res.status(500).json({
13
+ error: 'Failed to list workflows',
14
+ message: error instanceof Error ? error.message : 'Unknown error',
15
+ });
16
+ }
17
+ });
18
+ // Get a specific workflow
19
+ router.get('/:path(*)', async (req, res) => {
20
+ try {
21
+ const workflowPath = decodeURIComponent(req.params['path(*)']);
22
+ const workflow = await workflowService.getWorkflow(workflowPath);
23
+ if (!workflow) {
24
+ return res.status(404).json({ error: 'Workflow not found' });
25
+ }
26
+ res.json({ workflow });
27
+ }
28
+ catch (error) {
29
+ res.status(500).json({
30
+ error: 'Failed to get workflow',
31
+ message: error instanceof Error ? error.message : 'Unknown error',
32
+ });
33
+ }
34
+ });
35
+ // Create a new workflow
36
+ router.post('/', async (req, res) => {
37
+ try {
38
+ const { name, template } = req.body;
39
+ if (!name) {
40
+ return res.status(400).json({ error: 'Name is required' });
41
+ }
42
+ const workflow = await workflowService.createWorkflow(name, template);
43
+ res.status(201).json({ workflow });
44
+ }
45
+ catch (error) {
46
+ res.status(500).json({
47
+ error: 'Failed to create workflow',
48
+ message: error instanceof Error ? error.message : 'Unknown error',
49
+ });
50
+ }
51
+ });
52
+ // Update a workflow
53
+ router.put('/:path(*)', async (req, res) => {
54
+ try {
55
+ const workflowPath = decodeURIComponent(req.params['path(*)']);
56
+ const { workflow } = req.body;
57
+ if (!workflow) {
58
+ return res.status(400).json({ error: 'Workflow data is required' });
59
+ }
60
+ const updated = await workflowService.updateWorkflow(workflowPath, workflow);
61
+ res.json({ workflow: updated });
62
+ }
63
+ catch (error) {
64
+ res.status(500).json({
65
+ error: 'Failed to update workflow',
66
+ message: error instanceof Error ? error.message : 'Unknown error',
67
+ });
68
+ }
69
+ });
70
+ // Delete a workflow
71
+ router.delete('/:path(*)', async (req, res) => {
72
+ try {
73
+ const workflowPath = decodeURIComponent(req.params['path(*)']);
74
+ await workflowService.deleteWorkflow(workflowPath);
75
+ res.json({ success: true });
76
+ }
77
+ catch (error) {
78
+ res.status(500).json({
79
+ error: 'Failed to delete workflow',
80
+ message: error instanceof Error ? error.message : 'Unknown error',
81
+ });
82
+ }
83
+ });
84
+ // Get workflow execution history
85
+ router.get('/:path(*)/runs', async (req, res) => {
86
+ try {
87
+ const workflowPath = decodeURIComponent(req.params['path(*)']);
88
+ const runs = await workflowService.getExecutionHistory(workflowPath);
89
+ res.json({ runs });
90
+ }
91
+ catch (error) {
92
+ res.status(500).json({
93
+ error: 'Failed to get execution history',
94
+ message: error instanceof Error ? error.message : 'Unknown error',
95
+ });
96
+ }
97
+ });
98
+ export { router as workflowRoutes };
99
+ //# sourceMappingURL=workflows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../../../src/server/routes/workflows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * AI Service - Backwards-compatible wrapper around the Agent Registry
3
+ *
4
+ * This service provides the same interface as before but now supports
5
+ * multiple AI backends through the agent provider system.
6
+ */
7
+ import { getAgentRegistry } from './agents/index.js';
8
+ export class AIService {
9
+ registry;
10
+ initialized = false;
11
+ constructor() {
12
+ this.registry = getAgentRegistry();
13
+ }
14
+ /**
15
+ * Initialize the service with auto-detection of available providers
16
+ */
17
+ async initialize() {
18
+ if (!this.initialized) {
19
+ await this.registry.autoDetectProvider();
20
+ this.initialized = true;
21
+ }
22
+ }
23
+ /**
24
+ * Process a prompt to modify a workflow
25
+ */
26
+ async processPrompt(prompt, workflow) {
27
+ await this.initialize();
28
+ return this.registry.processPrompt(prompt, workflow);
29
+ }
30
+ /**
31
+ * Stream a prompt response (if supported by the active provider)
32
+ */
33
+ async streamPrompt(prompt, workflow, onChunk) {
34
+ await this.initialize();
35
+ return this.registry.streamPrompt(prompt, workflow, onChunk);
36
+ }
37
+ /**
38
+ * Get prompt history
39
+ */
40
+ async getHistory() {
41
+ return this.registry.getHistory(20);
42
+ }
43
+ /**
44
+ * Get suggestions for the current workflow
45
+ */
46
+ async getSuggestions(workflow, selectedStepId) {
47
+ await this.initialize();
48
+ return this.registry.getSuggestions(workflow, selectedStepId);
49
+ }
50
+ /**
51
+ * Get the current provider status
52
+ */
53
+ getStatus() {
54
+ return this.registry.getStatus();
55
+ }
56
+ /**
57
+ * Switch to a different provider
58
+ */
59
+ async setProvider(providerId, config) {
60
+ return this.registry.setActiveProvider(providerId, config);
61
+ }
62
+ /**
63
+ * Get the registry for direct access to providers
64
+ */
65
+ getRegistry() {
66
+ return this.registry;
67
+ }
68
+ }
69
+ //# sourceMappingURL=AIService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIService.js","sourceRoot":"","sources":["../../../../src/server/services/AIService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAA8C,MAAM,mBAAmB,CAAC;AAejG,MAAM,OAAO,SAAS;IACZ,QAAQ,CAAgB;IACxB,WAAW,GAAY,KAAK,CAAC;IAErC;QACE,IAAI,CAAC,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;YACzC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,QAAkB;QACpD,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAChB,MAAc,EACd,QAAkB,EAClB,OAAgC;QAEhC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,QAAkB,EAClB,cAAuB;QAEvB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,SAAS;QAIP,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,UAAkB,EAClB,MAA8D;QAE9D,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,60 @@
1
+ import { watch } from 'chokidar';
2
+ export class FileWatcher {
3
+ watcher;
4
+ io;
5
+ constructor(baseDir, io) {
6
+ this.io = io;
7
+ // Watch for workflow files
8
+ this.watcher = watch(['**/*.md', '**/*.yaml', '**/*.yml'], {
9
+ cwd: baseDir,
10
+ ignored: [
11
+ '**/node_modules/**',
12
+ '**/dist/**',
13
+ '**/.git/**',
14
+ '**/.*',
15
+ ],
16
+ persistent: true,
17
+ ignoreInitial: true,
18
+ awaitWriteFinish: {
19
+ stabilityThreshold: 300,
20
+ pollInterval: 100,
21
+ },
22
+ });
23
+ this.setupListeners();
24
+ console.log(`File watcher started for: ${baseDir}`);
25
+ }
26
+ setupListeners() {
27
+ this.watcher.on('change', (path) => {
28
+ console.log(`File changed: ${path}`);
29
+ this.io.emit('workflow:updated', {
30
+ path,
31
+ event: 'change',
32
+ timestamp: new Date().toISOString(),
33
+ });
34
+ });
35
+ this.watcher.on('add', (path) => {
36
+ console.log(`File added: ${path}`);
37
+ this.io.emit('workflow:updated', {
38
+ path,
39
+ event: 'add',
40
+ timestamp: new Date().toISOString(),
41
+ });
42
+ });
43
+ this.watcher.on('unlink', (path) => {
44
+ console.log(`File removed: ${path}`);
45
+ this.io.emit('workflow:updated', {
46
+ path,
47
+ event: 'remove',
48
+ timestamp: new Date().toISOString(),
49
+ });
50
+ });
51
+ this.watcher.on('error', (error) => {
52
+ console.error('File watcher error:', error);
53
+ });
54
+ }
55
+ stop() {
56
+ this.watcher.close();
57
+ console.log('File watcher stopped');
58
+ }
59
+ }
60
+ //# sourceMappingURL=FileWatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileWatcher.js","sourceRoot":"","sources":["../../../../src/server/services/FileWatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,UAAU,CAAC;AAGjD,MAAM,OAAO,WAAW;IACd,OAAO,CAAY;IACnB,EAAE,CAAiB;IAE3B,YAAY,OAAe,EAAE,EAAkB;QAC7C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QAEb,2BAA2B;QAC3B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE;YACzD,GAAG,EAAE,OAAO;YACZ,OAAO,EAAE;gBACP,oBAAoB;gBACpB,YAAY;gBACZ,YAAY;gBACZ,OAAO;aACR;YACD,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE;gBAChB,kBAAkB,EAAE,GAAG;gBACvB,YAAY,EAAE,GAAG;aAClB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;YACjC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC/B,IAAI;gBACJ,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC/B,IAAI;gBACJ,KAAK,EAAE,KAAK;gBACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;YACjC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC/B,IAAI;gBACJ,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,363 @@
1
+ import { readdir, readFile, writeFile, unlink, mkdir } from 'fs/promises';
2
+ import { join, relative, dirname } from 'path';
3
+ import { existsSync } from 'fs';
4
+ import { stringify as yamlStringify } from 'yaml';
5
+ // Import from @marktoflow/core for proper parsing
6
+ import { parseFile as coreParseFile } from '@marktoflow/core';
7
+ export class WorkflowService {
8
+ workflowDir;
9
+ constructor(workflowDir) {
10
+ this.workflowDir = workflowDir || process.env.WORKFLOW_DIR || process.cwd();
11
+ }
12
+ async listWorkflows() {
13
+ const workflows = [];
14
+ const baseDir = this.workflowDir;
15
+ async function scanDirectory(dir) {
16
+ try {
17
+ const entries = await readdir(dir, { withFileTypes: true });
18
+ for (const entry of entries) {
19
+ const fullPath = join(dir, entry.name);
20
+ // Skip hidden directories and node_modules
21
+ if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'dist') {
22
+ continue;
23
+ }
24
+ if (entry.isDirectory()) {
25
+ await scanDirectory(fullPath);
26
+ }
27
+ else if (entry.isFile() &&
28
+ (entry.name.endsWith('.md') || entry.name.endsWith('.yaml') || entry.name.endsWith('.yml'))) {
29
+ // Check if it's a workflow file by looking for frontmatter
30
+ try {
31
+ const content = await readFile(fullPath, 'utf-8');
32
+ if (content.includes('workflow:') || content.includes('steps:')) {
33
+ const relativePath = relative(baseDir, fullPath);
34
+ const workflowInfo = extractWorkflowInfo(content, entry.name);
35
+ workflows.push({
36
+ path: relativePath,
37
+ ...workflowInfo,
38
+ });
39
+ }
40
+ }
41
+ catch {
42
+ // Skip files that can't be read
43
+ }
44
+ }
45
+ }
46
+ }
47
+ catch {
48
+ // Skip directories we can't read
49
+ }
50
+ }
51
+ await scanDirectory(this.workflowDir);
52
+ return workflows.sort((a, b) => a.name.localeCompare(b.name));
53
+ }
54
+ async getWorkflow(workflowPath) {
55
+ const fullPath = this.resolvePath(workflowPath);
56
+ if (!existsSync(fullPath)) {
57
+ return null;
58
+ }
59
+ try {
60
+ // Use core parser for proper workflow parsing
61
+ const result = await coreParseFile(fullPath);
62
+ if (result.warnings && result.warnings.length > 0) {
63
+ console.warn(`Workflow ${workflowPath} has parsing warnings:`, result.warnings);
64
+ }
65
+ // Convert core Workflow type to GUI Workflow type
66
+ return this.convertCoreWorkflow(result.workflow, workflowPath);
67
+ }
68
+ catch (error) {
69
+ console.error(`Error parsing workflow ${workflowPath}:`, error);
70
+ // Fallback to local parsing if core parser fails
71
+ try {
72
+ const content = await readFile(fullPath, 'utf-8');
73
+ return this.parseWorkflow(content, workflowPath);
74
+ }
75
+ catch {
76
+ return null;
77
+ }
78
+ }
79
+ }
80
+ convertCoreWorkflow(coreWorkflow, path) {
81
+ return {
82
+ metadata: {
83
+ id: coreWorkflow.metadata?.id || path,
84
+ name: coreWorkflow.metadata?.name || path,
85
+ version: coreWorkflow.metadata?.version,
86
+ description: coreWorkflow.metadata?.description,
87
+ author: coreWorkflow.metadata?.author,
88
+ tags: coreWorkflow.metadata?.tags,
89
+ },
90
+ steps: (coreWorkflow.steps || []).map((step) => ({
91
+ id: step.id,
92
+ name: step.name,
93
+ action: step.action,
94
+ workflow: step.workflow,
95
+ inputs: step.inputs || {},
96
+ outputVariable: step.outputVariable || step.output_variable,
97
+ conditions: step.conditions,
98
+ errorHandling: step.errorHandling || step.error_handling,
99
+ timeout: step.timeout,
100
+ })),
101
+ tools: coreWorkflow.tools,
102
+ inputs: coreWorkflow.inputs,
103
+ triggers: coreWorkflow.triggers,
104
+ };
105
+ }
106
+ async createWorkflow(name, template) {
107
+ const filename = name.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '') + '.md';
108
+ const workflowPath = join('workflows', filename);
109
+ const fullPath = join(this.workflowDir, workflowPath);
110
+ // Ensure directory exists
111
+ await mkdir(dirname(fullPath), { recursive: true });
112
+ const content = template || this.generateWorkflowTemplate(name);
113
+ await writeFile(fullPath, content, 'utf-8');
114
+ return {
115
+ path: workflowPath,
116
+ name,
117
+ };
118
+ }
119
+ async updateWorkflow(workflowPath, workflow) {
120
+ const fullPath = this.resolvePath(workflowPath);
121
+ // Read original file to preserve markdown content
122
+ let markdownContent = '';
123
+ if (existsSync(fullPath)) {
124
+ const originalContent = await readFile(fullPath, 'utf-8');
125
+ const match = originalContent.match(/^---\n[\s\S]*?\n---\n([\s\S]*)$/);
126
+ if (match) {
127
+ markdownContent = match[1];
128
+ }
129
+ }
130
+ const content = this.serializeWorkflow(workflow, markdownContent);
131
+ await writeFile(fullPath, content, 'utf-8');
132
+ return workflow;
133
+ }
134
+ async deleteWorkflow(workflowPath) {
135
+ const fullPath = this.resolvePath(workflowPath);
136
+ if (existsSync(fullPath)) {
137
+ await unlink(fullPath);
138
+ }
139
+ }
140
+ async getExecutionHistory(_workflowPath) {
141
+ // TODO: Query state store for execution history
142
+ // This will integrate with @marktoflow/core StateStore
143
+ return [];
144
+ }
145
+ resolvePath(workflowPath) {
146
+ // Handle both absolute and relative paths
147
+ if (workflowPath.startsWith('/')) {
148
+ return workflowPath;
149
+ }
150
+ return join(this.workflowDir, workflowPath);
151
+ }
152
+ parseWorkflow(content, path) {
153
+ // Extract YAML frontmatter
154
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
155
+ if (!frontmatterMatch) {
156
+ return {
157
+ metadata: { id: path, name: path },
158
+ steps: [],
159
+ };
160
+ }
161
+ const yaml = frontmatterMatch[1];
162
+ // Parse the YAML manually for now (will use @marktoflow/core parser when integrated)
163
+ const workflow = {
164
+ metadata: { id: path, name: path },
165
+ steps: [],
166
+ };
167
+ // Extract workflow metadata
168
+ const workflowSection = yaml.match(/workflow:\s*\n((?: .*\n)*)/);
169
+ if (workflowSection) {
170
+ const idMatch = workflowSection[1].match(/id:\s*(\S+)/);
171
+ const nameMatch = workflowSection[1].match(/name:\s*["']?(.+?)["']?\s*$/m);
172
+ const versionMatch = workflowSection[1].match(/version:\s*["']?(.+?)["']?\s*$/m);
173
+ const descMatch = workflowSection[1].match(/description:\s*["']?(.+?)["']?\s*$/m);
174
+ const authorMatch = workflowSection[1].match(/author:\s*["']?(.+?)["']?\s*$/m);
175
+ if (idMatch)
176
+ workflow.metadata.id = idMatch[1].trim();
177
+ if (nameMatch)
178
+ workflow.metadata.name = nameMatch[1].trim();
179
+ if (versionMatch)
180
+ workflow.metadata.version = versionMatch[1].trim();
181
+ if (descMatch)
182
+ workflow.metadata.description = descMatch[1].trim();
183
+ if (authorMatch)
184
+ workflow.metadata.author = authorMatch[1].trim();
185
+ // Extract tags
186
+ const tagsMatch = workflowSection[1].match(/tags:\s*\[(.*?)\]/);
187
+ if (tagsMatch) {
188
+ workflow.metadata.tags = tagsMatch[1]
189
+ .split(',')
190
+ .map((t) => t.trim().replace(/["']/g, ''))
191
+ .filter(Boolean);
192
+ }
193
+ }
194
+ // Extract steps using regex to find step blocks
195
+ const stepsSection = yaml.match(/steps:\s*\n((?: - [\s\S]*?)(?=\n\w|$))/);
196
+ if (stepsSection) {
197
+ const stepBlocks = stepsSection[1].split(/\n - /).filter(Boolean);
198
+ for (const block of stepBlocks) {
199
+ const stepText = block.startsWith('id:') ? block : block;
200
+ const step = this.parseStep(stepText);
201
+ if (step) {
202
+ workflow.steps.push(step);
203
+ }
204
+ }
205
+ }
206
+ // Extract tools
207
+ const toolsMatch = yaml.match(/tools:\s*\n((?: .*\n)*)/);
208
+ if (toolsMatch) {
209
+ // Simple extraction - will be enhanced with proper YAML parser
210
+ workflow.tools = {};
211
+ }
212
+ // Extract inputs
213
+ const inputsMatch = yaml.match(/inputs:\s*\n((?: .*\n)*)/);
214
+ if (inputsMatch) {
215
+ workflow.inputs = {};
216
+ }
217
+ return workflow;
218
+ }
219
+ parseStep(stepText) {
220
+ const idMatch = stepText.match(/id:\s*(\S+)/);
221
+ if (!idMatch)
222
+ return null;
223
+ const step = {
224
+ id: idMatch[1],
225
+ inputs: {},
226
+ };
227
+ const nameMatch = stepText.match(/name:\s*["']?(.+?)["']?\s*$/m);
228
+ if (nameMatch)
229
+ step.name = nameMatch[1];
230
+ const actionMatch = stepText.match(/action:\s*(\S+)/);
231
+ if (actionMatch)
232
+ step.action = actionMatch[1];
233
+ const workflowMatch = stepText.match(/workflow:\s*(\S+)/);
234
+ if (workflowMatch)
235
+ step.workflow = workflowMatch[1];
236
+ const outputMatch = stepText.match(/output_variable:\s*(\S+)/);
237
+ if (outputMatch)
238
+ step.outputVariable = outputMatch[1];
239
+ const timeoutMatch = stepText.match(/timeout:\s*(\d+)/);
240
+ if (timeoutMatch)
241
+ step.timeout = parseInt(timeoutMatch[1], 10);
242
+ // Parse inputs (simplified)
243
+ const inputsMatch = stepText.match(/inputs:\s*\n((?: .*\n)*)/);
244
+ if (inputsMatch) {
245
+ const inputLines = inputsMatch[1].split('\n').filter(Boolean);
246
+ for (const line of inputLines) {
247
+ const kvMatch = line.match(/^\s*(\w+):\s*(.+)$/);
248
+ if (kvMatch) {
249
+ let value = kvMatch[2].trim();
250
+ // Remove quotes if present
251
+ if (value.startsWith("'") && value.endsWith("'")) {
252
+ value = value.slice(1, -1);
253
+ }
254
+ else if (value.startsWith('"') && value.endsWith('"')) {
255
+ value = value.slice(1, -1);
256
+ }
257
+ step.inputs[kvMatch[1]] = value;
258
+ }
259
+ }
260
+ }
261
+ return step;
262
+ }
263
+ serializeWorkflow(workflow, markdownContent = '') {
264
+ const frontmatter = {
265
+ workflow: {
266
+ id: workflow.metadata.id,
267
+ name: workflow.metadata.name,
268
+ version: workflow.metadata.version || '1.0.0',
269
+ description: workflow.metadata.description || '',
270
+ author: workflow.metadata.author || '',
271
+ tags: workflow.metadata.tags || [],
272
+ },
273
+ };
274
+ if (workflow.tools && Object.keys(workflow.tools).length > 0) {
275
+ frontmatter.tools = workflow.tools;
276
+ }
277
+ if (workflow.inputs && Object.keys(workflow.inputs).length > 0) {
278
+ frontmatter.inputs = workflow.inputs;
279
+ }
280
+ if (workflow.triggers && workflow.triggers.length > 0) {
281
+ frontmatter.triggers = workflow.triggers;
282
+ }
283
+ // Serialize steps
284
+ frontmatter.steps = workflow.steps.map((step) => {
285
+ const stepObj = {
286
+ id: step.id,
287
+ };
288
+ if (step.name)
289
+ stepObj.name = step.name;
290
+ if (step.action)
291
+ stepObj.action = step.action;
292
+ if (step.workflow)
293
+ stepObj.workflow = step.workflow;
294
+ if (Object.keys(step.inputs).length > 0)
295
+ stepObj.inputs = step.inputs;
296
+ if (step.outputVariable)
297
+ stepObj.output_variable = step.outputVariable;
298
+ if (step.conditions && step.conditions.length > 0)
299
+ stepObj.conditions = step.conditions;
300
+ if (step.errorHandling)
301
+ stepObj.error_handling = step.errorHandling;
302
+ if (step.timeout)
303
+ stepObj.timeout = step.timeout;
304
+ return stepObj;
305
+ });
306
+ const yaml = yamlStringify(frontmatter, {
307
+ indent: 2,
308
+ lineWidth: 0,
309
+ defaultKeyType: 'PLAIN',
310
+ defaultStringType: 'QUOTE_DOUBLE',
311
+ });
312
+ // Generate markdown if not provided
313
+ if (!markdownContent.trim()) {
314
+ markdownContent = `\n# ${workflow.metadata.name}\n\n${workflow.metadata.description || ''}\n`;
315
+ }
316
+ return `---\n${yaml}---${markdownContent}`;
317
+ }
318
+ generateWorkflowTemplate(name) {
319
+ const id = name.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '');
320
+ return `---
321
+ workflow:
322
+ id: ${id}
323
+ name: "${name}"
324
+ version: "1.0.0"
325
+ description: ""
326
+ author: ""
327
+ tags: []
328
+
329
+ inputs: {}
330
+
331
+ steps:
332
+ - id: step-1
333
+ name: "First Step"
334
+ action: http.request
335
+ inputs:
336
+ url: "https://api.example.com"
337
+ method: "GET"
338
+ output_variable: result
339
+ ---
340
+
341
+ # ${name}
342
+
343
+ Describe your workflow here.
344
+
345
+ ## Steps
346
+
347
+ ### Step 1: First Step
348
+
349
+ This step makes an HTTP request to the API.
350
+ `;
351
+ }
352
+ }
353
+ function extractWorkflowInfo(content, filename) {
354
+ const nameMatch = content.match(/name:\s*["']?(.+?)["']?\s*$/m);
355
+ const descMatch = content.match(/description:\s*["']?(.+?)["']?\s*$/m);
356
+ const versionMatch = content.match(/version:\s*["']?(.+?)["']?\s*$/m);
357
+ return {
358
+ name: nameMatch?.[1]?.trim() || filename.replace(/\.(md|yaml|yml)$/, '').replace(/-/g, ' '),
359
+ description: descMatch?.[1]?.trim(),
360
+ version: versionMatch?.[1]?.trim(),
361
+ };
362
+ }
363
+ //# sourceMappingURL=WorkflowService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowService.js","sourceRoot":"","sources":["../../../../src/server/services/WorkflowService.ts"],"names":[],"mappings":"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"}