@marktoflow/gui 2.0.0-alpha.1 → 2.0.0-alpha.13

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 (172) hide show
  1. package/README.md +49 -3
  2. package/dist/client/assets/index-CM44OayM.js +704 -0
  3. package/dist/client/assets/index-CM44OayM.js.map +1 -0
  4. package/dist/client/assets/index-Dru63gi6.css +1 -0
  5. package/dist/client/index.html +2 -2
  6. package/dist/server/index.js +93 -33
  7. package/dist/server/index.js.map +1 -1
  8. package/dist/server/routes/ai.js +38 -1
  9. package/dist/server/routes/ai.js.map +1 -1
  10. package/dist/server/routes/execute.js +23 -22
  11. package/dist/server/routes/execute.js.map +1 -1
  12. package/dist/server/routes/executions.js +125 -0
  13. package/dist/server/routes/executions.js.map +1 -0
  14. package/dist/server/{server/routes → routes}/tools.js +406 -0
  15. package/dist/server/{server/routes → routes}/tools.js.map +1 -1
  16. package/dist/server/routes/workflows.js +41 -5
  17. package/dist/server/routes/workflows.js.map +1 -1
  18. package/dist/server/services/AIService.js +55 -202
  19. package/dist/server/services/AIService.js.map +1 -1
  20. package/dist/server/services/FileWatcher.js +0 -2
  21. package/dist/server/services/FileWatcher.js.map +1 -1
  22. package/dist/server/services/WorkflowService.js +199 -16
  23. package/dist/server/services/WorkflowService.js.map +1 -1
  24. package/dist/server/services/agents/codex-provider.js +270 -0
  25. package/dist/server/services/agents/codex-provider.js.map +1 -0
  26. package/dist/server/{server/services → services}/agents/prompts.js +27 -0
  27. package/dist/server/services/agents/prompts.js.map +1 -0
  28. package/dist/server/{server/services → services}/agents/registry.js +20 -0
  29. package/dist/server/services/agents/registry.js.map +1 -0
  30. package/dist/server/websocket/index.js +12 -0
  31. package/dist/server/websocket/index.js.map +1 -1
  32. package/package.json +19 -7
  33. package/scripts/flatten-dist.js +69 -0
  34. package/.turbo/turbo-build.log +0 -26
  35. package/.turbo/turbo-test.log +0 -22
  36. package/dist/client/assets/index-DwTI8opO.js +0 -608
  37. package/dist/client/assets/index-DwTI8opO.js.map +0 -1
  38. package/dist/client/assets/index-RoEdL6gO.css +0 -1
  39. package/dist/server/index.d.ts +0 -3
  40. package/dist/server/index.d.ts.map +0 -1
  41. package/dist/server/server/index.js +0 -95
  42. package/dist/server/server/index.js.map +0 -1
  43. package/dist/server/server/routes/ai.js +0 -87
  44. package/dist/server/server/routes/ai.js.map +0 -1
  45. package/dist/server/server/routes/execute.js +0 -63
  46. package/dist/server/server/routes/execute.js.map +0 -1
  47. package/dist/server/server/routes/workflows.js +0 -99
  48. package/dist/server/server/routes/workflows.js.map +0 -1
  49. package/dist/server/server/services/AIService.js +0 -69
  50. package/dist/server/server/services/AIService.js.map +0 -1
  51. package/dist/server/server/services/FileWatcher.js +0 -60
  52. package/dist/server/server/services/FileWatcher.js.map +0 -1
  53. package/dist/server/server/services/WorkflowService.js +0 -363
  54. package/dist/server/server/services/WorkflowService.js.map +0 -1
  55. package/dist/server/server/services/agents/prompts.js.map +0 -1
  56. package/dist/server/server/services/agents/registry.js.map +0 -1
  57. package/dist/server/server/websocket/index.js +0 -85
  58. package/dist/server/server/websocket/index.js.map +0 -1
  59. package/dist/server/services/AIService.d.ts +0 -30
  60. package/dist/server/services/AIService.d.ts.map +0 -1
  61. package/dist/server/services/FileWatcher.d.ts +0 -10
  62. package/dist/server/services/FileWatcher.d.ts.map +0 -1
  63. package/dist/server/services/WorkflowService.d.ts +0 -54
  64. package/dist/server/services/WorkflowService.d.ts.map +0 -1
  65. package/dist/server/websocket/index.d.ts +0 -10
  66. package/dist/server/websocket/index.d.ts.map +0 -1
  67. package/playwright.config.ts +0 -27
  68. package/postcss.config.js +0 -6
  69. package/src/client/App.tsx +0 -520
  70. package/src/client/components/Canvas/Canvas.tsx +0 -405
  71. package/src/client/components/Canvas/ExecutionOverlay.tsx +0 -847
  72. package/src/client/components/Canvas/NodeContextMenu.tsx +0 -188
  73. package/src/client/components/Canvas/OutputNode.tsx +0 -111
  74. package/src/client/components/Canvas/StepNode.tsx +0 -106
  75. package/src/client/components/Canvas/SubWorkflowNode.tsx +0 -141
  76. package/src/client/components/Canvas/Toolbar.tsx +0 -189
  77. package/src/client/components/Canvas/TriggerNode.tsx +0 -128
  78. package/src/client/components/Editor/InputsEditor.tsx +0 -458
  79. package/src/client/components/Editor/NewStepWizard.tsx +0 -344
  80. package/src/client/components/Editor/StepEditor.tsx +0 -532
  81. package/src/client/components/Editor/YamlEditor.tsx +0 -160
  82. package/src/client/components/Panels/PropertiesPanel.tsx +0 -589
  83. package/src/client/components/Prompt/ChangePreview.tsx +0 -281
  84. package/src/client/components/Prompt/PromptHistoryPanel.tsx +0 -209
  85. package/src/client/components/Prompt/PromptInput.tsx +0 -108
  86. package/src/client/components/Sidebar/Sidebar.tsx +0 -343
  87. package/src/client/components/common/Breadcrumb.tsx +0 -40
  88. package/src/client/components/common/Button.tsx +0 -68
  89. package/src/client/components/common/ContextMenu.tsx +0 -202
  90. package/src/client/components/common/KeyboardShortcuts.tsx +0 -143
  91. package/src/client/components/common/Modal.tsx +0 -93
  92. package/src/client/components/common/Tabs.tsx +0 -57
  93. package/src/client/components/common/ThemeToggle.tsx +0 -63
  94. package/src/client/components/index.ts +0 -32
  95. package/src/client/hooks/index.ts +0 -4
  96. package/src/client/hooks/useAIPrompt.ts +0 -108
  97. package/src/client/hooks/useCanvas.ts +0 -247
  98. package/src/client/hooks/useWebSocket.ts +0 -164
  99. package/src/client/hooks/useWorkflow.ts +0 -138
  100. package/src/client/main.tsx +0 -10
  101. package/src/client/stores/canvasStore.ts +0 -348
  102. package/src/client/stores/editorStore.ts +0 -133
  103. package/src/client/stores/executionStore.ts +0 -440
  104. package/src/client/stores/index.ts +0 -4
  105. package/src/client/stores/layoutStore.ts +0 -103
  106. package/src/client/stores/navigationStore.ts +0 -49
  107. package/src/client/stores/promptStore.ts +0 -113
  108. package/src/client/stores/themeStore.ts +0 -75
  109. package/src/client/stores/workflowStore.ts +0 -177
  110. package/src/client/styles/globals.css +0 -346
  111. package/src/client/utils/cn.ts +0 -9
  112. package/src/client/utils/index.ts +0 -4
  113. package/src/client/utils/serviceIcons.tsx +0 -64
  114. package/src/client/utils/stepValidation.ts +0 -155
  115. package/src/client/utils/workflowToGraph.ts +0 -299
  116. package/src/server/index.ts +0 -114
  117. package/src/server/routes/ai.ts +0 -91
  118. package/src/server/routes/execute.ts +0 -71
  119. package/src/server/routes/tools.ts +0 -564
  120. package/src/server/routes/workflows.ts +0 -106
  121. package/src/server/services/AIService.ts +0 -105
  122. package/src/server/services/FileWatcher.ts +0 -69
  123. package/src/server/services/WorkflowService.ts +0 -441
  124. package/src/server/services/agents/claude-code-provider.ts +0 -320
  125. package/src/server/services/agents/claude-provider.ts +0 -248
  126. package/src/server/services/agents/copilot-provider.ts +0 -311
  127. package/src/server/services/agents/demo-provider.ts +0 -184
  128. package/src/server/services/agents/index.ts +0 -31
  129. package/src/server/services/agents/ollama-provider.ts +0 -267
  130. package/src/server/services/agents/prompts.ts +0 -482
  131. package/src/server/services/agents/registry.ts +0 -289
  132. package/src/server/services/agents/types.ts +0 -146
  133. package/src/server/websocket/index.ts +0 -104
  134. package/src/shared/constants.ts +0 -180
  135. package/src/shared/types.ts +0 -179
  136. package/tailwind.config.ts +0 -73
  137. package/tests/e2e/app.spec.ts +0 -90
  138. package/tests/e2e/canvas.spec.ts +0 -128
  139. package/tests/e2e/workflow.spec.ts +0 -185
  140. package/tests/integration/api.test.ts +0 -250
  141. package/tests/integration/testApp.ts +0 -31
  142. package/tests/setup.ts +0 -37
  143. package/tests/unit/canvasStore.test.ts +0 -502
  144. package/tests/unit/components.test.tsx +0 -151
  145. package/tests/unit/executionStore.test.ts +0 -527
  146. package/tests/unit/layoutStore.test.ts +0 -194
  147. package/tests/unit/navigationStore.test.ts +0 -152
  148. package/tests/unit/stepValidation.test.ts +0 -226
  149. package/tests/unit/themeStore.test.ts +0 -141
  150. package/tests/unit/workflowToGraph.test.ts +0 -289
  151. package/tsconfig.json +0 -29
  152. package/tsconfig.server.json +0 -28
  153. package/vite.config.ts +0 -31
  154. package/vitest.config.ts +0 -26
  155. /package/dist/server/{server/services → services}/agents/claude-code-provider.js +0 -0
  156. /package/dist/server/{server/services → services}/agents/claude-code-provider.js.map +0 -0
  157. /package/dist/server/{server/services → services}/agents/claude-provider.js +0 -0
  158. /package/dist/server/{server/services → services}/agents/claude-provider.js.map +0 -0
  159. /package/dist/server/{server/services → services}/agents/copilot-provider.js +0 -0
  160. /package/dist/server/{server/services → services}/agents/copilot-provider.js.map +0 -0
  161. /package/dist/server/{server/services → services}/agents/demo-provider.js +0 -0
  162. /package/dist/server/{server/services → services}/agents/demo-provider.js.map +0 -0
  163. /package/dist/server/{server/services → services}/agents/index.js +0 -0
  164. /package/dist/server/{server/services → services}/agents/index.js.map +0 -0
  165. /package/dist/server/{server/services → services}/agents/ollama-provider.js +0 -0
  166. /package/dist/server/{server/services → services}/agents/ollama-provider.js.map +0 -0
  167. /package/dist/server/{server/services → services}/agents/types.js +0 -0
  168. /package/dist/server/{server/services → services}/agents/types.js.map +0 -0
  169. /package/dist/{server/shared → shared}/constants.js +0 -0
  170. /package/dist/{server/shared → shared}/constants.js.map +0 -0
  171. /package/dist/{server/shared → shared}/types.js +0 -0
  172. /package/dist/{server/shared → shared}/types.js.map +0 -0
