agent-orcha 0.0.4 → 0.0.7

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 (554) hide show
  1. package/README.md +216 -1323
  2. package/dist/lib/agents/agent-executor.d.ts +15 -4
  3. package/dist/lib/agents/agent-executor.d.ts.map +1 -1
  4. package/dist/lib/agents/agent-executor.js +337 -87
  5. package/dist/lib/agents/agent-executor.js.map +1 -1
  6. package/dist/lib/agents/agent-loader.d.ts +4 -1
  7. package/dist/lib/agents/agent-loader.d.ts.map +1 -1
  8. package/dist/lib/agents/agent-loader.js +20 -4
  9. package/dist/lib/agents/agent-loader.js.map +1 -1
  10. package/dist/lib/agents/index.d.ts +5 -5
  11. package/dist/lib/agents/index.js +4 -4
  12. package/dist/lib/agents/react-loop.d.ts +30 -0
  13. package/dist/lib/agents/react-loop.d.ts.map +1 -0
  14. package/dist/lib/agents/react-loop.js +193 -0
  15. package/dist/lib/agents/react-loop.js.map +1 -0
  16. package/dist/lib/agents/structured-output-wrapper.d.ts +3 -3
  17. package/dist/lib/agents/structured-output-wrapper.d.ts.map +1 -1
  18. package/dist/lib/agents/structured-output-wrapper.js +2 -2
  19. package/dist/lib/agents/structured-output-wrapper.js.map +1 -1
  20. package/dist/lib/agents/types.d.ts +306 -19
  21. package/dist/lib/agents/types.d.ts.map +1 -1
  22. package/dist/lib/agents/types.js +34 -4
  23. package/dist/lib/agents/types.js.map +1 -1
  24. package/dist/lib/functions/function-loader.d.ts +3 -1
  25. package/dist/lib/functions/function-loader.d.ts.map +1 -1
  26. package/dist/lib/functions/function-loader.js +23 -5
  27. package/dist/lib/functions/function-loader.js.map +1 -1
  28. package/dist/lib/functions/index.d.ts +2 -2
  29. package/dist/lib/functions/index.js +1 -1
  30. package/dist/lib/functions/simple-function-wrapper.d.ts +2 -11
  31. package/dist/lib/functions/simple-function-wrapper.d.ts.map +1 -1
  32. package/dist/lib/functions/simple-function-wrapper.js +3 -3
  33. package/dist/lib/functions/simple-function-wrapper.js.map +1 -1
  34. package/dist/lib/index.d.ts +29 -17
  35. package/dist/lib/index.d.ts.map +1 -1
  36. package/dist/lib/index.js +21 -9
  37. package/dist/lib/index.js.map +1 -1
  38. package/dist/lib/integrations/collabnook.d.ts +56 -0
  39. package/dist/lib/integrations/collabnook.d.ts.map +1 -0
  40. package/dist/lib/integrations/collabnook.js +307 -0
  41. package/dist/lib/integrations/collabnook.js.map +1 -0
  42. package/dist/lib/integrations/email.d.ts +38 -0
  43. package/dist/lib/integrations/email.d.ts.map +1 -0
  44. package/dist/lib/integrations/email.js +249 -0
  45. package/dist/lib/integrations/email.js.map +1 -0
  46. package/dist/lib/integrations/integration-manager.d.ts +19 -0
  47. package/dist/lib/integrations/integration-manager.d.ts.map +1 -0
  48. package/dist/lib/integrations/integration-manager.js +159 -0
  49. package/dist/lib/integrations/integration-manager.js.map +1 -0
  50. package/dist/lib/integrations/types.d.ts +232 -0
  51. package/dist/lib/integrations/types.d.ts.map +1 -0
  52. package/dist/lib/integrations/types.js +37 -0
  53. package/dist/lib/integrations/types.js.map +1 -0
  54. package/dist/lib/knowledge/direct-mapper.d.ts +21 -0
  55. package/dist/lib/knowledge/direct-mapper.d.ts.map +1 -0
  56. package/dist/lib/knowledge/direct-mapper.js +134 -0
  57. package/dist/lib/knowledge/direct-mapper.js.map +1 -0
  58. package/dist/lib/knowledge/index.d.ts +9 -8
  59. package/dist/lib/knowledge/index.d.ts.map +1 -1
  60. package/dist/lib/knowledge/index.js +9 -7
  61. package/dist/lib/knowledge/index.js.map +1 -1
  62. package/dist/lib/knowledge/knowledge-store-metadata.d.ts +40 -0
  63. package/dist/lib/knowledge/knowledge-store-metadata.d.ts.map +1 -0
  64. package/dist/lib/knowledge/knowledge-store-metadata.js +93 -0
  65. package/dist/lib/knowledge/knowledge-store-metadata.js.map +1 -0
  66. package/dist/lib/knowledge/knowledge-store.d.ts +49 -0
  67. package/dist/lib/knowledge/knowledge-store.d.ts.map +1 -0
  68. package/dist/lib/knowledge/knowledge-store.js +670 -0
  69. package/dist/lib/knowledge/knowledge-store.js.map +1 -0
  70. package/dist/lib/knowledge/loaders/database-loader.d.ts +5 -5
  71. package/dist/lib/knowledge/loaders/database-loader.d.ts.map +1 -1
  72. package/dist/lib/knowledge/loaders/database-loader.js +21 -10
  73. package/dist/lib/knowledge/loaders/database-loader.js.map +1 -1
  74. package/dist/lib/knowledge/loaders/file-loaders.d.ts +45 -0
  75. package/dist/lib/knowledge/loaders/file-loaders.d.ts.map +1 -0
  76. package/dist/lib/knowledge/loaders/file-loaders.js +160 -0
  77. package/dist/lib/knowledge/loaders/file-loaders.js.map +1 -0
  78. package/dist/lib/knowledge/loaders/index.d.ts +3 -3
  79. package/dist/lib/knowledge/loaders/index.d.ts.map +1 -1
  80. package/dist/lib/knowledge/loaders/index.js +3 -3
  81. package/dist/lib/knowledge/loaders/index.js.map +1 -1
  82. package/dist/lib/knowledge/loaders/web-loader.d.ts +14 -5
  83. package/dist/lib/knowledge/loaders/web-loader.d.ts.map +1 -1
  84. package/dist/lib/knowledge/loaders/web-loader.js +64 -29
  85. package/dist/lib/knowledge/loaders/web-loader.js.map +1 -1
  86. package/dist/lib/knowledge/sqlite-store.d.ts +107 -0
  87. package/dist/lib/knowledge/sqlite-store.d.ts.map +1 -0
  88. package/dist/lib/knowledge/sqlite-store.js +327 -0
  89. package/dist/lib/knowledge/sqlite-store.js.map +1 -0
  90. package/dist/lib/knowledge/types.d.ts +124 -1448
  91. package/dist/lib/knowledge/types.d.ts.map +1 -1
  92. package/dist/lib/knowledge/types.js +54 -60
  93. package/dist/lib/knowledge/types.js.map +1 -1
  94. package/dist/lib/knowledge/utils/connection-pool.d.ts +3 -2
  95. package/dist/lib/knowledge/utils/connection-pool.d.ts.map +1 -1
  96. package/dist/lib/knowledge/utils/connection-pool.js +20 -10
  97. package/dist/lib/knowledge/utils/connection-pool.js.map +1 -1
  98. package/dist/lib/knowledge/utils/index.d.ts +2 -2
  99. package/dist/lib/knowledge/utils/index.js +2 -2
  100. package/dist/lib/llm/index.d.ts +5 -5
  101. package/dist/lib/llm/index.d.ts.map +1 -1
  102. package/dist/lib/llm/index.js +3 -3
  103. package/dist/lib/llm/index.js.map +1 -1
  104. package/dist/lib/llm/llm-call-logger.d.ts +39 -0
  105. package/dist/lib/llm/llm-call-logger.d.ts.map +1 -0
  106. package/dist/lib/llm/llm-call-logger.js +110 -0
  107. package/dist/lib/llm/llm-call-logger.js.map +1 -0
  108. package/dist/lib/llm/llm-config.d.ts +30 -16
  109. package/dist/lib/llm/llm-config.d.ts.map +1 -1
  110. package/dist/lib/llm/llm-config.js +22 -4
  111. package/dist/lib/llm/llm-config.js.map +1 -1
  112. package/dist/lib/llm/llm-factory.d.ts +3 -16
  113. package/dist/lib/llm/llm-factory.d.ts.map +1 -1
  114. package/dist/lib/llm/llm-factory.js +33 -48
  115. package/dist/lib/llm/llm-factory.js.map +1 -1
  116. package/dist/lib/llm/provider-detector.d.ts +1 -1
  117. package/dist/lib/llm/providers/anthropic-chat-model.d.ts +31 -0
  118. package/dist/lib/llm/providers/anthropic-chat-model.d.ts.map +1 -0
  119. package/dist/lib/llm/providers/anthropic-chat-model.js +262 -0
  120. package/dist/lib/llm/providers/anthropic-chat-model.js.map +1 -0
  121. package/dist/lib/llm/providers/gemini-chat-model.d.ts +30 -0
  122. package/dist/lib/llm/providers/gemini-chat-model.d.ts.map +1 -0
  123. package/dist/lib/llm/providers/gemini-chat-model.js +300 -0
  124. package/dist/lib/llm/providers/gemini-chat-model.js.map +1 -0
  125. package/dist/lib/llm/providers/gemini-embeddings.d.ts +14 -0
  126. package/dist/lib/llm/providers/gemini-embeddings.d.ts.map +1 -0
  127. package/dist/lib/llm/providers/gemini-embeddings.js +20 -0
  128. package/dist/lib/llm/providers/gemini-embeddings.js.map +1 -0
  129. package/dist/lib/llm/providers/openai-chat-model.d.ts +39 -0
  130. package/dist/lib/llm/providers/openai-chat-model.d.ts.map +1 -0
  131. package/dist/lib/llm/providers/openai-chat-model.js +397 -0
  132. package/dist/lib/llm/providers/openai-chat-model.js.map +1 -0
  133. package/dist/lib/llm/providers/openai-embeddings.d.ts +17 -0
  134. package/dist/lib/llm/providers/openai-embeddings.d.ts.map +1 -0
  135. package/dist/lib/llm/providers/openai-embeddings.js +35 -0
  136. package/dist/lib/llm/providers/openai-embeddings.js.map +1 -0
  137. package/dist/lib/llm/types.d.ts +2 -2
  138. package/dist/lib/llm/types.js +1 -1
  139. package/dist/lib/logger.d.ts +7 -0
  140. package/dist/lib/logger.d.ts.map +1 -1
  141. package/dist/lib/logger.js +42 -4
  142. package/dist/lib/logger.js.map +1 -1
  143. package/dist/lib/mcp/index.d.ts +3 -3
  144. package/dist/lib/mcp/index.js +2 -2
  145. package/dist/lib/mcp/mcp-client.d.ts +3 -2
  146. package/dist/lib/mcp/mcp-client.d.ts.map +1 -1
  147. package/dist/lib/mcp/mcp-client.js +10 -5
  148. package/dist/lib/mcp/mcp-client.js.map +1 -1
  149. package/dist/lib/mcp/types.d.ts +26 -25
  150. package/dist/lib/mcp/types.d.ts.map +1 -1
  151. package/dist/lib/mcp/types.js +12 -4
  152. package/dist/lib/mcp/types.js.map +1 -1
  153. package/dist/lib/memory/conversation-store.d.ts +2 -2
  154. package/dist/lib/memory/conversation-store.d.ts.map +1 -1
  155. package/dist/lib/memory/conversation-store.js +1 -1
  156. package/dist/lib/memory/index.d.ts +3 -2
  157. package/dist/lib/memory/index.d.ts.map +1 -1
  158. package/dist/lib/memory/index.js +3 -2
  159. package/dist/lib/memory/index.js.map +1 -1
  160. package/dist/lib/memory/memory-manager.d.ts +10 -0
  161. package/dist/lib/memory/memory-manager.d.ts.map +1 -0
  162. package/dist/lib/memory/memory-manager.js +43 -0
  163. package/dist/lib/memory/memory-manager.js.map +1 -0
  164. package/dist/lib/memory/types.d.ts +1 -1
  165. package/dist/lib/memory/types.d.ts.map +1 -1
  166. package/dist/lib/orchestrator.d.ts +72 -18
  167. package/dist/lib/orchestrator.d.ts.map +1 -1
  168. package/dist/lib/orchestrator.js +341 -56
  169. package/dist/lib/orchestrator.js.map +1 -1
  170. package/dist/lib/sandbox/cdp-client.d.ts +14 -0
  171. package/dist/lib/sandbox/cdp-client.d.ts.map +1 -0
  172. package/dist/lib/sandbox/cdp-client.js +113 -0
  173. package/dist/lib/sandbox/cdp-client.js.map +1 -0
  174. package/dist/lib/sandbox/html-to-markdown.d.ts +10 -0
  175. package/dist/lib/sandbox/html-to-markdown.d.ts.map +1 -0
  176. package/dist/lib/sandbox/html-to-markdown.js +121 -0
  177. package/dist/lib/sandbox/html-to-markdown.js.map +1 -0
  178. package/dist/lib/sandbox/index.d.ts +12 -0
  179. package/dist/lib/sandbox/index.d.ts.map +1 -0
  180. package/dist/lib/sandbox/index.js +10 -0
  181. package/dist/lib/sandbox/index.js.map +1 -0
  182. package/dist/lib/sandbox/page-readiness.d.ts +37 -0
  183. package/dist/lib/sandbox/page-readiness.d.ts.map +1 -0
  184. package/dist/lib/sandbox/page-readiness.js +235 -0
  185. package/dist/lib/sandbox/page-readiness.js.map +1 -0
  186. package/dist/lib/sandbox/sandbox-browser.d.ts +4 -0
  187. package/dist/lib/sandbox/sandbox-browser.d.ts.map +1 -0
  188. package/dist/lib/sandbox/sandbox-browser.js +303 -0
  189. package/dist/lib/sandbox/sandbox-browser.js.map +1 -0
  190. package/dist/lib/sandbox/sandbox-exec.d.ts +5 -0
  191. package/dist/lib/sandbox/sandbox-exec.d.ts.map +1 -0
  192. package/dist/lib/sandbox/sandbox-exec.js +35 -0
  193. package/dist/lib/sandbox/sandbox-exec.js.map +1 -0
  194. package/dist/lib/sandbox/sandbox-file.d.ts +4 -0
  195. package/dist/lib/sandbox/sandbox-file.d.ts.map +1 -0
  196. package/dist/lib/sandbox/sandbox-file.js +168 -0
  197. package/dist/lib/sandbox/sandbox-file.js.map +1 -0
  198. package/dist/lib/sandbox/sandbox-shell.d.ts +4 -0
  199. package/dist/lib/sandbox/sandbox-shell.d.ts.map +1 -0
  200. package/dist/lib/sandbox/sandbox-shell.js +93 -0
  201. package/dist/lib/sandbox/sandbox-shell.js.map +1 -0
  202. package/dist/lib/sandbox/sandbox-web.d.ts +5 -0
  203. package/dist/lib/sandbox/sandbox-web.d.ts.map +1 -0
  204. package/dist/lib/sandbox/sandbox-web.js +226 -0
  205. package/dist/lib/sandbox/sandbox-web.js.map +1 -0
  206. package/dist/lib/sandbox/types.d.ts +30 -0
  207. package/dist/lib/sandbox/types.d.ts.map +1 -0
  208. package/dist/lib/sandbox/types.js +8 -0
  209. package/dist/lib/sandbox/types.js.map +1 -0
  210. package/dist/lib/sandbox/vision-browser.d.ts +4 -0
  211. package/dist/lib/sandbox/vision-browser.d.ts.map +1 -0
  212. package/dist/lib/sandbox/vision-browser.js +289 -0
  213. package/dist/lib/sandbox/vision-browser.js.map +1 -0
  214. package/dist/lib/sandbox/vm-executor.d.ts +12 -0
  215. package/dist/lib/sandbox/vm-executor.d.ts.map +1 -0
  216. package/dist/lib/sandbox/vm-executor.js +101 -0
  217. package/dist/lib/sandbox/vm-executor.js.map +1 -0
  218. package/dist/lib/skills/index.d.ts +4 -0
  219. package/dist/lib/skills/index.d.ts.map +1 -0
  220. package/dist/lib/skills/index.js +3 -0
  221. package/dist/lib/skills/index.js.map +1 -0
  222. package/dist/lib/skills/skill-loader.d.ts +21 -0
  223. package/dist/lib/skills/skill-loader.d.ts.map +1 -0
  224. package/dist/lib/skills/skill-loader.js +116 -0
  225. package/dist/lib/skills/skill-loader.js.map +1 -0
  226. package/dist/lib/skills/types.d.ts +17 -0
  227. package/dist/lib/skills/types.d.ts.map +1 -0
  228. package/dist/lib/skills/types.js +6 -0
  229. package/dist/lib/skills/types.js.map +1 -0
  230. package/dist/lib/tasks/index.d.ts +4 -0
  231. package/dist/lib/tasks/index.d.ts.map +1 -0
  232. package/dist/lib/tasks/index.js +4 -0
  233. package/dist/lib/tasks/index.js.map +1 -0
  234. package/dist/lib/tasks/task-manager.d.ts +27 -0
  235. package/dist/lib/tasks/task-manager.d.ts.map +1 -0
  236. package/dist/lib/tasks/task-manager.js +200 -0
  237. package/dist/lib/tasks/task-manager.js.map +1 -0
  238. package/dist/lib/tasks/task-store.d.ts +20 -0
  239. package/dist/lib/tasks/task-store.d.ts.map +1 -0
  240. package/dist/lib/tasks/task-store.js +102 -0
  241. package/dist/lib/tasks/task-store.js.map +1 -0
  242. package/dist/lib/tasks/types.d.ts +56 -0
  243. package/dist/lib/tasks/types.d.ts.map +1 -0
  244. package/dist/lib/tasks/types.js +2 -0
  245. package/dist/lib/tasks/types.js.map +1 -0
  246. package/dist/lib/templates/resource-templates.d.ts +6 -0
  247. package/dist/lib/templates/resource-templates.d.ts.map +1 -0
  248. package/dist/lib/templates/resource-templates.js +146 -0
  249. package/dist/lib/templates/resource-templates.js.map +1 -0
  250. package/dist/lib/tools/agent-tool-wrapper.d.ts +5 -5
  251. package/dist/lib/tools/agent-tool-wrapper.js +3 -3
  252. package/dist/lib/tools/agent-tool-wrapper.js.map +1 -1
  253. package/dist/lib/tools/built-in/ask-user.tool.d.ts +1 -1
  254. package/dist/lib/tools/built-in/ask-user.tool.d.ts.map +1 -1
  255. package/dist/lib/tools/built-in/ask-user.tool.js +2 -2
  256. package/dist/lib/tools/built-in/ask-user.tool.js.map +1 -1
  257. package/dist/lib/tools/built-in/index.d.ts +9 -2
  258. package/dist/lib/tools/built-in/index.d.ts.map +1 -1
  259. package/dist/lib/tools/built-in/index.js +9 -2
  260. package/dist/lib/tools/built-in/index.js.map +1 -1
  261. package/dist/lib/tools/built-in/integration-tools.d.ts +4 -0
  262. package/dist/lib/tools/built-in/integration-tools.d.ts.map +1 -0
  263. package/dist/lib/tools/built-in/integration-tools.js +47 -0
  264. package/dist/lib/tools/built-in/integration-tools.js.map +1 -0
  265. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts +9 -0
  266. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts.map +1 -0
  267. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js +108 -0
  268. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js.map +1 -0
  269. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.d.ts +9 -0
  270. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.d.ts.map +1 -0
  271. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js +96 -0
  272. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js.map +1 -0
  273. package/dist/lib/tools/built-in/knowledge-search.tool.d.ts +2 -2
  274. package/dist/lib/tools/built-in/knowledge-search.tool.d.ts.map +1 -1
  275. package/dist/lib/tools/built-in/knowledge-search.tool.js +1 -1
  276. package/dist/lib/tools/built-in/knowledge-search.tool.js.map +1 -1
  277. package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts +7 -0
  278. package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts.map +1 -0
  279. package/dist/lib/tools/built-in/knowledge-sql.tool.js +128 -0
  280. package/dist/lib/tools/built-in/knowledge-sql.tool.js.map +1 -0
  281. package/dist/lib/tools/built-in/knowledge-tools-factory.d.ts +17 -0
  282. package/dist/lib/tools/built-in/knowledge-tools-factory.d.ts.map +1 -0
  283. package/dist/lib/tools/built-in/knowledge-tools-factory.js +54 -0
  284. package/dist/lib/tools/built-in/knowledge-tools-factory.js.map +1 -0
  285. package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts +9 -0
  286. package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts.map +1 -0
  287. package/dist/lib/tools/built-in/knowledge-traverse.tool.js +91 -0
  288. package/dist/lib/tools/built-in/knowledge-traverse.tool.js.map +1 -0
  289. package/dist/lib/tools/built-in/memory-save.tool.d.ts +4 -0
  290. package/dist/lib/tools/built-in/memory-save.tool.d.ts.map +1 -0
  291. package/dist/lib/tools/built-in/memory-save.tool.js +21 -0
  292. package/dist/lib/tools/built-in/memory-save.tool.js.map +1 -0
  293. package/dist/lib/tools/built-in/query-validators.d.ts +18 -0
  294. package/dist/lib/tools/built-in/query-validators.d.ts.map +1 -0
  295. package/dist/lib/tools/built-in/query-validators.js +91 -0
  296. package/dist/lib/tools/built-in/query-validators.js.map +1 -0
  297. package/dist/lib/tools/index.d.ts +4 -4
  298. package/dist/lib/tools/index.js +4 -4
  299. package/dist/lib/tools/tool-discovery.d.ts +11 -33
  300. package/dist/lib/tools/tool-discovery.d.ts.map +1 -1
  301. package/dist/lib/tools/tool-discovery.js +16 -43
  302. package/dist/lib/tools/tool-discovery.js.map +1 -1
  303. package/dist/lib/tools/tool-registry.d.ts +10 -18
  304. package/dist/lib/tools/tool-registry.d.ts.map +1 -1
  305. package/dist/lib/tools/tool-registry.js +37 -23
  306. package/dist/lib/tools/tool-registry.js.map +1 -1
  307. package/dist/lib/tools/workspace/workspace-tools.d.ts +61 -0
  308. package/dist/lib/tools/workspace/workspace-tools.d.ts.map +1 -0
  309. package/dist/lib/tools/workspace/workspace-tools.js +179 -0
  310. package/dist/lib/tools/workspace/workspace-tools.js.map +1 -0
  311. package/dist/lib/triggers/cron-trigger.d.ts +12 -0
  312. package/dist/lib/triggers/cron-trigger.d.ts.map +1 -0
  313. package/dist/lib/triggers/cron-trigger.js +45 -0
  314. package/dist/lib/triggers/cron-trigger.js.map +1 -0
  315. package/dist/lib/triggers/index.d.ts +6 -0
  316. package/dist/lib/triggers/index.d.ts.map +1 -0
  317. package/dist/lib/triggers/index.js +5 -0
  318. package/dist/lib/triggers/index.js.map +1 -0
  319. package/dist/lib/triggers/trigger-manager.d.ts +12 -0
  320. package/dist/lib/triggers/trigger-manager.d.ts.map +1 -0
  321. package/dist/lib/triggers/trigger-manager.js +77 -0
  322. package/dist/lib/triggers/trigger-manager.js.map +1 -0
  323. package/dist/lib/triggers/types.d.ts +57 -0
  324. package/dist/lib/triggers/types.d.ts.map +1 -0
  325. package/dist/lib/triggers/types.js +16 -0
  326. package/dist/lib/triggers/types.js.map +1 -0
  327. package/dist/lib/triggers/webhook-trigger.d.ts +12 -0
  328. package/dist/lib/triggers/webhook-trigger.d.ts.map +1 -0
  329. package/dist/lib/triggers/webhook-trigger.js +34 -0
  330. package/dist/lib/triggers/webhook-trigger.js.map +1 -0
  331. package/dist/lib/types/llm-types.d.ts +72 -0
  332. package/dist/lib/types/llm-types.d.ts.map +1 -0
  333. package/dist/lib/types/llm-types.js +72 -0
  334. package/dist/lib/types/llm-types.js.map +1 -0
  335. package/dist/lib/types/text-splitters.d.ts +27 -0
  336. package/dist/lib/types/text-splitters.d.ts.map +1 -0
  337. package/dist/lib/types/text-splitters.js +114 -0
  338. package/dist/lib/types/text-splitters.js.map +1 -0
  339. package/dist/lib/types/tool-factory.d.ts +9 -0
  340. package/dist/lib/types/tool-factory.d.ts.map +1 -0
  341. package/dist/lib/types/tool-factory.js +12 -0
  342. package/dist/lib/types/tool-factory.js.map +1 -0
  343. package/dist/lib/utils/env-substitution.d.ts +6 -0
  344. package/dist/lib/utils/env-substitution.d.ts.map +1 -0
  345. package/dist/lib/utils/env-substitution.js +15 -0
  346. package/dist/lib/utils/env-substitution.js.map +1 -0
  347. package/dist/lib/utils/file-utils.d.ts +11 -0
  348. package/dist/lib/utils/file-utils.d.ts.map +1 -0
  349. package/dist/lib/utils/file-utils.js +86 -0
  350. package/dist/lib/utils/file-utils.js.map +1 -0
  351. package/dist/lib/workflows/index.d.ts +6 -6
  352. package/dist/lib/workflows/index.d.ts.map +1 -1
  353. package/dist/lib/workflows/index.js +5 -5
  354. package/dist/lib/workflows/index.js.map +1 -1
  355. package/dist/lib/workflows/interrupt-manager.d.ts +1 -1
  356. package/dist/lib/workflows/interrupt-manager.js +1 -1
  357. package/dist/lib/workflows/react-workflow-executor.d.ts +26 -0
  358. package/dist/lib/workflows/react-workflow-executor.d.ts.map +1 -0
  359. package/dist/lib/workflows/react-workflow-executor.js +333 -0
  360. package/dist/lib/workflows/react-workflow-executor.js.map +1 -0
  361. package/dist/lib/workflows/types.d.ts +106 -107
  362. package/dist/lib/workflows/types.d.ts.map +1 -1
  363. package/dist/lib/workflows/types.js +5 -5
  364. package/dist/lib/workflows/types.js.map +1 -1
  365. package/dist/lib/workflows/workflow-executor.d.ts +3 -3
  366. package/dist/lib/workflows/workflow-executor.js +2 -2
  367. package/dist/lib/workflows/workflow-executor.js.map +1 -1
  368. package/dist/lib/workflows/workflow-loader.d.ts +4 -1
  369. package/dist/lib/workflows/workflow-loader.d.ts.map +1 -1
  370. package/dist/lib/workflows/workflow-loader.js +20 -4
  371. package/dist/lib/workflows/workflow-loader.js.map +1 -1
  372. package/dist/public/chat.html +114 -0
  373. package/dist/public/index.html +189 -0
  374. package/dist/public/src/components/AgentComposer.js +807 -0
  375. package/dist/public/src/components/AgentsView.js +1021 -344
  376. package/dist/public/src/components/AppRoot.js +150 -5
  377. package/dist/public/src/components/GraphView.js +420 -0
  378. package/dist/public/src/components/IdeView.js +625 -14
  379. package/dist/public/src/components/KnowledgeView.js +443 -66
  380. package/dist/public/src/components/MonitorView.js +526 -0
  381. package/dist/public/src/components/NavBar.js +3 -0
  382. package/dist/public/src/components/SkillsView.js +137 -0
  383. package/dist/public/src/components/StandaloneChat.js +889 -0
  384. package/dist/public/src/components/WorkflowsView.js +454 -129
  385. package/dist/public/src/services/ApiService.js +170 -25
  386. package/dist/public/src/services/SessionStore.js +83 -0
  387. package/dist/public/src/store.js +3 -4
  388. package/dist/public/src/utils/markdown.js +14 -0
  389. package/dist/src/cli/commands/init.js +2 -2
  390. package/dist/src/cli/commands/init.js.map +1 -1
  391. package/dist/src/cli/commands/start.d.ts +0 -1
  392. package/dist/src/cli/commands/start.d.ts.map +1 -1
  393. package/dist/src/cli/commands/start.js +23 -14
  394. package/dist/src/cli/commands/start.js.map +1 -1
  395. package/dist/src/cli/index.js +8 -5
  396. package/dist/src/cli/index.js.map +1 -1
  397. package/dist/src/index.d.ts +1 -1
  398. package/dist/src/index.d.ts.map +1 -1
  399. package/dist/src/index.js +23 -9
  400. package/dist/src/index.js.map +1 -1
  401. package/dist/src/middleware/auth.d.ts +3 -0
  402. package/dist/src/middleware/auth.d.ts.map +1 -0
  403. package/dist/src/middleware/auth.js +129 -0
  404. package/dist/src/middleware/auth.js.map +1 -0
  405. package/dist/src/middleware/rate-limit.d.ts +8 -0
  406. package/dist/src/middleware/rate-limit.d.ts.map +1 -0
  407. package/dist/src/middleware/rate-limit.js +21 -0
  408. package/dist/src/middleware/rate-limit.js.map +1 -0
  409. package/dist/src/routes/agents.route.d.ts.map +1 -1
  410. package/dist/src/routes/agents.route.js +167 -12
  411. package/dist/src/routes/agents.route.js.map +1 -1
  412. package/dist/src/routes/chat.route.d.ts +3 -0
  413. package/dist/src/routes/chat.route.d.ts.map +1 -0
  414. package/dist/src/routes/chat.route.js +155 -0
  415. package/dist/src/routes/chat.route.js.map +1 -0
  416. package/dist/src/routes/files.route.d.ts.map +1 -1
  417. package/dist/src/routes/files.route.js +163 -87
  418. package/dist/src/routes/files.route.js.map +1 -1
  419. package/dist/src/routes/functions.route.js +1 -1
  420. package/dist/src/routes/graph.route.d.ts +3 -0
  421. package/dist/src/routes/graph.route.d.ts.map +1 -0
  422. package/dist/src/routes/graph.route.js +173 -0
  423. package/dist/src/routes/graph.route.js.map +1 -0
  424. package/dist/src/routes/knowledge.route.d.ts.map +1 -1
  425. package/dist/src/routes/knowledge.route.js +172 -69
  426. package/dist/src/routes/knowledge.route.js.map +1 -1
  427. package/dist/src/routes/llm.route.d.ts.map +1 -1
  428. package/dist/src/routes/llm.route.js +85 -9
  429. package/dist/src/routes/llm.route.js.map +1 -1
  430. package/dist/src/routes/mcp.route.js +1 -1
  431. package/dist/src/routes/skills.route.d.ts +3 -0
  432. package/dist/src/routes/skills.route.d.ts.map +1 -0
  433. package/dist/src/routes/skills.route.js +23 -0
  434. package/dist/src/routes/skills.route.js.map +1 -0
  435. package/dist/src/routes/tasks.route.d.ts +3 -0
  436. package/dist/src/routes/tasks.route.d.ts.map +1 -0
  437. package/dist/src/routes/tasks.route.js +149 -0
  438. package/dist/src/routes/tasks.route.js.map +1 -0
  439. package/dist/src/routes/vnc.route.d.ts +3 -0
  440. package/dist/src/routes/vnc.route.d.ts.map +1 -0
  441. package/dist/src/routes/vnc.route.js +49 -0
  442. package/dist/src/routes/vnc.route.js.map +1 -0
  443. package/dist/src/routes/workflows.route.d.ts.map +1 -1
  444. package/dist/src/routes/workflows.route.js +9 -1
  445. package/dist/src/routes/workflows.route.js.map +1 -1
  446. package/dist/src/server.d.ts +1 -1
  447. package/dist/src/server.d.ts.map +1 -1
  448. package/dist/src/server.js +26 -9
  449. package/dist/src/server.js.map +1 -1
  450. package/dist/templates/.env.example +4 -19
  451. package/dist/templates/Demo.md +152 -0
  452. package/dist/templates/README.md +28 -11
  453. package/dist/templates/agents/architect.agent.yaml +57 -0
  454. package/dist/templates/agents/chatbot.agent.yaml +55 -0
  455. package/dist/templates/agents/corporate.agent.yaml +65 -0
  456. package/dist/templates/agents/investment-analyst.agent.yaml +80 -0
  457. package/dist/templates/agents/music-librarian.agent.yaml +70 -0
  458. package/dist/templates/agents/network-security.agent.yaml +82 -0
  459. package/dist/templates/agents/transport-security.agent.yaml +70 -0
  460. package/dist/templates/agents/web-engineer.agent.yaml +99 -0
  461. package/dist/templates/agents/web-pilot.agent.yaml +58 -0
  462. package/dist/templates/knowledge/music-store/LICENSE.md +11 -0
  463. package/dist/templates/knowledge/music-store/musicstore.sqlite +0 -0
  464. package/dist/templates/knowledge/music-store/tables.png +0 -0
  465. package/dist/templates/knowledge/music-store.knowledge.yaml +138 -0
  466. package/dist/templates/knowledge/org-chart/personnel.csv +21 -0
  467. package/dist/templates/knowledge/org-chart.knowledge.yaml +53 -0
  468. package/dist/templates/knowledge/pet-store/pet-store.db +0 -0
  469. package/dist/templates/knowledge/pet-store.knowledge.yaml +81 -0
  470. package/dist/templates/knowledge/security-incidents/incidents.json +55935 -0
  471. package/dist/templates/knowledge/security-incidents.knowledge.yaml +46 -0
  472. package/dist/templates/knowledge/transcripts.knowledge.yaml +29 -0
  473. package/dist/templates/knowledge/transport-ot/systems.csv +117 -0
  474. package/dist/templates/knowledge/transport-ot.knowledge.yaml +55 -0
  475. package/dist/templates/knowledge/web-docs.knowledge.yaml +20 -0
  476. package/dist/templates/llm.json +7 -30
  477. package/dist/templates/mcp.json +10 -4
  478. package/dist/templates/skills/orcha-builder/SKILL.md +219 -0
  479. package/dist/templates/skills/pii-guard/SKILL.md +22 -0
  480. package/dist/templates/skills/sandbox/SKILL.md +40 -0
  481. package/dist/templates/skills/web-pilot/SKILL.md +51 -0
  482. package/dist/templates/workflows/example.workflow.yaml +25 -30
  483. package/dist/templates/workflows/react-example.workflow.yaml +53 -0
  484. package/package.json +22 -20
  485. package/dist/lib/knowledge/graph-rag/community-detector.d.ts +0 -16
  486. package/dist/lib/knowledge/graph-rag/community-detector.d.ts.map +0 -1
  487. package/dist/lib/knowledge/graph-rag/community-detector.js +0 -81
  488. package/dist/lib/knowledge/graph-rag/community-detector.js.map +0 -1
  489. package/dist/lib/knowledge/graph-rag/community-summarizer.d.ts +0 -17
  490. package/dist/lib/knowledge/graph-rag/community-summarizer.d.ts.map +0 -1
  491. package/dist/lib/knowledge/graph-rag/community-summarizer.js +0 -87
  492. package/dist/lib/knowledge/graph-rag/community-summarizer.js.map +0 -1
  493. package/dist/lib/knowledge/graph-rag/entity-extractor.d.ts +0 -36
  494. package/dist/lib/knowledge/graph-rag/entity-extractor.d.ts.map +0 -1
  495. package/dist/lib/knowledge/graph-rag/entity-extractor.js +0 -192
  496. package/dist/lib/knowledge/graph-rag/entity-extractor.js.map +0 -1
  497. package/dist/lib/knowledge/graph-rag/extraction-cache.d.ts +0 -30
  498. package/dist/lib/knowledge/graph-rag/extraction-cache.d.ts.map +0 -1
  499. package/dist/lib/knowledge/graph-rag/extraction-cache.js +0 -88
  500. package/dist/lib/knowledge/graph-rag/extraction-cache.js.map +0 -1
  501. package/dist/lib/knowledge/graph-rag/global-search.d.ts +0 -19
  502. package/dist/lib/knowledge/graph-rag/global-search.d.ts.map +0 -1
  503. package/dist/lib/knowledge/graph-rag/global-search.js +0 -96
  504. package/dist/lib/knowledge/graph-rag/global-search.js.map +0 -1
  505. package/dist/lib/knowledge/graph-rag/graph-rag-factory.d.ts +0 -24
  506. package/dist/lib/knowledge/graph-rag/graph-rag-factory.d.ts.map +0 -1
  507. package/dist/lib/knowledge/graph-rag/graph-rag-factory.js +0 -239
  508. package/dist/lib/knowledge/graph-rag/graph-rag-factory.js.map +0 -1
  509. package/dist/lib/knowledge/graph-rag/index.d.ts +0 -14
  510. package/dist/lib/knowledge/graph-rag/index.d.ts.map +0 -1
  511. package/dist/lib/knowledge/graph-rag/index.js +0 -12
  512. package/dist/lib/knowledge/graph-rag/index.js.map +0 -1
  513. package/dist/lib/knowledge/graph-rag/local-search.d.ts +0 -20
  514. package/dist/lib/knowledge/graph-rag/local-search.d.ts.map +0 -1
  515. package/dist/lib/knowledge/graph-rag/local-search.js +0 -110
  516. package/dist/lib/knowledge/graph-rag/local-search.js.map +0 -1
  517. package/dist/lib/knowledge/graph-rag/memory-graph-store.d.ts +0 -31
  518. package/dist/lib/knowledge/graph-rag/memory-graph-store.d.ts.map +0 -1
  519. package/dist/lib/knowledge/graph-rag/memory-graph-store.js +0 -165
  520. package/dist/lib/knowledge/graph-rag/memory-graph-store.js.map +0 -1
  521. package/dist/lib/knowledge/graph-rag/neo4j-graph-store.d.ts +0 -38
  522. package/dist/lib/knowledge/graph-rag/neo4j-graph-store.d.ts.map +0 -1
  523. package/dist/lib/knowledge/graph-rag/neo4j-graph-store.js +0 -190
  524. package/dist/lib/knowledge/graph-rag/neo4j-graph-store.js.map +0 -1
  525. package/dist/lib/knowledge/graph-rag/search-mode-detector.d.ts +0 -11
  526. package/dist/lib/knowledge/graph-rag/search-mode-detector.d.ts.map +0 -1
  527. package/dist/lib/knowledge/graph-rag/search-mode-detector.js +0 -50
  528. package/dist/lib/knowledge/graph-rag/search-mode-detector.js.map +0 -1
  529. package/dist/lib/knowledge/graph-rag/types.d.ts +0 -368
  530. package/dist/lib/knowledge/graph-rag/types.d.ts.map +0 -1
  531. package/dist/lib/knowledge/graph-rag/types.js +0 -48
  532. package/dist/lib/knowledge/graph-rag/types.js.map +0 -1
  533. package/dist/lib/knowledge/knowledge-store-factory.d.ts +0 -16
  534. package/dist/lib/knowledge/knowledge-store-factory.d.ts.map +0 -1
  535. package/dist/lib/knowledge/knowledge-store-factory.js +0 -376
  536. package/dist/lib/knowledge/knowledge-store-factory.js.map +0 -1
  537. package/dist/lib/knowledge/knowledge-store-manager.d.ts +0 -18
  538. package/dist/lib/knowledge/knowledge-store-manager.d.ts.map +0 -1
  539. package/dist/lib/knowledge/knowledge-store-manager.js +0 -98
  540. package/dist/lib/knowledge/knowledge-store-manager.js.map +0 -1
  541. package/dist/lib/knowledge/loaders/s3-loader.d.ts +0 -17
  542. package/dist/lib/knowledge/loaders/s3-loader.d.ts.map +0 -1
  543. package/dist/lib/knowledge/loaders/s3-loader.js +0 -185
  544. package/dist/lib/knowledge/loaders/s3-loader.js.map +0 -1
  545. package/dist/lib/workflows/langgraph-executor.d.ts +0 -51
  546. package/dist/lib/workflows/langgraph-executor.d.ts.map +0 -1
  547. package/dist/lib/workflows/langgraph-executor.js +0 -297
  548. package/dist/lib/workflows/langgraph-executor.js.map +0 -1
  549. package/dist/templates/agents/call-center-analyst-simple.agent.yaml +0 -36
  550. package/dist/templates/agents/math.agent.yaml +0 -28
  551. package/dist/templates/agents/sentiment-structured.agent.yaml +0 -42
  552. package/dist/templates/knowledge/example.knowledge.yaml +0 -28
  553. package/dist/templates/llm.md +0 -1195
  554. package/dist/templates/workflows/langgraph-example.workflow.yaml +0 -84
