agent-orcha 0.0.4 → 0.0.5

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 (483) hide show
  1. package/README.md +197 -221
  2. package/dist/lib/agents/agent-executor.d.ts +13 -4
  3. package/dist/lib/agents/agent-executor.d.ts.map +1 -1
  4. package/dist/lib/agents/agent-executor.js +307 -73
  5. package/dist/lib/agents/agent-executor.js.map +1 -1
  6. package/dist/lib/agents/agent-loader.d.ts +1 -1
  7. package/dist/lib/agents/agent-loader.d.ts.map +1 -1
  8. package/dist/lib/agents/agent-loader.js +10 -3
  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 +155 -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 +132 -8
  21. package/dist/lib/agents/types.d.ts.map +1 -1
  22. package/dist/lib/agents/types.js +16 -2
  23. package/dist/lib/agents/types.js.map +1 -1
  24. package/dist/lib/functions/function-loader.d.ts +1 -1
  25. package/dist/lib/functions/function-loader.js +13 -5
  26. package/dist/lib/functions/function-loader.js.map +1 -1
  27. package/dist/lib/functions/index.d.ts +2 -2
  28. package/dist/lib/functions/index.js +1 -1
  29. package/dist/lib/functions/simple-function-wrapper.d.ts +2 -11
  30. package/dist/lib/functions/simple-function-wrapper.d.ts.map +1 -1
  31. package/dist/lib/functions/simple-function-wrapper.js +3 -3
  32. package/dist/lib/functions/simple-function-wrapper.js.map +1 -1
  33. package/dist/lib/index.d.ts +29 -17
  34. package/dist/lib/index.d.ts.map +1 -1
  35. package/dist/lib/index.js +21 -9
  36. package/dist/lib/index.js.map +1 -1
  37. package/dist/lib/integrations/collabnook.d.ts +56 -0
  38. package/dist/lib/integrations/collabnook.d.ts.map +1 -0
  39. package/dist/lib/integrations/collabnook.js +307 -0
  40. package/dist/lib/integrations/collabnook.js.map +1 -0
  41. package/dist/lib/integrations/integration-manager.d.ts +14 -0
  42. package/dist/lib/integrations/integration-manager.d.ts.map +1 -0
  43. package/dist/lib/integrations/integration-manager.js +109 -0
  44. package/dist/lib/integrations/integration-manager.js.map +1 -0
  45. package/dist/lib/integrations/types.d.ts +49 -0
  46. package/dist/lib/integrations/types.d.ts.map +1 -0
  47. package/dist/lib/integrations/types.js +14 -0
  48. package/dist/lib/integrations/types.js.map +1 -0
  49. package/dist/lib/knowledge/direct-mapper.d.ts +21 -0
  50. package/dist/lib/knowledge/direct-mapper.d.ts.map +1 -0
  51. package/dist/lib/knowledge/direct-mapper.js +134 -0
  52. package/dist/lib/knowledge/direct-mapper.js.map +1 -0
  53. package/dist/lib/knowledge/index.d.ts +9 -8
  54. package/dist/lib/knowledge/index.d.ts.map +1 -1
  55. package/dist/lib/knowledge/index.js +9 -7
  56. package/dist/lib/knowledge/index.js.map +1 -1
  57. package/dist/lib/knowledge/knowledge-store-metadata.d.ts +40 -0
  58. package/dist/lib/knowledge/knowledge-store-metadata.d.ts.map +1 -0
  59. package/dist/lib/knowledge/knowledge-store-metadata.js +93 -0
  60. package/dist/lib/knowledge/knowledge-store-metadata.js.map +1 -0
  61. package/dist/lib/knowledge/knowledge-store.d.ts +43 -0
  62. package/dist/lib/knowledge/knowledge-store.d.ts.map +1 -0
  63. package/dist/lib/knowledge/knowledge-store.js +603 -0
  64. package/dist/lib/knowledge/knowledge-store.js.map +1 -0
  65. package/dist/lib/knowledge/loaders/database-loader.d.ts +5 -5
  66. package/dist/lib/knowledge/loaders/database-loader.d.ts.map +1 -1
  67. package/dist/lib/knowledge/loaders/database-loader.js +21 -10
  68. package/dist/lib/knowledge/loaders/database-loader.js.map +1 -1
  69. package/dist/lib/knowledge/loaders/file-loaders.d.ts +39 -0
  70. package/dist/lib/knowledge/loaders/file-loaders.d.ts.map +1 -0
  71. package/dist/lib/knowledge/loaders/file-loaders.js +131 -0
  72. package/dist/lib/knowledge/loaders/file-loaders.js.map +1 -0
  73. package/dist/lib/knowledge/loaders/index.d.ts +3 -3
  74. package/dist/lib/knowledge/loaders/index.d.ts.map +1 -1
  75. package/dist/lib/knowledge/loaders/index.js +3 -3
  76. package/dist/lib/knowledge/loaders/index.js.map +1 -1
  77. package/dist/lib/knowledge/loaders/web-loader.d.ts +2 -2
  78. package/dist/lib/knowledge/loaders/web-loader.d.ts.map +1 -1
  79. package/dist/lib/knowledge/loaders/web-loader.js +22 -21
  80. package/dist/lib/knowledge/loaders/web-loader.js.map +1 -1
  81. package/dist/lib/knowledge/sqlite-store.d.ts +107 -0
  82. package/dist/lib/knowledge/sqlite-store.d.ts.map +1 -0
  83. package/dist/lib/knowledge/sqlite-store.js +327 -0
  84. package/dist/lib/knowledge/sqlite-store.js.map +1 -0
  85. package/dist/lib/knowledge/types.d.ts +72 -1432
  86. package/dist/lib/knowledge/types.d.ts.map +1 -1
  87. package/dist/lib/knowledge/types.js +36 -57
  88. package/dist/lib/knowledge/types.js.map +1 -1
  89. package/dist/lib/knowledge/utils/connection-pool.d.ts +3 -2
  90. package/dist/lib/knowledge/utils/connection-pool.d.ts.map +1 -1
  91. package/dist/lib/knowledge/utils/connection-pool.js +20 -10
  92. package/dist/lib/knowledge/utils/connection-pool.js.map +1 -1
  93. package/dist/lib/knowledge/utils/index.d.ts +2 -2
  94. package/dist/lib/knowledge/utils/index.js +2 -2
  95. package/dist/lib/llm/index.d.ts +5 -5
  96. package/dist/lib/llm/index.d.ts.map +1 -1
  97. package/dist/lib/llm/index.js +3 -3
  98. package/dist/lib/llm/index.js.map +1 -1
  99. package/dist/lib/llm/llm-call-logger.d.ts +37 -0
  100. package/dist/lib/llm/llm-call-logger.d.ts.map +1 -0
  101. package/dist/lib/llm/llm-call-logger.js +105 -0
  102. package/dist/lib/llm/llm-call-logger.js.map +1 -0
  103. package/dist/lib/llm/llm-config.d.ts +22 -16
  104. package/dist/lib/llm/llm-config.d.ts.map +1 -1
  105. package/dist/lib/llm/llm-config.js +19 -3
  106. package/dist/lib/llm/llm-config.js.map +1 -1
  107. package/dist/lib/llm/llm-factory.d.ts +3 -16
  108. package/dist/lib/llm/llm-factory.d.ts.map +1 -1
  109. package/dist/lib/llm/llm-factory.js +30 -48
  110. package/dist/lib/llm/llm-factory.js.map +1 -1
  111. package/dist/lib/llm/provider-detector.d.ts +1 -1
  112. package/dist/lib/llm/providers/anthropic-chat-model.d.ts +27 -0
  113. package/dist/lib/llm/providers/anthropic-chat-model.d.ts.map +1 -0
  114. package/dist/lib/llm/providers/anthropic-chat-model.js +186 -0
  115. package/dist/lib/llm/providers/anthropic-chat-model.js.map +1 -0
  116. package/dist/lib/llm/providers/gemini-chat-model.d.ts +29 -0
  117. package/dist/lib/llm/providers/gemini-chat-model.d.ts.map +1 -0
  118. package/dist/lib/llm/providers/gemini-chat-model.js +241 -0
  119. package/dist/lib/llm/providers/gemini-chat-model.js.map +1 -0
  120. package/dist/lib/llm/providers/gemini-embeddings.d.ts +14 -0
  121. package/dist/lib/llm/providers/gemini-embeddings.d.ts.map +1 -0
  122. package/dist/lib/llm/providers/gemini-embeddings.js +20 -0
  123. package/dist/lib/llm/providers/gemini-embeddings.js.map +1 -0
  124. package/dist/lib/llm/providers/openai-chat-model.d.ts +30 -0
  125. package/dist/lib/llm/providers/openai-chat-model.d.ts.map +1 -0
  126. package/dist/lib/llm/providers/openai-chat-model.js +196 -0
  127. package/dist/lib/llm/providers/openai-chat-model.js.map +1 -0
  128. package/dist/lib/llm/providers/openai-embeddings.d.ts +17 -0
  129. package/dist/lib/llm/providers/openai-embeddings.d.ts.map +1 -0
  130. package/dist/lib/llm/providers/openai-embeddings.js +35 -0
  131. package/dist/lib/llm/providers/openai-embeddings.js.map +1 -0
  132. package/dist/lib/llm/types.d.ts +2 -2
  133. package/dist/lib/llm/types.js +1 -1
  134. package/dist/lib/logger.d.ts +7 -0
  135. package/dist/lib/logger.d.ts.map +1 -1
  136. package/dist/lib/logger.js +43 -4
  137. package/dist/lib/logger.js.map +1 -1
  138. package/dist/lib/mcp/index.d.ts +3 -3
  139. package/dist/lib/mcp/index.js +2 -2
  140. package/dist/lib/mcp/mcp-client.d.ts +3 -2
  141. package/dist/lib/mcp/mcp-client.d.ts.map +1 -1
  142. package/dist/lib/mcp/mcp-client.js +5 -2
  143. package/dist/lib/mcp/mcp-client.js.map +1 -1
  144. package/dist/lib/mcp/types.d.ts +33 -23
  145. package/dist/lib/mcp/types.d.ts.map +1 -1
  146. package/dist/lib/mcp/types.js +11 -2
  147. package/dist/lib/mcp/types.js.map +1 -1
  148. package/dist/lib/memory/conversation-store.d.ts +2 -2
  149. package/dist/lib/memory/conversation-store.d.ts.map +1 -1
  150. package/dist/lib/memory/conversation-store.js +1 -1
  151. package/dist/lib/memory/index.d.ts +3 -2
  152. package/dist/lib/memory/index.d.ts.map +1 -1
  153. package/dist/lib/memory/index.js +3 -2
  154. package/dist/lib/memory/index.js.map +1 -1
  155. package/dist/lib/memory/memory-manager.d.ts +9 -0
  156. package/dist/lib/memory/memory-manager.d.ts.map +1 -0
  157. package/dist/lib/memory/memory-manager.js +34 -0
  158. package/dist/lib/memory/memory-manager.js.map +1 -0
  159. package/dist/lib/memory/types.d.ts +1 -1
  160. package/dist/lib/memory/types.d.ts.map +1 -1
  161. package/dist/lib/orchestrator.d.ts +78 -18
  162. package/dist/lib/orchestrator.d.ts.map +1 -1
  163. package/dist/lib/orchestrator.js +247 -55
  164. package/dist/lib/orchestrator.js.map +1 -1
  165. package/dist/lib/sandbox/html-to-markdown.d.ts +2 -0
  166. package/dist/lib/sandbox/html-to-markdown.d.ts.map +1 -0
  167. package/dist/lib/sandbox/html-to-markdown.js +64 -0
  168. package/dist/lib/sandbox/html-to-markdown.js.map +1 -0
  169. package/dist/lib/sandbox/index.d.ts +7 -0
  170. package/dist/lib/sandbox/index.d.ts.map +1 -0
  171. package/dist/lib/sandbox/index.js +6 -0
  172. package/dist/lib/sandbox/index.js.map +1 -0
  173. package/dist/lib/sandbox/sandbox-exec.d.ts +5 -0
  174. package/dist/lib/sandbox/sandbox-exec.d.ts.map +1 -0
  175. package/dist/lib/sandbox/sandbox-exec.js +35 -0
  176. package/dist/lib/sandbox/sandbox-exec.js.map +1 -0
  177. package/dist/lib/sandbox/sandbox-web.d.ts +5 -0
  178. package/dist/lib/sandbox/sandbox-web.d.ts.map +1 -0
  179. package/dist/lib/sandbox/sandbox-web.js +211 -0
  180. package/dist/lib/sandbox/sandbox-web.js.map +1 -0
  181. package/dist/lib/sandbox/types.d.ts +21 -0
  182. package/dist/lib/sandbox/types.d.ts.map +1 -0
  183. package/dist/lib/sandbox/types.js +7 -0
  184. package/dist/lib/sandbox/types.js.map +1 -0
  185. package/dist/lib/sandbox/vm-executor.d.ts +12 -0
  186. package/dist/lib/sandbox/vm-executor.d.ts.map +1 -0
  187. package/dist/lib/sandbox/vm-executor.js +101 -0
  188. package/dist/lib/sandbox/vm-executor.js.map +1 -0
  189. package/dist/lib/skills/index.d.ts +4 -0
  190. package/dist/lib/skills/index.d.ts.map +1 -0
  191. package/dist/lib/skills/index.js +3 -0
  192. package/dist/lib/skills/index.js.map +1 -0
  193. package/dist/lib/skills/skill-loader.d.ts +19 -0
  194. package/dist/lib/skills/skill-loader.d.ts.map +1 -0
  195. package/dist/lib/skills/skill-loader.js +105 -0
  196. package/dist/lib/skills/skill-loader.js.map +1 -0
  197. package/dist/lib/skills/types.d.ts +17 -0
  198. package/dist/lib/skills/types.d.ts.map +1 -0
  199. package/dist/lib/skills/types.js +6 -0
  200. package/dist/lib/skills/types.js.map +1 -0
  201. package/dist/lib/tasks/index.d.ts +4 -0
  202. package/dist/lib/tasks/index.d.ts.map +1 -0
  203. package/dist/lib/tasks/index.js +4 -0
  204. package/dist/lib/tasks/index.js.map +1 -0
  205. package/dist/lib/tasks/task-manager.d.ts +25 -0
  206. package/dist/lib/tasks/task-manager.d.ts.map +1 -0
  207. package/dist/lib/tasks/task-manager.js +189 -0
  208. package/dist/lib/tasks/task-manager.js.map +1 -0
  209. package/dist/lib/tasks/task-store.d.ts +20 -0
  210. package/dist/lib/tasks/task-store.d.ts.map +1 -0
  211. package/dist/lib/tasks/task-store.js +102 -0
  212. package/dist/lib/tasks/task-store.js.map +1 -0
  213. package/dist/lib/tasks/types.d.ts +38 -0
  214. package/dist/lib/tasks/types.d.ts.map +1 -0
  215. package/dist/lib/tasks/types.js +2 -0
  216. package/dist/lib/tasks/types.js.map +1 -0
  217. package/dist/lib/templates/resource-templates.d.ts +6 -0
  218. package/dist/lib/templates/resource-templates.d.ts.map +1 -0
  219. package/dist/lib/templates/resource-templates.js +146 -0
  220. package/dist/lib/templates/resource-templates.js.map +1 -0
  221. package/dist/lib/tools/agent-tool-wrapper.d.ts +5 -5
  222. package/dist/lib/tools/agent-tool-wrapper.js +3 -3
  223. package/dist/lib/tools/agent-tool-wrapper.js.map +1 -1
  224. package/dist/lib/tools/built-in/ask-user.tool.d.ts +1 -1
  225. package/dist/lib/tools/built-in/ask-user.tool.d.ts.map +1 -1
  226. package/dist/lib/tools/built-in/ask-user.tool.js +2 -2
  227. package/dist/lib/tools/built-in/ask-user.tool.js.map +1 -1
  228. package/dist/lib/tools/built-in/index.d.ts +9 -2
  229. package/dist/lib/tools/built-in/index.d.ts.map +1 -1
  230. package/dist/lib/tools/built-in/index.js +9 -2
  231. package/dist/lib/tools/built-in/index.js.map +1 -1
  232. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts +9 -0
  233. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts.map +1 -0
  234. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js +102 -0
  235. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js.map +1 -0
  236. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.d.ts +9 -0
  237. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.d.ts.map +1 -0
  238. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js +96 -0
  239. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js.map +1 -0
  240. package/dist/lib/tools/built-in/knowledge-search.tool.d.ts +2 -2
  241. package/dist/lib/tools/built-in/knowledge-search.tool.d.ts.map +1 -1
  242. package/dist/lib/tools/built-in/knowledge-search.tool.js +1 -1
  243. package/dist/lib/tools/built-in/knowledge-search.tool.js.map +1 -1
  244. package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts +7 -0
  245. package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts.map +1 -0
  246. package/dist/lib/tools/built-in/knowledge-sql.tool.js +127 -0
  247. package/dist/lib/tools/built-in/knowledge-sql.tool.js.map +1 -0
  248. package/dist/lib/tools/built-in/knowledge-tools-factory.d.ts +17 -0
  249. package/dist/lib/tools/built-in/knowledge-tools-factory.d.ts.map +1 -0
  250. package/dist/lib/tools/built-in/knowledge-tools-factory.js +54 -0
  251. package/dist/lib/tools/built-in/knowledge-tools-factory.js.map +1 -0
  252. package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts +9 -0
  253. package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts.map +1 -0
  254. package/dist/lib/tools/built-in/knowledge-traverse.tool.js +91 -0
  255. package/dist/lib/tools/built-in/knowledge-traverse.tool.js.map +1 -0
  256. package/dist/lib/tools/built-in/memory-save.tool.d.ts +4 -0
  257. package/dist/lib/tools/built-in/memory-save.tool.d.ts.map +1 -0
  258. package/dist/lib/tools/built-in/memory-save.tool.js +21 -0
  259. package/dist/lib/tools/built-in/memory-save.tool.js.map +1 -0
  260. package/dist/lib/tools/built-in/query-validators.d.ts +18 -0
  261. package/dist/lib/tools/built-in/query-validators.d.ts.map +1 -0
  262. package/dist/lib/tools/built-in/query-validators.js +87 -0
  263. package/dist/lib/tools/built-in/query-validators.js.map +1 -0
  264. package/dist/lib/tools/index.d.ts +4 -4
  265. package/dist/lib/tools/index.js +4 -4
  266. package/dist/lib/tools/tool-discovery.d.ts +11 -33
  267. package/dist/lib/tools/tool-discovery.d.ts.map +1 -1
  268. package/dist/lib/tools/tool-discovery.js +16 -43
  269. package/dist/lib/tools/tool-discovery.js.map +1 -1
  270. package/dist/lib/tools/tool-registry.d.ts +10 -18
  271. package/dist/lib/tools/tool-registry.d.ts.map +1 -1
  272. package/dist/lib/tools/tool-registry.js +37 -23
  273. package/dist/lib/tools/tool-registry.js.map +1 -1
  274. package/dist/lib/tools/workspace/workspace-tools.d.ts +60 -0
  275. package/dist/lib/tools/workspace/workspace-tools.d.ts.map +1 -0
  276. package/dist/lib/tools/workspace/workspace-tools.js +140 -0
  277. package/dist/lib/tools/workspace/workspace-tools.js.map +1 -0
  278. package/dist/lib/triggers/cron-trigger.d.ts +12 -0
  279. package/dist/lib/triggers/cron-trigger.d.ts.map +1 -0
  280. package/dist/lib/triggers/cron-trigger.js +45 -0
  281. package/dist/lib/triggers/cron-trigger.js.map +1 -0
  282. package/dist/lib/triggers/index.d.ts +6 -0
  283. package/dist/lib/triggers/index.d.ts.map +1 -0
  284. package/dist/lib/triggers/index.js +5 -0
  285. package/dist/lib/triggers/index.js.map +1 -0
  286. package/dist/lib/triggers/trigger-manager.d.ts +11 -0
  287. package/dist/lib/triggers/trigger-manager.d.ts.map +1 -0
  288. package/dist/lib/triggers/trigger-manager.js +51 -0
  289. package/dist/lib/triggers/trigger-manager.js.map +1 -0
  290. package/dist/lib/triggers/types.d.ts +57 -0
  291. package/dist/lib/triggers/types.d.ts.map +1 -0
  292. package/dist/lib/triggers/types.js +16 -0
  293. package/dist/lib/triggers/types.js.map +1 -0
  294. package/dist/lib/triggers/webhook-trigger.d.ts +12 -0
  295. package/dist/lib/triggers/webhook-trigger.d.ts.map +1 -0
  296. package/dist/lib/triggers/webhook-trigger.js +34 -0
  297. package/dist/lib/triggers/webhook-trigger.js.map +1 -0
  298. package/dist/lib/types/llm-types.d.ts +54 -0
  299. package/dist/lib/types/llm-types.d.ts.map +1 -0
  300. package/dist/lib/types/llm-types.js +22 -0
  301. package/dist/lib/types/llm-types.js.map +1 -0
  302. package/dist/lib/types/text-splitters.d.ts +27 -0
  303. package/dist/lib/types/text-splitters.d.ts.map +1 -0
  304. package/dist/lib/types/text-splitters.js +114 -0
  305. package/dist/lib/types/text-splitters.js.map +1 -0
  306. package/dist/lib/types/tool-factory.d.ts +9 -0
  307. package/dist/lib/types/tool-factory.d.ts.map +1 -0
  308. package/dist/lib/types/tool-factory.js +12 -0
  309. package/dist/lib/types/tool-factory.js.map +1 -0
  310. package/dist/lib/utils/file-utils.d.ts +11 -0
  311. package/dist/lib/utils/file-utils.d.ts.map +1 -0
  312. package/dist/lib/utils/file-utils.js +86 -0
  313. package/dist/lib/utils/file-utils.js.map +1 -0
  314. package/dist/lib/workflows/index.d.ts +6 -6
  315. package/dist/lib/workflows/index.d.ts.map +1 -1
  316. package/dist/lib/workflows/index.js +5 -5
  317. package/dist/lib/workflows/index.js.map +1 -1
  318. package/dist/lib/workflows/interrupt-manager.d.ts +1 -1
  319. package/dist/lib/workflows/interrupt-manager.js +1 -1
  320. package/dist/lib/workflows/react-workflow-executor.d.ts +26 -0
  321. package/dist/lib/workflows/react-workflow-executor.d.ts.map +1 -0
  322. package/dist/lib/workflows/react-workflow-executor.js +333 -0
  323. package/dist/lib/workflows/react-workflow-executor.js.map +1 -0
  324. package/dist/lib/workflows/types.d.ts +96 -97
  325. package/dist/lib/workflows/types.d.ts.map +1 -1
  326. package/dist/lib/workflows/types.js +5 -5
  327. package/dist/lib/workflows/types.js.map +1 -1
  328. package/dist/lib/workflows/workflow-executor.d.ts +3 -3
  329. package/dist/lib/workflows/workflow-executor.js +2 -2
  330. package/dist/lib/workflows/workflow-executor.js.map +1 -1
  331. package/dist/lib/workflows/workflow-loader.d.ts +1 -1
  332. package/dist/lib/workflows/workflow-loader.d.ts.map +1 -1
  333. package/dist/lib/workflows/workflow-loader.js +10 -3
  334. package/dist/lib/workflows/workflow-loader.js.map +1 -1
  335. package/dist/public/index.html +32 -0
  336. package/dist/public/src/components/AgentsView.js +298 -44
  337. package/dist/public/src/components/AppRoot.js +124 -4
  338. package/dist/public/src/components/GraphView.js +336 -0
  339. package/dist/public/src/components/IdeView.js +462 -7
  340. package/dist/public/src/components/KnowledgeView.js +443 -66
  341. package/dist/public/src/components/MonitorView.js +388 -0
  342. package/dist/public/src/components/NavBar.js +3 -0
  343. package/dist/public/src/components/SkillsView.js +137 -0
  344. package/dist/public/src/components/WorkflowsView.js +287 -114
  345. package/dist/public/src/services/ApiService.js +165 -25
  346. package/dist/public/src/store.js +3 -2
  347. package/dist/public/src/utils/markdown.js +1 -0
  348. package/dist/src/cli/commands/init.js +2 -2
  349. package/dist/src/cli/commands/init.js.map +1 -1
  350. package/dist/src/cli/commands/start.d.ts +0 -1
  351. package/dist/src/cli/commands/start.d.ts.map +1 -1
  352. package/dist/src/cli/commands/start.js +23 -14
  353. package/dist/src/cli/commands/start.js.map +1 -1
  354. package/dist/src/cli/index.js +3 -3
  355. package/dist/src/index.d.ts +1 -1
  356. package/dist/src/index.d.ts.map +1 -1
  357. package/dist/src/index.js +23 -9
  358. package/dist/src/index.js.map +1 -1
  359. package/dist/src/middleware/auth.d.ts +3 -0
  360. package/dist/src/middleware/auth.d.ts.map +1 -0
  361. package/dist/src/middleware/auth.js +107 -0
  362. package/dist/src/middleware/auth.js.map +1 -0
  363. package/dist/src/routes/agents.route.d.ts.map +1 -1
  364. package/dist/src/routes/agents.route.js +31 -2
  365. package/dist/src/routes/agents.route.js.map +1 -1
  366. package/dist/src/routes/files.route.d.ts.map +1 -1
  367. package/dist/src/routes/files.route.js +128 -87
  368. package/dist/src/routes/files.route.js.map +1 -1
  369. package/dist/src/routes/functions.route.js +1 -1
  370. package/dist/src/routes/graph.route.d.ts +3 -0
  371. package/dist/src/routes/graph.route.d.ts.map +1 -0
  372. package/dist/src/routes/graph.route.js +173 -0
  373. package/dist/src/routes/graph.route.js.map +1 -0
  374. package/dist/src/routes/knowledge.route.d.ts.map +1 -1
  375. package/dist/src/routes/knowledge.route.js +172 -69
  376. package/dist/src/routes/knowledge.route.js.map +1 -1
  377. package/dist/src/routes/llm.route.d.ts.map +1 -1
  378. package/dist/src/routes/llm.route.js +48 -7
  379. package/dist/src/routes/llm.route.js.map +1 -1
  380. package/dist/src/routes/mcp.route.js +1 -1
  381. package/dist/src/routes/skills.route.d.ts +3 -0
  382. package/dist/src/routes/skills.route.d.ts.map +1 -0
  383. package/dist/src/routes/skills.route.js +23 -0
  384. package/dist/src/routes/skills.route.js.map +1 -0
  385. package/dist/src/routes/tasks.route.d.ts +3 -0
  386. package/dist/src/routes/tasks.route.d.ts.map +1 -0
  387. package/dist/src/routes/tasks.route.js +135 -0
  388. package/dist/src/routes/tasks.route.js.map +1 -0
  389. package/dist/src/routes/workflows.route.d.ts.map +1 -1
  390. package/dist/src/routes/workflows.route.js +9 -1
  391. package/dist/src/routes/workflows.route.js.map +1 -1
  392. package/dist/src/server.d.ts +1 -1
  393. package/dist/src/server.d.ts.map +1 -1
  394. package/dist/src/server.js +21 -8
  395. package/dist/src/server.js.map +1 -1
  396. package/dist/templates/.env.example +4 -19
  397. package/dist/templates/README.md +18 -10
  398. package/dist/templates/agents/architect.agent.yaml +49 -0
  399. package/dist/templates/agents/chatbot.agent.yaml +58 -0
  400. package/dist/templates/agents/knowledge-broker.agent.yaml +39 -0
  401. package/dist/templates/agents/sandbox.agent.yaml +56 -0
  402. package/dist/templates/knowledge/example.knowledge.yaml +0 -3
  403. package/dist/templates/knowledge/org-chart/personnel.csv +21 -0
  404. package/dist/templates/knowledge/org-chart.knowledge.yaml +49 -0
  405. package/dist/templates/knowledge/pet-store/pet-store.db +0 -0
  406. package/dist/templates/knowledge/pet-store.knowledge.yaml +78 -0
  407. package/dist/templates/knowledge/web-docs.knowledge.yaml +20 -0
  408. package/dist/templates/llm.json +2 -2
  409. package/dist/templates/mcp.json +3 -0
  410. package/dist/templates/skills/orcha-builder/SKILL.md +339 -0
  411. package/dist/templates/skills/sandbox/SKILL.md +63 -0
  412. package/dist/templates/workflows/example.workflow.yaml +25 -30
  413. package/dist/templates/workflows/react-example.workflow.yaml +53 -0
  414. package/package.json +17 -20
  415. package/dist/lib/knowledge/graph-rag/community-detector.d.ts +0 -16
  416. package/dist/lib/knowledge/graph-rag/community-detector.d.ts.map +0 -1
  417. package/dist/lib/knowledge/graph-rag/community-detector.js +0 -81
  418. package/dist/lib/knowledge/graph-rag/community-detector.js.map +0 -1
  419. package/dist/lib/knowledge/graph-rag/community-summarizer.d.ts +0 -17
  420. package/dist/lib/knowledge/graph-rag/community-summarizer.d.ts.map +0 -1
  421. package/dist/lib/knowledge/graph-rag/community-summarizer.js +0 -87
  422. package/dist/lib/knowledge/graph-rag/community-summarizer.js.map +0 -1
  423. package/dist/lib/knowledge/graph-rag/entity-extractor.d.ts +0 -36
  424. package/dist/lib/knowledge/graph-rag/entity-extractor.d.ts.map +0 -1
  425. package/dist/lib/knowledge/graph-rag/entity-extractor.js +0 -192
  426. package/dist/lib/knowledge/graph-rag/entity-extractor.js.map +0 -1
  427. package/dist/lib/knowledge/graph-rag/extraction-cache.d.ts +0 -30
  428. package/dist/lib/knowledge/graph-rag/extraction-cache.d.ts.map +0 -1
  429. package/dist/lib/knowledge/graph-rag/extraction-cache.js +0 -88
  430. package/dist/lib/knowledge/graph-rag/extraction-cache.js.map +0 -1
  431. package/dist/lib/knowledge/graph-rag/global-search.d.ts +0 -19
  432. package/dist/lib/knowledge/graph-rag/global-search.d.ts.map +0 -1
  433. package/dist/lib/knowledge/graph-rag/global-search.js +0 -96
  434. package/dist/lib/knowledge/graph-rag/global-search.js.map +0 -1
  435. package/dist/lib/knowledge/graph-rag/graph-rag-factory.d.ts +0 -24
  436. package/dist/lib/knowledge/graph-rag/graph-rag-factory.d.ts.map +0 -1
  437. package/dist/lib/knowledge/graph-rag/graph-rag-factory.js +0 -239
  438. package/dist/lib/knowledge/graph-rag/graph-rag-factory.js.map +0 -1
  439. package/dist/lib/knowledge/graph-rag/index.d.ts +0 -14
  440. package/dist/lib/knowledge/graph-rag/index.d.ts.map +0 -1
  441. package/dist/lib/knowledge/graph-rag/index.js +0 -12
  442. package/dist/lib/knowledge/graph-rag/index.js.map +0 -1
  443. package/dist/lib/knowledge/graph-rag/local-search.d.ts +0 -20
  444. package/dist/lib/knowledge/graph-rag/local-search.d.ts.map +0 -1
  445. package/dist/lib/knowledge/graph-rag/local-search.js +0 -110
  446. package/dist/lib/knowledge/graph-rag/local-search.js.map +0 -1
  447. package/dist/lib/knowledge/graph-rag/memory-graph-store.d.ts +0 -31
  448. package/dist/lib/knowledge/graph-rag/memory-graph-store.d.ts.map +0 -1
  449. package/dist/lib/knowledge/graph-rag/memory-graph-store.js +0 -165
  450. package/dist/lib/knowledge/graph-rag/memory-graph-store.js.map +0 -1
  451. package/dist/lib/knowledge/graph-rag/neo4j-graph-store.d.ts +0 -38
  452. package/dist/lib/knowledge/graph-rag/neo4j-graph-store.d.ts.map +0 -1
  453. package/dist/lib/knowledge/graph-rag/neo4j-graph-store.js +0 -190
  454. package/dist/lib/knowledge/graph-rag/neo4j-graph-store.js.map +0 -1
  455. package/dist/lib/knowledge/graph-rag/search-mode-detector.d.ts +0 -11
  456. package/dist/lib/knowledge/graph-rag/search-mode-detector.d.ts.map +0 -1
  457. package/dist/lib/knowledge/graph-rag/search-mode-detector.js +0 -50
  458. package/dist/lib/knowledge/graph-rag/search-mode-detector.js.map +0 -1
  459. package/dist/lib/knowledge/graph-rag/types.d.ts +0 -368
  460. package/dist/lib/knowledge/graph-rag/types.d.ts.map +0 -1
  461. package/dist/lib/knowledge/graph-rag/types.js +0 -48
  462. package/dist/lib/knowledge/graph-rag/types.js.map +0 -1
  463. package/dist/lib/knowledge/knowledge-store-factory.d.ts +0 -16
  464. package/dist/lib/knowledge/knowledge-store-factory.d.ts.map +0 -1
  465. package/dist/lib/knowledge/knowledge-store-factory.js +0 -376
  466. package/dist/lib/knowledge/knowledge-store-factory.js.map +0 -1
  467. package/dist/lib/knowledge/knowledge-store-manager.d.ts +0 -18
  468. package/dist/lib/knowledge/knowledge-store-manager.d.ts.map +0 -1
  469. package/dist/lib/knowledge/knowledge-store-manager.js +0 -98
  470. package/dist/lib/knowledge/knowledge-store-manager.js.map +0 -1
  471. package/dist/lib/knowledge/loaders/s3-loader.d.ts +0 -17
  472. package/dist/lib/knowledge/loaders/s3-loader.d.ts.map +0 -1
  473. package/dist/lib/knowledge/loaders/s3-loader.js +0 -185
  474. package/dist/lib/knowledge/loaders/s3-loader.js.map +0 -1
  475. package/dist/lib/workflows/langgraph-executor.d.ts +0 -51
  476. package/dist/lib/workflows/langgraph-executor.d.ts.map +0 -1
  477. package/dist/lib/workflows/langgraph-executor.js +0 -297
  478. package/dist/lib/workflows/langgraph-executor.js.map +0 -1
  479. package/dist/templates/agents/call-center-analyst-simple.agent.yaml +0 -36
  480. package/dist/templates/agents/math.agent.yaml +0 -28
  481. package/dist/templates/agents/sentiment-structured.agent.yaml +0 -42
  482. package/dist/templates/llm.md +0 -1195
  483. package/dist/templates/workflows/langgraph-example.workflow.yaml +0 -84