@@ -1,250 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import request from 'supertest';
3
- import { createTestApp } from './testApp.js';
4
-
5
- const app = createTestApp();
6
-
7
- describe('API Integration Tests', () => {
8
- describe('GET /api/health', () => {
9
- it('should return health status', async () => {
10
- const response = await request(app).get('/api/health');
11
-
12
- expect(response.status).toBe(200);
13
- expect(response.body).toEqual({
14
- status: 'ok',
15
- version: '2.0.0-alpha.1',
16
- });
17
- });
18
- });
19
-
20
- describe('Tools API', () => {
21
- describe('GET /api/tools', () => {
22
- it('should return list of available tools', async () => {
23
- const response = await request(app).get('/api/tools');
24
-
25
- expect(response.status).toBe(200);
26
- expect(response.body).toHaveProperty('tools');
27
- expect(Array.isArray(response.body.tools)).toBe(true);
28
- expect(response.body.tools.length).toBeGreaterThan(0);
29
- });
30
-
31
- it('should include expected tool properties', async () => {
32
- const response = await request(app).get('/api/tools');
33
- const tool = response.body.tools[0];
34
-
35
- expect(tool).toHaveProperty('id');
36
- expect(tool).toHaveProperty('name');
37
- expect(tool).toHaveProperty('icon');
38
- expect(tool).toHaveProperty('category');
39
- expect(tool).toHaveProperty('description');
40
- expect(tool).toHaveProperty('actionCount');
41
- });
42
-
43
- it('should include slack tool', async () => {
44
- const response = await request(app).get('/api/tools');
45
- const slackTool = response.body.tools.find((t: { id: string }) => t.id === 'slack');
46
-
47
- expect(slackTool).toBeDefined();
48
- expect(slackTool.name).toBe('Slack');
49
- expect(slackTool.sdk).toBe('@slack/web-api');
50
- });
51
-
52
- it('should include github tool', async () => {
53
- const response = await request(app).get('/api/tools');
54
- const githubTool = response.body.tools.find((t: { id: string }) => t.id === 'github');
55
-
56
- expect(githubTool).toBeDefined();
57
- expect(githubTool.name).toBe('GitHub');
58
- expect(githubTool.sdk).toBe('@octokit/rest');
59
- });
60
- });
61
-
62
- describe('GET /api/tools/:toolId', () => {
63
- it('should return tool details', async () => {
64
- const response = await request(app).get('/api/tools/slack');
65
-
66
- expect(response.status).toBe(200);
67
- expect(response.body).toHaveProperty('tool');
68
- expect(response.body.tool.id).toBe('slack');
69
- expect(response.body.tool.actions).toBeDefined();
70
- expect(Array.isArray(response.body.tool.actions)).toBe(true);
71
- });
72
-
73
- it('should include action details', async () => {
74
- const response = await request(app).get('/api/tools/slack');
75
- const actions = response.body.tool.actions;
76
-
77
- expect(actions.length).toBeGreaterThan(0);
78
-
79
- const postMessage = actions.find((a: { id: string }) => a.id === 'chat.postMessage');
80
- expect(postMessage).toBeDefined();
81
- expect(postMessage.name).toBe('Post Message');
82
- expect(postMessage.inputs).toBeDefined();
83
- expect(postMessage.output).toBeDefined();
84
- });
85
-
86
- it('should return 404 for unknown tool', async () => {
87
- const response = await request(app).get('/api/tools/unknown-tool');
88
-
89
- expect(response.status).toBe(404);
90
- expect(response.body.error).toBe('Tool not found');
91
- });
92
- });
93
-
94
- describe('GET /api/tools/:toolId/actions/:actionId', () => {
95
- it('should return action details', async () => {
96
- const response = await request(app).get('/api/tools/github/actions/pulls.get');
97
-
98
- expect(response.status).toBe(200);
99
- expect(response.body).toHaveProperty('action');
100
- expect(response.body.action.id).toBe('pulls.get');
101
- expect(response.body.action.name).toBe('Get Pull Request');
102
- expect(response.body.action.inputs).toBeDefined();
103
- });
104
-
105
- it('should include tool info in response', async () => {
106
- const response = await request(app).get('/api/tools/github/actions/pulls.get');
107
-
108
- expect(response.body).toHaveProperty('tool');
109
- expect(response.body.tool.id).toBe('github');
110
- expect(response.body.tool.name).toBe('GitHub');
111
- });
112
-
113
- it('should return 404 for unknown action', async () => {
114
- const response = await request(app).get('/api/tools/slack/actions/unknown-action');
115
-
116
- expect(response.status).toBe(404);
117
- expect(response.body.error).toBe('Action not found');
118
- });
119
-
120
- it('should return 404 for unknown tool', async () => {
121
- const response = await request(app).get('/api/tools/unknown/actions/any');
122
-
123
- expect(response.status).toBe(404);
124
- expect(response.body.error).toBe('Tool not found');
125
- });
126
- });
127
- });
128
-
129
- describe('Execute API', () => {
130
- describe('POST /api/execute/:path', () => {
131
- it('should start workflow execution', async () => {
132
- const response = await request(app)
133
- .post('/api/execute/test-workflow.md')
134
- .send({ inputs: { foo: 'bar' } });
135
-
136
- expect(response.status).toBe(200);
137
- expect(response.body).toHaveProperty('runId');
138
- expect(response.body).toHaveProperty('status', 'started');
139
- // The workflowPath is decoded from URL params
140
- expect(response.body.workflowPath).toBeDefined();
141
- });
142
-
143
- it('should support dry run mode', async () => {
144
- const response = await request(app)
145
- .post('/api/execute/test-workflow.md')
146
- .send({ inputs: {}, dryRun: true });
147
-
148
- expect(response.status).toBe(200);
149
- expect(response.body.dryRun).toBe(true);
150
- });
151
- });
152
-
153
- describe('GET /api/execute/status/:runId', () => {
154
- it('should return execution status', async () => {
155
- const response = await request(app).get('/api/execute/status/run-123');
156
-
157
- expect(response.status).toBe(200);
158
- expect(response.body).toHaveProperty('runId', 'run-123');
159
- expect(response.body).toHaveProperty('status');
160
- });
161
- });
162
-
163
- describe('POST /api/execute/cancel/:runId', () => {
164
- it('should cancel execution', async () => {
165
- const response = await request(app).post('/api/execute/cancel/run-123');
166
-
167
- expect(response.status).toBe(200);
168
- expect(response.body).toHaveProperty('runId', 'run-123');
169
- expect(response.body).toHaveProperty('status', 'cancelled');
170
- });
171
- });
172
- });
173
-
174
- describe('Workflows API', () => {
175
- describe('GET /api/workflows', () => {
176
- it('should return list of workflows', async () => {
177
- const response = await request(app).get('/api/workflows');
178
-
179
- expect(response.status).toBe(200);
180
- expect(response.body).toHaveProperty('workflows');
181
- expect(Array.isArray(response.body.workflows)).toBe(true);
182
- });
183
- });
184
-
185
- describe('POST /api/workflows', () => {
186
- it('should require name parameter', async () => {
187
- const response = await request(app)
188
- .post('/api/workflows')
189
- .send({});
190
-
191
- expect(response.status).toBe(400);
192
- expect(response.body.error).toBe('Name is required');
193
- });
194
- });
195
-
196
- describe('PUT /api/workflows/:path', () => {
197
- it('should require workflow data', async () => {
198
- const response = await request(app)
199
- .put('/api/workflows/test.md')
200
- .send({});
201
-
202
- expect(response.status).toBe(400);
203
- expect(response.body.error).toBe('Workflow data is required');
204
- });
205
- });
206
- });
207
-
208
- describe('AI API', () => {
209
- describe('POST /api/ai/prompt', () => {
210
- it('should require prompt parameter', async () => {
211
- const response = await request(app)
212
- .post('/api/ai/prompt')
213
- .send({});
214
-
215
- expect(response.status).toBe(400);
216
- expect(response.body.error).toBe('Prompt is required');
217
- });
218
-
219
- it('should handle missing workflow gracefully', async () => {
220
- const response = await request(app)
221
- .post('/api/ai/prompt')
222
- .send({ prompt: 'Add a step' });
223
-
224
- // Service handles missing workflow, may return error
225
- expect([200, 500]).toContain(response.status);
226
- });
227
- });
228
-
229
- describe('GET /api/ai/history', () => {
230
- it('should return prompt history', async () => {
231
- const response = await request(app).get('/api/ai/history');
232
-
233
- expect(response.status).toBe(200);
234
- expect(response.body).toHaveProperty('history');
235
- expect(Array.isArray(response.body.history)).toBe(true);
236
- });
237
- });
238
-
239
- describe('POST /api/ai/suggestions', () => {
240
- it('should return suggestions for workflow', async () => {
241
- const response = await request(app)
242
- .post('/api/ai/suggestions')
243
- .send({ workflow: { steps: [] } });
244
-
245
- expect(response.status).toBe(200);
246
- expect(response.body).toHaveProperty('suggestions');
247
- });
248
- });
249
- });
250
- });
@@ -1,31 +0,0 @@
1
- import express, { type Express } from 'express';
2
- import cors from 'cors';
3
- import { workflowRoutes } from '../../src/server/routes/workflows.js';
4
- import { aiRoutes } from '../../src/server/routes/ai.js';
5
- import { executeRoutes } from '../../src/server/routes/execute.js';
6
- import { toolsRoutes } from '../../src/server/routes/tools.js';
7
-
8
- /**
9
- * Create a test Express app with all routes configured
10
- * This allows testing the API without starting an actual server
11
- */
12
- export function createTestApp(): Express {
13
- const app = express();
14
-
15
- // Middleware
16
- app.use(cors());
17
- app.use(express.json());
18
-
19
- // Routes
20
- app.use('/api/workflows', workflowRoutes);
21
- app.use('/api/ai', aiRoutes);
22
- app.use('/api/execute', executeRoutes);
23
- app.use('/api/tools', toolsRoutes);
24
-
25
- // Health check
26
- app.get('/api/health', (_req, res) => {
27
- res.json({ status: 'ok', version: '2.0.0-alpha.1' });
28
- });
29
-
30
- return app;
31
- }
package/tests/setup.ts DELETED
@@ -1,37 +0,0 @@
1
- import '@testing-library/jest-dom';
2
- import { vi } from 'vitest';
3
-
4
- // Mock window.matchMedia
5
- Object.defineProperty(window, 'matchMedia', {
6
- writable: true,
7
- value: vi.fn().mockImplementation((query: string) => ({
8
- matches: false,
9
- media: query,
10
- onchange: null,
11
- addListener: vi.fn(),
12
- removeListener: vi.fn(),
13
- addEventListener: vi.fn(),
14
- removeEventListener: vi.fn(),
15
- dispatchEvent: vi.fn(),
16
- })),
17
- });
18
-
19
- // Mock ResizeObserver
20
- global.ResizeObserver = vi.fn().mockImplementation(() => ({
21
- observe: vi.fn(),
22
- unobserve: vi.fn(),
23
- disconnect: vi.fn(),
24
- }));
25
-
26
- // Mock IntersectionObserver
27
- global.IntersectionObserver = vi.fn().mockImplementation(() => ({
28
- observe: vi.fn(),
29
- unobserve: vi.fn(),
30
- disconnect: vi.fn(),
31
- root: null,
32
- rootMargin: '',
33
- thresholds: [],
34
- }));
35
-
36
- // Suppress console errors during tests (optional)
37
- vi.spyOn(console, 'error').mockImplementation(() => {});