@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,220 @@
1
+ /**
2
+ * Ollama AI agent provider
3
+ * Uses local Ollama instance for AI capabilities
4
+ */
5
+ import { stringify as yamlStringify, parse as yamlParse } from 'yaml';
6
+ const SYSTEM_PROMPT = `You are an expert workflow automation assistant. Help users modify their workflows.
7
+
8
+ When modifying workflows:
9
+ - Each step has: id, name, action, inputs, output_variable
10
+ - Actions use format: service.method (e.g., slack.chat.postMessage)
11
+ - Template variables use: {{ variable_name }} syntax
12
+
13
+ Respond with:
14
+ 1. A brief explanation of changes
15
+ 2. The complete modified workflow in YAML format between \`\`\`yaml and \`\`\``;
16
+ export class OllamaProvider {
17
+ id = 'ollama';
18
+ name = 'Ollama (Local)';
19
+ capabilities = {
20
+ streaming: true,
21
+ toolUse: false,
22
+ codeExecution: false,
23
+ systemPrompts: true,
24
+ models: [
25
+ 'llama3.2',
26
+ 'llama3.1',
27
+ 'codellama',
28
+ 'mistral',
29
+ 'mixtral',
30
+ 'phi3',
31
+ 'gemma2',
32
+ ],
33
+ };
34
+ baseUrl = 'http://localhost:11434';
35
+ model = 'llama3.2';
36
+ ready = false;
37
+ error;
38
+ async initialize(config) {
39
+ try {
40
+ if (config.baseUrl) {
41
+ this.baseUrl = config.baseUrl;
42
+ }
43
+ if (config.model) {
44
+ this.model = config.model;
45
+ }
46
+ // Check if Ollama is available
47
+ const response = await fetch(`${this.baseUrl}/api/tags`, {
48
+ method: 'GET',
49
+ signal: AbortSignal.timeout(5000),
50
+ });
51
+ if (response.ok) {
52
+ this.ready = true;
53
+ this.error = undefined;
54
+ }
55
+ else {
56
+ this.ready = false;
57
+ this.error = 'Ollama server returned an error';
58
+ }
59
+ }
60
+ catch (err) {
61
+ this.ready = false;
62
+ this.error = `Cannot connect to Ollama at ${this.baseUrl}. Is Ollama running?`;
63
+ }
64
+ }
65
+ isReady() {
66
+ return this.ready;
67
+ }
68
+ getStatus() {
69
+ return {
70
+ ready: this.ready,
71
+ model: this.model,
72
+ error: this.error,
73
+ };
74
+ }
75
+ async processPrompt(prompt, workflow) {
76
+ if (!this.ready) {
77
+ return {
78
+ explanation: 'Ollama is not available. Please ensure Ollama is running.',
79
+ error: this.error,
80
+ };
81
+ }
82
+ try {
83
+ const workflowYaml = yamlStringify(workflow, { indent: 2, lineWidth: 0 });
84
+ const response = await fetch(`${this.baseUrl}/api/generate`, {
85
+ method: 'POST',
86
+ headers: { 'Content-Type': 'application/json' },
87
+ body: JSON.stringify({
88
+ model: this.model,
89
+ prompt: `${SYSTEM_PROMPT}\n\nCurrent workflow:\n\`\`\`yaml\n${workflowYaml}\n\`\`\`\n\nUser request: ${prompt}`,
90
+ stream: false,
91
+ }),
92
+ });
93
+ if (!response.ok) {
94
+ throw new Error(`Ollama API error: ${response.status}`);
95
+ }
96
+ const data = (await response.json());
97
+ return this.parseAIResponse(data.response, workflow);
98
+ }
99
+ catch (err) {
100
+ return {
101
+ explanation: '',
102
+ error: err instanceof Error ? err.message : 'Unknown error',
103
+ };
104
+ }
105
+ }
106
+ async getSuggestions(workflow, selectedStepId) {
107
+ const suggestions = [];
108
+ if (!workflow || !workflow.steps) {
109
+ return [
110
+ 'Add your first step',
111
+ 'Create a simple workflow',
112
+ 'Add an HTTP request',
113
+ ];
114
+ }
115
+ suggestions.push('Add error handling', 'Add a notification step', 'Simplify the workflow');
116
+ if (selectedStepId) {
117
+ const step = workflow.steps.find((s) => s.id === selectedStepId);
118
+ if (step) {
119
+ suggestions.push(`Improve "${step.name || step.id}"`, `Add validation to "${step.name || step.id}"`);
120
+ }
121
+ }
122
+ return suggestions.slice(0, 5);
123
+ }
124
+ async streamPrompt(prompt, workflow, onChunk) {
125
+ if (!this.ready) {
126
+ return this.processPrompt(prompt, workflow);
127
+ }
128
+ const workflowYaml = yamlStringify(workflow, { indent: 2, lineWidth: 0 });
129
+ let fullResponse = '';
130
+ try {
131
+ const response = await fetch(`${this.baseUrl}/api/generate`, {
132
+ method: 'POST',
133
+ headers: { 'Content-Type': 'application/json' },
134
+ body: JSON.stringify({
135
+ model: this.model,
136
+ prompt: `${SYSTEM_PROMPT}\n\nCurrent workflow:\n\`\`\`yaml\n${workflowYaml}\n\`\`\`\n\nUser request: ${prompt}`,
137
+ stream: true,
138
+ }),
139
+ });
140
+ if (!response.ok || !response.body) {
141
+ throw new Error(`Ollama API error: ${response.status}`);
142
+ }
143
+ const reader = response.body.getReader();
144
+ const decoder = new TextDecoder();
145
+ while (true) {
146
+ const { done, value } = await reader.read();
147
+ if (done)
148
+ break;
149
+ const chunk = decoder.decode(value);
150
+ const lines = chunk.split('\n').filter(Boolean);
151
+ for (const line of lines) {
152
+ try {
153
+ const data = JSON.parse(line);
154
+ if (data.response) {
155
+ fullResponse += data.response;
156
+ onChunk(data.response);
157
+ }
158
+ }
159
+ catch {
160
+ // Skip invalid JSON
161
+ }
162
+ }
163
+ }
164
+ return this.parseAIResponse(fullResponse, workflow);
165
+ }
166
+ catch (err) {
167
+ return {
168
+ explanation: '',
169
+ error: err instanceof Error ? err.message : 'Unknown error',
170
+ };
171
+ }
172
+ }
173
+ parseAIResponse(responseText, originalWorkflow) {
174
+ const yamlMatch = responseText.match(/```yaml\n([\s\S]*?)\n```/);
175
+ let modifiedWorkflow;
176
+ let explanation = responseText;
177
+ if (yamlMatch) {
178
+ try {
179
+ const parsedYaml = yamlParse(yamlMatch[1]);
180
+ if (parsedYaml && (parsedYaml.steps || parsedYaml.metadata)) {
181
+ modifiedWorkflow = parsedYaml;
182
+ const explanationMatch = responseText.match(/^([\s\S]*?)```yaml/);
183
+ if (explanationMatch) {
184
+ explanation = explanationMatch[1].trim();
185
+ }
186
+ }
187
+ }
188
+ catch {
189
+ // Failed to parse YAML
190
+ }
191
+ }
192
+ let diff;
193
+ if (modifiedWorkflow) {
194
+ diff = this.generateDiff(originalWorkflow, modifiedWorkflow);
195
+ }
196
+ return { explanation, workflow: modifiedWorkflow, diff };
197
+ }
198
+ generateDiff(original, modified) {
199
+ const originalStepIds = new Set(original.steps?.map((s) => s.id) || []);
200
+ const modifiedStepIds = new Set(modified.steps?.map((s) => s.id) || []);
201
+ const added = modified.steps?.filter((s) => !originalStepIds.has(s.id)) || [];
202
+ const removed = original.steps?.filter((s) => !modifiedStepIds.has(s.id)) || [];
203
+ let diff = '';
204
+ if (added.length > 0) {
205
+ diff += `+ Added ${added.length} step(s)\n`;
206
+ }
207
+ if (removed.length > 0) {
208
+ diff += `- Removed ${removed.length} step(s)\n`;
209
+ }
210
+ return diff || 'No structural changes';
211
+ }
212
+ }
213
+ export function createOllamaProvider(config) {
214
+ const provider = new OllamaProvider();
215
+ if (config) {
216
+ provider.initialize(config);
217
+ }
218
+ return provider;
219
+ }
220
+ //# sourceMappingURL=ollama-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-provider.js","sourceRoot":"","sources":["../../../../../src/server/services/agents/ollama-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,436 @@
1
+ /**
2
+ * Prompt Engineering Module for Workflow Modifications
3
+ *
4
+ * This module provides context-aware prompts for different workflow operations:
5
+ * - Adding/removing steps
6
+ * - Modifying step inputs
7
+ * - Adding error handling
8
+ * - Creating sub-workflows
9
+ * - Adding conditions
10
+ */
11
+ // Available service integrations with their SDK mappings
12
+ export const AVAILABLE_SERVICES = {
13
+ slack: {
14
+ sdk: '@slack/web-api',
15
+ description: 'Slack messaging and workspace management',
16
+ commonActions: [
17
+ 'chat.postMessage',
18
+ 'chat.update',
19
+ 'chat.delete',
20
+ 'conversations.list',
21
+ 'conversations.history',
22
+ 'users.list',
23
+ 'files.upload',
24
+ 'reactions.add',
25
+ ],
26
+ },
27
+ github: {
28
+ sdk: '@octokit/rest',
29
+ description: 'GitHub repository, issues, and PR management',
30
+ commonActions: [
31
+ 'pulls.get',
32
+ 'pulls.create',
33
+ 'pulls.list',
34
+ 'issues.create',
35
+ 'issues.update',
36
+ 'issues.list',
37
+ 'repos.getContent',
38
+ 'repos.createRelease',
39
+ ],
40
+ },
41
+ jira: {
42
+ sdk: 'jira.js',
43
+ description: 'Jira issue and project tracking',
44
+ commonActions: [
45
+ 'issues.createIssue',
46
+ 'issues.updateIssue',
47
+ 'issues.getIssue',
48
+ 'issues.searchJql',
49
+ 'projects.getProject',
50
+ 'transitions.transitionIssue',
51
+ ],
52
+ },
53
+ gmail: {
54
+ sdk: 'googleapis',
55
+ description: 'Gmail email sending and management',
56
+ commonActions: [
57
+ 'users.messages.send',
58
+ 'users.messages.list',
59
+ 'users.messages.get',
60
+ 'users.labels.list',
61
+ 'users.drafts.create',
62
+ ],
63
+ },
64
+ outlook: {
65
+ sdk: '@microsoft/microsoft-graph-client',
66
+ description: 'Microsoft Outlook email and calendar',
67
+ commonActions: [
68
+ 'mail.sendMail',
69
+ 'mail.listMessages',
70
+ 'calendar.createEvent',
71
+ 'calendar.listEvents',
72
+ ],
73
+ },
74
+ linear: {
75
+ sdk: '@linear/sdk',
76
+ description: 'Linear issue tracking and project management',
77
+ commonActions: [
78
+ 'issues.create',
79
+ 'issues.update',
80
+ 'issues.archive',
81
+ 'projects.list',
82
+ 'cycles.list',
83
+ ],
84
+ },
85
+ notion: {
86
+ sdk: '@notionhq/client',
87
+ description: 'Notion pages and databases',
88
+ commonActions: [
89
+ 'pages.create',
90
+ 'pages.update',
91
+ 'databases.query',
92
+ 'blocks.children.append',
93
+ ],
94
+ },
95
+ discord: {
96
+ sdk: 'discord.js',
97
+ description: 'Discord messaging and server management',
98
+ commonActions: [
99
+ 'channels.send',
100
+ 'channels.createWebhook',
101
+ 'guilds.members.fetch',
102
+ ],
103
+ },
104
+ airtable: {
105
+ sdk: 'airtable',
106
+ description: 'Airtable database and records',
107
+ commonActions: [
108
+ 'tables.list',
109
+ 'records.create',
110
+ 'records.update',
111
+ 'records.list',
112
+ ],
113
+ },
114
+ confluence: {
115
+ sdk: 'confluence.js',
116
+ description: 'Atlassian Confluence wiki pages',
117
+ commonActions: [
118
+ 'content.getContent',
119
+ 'content.createContent',
120
+ 'content.updateContent',
121
+ 'space.getSpaces',
122
+ ],
123
+ },
124
+ http: {
125
+ sdk: 'built-in',
126
+ description: 'Generic HTTP requests to any API',
127
+ commonActions: ['request', 'get', 'post', 'put', 'delete'],
128
+ },
129
+ claude: {
130
+ sdk: '@anthropic-ai/sdk',
131
+ description: 'Claude AI for text generation and analysis',
132
+ commonActions: ['messages.create', 'completions.create'],
133
+ },
134
+ opencode: {
135
+ sdk: '@anthropic-ai/claude-agent-sdk',
136
+ description: 'OpenCode for code generation and analysis',
137
+ commonActions: ['generate', 'analyze', 'refactor'],
138
+ },
139
+ ollama: {
140
+ sdk: 'ollama',
141
+ description: 'Local Ollama LLM for AI tasks',
142
+ commonActions: ['generate', 'chat', 'embeddings'],
143
+ },
144
+ };
145
+ // Base system prompt with comprehensive context
146
+ export const BASE_SYSTEM_PROMPT = `You are an expert workflow automation assistant for Marktoflow, a markdown-based workflow automation framework.
147
+
148
+ ## Your Role
149
+ Help users modify their workflows based on natural language requests. You must:
150
+ 1. Understand the current workflow structure
151
+ 2. Make precise modifications based on user requests
152
+ 3. Explain what changes you made and why
153
+ 4. Return valid YAML that can be parsed
154
+
155
+ ## Workflow Structure
156
+
157
+ A workflow consists of:
158
+ - **metadata**: name, description, version, author, tags
159
+ - **inputs**: declared input variables with types and defaults
160
+ - **tools**: service SDK configurations with authentication
161
+ - **steps**: array of actions to execute
162
+
163
+ ### Step Structure
164
+ \`\`\`yaml
165
+ - id: unique-step-id # Required: kebab-case identifier
166
+ name: "Human Readable Name" # Optional: display name
167
+ action: service.method # Required: SDK method to call
168
+ inputs: # Required: method parameters
169
+ param1: value
170
+ param2: "{{ variable }}" # Template variables
171
+ output_variable: result_name # Optional: store output
172
+ conditions: # Optional: when to run
173
+ - "{{ previous_step.success }}"
174
+ errorHandling: # Optional: error handling
175
+ action: retry # stop | continue | retry
176
+ maxRetries: 3
177
+ \`\`\`
178
+
179
+ ### Template Variables
180
+ - Access inputs: \`{{ inputs.variable_name }}\`
181
+ - Access step outputs: \`{{ step_id.field }}\` or \`{{ output_variable.field }}\`
182
+ - JavaScript expressions: \`{{ inputs.count > 10 ? "many" : "few" }}\`
183
+
184
+ ### Available Services
185
+ ${Object.entries(AVAILABLE_SERVICES)
186
+ .map(([name, info]) => `- **${name}**: ${info.description} (SDK: ${info.sdk})`)
187
+ .join('\n')}
188
+
189
+ ## Response Format
190
+
191
+ Always respond with:
192
+ 1. A brief explanation (1-3 sentences) of what you changed
193
+ 2. The complete modified workflow in a YAML code block
194
+
195
+ \`\`\`yaml
196
+ # Your modified workflow here
197
+ \`\`\`
198
+
199
+ ## Important Guidelines
200
+ - Only make the changes requested - don't "improve" other parts
201
+ - Preserve existing step IDs unless explicitly asked to rename
202
+ - Generate unique IDs for new steps (use kebab-case)
203
+ - Ensure all YAML is valid and properly indented
204
+ - Keep the same workflow structure (don't remove required sections)
205
+ `;
206
+ // Operation-specific prompts for different modification types
207
+ export const OPERATION_PROMPTS = {
208
+ addStep: `
209
+ ## Adding Steps
210
+ When adding a new step:
211
+ 1. Generate a unique, descriptive kebab-case ID (e.g., "send-slack-notification")
212
+ 2. Add a human-readable name
213
+ 3. Use the correct action format: service.method
214
+ 4. Include all required inputs for the action
215
+ 5. Consider adding an output_variable if the result will be used later
216
+ 6. Place the step at a logical position in the workflow
217
+
218
+ Common step patterns:
219
+ - Notifications: slack.chat.postMessage, gmail.users.messages.send
220
+ - API calls: http.request, github.pulls.get
221
+ - Data processing: Transform data between steps
222
+ `,
223
+ removeStep: `
224
+ ## Removing Steps
225
+ When removing a step:
226
+ 1. Remove the entire step block from the steps array
227
+ 2. Check if other steps reference this step's output_variable
228
+ 3. If references exist, either:
229
+ - Update those references to use a different source
230
+ - Warn the user about broken references
231
+ 4. Preserve the workflow structure and other steps
232
+ `,
233
+ modifyInputs: `
234
+ ## Modifying Step Inputs
235
+ When modifying inputs:
236
+ 1. Only change the specified inputs
237
+ 2. Preserve other inputs unless asked to remove them
238
+ 3. Use template variables for dynamic values: {{ variable }}
239
+ 4. Ensure the value type matches what the action expects
240
+ 5. Consider adding validation or error handling if needed
241
+ `,
242
+ addErrorHandling: `
243
+ ## Adding Error Handling
244
+ Error handling options:
245
+ - **stop**: Halt workflow execution on error (default)
246
+ - **continue**: Log error and continue to next step
247
+ - **retry**: Retry the step with backoff
248
+
249
+ Example:
250
+ \`\`\`yaml
251
+ errorHandling:
252
+ action: retry
253
+ maxRetries: 3
254
+ retryDelay: 1000 # milliseconds
255
+ fallback:
256
+ action: slack.chat.postMessage
257
+ inputs:
258
+ channel: "#alerts"
259
+ text: "Step {{ step.name }} failed: {{ error.message }}"
260
+ \`\`\`
261
+ `,
262
+ addConditions: `
263
+ ## Adding Conditions
264
+ Conditions control when a step executes. They are JavaScript-like expressions.
265
+
266
+ Examples:
267
+ \`\`\`yaml
268
+ conditions:
269
+ - "{{ previous_step.success === true }}"
270
+ - "{{ inputs.environment === 'production' }}"
271
+ - "{{ pr_details.state === 'open' && pr_details.draft === false }}"
272
+ \`\`\`
273
+
274
+ Common patterns:
275
+ - Check previous step success: \`{{ step_id.success }}\`
276
+ - Check variable values: \`{{ output_var.field === 'value' }}\`
277
+ - Check input values: \`{{ inputs.flag === true }}\`
278
+ - Combine conditions: \`{{ condition1 && condition2 }}\`
279
+ `,
280
+ createSubWorkflow: `
281
+ ## Creating Sub-Workflows
282
+ A sub-workflow is referenced by path instead of an action:
283
+
284
+ \`\`\`yaml
285
+ - id: run-notification-workflow
286
+ name: "Run Notification Workflow"
287
+ workflowPath: "./workflows/notify.md"
288
+ inputs:
289
+ message: "{{ previous_step.summary }}"
290
+ channel: "{{ inputs.notification_channel }}"
291
+ output_variable: notification_result
292
+ \`\`\`
293
+
294
+ When creating sub-workflows:
295
+ 1. Use workflowPath instead of action
296
+ 2. Pass inputs that the sub-workflow expects
297
+ 3. The sub-workflow's outputs are available via output_variable
298
+ `,
299
+ addTool: `
300
+ ## Adding Tool Configurations
301
+ Tools are configured with their SDK and authentication:
302
+
303
+ \`\`\`yaml
304
+ tools:
305
+ slack:
306
+ sdk: '@slack/web-api'
307
+ auth:
308
+ token: '\${SLACK_BOT_TOKEN}'
309
+ github:
310
+ sdk: '@octokit/rest'
311
+ auth:
312
+ token: '\${GITHUB_TOKEN}'
313
+ \`\`\`
314
+
315
+ Authentication patterns:
316
+ - Environment variables: \${ENV_VAR_NAME}
317
+ - OAuth tokens: Stored and retrieved automatically
318
+ - API keys: Configured per-tool
319
+ `,
320
+ };
321
+ /**
322
+ * Build a context-aware prompt based on the user's request
323
+ */
324
+ export function buildPrompt(userRequest, workflow, context) {
325
+ // Detect the type of operation requested
326
+ const operations = detectOperations(userRequest);
327
+ // Build system prompt with relevant operation guides
328
+ let systemPrompt = BASE_SYSTEM_PROMPT;
329
+ for (const op of operations) {
330
+ if (OPERATION_PROMPTS[op]) {
331
+ systemPrompt += '\n' + OPERATION_PROMPTS[op];
332
+ }
333
+ }
334
+ // Build user prompt with context
335
+ let userPrompt = `Current workflow:\n\`\`\`yaml\n${formatWorkflow(workflow)}\n\`\`\`\n\n`;
336
+ if (context?.selectedStepId) {
337
+ const selectedStep = workflow.steps?.find((s) => s.id === context.selectedStepId);
338
+ if (selectedStep) {
339
+ userPrompt += `Currently selected step: "${context.selectedStepId}"\n\n`;
340
+ }
341
+ }
342
+ if (context?.recentHistory && context.recentHistory.length > 0) {
343
+ userPrompt += `Recent changes:\n${context.recentHistory.map((h) => `- ${h}`).join('\n')}\n\n`;
344
+ }
345
+ userPrompt += `User request: ${userRequest}`;
346
+ return { systemPrompt, userPrompt };
347
+ }
348
+ /**
349
+ * Detect what type of operations the user is requesting
350
+ */
351
+ function detectOperations(request) {
352
+ const lower = request.toLowerCase();
353
+ const operations = [];
354
+ if (lower.includes('add') && (lower.includes('step') || lower.includes('action'))) {
355
+ operations.push('addStep');
356
+ }
357
+ if (lower.includes('remove') || lower.includes('delete')) {
358
+ operations.push('removeStep');
359
+ }
360
+ if (lower.includes('change') || lower.includes('modify') || lower.includes('update')) {
361
+ operations.push('modifyInputs');
362
+ }
363
+ if (lower.includes('error') || lower.includes('retry') || lower.includes('fallback')) {
364
+ operations.push('addErrorHandling');
365
+ }
366
+ if (lower.includes('condition') || lower.includes('if') || lower.includes('when')) {
367
+ operations.push('addConditions');
368
+ }
369
+ if (lower.includes('sub-workflow') || lower.includes('subworkflow') || lower.includes('nested')) {
370
+ operations.push('createSubWorkflow');
371
+ }
372
+ if (lower.includes('tool') || lower.includes('sdk') || lower.includes('connect')) {
373
+ operations.push('addTool');
374
+ }
375
+ // Default to addStep if no specific operation detected
376
+ if (operations.length === 0) {
377
+ operations.push('addStep');
378
+ }
379
+ return operations;
380
+ }
381
+ /**
382
+ * Format workflow for prompt (simplified YAML)
383
+ */
384
+ function formatWorkflow(workflow) {
385
+ const { stringify } = require('yaml');
386
+ return stringify(workflow, { indent: 2, lineWidth: 0 });
387
+ }
388
+ /**
389
+ * Generate contextual suggestions based on workflow state
390
+ */
391
+ export function generateSuggestions(workflow, selectedStepId) {
392
+ const suggestions = [];
393
+ const steps = workflow.steps || [];
394
+ // No steps - suggest getting started
395
+ if (steps.length === 0) {
396
+ return [
397
+ 'Add a step to send a Slack message',
398
+ 'Add a step to fetch data from GitHub',
399
+ 'Add an HTTP request step',
400
+ 'Create a workflow that monitors a webhook',
401
+ ];
402
+ }
403
+ // Check for missing error handling
404
+ const stepsWithoutErrorHandling = steps.filter((s) => !s.errorHandling);
405
+ if (stepsWithoutErrorHandling.length > 0) {
406
+ suggestions.push('Add error handling with retries to all steps');
407
+ }
408
+ // Check for missing notifications
409
+ const hasNotification = steps.some((s) => s.action?.includes('slack') ||
410
+ s.action?.includes('gmail') ||
411
+ s.action?.includes('discord'));
412
+ if (!hasNotification) {
413
+ suggestions.push('Add a Slack notification at the end');
414
+ }
415
+ // Step-specific suggestions
416
+ if (selectedStepId) {
417
+ const step = steps.find((s) => s.id === selectedStepId);
418
+ if (step) {
419
+ if (!step.errorHandling) {
420
+ suggestions.push(`Add retry logic to "${step.name || step.id}"`);
421
+ }
422
+ if (!step.conditions || step.conditions.length === 0) {
423
+ suggestions.push(`Add a condition to "${step.name || step.id}"`);
424
+ }
425
+ suggestions.push(`Duplicate "${step.name || step.id}" with modifications`);
426
+ }
427
+ }
428
+ // General suggestions
429
+ if (steps.length >= 3) {
430
+ suggestions.push('Convert these steps into a reusable sub-workflow');
431
+ }
432
+ suggestions.push('Add a step to log results to a database');
433
+ suggestions.push('Add parallel execution for independent steps');
434
+ return suggestions.slice(0, 5);
435
+ }
436
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../../../src/server/services/agents/prompts.ts"],"names":[],"mappings":"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"}