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
@@ -1,16 +1,17 @@
1
1
 
2
2
  import { Component } from '../utils/Component.js';
3
3
  import { api } from '../services/ApiService.js';
4
+ import './AgentComposer.js';
4
5
 
5
6
  const FILE_ICONS = {
6
- yaml: { icon: 'fa-file-code', color: 'text-orange-400' },
7
- yml: { icon: 'fa-file-code', color: 'text-orange-400' },
8
- json: { icon: 'fa-file-code', color: 'text-yellow-400' },
9
- js: { icon: 'fa-file-code', color: 'text-yellow-300' },
10
- ts: { icon: 'fa-file-code', color: 'text-yellow-300' },
11
- txt: { icon: 'fa-file-lines', color: 'text-gray-400' },
12
- md: { icon: 'fa-file-lines', color: 'text-blue-400' },
13
- default: { icon: 'fa-file', color: 'text-gray-500' },
7
+ yaml: { icon: 'fa-file-code', color: 'text-orange' },
8
+ yml: { icon: 'fa-file-code', color: 'text-orange' },
9
+ json: { icon: 'fa-file-code', color: 'text-yellow' },
10
+ js: { icon: 'fa-file-code', color: 'text-yellow' },
11
+ ts: { icon: 'fa-file-code', color: 'text-yellow' },
12
+ txt: { icon: 'fa-file-lines', color: 'text-secondary' },
13
+ md: { icon: 'fa-file-lines', color: 'text-blue' },
14
+ default: { icon: 'fa-file', color: 'text-muted' },
14
15
  };
15
16
 
16
17
  const ACE_MODES = {
@@ -27,35 +28,35 @@ const RESOURCE_TYPES = {
27
28
  agent: {
28
29
  label: 'Agent',
29
30
  icon: 'fa-robot',
30
- color: 'text-blue-400',
31
+ color: 'text-blue',
31
32
  folder: 'agents/',
32
33
  suffix: '.agent.yaml',
33
34
  },
34
35
  function: {
35
36
  label: 'Function',
36
37
  icon: 'fa-bolt',
37
- color: 'text-yellow-400',
38
+ color: 'text-yellow',
38
39
  folder: 'functions/',
39
40
  suffix: '.function.js',
40
41
  },
41
42
  knowledge: {
42
43
  label: 'Knowledge',
43
44
  icon: 'fa-database',
44
- color: 'text-purple-400',
45
+ color: 'text-purple',
45
46
  folder: 'knowledge/',
46
47
  suffix: '.knowledge.yaml',
47
48
  },
48
49
  skill: {
49
50
  label: 'Skill',
50
51
  icon: 'fa-wand-magic-sparkles',
51
- color: 'text-green-400',
52
+ color: 'text-green',
52
53
  folder: 'skills/',
53
54
  suffix: '/SKILL.md',
54
55
  },
55
56
  workflow: {
56
57
  label: 'Workflow',
57
58
  icon: 'fa-diagram-project',
58
- color: 'text-orange-400',
59
+ color: 'text-orange',
59
60
  folder: 'workflows/',
60
61
  suffix: '.workflow.yaml',
61
62
  },
@@ -66,15 +67,21 @@ function getExtension(filename) {
66
67
  return parts.length > 1 ? parts.pop().toLowerCase() : '';
67
68
  }
68
69
 
70
+ function isAgentFile(path) {
71
+ return path && path.endsWith('.agent.yaml');
72
+ }
73
+
69
74
  export class IdeView extends Component {
70
75
  constructor() {
71
76
  super();
72
77
  this.editor = null;
73
78
  this.currentFile = null;
74
79
  this.isDirty = false;
80
+ this._loading = false;
75
81
  this.treeData = [];
76
82
  this.expandedDirs = new Set();
77
83
  this._renamingPath = null;
84
+ this._viewMode = 'source'; // 'source' | 'visual'
78
85
  this._handleKeyDown = this._handleKeyDown.bind(this);
79
86
  this._handleDocClick = this._handleDocClick.bind(this);
80
87
  }
@@ -86,6 +93,7 @@ export class IdeView extends Component {
86
93
  this.editor.destroy();
87
94
  this.editor = null;
88
95
  }
96
+ this._viewMode = 'source';
89
97
  }
90
98
 
91
99
  async postRender() {
@@ -105,6 +113,7 @@ export class IdeView extends Component {
105
113
  });
106
114
  }
107
115
 
116
+ this._attachModeToggle();
108
117
  await this._loadTree();
109
118
  }
