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
@@ -1,6 +1,7 @@
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
7
  yaml: { icon: 'fa-file-code', color: 'text-orange-400' },
@@ -23,11 +24,53 @@ const ACE_MODES = {
23
24
  default: 'ace/mode/text',
24
25
  };
25
26
 
27
+ const RESOURCE_TYPES = {
28
+ agent: {
29
+ label: 'Agent',
30
+ icon: 'fa-robot',
31
+ color: 'text-blue-400',
32
+ folder: 'agents/',
33
+ suffix: '.agent.yaml',
34
+ },
35
+ function: {
36
+ label: 'Function',
37
+ icon: 'fa-bolt',
38
+ color: 'text-yellow-400',
39
+ folder: 'functions/',
40
+ suffix: '.function.js',
41
+ },
42
+ knowledge: {
43
+ label: 'Knowledge',
44
+ icon: 'fa-database',
45
+ color: 'text-purple-400',
46
+ folder: 'knowledge/',
47
+ suffix: '.knowledge.yaml',
48
+ },
49
+ skill: {
50
+ label: 'Skill',
51
+ icon: 'fa-wand-magic-sparkles',
52
+ color: 'text-green-400',
53
+ folder: 'skills/',
54
+ suffix: '/SKILL.md',
55
+ },
56
+ workflow: {
57
+ label: 'Workflow',
58
+ icon: 'fa-diagram-project',
59
+ color: 'text-orange-400',
60
+ folder: 'workflows/',
61
+ suffix: '.workflow.yaml',
62
+ },
63
+ };
64
+
26
65
  function getExtension(filename) {
27
66
  const parts = filename.split('.');
28
67
  return parts.length > 1 ? parts.pop().toLowerCase() : '';
29
68
  }
30
69
 
