agent-orcha 0.0.5 → 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 (404) hide show
  1. package/README.md +250 -1275
  2. package/dist/lib/agents/agent-executor.d.ts +4 -2
  3. package/dist/lib/agents/agent-executor.d.ts.map +1 -1
  4. package/dist/lib/agents/agent-executor.js +85 -53
  5. package/dist/lib/agents/agent-executor.js.map +1 -1
  6. package/dist/lib/agents/agent-loader.d.ts +3 -0
  7. package/dist/lib/agents/agent-loader.d.ts.map +1 -1
  8. package/dist/lib/agents/agent-loader.js +10 -1
  9. package/dist/lib/agents/agent-loader.js.map +1 -1
  10. package/dist/lib/agents/react-loop.d.ts.map +1 -1
  11. package/dist/lib/agents/react-loop.js +207 -142
  12. package/dist/lib/agents/react-loop.js.map +1 -1
  13. package/dist/lib/agents/types.d.ts +181 -18
  14. package/dist/lib/agents/types.d.ts.map +1 -1
  15. package/dist/lib/agents/types.js +18 -2
  16. package/dist/lib/agents/types.js.map +1 -1
  17. package/dist/lib/functions/function-loader.d.ts +2 -0
  18. package/dist/lib/functions/function-loader.d.ts.map +1 -1
  19. package/dist/lib/functions/function-loader.js +10 -0
  20. package/dist/lib/functions/function-loader.js.map +1 -1
  21. package/dist/lib/functions/simple-function-wrapper.js +3 -3
  22. package/dist/lib/functions/simple-function-wrapper.js.map +1 -1
  23. package/dist/lib/integrations/email.d.ts +38 -0
  24. package/dist/lib/integrations/email.d.ts.map +1 -0
  25. package/dist/lib/integrations/email.js +249 -0
  26. package/dist/lib/integrations/email.js.map +1 -0
  27. package/dist/lib/integrations/integration-manager.d.ts +5 -0
  28. package/dist/lib/integrations/integration-manager.d.ts.map +1 -1
  29. package/dist/lib/integrations/integration-manager.js +53 -3
  30. package/dist/lib/integrations/integration-manager.js.map +1 -1
  31. package/dist/lib/integrations/types.d.ts +187 -4
  32. package/dist/lib/integrations/types.d.ts.map +1 -1
  33. package/dist/lib/integrations/types.js +24 -1
  34. package/dist/lib/integrations/types.js.map +1 -1
  35. package/dist/lib/knowledge/knowledge-store.d.ts +7 -1
  36. package/dist/lib/knowledge/knowledge-store.d.ts.map +1 -1
  37. package/dist/lib/knowledge/knowledge-store.js +96 -8
  38. package/dist/lib/knowledge/knowledge-store.js.map +1 -1
  39. package/dist/lib/knowledge/loaders/file-loaders.d.ts +8 -3
  40. package/dist/lib/knowledge/loaders/file-loaders.d.ts.map +1 -1
  41. package/dist/lib/knowledge/loaders/file-loaders.js +96 -75
  42. package/dist/lib/knowledge/loaders/file-loaders.js.map +1 -1
  43. package/dist/lib/knowledge/loaders/web-loader.d.ts +12 -3
  44. package/dist/lib/knowledge/loaders/web-loader.d.ts.map +1 -1
  45. package/dist/lib/knowledge/loaders/web-loader.js +56 -22
  46. package/dist/lib/knowledge/loaders/web-loader.js.map +1 -1
  47. package/dist/lib/knowledge/sqlite-store.d.ts.map +1 -1
  48. package/dist/lib/knowledge/sqlite-store.js +19 -10
  49. package/dist/lib/knowledge/sqlite-store.js.map +1 -1
  50. package/dist/lib/knowledge/types.d.ts +69 -33
  51. package/dist/lib/knowledge/types.d.ts.map +1 -1
  52. package/dist/lib/knowledge/types.js +18 -3
  53. package/dist/lib/knowledge/types.js.map +1 -1
  54. package/dist/lib/llm/index.d.ts +1 -1
  55. package/dist/lib/llm/index.d.ts.map +1 -1
  56. package/dist/lib/llm/index.js +1 -1
  57. package/dist/lib/llm/index.js.map +1 -1
  58. package/dist/lib/llm/llm-call-logger.d.ts +3 -1
  59. package/dist/lib/llm/llm-call-logger.d.ts.map +1 -1
  60. package/dist/lib/llm/llm-call-logger.js +31 -26
  61. package/dist/lib/llm/llm-call-logger.js.map +1 -1
  62. package/dist/lib/llm/llm-config.d.ts +59 -8
  63. package/dist/lib/llm/llm-config.d.ts.map +1 -1
  64. package/dist/lib/llm/llm-config.js +163 -17
  65. package/dist/lib/llm/llm-config.js.map +1 -1
  66. package/dist/lib/llm/llm-factory.d.ts +1 -2
  67. package/dist/lib/llm/llm-factory.d.ts.map +1 -1
  68. package/dist/lib/llm/llm-factory.js +44 -8
  69. package/dist/lib/llm/llm-factory.js.map +1 -1
  70. package/dist/lib/llm/providers/anthropic-chat-model.d.ts +5 -1
  71. package/dist/lib/llm/providers/anthropic-chat-model.d.ts.map +1 -1
  72. package/dist/lib/llm/providers/anthropic-chat-model.js +118 -42
  73. package/dist/lib/llm/providers/anthropic-chat-model.js.map +1 -1
  74. package/dist/lib/llm/providers/gemini-chat-model.d.ts +3 -2
  75. package/dist/lib/llm/providers/gemini-chat-model.d.ts.map +1 -1
  76. package/dist/lib/llm/providers/gemini-chat-model.js +83 -24
  77. package/dist/lib/llm/providers/gemini-chat-model.js.map +1 -1
  78. package/dist/lib/llm/providers/openai-chat-model.d.ts +20 -1
  79. package/dist/lib/llm/providers/openai-chat-model.d.ts.map +1 -1
  80. package/dist/lib/llm/providers/openai-chat-model.js +265 -32
  81. package/dist/lib/llm/providers/openai-chat-model.js.map +1 -1
  82. package/dist/lib/llm/providers/openai-embeddings.d.ts.map +1 -1
  83. package/dist/lib/llm/providers/openai-embeddings.js +41 -10
  84. package/dist/lib/llm/providers/openai-embeddings.js.map +1 -1
  85. package/dist/lib/local-llm/binary-manager.d.ts +66 -0
  86. package/dist/lib/local-llm/binary-manager.d.ts.map +1 -0
  87. package/dist/lib/local-llm/binary-manager.js +441 -0
  88. package/dist/lib/local-llm/binary-manager.js.map +1 -0
  89. package/dist/lib/local-llm/engine-interface.d.ts +47 -0
  90. package/dist/lib/local-llm/engine-interface.d.ts.map +1 -0
  91. package/dist/lib/local-llm/engine-interface.js +2 -0
  92. package/dist/lib/local-llm/engine-interface.js.map +1 -0
  93. package/dist/lib/local-llm/engine-registry.d.ts +20 -0
  94. package/dist/lib/local-llm/engine-registry.d.ts.map +1 -0
  95. package/dist/lib/local-llm/engine-registry.js +56 -0
  96. package/dist/lib/local-llm/engine-registry.js.map +1 -0
  97. package/dist/lib/local-llm/engines/llama-cpp-engine.d.ts +31 -0
  98. package/dist/lib/local-llm/engines/llama-cpp-engine.d.ts.map +1 -0
  99. package/dist/lib/local-llm/engines/llama-cpp-engine.js +164 -0
  100. package/dist/lib/local-llm/engines/llama-cpp-engine.js.map +1 -0
  101. package/dist/lib/local-llm/engines/mlx-serve-engine.d.ts +31 -0
  102. package/dist/lib/local-llm/engines/mlx-serve-engine.d.ts.map +1 -0
  103. package/dist/lib/local-llm/engines/mlx-serve-engine.js +161 -0
  104. package/dist/lib/local-llm/engines/mlx-serve-engine.js.map +1 -0
  105. package/dist/lib/local-llm/gguf-reader.d.ts +20 -0
  106. package/dist/lib/local-llm/gguf-reader.d.ts.map +1 -0
  107. package/dist/lib/local-llm/gguf-reader.js +190 -0
  108. package/dist/lib/local-llm/gguf-reader.js.map +1 -0
  109. package/dist/lib/local-llm/index.d.ts +9 -0
  110. package/dist/lib/local-llm/index.d.ts.map +1 -0
  111. package/dist/lib/local-llm/index.js +6 -0
  112. package/dist/lib/local-llm/index.js.map +1 -0
  113. package/dist/lib/local-llm/llama-server-process.d.ts +42 -0
  114. package/dist/lib/local-llm/llama-server-process.d.ts.map +1 -0
  115. package/dist/lib/local-llm/llama-server-process.js +237 -0
  116. package/dist/lib/local-llm/llama-server-process.js.map +1 -0
  117. package/dist/lib/local-llm/mlx-binary-manager.d.ts +33 -0
  118. package/dist/lib/local-llm/mlx-binary-manager.d.ts.map +1 -0
  119. package/dist/lib/local-llm/mlx-binary-manager.js +211 -0
  120. package/dist/lib/local-llm/mlx-binary-manager.js.map +1 -0
  121. package/dist/lib/local-llm/mlx-server-process.d.ts +26 -0
  122. package/dist/lib/local-llm/mlx-server-process.d.ts.map +1 -0
  123. package/dist/lib/local-llm/mlx-server-process.js +210 -0
  124. package/dist/lib/local-llm/mlx-server-process.js.map +1 -0
  125. package/dist/lib/local-llm/model-manager.d.ts +33 -0
  126. package/dist/lib/local-llm/model-manager.d.ts.map +1 -0
  127. package/dist/lib/local-llm/model-manager.js +591 -0
  128. package/dist/lib/local-llm/model-manager.js.map +1 -0
  129. package/dist/lib/local-llm/types.d.ts +51 -0
  130. package/dist/lib/local-llm/types.d.ts.map +1 -0
  131. package/dist/lib/local-llm/types.js +2 -0
  132. package/dist/lib/local-llm/types.js.map +1 -0
  133. package/dist/lib/logger.d.ts +2 -0
  134. package/dist/lib/logger.d.ts.map +1 -1
  135. package/dist/lib/logger.js +68 -6
  136. package/dist/lib/logger.js.map +1 -1
  137. package/dist/lib/mcp/mcp-client.d.ts.map +1 -1
  138. package/dist/lib/mcp/mcp-client.js +5 -3
  139. package/dist/lib/mcp/mcp-client.js.map +1 -1
  140. package/dist/lib/mcp/types.d.ts +0 -9
  141. package/dist/lib/mcp/types.d.ts.map +1 -1
  142. package/dist/lib/mcp/types.js +1 -2
  143. package/dist/lib/mcp/types.js.map +1 -1
  144. package/dist/lib/memory/memory-manager.d.ts +1 -0
  145. package/dist/lib/memory/memory-manager.d.ts.map +1 -1
  146. package/dist/lib/memory/memory-manager.js +9 -0
  147. package/dist/lib/memory/memory-manager.js.map +1 -1
  148. package/dist/lib/orchestrator.d.ts +11 -8
  149. package/dist/lib/orchestrator.d.ts.map +1 -1
  150. package/dist/lib/orchestrator.js +246 -5
  151. package/dist/lib/orchestrator.js.map +1 -1
  152. package/dist/lib/sandbox/cdp-client.d.ts +15 -0
  153. package/dist/lib/sandbox/cdp-client.d.ts.map +1 -0
  154. package/dist/lib/sandbox/cdp-client.js +139 -0
  155. package/dist/lib/sandbox/cdp-client.js.map +1 -0
  156. package/dist/lib/sandbox/html-to-markdown.d.ts +9 -1
  157. package/dist/lib/sandbox/html-to-markdown.d.ts.map +1 -1
  158. package/dist/lib/sandbox/html-to-markdown.js +67 -10
  159. package/dist/lib/sandbox/html-to-markdown.js.map +1 -1
  160. package/dist/lib/sandbox/index.d.ts +6 -0
  161. package/dist/lib/sandbox/index.d.ts.map +1 -1
  162. package/dist/lib/sandbox/index.js +5 -0
  163. package/dist/lib/sandbox/index.js.map +1 -1
  164. package/dist/lib/sandbox/page-readiness.d.ts +37 -0
  165. package/dist/lib/sandbox/page-readiness.d.ts.map +1 -0
  166. package/dist/lib/sandbox/page-readiness.js +268 -0
  167. package/dist/lib/sandbox/page-readiness.js.map +1 -0
  168. package/dist/lib/sandbox/sandbox-browser.d.ts +4 -0
  169. package/dist/lib/sandbox/sandbox-browser.d.ts.map +1 -0
  170. package/dist/lib/sandbox/sandbox-browser.js +316 -0
  171. package/dist/lib/sandbox/sandbox-browser.js.map +1 -0
  172. package/dist/lib/sandbox/sandbox-container.d.ts +39 -0
  173. package/dist/lib/sandbox/sandbox-container.d.ts.map +1 -0
  174. package/dist/lib/sandbox/sandbox-container.js +176 -0
  175. package/dist/lib/sandbox/sandbox-container.js.map +1 -0
  176. package/dist/lib/sandbox/sandbox-file.d.ts +4 -0
  177. package/dist/lib/sandbox/sandbox-file.d.ts.map +1 -0
  178. package/dist/lib/sandbox/sandbox-file.js +169 -0
  179. package/dist/lib/sandbox/sandbox-file.js.map +1 -0
  180. package/dist/lib/sandbox/sandbox-shell.d.ts +5 -0
  181. package/dist/lib/sandbox/sandbox-shell.d.ts.map +1 -0
  182. package/dist/lib/sandbox/sandbox-shell.js +111 -0
  183. package/dist/lib/sandbox/sandbox-shell.js.map +1 -0
  184. package/dist/lib/sandbox/sandbox-web.d.ts.map +1 -1
  185. package/dist/lib/sandbox/sandbox-web.js +64 -24
  186. package/dist/lib/sandbox/sandbox-web.js.map +1 -1
  187. package/dist/lib/sandbox/types.d.ts +9 -0
  188. package/dist/lib/sandbox/types.d.ts.map +1 -1
  189. package/dist/lib/sandbox/types.js +1 -0
  190. package/dist/lib/sandbox/types.js.map +1 -1
  191. package/dist/lib/sandbox/vision-browser.d.ts +4 -0
  192. package/dist/lib/sandbox/vision-browser.d.ts.map +1 -0
  193. package/dist/lib/sandbox/vision-browser.js +298 -0
  194. package/dist/lib/sandbox/vision-browser.js.map +1 -0
  195. package/dist/lib/sea/app-window.d.ts +7 -0
  196. package/dist/lib/sea/app-window.d.ts.map +1 -0
  197. package/dist/lib/sea/app-window.js +95 -0
  198. package/dist/lib/sea/app-window.js.map +1 -0
  199. package/dist/lib/sea/bootstrap.d.ts +18 -0
  200. package/dist/lib/sea/bootstrap.d.ts.map +1 -0
  201. package/dist/lib/sea/bootstrap.js +103 -0
  202. package/dist/lib/sea/bootstrap.js.map +1 -0
  203. package/dist/lib/sea/sqlite-vec-shim.d.ts +3 -0
  204. package/dist/lib/sea/sqlite-vec-shim.d.ts.map +1 -0
  205. package/dist/lib/sea/sqlite-vec-shim.js +10 -0
  206. package/dist/lib/sea/sqlite-vec-shim.js.map +1 -0
  207. package/dist/lib/skills/skill-loader.d.ts +2 -0
  208. package/dist/lib/skills/skill-loader.d.ts.map +1 -1
  209. package/dist/lib/skills/skill-loader.js +12 -1
  210. package/dist/lib/skills/skill-loader.js.map +1 -1
  211. package/dist/lib/tasks/task-manager.d.ts +3 -1
  212. package/dist/lib/tasks/task-manager.d.ts.map +1 -1
  213. package/dist/lib/tasks/task-manager.js +11 -0
  214. package/dist/lib/tasks/task-manager.js.map +1 -1
  215. package/dist/lib/tasks/task-store.d.ts +1 -1
  216. package/dist/lib/tasks/task-store.d.ts.map +1 -1
  217. package/dist/lib/tasks/task-store.js.map +1 -1
  218. package/dist/lib/tasks/types.d.ts +18 -0
  219. package/dist/lib/tasks/types.d.ts.map +1 -1
  220. package/dist/lib/tools/built-in/integration-tools.d.ts +4 -0
  221. package/dist/lib/tools/built-in/integration-tools.d.ts.map +1 -0
  222. package/dist/lib/tools/built-in/integration-tools.js +47 -0
  223. package/dist/lib/tools/built-in/integration-tools.js.map +1 -0
  224. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts +1 -2
  225. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts.map +1 -1
  226. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js +17 -17
  227. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js.map +1 -1
  228. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.d.ts.map +1 -1
  229. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js +2 -4
  230. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js.map +1 -1
  231. package/dist/lib/tools/built-in/knowledge-search.tool.js +4 -4
  232. package/dist/lib/tools/built-in/knowledge-search.tool.js.map +1 -1
  233. package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts.map +1 -1
  234. package/dist/lib/tools/built-in/knowledge-sql.tool.js +74 -40
  235. package/dist/lib/tools/built-in/knowledge-sql.tool.js.map +1 -1
  236. package/dist/lib/tools/built-in/knowledge-tools-factory.js +2 -2
  237. package/dist/lib/tools/built-in/knowledge-tools-factory.js.map +1 -1
  238. package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts +1 -2
  239. package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts.map +1 -1
  240. package/dist/lib/tools/built-in/knowledge-traverse.tool.js +5 -11
  241. package/dist/lib/tools/built-in/knowledge-traverse.tool.js.map +1 -1
  242. package/dist/lib/tools/built-in/query-validators.d.ts.map +1 -1
  243. package/dist/lib/tools/built-in/query-validators.js +4 -0
  244. package/dist/lib/tools/built-in/query-validators.js.map +1 -1
  245. package/dist/lib/tools/workspace/workspace-tools.d.ts +1 -0
  246. package/dist/lib/tools/workspace/workspace-tools.d.ts.map +1 -1
  247. package/dist/lib/tools/workspace/workspace-tools.js +44 -4
  248. package/dist/lib/tools/workspace/workspace-tools.js.map +1 -1
  249. package/dist/lib/triggers/cron-trigger.d.ts +1 -1
  250. package/dist/lib/triggers/cron-trigger.d.ts.map +1 -1
  251. package/dist/lib/triggers/cron-trigger.js.map +1 -1
  252. package/dist/lib/triggers/trigger-manager.d.ts +1 -0
  253. package/dist/lib/triggers/trigger-manager.d.ts.map +1 -1
  254. package/dist/lib/triggers/trigger-manager.js +26 -0
  255. package/dist/lib/triggers/trigger-manager.js.map +1 -1
  256. package/dist/lib/triggers/webhook-trigger.d.ts +1 -1
  257. package/dist/lib/triggers/webhook-trigger.d.ts.map +1 -1
  258. package/dist/lib/triggers/webhook-trigger.js.map +1 -1
  259. package/dist/lib/types/llm-types.d.ts +22 -4
  260. package/dist/lib/types/llm-types.d.ts.map +1 -1
  261. package/dist/lib/types/llm-types.js +50 -0
  262. package/dist/lib/types/llm-types.js.map +1 -1
  263. package/dist/lib/types/tool-factory.d.ts +2 -2
  264. package/dist/lib/types/tool-factory.d.ts.map +1 -1
  265. package/dist/lib/types/tool-factory.js +9 -2
  266. package/dist/lib/types/tool-factory.js.map +1 -1
  267. package/dist/lib/utils/document-extract.d.ts +10 -0
  268. package/dist/lib/utils/document-extract.d.ts.map +1 -0
  269. package/dist/lib/utils/document-extract.js +149 -0
  270. package/dist/lib/utils/document-extract.js.map +1 -0
  271. package/dist/lib/utils/env-substitution.d.ts +6 -0
  272. package/dist/lib/utils/env-substitution.d.ts.map +1 -0
  273. package/dist/lib/utils/env-substitution.js +15 -0
  274. package/dist/lib/utils/env-substitution.js.map +1 -0
  275. package/dist/lib/workflows/react-workflow-executor.d.ts.map +1 -1
  276. package/dist/lib/workflows/react-workflow-executor.js +23 -17
  277. package/dist/lib/workflows/react-workflow-executor.js.map +1 -1
  278. package/dist/lib/workflows/types.d.ts +81 -55
  279. package/dist/lib/workflows/types.d.ts.map +1 -1
  280. package/dist/lib/workflows/types.js +10 -0
  281. package/dist/lib/workflows/types.js.map +1 -1
  282. package/dist/lib/workflows/workflow-loader.d.ts +3 -0
  283. package/dist/lib/workflows/workflow-loader.d.ts.map +1 -1
  284. package/dist/lib/workflows/workflow-loader.js +10 -1
  285. package/dist/lib/workflows/workflow-loader.js.map +1 -1
  286. package/dist/public/assets/logo.png +0 -0
  287. package/dist/public/chat.html +39 -0
  288. package/dist/public/index.html +6 -176
  289. package/dist/public/src/components/AgentComposer.js +807 -0
  290. package/dist/public/src/components/AgentsView.js +1812 -508
  291. package/dist/public/src/components/AppRoot.js +125 -38
  292. package/dist/public/src/components/GraphView.js +382 -300
  293. package/dist/public/src/components/IdeView.js +277 -86
  294. package/dist/public/src/components/KnowledgeView.js +94 -130
  295. package/dist/public/src/components/LlmView.js +15 -19
  296. package/dist/public/src/components/LocalLlmView.js +2440 -0
  297. package/dist/public/src/components/LogViewer.js +155 -0
  298. package/dist/public/src/components/McpView.js +41 -49
  299. package/dist/public/src/components/MonitorView.js +174 -83
  300. package/dist/public/src/components/NavBar.js +16 -26
  301. package/dist/public/src/components/StandaloneChat.js +875 -0
  302. package/dist/public/src/services/ApiService.js +203 -4
  303. package/dist/public/src/services/SessionStore.js +86 -0
  304. package/dist/public/src/services/StreamManager.js +183 -0
  305. package/dist/public/src/store.js +1 -3
  306. package/dist/public/src/utils/card.js +21 -0
  307. package/dist/public/src/utils/markdown.js +7 -0
  308. package/dist/public/styles.css +2777 -0
  309. package/dist/src/cli/commands/init.d.ts.map +1 -1
  310. package/dist/src/cli/commands/init.js +7 -1
  311. package/dist/src/cli/commands/init.js.map +1 -1
  312. package/dist/src/cli/commands/start.d.ts.map +1 -1
  313. package/dist/src/cli/commands/start.js +28 -5
  314. package/dist/src/cli/commands/start.js.map +1 -1
  315. package/dist/src/cli/index.js +19 -5
  316. package/dist/src/cli/index.js.map +1 -1
  317. package/dist/src/index.js +7 -1
  318. package/dist/src/index.js.map +1 -1
  319. package/dist/src/middleware/auth.d.ts.map +1 -1
  320. package/dist/src/middleware/auth.js +28 -6
  321. package/dist/src/middleware/auth.js.map +1 -1
  322. package/dist/src/middleware/rate-limit.d.ts +8 -0
  323. package/dist/src/middleware/rate-limit.d.ts.map +1 -0
  324. package/dist/src/middleware/rate-limit.js +21 -0
  325. package/dist/src/middleware/rate-limit.js.map +1 -0
  326. package/dist/src/routes/agents.route.d.ts.map +1 -1
  327. package/dist/src/routes/agents.route.js +138 -10
  328. package/dist/src/routes/agents.route.js.map +1 -1
  329. package/dist/src/routes/chat.route.d.ts +3 -0
  330. package/dist/src/routes/chat.route.d.ts.map +1 -0
  331. package/dist/src/routes/chat.route.js +156 -0
  332. package/dist/src/routes/chat.route.js.map +1 -0
  333. package/dist/src/routes/files.route.d.ts.map +1 -1
  334. package/dist/src/routes/files.route.js +37 -2
  335. package/dist/src/routes/files.route.js.map +1 -1
  336. package/dist/src/routes/llm.route.d.ts.map +1 -1
  337. package/dist/src/routes/llm.route.js +263 -8
  338. package/dist/src/routes/llm.route.js.map +1 -1
  339. package/dist/src/routes/local-llm.route.d.ts +3 -0
  340. package/dist/src/routes/local-llm.route.d.ts.map +1 -0
  341. package/dist/src/routes/local-llm.route.js +688 -0
  342. package/dist/src/routes/local-llm.route.js.map +1 -0
  343. package/dist/src/routes/logs.route.d.ts +3 -0
  344. package/dist/src/routes/logs.route.d.ts.map +1 -0
  345. package/dist/src/routes/logs.route.js +24 -0
  346. package/dist/src/routes/logs.route.js.map +1 -0
  347. package/dist/src/routes/tasks.route.d.ts.map +1 -1
  348. package/dist/src/routes/tasks.route.js +15 -1
  349. package/dist/src/routes/tasks.route.js.map +1 -1
  350. package/dist/src/routes/vnc.route.d.ts +12 -0
  351. package/dist/src/routes/vnc.route.d.ts.map +1 -0
  352. package/dist/src/routes/vnc.route.js +74 -0
  353. package/dist/src/routes/vnc.route.js.map +1 -0
  354. package/dist/src/routes/workflows.route.d.ts.map +1 -1
  355. package/dist/src/routes/workflows.route.js +24 -0
  356. package/dist/src/routes/workflows.route.js.map +1 -1
  357. package/dist/src/server.d.ts.map +1 -1
  358. package/dist/src/server.js +29 -3
  359. package/dist/src/server.js.map +1 -1
  360. package/dist/templates/Demo.md +152 -0
  361. package/dist/templates/README.md +12 -3
  362. package/dist/templates/agents/actor.agent.yaml +34 -0
  363. package/dist/templates/agents/architect.agent.yaml +20 -13
  364. package/dist/templates/agents/chatbot.agent.yaml +23 -27
  365. package/dist/templates/agents/corporate.agent.yaml +64 -0
  366. package/dist/templates/agents/functions.agent.yaml +29 -0
  367. package/dist/templates/agents/investment-analyst.agent.yaml +79 -0
  368. package/dist/templates/agents/music-librarian.agent.yaml +46 -0
  369. package/dist/templates/agents/network-security.agent.yaml +81 -0
  370. package/dist/templates/agents/transport-security.agent.yaml +69 -0
  371. package/dist/templates/agents/web-engineer.agent.yaml +98 -0
  372. package/dist/templates/agents/web-pilot.agent.yaml +57 -0
  373. package/dist/templates/knowledge/music-store/LICENSE.md +11 -0
  374. package/dist/templates/knowledge/music-store/musicstore.sqlite +0 -0
  375. package/dist/templates/knowledge/music-store/tables.png +0 -0
  376. package/dist/templates/knowledge/music-store.knowledge.yaml +138 -0
  377. package/dist/templates/knowledge/org-chart/personnel.csv +21 -21
  378. package/dist/templates/knowledge/org-chart.knowledge.yaml +4 -0
  379. package/dist/templates/knowledge/patient-records.knowledge.yaml +20 -0
  380. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_0.pdf +0 -0
  381. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_1.pdf +0 -0
  382. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_10.pdf +0 -0
  383. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_11.pdf +0 -0
  384. package/dist/templates/knowledge/pet-store.knowledge.yaml +3 -0
  385. package/dist/templates/knowledge/security-incidents/incidents.json +55935 -0
  386. package/dist/templates/knowledge/security-incidents.knowledge.yaml +46 -0
  387. package/dist/templates/knowledge/{example.knowledge.yaml → transcripts.knowledge.yaml} +9 -5
  388. package/dist/templates/knowledge/transport-ot/systems.csv +117 -0
  389. package/dist/templates/knowledge/transport-ot.knowledge.yaml +55 -0
  390. package/dist/templates/knowledge/web-docs.knowledge.yaml +1 -1
  391. package/dist/templates/llm.json +62 -22
  392. package/dist/templates/mcp.json +7 -4
  393. package/dist/templates/skills/orcha-builder/SKILL.md +148 -215
  394. package/dist/templates/skills/pii-guard/SKILL.md +22 -0
  395. package/dist/templates/skills/sandbox/SKILL.md +25 -48
  396. package/dist/templates/skills/web-pilot/SKILL.md +51 -0
  397. package/dist/templates/workflows/example.workflow.yaml +27 -35
  398. package/dist/templates/workflows/react-example.workflow.yaml +14 -19
  399. package/dist/templates/workflows/team-chat.workflow.yaml +47 -0
  400. package/package.json +17 -4
  401. package/dist/public/src/components/SkillsView.js +0 -137
  402. package/dist/public/src/components/WorkflowsView.js +0 -416
  403. package/dist/templates/agents/knowledge-broker.agent.yaml +0 -39
  404. package/dist/templates/agents/sandbox.agent.yaml +0 -56