110
119
 
@@ -150,10 +159,10 @@ export class IdeView extends Component {
150
159
  const ext = getExtension(node.name);
151
160
  const iconInfo = FILE_ICONS[ext] || FILE_ICONS.default;
152
161
  return `
153
- <div class="tree-item tree-depth-${Math.min(depth, 5)} flex items-center gap-2 rounded text-sm text-gray-300">
162
+ <div class="tree-item tree-depth-${Math.min(depth, 5)}">
154
163
  <span class="w-3"></span>
155
164
  <i class="fas ${iconInfo.icon} ${iconInfo.color} text-sm"></i>
156
- <input type="text" class="inline-tree-input bg-dark-hover border border-blue-500 text-white text-sm rounded px-1 outline-none flex-1 min-w-0"
165
+ <input type="text" class="inline-tree-input"
157
166
  data-action="rename" data-path="${node.path}" value="${node.name}" />
158
167
  </div>
159
168
  `;
@@ -171,17 +180,17 @@ export class IdeView extends Component {
171
180
 
172
181
  // Only show menu button for subfolders (depth > 0)
173
182
  const menuBtn = depth > 0 ? `
174
- <button class="tree-menu-btn opacity-0 group-hover:opacity-100 px-1 text-gray-500 hover:text-white transition-opacity"
183
+ <button class="tree-menu-btn"
175
184
  data-menu-path="${node.path}" data-menu-type="directory">
176
185
  <i class="fas fa-ellipsis-v text-xs"></i>
177
186
  </button>
178
187
  ` : '';
179
188
 
180
189
  return `
181
- <div class="tree-item group tree-depth-${Math.min(depth, 5)} flex items-center gap-2 cursor-pointer hover:bg-dark-hover rounded text-sm text-gray-300"
190
+ <div class="tree-item tree-depth-${Math.min(depth, 5)}"
182
191
  data-path="${node.path}" data-type="directory">
183
- <i class="fas ${chevron} text-xs text-gray-500 w-3"></i>
184
- <i class="fas fa-folder${isExpanded ? '-open' : ''} text-yellow-500 text-sm"></i>
192
+ <i class="fas ${chevron} text-xs text-muted"></i>
193
+ <i class="fas fa-folder${isExpanded ? '-open' : ''} text-yellow text-sm"></i>
185
194
  <span class="flex-1 min-w-0">${node.name}</span>
186
195
  ${menuBtn}
187
196
  </div>
@@ -197,15 +206,14 @@ export class IdeView extends Component {
197
206
  const ext = getExtension(node.name);
198
207
  const iconInfo = FILE_ICONS[ext] || FILE_ICONS.default;
199
208
  const isActive = this.currentFile && this.currentFile.path === node.path;
200
- const activeClass = isActive ? 'bg-dark-hover text-white' : '';
201
209
 
202
210
  return `
203
- <div class="tree-item group tree-depth-${Math.min(depth, 5)} flex items-center gap-2 cursor-pointer hover:bg-dark-hover rounded text-sm text-gray-300 ${activeClass}"
211
+ <div class="tree-item tree-depth-${Math.min(depth, 5)} ${isActive ? 'active-file' : ''}"
204
212
  data-path="${node.path}" data-type="file">
205
213
  <span class="w-3"></span>
206
214
  <i class="fas ${iconInfo.icon} ${iconInfo.color} text-sm"></i>
207
215
  <span class="tree-filename truncate flex-1 min-w-0">${node.name}</span>
208
- <button class="tree-menu-btn opacity-0 group-hover:opacity-100 px-1 text-gray-500 hover:text-white transition-opacity"
216
+ <button class="tree-menu-btn"
209
217
  data-menu-path="${node.path}" data-menu-type="file">
210
218
  <i class="fas fa-ellipsis-v text-xs"></i>
211
219
  </button>
@@ -322,19 +330,19 @@ export class IdeView extends Component {
322
330
 
323
331
  const menu = document.createElement('div');
324
332
  menu.id = 'contextMenu';
325
- menu.className = 'fixed z-50 bg-dark-surface border border-dark-border rounded shadow-lg py-1 min-w-[100px]';
333
+ menu.className = 'context-menu';
326
334
 
327
335
  const isFile = type === 'file';
328
336
 
329
337
  menu.innerHTML = `
330
338
  ${isFile ? `
331
- <div class="context-item flex items-center gap-2 px-3 py-1.5 cursor-pointer hover:bg-dark-hover text-sm text-gray-300" data-action="rename">
332
- <i class="fas fa-pen text-xs w-4 text-gray-500"></i>
339
+ <div class="context-item" data-action="rename">
340
+ <i class="fas fa-pen text-xs text-muted"></i>
333
341
  <span>Rename</span>
334
342
  </div>
335
343
  ` : ''}
336
- <div class="context-item flex items-center gap-2 px-3 py-1.5 cursor-pointer hover:bg-dark-hover text-sm text-red-400" data-action="delete">
337
- <i class="fas fa-trash text-xs w-4"></i>
344
+ <div class="context-item danger" data-action="delete">
345
+ <i class="fas fa-trash text-xs"></i>
338
346
  <span>Delete</span>
339
347
  </div>
340
348
  `;
@@ -395,7 +403,9 @@ export class IdeView extends Component {
395
403
  if (this.currentFile && this.currentFile.path === filePath) {
396
404
  this.currentFile = null;
397
405
  this.isDirty = false;
406
+ this._viewMode = 'source';
398
407
  this._renderEditor();
408
+ this._updateModeToggle();
399
409
  }
400
410
 
401
411
  await this._loadTree();
@@ -425,22 +435,22 @@ export class IdeView extends Component {
425
435
  if (!btn) return;
426
436
 
427
437
  const items = Object.entries(RESOURCE_TYPES).map(([key, rt]) => `
428
- <div class="new-resource-item flex items-center gap-2 px-3 py-1.5 cursor-pointer hover:bg-dark-hover rounded text-sm text-gray-300"
438
+ <div class="resource-dropdown-item"
429
439
  data-resource="${key}">
430
- <i class="fas ${rt.icon} ${rt.color} text-xs w-4 text-center"></i>
440
+ <i class="fas ${rt.icon} ${rt.color} text-xs"></i>
431
441
  <span>${rt.label}</span>
432
442
  </div>
433
443
  `).join('');
434
444
 
435
445
  const dropdown = document.createElement('div');
436
446
  dropdown.id = 'newResourceDropdown';
437
- dropdown.className = 'absolute right-0 top-full z-50 bg-dark-surface border border-dark-border rounded-lg shadow-lg py-1 mt-1 min-w-[140px]';
447
+ dropdown.className = 'resource-dropdown';
438
448
  dropdown.innerHTML = items;
439
449
 
440
450
  btn.parentElement.classList.add('relative');
441
451
  btn.parentElement.appendChild(dropdown);
442
452
 
443
- dropdown.querySelectorAll('.new-resource-item').forEach(item => {
453
+ dropdown.querySelectorAll('.resource-dropdown-item').forEach(item => {
444
454
  item.addEventListener('click', (e) => {
445
455
  e.stopPropagation();
446
456
  const type = item.dataset.resource;
@@ -462,32 +472,27 @@ export class IdeView extends Component {
462
472
  const rt = RESOURCE_TYPES[type];
463
473
  const modal = document.createElement('div');
464
474
  modal.id = 'createResourceModal';
465
- modal.className = 'fixed inset-0 z-50 flex items-center justify-center';
475
+ modal.className = 'auth-overlay';
466
476
  modal.innerHTML = `
467
- <div class="absolute inset-0 bg-black/50" data-action="cancel"></div>
468
- <div class="relative bg-dark-surface border border-dark-border rounded-lg shadow-xl w-full max-w-md mx-4">
469
- <div class="flex items-center gap-3 px-4 py-3 border-b border-dark-border">
477
+ <div class="absolute inset-0 bg-overlay" data-action="cancel"></div>
478
+ <div class="relative panel shadow-xl w-full mx-4 max-w-md">
479
+ <div class="flex items-center gap-3 px-4 py-3 border-b">
470
480
  <i class="fas ${rt.icon} ${rt.color}"></i>
471
481
  <span class="text-white font-medium">New ${rt.label}</span>
472
482
  </div>
473
483
  <div class="p-4">
474
- <label class="block text-sm text-gray-400 mb-2">Name</label>
475
- <div class="flex items-center bg-dark-bg border border-dark-border rounded overflow-hidden">
476
- <span class="px-3 py-2 text-gray-500 text-sm bg-dark-hover border-r border-dark-border">${rt.folder}</span>
484
+ <label class="block text-sm text-secondary mb-2">Name</label>
485
+ <div class="create-modal-input">
486
+ <span>${rt.folder}</span>
477
487
  <input type="text" id="resourceNameInput"
478
- class="flex-1 px-3 py-2 bg-transparent text-white text-sm outline-none"
479
488
  placeholder="my-${type}" autocomplete="off" />
480
- <span class="px-3 py-2 text-gray-500 text-sm bg-dark-hover border-l border-dark-border">${rt.suffix}</span>
489
+ <span>${rt.suffix}</span>
481
490
  </div>
482
- <p class="text-xs text-gray-500 mt-2">Use lowercase letters, numbers, and hyphens</p>
491
+ <p class="text-xs text-muted mt-2">Use lowercase letters, numbers, and hyphens</p>
483
492
  </div>
484
- <div class="flex justify-end gap-2 px-4 py-3 border-t border-dark-border">
485
- <button class="px-4 py-1.5 text-sm text-gray-400 hover:text-white transition-colors" data-action="cancel">
486
- Cancel
487
- </button>
488
- <button class="px-4 py-1.5 text-sm bg-green-600 hover:bg-green-700 text-white rounded transition-colors" data-action="create">
489
- Create
490
- </button>
493
+ <div class="flex justify-end gap-2 px-4 py-3 border-t">
494
+ <button class="btn btn-ghost" data-action="cancel">Cancel</button>
495
+ <button class="btn btn-accent btn-sm" data-action="create">Create</button>
491
496
  </div>
492
497
  </div>
493
498
  `;
@@ -604,8 +609,19 @@ export class IdeView extends Component {
604
609
  const data = await api.readFile(filePath);
605
610
  this.currentFile = { path: data.path, content: data.content };
606
611
  this.isDirty = false;
612
+ // Preserve visual/source choice when switching between agent files
613
+ if (!isAgentFile(filePath)) {
614
+ this._viewMode = 'source';
615
+ } else if (!isAgentFile(this._prevFilePath)) {
616
+ this._viewMode = 'visual';
617
+ }
618
+ this._prevFilePath = filePath;
619
+ this._loading = true;
607
620
  this._renderEditor();
621
+ this._loading = false;
622
+ this._updateDirtyState();
608
623
  this._renderTree();
624
+ this._updateModeToggle();
609
625
  } catch (err) {
610
626
  console.error('Failed to read file:', err);
611
627
  }
@@ -613,19 +629,18 @@ export class IdeView extends Component {
613
629
 
614
630
  _renderEditor() {
615
631
  const editorContainer = this.querySelector('#editorContainer');
632
+ const composerContainer = this.querySelector('#composerContainer');
616
633
  const welcomePanel = this.querySelector('#welcomePanel');
617
634
  const breadcrumb = this.querySelector('#breadcrumb');
618
- const saveBtn = this.querySelector('#saveBtn');
619
- const dirtyIndicator = this.querySelector('#dirtyIndicator');
620
635
 
621
636
  if (!this.currentFile) {
622
637
  if (welcomePanel) welcomePanel.classList.remove('hidden');
623
638
  if (editorContainer) editorContainer.classList.add('hidden');
639
+ if (composerContainer) composerContainer.classList.add('hidden');
624
640
  return;
625
641
  }
626
642
 
627
643
  if (welcomePanel) welcomePanel.classList.add('hidden');
628
- if (editorContainer) editorContainer.classList.remove('hidden');
629
644
 
630
645
  // Update breadcrumb
631
646
  if (breadcrumb) {
@@ -636,7 +651,49 @@ export class IdeView extends Component {
636
651
  // Update dirty state
637
652
  this._updateDirtyState();
638
653
 
639
- // Initialize or update Ace
654
+ if (this._viewMode === 'visual') {
655
+ if (editorContainer) editorContainer.classList.add('hidden');
656
+ if (composerContainer) composerContainer.classList.remove('hidden');
657
+
658
+ // Parse and load into composer
659
+ let parsed;
660
+ try {
661
+ parsed = jsyaml.load(this.currentFile.content);
662
+ } catch { parsed = null; }
663
+
664
+ if (parsed && typeof parsed === 'object') {
665
+ let composer = composerContainer.querySelector('agent-composer');
666
+ if (!composer) {
667
+ composer = document.createElement('agent-composer');
668
+ composer.classList.add('block', 'h-full');
669
+ composerContainer.appendChild(composer);
670
+ composer.addEventListener('composer:change', () => {
671
+ if (this._loading) return;
672
+ if (!this.isDirty) {
673
+ this.isDirty = true;
674
+ this._updateDirtyState();
675
+ }
676
+ });
677
+ }
678
+ composer.data = parsed;
679
+ }
680
+
681
+ // Also sync Ace so switching to source has current content
682
+ this._syncAceContent();
683
+ return;
684
+ }
685
+
686
+ // Source mode
687
+ if (composerContainer) composerContainer.classList.add('hidden');
688
+ if (editorContainer) editorContainer.classList.remove('hidden');
689
+
690
+ this._syncAceContent();
691
+ this._updateDirtyState();
692
+ if (this.editor) this.editor.focus();
693
+ }
694
+
695
+ _syncAceContent() {
696
+ if (!this.currentFile) return;
640
697
  const aceEl = this.querySelector('#aceEditor');
641
698
  if (!aceEl) return;
642
699
 
@@ -650,8 +707,8 @@ export class IdeView extends Component {
650
707
  tabSize: 2,
651
708
  useSoftTabs: true,
652
709
  });
653
-
654
710
  this.editor.session.on('change', () => {
711
+ if (this._loading) return;
655
712
  if (!this.isDirty) {
656
713
  this.isDirty = true;
657
714
  this._updateDirtyState();
@@ -659,16 +716,10 @@ export class IdeView extends Component {
659
716
  });
660
717
  }
661
718
 
662
- // Set mode based on file extension
663
719
  const ext = getExtension(this.currentFile.path);
664
720
  const mode = ACE_MODES[ext] || ACE_MODES.default;
665
721
  this.editor.session.setMode(mode);
666
-
667
- // Set content without triggering change event
668
722
  this.editor.setValue(this.currentFile.content, -1);
669
- this.isDirty = false;
670
- this._updateDirtyState();
671
- this.editor.focus();
672
723
  }
673
724
 
674
725
  _updateDirtyState() {
@@ -690,9 +741,18 @@ export class IdeView extends Component {
690
741
  }
691
742
 
692
743
  async _saveFile() {
693
- if (!this.currentFile || !this.isDirty || !this.editor) return;
694
-
695
- const content = this.editor.getValue();
744
+ if (!this.currentFile || !this.isDirty) return;
745
+
746
+ let content;
747
+ if (this._viewMode === 'visual') {
748
+ const composer = this.querySelector('agent-composer');
749
+ if (!composer) return;
750
+ const data = composer.getData();
751
+ content = jsyaml.dump(data, { indent: 2, lineWidth: -1, noRefs: true, sortKeys: false });
752
+ } else {
753
+ if (!this.editor) return;
754
+ content = this.editor.getValue();
755
+ }
696
756
 
697
757
  try {
698
758
  const result = await api.writeFile(this.currentFile.path, content);
@@ -707,16 +767,16 @@ export class IdeView extends Component {
707
767
  const failed = result.reloaded === 'error';
708
768
  if (failed) {
709
769
  savedMsg.textContent = 'Saved (reload failed)';
710
- savedMsg.classList.remove('hidden', 'text-green-400');
711
- savedMsg.classList.add('text-yellow-400');
770
+ savedMsg.classList.remove('hidden', 'text-green');
771
+ savedMsg.classList.add('text-amber');
712
772
  } else if (reloaded) {
713
773
  savedMsg.textContent = `Saved & reloaded ${result.reloaded}`;
714
- savedMsg.classList.remove('hidden', 'text-yellow-400');
715
- savedMsg.classList.add('text-green-400');
774
+ savedMsg.classList.remove('hidden', 'text-amber');
775
+ savedMsg.classList.add('text-green');
716
776
  } else {
717
777
  savedMsg.textContent = 'Saved!';
718
- savedMsg.classList.remove('hidden', 'text-yellow-400');
719
- savedMsg.classList.add('text-green-400');
778
+ savedMsg.classList.remove('hidden', 'text-amber');
779
+ savedMsg.classList.add('text-green');
720
780
  }
721
781
  setTimeout(() => savedMsg.classList.add('hidden'), 2500);
722
782
  }
@@ -726,55 +786,186 @@ export class IdeView extends Component {
726
786
  }
727
787
  }
728
788
 
789
+ // ── Mode Toggle ──
790
+
791
+ _attachModeToggle() {
792
+ this.querySelectorAll('.mode-toggle-btn').forEach(btn => {
793
+ btn.addEventListener('click', () => {
794
+ const mode = btn.dataset.mode;
795
+ if (mode === this._viewMode) return;
796
+ if (mode === 'visual') this._switchToVisual();
797
+ else this._switchToSource();
798
+ });
799
+ });
800
+ }
801
+
802
+ _updateModeToggle() {
803
+ const toggle = this.querySelector('#modeToggle');
804
+ if (!toggle) return;
805
+
806
+ const show = this.currentFile && isAgentFile(this.currentFile.path);
807
+ toggle.classList.toggle('hidden', !show);
808
+
809
+ toggle.querySelectorAll('.mode-toggle-btn').forEach(btn => {
810
+ btn.classList.toggle('active', btn.dataset.mode === this._viewMode);
811
+ });
812
+ }
813
+
814
+ _switchToVisual() {
815
+ if (!this.currentFile) return;
816
+
817
+ // Get current Ace content and parse
818
+ const content = this.editor ? this.editor.getValue() : this.currentFile.content;
819
+ let parsed;
820
+ try {
821
+ parsed = jsyaml.load(content);
822
+ } catch (err) {
823
+ this._showToast(`Invalid YAML: ${err.message}`, 'error');
824
+ return;
825
+ }
826
+
827
+ if (!parsed || typeof parsed !== 'object') {
828
+ this._showToast('YAML must be an object', 'error');
829
+ return;
830
+ }
831
+
832
+ const wasDirty = this.isDirty;
833
+ this._viewMode = 'visual';
834
+ this._updateModeToggle();
835
+
836
+ // Hide Ace, show composer
837
+ const editorContainer = this.querySelector('#editorContainer');
838
+ const composerContainer = this.querySelector('#composerContainer');
839
+ if (editorContainer) editorContainer.classList.add('hidden');
840
+ if (composerContainer) composerContainer.classList.remove('hidden');
841
+
842
+ // Create or get the composer element
843
+ let composer = composerContainer.querySelector('agent-composer');
844
+ if (!composer) {
845
+ composer = document.createElement('agent-composer');
846
+ composer.classList.add('block', 'h-full');
847
+ composerContainer.appendChild(composer);
848
+ composer.addEventListener('composer:change', () => {
849
+ if (this._loading) return;
850
+ if (!this.isDirty) {
851
+ this.isDirty = true;
852
+ this._updateDirtyState();
853
+ }
854
+ });
855
+ }
856
+
857
+ this._loading = true;
858
+ composer.data = parsed;
859
+ this._loading = false;
860
+ this.isDirty = wasDirty;
861
+ this._updateDirtyState();
862
+ }
863
+
864
+ _switchToSource() {
865
+ if (!this.currentFile) return;
866
+
867
+ const wasDirty = this.isDirty;
868
+ const composer = this.querySelector('agent-composer');
869
+ if (composer && this._viewMode === 'visual') {
870
+ const data = composer.getData();
871
+ const yaml = jsyaml.dump(data, { indent: 2, lineWidth: -1, noRefs: true, sortKeys: false });
872
+
873
+ this._loading = true;
874
+ if (this.editor) {
875
+ this.editor.setValue(yaml, -1);
876
+ }
877
+ this._loading = false;
878
+ this.currentFile.content = yaml;
879
+ }
880
+
881
+ this._viewMode = 'source';
882
+ this._updateModeToggle();
883
+
884
+ const editorContainer = this.querySelector('#editorContainer');
885
+ const composerContainer = this.querySelector('#composerContainer');
886
+ if (composerContainer) composerContainer.classList.add('hidden');
887
+ if (editorContainer) editorContainer.classList.remove('hidden');
888
+
889
+ this.isDirty = wasDirty;
890
+ this._updateDirtyState();
891
+
892
+ if (this.editor) {
893
+ this.editor.resize();
894
+ this.editor.focus();
895
+ }
896
+ }
897
+
898
+ _showToast(message, type = 'info') {
899
+ const existing = document.querySelector('#ideToast');
900
+ if (existing) existing.remove();
901
+
902
+ const toast = document.createElement('div');
903
+ toast.id = 'ideToast';
904
+ toast.className = `ide-toast ${type === 'error' ? 'error' : ''}`;
905
+ toast.textContent = message;
906
+ document.body.appendChild(toast);
907
+ setTimeout(() => toast.remove(), 4000);
908
+ }
909
+
729
910
  template() {
730
911
  return `
731
- <div class="flex flex-col h-full">
912
+ <div class="ide-shell">
732
913
  <!-- Toolbar -->
733
- <div class="flex items-center justify-between bg-dark-surface border border-dark-border rounded-t-lg px-4 py-2 flex-shrink-0">
734
- <div class="flex items-center gap-2 text-sm text-gray-400">
735
- <i class="fas fa-code text-green-400"></i>
914
+ <div class="ide-toolbar">
915
+ <div class="flex items-center gap-2 text-sm text-secondary">
916
+ <i class="fas fa-code text-green"></i>
736
917
  <span id="breadcrumb">Select a file to edit</span>
737
918
  </div>
738
919
  <div class="flex items-center gap-3">
739
- <span id="dirtyIndicator" class="hidden text-yellow-400 text-xs flex items-center gap-1">
740
- <i class="fas fa-circle text-[6px]"></i> Unsaved
920
+ <!-- Mode toggle (only for .agent.yaml files) -->
921
+ <div id="modeToggle" class="hidden mode-toggle">
922
+ <button class="mode-toggle-btn active" data-mode="source">
923
+ <i class="fas fa-code mr-1"></i>Source
924
+ </button>
925
+ <button class="mode-toggle-btn" data-mode="visual">
926
+ <i class="fas fa-palette mr-1"></i>Visual
927
+ </button>
928
+ </div>
929
+ <span id="dirtyIndicator" class="hidden text-amber text-xs flex items-center gap-1">
930
+ <i class="fas fa-circle text-2xs"></i> Unsaved
741
931
  </span>
742
- <span id="savedMsg" class="hidden text-green-400 text-xs">Saved!</span>
743
- <button id="saveBtn" class="px-3 py-1 bg-green-600 hover:bg-green-700 text-white text-sm rounded transition-colors opacity-50 cursor-not-allowed" disabled>
932
+ <span id="savedMsg" class="hidden text-green text-xs">Saved!</span>
933
+ <button id="saveBtn" class="btn btn-accent btn-sm opacity-50 cursor-not-allowed" disabled>
744
934
  <i class="fas fa-save mr-1"></i> Save
745
935
  </button>
746
936
  </div>
747
937
  </div>
748
938
 
749
939
  <!-- Main content -->
750
- <div class="flex flex-1 min-h-0 border border-t-0 border-dark-border rounded-b-lg overflow-hidden">
940
+ <div class="ide-main">
751
941
  <!-- File tree sidebar -->
752
- <div class="w-60 flex-shrink-0 bg-dark-surface border-r border-dark-border overflow-y-auto">
753
- <div class="px-3 py-2 text-xs font-semibold text-gray-500 uppercase tracking-wider border-b border-dark-border flex items-center justify-between">
942
+ <div class="ide-tree">
943
+ <div class="ide-tree-header">
754
944
  <span>Explorer</span>
755
- <button id="newFileBtn" class="text-gray-500 hover:text-green-400 transition-colors" title="New Resource">
945
+ <button id="newFileBtn" class="text-muted transition-colors" title="New Resource">
756
946
  <i class="fas fa-plus text-xs"></i>
757
947
  </button>
758
948
  </div>
759
949
  <div id="fileTree" class="py-1">
760
- <div class="px-4 py-8 text-center text-gray-500 text-sm">
950
+ <div class="px-4 py-8 text-center text-muted text-sm">
761
951
  <i class="fas fa-spinner fa-spin mr-2"></i> Loading...
762
952
  </div>
763
953
  </div>
764
954
  </div>
765
955
 
766
- <!-- Editor / Welcome -->
767
- <div class="flex-1 min-w-0 relative">
768
- <div id="welcomePanel" class="flex items-center justify-center h-full text-gray-500">
956
+ <!-- Editor / Composer / Welcome -->
957
+ <div class="ide-editor">
958
+ <div id="welcomePanel" class="flex items-center justify-center h-full text-muted">
769
959
  <div class="text-center">
770
- <i class="fas fa-code text-4xl mb-4 text-gray-600"></i>
960
+ <i class="fas fa-code text-4xl mb-4 text-muted"></i>
771
961
  <p class="text-lg">Select a file from the tree to begin editing</p>
772
- <p class="text-sm mt-2 text-gray-600">Supports YAML, JSON, JavaScript, TypeScript, and more</p>
962
+ <p class="text-sm mt-2 text-muted">Supports YAML, JSON, JavaScript, TypeScript, and more</p>
773
963
  </div>
774
964
  </div>
775
965
  <div id="editorContainer" class="hidden h-full">
776
966
  <div id="aceEditor" class="h-full w-full"></div>
777
967
  </div>
968
+ <div id="composerContainer" class="hidden h-full overflow-hidden"></div>
778
969
  </div>
779
970
  </div>
780
971
  </div>