70
+ function isAgentFile(path) {
71
+ return path && path.endsWith('.agent.yaml');
72
+ }
73
+
31
74
  export class IdeView extends Component {
32
75
  constructor() {
33
76
  super();
@@ -36,28 +79,54 @@ export class IdeView extends Component {
36
79
  this.isDirty = false;
37
80
  this.treeData = [];
38
81
  this.expandedDirs = new Set();
82
+ this._renamingPath = null;
83
+ this._viewMode = 'source'; // 'source' | 'visual'
39
84
  this._handleKeyDown = this._handleKeyDown.bind(this);
85
+ this._handleDocClick = this._handleDocClick.bind(this);
40
86
  }
41
87
 
42
88
  disconnectedCallback() {
43
89
  document.removeEventListener('keydown', this._handleKeyDown);
90
+ document.removeEventListener('click', this._handleDocClick);
44
91
  if (this.editor) {
45
92
  this.editor.destroy();
46
93
  this.editor = null;
47
94
  }
95
+ this._viewMode = 'source';
48
96
  }
49
97
 
50
98
  async postRender() {
51
99
  document.addEventListener('keydown', this._handleKeyDown);
100
+ document.addEventListener('click', this._handleDocClick);
52
101
 
53
102
  const saveBtn = this.querySelector('#saveBtn');
54
103
  if (saveBtn) {
55
104
  saveBtn.addEventListener('click', () => this._saveFile());
56
105
  }
57
106
 
107
+ const newFileBtn = this.querySelector('#newFileBtn');
108
+ if (newFileBtn) {
109
+ newFileBtn.addEventListener('click', (e) => {
110
+ e.stopPropagation();
111
+ this._toggleDropdown();
112
+ });
113
+ }
114
+
115
+ this._attachModeToggle();
58
116
  await this._loadTree();
59
117
  }
60
118
 
119
+ _handleDocClick(e) {
120
+ const dropdown = this.querySelector('#newResourceDropdown');
121
+ if (dropdown && !dropdown.contains(e.target) && !e.target.closest('#newFileBtn')) {
122
+ dropdown.remove();
123
+ }
124
+ const contextMenu = document.querySelector('#contextMenu');
125
+ if (contextMenu && !contextMenu.contains(e.target)) {
126
+ contextMenu.remove();
127
+ }
128
+ }
129
+
61
130
  _handleKeyDown(e) {
62
131
  if ((e.ctrlKey || e.metaKey) && e.key === 's') {
63
132
  e.preventDefault();
@@ -78,8 +147,24 @@ export class IdeView extends Component {
78
147
  _renderTree() {
79
148
  const container = this.querySelector('#fileTree');
80
149
  if (!container) return;
150
+
81
151
  container.innerHTML = this._buildTreeHTML(this.treeData, 0);
152
+
82
153
  this._attachTreeListeners();
154
+ this._focusInlineInput();
155
+ }
156
+
157
+ _buildRenameInputHTML(node, depth) {
158
+ const ext = getExtension(node.name);
159
+ const iconInfo = FILE_ICONS[ext] || FILE_ICONS.default;
160
+ return `
161
+ <div class="tree-item tree-depth-${Math.min(depth, 5)} flex items-center gap-2 rounded text-sm text-gray-300">
162
+ <span class="w-3"></span>
163
+ <i class="fas ${iconInfo.icon} ${iconInfo.color} text-sm"></i>
164
+ <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
+ data-action="rename" data-path="${node.path}" value="${node.name}" />
166
+ </div>
167
+ `;
83
168
  }
84
169
 
85
170
  _buildTreeHTML(nodes, depth) {
@@ -87,40 +172,128 @@ export class IdeView extends Component {
87
172
  if (node.type === 'directory') {
88
173
  const isExpanded = this.expandedDirs.has(node.path);
89
174
  const chevron = isExpanded ? 'fa-chevron-down' : 'fa-chevron-right';
175
+
90
176
  const childrenHTML = isExpanded
91
177
  ? this._buildTreeHTML(node.children || [], depth + 1)
92
178
  : '';
93
179
 
180
+ // Only show menu button for subfolders (depth > 0)
181
+ const menuBtn = depth > 0 ? `
182
+ <button class="tree-menu-btn opacity-0 group-hover:opacity-100 px-1 text-gray-500 hover:text-white transition-opacity"
183
+ data-menu-path="${node.path}" data-menu-type="directory">
184
+ <i class="fas fa-ellipsis-v text-xs"></i>
185
+ </button>
186
+ ` : '';
187
+
94
188
  return `
95
- <div class="tree-item tree-depth-${Math.min(depth, 5)} flex items-center gap-2 cursor-pointer hover:bg-dark-hover rounded text-sm text-gray-300"
189
+ <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"
96
190
  data-path="${node.path}" data-type="directory">
97
191
  <i class="fas ${chevron} text-xs text-gray-500 w-3"></i>
98
192
  <i class="fas fa-folder${isExpanded ? '-open' : ''} text-yellow-500 text-sm"></i>
99
- <span>${node.name}</span>
193
+ <span class="flex-1 min-w-0">${node.name}</span>
194
+ ${menuBtn}
100
195
  </div>
101
196
  ${childrenHTML}
102
197
  `;
103
198
  }
104
199
 
200
+ // If this file is being renamed, show an inline input instead
201
+ if (this._renamingPath === node.path) {
202
+ return this._buildRenameInputHTML(node, depth);
203
+ }
204
+
105
205
  const ext = getExtension(node.name);
106
206
  const iconInfo = FILE_ICONS[ext] || FILE_ICONS.default;
107
207
  const isActive = this.currentFile && this.currentFile.path === node.path;
108
208
  const activeClass = isActive ? 'bg-dark-hover text-white' : '';
109
209
 
110
210
  return `
111
- <div class="tree-item 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 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}"
112
212
  data-path="${node.path}" data-type="file">
113
213
  <span class="w-3"></span>
114
214
  <i class="fas ${iconInfo.icon} ${iconInfo.color} text-sm"></i>
115
- <span class="truncate max-w-[160px]">${node.name}</span>
215
+ <span class="tree-filename truncate flex-1 min-w-0">${node.name}</span>
216
+ <button class="tree-menu-btn opacity-0 group-hover:opacity-100 px-1 text-gray-500 hover:text-white transition-opacity"
217
+ data-menu-path="${node.path}" data-menu-type="file">
218
+ <i class="fas fa-ellipsis-v text-xs"></i>
219
+ </button>
116
220
  </div>
117
221
  `;
118
222
  }).join('');
119
223
  }
120
224
 
225
+ _focusInlineInput() {
226
+ const input = this.querySelector('.inline-tree-input');
227
+ if (!input) return;
228
+
229
+ requestAnimationFrame(() => {
230
+ input.focus();
231
+ // Select the name portion (before extension) for rename inputs
232
+ if (input.dataset.action === 'rename') {
233
+ const val = input.value;
234
+ const dotIdx = val.lastIndexOf('.');
235
+ input.setSelectionRange(0, dotIdx > 0 ? dotIdx : val.length);
236
+ }
237
+ });
238
+
239
+ input.addEventListener('keydown', (e) => {
240
+ e.stopPropagation();
241
+ if (e.key === 'Enter') {
242
+ e.preventDefault();
243
+ this._commitInlineInput(input);
244
+ } else if (e.key === 'Escape') {
245
+ e.preventDefault();
246
+ this._cancelInlineInput();
247
+ }
248
+ });
249
+
250
+ input.addEventListener('blur', () => {
251
+ // Small delay to allow click-away to cancel rather than commit
252
+ setTimeout(() => {
253
+ if (this._renamingPath !== null) {
254
+ this._cancelInlineInput();
255
+ }
256
+ }, 150);
257
+ });
258
+ }
259
+
260
+ _cancelInlineInput() {
261
+ this._renamingPath = null;
262
+ this._renderTree();
263
+ }
264
+
265
+ async _commitInlineInput(input) {
266
+ const value = input.value.trim();
267
+ if (!value) {
268
+ this._cancelInlineInput();
269
+ return;
270
+ }
271
+
272
+ if (input.dataset.action === 'rename') {
273
+ const oldPath = input.dataset.path;
274
+ const oldName = oldPath.split('/').pop();
275
+ if (value === oldName) {
276
+ this._cancelInlineInput();
277
+ return;
278
+ }
279
+ const parentDir = oldPath.includes('/') ? oldPath.substring(0, oldPath.lastIndexOf('/')) : '';
280
+ const newPath = parentDir ? `${parentDir}/${value}` : value;
281
+ this._renamingPath = null;
282
+ await this._renameFile(oldPath, newPath);
283
+ }
284
+ }
285
+
121
286
  _attachTreeListeners() {
122
287
  this.querySelectorAll('.tree-item').forEach(item => {
123
- item.addEventListener('click', () => {
288
+ if (!item.dataset.path) return;
289
+
290
+ item.addEventListener('click', (e) => {
291
+ // Ignore clicks on the menu button
292
+ if (e.target.closest('.tree-menu-btn')) return;
293
+
294
+ // Close any open context menu
295
+ this._closeContextMenu();
296
+
124
297
  const filePath = item.dataset.path;
125
298
  const type = item.dataset.type;
126
299
 
@@ -131,6 +304,115 @@ export class IdeView extends Component {
131
304
  }
132
305
  });
133
306
  });
307
+
308
+ // Menu button clicks
309
+ this.querySelectorAll('.tree-menu-btn').forEach(btn => {
310
+ btn.addEventListener('click', (e) => {
311
+ e.stopPropagation();
312
+ const filePath = btn.dataset.menuPath;
313
+ const type = btn.dataset.menuType;
314
+ this._showContextMenu(e, filePath, type);
315
+ });
316
+ });
317
+ }
318
+
319
+ _closeContextMenu() {
320
+ const menu = document.querySelector('#contextMenu');
321
+ if (menu) menu.remove();
322
+ }
323
+
324
+ _showContextMenu(e, filePath, type) {
325
+ // Remove existing context menu
326
+ this._closeContextMenu();
327
+
328
+ const btn = e.currentTarget;
329
+ const btnRect = btn.getBoundingClientRect();
330
+
331
+ const menu = document.createElement('div');
332
+ menu.id = 'contextMenu';
333
+ menu.className = 'fixed z-50 bg-dark-surface border border-dark-border rounded shadow-lg py-1 min-w-[100px]';
334
+
335
+ const isFile = type === 'file';
336
+
337
+ menu.innerHTML = `
338
+ ${isFile ? `
339
+ <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">
340
+ <i class="fas fa-pen text-xs w-4 text-gray-500"></i>
341
+ <span>Rename</span>
342
+ </div>
343
+ ` : ''}
344
+ <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">
345
+ <i class="fas fa-trash text-xs w-4"></i>
346
+ <span>Delete</span>
347
+ </div>
348
+ `;
349
+
350
+ document.body.appendChild(menu);
351
+
352
+ // Position after render to get correct dimensions
353
+ requestAnimationFrame(() => {
354
+ const menuRect = menu.getBoundingClientRect();
355
+ let left = btnRect.right + 4;
356
+ let top = btnRect.top;
357
+
358
+ // Adjust if menu goes off-screen
359
+ if (left + menuRect.width > window.innerWidth) {
360
+ left = btnRect.left - menuRect.width - 4;
361
+ }
362
+ if (top + menuRect.height > window.innerHeight) {
363
+ top = window.innerHeight - menuRect.height - 8;
364
+ }
365
+
366
+ menu.style.left = `${left}px`;
367
+ menu.style.top = `${top}px`;
368
+ });
369
+
370
+ menu.querySelectorAll('.context-item').forEach(item => {
371
+ item.addEventListener('click', () => {
372
+ const action = item.dataset.action;
373
+ menu.remove();
374
+ if (action === 'rename') {
375
+ this._startRename(filePath);
376
+ } else if (action === 'delete') {
377
+ this._confirmDelete(filePath, type);
378
+ }
379
+ });
380
+ });
381
+ }
382
+
383
+ _confirmDelete(filePath, type) {
384
+ const name = filePath.split('/').pop();
385
+ const isDir = type === 'directory';
386
+ const msg = isDir
387
+ ? `Delete folder "${name}" and all its contents?`
388
+ : `Delete "${name}"?`;
389
+
390
+ if (!confirm(msg)) return;
391
+ this._deleteFile(filePath);
392
+ }
393
+
394
+ async _deleteFile(filePath) {
395
+ try {
396
+ const result = await api.deleteFile(filePath);
397
+ if (result.error) {
398
+ alert(result.error);
399
+ return;
400
+ }
401
+
402
+ // If the deleted file was open, clear the editor
403
+ if (this.currentFile && this.currentFile.path === filePath) {
404
+ this.currentFile = null;
405
+ this.isDirty = false;
406
+ this._viewMode = 'source';
407
+ this._renderEditor();
408
+ this._updateModeToggle();
409
+ }
410
+
411
+ await this._loadTree();
412
+ } catch (err) {
413
+ console.error('Failed to delete file:', err);
414
+ alert('Failed to delete file.');
415
+ }
134
416
  }
135
417
 
136
418
  _toggleDir(dirPath) {
@@ -142,6 +424,186 @@ export class IdeView extends Component {
142
424
  this._renderTree();
143
425
  }
144
426
 
427
+ _toggleDropdown() {
428
+ const existing = this.querySelector('#newResourceDropdown');
429
+ if (existing) {
430
+ existing.remove();
431
+ return;
432
+ }
433
+
434
+ const btn = this.querySelector('#newFileBtn');
435
+ if (!btn) return;
436
+
437
+ const items = Object.entries(RESOURCE_TYPES).map(([key, rt]) => `
438
+ <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"
439
+ data-resource="${key}">
440
+ <i class="fas ${rt.icon} ${rt.color} text-xs w-4 text-center"></i>
441
+ <span>${rt.label}</span>
442
+ </div>
443
+ `).join('');
444
+
445
+ const dropdown = document.createElement('div');
446
+ dropdown.id = 'newResourceDropdown';
447
+ 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]';
448
+ dropdown.innerHTML = items;
449
+
450
+ btn.parentElement.classList.add('relative');
451
+ btn.parentElement.appendChild(dropdown);
452
+
453
+ dropdown.querySelectorAll('.new-resource-item').forEach(item => {
454
+ item.addEventListener('click', (e) => {
455
+ e.stopPropagation();
456
+ const type = item.dataset.resource;
457
+ dropdown.remove();
458
+ this._selectResourceType(type);
459
+ });
460
+ });
461
+ }
462
+
463
+ _selectResourceType(type) {
464
+ this._showCreateModal(type);
465
+ }
466
+
467
+ _showCreateModal(type) {
468
+ // Remove existing modal if any
469
+ const existing = this.querySelector('#createResourceModal');
470
+ if (existing) existing.remove();
471
+
472
+ const rt = RESOURCE_TYPES[type];
473
+ const modal = document.createElement('div');
474
+ modal.id = 'createResourceModal';
475
+ modal.className = 'fixed inset-0 z-50 flex items-center justify-center';
476
+ modal.innerHTML = `
477
+ <div class="absolute inset-0 bg-black/50" data-action="cancel"></div>
478
+ <div class="relative bg-dark-surface border border-dark-border rounded-lg shadow-xl w-full max-w-md mx-4">
479
+ <div class="flex items-center gap-3 px-4 py-3 border-b border-dark-border">
480
+ <i class="fas ${rt.icon} ${rt.color}"></i>
481
+ <span class="text-white font-medium">New ${rt.label}</span>
482
+ </div>
483
+ <div class="p-4">
484
+ <label class="block text-sm text-gray-400 mb-2">Name</label>
485
+ <div class="flex items-center bg-dark-bg border border-dark-border rounded overflow-hidden">
486
+ <span class="px-3 py-2 text-gray-500 text-sm bg-dark-hover border-r border-dark-border">${rt.folder}</span>
487
+ <input type="text" id="resourceNameInput"
488
+ class="flex-1 px-3 py-2 bg-transparent text-white text-sm outline-none"
489
+ placeholder="my-${type}" autocomplete="off" />
490
+ <span class="px-3 py-2 text-gray-500 text-sm bg-dark-hover border-l border-dark-border">${rt.suffix}</span>
491
+ </div>
492
+ <p class="text-xs text-gray-500 mt-2">Use lowercase letters, numbers, and hyphens</p>
493
+ </div>
494
+ <div class="flex justify-end gap-2 px-4 py-3 border-t border-dark-border">
495
+ <button class="px-4 py-1.5 text-sm text-gray-400 hover:text-white transition-colors" data-action="cancel">
496
+ Cancel
497
+ </button>
498
+ <button class="px-4 py-1.5 text-sm bg-green-600 hover:bg-green-700 text-white rounded transition-colors" data-action="create">
499
+ Create
500
+ </button>
501
+ </div>
502
+ </div>
503
+ `;
504
+
505
+ this.appendChild(modal);
506
+
507
+ const input = modal.querySelector('#resourceNameInput');
508
+ const createBtn = modal.querySelector('[data-action="create"]');
509
+ const cancelBtns = modal.querySelectorAll('[data-action="cancel"]');
510
+
511
+ input.focus();
512
+
513
+ const close = () => modal.remove();
514
+
515
+ const create = async () => {
516
+ const name = input.value.trim();
517
+ if (!name) return;
518
+ close();
519
+ await this._createResourceFromTemplate(type, name);
520
+ };
521
+
522
+ input.addEventListener('keydown', (e) => {
523
+ if (e.key === 'Enter') {
524
+ e.preventDefault();
525
+ create();
526
+ } else if (e.key === 'Escape') {
527
+ e.preventDefault();
528
+ close();
529
+ }
530
+ });
531
+
532
+ createBtn.addEventListener('click', create);
533
+ cancelBtns.forEach(btn => btn.addEventListener('click', close));
534
+ }
535
+
536
+ _startRename(filePath) {
537
+ this._renamingPath = filePath;
538
+ this._renderTree();
539
+ }
540
+
541
+ async _createResourceFromTemplate(type, name) {
542
+ try {
543
+ const template = await api.getResourceTemplate(type, name);
544
+ if (template.error) {
545
+ alert(template.error);
546
+ return;
547
+ }
548
+
549
+ const result = await api.createFile(template.path, template.content);
550
+ if (result.error) {
551
+ alert(result.error);
552
+ return;
553
+ }
554
+
555
+ // Expand the parent directory of the new file
556
+ const parts = template.path.split('/');
557
+ if (parts.length > 1) {
558
+ parts.pop();
559
+ this.expandedDirs.add(parts.join('/'));
560
+ }
561
+
562
+ await this._loadTree();
563
+ await this._openFile(template.path);
564
+ } catch (err) {
565
+ console.error('Failed to create resource:', err);
566
+ alert('Failed to create resource.');
567
+ }
568
+ }
569
+
570
+ async _createFile(filePath, content = '') {
571
+ try {
572
+ const result = await api.createFile(filePath, content);
573
+ if (result.error) {
574
+ alert(result.error);
575
+ return;
576
+ }
577
+ await this._loadTree();
578
+ await this._openFile(filePath);
579
+ } catch (err) {
580
+ console.error('Failed to create file:', err);
581
+ alert('Failed to create file.');
582
+ }
583
+ }
584
+
585
+ async _renameFile(oldPath, newPath) {
586
+ try {
587
+ const result = await api.renameFile(oldPath, newPath);
588
+ if (result.error) {
589
+ alert(result.error);
590
+ this._renderTree();
591
+ return;
592
+ }
593
+
594
+ // If the renamed file was currently open, update the reference
595
+ if (this.currentFile && this.currentFile.path === oldPath) {
596
+ this.currentFile.path = newPath;
597
+ }
598
+
599
+ await this._loadTree();
600
+ } catch (err) {
601
+ console.error('Failed to rename file:', err);
602
+ alert('Failed to rename file.');
603
+ this._renderTree();
604
+ }
605
+ }
606
+
145
607
  async _openFile(filePath) {
146
608
  if (this.isDirty) {
147
609
  const confirmed = confirm('You have unsaved changes. Discard and open another file?');
@@ -152,8 +614,10 @@ export class IdeView extends Component {
152
614
  const data = await api.readFile(filePath);
153
615
  this.currentFile = { path: data.path, content: data.content };
154
616
  this.isDirty = false;
617
+ this._viewMode = 'source';
155
618
  this._renderEditor();
156
619
  this._renderTree();
620
+ this._updateModeToggle();
157
621
  } catch (err) {
158
622
  console.error('Failed to read file:', err);
159
623
  }
@@ -161,19 +625,18 @@ export class IdeView extends Component {
161
625
 
162
626
  _renderEditor() {
163
627
  const editorContainer = this.querySelector('#editorContainer');
628
+ const composerContainer = this.querySelector('#composerContainer');
164
629
  const welcomePanel = this.querySelector('#welcomePanel');
165
630
  const breadcrumb = this.querySelector('#breadcrumb');
166
- const saveBtn = this.querySelector('#saveBtn');
167
- const dirtyIndicator = this.querySelector('#dirtyIndicator');
168
631
 
169
632
  if (!this.currentFile) {
170
633
  if (welcomePanel) welcomePanel.classList.remove('hidden');
171
634
  if (editorContainer) editorContainer.classList.add('hidden');
635
+ if (composerContainer) composerContainer.classList.add('hidden');
172
636
  return;
173
637
  }
174
638
 
175
639
  if (welcomePanel) welcomePanel.classList.add('hidden');
176
- if (editorContainer) editorContainer.classList.remove('hidden');
177
640
 
178
641
  // Update breadcrumb
179
642
  if (breadcrumb) {
@@ -184,6 +647,16 @@ export class IdeView extends Component {
184
647
  // Update dirty state
185
648
  this._updateDirtyState();
186
649
 
650
+ if (this._viewMode === 'visual') {
651
+ if (editorContainer) editorContainer.classList.add('hidden');
652
+ if (composerContainer) composerContainer.classList.remove('hidden');
653
+ return;
654
+ }
655
+
656
+ // Source mode
657
+ if (composerContainer) composerContainer.classList.add('hidden');
658
+ if (editorContainer) editorContainer.classList.remove('hidden');
659
+
187
660
  // Initialize or update Ace
188
661
  const aceEl = this.querySelector('#aceEditor');
189
662
  if (!aceEl) return;
@@ -238,9 +711,18 @@ export class IdeView extends Component {
238
711
  }
239
712
 
240
713
  async _saveFile() {
241
- if (!this.currentFile || !this.isDirty || !this.editor) return;
242
-
243
- const content = this.editor.getValue();
714
+ if (!this.currentFile || !this.isDirty) return;
715
+
716
+ let content;
717
+ if (this._viewMode === 'visual') {
718
+ const composer = this.querySelector('agent-composer');
719
+ if (!composer) return;
720
+ const data = composer.getData();
721
+ content = jsyaml.dump(data, { indent: 2, lineWidth: -1, noRefs: true, sortKeys: false });
722
+ } else {
723
+ if (!this.editor) return;
724
+ content = this.editor.getValue();
725
+ }
244
726
 
245
727
  try {
246
728
  const result = await api.writeFile(this.currentFile.path, content);
@@ -274,6 +756,122 @@ export class IdeView extends Component {
274
756
  }
275
757
  }
276
758
 
759
+ // ── Mode Toggle ──
760
+
761
+ _attachModeToggle() {
762
+ this.querySelectorAll('.mode-toggle-btn').forEach(btn => {
763
+ btn.addEventListener('click', () => {
764
+ const mode = btn.dataset.mode;
765
+ if (mode === this._viewMode) return;
766
+ if (mode === 'visual') this._switchToVisual();
767
+ else this._switchToSource();
768
+ });
769
+ });
770
+ }
771
+
772
+ _updateModeToggle() {
773
+ const toggle = this.querySelector('#modeToggle');
774
+ if (!toggle) return;
775
+
776
+ const show = this.currentFile && isAgentFile(this.currentFile.path);
777
+ toggle.classList.toggle('hidden', !show);
778
+
779
+ toggle.querySelectorAll('.mode-toggle-btn').forEach(btn => {
780
+ const active = btn.dataset.mode === this._viewMode;
781
+ btn.classList.toggle('bg-dark-hover', active);
782
+ btn.classList.toggle('text-white', active);
783
+ btn.classList.toggle('text-gray-500', !active);
784
+ });
785
+ }
786
+
787
+ _switchToVisual() {
788
+ if (!this.currentFile) return;
789
+
790
+ // Get current Ace content and parse
791
+ const content = this.editor ? this.editor.getValue() : this.currentFile.content;
792
+ let parsed;
793
+ try {
794
+ parsed = jsyaml.load(content);
795
+ } catch (err) {
796
+ this._showToast(`Invalid YAML: ${err.message}`, 'error');
797
+ return;
798
+ }
799
+
800
+ if (!parsed || typeof parsed !== 'object') {
801
+ this._showToast('YAML must be an object', 'error');
802
+ return;
803
+ }
804
+
805
+ this._viewMode = 'visual';
806
+ this._updateModeToggle();
807
+
808
+ // Hide Ace, show composer
809
+ const editorContainer = this.querySelector('#editorContainer');
810
+ const composerContainer = this.querySelector('#composerContainer');
811
+ if (editorContainer) editorContainer.classList.add('hidden');
812
+ if (composerContainer) composerContainer.classList.remove('hidden');
813
+
814
+ // Create or get the composer element
815
+ let composer = composerContainer.querySelector('agent-composer');
816
+ if (!composer) {
817
+ composer = document.createElement('agent-composer');
818
+ composer.classList.add('block', 'h-full');
819
+ composerContainer.appendChild(composer);
820
+ }
821
+
822
+ composer.data = parsed;
823
+
824
+ // Listen for changes
825
+ composer.addEventListener('composer:change', () => {
826
+ if (!this.isDirty) {
827
+ this.isDirty = true;
828
+ this._updateDirtyState();
829
+ }
830
+ });
831
+ }
832
+
833
+ _switchToSource() {
834
+ if (!this.currentFile) return;
835
+
836
+ const composer = this.querySelector('agent-composer');
837
+ if (composer && this._viewMode === 'visual') {
838
+ const data = composer.getData();
839
+ const yaml = jsyaml.dump(data, { indent: 2, lineWidth: -1, noRefs: true, sortKeys: false });
840
+
841
+ // Update Ace content
842
+ if (this.editor) {
843
+ this.editor.setValue(yaml, -1);
844
+ }
845
+ this.currentFile.content = yaml;
846
+ }
847
+
848
+ this._viewMode = 'source';
849
+ this._updateModeToggle();
850
+
851
+ const editorContainer = this.querySelector('#editorContainer');
852
+ const composerContainer = this.querySelector('#composerContainer');
853
+ if (composerContainer) composerContainer.classList.add('hidden');
854
+ if (editorContainer) editorContainer.classList.remove('hidden');
855
+
856
+ if (this.editor) {
857
+ this.editor.resize();
858
+ this.editor.focus();
859
+ }
860
+ }
861
+
862
+ _showToast(message, type = 'info') {
863
+ const existing = document.querySelector('#ideToast');
864
+ if (existing) existing.remove();
865
+
866
+ const toast = document.createElement('div');
867
+ toast.id = 'ideToast';
868
+ const color = type === 'error' ? 'bg-red-600' : 'bg-blue-600';
869
+ toast.className = `fixed bottom-4 right-4 z-50 ${color} text-white text-sm px-4 py-2 rounded-lg shadow-lg`;
870
+ toast.textContent = message;
871
+ document.body.appendChild(toast);
872
+ setTimeout(() => toast.remove(), 4000);
873
+ }
874
+
277
875
  template() {
278
876
  return `
279
877
  <div class="flex flex-col h-full">
@@ -284,6 +882,15 @@ export class IdeView extends Component {
284
882
  <span id="breadcrumb">Select a file to edit</span>
285
883
  </div>
286
884
  <div class="flex items-center gap-3">
885
+ <!-- Mode toggle (only for .agent.yaml files) -->
886
+ <div id="modeToggle" class="hidden flex items-center bg-dark-bg rounded border border-dark-border overflow-hidden">
887
+ <button class="mode-toggle-btn px-2.5 py-1 text-xs transition-colors text-white bg-dark-hover" data-mode="source">
888
+ <i class="fas fa-code mr-1"></i>Source
889
+ </button>
890
+ <button class="mode-toggle-btn px-2.5 py-1 text-xs transition-colors text-gray-500" data-mode="visual">
891
+ <i class="fas fa-palette mr-1"></i>Visual
892
+ </button>
893
+ </div>
287
894
  <span id="dirtyIndicator" class="hidden text-yellow-400 text-xs flex items-center gap-1">
288
895
  <i class="fas fa-circle text-[6px]"></i> Unsaved
289
896
  </span>
@@ -298,8 +905,11 @@ export class IdeView extends Component {
298
905
  <div class="flex flex-1 min-h-0 border border-t-0 border-dark-border rounded-b-lg overflow-hidden">
299
906
  <!-- File tree sidebar -->
300
907
  <div class="w-60 flex-shrink-0 bg-dark-surface border-r border-dark-border overflow-y-auto">
301
- <div class="px-3 py-2 text-xs font-semibold text-gray-500 uppercase tracking-wider border-b border-dark-border">
302
- Explorer
908
+ <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">
909
+ <span>Explorer</span>
910
+ <button id="newFileBtn" class="text-gray-500 hover:text-green-400 transition-colors" title="New Resource">
911
+ <i class="fas fa-plus text-xs"></i>
912
+ </button>
303
913
  </div>
304
914
  <div id="fileTree" class="py-1">
305
915
  <div class="px-4 py-8 text-center text-gray-500 text-sm">
@@ -308,7 +918,7 @@ export class IdeView extends Component {
308
918
  </div>
309
919
  </div>
310
920
 
311
- <!-- Editor / Welcome -->
921
+ <!-- Editor / Composer / Welcome -->
312
922
  <div class="flex-1 min-w-0 relative">
313
923
  <div id="welcomePanel" class="flex items-center justify-center h-full text-gray-500">
314
924
  <div class="text-center">
@@ -320,6 +930,7 @@ export class IdeView extends Component {
320
930
  <div id="editorContainer" class="hidden h-full">
321
931
  <div id="aceEditor" class="h-full w-full"></div>
322
932
  </div>
933
+ <div id="composerContainer" class="hidden h-full overflow-hidden"></div>
323
934
  </div>
324
935
  </div>
325
936
  </div>