agent-orcha 0.0.7 → 0.0.8

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 (259) hide show
  1. package/README.md +86 -28
  2. package/dist/lib/agents/agent-executor.d.ts.map +1 -1
  3. package/dist/lib/agents/agent-executor.js +23 -7
  4. package/dist/lib/agents/agent-executor.js.map +1 -1
  5. package/dist/lib/agents/react-loop.d.ts.map +1 -1
  6. package/dist/lib/agents/react-loop.js +27 -0
  7. package/dist/lib/agents/react-loop.js.map +1 -1
  8. package/dist/lib/functions/simple-function-wrapper.js +3 -3
  9. package/dist/lib/functions/simple-function-wrapper.js.map +1 -1
  10. package/dist/lib/knowledge/knowledge-store.d.ts +1 -1
  11. package/dist/lib/knowledge/knowledge-store.d.ts.map +1 -1
  12. package/dist/lib/knowledge/knowledge-store.js +25 -4
  13. package/dist/lib/knowledge/knowledge-store.js.map +1 -1
  14. package/dist/lib/knowledge/loaders/file-loaders.d.ts +0 -1
  15. package/dist/lib/knowledge/loaders/file-loaders.d.ts.map +1 -1
  16. package/dist/lib/knowledge/loaders/file-loaders.js +7 -15
  17. package/dist/lib/knowledge/loaders/file-loaders.js.map +1 -1
  18. package/dist/lib/knowledge/sqlite-store.d.ts.map +1 -1
  19. package/dist/lib/knowledge/sqlite-store.js +19 -10
  20. package/dist/lib/knowledge/sqlite-store.js.map +1 -1
  21. package/dist/lib/knowledge/types.d.ts +13 -13
  22. package/dist/lib/llm/index.d.ts +1 -1
  23. package/dist/lib/llm/index.d.ts.map +1 -1
  24. package/dist/lib/llm/index.js +1 -1
  25. package/dist/lib/llm/index.js.map +1 -1
  26. package/dist/lib/llm/llm-config.d.ts +51 -8
  27. package/dist/lib/llm/llm-config.d.ts.map +1 -1
  28. package/dist/lib/llm/llm-config.js +161 -17
  29. package/dist/lib/llm/llm-config.js.map +1 -1
  30. package/dist/lib/llm/llm-factory.d.ts +1 -2
  31. package/dist/lib/llm/llm-factory.d.ts.map +1 -1
  32. package/dist/lib/llm/llm-factory.js +41 -8
  33. package/dist/lib/llm/llm-factory.js.map +1 -1
  34. package/dist/lib/llm/providers/openai-chat-model.d.ts +10 -0
  35. package/dist/lib/llm/providers/openai-chat-model.d.ts.map +1 -1
  36. package/dist/lib/llm/providers/openai-chat-model.js +37 -5
  37. package/dist/lib/llm/providers/openai-chat-model.js.map +1 -1
  38. package/dist/lib/llm/providers/openai-embeddings.d.ts.map +1 -1
  39. package/dist/lib/llm/providers/openai-embeddings.js +41 -10
  40. package/dist/lib/llm/providers/openai-embeddings.js.map +1 -1
  41. package/dist/lib/local-llm/binary-manager.d.ts +66 -0
  42. package/dist/lib/local-llm/binary-manager.d.ts.map +1 -0
  43. package/dist/lib/local-llm/binary-manager.js +441 -0
  44. package/dist/lib/local-llm/binary-manager.js.map +1 -0
  45. package/dist/lib/local-llm/engine-interface.d.ts +47 -0
  46. package/dist/lib/local-llm/engine-interface.d.ts.map +1 -0
  47. package/dist/lib/local-llm/engine-interface.js +2 -0
  48. package/dist/lib/local-llm/engine-interface.js.map +1 -0
  49. package/dist/lib/local-llm/engine-registry.d.ts +20 -0
  50. package/dist/lib/local-llm/engine-registry.d.ts.map +1 -0
  51. package/dist/lib/local-llm/engine-registry.js +56 -0
  52. package/dist/lib/local-llm/engine-registry.js.map +1 -0
  53. package/dist/lib/local-llm/engines/llama-cpp-engine.d.ts +31 -0
  54. package/dist/lib/local-llm/engines/llama-cpp-engine.d.ts.map +1 -0
  55. package/dist/lib/local-llm/engines/llama-cpp-engine.js +164 -0
  56. package/dist/lib/local-llm/engines/llama-cpp-engine.js.map +1 -0
  57. package/dist/lib/local-llm/engines/mlx-serve-engine.d.ts +31 -0
  58. package/dist/lib/local-llm/engines/mlx-serve-engine.d.ts.map +1 -0
  59. package/dist/lib/local-llm/engines/mlx-serve-engine.js +161 -0
  60. package/dist/lib/local-llm/engines/mlx-serve-engine.js.map +1 -0
  61. package/dist/lib/local-llm/gguf-reader.d.ts +20 -0
  62. package/dist/lib/local-llm/gguf-reader.d.ts.map +1 -0
  63. package/dist/lib/local-llm/gguf-reader.js +190 -0
  64. package/dist/lib/local-llm/gguf-reader.js.map +1 -0
  65. package/dist/lib/local-llm/index.d.ts +9 -0
  66. package/dist/lib/local-llm/index.d.ts.map +1 -0
  67. package/dist/lib/local-llm/index.js +6 -0
  68. package/dist/lib/local-llm/index.js.map +1 -0
  69. package/dist/lib/local-llm/llama-server-process.d.ts +42 -0
  70. package/dist/lib/local-llm/llama-server-process.d.ts.map +1 -0
  71. package/dist/lib/local-llm/llama-server-process.js +237 -0
  72. package/dist/lib/local-llm/llama-server-process.js.map +1 -0
  73. package/dist/lib/local-llm/mlx-binary-manager.d.ts +33 -0
  74. package/dist/lib/local-llm/mlx-binary-manager.d.ts.map +1 -0
  75. package/dist/lib/local-llm/mlx-binary-manager.js +211 -0
  76. package/dist/lib/local-llm/mlx-binary-manager.js.map +1 -0
  77. package/dist/lib/local-llm/mlx-server-process.d.ts +26 -0
  78. package/dist/lib/local-llm/mlx-server-process.d.ts.map +1 -0
  79. package/dist/lib/local-llm/mlx-server-process.js +210 -0
  80. package/dist/lib/local-llm/mlx-server-process.js.map +1 -0
  81. package/dist/lib/local-llm/model-manager.d.ts +33 -0
  82. package/dist/lib/local-llm/model-manager.d.ts.map +1 -0
  83. package/dist/lib/local-llm/model-manager.js +591 -0
  84. package/dist/lib/local-llm/model-manager.js.map +1 -0
  85. package/dist/lib/local-llm/types.d.ts +51 -0
  86. package/dist/lib/local-llm/types.d.ts.map +1 -0
  87. package/dist/lib/local-llm/types.js +2 -0
  88. package/dist/lib/local-llm/types.js.map +1 -0
  89. package/dist/lib/logger.d.ts +2 -0
  90. package/dist/lib/logger.d.ts.map +1 -1
  91. package/dist/lib/logger.js +68 -5
  92. package/dist/lib/logger.js.map +1 -1
  93. package/dist/lib/orchestrator.d.ts +9 -0
  94. package/dist/lib/orchestrator.d.ts.map +1 -1
  95. package/dist/lib/orchestrator.js +151 -3
  96. package/dist/lib/orchestrator.js.map +1 -1
  97. package/dist/lib/sandbox/cdp-client.d.ts +2 -1
  98. package/dist/lib/sandbox/cdp-client.d.ts.map +1 -1
  99. package/dist/lib/sandbox/cdp-client.js +33 -7
  100. package/dist/lib/sandbox/cdp-client.js.map +1 -1
  101. package/dist/lib/sandbox/index.d.ts +1 -0
  102. package/dist/lib/sandbox/index.d.ts.map +1 -1
  103. package/dist/lib/sandbox/index.js +1 -0
  104. package/dist/lib/sandbox/index.js.map +1 -1
  105. package/dist/lib/sandbox/page-readiness.d.ts.map +1 -1
  106. package/dist/lib/sandbox/page-readiness.js +33 -0
  107. package/dist/lib/sandbox/page-readiness.js.map +1 -1
  108. package/dist/lib/sandbox/sandbox-browser.d.ts.map +1 -1
  109. package/dist/lib/sandbox/sandbox-browser.js +14 -1
  110. package/dist/lib/sandbox/sandbox-browser.js.map +1 -1
  111. package/dist/lib/sandbox/sandbox-container.d.ts +39 -0
  112. package/dist/lib/sandbox/sandbox-container.d.ts.map +1 -0
  113. package/dist/lib/sandbox/sandbox-container.js +176 -0
  114. package/dist/lib/sandbox/sandbox-container.js.map +1 -0
  115. package/dist/lib/sandbox/sandbox-file.d.ts.map +1 -1
  116. package/dist/lib/sandbox/sandbox-file.js +5 -4
  117. package/dist/lib/sandbox/sandbox-file.js.map +1 -1
  118. package/dist/lib/sandbox/sandbox-shell.d.ts +2 -1
  119. package/dist/lib/sandbox/sandbox-shell.d.ts.map +1 -1
  120. package/dist/lib/sandbox/sandbox-shell.js +42 -24
  121. package/dist/lib/sandbox/sandbox-shell.js.map +1 -1
  122. package/dist/lib/sandbox/sandbox-web.d.ts.map +1 -1
  123. package/dist/lib/sandbox/sandbox-web.js +27 -2
  124. package/dist/lib/sandbox/sandbox-web.js.map +1 -1
  125. package/dist/lib/sandbox/vision-browser.d.ts.map +1 -1
  126. package/dist/lib/sandbox/vision-browser.js +9 -0
  127. package/dist/lib/sandbox/vision-browser.js.map +1 -1
  128. package/dist/lib/sea/app-window.d.ts +7 -0
  129. package/dist/lib/sea/app-window.d.ts.map +1 -0
  130. package/dist/lib/sea/app-window.js +95 -0
  131. package/dist/lib/sea/app-window.js.map +1 -0
  132. package/dist/lib/sea/bootstrap.d.ts +18 -0
  133. package/dist/lib/sea/bootstrap.d.ts.map +1 -0
  134. package/dist/lib/sea/bootstrap.js +103 -0
  135. package/dist/lib/sea/bootstrap.js.map +1 -0
  136. package/dist/lib/sea/sqlite-vec-shim.d.ts +3 -0
  137. package/dist/lib/sea/sqlite-vec-shim.d.ts.map +1 -0
  138. package/dist/lib/sea/sqlite-vec-shim.js +10 -0
  139. package/dist/lib/sea/sqlite-vec-shim.js.map +1 -0
  140. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts +1 -2
  141. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts.map +1 -1
  142. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js +7 -13
  143. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js.map +1 -1
  144. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.d.ts.map +1 -1
  145. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js +2 -4
  146. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js.map +1 -1
  147. package/dist/lib/tools/built-in/knowledge-search.tool.js +4 -4
  148. package/dist/lib/tools/built-in/knowledge-search.tool.js.map +1 -1
  149. package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts.map +1 -1
  150. package/dist/lib/tools/built-in/knowledge-sql.tool.js +70 -37
  151. package/dist/lib/tools/built-in/knowledge-sql.tool.js.map +1 -1
  152. package/dist/lib/tools/built-in/knowledge-tools-factory.js +2 -2
  153. package/dist/lib/tools/built-in/knowledge-tools-factory.js.map +1 -1
  154. package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts +1 -2
  155. package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts.map +1 -1
  156. package/dist/lib/tools/built-in/knowledge-traverse.tool.js +5 -11
  157. package/dist/lib/tools/built-in/knowledge-traverse.tool.js.map +1 -1
  158. package/dist/lib/tools/workspace/workspace-tools.d.ts.map +1 -1
  159. package/dist/lib/tools/workspace/workspace-tools.js +5 -4
  160. package/dist/lib/tools/workspace/workspace-tools.js.map +1 -1
  161. package/dist/lib/types/tool-factory.d.ts.map +1 -1
  162. package/dist/lib/types/tool-factory.js +9 -2
  163. package/dist/lib/types/tool-factory.js.map +1 -1
  164. package/dist/lib/utils/document-extract.d.ts +10 -0
  165. package/dist/lib/utils/document-extract.d.ts.map +1 -0
  166. package/dist/lib/utils/document-extract.js +149 -0
  167. package/dist/lib/utils/document-extract.js.map +1 -0
  168. package/dist/lib/workflows/react-workflow-executor.d.ts.map +1 -1
  169. package/dist/lib/workflows/react-workflow-executor.js +20 -14
  170. package/dist/lib/workflows/react-workflow-executor.js.map +1 -1
  171. package/dist/lib/workflows/types.d.ts +71 -45
  172. package/dist/lib/workflows/types.d.ts.map +1 -1
  173. package/dist/lib/workflows/types.js +10 -0
  174. package/dist/lib/workflows/types.js.map +1 -1
  175. package/dist/public/assets/logo.png +0 -0
  176. package/dist/public/chat.html +3 -78
  177. package/dist/public/index.html +3 -330
  178. package/dist/public/src/components/AgentComposer.js +132 -132
  179. package/dist/public/src/components/AgentsView.js +1231 -350
  180. package/dist/public/src/components/AppRoot.js +101 -39
  181. package/dist/public/src/components/GraphView.js +11 -13
  182. package/dist/public/src/components/IdeView.js +133 -98
  183. package/dist/public/src/components/KnowledgeView.js +94 -130
  184. package/dist/public/src/components/LlmView.js +15 -19
  185. package/dist/public/src/components/LocalLlmView.js +2440 -0
  186. package/dist/public/src/components/LogViewer.js +155 -0
  187. package/dist/public/src/components/McpView.js +41 -49
  188. package/dist/public/src/components/MonitorView.js +79 -126
  189. package/dist/public/src/components/NavBar.js +16 -26
  190. package/dist/public/src/components/StandaloneChat.js +136 -150
  191. package/dist/public/src/services/ApiService.js +196 -2
  192. package/dist/public/src/services/SessionStore.js +6 -3
  193. package/dist/public/src/services/StreamManager.js +183 -0
  194. package/dist/public/src/store.js +1 -1
  195. package/dist/public/src/utils/card.js +21 -0
  196. package/dist/public/src/utils/markdown.js +1 -7
  197. package/dist/public/styles.css +2777 -0
  198. package/dist/src/cli/commands/init.d.ts.map +1 -1
  199. package/dist/src/cli/commands/init.js +7 -1
  200. package/dist/src/cli/commands/init.js.map +1 -1
  201. package/dist/src/cli/commands/start.d.ts.map +1 -1
  202. package/dist/src/cli/commands/start.js +28 -5
  203. package/dist/src/cli/commands/start.js.map +1 -1
  204. package/dist/src/cli/index.js +13 -2
  205. package/dist/src/cli/index.js.map +1 -1
  206. package/dist/src/index.js +7 -1
  207. package/dist/src/index.js.map +1 -1
  208. package/dist/src/routes/agents.route.d.ts.map +1 -1
  209. package/dist/src/routes/agents.route.js +2 -0
  210. package/dist/src/routes/agents.route.js.map +1 -1
  211. package/dist/src/routes/chat.route.d.ts.map +1 -1
  212. package/dist/src/routes/chat.route.js +3 -2
  213. package/dist/src/routes/chat.route.js.map +1 -1
  214. package/dist/src/routes/llm.route.d.ts.map +1 -1
  215. package/dist/src/routes/llm.route.js +227 -7
  216. package/dist/src/routes/llm.route.js.map +1 -1
  217. package/dist/src/routes/local-llm.route.d.ts +3 -0
  218. package/dist/src/routes/local-llm.route.d.ts.map +1 -0
  219. package/dist/src/routes/local-llm.route.js +688 -0
  220. package/dist/src/routes/local-llm.route.js.map +1 -0
  221. package/dist/src/routes/logs.route.d.ts +3 -0
  222. package/dist/src/routes/logs.route.d.ts.map +1 -0
  223. package/dist/src/routes/logs.route.js +24 -0
  224. package/dist/src/routes/logs.route.js.map +1 -0
  225. package/dist/src/routes/vnc.route.d.ts +10 -1
  226. package/dist/src/routes/vnc.route.d.ts.map +1 -1
  227. package/dist/src/routes/vnc.route.js +37 -12
  228. package/dist/src/routes/vnc.route.js.map +1 -1
  229. package/dist/src/routes/workflows.route.d.ts.map +1 -1
  230. package/dist/src/routes/workflows.route.js +24 -0
  231. package/dist/src/routes/workflows.route.js.map +1 -1
  232. package/dist/src/server.d.ts.map +1 -1
  233. package/dist/src/server.js +24 -2
  234. package/dist/src/server.js.map +1 -1
  235. package/dist/templates/agents/actor.agent.yaml +34 -0
  236. package/dist/templates/agents/architect.agent.yaml +0 -1
  237. package/dist/templates/agents/chatbot.agent.yaml +0 -1
  238. package/dist/templates/agents/corporate.agent.yaml +0 -1
  239. package/dist/templates/agents/functions.agent.yaml +29 -0
  240. package/dist/templates/agents/investment-analyst.agent.yaml +0 -1
  241. package/dist/templates/agents/music-librarian.agent.yaml +3 -27
  242. package/dist/templates/agents/network-security.agent.yaml +0 -1
  243. package/dist/templates/agents/transport-security.agent.yaml +0 -1
  244. package/dist/templates/agents/web-engineer.agent.yaml +3 -4
  245. package/dist/templates/agents/web-pilot.agent.yaml +0 -1
  246. package/dist/templates/knowledge/patient-records.knowledge.yaml +20 -0
  247. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_0.pdf +0 -0
  248. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_1.pdf +0 -0
  249. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_10.pdf +0 -0
  250. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_11.pdf +0 -0
  251. package/dist/templates/knowledge/web-docs.knowledge.yaml +1 -1
  252. package/dist/templates/llm.json +73 -10
  253. package/dist/templates/skills/orcha-builder/SKILL.md +56 -3
  254. package/dist/templates/workflows/example.workflow.yaml +27 -35
  255. package/dist/templates/workflows/react-example.workflow.yaml +14 -19
  256. package/dist/templates/workflows/team-chat.workflow.yaml +47 -0
  257. package/package.json +14 -6
  258. package/dist/public/src/components/SkillsView.js +0 -137
  259. package/dist/public/src/components/WorkflowsView.js +0 -568