@@ -2,12 +2,28 @@
2
2
  import { Component } from '../utils/Component.js';
3
3
  import { api } from '../services/ApiService.js';
4
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
+
5
19
  export class WorkflowsView extends Component {
6
20
  constructor() {
7
21
  super();
8
- this.isLoading = false;
22
+ this.workflows = [];
9
23
  this.selectedWorkflow = null;
10
24
  this.chartInterval = null;
25
+ this.activeTaskId = null;
26
+ this.eventSource = null;
11
27
  }
12
28
 
13
29
  async connectedCallback() {
@@ -17,223 +33,532 @@ export class WorkflowsView extends Component {
17
33
 
18
34
  disconnectedCallback() {
19
35
  this.stopChartUpdate();
36
+ this.closeEventSource();
37
+ }
38
+
39
+ closeEventSource() {
40
+ if (this.eventSource) {
41
+ this.eventSource.close();
42
+ this.eventSource = null;
43
+ }
20
44
  }
21
45
 
46
+ // ── Data ──
47
+
22
48
  async loadWorkflows() {
23
49
  try {
24
- const workflows = await api.getWorkflows();
25
- const select = this.querySelector('#workflowSelect');
26
- select.innerHTML = '<option value="">-- Select Workflow --</option>' +
27
- workflows.map(wf => `<option value="${wf.name}">${wf.name} - ${wf.description}</option>`).join('');
50
+ this.workflows = await api.getWorkflows();
51
+ this.renderCards();
28
52
  } catch (e) {
29
53
  console.error('Failed to load workflows', e);
30
54
  }
31
55
  }
32
56
 
33
- async onWorkflowSelected(name) {
34
- if (!name) {
35
- this.selectedWorkflow = null;
36
- this.renderDiagram([]);
37
- this.querySelector('#workflowInputs').innerHTML = '';
38
- this.querySelector('#runWorkflow').disabled = true;
39
- return;
40
- }
57
+ async selectWorkflow(name) {
58
+ if (this.selectedWorkflow?.name === name) return;
41
59
 
42
60
  try {
43
- const workflow = await api.getWorkflow(name);
44
- this.selectedWorkflow = workflow;
45
- this.renderInputs(workflow.input?.schema || {});
46
- this.renderDiagram(workflow.steps || []);
47
- this.querySelector('#runWorkflow').disabled = false;
61
+ const full = await api.getWorkflow(name);
62
+ this.selectedWorkflow = full;
63
+ this.renderCards();
64
+ this.renderDetail();
48
65
  } catch (e) {
49
66
  console.error('Failed to load workflow details', e);
50
67
  }
51
68
  }
52
69
 
53
- renderInputs(schema) {
54
- const container = this.querySelector('#workflowInputs');
55
- container.innerHTML = '';
70
+ // ── Left sidebar: cards ──
56
71
 
57
- if (Object.keys(schema).length === 0) return;
72
+ renderCards() {
73
+ const container = this.querySelector('#workflowCards');
74
+ if (!container) return;
58
75
 
59
- container.innerHTML = `
60
- <label class="block text-sm font-medium text-gray-300 mb-2">Workflow Inputs</label>
61
- <div class="space-y-2">
62
- ${Object.entries(schema).map(([key, field]) => `
63
- <input type="text" id="wf-${key}"
64
- placeholder="${key}${field.required ? ' *' : ''}${field.default ? ` (default: ${field.default})` : ''}"
65
- value="${field.default || ''}"
66
- class="w-full bg-dark-surface border border-dark-border rounded-lg px-4 py-2.5 text-gray-100 placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:border-transparent">
67
- `).join('')}
68
- </div>
69
- `;
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
+ });
70
106
  }
71
107
 
72
- renderDiagram(steps) {
73
- const container = this.querySelector('#flowDiagram');
74
- if (!steps.length) {
75
- container.innerHTML = '<div class="text-gray-500 italic text-center py-8">No steps defined</div>';
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>';
76
114
  return;
77
115
  }
78
116
 
117
+ const wf = this.selectedWorkflow;
118
+ const isReact = wf.type === 'react';
119
+
79
120
  container.innerHTML = `
80
- <div class="flex items-center gap-3 flex-nowrap min-w-max">
81
- <div class="flex flex-col items-center px-5 py-3 bg-green-500/10 border border-green-500/30 rounded-lg min-w-[100px] text-center">
82
- <span class="font-semibold text-green-400 text-sm">Input</span>
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>
83
170
  </div>
84
- ${steps.map(step => `
85
- <span class="text-gray-600 text-xl flex-shrink-0">→</span>
86
- <div id="step-${step.id}" class="step-node flex flex-col items-center px-4 py-3 bg-blue-500/10 border border-blue-500/30 rounded-lg min-w-[120px] text-center transition-all">
87
- <span class="font-semibold text-blue-300 text-sm">${step.id}</span>
88
- <span class="text-xs text-gray-400 mt-0.5">${step.agent}</span>
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>
89
196
  </div>
90
- `).join('')}
91
- <span class="text-gray-600 text-xl flex-shrink-0">→</span>
92
- <div class="flex flex-col items-center px-5 py-3 bg-green-500/10 border border-green-500/30 rounded-lg min-w-[100px] text-center">
93
- <span class="font-semibold text-green-400 text-sm">Output</span>
94
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>` : ''}
95
218
  </div>
96
- `;
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>`;
97
229
  }
98
230
 
99
- async runWorkflow() {
100
- if (!this.selectedWorkflow) return;
231
+ // ── Execution ──
101
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() {
102
248
  const inputs = {};
103
249
  this.querySelectorAll('input[id^="wf-"]').forEach(input => {
104
250
  const key = input.id.replace('wf-', '');
105
251
  if (input.value) inputs[key] = input.value;
106
252
  });
253
+ return inputs;
254
+ }
107
255
 
108
- const outputEl = this.querySelector('#workflowOutput');
109
- const statusEl = this.querySelector('#workflowStatus');
110
- const runBtn = this.querySelector('#runWorkflow');
111
-
112
- statusEl.classList.remove('hidden');
113
- outputEl.textContent = 'Starting workflow...';
114
- runBtn.disabled = true;
256
+ async runWorkflow() {
257
+ if (!this.selectedWorkflow) return;
115
258
 
259
+ const inputs = this.collectInputs();
260
+ const runBtn = this.querySelector('#runWorkflow');
261
+ this.resetRunUI();
262
+ if (runBtn) runBtn.disabled = true;
116
263
  this.startChartUpdate();
117
264
 
265
+ const isReact = this.selectedWorkflow.type === 'react';
266
+
118
267
  try {
119
- const res = await api.startWorkflowStream(this.selectedWorkflow.name, inputs);
120
- const reader = res.body.getReader();
121
- const decoder = new TextDecoder();
122
-
123
- while (true) {
124
- const { done, value } = await reader.read();
125
- if (done) break;
126
-
127
- const chunk = decoder.decode(value);
128
- const lines = chunk.split('\n');
129
-
130
- for (const line of lines) {
131
- if (line.startsWith('data: ')) {
132
- const data = line.slice(6);
133
- if (data === '[DONE]') continue;
134
- try {
135
- const update = JSON.parse(data);
136
- this.handleStatusUpdate(update);
137
- } catch (e) { }
138
- }
139
- }
268
+ if (isReact) {
269
+ await this.runReactWorkflow(inputs);
270
+ } else {
271
+ await this.runStepsWorkflow(inputs);
140
272
  }
141
273
  } catch (e) {
142
- outputEl.textContent = 'Error: ' + e.message;
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';
143
277
  } finally {
144
- runBtn.disabled = false;
145
- this.stopChartUpdate();
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');
146
418
  }
147
419
  }
148
420
 
149
421
  handleStatusUpdate(update) {
150
422
  if (update.type === 'status') {
151
423
  const { message, type, stepId } = update.data;
152
- this.querySelector('#statusMessage').textContent = message;
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
+
153
440
  this.addLog(message, type);
154
441
 
155
442
  if (stepId) {
156
443
  const stepEl = this.querySelector(`#step-${stepId}`);
157
444
  if (stepEl) {
158
- if (type === 'step_start') stepEl.className = stepEl.className.replace('bg-blue-500/10', 'bg-yellow-500/10 animate-pulse').replace('border-blue-500/30', 'border-yellow-500/30');
159
- if (type === 'step_complete') stepEl.className = stepEl.className.replace('bg-yellow-500/10 animate-pulse', 'bg-green-500/10').replace('border-yellow-500/30', 'border-green-500/30');
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
+ }
160
455
  }
161
456
  }
162
457
  } else if (update.type === 'result') {
163
458
  const outputEl = this.querySelector('#workflowOutput');
164
- outputEl.textContent = JSON.stringify(update.data.output, null, 2);
459
+ outputEl.className = outputEl.className.replace('text-gray-500', 'text-gray-300');
460
+ outputEl.textContent = JSON.stringify(update.data.output || update.data, null, 2);
165
461
  }
166
462
  }
167
463
 
168
464
  addLog(msg, type) {
169
465
  const log = this.querySelector('#statusLog');
466
+ const config = LOG_CONFIG[type] || { icon: 'fa-circle', color: 'gray' };
467
+
170
468
  const div = document.createElement('div');
171
- div.className = 'text-xs font-mono';
172
- if (type === 'step_error') div.classList.add('text-red-400');
173
- else if (type === 'step_complete') div.classList.add('text-green-400');
174
- else div.classList.add('text-gray-400');
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
+ `;
175
477
 
176
- div.textContent = `[${new Date().toLocaleTimeString()}] ${msg}`;
177
478
  log.appendChild(div);
178
479
  log.scrollTop = log.scrollHeight;
179
480
  }
180
481
 
482
+ // ── Timer ──
483
+
181
484
  startChartUpdate() {
485
+ this.stopChartUpdate();
182
486
  const start = Date.now();
183
487
  const timeEl = this.querySelector('#statusTime');
488
+ timeEl.textContent = '0s';
184
489
  this.chartInterval = setInterval(() => {
185
- const seconds = Math.floor((Date.now() - start) / 1000);
186
- timeEl.textContent = `${seconds}s`;
490
+ timeEl.textContent = `${Math.floor((Date.now() - start) / 1000)}s`;
187
491
  }, 1000);
188
492
  }
189
493
 
190
494
  stopChartUpdate() {
191
- if (this.chartInterval) clearInterval(this.chartInterval);
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;");
192
506
  }
193
507
 
194
508
  postRender() {
195
- this.querySelector('#workflowSelect').addEventListener('change', (e) => {
196
- this.onWorkflowSelected(e.target.value);
197
- });
198
- this.querySelector('#runWorkflow').addEventListener('click', () => {
199
- this.runWorkflow();
200
- });
509
+ // No static event bindings needed — cards and run button bind dynamically
201
510
  }
202
511
 
203
512
  template() {
204
513
  return `
205
- <div class="space-y-6 h-full overflow-y-auto pb-8 custom-scrollbar">
206
- <div>
207
- <label class="block text-sm font-medium text-gray-300 mb-2">Select Workflow</label>
208
- <select id="workflowSelect"
209
- class="w-full bg-dark-surface border border-dark-border rounded-lg px-4 py-2.5 text-gray-100 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:border-transparent">
210
- <option value="">Loading...</option>
211
- </select>
212
- </div>
213
-
214
- <div id="flowDiagram" class="bg-dark-surface border border-dark-border rounded-lg p-6 overflow-x-auto min-h-[120px] flex items-center justify-center">
215
- <div class="text-gray-500 italic">Select a workflow</div>
216
- </div>
217
-
218
- <div id="workflowInputs" class="space-y-3"></div>
219
-
220
- <div id="workflowStatus" class="bg-dark-surface border border-dark-border rounded-lg p-5 hidden">
221
- <div class="flex justify-between items-center mb-3">
222
- <div id="statusMessage" class="font-medium text-gray-200">Ready</div>
223
- <div id="statusTime" class="text-sm text-gray-400">0s</div>
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>
224
522
  </div>
225
- <div id="statusLog" class="bg-dark-bg rounded-lg p-3 h-32 overflow-y-auto space-y-1 border border-dark-border"></div>
226
523
  </div>
227
524
 
228
- <button id="runWorkflow" disabled
229
- class="bg-purple-600 hover:bg-purple-700 disabled:bg-gray-700 disabled:cursor-not-allowed text-white font-medium px-6 py-2.5 rounded-lg transition-colors w-full sm:w-auto">
230
- Run Workflow
231
- </button>
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>
232
531
 
233
- <div>
234
- <label class="block text-sm font-medium text-gray-300 mb-2">Output</label>
235
- <div id="workflowOutput"
236
- class="bg-dark-surface border border-dark-border rounded-lg p-4 min-h-[200px] font-mono text-sm text-gray-300 whitespace-pre-wrap overflow-x-auto"></div>
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>
237
562
  </div>
238
563
  </div>
239
564
  `;