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
@@ -48,11 +48,21 @@ export class ApiService {
48
48
  return res.json();
49
49
  }
50
50
 
51
- async startWorkflowStream(name, input) {
51
+ async startWorkflowStream(name, input, signal) {
52
52
  return this._fetch(`/api/workflows/${name}/stream`, {
53
53
  method: 'POST',
54
54
  headers: { 'Content-Type': 'application/json' },
55
- body: JSON.stringify({ input })
55
+ body: JSON.stringify({ input }),
56
+ signal,
57
+ });
58
+ }
59
+
60
+ async resumeWorkflowStream(name, threadId, answer, signal) {
61
+ return this._fetch(`/api/workflows/${name}/resume`, {
62
+ method: 'POST',
63
+ headers: { 'Content-Type': 'application/json' },
64
+ body: JSON.stringify({ threadId, answer }),
65
+ signal,
56
66
  });
57
67
  }
58
68
 
@@ -98,6 +108,36 @@ export class ApiService {
98
108
  return res.json();
99
109
  }
100
110
 
111
+ async getLlmConfig() {
112
+ const res = await this._fetch('/api/llm/config');
113
+ return res.json();
114
+ }
115
+
116
+ async saveLlmModel(name, config) {
117
+ const res = await this._fetch(`/api/llm/config/models/${encodeURIComponent(name)}`, {
118
+ method: 'PUT',
119
+ headers: { 'Content-Type': 'application/json' },
120
+ body: JSON.stringify(config),
121
+ });
122
+ return res.json();
123
+ }
124
+
125
+ async deleteLlmModel(name) {
126
+ const res = await this._fetch(`/api/llm/config/models/${encodeURIComponent(name)}`, {
127
+ method: 'DELETE',
128
+ });
129
+ return res.json();
130
+ }
131
+
132
+ async saveLlmEmbedding(name, config) {
133
+ const res = await this._fetch(`/api/llm/config/embeddings/${encodeURIComponent(name)}`, {
134
+ method: 'PUT',
135
+ headers: { 'Content-Type': 'application/json' },
136
+ body: JSON.stringify(config),
137
+ });
138
+ return res.json();
139
+ }
140
+
101
141
  async chatLLM(name, message) {
102
142
  const res = await this._fetch(`/api/llm/${name}/chat`, {
103
143
  method: 'POST',
@@ -263,6 +303,160 @@ export class ApiService {
263
303
  return new EventSource(`/api/tasks/${id}/stream`);
264
304
  }
265
305
 
306
+ // Local LLM
307
+ async getLocalLlmStatus() {
308
+ const res = await this._fetch('/api/local-llm/status');
309
+ return res.json();
310
+ }
311
+
312
+ async getLocalLlmModels() {
313
+ const res = await this._fetch('/api/local-llm/models');
314
+ return res.json();
315
+ }
316
+
317
+ async activateLocalModel(id) {
318
+ const res = await this._fetch(`/api/local-llm/models/${encodeURIComponent(id)}/activate`, {
319
+ method: 'POST',
320
+ headers: { 'Content-Type': 'application/json' },
321
+ body: JSON.stringify({}),
322
+ });
323
+ return res.json();
324
+ }
325
+
326
+ async deleteLocalModel(id) {
327
+ const res = await this._fetch(`/api/local-llm/models/${encodeURIComponent(id)}`, {
328
+ method: 'DELETE',
329
+ });
330
+ return res.json();
331
+ }
332
+
333
+ browseHuggingFace(query, limit = 10, format = 'gguf') {
334
+ return this._fetch(`/api/local-llm/browse?q=${encodeURIComponent(query)}&limit=${limit}&format=${format}`)
335
+ .then(r => r.json());
336
+ }
337
+
338
+ downloadLocalModel(repo, fileName, type = 'gguf') {
339
+ const params = new URLSearchParams({ repo });
340
+ if (type === 'mlx') {
341
+ params.set('type', 'mlx');
342
+ } else {
343
+ params.set('fileName', fileName);
344
+ }
345
+ return new EventSource(`/api/local-llm/models/download?${params.toString()}`);
346
+ }
347
+
348
+ async getActiveDownloads() {
349
+ const res = await this._fetch('/api/local-llm/models/downloads');
350
+ return res.json();
351
+ }
352
+
353
+ async getInterruptedDownloads() {
354
+ const res = await this._fetch('/api/local-llm/models/interrupted');
355
+ return res.json();
356
+ }
357
+
358
+ async deleteInterruptedDownload(fileName) {
359
+ const res = await this._fetch(`/api/local-llm/models/interrupted/${encodeURIComponent(fileName)}`, {
360
+ method: 'DELETE',
361
+ });
362
+ return res.json();
363
+ }
364
+
365
+ async activateLocalEmbedding(id) {
366
+ const res = await this._fetch(`/api/local-llm/models/${encodeURIComponent(id)}/activate-embedding`, {
367
+ method: 'POST',
368
+ });
369
+ return res.json();
370
+ }
371
+
372
+ async stopLocalLlm(engine) {
373
+ const res = await this._fetch('/api/local-llm/stop', {
374
+ method: 'POST',
375
+ headers: { 'Content-Type': 'application/json' },
376
+ body: JSON.stringify(engine ? { engine } : {}),
377
+ });
378
+ return res.json();
379
+ }
380
+
381
+ async stopLocalEmbedding(engine) {
382
+ const res = await this._fetch('/api/local-llm/stop-embedding', {
383
+ method: 'POST',
384
+ headers: { 'Content-Type': 'application/json' },
385
+ body: JSON.stringify(engine ? { engine } : {}),
386
+ });
387
+ return res.json();
388
+ }
389
+
390
+ async checkLlamaUpdate() {
391
+ const res = await this._fetch('/api/local-llm/check-update');
392
+ return res.json();
393
+ }
394
+
395
+ async updateLlamaBinary() {
396
+ const res = await this._fetch('/api/local-llm/update-binary', { method: 'POST' });
397
+ return res.json();
398
+ }
399
+
400
+ async getEngines() {
401
+ const res = await this._fetch('/api/local-llm/engines');
402
+ return res.json();
403
+ }
404
+
405
+ async activateEngine(engine, model, role = 'chat') {
406
+ const res = await this._fetch('/api/local-llm/engines/activate', {
407
+ method: 'POST',
408
+ headers: { 'Content-Type': 'application/json' },
409
+ body: JSON.stringify({ engine, model, role }),
410
+ });
411
+ return res.json();
412
+ }
413
+
414
+ async unloadEngineModel(engine, model, instanceId) {
415
+ const res = await this._fetch('/api/local-llm/engines/unload', {
416
+ method: 'POST',
417
+ headers: { 'Content-Type': 'application/json' },
418
+ body: JSON.stringify({ engine, model, ...(instanceId ? { instanceId } : {}) }),
419
+ });
420
+ return res.json();
421
+ }
422
+
423
+ async getEngineUrls() {
424
+ const res = await this._fetch('/api/local-llm/engines/urls');
425
+ return res.json();
426
+ }
427
+
428
+ async setEngineUrl(engine, url) {
429
+ const res = await this._fetch('/api/local-llm/engines/urls', {
430
+ method: 'POST',
431
+ headers: { 'Content-Type': 'application/json' },
432
+ body: JSON.stringify({ engine, url }),
433
+ });
434
+ return res.json();
435
+ }
436
+
437
+ async setEngineContext(contextSize) {
438
+ const res = await this._fetch('/api/local-llm/engines/context', {
439
+ method: 'POST',
440
+ headers: { 'Content-Type': 'application/json' },
441
+ body: JSON.stringify({ contextSize }),
442
+ });
443
+ return res.json();
444
+ }
445
+
446
+ async checkMlxUpdate() {
447
+ const res = await this._fetch('/api/local-llm/check-mlx-update');
448
+ return res.json();
449
+ }
450
+
451
+ async updateMlxBinary() {
452
+ const res = await this._fetch('/api/local-llm/update-mlx-binary', { method: 'POST' });
453
+ return res.json();
454
+ }
455
+
456
+ streamLogs() {
457
+ return new EventSource('/api/logs/stream');
458
+ }
459
+
266
460
  async getGraphConfig() {
267
461
  const res = await this._fetch('/api/graph/config');
268
462
  return res.json();
@@ -14,13 +14,14 @@ class SessionStore {
14
14
  return this.getAll().find(s => s.id === id) || null;
15
15
  }
16
16
 
17
- create({ agentName, agentType, llmName }) {
17
+ create({ agentName, agentType, llmName, workflowName }) {
18
18
  const sessions = this.getAll();
19
19
  const session = {
20
20
  id: 'session-' + Date.now() + '-' + Math.random().toString(36).substring(2, 9),
21
21
  agentName: agentName || null,
22
22
  agentType: agentType || 'agent',
23
23
  llmName: llmName || null,
24
+ workflowName: workflowName || null,
24
25
  title: 'New conversation',
25
26
  messages: [],
26
27
  createdAt: Date.now(),
@@ -39,12 +40,14 @@ class SessionStore {
39
40
  return session;
40
41
  }
41
42
 
42
- addMessage(sessionId, role, content) {
43
+ addMessage(sessionId, role, content, meta) {
43
44
  const sessions = this.getAll();
44
45
  const session = sessions.find(s => s.id === sessionId);
45
46
  if (!session) return;
46
47
 
47
- session.messages.push({ role, content });
48
+ const msg = { role, content };
49
+ if (meta) msg.meta = meta;
50
+ session.messages.push(msg);
48
51
  session.updatedAt = Date.now();
49
52
 
50
53
  // Set title from first user message
@@ -0,0 +1,183 @@
1
+
2
+ import { sessionStore } from './SessionStore.js';
3
+
4
+ class StreamManager {
5
+ constructor() {
6
+ this.streams = new Map();
7
+ }
8
+
9
+ start(sessionId, { response, abortController, streamType, inputMessage, responseId }) {
10
+ const existing = this.streams.get(sessionId);
11
+ if (existing?.abortController) {
12
+ try { existing.abortController.abort(); } catch {}
13
+ }
14
+
15
+ const state = {
16
+ streamType,
17
+ abortController,
18
+ inputMessage,
19
+ responseId,
20
+ content: '',
21
+ events: [],
22
+ status: 'streaming',
23
+ startTime: Date.now(),
24
+ usageData: null,
25
+ error: null,
26
+ listeners: new Set(),
27
+ taskId: null,
28
+ };
29
+
30
+ this.streams.set(sessionId, state);
31
+ this._process(sessionId, response, state);
32
+ return state;
33
+ }
34
+
35
+ getState(sessionId) {
36
+ return this.streams.get(sessionId) || null;
37
+ }
38
+
39
+ isActive(sessionId) {
40
+ const s = this.streams.get(sessionId);
41
+ return s?.status === 'streaming';
42
+ }
43
+
44
+ subscribe(sessionId, callback) {
45
+ const state = this.streams.get(sessionId);
46
+ if (!state) return () => {};
47
+ state.listeners.add(callback);
48
+ return () => state.listeners.delete(callback);
49
+ }
50
+
51
+ cancel(sessionId) {
52
+ const state = this.streams.get(sessionId);
53
+ if (state?.abortController) state.abortController.abort();
54
+ }
55
+
56
+ _buildMeta(state) {
57
+ const thinking = [];
58
+ const tools = [];
59
+ let currentThinking = '';
60
+ let lastWasThinking = false;
61
+
62
+ for (const event of state.events) {
63
+ if (event.type === 'thinking') {
64
+ currentThinking += event.content;
65
+ lastWasThinking = true;
66
+ } else {
67
+ if (lastWasThinking && currentThinking) {
68
+ thinking.push(currentThinking);
69
+ currentThinking = '';
70
+ }
71
+ lastWasThinking = false;
72
+ }
73
+
74
+ if (event.type === 'tool_start') {
75
+ tools.push({ runId: event.runId, tool: event.tool, input: event.input });
76
+ }
77
+ if (event.type === 'tool_end') {
78
+ const t = tools.find(t => t.runId === event.runId);
79
+ if (t) t.output = event.output;
80
+ }
81
+ }
82
+ if (currentThinking) thinking.push(currentThinking);
83
+
84
+ const elapsed = state.startTime ? Date.now() - state.startTime : 0;
85
+ const hasRealUsage = state.usageData && (state.usageData.input_tokens > 0 || state.usageData.output_tokens > 0);
86
+ const stats = {
87
+ elapsed,
88
+ inputTokens: hasRealUsage ? state.usageData.input_tokens : Math.round((state.inputMessage || '').length / 4),
89
+ outputTokens: hasRealUsage ? state.usageData.output_tokens : Math.round((state.content || '').length / 4),
90
+ cancelled: state.status === 'cancelled',
91
+ estimated: !hasRealUsage,
92
+ };
93
+
94
+ if (thinking.length === 0 && tools.length === 0 && !stats.elapsed) return null;
95
+ return { thinking, tools, stats };
96
+ }
97
+
98
+ async _process(sessionId, response, state) {
99
+ const reader = response.body.getReader();
100
+ const decoder = new TextDecoder();
101
+ let buffer = '';
102
+
103
+ try {
104
+ while (true) {
105
+ const { done, value } = await reader.read();
106
+ if (done) break;
107
+
108
+ buffer += decoder.decode(value, { stream: true });
109
+ const lines = buffer.split('\n');
110
+ buffer = lines.pop() || '';
111
+
112
+ for (const line of lines) {
113
+ if (!line.trim() || !line.startsWith('data: ')) continue;
114
+ const data = line.slice(6);
115
+ if (data === '[DONE]') continue;
116
+
117
+ try {
118
+ const event = JSON.parse(data);
119
+
120
+ // Capture task ID from server (first event)
121
+ if (event.type === 'task_id') {
122
+ state.taskId = event.taskId;
123
+ continue;
124
+ }
125
+
126
+ state.events.push(event);
127
+
128
+ if (state.streamType === 'agent') {
129
+ if (event.type === 'content') state.content += event.content;
130
+ if (event.type === 'usage') {
131
+ state.usageData = {
132
+ input_tokens: event.input_tokens || 0,
133
+ output_tokens: event.output_tokens || 0,
134
+ total_tokens: event.total_tokens || 0,
135
+ };
136
+ }
137
+ if (event.error) state.error = event.error;
138
+ } else {
139
+ if (event.type === 'usage') {
140
+ state.usageData = {
141
+ input_tokens: event.input_tokens || 0,
142
+ output_tokens: event.output_tokens || 0,
143
+ total_tokens: event.total_tokens || 0,
144
+ };
145
+ } else if (event.type === 'thinking') {
146
+ // thinking events are passed through to listeners, not accumulated into content
147
+ } else if (event.error) {
148
+ state.error = event.error;
149
+ } else if (event.content) {
150
+ state.content += event.content;
151
+ }
152
+ }
153
+
154
+ for (const cb of state.listeners) cb(event);
155
+ } catch (e) {
156
+ console.error('StreamManager parse error:', e);
157
+ }
158
+ }
159
+ }
160
+ state.status = 'done';
161
+ } catch (e) {
162
+ state.status = e.name === 'AbortError' ? 'cancelled' : 'error';
163
+ if (e.name !== 'AbortError') state.error = e.message;
164
+ }
165
+
166
+ if (state.content || state.events.length > 0) {
167
+ const meta = this._buildMeta(state);
168
+ sessionStore.addMessage(sessionId, 'assistant', state.content || '', meta);
169
+ }
170
+
171
+ for (const cb of state.listeners) {
172
+ cb({ type: '_stream_end', status: state.status });
173
+ }
174
+
175
+ setTimeout(() => {
176
+ if (this.streams.get(sessionId) === state) {
177
+ this.streams.delete(sessionId);
178
+ }
179
+ }, 10000);
180
+ }
181
+ }
182
+
183
+ export const streamManager = new StreamManager();
@@ -2,7 +2,7 @@
2
2
  class Store extends EventTarget {
3
3
  constructor() {
4
4
  super();
5
- const validTabs = ['agents', 'workflows', 'knowledge', 'mcp', 'skills', 'monitor', 'ide'];
5
+ const validTabs = ['agents', 'workflows', 'knowledge', 'graph', 'mcp', 'skills', 'monitor', 'llm', 'ide'];
6
6
  const hashTab = window.location.hash.replace('#', '');
7
7
  const initialTab = validTabs.includes(hashTab) ? hashTab : 'agents';
8
8
 
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Shared card utilities for consistent UI across views.
3
+ */
4
+
5
+ export function escapeHtml(text) {
6
+ if (!text) return '';
7
+ return String(text).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
8
+ }
9
+
10
+ export function resourceCard({ id, selected, content, className = '' }) {
11
+ const cls = selected ? 'card active' : 'card';
12
+ return `<div class="${cls} ${className}" data-name="${escapeHtml(id)}">${content}</div>`;
13
+ }
14
+
15
+ export function badge(text, variant = 'accent') {
16
+ return `<span class="badge badge-${variant}">${escapeHtml(text)}</span>`;
17
+ }
18
+
19
+ export function statusDot(status) {
20
+ return `<span class="status-dot status-dot-${status}"></span>`;
21
+ }
@@ -6,8 +6,7 @@ export class MarkdownRenderer {
6
6
  // Configure marked for streaming-friendly rendering
7
7
  if (typeof marked !== 'undefined') {
8
8
  const renderer = new marked.Renderer();
9
- renderer.link = ({ href, title, tokens }) => {
10
- const text = this.#parseInlineTokens(tokens);
9
+ renderer.link = (href, title, text) => {
11
10
  const titleAttr = title ? ` title="${title}"` : '';
12
11
  return `<a href="${href}"${titleAttr} target="_blank" rel="noopener noreferrer">${text}</a>`;
13
12
  };
@@ -24,11 +23,6 @@ export class MarkdownRenderer {
24
23
 
25
24
  }
26
25
 
27
- #parseInlineTokens(tokens) {
28
- if (!tokens) return '';
29
- return tokens.map(t => t.raw || t.text || '').join('');
30
- }
31
-
32
26
  /**
33
27
  * Render markdown string to sanitized HTML
34
28
  * @param {string} markdown - Raw markdown text