@@ -1,568 +0,0 @@
1
-
2
- import { Component } from '../utils/Component.js';
3
- import { api } from '../services/ApiService.js';
4
-
5
- const LOG_CONFIG = {
6
- workflow_start: { icon: 'fa-play', color: 'blue' },
7
- workflow_complete: { icon: 'fa-check-circle', color: 'green' },
8
- workflow_error: { icon: 'fa-times-circle', color: 'red' },
9
- workflow_interrupt: { icon: 'fa-pause-circle', color: 'amber' },
10
- step_start: { icon: 'fa-arrow-right', color: 'blue' },
11
- step_complete: { icon: 'fa-check', color: 'green' },
12
- step_error: { icon: 'fa-exclamation-triangle', color: 'red' },
13
- tool_discovery: { icon: 'fa-search', color: 'purple' },
14
- react_iteration: { icon: 'fa-sync-alt', color: 'blue' },
15
- tool_call: { icon: 'fa-wrench', color: 'cyan' },
16
- tool_result: { icon: 'fa-reply', color: 'teal' },
17
- };
18
-
19
- export class WorkflowsView extends Component {
20
- constructor() {
21
- super();
22
- this.workflows = [];
23
- this.selectedWorkflow = null;
24
- this.chartInterval = null;
25
- this.activeTaskId = null;
26
- this.eventSource = null;
27
- }
28
-
29
- async connectedCallback() {
30
- super.connectedCallback();
31
- this.loadWorkflows();
32
- }
33
-
34
- disconnectedCallback() {
35
- this.stopChartUpdate();
36
- this.closeEventSource();
37
- }
38
-
39
- closeEventSource() {
40
- if (this.eventSource) {
41
- this.eventSource.close();
42
- this.eventSource = null;
43
- }
44
- }
45
-
46
- // ── Data ──
47
-
48
- async loadWorkflows() {
49
- try {
50
- this.workflows = await api.getWorkflows();
51
- this.renderCards();
52
- } catch (e) {
53
- console.error('Failed to load workflows', e);
54
- }
55
- }
56
-
57
- async selectWorkflow(name) {
58
- if (this.selectedWorkflow?.name === name) return;
59
-
60
- try {
61
- const full = await api.getWorkflow(name);
62
- this.selectedWorkflow = full;
63
- this.renderCards();
64
- this.renderDetail();
65
- } catch (e) {
66
- console.error('Failed to load workflow details', e);
67
- }
68
- }
69
-
70
- // ── Left sidebar: cards ──
71
-
72
- renderCards() {
73
- const container = this.querySelector('#workflowCards');
74
- if (!container) return;
75
-
76
- if (!this.workflows.length) {
77
- container.innerHTML = `
78
- <div class="text-gray-500 text-center py-12">
79
- <i class="fas fa-project-diagram text-4xl mb-4 block text-gray-600"></i>
80
- <p class="text-sm">No workflows found</p>
81
- </div>`;
82
- return;
83
- }
84
-
85
- container.innerHTML = this.workflows.map(wf => {
86
- const isSelected = this.selectedWorkflow?.name === wf.name;
87
- const isReact = wf.type === 'react';
88
- const badgeClass = isReact ? 'bg-amber-500/20 text-amber-400' : 'bg-blue-500/20 text-blue-400';
89
-
90
- return `
91
- <div class="workflow-card cursor-pointer rounded-lg p-3 border transition-colors
92
- ${isSelected ? 'bg-dark-surface border-purple-500' : 'bg-dark-surface/50 border-dark-border hover:border-purple-500/50'}"
93
- data-name="${wf.name}">
94
- <div class="flex items-center justify-between mb-1">
95
- <span class="font-semibold text-gray-100 text-sm truncate">${this.escapeHtml(wf.name)}</span>
96
- <span class="text-xs px-1.5 py-0.5 rounded ${badgeClass} flex-shrink-0">${wf.type || 'steps'}</span>
97
- </div>
98
- <div class="text-xs text-gray-500 line-clamp-2">${this.escapeHtml(wf.description || 'No description')}</div>
99
- <div class="text-xs text-gray-600 mt-1">v${wf.version || '1.0.0'}${!isReact && wf.steps ? ` · ${wf.steps} steps` : ''}</div>
100
- </div>`;
101
- }).join('');
102
-
103
- container.querySelectorAll('.workflow-card').forEach(card => {
104
- card.addEventListener('click', () => this.selectWorkflow(card.dataset.name));
105
- });
106
- }
107
-
108
- // ── Right panel: detail ──
109
-
110
- renderDetail() {
111
- const container = this.querySelector('#workflowDetail');
112
- if (!container || !this.selectedWorkflow) {
113
- if (container) container.innerHTML = '<div class="text-gray-500 italic text-center py-12">Select a workflow to view details</div>';
114
- return;
115
- }
116
-
117
- const wf = this.selectedWorkflow;
118
- const isReact = wf.type === 'react';
119
-
120
- container.innerHTML = `
121
- ${this.buildInfoHtml(wf)}
122
- ${!isReact ? this.buildDiagramHtml(wf.steps || []) : ''}
123
- ${this.buildInputsHtml(wf.input?.schema || {})}
124
- <button id="runWorkflow"
125
- class="bg-purple-600 hover:bg-purple-700 disabled:bg-gray-700 disabled:cursor-not-allowed text-white font-medium px-5 py-2 rounded-lg transition-colors flex items-center gap-2 text-sm">
126
- <i class="fas fa-play text-xs"></i>
127
- Run Workflow
128
- </button>
129
- `;
130
-
131
- this.querySelector('#runWorkflow')?.addEventListener('click', () => this.runWorkflow());
132
- }
133
-
134
- buildInfoHtml(wf) {
135
- const isReact = wf.type === 'react';
136
- const badgeClass = isReact ? 'bg-amber-500/20 text-amber-400' : 'bg-blue-500/20 text-blue-400';
137
-
138
- let metaHtml = '';
139
- if (isReact) {
140
- const g = wf.graph || {};
141
- metaHtml = `
142
- <div class="grid grid-cols-4 gap-3 mt-3 pt-3 border-t border-dark-border">
143
- <div><span class="text-gray-500 text-xs block">Model</span><span class="text-gray-300 text-sm">${this.escapeHtml(g.model || 'default')}</span></div>
144
- <div><span class="text-gray-500 text-xs block">Mode</span><span class="text-gray-300 text-sm">${g.executionMode || 'react'}</span></div>
145
- <div><span class="text-gray-500 text-xs block">Max Iter</span><span class="text-gray-300 text-sm">${g.maxIterations ?? 10}</span></div>
146
- <div><span class="text-gray-500 text-xs block">Tools</span><span class="text-gray-300 text-sm">${g.tools?.mode || 'all'}</span></div>
147
- </div>`;
148
- } else {
149
- const c = wf.config || {};
150
- metaHtml = `
151
- <div class="grid grid-cols-3 gap-3 mt-3 pt-3 border-t border-dark-border">
152
- <div><span class="text-gray-500 text-xs block">Steps</span><span class="text-gray-300 text-sm">${(wf.steps || []).length}</span></div>
153
- <div><span class="text-gray-500 text-xs block">On Error</span><span class="text-gray-300 text-sm">${c.onError || 'stop'}</span></div>
154
- <div><span class="text-gray-500 text-xs block">Timeout</span><span class="text-gray-300 text-sm">${((c.timeout || 300000) / 1000)}s</span></div>
155
- </div>`;
156
- }
157
-
158
- return `
159
- <div class="bg-dark-surface border border-dark-border rounded-lg p-4">
160
- <div class="flex items-center gap-3">
161
- <i class="fas ${isReact ? 'fa-atom' : 'fa-project-diagram'} text-purple-400"></i>
162
- <div class="min-w-0">
163
- <div class="flex items-center gap-2 flex-wrap">
164
- <span class="font-semibold text-gray-100">${this.escapeHtml(wf.name)}</span>
165
- <span class="text-xs px-2 py-0.5 rounded-full ${badgeClass}">${wf.type || 'steps'}</span>
166
- <span class="text-xs text-gray-500">v${wf.version || '1.0.0'}</span>
167
- </div>
168
- <p class="text-xs text-gray-400 mt-0.5">${this.escapeHtml(wf.description || '')}</p>
169
- </div>
170
- </div>
171
- ${metaHtml}
172
- </div>`;
173
- }
174
-
175
- buildDiagramHtml(steps) {
176
- if (!steps.length) return '';
177
-
178
- const nodes = steps.map(step => `
179
- <span class="text-gray-600 text-lg flex-shrink-0">&rarr;</span>
180
- <div id="step-${step.id}" class="step-node flex flex-col items-center px-3 py-2 bg-blue-500/10 border border-blue-500/30 rounded-lg min-w-[100px] text-center transition-all">
181
- <span class="font-semibold text-blue-300 text-xs">${step.id}</span>
182
- <span class="text-xs text-gray-400">${step.agent}</span>
183
- </div>
184
- `).join('');
185
-
186
- return `
187
- <div class="bg-dark-surface border border-dark-border rounded-lg p-4 overflow-x-auto">
188
- <div class="flex items-center gap-2 flex-nowrap min-w-max">
189
- <div class="flex flex-col items-center px-3 py-2 bg-green-500/10 border border-green-500/30 rounded-lg min-w-[80px] text-center">
190
- <span class="font-semibold text-green-400 text-xs">Input</span>
191
- </div>
192
- ${nodes}
193
- <span class="text-gray-600 text-lg flex-shrink-0">&rarr;</span>
194
- <div class="flex flex-col items-center px-3 py-2 bg-green-500/10 border border-green-500/30 rounded-lg min-w-[80px] text-center">
195
- <span class="font-semibold text-green-400 text-xs">Output</span>
196
- </div>
197
- </div>
198
- </div>`;
199
- }
200
-
201
- buildInputsHtml(schema) {
202
- const entries = Object.entries(schema);
203
- if (!entries.length) return '';
204
-
205
- const fields = entries.map(([key, field]) => `
206
- <div class="bg-dark-surface/50 border border-dark-border rounded-lg p-3">
207
- <div class="flex items-center justify-between mb-1">
208
- <label class="text-sm font-medium text-gray-300" for="wf-${key}">
209
- ${this.escapeHtml(key)}${field.required ? '<span class="text-red-400 ml-1">*</span>' : ''}
210
- </label>
211
- <span class="text-xs px-1.5 py-0.5 rounded bg-gray-700 text-gray-500">${field.type || 'string'}</span>
212
- </div>
213
- <input type="text" id="wf-${key}"
214
- placeholder="${field.default ? `Default: ${field.default}` : field.required ? 'Required' : 'Optional'}"
215
- value="${field.default || ''}"
216
- class="w-full bg-dark-bg border border-dark-border rounded-lg px-3 py-2 text-sm text-gray-100 placeholder-gray-600 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:border-transparent">
217
- ${field.description ? `<p class="text-xs text-gray-500 mt-1">${this.escapeHtml(field.description)}</p>` : ''}
218
- </div>
219
- `).join('');
220
-
221
- return `
222
- <div class="space-y-3">
223
- <h3 class="text-sm font-semibold text-gray-300 flex items-center gap-2">
224
- <i class="fas fa-keyboard text-gray-500 text-xs"></i>
225
- Inputs
226
- </h3>
227
- ${fields}
228
- </div>`;
229
- }
230
-
231
- // ── Execution ──
232
-
233
- resetRunUI() {
234
- const logEl = this.querySelector('#statusLog');
235
- const outputEl = this.querySelector('#workflowOutput');
236
-
237
- logEl.innerHTML = '';
238
- outputEl.textContent = 'No output yet';
239
- outputEl.className = outputEl.className.replace('text-gray-300', 'text-gray-500');
240
- this.querySelector('#statusMessage').textContent = 'Starting...';
241
- this.querySelector('#statusDot').className = 'inline-block w-2 h-2 rounded-full bg-blue-400 animate-pulse';
242
- this.clearInterruptPrompt();
243
- this.closeEventSource();
244
- this.activeTaskId = null;
245
- }
246
-
247
- collectInputs() {
248
- const inputs = {};
249
- this.querySelectorAll('input[id^="wf-"]').forEach(input => {
250
- const key = input.id.replace('wf-', '');
251
- if (input.value) inputs[key] = input.value;
252
- });
253
- return inputs;
254
- }
255
-
256
- async runWorkflow() {
257
- if (!this.selectedWorkflow) return;
258
-
259
- const inputs = this.collectInputs();
260
- const runBtn = this.querySelector('#runWorkflow');
261
- this.resetRunUI();
262
- if (runBtn) runBtn.disabled = true;
263
- this.startChartUpdate();
264
-
265
- const isReact = this.selectedWorkflow.type === 'react';
266
-
267
- try {
268
- if (isReact) {
269
- await this.runReactWorkflow(inputs);
270
- } else {
271
- await this.runStepsWorkflow(inputs);
272
- }
273
- } catch (e) {
274
- this.addLog(`Error: ${e.message}`, 'workflow_error');
275
- this.querySelector('#statusMessage').textContent = 'Error';
276
- this.querySelector('#statusDot').className = 'inline-block w-2 h-2 rounded-full bg-red-400';
277
- } finally {
278
- if (!isReact) {
279
- if (runBtn) runBtn.disabled = false;
280
- this.stopChartUpdate();
281
- }
282
- }
283
- }
284
-
285
- async runStepsWorkflow(inputs) {
286
- const res = await api.startWorkflowStream(this.selectedWorkflow.name, inputs);
287
- const reader = res.body.getReader();
288
- const decoder = new TextDecoder();
289
-
290
- while (true) {
291
- const { done, value } = await reader.read();
292
- if (done) break;
293
-
294
- const chunk = decoder.decode(value);
295
- for (const line of chunk.split('\n')) {
296
- if (!line.startsWith('data: ')) continue;
297
- const data = line.slice(6);
298
- if (data === '[DONE]') continue;
299
- try { this.handleStatusUpdate(JSON.parse(data)); } catch (e) { }
300
- }
301
- }
302
- }
303
-
304
- async runReactWorkflow(inputs) {
305
- const { id: taskId } = await api.submitWorkflowTask(this.selectedWorkflow.name, inputs);
306
- this.activeTaskId = taskId;
307
- this.addLog('Task submitted', 'workflow_start');
308
-
309
- this.eventSource = api.streamTask(taskId);
310
-
311
- this.eventSource.onmessage = (event) => {
312
- try {
313
- const data = JSON.parse(event.data);
314
- this.handleTaskSSE(data);
315
- } catch { /* ignore parse errors */ }
316
- };
317
-
318
- this.eventSource.onerror = () => {
319
- this.closeEventSource();
320
- this.finishReactRun();
321
- };
322
- }
323
-
324
- handleTaskSSE(data) {
325
- if (data.type === 'status') {
326
- const statusMsg = this.querySelector('#statusMessage');
327
- const statusDot = this.querySelector('#statusDot');
328
-
329
- if (data.status === 'working') {
330
- statusMsg.textContent = 'Working...';
331
- statusDot.className = 'inline-block w-2 h-2 rounded-full bg-blue-400 animate-pulse';
332
- this.clearInterruptPrompt();
333
- this.addLog('Workflow running', 'react_iteration');
334
- } else if (data.status === 'input-required') {
335
- const question = data.inputRequest?.question || 'Input required';
336
- statusMsg.textContent = 'Awaiting input';
337
- statusDot.className = 'inline-block w-2 h-2 rounded-full bg-amber-400';
338
- this.addLog(`Input required: ${question}`, 'workflow_interrupt');
339
- this.showInterruptPrompt(question);
340
- } else if (data.status === 'completed') {
341
- statusMsg.textContent = 'Completed';
342
- statusDot.className = 'inline-block w-2 h-2 rounded-full bg-green-400';
343
- this.addLog('Workflow completed', 'workflow_complete');
344
- if (data.result) {
345
- const outputEl = this.querySelector('#workflowOutput');
346
- outputEl.className = outputEl.className.replace('text-gray-500', 'text-gray-300');
347
- outputEl.textContent = JSON.stringify(data.result, null, 2);
348
- }
349
- } else if (data.status === 'failed') {
350
- statusMsg.textContent = 'Error';
351
- statusDot.className = 'inline-block w-2 h-2 rounded-full bg-red-400';
352
- this.addLog(`Error: ${data.error || 'Unknown error'}`, 'workflow_error');
353
- } else if (data.status === 'canceled') {
354
- statusMsg.textContent = 'Canceled';
355
- statusDot.className = 'inline-block w-2 h-2 rounded-full bg-yellow-400';
356
- this.addLog('Task canceled', 'workflow_error');
357
- }
358
- }
359
-
360
- if (data.type === 'done') {
361
- this.closeEventSource();
362
- this.finishReactRun();
363
- }
364
- }
365
-
366
- finishReactRun() {
367
- const runBtn = this.querySelector('#runWorkflow');
368
- if (runBtn) runBtn.disabled = false;
369
- this.stopChartUpdate();
370
- this.activeTaskId = null;
371
- }
372
-
373
- showInterruptPrompt(question) {
374
- const container = this.querySelector('#interruptPrompt');
375
- if (!container) return;
376
-
377
- container.innerHTML = `
378
- <div class="bg-amber-500/10 border border-amber-500/30 rounded-lg p-4">
379
- <div class="flex items-center gap-2 mb-3">
380
- <i class="fas fa-question-circle text-amber-400"></i>
381
- <span class="text-sm font-medium text-amber-400">Input Required</span>
382
- </div>
383
- <p class="text-sm text-gray-300 mb-3">${this.escapeHtml(question)}</p>
384
- <div class="flex gap-2">
385
- <input id="interruptInput" type="text" placeholder="Type your response..."
386
- class="flex-1 bg-dark-bg border border-dark-border rounded-lg px-3 py-2 text-sm text-gray-200 focus:outline-none focus:border-amber-500" />
387
- <button id="interruptSendBtn" class="px-4 py-2 bg-amber-500 hover:bg-amber-600 text-white text-sm font-medium rounded-lg transition-colors">
388
- Send
389
- </button>
390
- </div>
391
- </div>`;
392
-
393
- this.querySelector('#interruptSendBtn').addEventListener('click', () => this.handleInterruptResponse());
394
- this.querySelector('#interruptInput').addEventListener('keydown', (e) => {
395
- if (e.key === 'Enter') this.handleInterruptResponse();
396
- });
397
- this.querySelector('#interruptInput').focus();
398
- }
399
-
400
- clearInterruptPrompt() {
401
- const container = this.querySelector('#interruptPrompt');
402
- if (container) container.innerHTML = '';
403
- }
404
-
405
- async handleInterruptResponse() {
406
- const input = this.querySelector('#interruptInput');
407
- const response = input?.value?.trim();
408
- if (!response || !this.activeTaskId) return;
409
-
410
- try {
411
- await api.respondToTask(this.activeTaskId, response);
412
- this.clearInterruptPrompt();
413
- this.addLog(`Responded: ${response}`, 'tool_result');
414
- this.querySelector('#statusMessage').textContent = 'Resuming...';
415
- this.querySelector('#statusDot').className = 'inline-block w-2 h-2 rounded-full bg-blue-400 animate-pulse';
416
- } catch (e) {
417
- this.addLog(`Failed to respond: ${e.message}`, 'workflow_error');
418
- }
419
- }
420
-
421
- handleStatusUpdate(update) {
422
- if (update.type === 'status') {
423
- const { message, type, stepId } = update.data;
424
- const statusMsg = this.querySelector('#statusMessage');
425
- const statusDot = this.querySelector('#statusDot');
426
-
427
- if (type === 'workflow_complete') {
428
- statusMsg.textContent = 'Completed';
429
- statusDot.className = 'inline-block w-2 h-2 rounded-full bg-green-400';
430
- } else if (type === 'workflow_error') {
431
- statusMsg.textContent = 'Error';
432
- statusDot.className = 'inline-block w-2 h-2 rounded-full bg-red-400';
433
- } else if (type === 'workflow_interrupt') {
434
- statusMsg.textContent = 'Interrupted — Awaiting input';
435
- statusDot.className = 'inline-block w-2 h-2 rounded-full bg-amber-400';
436
- } else {
437
- statusMsg.textContent = message;
438
- }
439
-
440
- this.addLog(message, type);
441
-
442
- if (stepId) {
443
- const stepEl = this.querySelector(`#step-${stepId}`);
444
- if (stepEl) {
445
- if (type === 'step_start') {
446
- stepEl.className = stepEl.className
447
- .replace('bg-blue-500/10', 'bg-yellow-500/10 animate-pulse')
448
- .replace('border-blue-500/30', 'border-yellow-500/30');
449
- }
450
- if (type === 'step_complete') {
451
- stepEl.className = stepEl.className
452
- .replace('bg-yellow-500/10 animate-pulse', 'bg-green-500/10')
453
- .replace('border-yellow-500/30', 'border-green-500/30');
454
- }
455
- }
456
- }
457
- } else if (update.type === 'result') {
458
- const outputEl = this.querySelector('#workflowOutput');
459
- outputEl.className = outputEl.className.replace('text-gray-500', 'text-gray-300');
460
- outputEl.textContent = JSON.stringify(update.data.output || update.data, null, 2);
461
- }
462
- }
463
-
464
- addLog(msg, type) {
465
- const log = this.querySelector('#statusLog');
466
- const config = LOG_CONFIG[type] || { icon: 'fa-circle', color: 'gray' };
467
-
468
- const div = document.createElement('div');
469
- div.className = 'text-xs font-mono flex items-start gap-2 py-0.5';
470
-
471
- const time = new Date().toLocaleTimeString();
472
- div.innerHTML = `
473
- <span class="text-gray-600 flex-shrink-0">${time}</span>
474
- <i class="fas ${config.icon} text-${config.color}-400 text-xs mt-0.5 flex-shrink-0 w-3 text-center"></i>
475
- <span class="text-${config.color}-400">${this.escapeHtml(msg)}</span>
476
- `;
477
-
478
- log.appendChild(div);
479
- log.scrollTop = log.scrollHeight;
480
- }
481
-
482
- // ── Timer ──
483
-
484
- startChartUpdate() {
485
- this.stopChartUpdate();
486
- const start = Date.now();
487
- const timeEl = this.querySelector('#statusTime');
488
- timeEl.textContent = '0s';
489
- this.chartInterval = setInterval(() => {
490
- timeEl.textContent = `${Math.floor((Date.now() - start) / 1000)}s`;
491
- }, 1000);
492
- }
493
-
494
- stopChartUpdate() {
495
- if (this.chartInterval) {
496
- clearInterval(this.chartInterval);
497
- this.chartInterval = null;
498
- }
499
- }
500
-
501
- // ── Helpers ──
502
-
503
- escapeHtml(text) {
504
- if (!text) return '';
505
- return String(text).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
506
- }
507
-
508
- postRender() {
509
- // No static event bindings needed — cards and run button bind dynamically
510
- }
511
-
512
- template() {
513
- return `
514
- <div class="flex h-full gap-4">
515
- <!-- Left sidebar -->
516
- <div class="w-64 flex-shrink-0 overflow-y-auto custom-scrollbar pr-2">
517
- <div class="flex items-center justify-between mb-3">
518
- <h3 class="text-sm font-semibold text-gray-400 uppercase tracking-wider">Workflows</h3>
519
- </div>
520
- <div id="workflowCards" class="space-y-2">
521
- <div class="text-gray-500 italic text-center py-8 text-sm">Loading...</div>
522
- </div>
523
- </div>
524
-
525
- <!-- Right panel -->
526
- <div class="flex-1 flex flex-col h-full overflow-hidden pl-4 border-l border-dark-border">
527
- <!-- Detail area (scrollable) -->
528
- <div id="workflowDetail" class="flex-1 overflow-y-auto custom-scrollbar space-y-3 pb-3 min-h-0">
529
- <div class="text-gray-500 italic text-center py-12">Select a workflow to view details</div>
530
- </div>
531
-
532
- <!-- Activity & Output (always visible, pinned bottom) -->
533
- <div class="flex-shrink-0 pt-3 border-t border-dark-border space-y-3">
534
- <!-- Activity log -->
535
- <div>
536
- <div class="flex justify-between items-center mb-1.5">
537
- <h3 class="text-xs font-semibold text-gray-400 uppercase tracking-wider flex items-center gap-1.5">
538
- <i class="fas fa-terminal"></i>
539
- Activity
540
- </h3>
541
- <div class="flex items-center gap-2">
542
- <span id="statusDot" class="inline-block w-2 h-2 rounded-full bg-gray-600"></span>
543
- <span id="statusMessage" class="text-xs text-gray-500">Idle</span>
544
- <span id="statusTime" class="text-xs font-mono text-gray-600">&mdash;</span>
545
- </div>
546
- </div>
547
- <div id="statusLog" class="bg-dark-bg rounded-lg p-2.5 h-32 overflow-y-auto space-y-0.5 border border-dark-border custom-scrollbar"></div>
548
- </div>
549
-
550
- <!-- Interrupt prompt (shown when HITL input required) -->
551
- <div id="interruptPrompt"></div>
552
-
553
- <!-- Output -->
554
- <div>
555
- <h3 class="text-xs font-semibold text-gray-400 uppercase tracking-wider mb-1.5 flex items-center gap-1.5">
556
- <i class="fas fa-code"></i>
557
- Output
558
- </h3>
559
- <div id="workflowOutput" class="bg-dark-bg border border-dark-border rounded-lg p-2.5 h-24 font-mono text-xs text-gray-500 whitespace-pre-wrap overflow-auto custom-scrollbar">No output yet</div>
560
- </div>
561
- </div>
562
- </div>
563
- </div>
564
- `;
565
- }
566
- }
567
-
568
- customElements.define('workflows-view', WorkflowsView);