@@ -23,6 +23,44 @@ const ACE_MODES = {
23
23
  default: 'ace/mode/text',
24
24
  };
25
25
 
26
+ const RESOURCE_TYPES = {
27
+ agent: {
28
+ label: 'Agent',
29
+ icon: 'fa-robot',
30
+ color: 'text-blue-400',
31
+ folder: 'agents/',
32
+ suffix: '.agent.yaml',
33
+ },
34
+ function: {
35
+ label: 'Function',
36
+ icon: 'fa-bolt',
37
+ color: 'text-yellow-400',
38
+ folder: 'functions/',
39
+ suffix: '.function.js',
40
+ },
41
+ knowledge: {
42
+ label: 'Knowledge',
43
+ icon: 'fa-database',
44
+ color: 'text-purple-400',
45
+ folder: 'knowledge/',
46
+ suffix: '.knowledge.yaml',
47
+ },
48
+ skill: {
49
+ label: 'Skill',
50
+ icon: 'fa-wand-magic-sparkles',
51
+ color: 'text-green-400',
52
+ folder: 'skills/',
53
+ suffix: '/SKILL.md',
54
+ },
55
+ workflow: {
56
+ label: 'Workflow',
57
+ icon: 'fa-diagram-project',
58
+ color: 'text-orange-400',
59
+ folder: 'workflows/',
60
+ suffix: '.workflow.yaml',
61
+ },
62
+ };
63
+
26
64
  function getExtension(filename) {
27
65
  const parts = filename.split('.');
28
66
  return parts.length > 1 ? parts.pop().toLowerCase() : '';
@@ -36,11 +74,14 @@ export class IdeView extends Component {
36
74
  this.isDirty = false;
37
75
  this.treeData = [];
38
76
  this.expandedDirs = new Set();
77
+ this._renamingPath = null;
39
78
  this._handleKeyDown = this._handleKeyDown.bind(this);
79
+ this._handleDocClick = this._handleDocClick.bind(this);
40
80
  }
41
81
 
42
82
  disconnectedCallback() {
43
83
  document.removeEventListener('keydown', this._handleKeyDown);
84
+ document.removeEventListener('click', this._handleDocClick);
44
85
  if (this.editor) {
45
86
  this.editor.destroy();
46
87
  this.editor = null;
@@ -49,15 +90,35 @@ export class IdeView extends Component {
49
90
 
50
91
  async postRender() {
51
92
  document.addEventListener('keydown', this._handleKeyDown);
93
+ document.addEventListener('click', this._handleDocClick);
52
94
 
53
95
  const saveBtn = this.querySelector('#saveBtn');
54
96
  if (saveBtn) {
55
97
  saveBtn.addEventListener('click', () => this._saveFile());
56
98
  }
57
99
 
100
+ const newFileBtn = this.querySelector('#newFileBtn');
101
+ if (newFileBtn) {
102
+ newFileBtn.addEventListener('click', (e) => {
103
+ e.stopPropagation();
104
+ this._toggleDropdown();
105
+ });
106
+ }
107
+
58
108
  await this._loadTree();
59
109
  }
60
110
 
111
+ _handleDocClick(e) {
112
+ const dropdown = this.querySelector('#newResourceDropdown');
113
+ if (dropdown && !dropdown.contains(e.target) && !e.target.closest('#newFileBtn')) {
114
+ dropdown.remove();
115
+ }
116
+ const contextMenu = document.querySelector('#contextMenu');
117
+ if (contextMenu && !contextMenu.contains(e.target)) {
118
+ contextMenu.remove();
119
+ }
120
+ }
121
+
61
122
  _handleKeyDown(e) {
62
123
  if ((e.ctrlKey || e.metaKey) && e.key === 's') {
63
124
  e.preventDefault();
@@ -78,8 +139,24 @@ export class IdeView extends Component {
78
139
  _renderTree() {
79
140
  const container = this.querySelector('#fileTree');
80
141
  if (!container) return;
142
+
81
143
  container.innerHTML = this._buildTreeHTML(this.treeData, 0);
144
+
82
145
  this._attachTreeListeners();
146
+ this._focusInlineInput();
147
+ }
148
+
149
+ _buildRenameInputHTML(node, depth) {
150
+ const ext = getExtension(node.name);
151
+ const iconInfo = FILE_ICONS[ext] || FILE_ICONS.default;
152
+ return `
153
+ <div class="tree-item tree-depth-${Math.min(depth, 5)} flex items-center gap-2 rounded text-sm text-gray-300">
154
+ <span class="w-3"></span>
155
+ <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"
157
+ data-action="rename" data-path="${node.path}" value="${node.name}" />
158
+ </div>
159
+ `;
83
160
  }
84
161
 
85
162
  _buildTreeHTML(nodes, depth) {
@@ -87,40 +164,128 @@ export class IdeView extends Component {
87
164
  if (node.type === 'directory') {
88
165
  const isExpanded = this.expandedDirs.has(node.path);
89
166
  const chevron = isExpanded ? 'fa-chevron-down' : 'fa-chevron-right';
167
+
90
168
  const childrenHTML = isExpanded
91
169
  ? this._buildTreeHTML(node.children || [], depth + 1)
92
170
  : '';
93
171
 
172
+ // Only show menu button for subfolders (depth > 0)
173
+ 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"
175
+ data-menu-path="${node.path}" data-menu-type="directory">
176
+ <i class="fas fa-ellipsis-v text-xs"></i>
177
+ </button>
178
+ ` : '';
179
+
94
180
  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"
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"
96
182
  data-path="${node.path}" data-type="directory">
97
183
  <i class="fas ${chevron} text-xs text-gray-500 w-3"></i>
98
184
  <i class="fas fa-folder${isExpanded ? '-open' : ''} text-yellow-500 text-sm"></i>
99
- <span>${node.name}</span>
185
+ <span class="flex-1 min-w-0">${node.name}</span>
186
+ ${menuBtn}
100
187
  </div>
101
188
  ${childrenHTML}
102
189
  `;
103
190
  }
104
191
 
192
+ // If this file is being renamed, show an inline input instead
193
+ if (this._renamingPath === node.path) {
194
+ return this._buildRenameInputHTML(node, depth);
195
+ }
196
+
105
197
  const ext = getExtension(node.name);
106
198
  const iconInfo = FILE_ICONS[ext] || FILE_ICONS.default;
107
199
  const isActive = this.currentFile && this.currentFile.path === node.path;
108
200
  const activeClass = isActive ? 'bg-dark-hover text-white' : '';
109
201
 
110
202
  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}"
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}"
112
204
  data-path="${node.path}" data-type="file">
113
205
  <span class="w-3"></span>
114
206
  <i class="fas ${iconInfo.icon} ${iconInfo.color} text-sm"></i>
115
- <span class="truncate max-w-[160px]">${node.name}</span>
207
+ <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"
209
+ data-menu-path="${node.path}" data-menu-type="file">
210
+ <i class="fas fa-ellipsis-v text-xs"></i>
211
+ </button>
116
212
  </div>
117
213
  `;
118
214
  }).join('');
119
215
  }
120
216
 
217
+ _focusInlineInput() {
218
+ const input = this.querySelector('.inline-tree-input');
219
+ if (!input) return;
220
+
221
+ requestAnimationFrame(() => {
222
+ input.focus();
223
+ // Select the name portion (before extension) for rename inputs
224
+ if (input.dataset.action === 'rename') {
225
+ const val = input.value;
226
+ const dotIdx = val.lastIndexOf('.');
227
+ input.setSelectionRange(0, dotIdx > 0 ? dotIdx : val.length);
228
+ }
229
+ });
230
+
231
+ input.addEventListener('keydown', (e) => {
232
+ e.stopPropagation();
233
+ if (e.key === 'Enter') {
234
+ e.preventDefault();
235
+ this._commitInlineInput(input);
236
+ } else if (e.key === 'Escape') {
237
+ e.preventDefault();
238
+ this._cancelInlineInput();
239
+ }
240
+ });
241
+
242
+ input.addEventListener('blur', () => {
243
+ // Small delay to allow click-away to cancel rather than commit
244
+ setTimeout(() => {
245
+ if (this._renamingPath !== null) {
246
+ this._cancelInlineInput();
247
+ }
248
+ }, 150);
249
+ });
250
+ }
251
+
252
+ _cancelInlineInput() {
253
+ this._renamingPath = null;
254
+ this._renderTree();
255
+ }
256
+
257
+ async _commitInlineInput(input) {
258
+ const value = input.value.trim();
259
+ if (!value) {
260
+ this._cancelInlineInput();
261
+ return;
262
+ }
263
+
264
+ if (input.dataset.action === 'rename') {
265
+ const oldPath = input.dataset.path;
266
+ const oldName = oldPath.split('/').pop();
267
+ if (value === oldName) {
268
+ this._cancelInlineInput();
269
+ return;
270
+ }
271
+ const parentDir = oldPath.includes('/') ? oldPath.substring(0, oldPath.lastIndexOf('/')) : '';
272
+ const newPath = parentDir ? `${parentDir}/${value}` : value;
273
+ this._renamingPath = null;
274
+ await this._renameFile(oldPath, newPath);
275
+ }
276
+ }
277
+
121
278
  _attachTreeListeners() {
122
279
  this.querySelectorAll('.tree-item').forEach(item => {
123
- item.addEventListener('click', () => {
280
+ if (!item.dataset.path) return;
281
+
282
+ item.addEventListener('click', (e) => {
283
+ // Ignore clicks on the menu button
284
+ if (e.target.closest('.tree-menu-btn')) return;
285
+
286
+ // Close any open context menu
287
+ this._closeContextMenu();
288
+
124
289
  const filePath = item.dataset.path;
125
290
  const type = item.dataset.type;
126
291
 
@@ -131,6 +296,113 @@ export class IdeView extends Component {
131
296
  }
132
297
  });
133
298
  });
299
+
300
+ // Menu button clicks
301
+ this.querySelectorAll('.tree-menu-btn').forEach(btn => {
302
+ btn.addEventListener('click', (e) => {
303
+ e.stopPropagation();
304
+ const filePath = btn.dataset.menuPath;
305
+ const type = btn.dataset.menuType;
306
+ this._showContextMenu(e, filePath, type);
307
+ });
308
+ });
309
+ }
310
+
311
+ _closeContextMenu() {
312
+ const menu = document.querySelector('#contextMenu');
313
+ if (menu) menu.remove();
314
+ }
315
+
316
+ _showContextMenu(e, filePath, type) {
317
+ // Remove existing context menu
318
+ this._closeContextMenu();
319
+
320
+ const btn = e.currentTarget;
321
+ const btnRect = btn.getBoundingClientRect();
322
+
323
+ const menu = document.createElement('div');
324
+ menu.id = 'contextMenu';
325
+ menu.className = 'fixed z-50 bg-dark-surface border border-dark-border rounded shadow-lg py-1 min-w-[100px]';
326
+
327
+ const isFile = type === 'file';
328
+
329
+ menu.innerHTML = `
330
+ ${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>
333
+ <span>Rename</span>
334
+ </div>
335
+ ` : ''}
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>
338
+ <span>Delete</span>
339
+ </div>
340
+ `;
341
+
342
+ document.body.appendChild(menu);
343
+
344
+ // Position after render to get correct dimensions
345
+ requestAnimationFrame(() => {
346
+ const menuRect = menu.getBoundingClientRect();
347
+ let left = btnRect.right + 4;
348
+ let top = btnRect.top;
349
+
350
+ // Adjust if menu goes off-screen
351
+ if (left + menuRect.width > window.innerWidth) {
352
+ left = btnRect.left - menuRect.width - 4;
353
+ }
354
+ if (top + menuRect.height > window.innerHeight) {
355
+ top = window.innerHeight - menuRect.height - 8;
356
+ }
357
+
358
+ menu.style.left = `${left}px`;
359
+ menu.style.top = `${top}px`;
360
+ });
361
+
362
+ menu.querySelectorAll('.context-item').forEach(item => {
363
+ item.addEventListener('click', () => {
364
+ const action = item.dataset.action;
365
+ menu.remove();
366
+ if (action === 'rename') {
367
+ this._startRename(filePath);
368
+ } else if (action === 'delete') {
369
+ this._confirmDelete(filePath, type);
370
+ }
371
+ });
372
+ });
373
+ }
374
+
375
+ _confirmDelete(filePath, type) {
376
+ const name = filePath.split('/').pop();
377
+ const isDir = type === 'directory';
378
+ const msg = isDir
379
+ ? `Delete folder "${name}" and all its contents?`
380
+ : `Delete "${name}"?`;
381
+
382
+ if (!confirm(msg)) return;
383
+ this._deleteFile(filePath);
384
+ }
385
+
386
+ async _deleteFile(filePath) {
387
+ try {
388
+ const result = await api.deleteFile(filePath);
389
+ if (result.error) {
390
+ alert(result.error);
391
+ return;
392
+ }
393
+
394
+ // If the deleted file was open, clear the editor
395
+ if (this.currentFile && this.currentFile.path === filePath) {
396
+ this.currentFile = null;
397
+ this.isDirty = false;
398
+ this._renderEditor();
399
+ }
400
+
401
+ await this._loadTree();
402
+ } catch (err) {
403
+ console.error('Failed to delete file:', err);
404
+ alert('Failed to delete file.');
405
+ }
134
406
  }
135
407
 
136
408
  _toggleDir(dirPath) {
@@ -142,6 +414,186 @@ export class IdeView extends Component {
142
414
  this._renderTree();
143
415
  }
144
416
 
417
+ _toggleDropdown() {
418
+ const existing = this.querySelector('#newResourceDropdown');
419
+ if (existing) {
420
+ existing.remove();
421
+ return;
422
+ }
423
+
424
+ const btn = this.querySelector('#newFileBtn');
425
+ if (!btn) return;
426
+
427
+ 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"
429
+ data-resource="${key}">
430
+ <i class="fas ${rt.icon} ${rt.color} text-xs w-4 text-center"></i>
431
+ <span>${rt.label}</span>
432
+ </div>
433
+ `).join('');
434
+
435
+ const dropdown = document.createElement('div');
436
+ 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]';
438
+ dropdown.innerHTML = items;
439
+
440
+ btn.parentElement.classList.add('relative');
441
+ btn.parentElement.appendChild(dropdown);
442
+
443
+ dropdown.querySelectorAll('.new-resource-item').forEach(item => {
444
+ item.addEventListener('click', (e) => {
445
+ e.stopPropagation();
446
+ const type = item.dataset.resource;
447
+ dropdown.remove();
448
+ this._selectResourceType(type);
449
+ });
450
+ });
451
+ }
452
+
453
+ _selectResourceType(type) {
454
+ this._showCreateModal(type);
455
+ }
456
+
457
+ _showCreateModal(type) {
458
+ // Remove existing modal if any
459
+ const existing = this.querySelector('#createResourceModal');
460
+ if (existing) existing.remove();
461
+
462
+ const rt = RESOURCE_TYPES[type];
463
+ const modal = document.createElement('div');
464
+ modal.id = 'createResourceModal';
465
+ modal.className = 'fixed inset-0 z-50 flex items-center justify-center';
466
+ 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">
470
+ <i class="fas ${rt.icon} ${rt.color}"></i>
471
+ <span class="text-white font-medium">New ${rt.label}</span>
472
+ </div>
473
+ <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>
477
+ <input type="text" id="resourceNameInput"
478
+ class="flex-1 px-3 py-2 bg-transparent text-white text-sm outline-none"
479
+ 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>
481
+ </div>
482
+ <p class="text-xs text-gray-500 mt-2">Use lowercase letters, numbers, and hyphens</p>
483
+ </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>
491
+ </div>
492
+ </div>
493
+ `;
494
+
495
+ this.appendChild(modal);
496
+
497
+ const input = modal.querySelector('#resourceNameInput');
498
+ const createBtn = modal.querySelector('[data-action="create"]');
499
+ const cancelBtns = modal.querySelectorAll('[data-action="cancel"]');
500
+
501
+ input.focus();
502
+
503
+ const close = () => modal.remove();
504
+
505
+ const create = async () => {
506
+ const name = input.value.trim();
507
+ if (!name) return;
508
+ close();
509
+ await this._createResourceFromTemplate(type, name);
510
+ };
511
+
512
+ input.addEventListener('keydown', (e) => {
513
+ if (e.key === 'Enter') {
514
+ e.preventDefault();
515
+ create();
516
+ } else if (e.key === 'Escape') {
517
+ e.preventDefault();
518
+ close();
519
+ }
520
+ });
521
+
522
+ createBtn.addEventListener('click', create);
523
+ cancelBtns.forEach(btn => btn.addEventListener('click', close));
524
+ }
525
+
526
+ _startRename(filePath) {
527
+ this._renamingPath = filePath;
528
+ this._renderTree();
529
+ }
530
+
531
+ async _createResourceFromTemplate(type, name) {
532
+ try {
533
+ const template = await api.getResourceTemplate(type, name);
534
+ if (template.error) {
535
+ alert(template.error);
536
+ return;
537
+ }
538
+
539
+ const result = await api.createFile(template.path, template.content);
540
+ if (result.error) {
541
+ alert(result.error);
542
+ return;
543
+ }
544
+
545
+ // Expand the parent directory of the new file
546
+ const parts = template.path.split('/');
547
+ if (parts.length > 1) {
548
+ parts.pop();
549
+ this.expandedDirs.add(parts.join('/'));
550
+ }
551
+
552
+ await this._loadTree();
553
+ await this._openFile(template.path);
554
+ } catch (err) {
555
+ console.error('Failed to create resource:', err);
556
+ alert('Failed to create resource.');
557
+ }
558
+ }
559
+
560
+ async _createFile(filePath, content = '') {
561
+ try {
562
+ const result = await api.createFile(filePath, content);
563
+ if (result.error) {
564
+ alert(result.error);
565
+ return;
566
+ }
567
+ await this._loadTree();
568
+ await this._openFile(filePath);
569
+ } catch (err) {
570
+ console.error('Failed to create file:', err);
571
+ alert('Failed to create file.');
572
+ }
573
+ }
574
+
575
+ async _renameFile(oldPath, newPath) {
576
+ try {
577
+ const result = await api.renameFile(oldPath, newPath);
578
+ if (result.error) {
579
+ alert(result.error);
580
+ this._renderTree();
581
+ return;
582
+ }
583
+
584
+ // If the renamed file was currently open, update the reference
585
+ if (this.currentFile && this.currentFile.path === oldPath) {
586
+ this.currentFile.path = newPath;
587
+ }
588
+
589
+ await this._loadTree();
590
+ } catch (err) {
591
+ console.error('Failed to rename file:', err);
592
+ alert('Failed to rename file.');
593
+ this._renderTree();
594
+ }
595
+ }
596
+
145
597
  async _openFile(filePath) {
146
598
  if (this.isDirty) {
147
599
  const confirmed = confirm('You have unsaved changes. Discard and open another file?');
@@ -298,8 +750,11 @@ export class IdeView extends Component {
298
750
  <div class="flex flex-1 min-h-0 border border-t-0 border-dark-border rounded-b-lg overflow-hidden">
299
751
  <!-- File tree sidebar -->
300
752
  <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
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">
754
+ <span>Explorer</span>
755
+ <button id="newFileBtn" class="text-gray-500 hover:text-green-400 transition-colors" title="New Resource">
756
+ <i class="fas fa-plus text-xs"></i>
757
+ </button>
303
758
  </div>
304
759
  <div id="fileTree" class="py-1">
305
760
  <div class="px-4 py-8 text-center text-gray-500 text-sm">