@@ -24,6 +24,11 @@ export class ApiService {
24
24
  return res.json();
25
25
  }
26
26
 
27
+ async checkSession(sessionId) {
28
+ const res = await this._fetch(`/api/agents/sessions/${sessionId}`);
29
+ return res.ok;
30
+ }
31
+
27
32
  async streamAgent(name, input, sessionId, { signal } = {}) {
28
33
  return this._fetch(`/api/agents/${name}/stream`, {
29
34
  method: 'POST',
@@ -43,11 +48,21 @@ export class ApiService {
43
48
  return res.json();
44
49
  }
45
50
 
46
- async startWorkflowStream(name, input) {
51
+ async startWorkflowStream(name, input, signal) {
47
52
  return this._fetch(`/api/workflows/${name}/stream`, {
48
53
  method: 'POST',
49
54
  headers: { 'Content-Type': 'application/json' },
50
- 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,
51
66
  });
52
67
  }
53
68
 
@@ -93,6 +108,36 @@ export class ApiService {
93
108
  return res.json();
94
109
  }
95
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
+
96
141
  async chatLLM(name, message) {
97
142
  const res = await this._fetch(`/api/llm/${name}/chat`, {
98
143
  method: 'POST',
@@ -102,11 +147,11 @@ export class ApiService {
102
147
  return res.json();
103
148
  }
104
149
 
105
- async streamLLM(name, message, { signal } = {}) {
150
+ async streamLLM(name, message, sessionId, attachments, { signal } = {}) {
106
151
  return this._fetch(`/api/llm/${name}/stream`, {
107
152
  method: 'POST',
108
153
  headers: { 'Content-Type': 'application/json' },
109
- body: JSON.stringify({ message }),
154
+ body: JSON.stringify({ message, sessionId, ...(attachments ? { attachments } : {}) }),
110
155
  signal
111
156
  });
112
157
  }
@@ -258,6 +303,160 @@ export class ApiService {
258
303
  return new EventSource(`/api/tasks/${id}/stream`);
259
304
  }
260
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
+
261
460
  async getGraphConfig() {
262
461
  const res = await this._fetch('/api/graph/config');
263
462
  return res.json();
@@ -0,0 +1,86 @@
1
+
2
+ const SESSIONS_KEY = 'orcha-sessions';
3
+ const ACTIVE_KEY = 'orcha-active-session-id';
4
+ const MAX_SESSIONS = 50;
5
+
6
+ class SessionStore {
7
+ getAll() {
8
+ const raw = localStorage.getItem(SESSIONS_KEY);
9
+ const sessions = raw ? JSON.parse(raw) : [];
10
+ return sessions.sort((a, b) => b.updatedAt - a.updatedAt);
11
+ }
12
+
13
+ get(id) {
14
+ return this.getAll().find(s => s.id === id) || null;
15
+ }
16
+
17
+ create({ agentName, agentType, llmName, workflowName }) {
18
+ const sessions = this.getAll();
19
+ const session = {
20
+ id: 'session-' + Date.now() + '-' + Math.random().toString(36).substring(2, 9),
21
+ agentName: agentName || null,
22
+ agentType: agentType || 'agent',
23
+ llmName: llmName || null,
24
+ workflowName: workflowName || null,
25
+ title: 'New conversation',
26
+ messages: [],
27
+ createdAt: Date.now(),
28
+ updatedAt: Date.now()
29
+ };
30
+
31
+ sessions.unshift(session);
32
+
33
+ // Enforce max sessions — remove oldest
34
+ if (sessions.length > MAX_SESSIONS) {
35
+ sessions.length = MAX_SESSIONS;
36
+ }
37
+
38
+ this._save(sessions);
39
+ this.setActiveId(session.id);
40
+ return session;
41
+ }
42
+
43
+ addMessage(sessionId, role, content, meta) {
44
+ const sessions = this.getAll();
45
+ const session = sessions.find(s => s.id === sessionId);
46
+ if (!session) return;
47
+
48
+ const msg = { role, content };
49
+ if (meta) msg.meta = meta;
50
+ session.messages.push(msg);
51
+ session.updatedAt = Date.now();
52
+
53
+ // Set title from first user message
54
+ if (role === 'user' && session.title === 'New conversation') {
55
+ session.title = content.length > 50 ? content.substring(0, 50) + '...' : content;
56
+ }
57
+
58
+ this._save(sessions);
59
+ }
60
+
61
+ delete(sessionId) {
62
+ const sessions = this.getAll().filter(s => s.id !== sessionId);
63
+ this._save(sessions);
64
+ if (this.getActiveId() === sessionId) {
65
+ this.clearActiveId();
66
+ }
67
+ }
68
+
69
+ getActiveId() {
70
+ return localStorage.getItem(ACTIVE_KEY);
71
+ }
72
+
73
+ setActiveId(id) {
74
+ localStorage.setItem(ACTIVE_KEY, id);
75
+ }
76
+
77
+ clearActiveId() {
78
+ localStorage.removeItem(ACTIVE_KEY);
79
+ }
80
+
81
+ _save(sessions) {
82
+ localStorage.setItem(SESSIONS_KEY, JSON.stringify(sessions));
83
+ }
84
+ }
85
+
86
+ export const sessionStore = new SessionStore();
@@ -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
 
@@ -10,8 +10,6 @@ class Store extends EventTarget {
10
10
  activeTab: initialTab,
11
11
  agents: [],
12
12
  selectedAgent: null,
13
- chatHistory: [],
14
- sessionId: 'session-' + Date.now() + '-' + Math.random().toString(36).substring(2, 9),
15
13
  workflows: [],
16
14
  knowledgeStores: [],
17
15
  llms: [],
@@ -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
+ }
@@ -5,12 +5,19 @@ export class MarkdownRenderer {
5
5
  constructor() {
6
6
  // Configure marked for streaming-friendly rendering
7
7
  if (typeof marked !== 'undefined') {
8
+ const renderer = new marked.Renderer();
9
+ renderer.link = (href, title, text) => {
10
+ const titleAttr = title ? ` title="${title}"` : '';
11
+ return `<a href="${href}"${titleAttr} target="_blank" rel="noopener noreferrer">${text}</a>`;
12
+ };
13
+
8
14
  marked.setOptions({
9
15
  gfm: true, // GitHub Flavored Markdown
10
16
  breaks: true, // Convert \n to <br>
11
17
  headerIds: false, // Disable header IDs (not needed for chat)
12
18
  mangle: false, // Don't mangle email addresses
13
19
  sanitize: false, // We'll use DOMPurify instead
20
+ renderer,
14
21
  });
15
22
  }
16
23