beddel 0.2.1 → 0.2.3

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 (332) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +132 -21
  3. package/dist/agents/chat/chat.handler.d.ts +12 -0
  4. package/dist/agents/chat/chat.handler.d.ts.map +1 -0
  5. package/dist/agents/chat/chat.handler.js +143 -0
  6. package/dist/agents/chat/chat.handler.js.map +1 -0
  7. package/dist/agents/chat/chat.schema.d.ts +38 -0
  8. package/dist/agents/chat/chat.schema.d.ts.map +1 -0
  9. package/dist/agents/chat/chat.schema.js +31 -0
  10. package/dist/agents/chat/chat.schema.js.map +1 -0
  11. package/dist/agents/chat/chat.types.d.ts +42 -0
  12. package/dist/agents/chat/chat.types.d.ts.map +1 -0
  13. package/dist/agents/chat/chat.types.js +6 -0
  14. package/dist/agents/chat/chat.types.js.map +1 -0
  15. package/dist/agents/chat/chat.yaml +150 -0
  16. package/dist/agents/chat/index.d.ts +16 -0
  17. package/dist/agents/chat/index.d.ts.map +1 -0
  18. package/dist/agents/chat/index.js +21 -0
  19. package/dist/agents/chat/index.js.map +1 -0
  20. package/dist/agents/chromadb/chromadb.handler.d.ts +12 -0
  21. package/dist/agents/chromadb/chromadb.handler.d.ts.map +1 -0
  22. package/dist/agents/chromadb/chromadb.handler.js +139 -0
  23. package/dist/agents/chromadb/chromadb.handler.js.map +1 -0
  24. package/dist/agents/chromadb/chromadb.schema.d.ts +36 -0
  25. package/dist/agents/chromadb/chromadb.schema.d.ts.map +1 -0
  26. package/dist/agents/chromadb/chromadb.schema.js +33 -0
  27. package/dist/agents/chromadb/chromadb.schema.js.map +1 -0
  28. package/dist/agents/chromadb/chromadb.types.d.ts +49 -0
  29. package/dist/agents/chromadb/chromadb.types.d.ts.map +1 -0
  30. package/dist/agents/chromadb/chromadb.types.js +6 -0
  31. package/dist/agents/chromadb/chromadb.types.js.map +1 -0
  32. package/dist/agents/chromadb/chromadb.yaml +128 -0
  33. package/dist/agents/chromadb/index.d.ts +15 -0
  34. package/dist/agents/chromadb/index.d.ts.map +1 -0
  35. package/dist/agents/chromadb/index.js +20 -0
  36. package/dist/agents/chromadb/index.js.map +1 -0
  37. package/dist/agents/gemini-vectorize/gemini-vectorize.handler.d.ts +8 -0
  38. package/dist/agents/gemini-vectorize/gemini-vectorize.handler.d.ts.map +1 -0
  39. package/dist/agents/gemini-vectorize/gemini-vectorize.handler.js +58 -0
  40. package/dist/agents/gemini-vectorize/gemini-vectorize.handler.js.map +1 -0
  41. package/dist/agents/gemini-vectorize/gemini-vectorize.schema.d.ts +22 -0
  42. package/dist/agents/gemini-vectorize/gemini-vectorize.schema.d.ts.map +1 -0
  43. package/dist/agents/gemini-vectorize/gemini-vectorize.schema.js +20 -0
  44. package/dist/agents/gemini-vectorize/gemini-vectorize.schema.js.map +1 -0
  45. package/dist/agents/gemini-vectorize/gemini-vectorize.types.d.ts +32 -0
  46. package/dist/agents/gemini-vectorize/gemini-vectorize.types.d.ts.map +1 -0
  47. package/dist/agents/gemini-vectorize/gemini-vectorize.types.js +6 -0
  48. package/dist/agents/gemini-vectorize/gemini-vectorize.types.js.map +1 -0
  49. package/dist/agents/gemini-vectorize/gemini-vectorize.yaml +84 -0
  50. package/dist/agents/gemini-vectorize/index.d.ts +15 -0
  51. package/dist/agents/gemini-vectorize/index.d.ts.map +1 -0
  52. package/dist/agents/gemini-vectorize/index.js +20 -0
  53. package/dist/agents/gemini-vectorize/index.js.map +1 -0
  54. package/dist/agents/gitmcp/gitmcp.handler.d.ts +12 -0
  55. package/dist/agents/gitmcp/gitmcp.handler.d.ts.map +1 -0
  56. package/dist/agents/gitmcp/gitmcp.handler.js +95 -0
  57. package/dist/agents/gitmcp/gitmcp.handler.js.map +1 -0
  58. package/dist/agents/gitmcp/gitmcp.schema.d.ts +17 -0
  59. package/dist/agents/gitmcp/gitmcp.schema.d.ts.map +1 -0
  60. package/dist/agents/gitmcp/gitmcp.schema.js +18 -0
  61. package/dist/agents/gitmcp/gitmcp.schema.js.map +1 -0
  62. package/dist/agents/gitmcp/gitmcp.types.d.ts +31 -0
  63. package/dist/agents/gitmcp/gitmcp.types.d.ts.map +1 -0
  64. package/dist/agents/gitmcp/gitmcp.types.js +6 -0
  65. package/dist/agents/gitmcp/gitmcp.types.js.map +1 -0
  66. package/dist/agents/gitmcp/gitmcp.yaml +71 -0
  67. package/dist/agents/gitmcp/index.d.ts +16 -0
  68. package/dist/agents/gitmcp/index.d.ts.map +1 -0
  69. package/dist/agents/gitmcp/index.js +21 -0
  70. package/dist/agents/gitmcp/index.js.map +1 -0
  71. package/dist/agents/image/image.handler.d.ts +8 -0
  72. package/dist/agents/image/image.handler.d.ts.map +1 -0
  73. package/dist/agents/image/image.handler.js +66 -0
  74. package/dist/agents/image/image.handler.js.map +1 -0
  75. package/dist/agents/image/image.schema.d.ts +29 -0
  76. package/dist/agents/image/image.schema.d.ts.map +1 -0
  77. package/dist/agents/image/image.schema.js +26 -0
  78. package/dist/agents/image/image.schema.js.map +1 -0
  79. package/dist/agents/image/image.types.d.ts +42 -0
  80. package/dist/agents/image/image.types.d.ts.map +1 -0
  81. package/dist/agents/image/image.types.js +6 -0
  82. package/dist/agents/image/image.types.js.map +1 -0
  83. package/{src/agents/image-agent.yaml → dist/agents/image/image.yaml} +21 -21
  84. package/dist/agents/image/index.d.ts +14 -0
  85. package/dist/agents/image/index.d.ts.map +1 -0
  86. package/dist/agents/image/index.js +19 -0
  87. package/dist/agents/image/index.js.map +1 -0
  88. package/dist/agents/index.d.ts +95 -0
  89. package/dist/agents/index.d.ts.map +1 -0
  90. package/dist/agents/index.js +76 -0
  91. package/dist/agents/index.js.map +1 -0
  92. package/dist/agents/joker/index.d.ts +14 -0
  93. package/dist/agents/joker/index.d.ts.map +1 -0
  94. package/dist/agents/joker/index.js +19 -0
  95. package/dist/agents/joker/index.js.map +1 -0
  96. package/dist/agents/joker/joker.handler.d.ts +8 -0
  97. package/dist/agents/joker/joker.handler.d.ts.map +1 -0
  98. package/dist/agents/joker/joker.handler.js +48 -0
  99. package/dist/agents/joker/joker.handler.js.map +1 -0
  100. package/dist/agents/joker/joker.schema.d.ts +12 -0
  101. package/dist/agents/joker/joker.schema.d.ts.map +1 -0
  102. package/dist/agents/joker/joker.schema.js +13 -0
  103. package/dist/agents/joker/joker.schema.js.map +1 -0
  104. package/dist/agents/joker/joker.types.d.ts +35 -0
  105. package/dist/agents/joker/joker.types.d.ts.map +1 -0
  106. package/dist/agents/joker/joker.types.js +6 -0
  107. package/dist/agents/joker/joker.types.js.map +1 -0
  108. package/{src/agents/joker-agent.yaml → dist/agents/joker/joker.yaml} +4 -4
  109. package/dist/agents/mcp-tool/index.d.ts +14 -0
  110. package/dist/agents/mcp-tool/index.d.ts.map +1 -0
  111. package/dist/agents/mcp-tool/index.js +19 -0
  112. package/dist/agents/mcp-tool/index.js.map +1 -0
  113. package/dist/agents/mcp-tool/mcp-tool.handler.d.ts +12 -0
  114. package/dist/agents/mcp-tool/mcp-tool.handler.d.ts.map +1 -0
  115. package/dist/agents/mcp-tool/mcp-tool.handler.js +116 -0
  116. package/dist/agents/mcp-tool/mcp-tool.handler.js.map +1 -0
  117. package/dist/agents/mcp-tool/mcp-tool.schema.d.ts +19 -0
  118. package/dist/agents/mcp-tool/mcp-tool.schema.d.ts.map +1 -0
  119. package/dist/agents/mcp-tool/mcp-tool.schema.js +20 -0
  120. package/dist/agents/mcp-tool/mcp-tool.schema.js.map +1 -0
  121. package/dist/agents/mcp-tool/mcp-tool.types.d.ts +31 -0
  122. package/dist/agents/mcp-tool/mcp-tool.types.d.ts.map +1 -0
  123. package/dist/agents/mcp-tool/mcp-tool.types.js +6 -0
  124. package/dist/agents/mcp-tool/mcp-tool.types.js.map +1 -0
  125. package/dist/agents/mcp-tool/mcp-tool.yaml +71 -0
  126. package/dist/agents/rag/index.d.ts +15 -0
  127. package/dist/agents/rag/index.d.ts.map +1 -0
  128. package/dist/agents/rag/index.js +20 -0
  129. package/dist/agents/rag/index.js.map +1 -0
  130. package/dist/agents/rag/rag.handler.d.ts +8 -0
  131. package/dist/agents/rag/rag.handler.d.ts.map +1 -0
  132. package/dist/agents/rag/rag.handler.js +101 -0
  133. package/dist/agents/rag/rag.handler.js.map +1 -0
  134. package/dist/agents/rag/rag.schema.d.ts +27 -0
  135. package/dist/agents/rag/rag.schema.d.ts.map +1 -0
  136. package/dist/agents/rag/rag.schema.js +24 -0
  137. package/dist/agents/rag/rag.schema.js.map +1 -0
  138. package/dist/agents/rag/rag.types.d.ts +47 -0
  139. package/dist/agents/rag/rag.types.d.ts.map +1 -0
  140. package/dist/agents/rag/rag.types.js +6 -0
  141. package/dist/agents/rag/rag.types.js.map +1 -0
  142. package/dist/agents/rag/rag.yaml +89 -0
  143. package/dist/agents/{agentRegistry.d.ts → registry/agentRegistry.d.ts} +25 -1
  144. package/dist/agents/registry/agentRegistry.d.ts.map +1 -0
  145. package/dist/agents/{agentRegistry.js → registry/agentRegistry.js} +154 -4
  146. package/dist/agents/registry/agentRegistry.js.map +1 -0
  147. package/dist/agents/registry/index.d.ts +6 -0
  148. package/dist/agents/registry/index.d.ts.map +1 -0
  149. package/dist/agents/registry/index.js +10 -0
  150. package/dist/agents/registry/index.js.map +1 -0
  151. package/dist/agents/translator/index.d.ts +14 -0
  152. package/dist/agents/translator/index.d.ts.map +1 -0
  153. package/dist/agents/translator/index.js +19 -0
  154. package/dist/agents/translator/index.js.map +1 -0
  155. package/dist/agents/translator/translator.handler.d.ts +8 -0
  156. package/dist/agents/translator/translator.handler.d.ts.map +1 -0
  157. package/dist/agents/translator/translator.handler.js +83 -0
  158. package/dist/agents/translator/translator.handler.js.map +1 -0
  159. package/dist/agents/translator/translator.schema.d.ts +27 -0
  160. package/dist/agents/translator/translator.schema.d.ts.map +1 -0
  161. package/dist/agents/translator/translator.schema.js +28 -0
  162. package/dist/agents/translator/translator.schema.js.map +1 -0
  163. package/dist/agents/translator/translator.types.d.ts +40 -0
  164. package/dist/agents/translator/translator.types.d.ts.map +1 -0
  165. package/dist/agents/translator/translator.types.js +6 -0
  166. package/dist/agents/translator/translator.types.js.map +1 -0
  167. package/{src/agents/translator-agent.yaml → dist/agents/translator/translator.yaml} +27 -27
  168. package/dist/client/index.d.ts +89 -0
  169. package/dist/client/index.d.ts.map +1 -0
  170. package/dist/client/index.js +93 -0
  171. package/dist/client/index.js.map +1 -0
  172. package/dist/client/types.d.ts +17 -0
  173. package/dist/client/types.d.ts.map +1 -0
  174. package/dist/client/types.js +7 -0
  175. package/dist/client/types.js.map +1 -0
  176. package/dist/firebase/tenantManager.d.ts +34 -2
  177. package/dist/firebase/tenantManager.d.ts.map +1 -1
  178. package/dist/firebase/tenantManager.js +67 -1
  179. package/dist/firebase/tenantManager.js.map +1 -1
  180. package/dist/index.d.ts +8 -4
  181. package/dist/index.d.ts.map +1 -1
  182. package/dist/index.js +22 -7
  183. package/dist/index.js.map +1 -1
  184. package/dist/runtime/declarativeAgentRuntime.d.ts +14 -49
  185. package/dist/runtime/declarativeAgentRuntime.d.ts.map +1 -1
  186. package/dist/runtime/declarativeAgentRuntime.js +248 -355
  187. package/dist/runtime/declarativeAgentRuntime.js.map +1 -1
  188. package/dist/runtime/index.d.ts +12 -0
  189. package/dist/runtime/index.d.ts.map +1 -0
  190. package/dist/runtime/index.js +33 -0
  191. package/dist/runtime/index.js.map +1 -0
  192. package/dist/runtime/workflowExecutor.d.ts +30 -0
  193. package/dist/runtime/workflowExecutor.d.ts.map +1 -0
  194. package/dist/runtime/workflowExecutor.js +70 -0
  195. package/dist/runtime/workflowExecutor.js.map +1 -0
  196. package/dist/server/api/graphql.d.ts +1 -1
  197. package/dist/server/api/graphql.d.ts.map +1 -1
  198. package/dist/server/api/graphql.js +104 -62
  199. package/dist/server/api/graphql.js.map +1 -1
  200. package/dist/server/index.d.ts +2 -2
  201. package/dist/server/index.d.ts.map +1 -1
  202. package/dist/server/index.js +2 -2
  203. package/dist/server/index.js.map +1 -1
  204. package/dist/shared/index.d.ts +7 -0
  205. package/dist/shared/index.d.ts.map +1 -0
  206. package/dist/shared/index.js +23 -0
  207. package/dist/shared/index.js.map +1 -0
  208. package/dist/shared/types/agent.types.d.ts +50 -0
  209. package/dist/shared/types/agent.types.d.ts.map +1 -0
  210. package/dist/shared/types/agent.types.js +7 -0
  211. package/dist/shared/types/agent.types.js.map +1 -0
  212. package/dist/shared/types/execution.types.d.ts +42 -0
  213. package/dist/shared/types/execution.types.d.ts.map +1 -0
  214. package/dist/shared/types/execution.types.js +7 -0
  215. package/dist/shared/types/execution.types.js.map +1 -0
  216. package/dist/shared/types/index.d.ts +7 -0
  217. package/dist/shared/types/index.d.ts.map +1 -0
  218. package/dist/shared/types/index.js +23 -0
  219. package/dist/shared/types/index.js.map +1 -0
  220. package/dist/shared/types/schema.types.d.ts +52 -0
  221. package/dist/shared/types/schema.types.d.ts.map +1 -0
  222. package/dist/shared/types/schema.types.js +7 -0
  223. package/dist/shared/types/schema.types.js.map +1 -0
  224. package/dist/shared/utils/index.d.ts +5 -0
  225. package/dist/shared/utils/index.d.ts.map +1 -0
  226. package/dist/shared/utils/index.js +21 -0
  227. package/dist/shared/utils/index.js.map +1 -0
  228. package/dist/shared/utils/validation.d.ts +42 -0
  229. package/dist/shared/utils/validation.d.ts.map +1 -0
  230. package/dist/shared/utils/validation.js +93 -0
  231. package/dist/shared/utils/validation.js.map +1 -0
  232. package/dist/tenant/TenantManager.d.ts +152 -0
  233. package/dist/tenant/TenantManager.d.ts.map +1 -0
  234. package/dist/tenant/TenantManager.js +392 -0
  235. package/dist/tenant/TenantManager.js.map +1 -0
  236. package/dist/tenant/index.d.ts +47 -0
  237. package/dist/tenant/index.d.ts.map +1 -0
  238. package/dist/tenant/index.js +74 -0
  239. package/dist/tenant/index.js.map +1 -0
  240. package/dist/tenant/interfaces.d.ts +170 -0
  241. package/dist/tenant/interfaces.d.ts.map +1 -0
  242. package/dist/tenant/interfaces.js +67 -0
  243. package/dist/tenant/interfaces.js.map +1 -0
  244. package/dist/tenant/providerFactory.d.ts +43 -0
  245. package/dist/tenant/providerFactory.d.ts.map +1 -0
  246. package/dist/tenant/providerFactory.js +70 -0
  247. package/dist/tenant/providerFactory.js.map +1 -0
  248. package/dist/tenant/providerRegistry.d.ts +47 -0
  249. package/dist/tenant/providerRegistry.d.ts.map +1 -0
  250. package/dist/tenant/providerRegistry.js +79 -0
  251. package/dist/tenant/providerRegistry.js.map +1 -0
  252. package/dist/tenant/providers/FirebaseTenantProvider.d.ts +41 -0
  253. package/dist/tenant/providers/FirebaseTenantProvider.d.ts.map +1 -0
  254. package/dist/tenant/providers/FirebaseTenantProvider.js +290 -0
  255. package/dist/tenant/providers/FirebaseTenantProvider.js.map +1 -0
  256. package/dist/tenant/providers/InMemoryTenantProvider.d.ts +18 -0
  257. package/dist/tenant/providers/InMemoryTenantProvider.d.ts.map +1 -0
  258. package/dist/tenant/providers/InMemoryTenantProvider.js +137 -0
  259. package/dist/tenant/providers/InMemoryTenantProvider.js.map +1 -0
  260. package/package.json +48 -12
  261. package/src/agents/chat/chat.handler.ts +209 -0
  262. package/src/agents/chat/chat.schema.ts +33 -0
  263. package/src/agents/chat/chat.types.ts +46 -0
  264. package/src/agents/chat/chat.yaml +150 -0
  265. package/src/agents/chat/index.ts +21 -0
  266. package/src/agents/chromadb/chromadb.handler.ts +130 -0
  267. package/src/agents/chromadb/chromadb.schema.ts +35 -0
  268. package/src/agents/chromadb/chromadb.types.ts +52 -0
  269. package/src/agents/chromadb/chromadb.yaml +128 -0
  270. package/src/agents/chromadb/index.ts +20 -0
  271. package/src/agents/gemini-vectorize/gemini-vectorize.handler.ts +72 -0
  272. package/src/agents/gemini-vectorize/gemini-vectorize.schema.ts +22 -0
  273. package/src/agents/gemini-vectorize/gemini-vectorize.types.ts +34 -0
  274. package/src/agents/gemini-vectorize/gemini-vectorize.yaml +84 -0
  275. package/src/agents/gemini-vectorize/index.ts +20 -0
  276. package/src/agents/gitmcp/gitmcp.handler.ts +122 -0
  277. package/src/agents/gitmcp/gitmcp.schema.ts +20 -0
  278. package/src/agents/gitmcp/gitmcp.types.ts +33 -0
  279. package/src/agents/gitmcp/gitmcp.yaml +71 -0
  280. package/src/agents/gitmcp/index.ts +21 -0
  281. package/src/agents/image/image.handler.ts +82 -0
  282. package/src/agents/image/image.schema.ts +28 -0
  283. package/src/agents/image/image.types.ts +45 -0
  284. package/src/agents/image/image.yaml +86 -0
  285. package/src/agents/image/index.ts +19 -0
  286. package/src/agents/index.ts +59 -0
  287. package/src/agents/joker/index.ts +19 -0
  288. package/src/agents/joker/joker.handler.ts +60 -0
  289. package/src/agents/joker/joker.schema.ts +15 -0
  290. package/src/agents/joker/joker.types.ts +37 -0
  291. package/src/agents/joker/joker.yaml +47 -0
  292. package/src/agents/mcp-tool/index.ts +19 -0
  293. package/src/agents/mcp-tool/mcp-tool.handler.ts +112 -0
  294. package/src/agents/mcp-tool/mcp-tool.schema.ts +22 -0
  295. package/src/agents/mcp-tool/mcp-tool.types.ts +33 -0
  296. package/src/agents/mcp-tool/mcp-tool.yaml +71 -0
  297. package/src/agents/rag/index.ts +20 -0
  298. package/src/agents/rag/rag.handler.ts +119 -0
  299. package/src/agents/rag/rag.schema.ts +26 -0
  300. package/src/agents/rag/rag.types.ts +51 -0
  301. package/src/agents/rag/rag.yaml +89 -0
  302. package/src/agents/{agentRegistry.ts → registry/agentRegistry.ts} +161 -5
  303. package/src/agents/registry/index.ts +6 -0
  304. package/src/agents/translator/index.ts +19 -0
  305. package/src/agents/translator/translator.handler.ts +99 -0
  306. package/src/agents/translator/translator.schema.ts +30 -0
  307. package/src/agents/translator/translator.types.ts +42 -0
  308. package/src/agents/translator/translator.yaml +80 -0
  309. package/src/client/index.ts +53 -0
  310. package/src/client/types.ts +38 -0
  311. package/src/index.ts +48 -5
  312. package/src/runtime/declarativeAgentRuntime.ts +367 -489
  313. package/src/runtime/index.ts +31 -0
  314. package/src/runtime/workflowExecutor.ts +94 -0
  315. package/src/server/api/graphql.ts +109 -74
  316. package/src/server/index.ts +2 -2
  317. package/src/shared/index.ts +7 -0
  318. package/src/shared/types/agent.types.ts +80 -0
  319. package/src/shared/types/execution.types.ts +45 -0
  320. package/src/shared/types/index.ts +7 -0
  321. package/src/shared/types/schema.types.ts +55 -0
  322. package/src/shared/utils/index.ts +5 -0
  323. package/src/shared/utils/validation.ts +100 -0
  324. package/src/tenant/TenantManager.ts +488 -0
  325. package/src/tenant/index.ts +101 -0
  326. package/src/tenant/interfaces.ts +231 -0
  327. package/src/tenant/providerFactory.ts +75 -0
  328. package/src/tenant/providerRegistry.ts +86 -0
  329. package/src/tenant/providers/InMemoryTenantProvider.ts +168 -0
  330. package/dist/agents/agentRegistry.d.ts.map +0 -1
  331. package/dist/agents/agentRegistry.js.map +0 -1
  332. package/src/firebase/tenantManager.ts +0 -443
@@ -0,0 +1,209 @@
1
+ import 'server-only';
2
+
3
+ /**
4
+ * Chat Agent Handler - Server-only execution logic
5
+ * Orchestrates RAG pipeline or simple chat based on mode
6
+ */
7
+
8
+ import type { ExecutionContext } from '../../types/executionContext';
9
+ import type { ExecutionStep } from '../../shared/types/agent.types';
10
+ import type { ChatHandlerParams, ChatHandlerResult, ChatMode } from './chat.types';
11
+ import { executeVectorizeHandler } from '../gemini-vectorize/gemini-vectorize.handler';
12
+ import { executeChromaDBHandler } from '../chromadb/chromadb.handler';
13
+ import { executeRagHandler } from '../rag/rag.handler';
14
+
15
+ const KNOWLEDGE_COLLECTION = 'beddel_knowledge';
16
+
17
+ /**
18
+ * Execute simple chat mode - direct LLM with conversation history
19
+ */
20
+ async function executeSimpleChat(
21
+ query: string,
22
+ messages: ChatHandlerParams['messages'],
23
+ props: Record<string, string>,
24
+ context: ExecutionContext,
25
+ executionSteps: ExecutionStep[]
26
+ ): Promise<ChatHandlerResult> {
27
+ const startTime = Date.now();
28
+
29
+ context.log(`[Chat:Simple] Processing query: "${query.substring(0, 50)}..."`);
30
+
31
+ const chatStep: ExecutionStep = {
32
+ agent: 'rag',
33
+ action: 'chat',
34
+ status: 'running',
35
+ startTime: Date.now(),
36
+ phase: 'generation',
37
+ };
38
+ executionSteps.push(chatStep);
39
+
40
+ const result = await executeRagHandler(
41
+ { query, history: messages, mode: 'simple' },
42
+ props,
43
+ context
44
+ );
45
+
46
+ chatStep.status = result.error ? 'error' : 'success';
47
+ chatStep.endTime = Date.now();
48
+ chatStep.duration = chatStep.endTime - chatStep.startTime;
49
+ if (result.error) chatStep.error = result.error;
50
+
51
+ return {
52
+ response: result.response,
53
+ timestamp: result.timestamp,
54
+ execution_steps: executionSteps,
55
+ total_duration: Date.now() - startTime,
56
+ };
57
+ }
58
+
59
+ /**
60
+ * Execute RAG chat mode - full pipeline with knowledge base
61
+ */
62
+ async function executeRagChat(
63
+ query: string,
64
+ messages: ChatHandlerParams['messages'],
65
+ props: Record<string, string>,
66
+ context: ExecutionContext,
67
+ executionSteps: ExecutionStep[]
68
+ ): Promise<ChatHandlerResult> {
69
+ const startTime = Date.now();
70
+
71
+ context.log(`[Chat:RAG] Processing query: "${query.substring(0, 50)}..."`);
72
+
73
+ // Step 1: Vectorize user query
74
+ const vectorizeStep: ExecutionStep = {
75
+ agent: 'gemini-vectorize',
76
+ action: 'embedSingle',
77
+ status: 'running',
78
+ startTime: Date.now(),
79
+ phase: 'vectorization',
80
+ };
81
+ executionSteps.push(vectorizeStep);
82
+
83
+ const vectorResult = await executeVectorizeHandler(
84
+ { action: 'embedSingle', text: query },
85
+ props,
86
+ context
87
+ );
88
+
89
+ vectorizeStep.status = vectorResult.success ? 'success' : 'error';
90
+ vectorizeStep.endTime = Date.now();
91
+ vectorizeStep.duration = vectorizeStep.endTime - vectorizeStep.startTime;
92
+
93
+ if (!vectorResult.success || !vectorResult.vector) {
94
+ throw new Error(`Vectorization failed: ${vectorResult.error}`);
95
+ }
96
+
97
+ // Step 2: Check if knowledge base has data
98
+ const checkStep: ExecutionStep = {
99
+ agent: 'chromadb',
100
+ action: 'hasData',
101
+ status: 'running',
102
+ startTime: Date.now(),
103
+ phase: 'retrieval',
104
+ };
105
+ executionSteps.push(checkStep);
106
+
107
+ const hasDataResult = await executeChromaDBHandler(
108
+ { action: 'hasData', collection_name: KNOWLEDGE_COLLECTION, min_count: 5 },
109
+ props,
110
+ context
111
+ );
112
+
113
+ checkStep.status = hasDataResult.success ? 'success' : 'error';
114
+ checkStep.endTime = Date.now();
115
+ checkStep.duration = checkStep.endTime - checkStep.startTime;
116
+
117
+ // Step 3: Search knowledge base
118
+ const searchStep: ExecutionStep = {
119
+ agent: 'chromadb',
120
+ action: 'search',
121
+ status: 'running',
122
+ startTime: Date.now(),
123
+ phase: 'retrieval',
124
+ };
125
+ executionSteps.push(searchStep);
126
+
127
+ const searchResult = await executeChromaDBHandler(
128
+ {
129
+ action: 'search',
130
+ collection_name: KNOWLEDGE_COLLECTION,
131
+ query_vector: vectorResult.vector,
132
+ limit: 5,
133
+ },
134
+ props,
135
+ context
136
+ );
137
+
138
+ searchStep.status = searchResult.success ? 'success' : 'error';
139
+ searchStep.endTime = Date.now();
140
+ searchStep.duration = searchStep.endTime - searchStep.startTime;
141
+
142
+ // Step 4: Generate answer
143
+ const ragStep: ExecutionStep = {
144
+ agent: 'rag',
145
+ action: 'generate',
146
+ status: 'running',
147
+ startTime: Date.now(),
148
+ phase: 'generation',
149
+ };
150
+ executionSteps.push(ragStep);
151
+
152
+ const hasDocuments = searchResult.documents && searchResult.documents.trim().length > 0;
153
+
154
+ const ragResult = hasDocuments
155
+ ? await executeRagHandler({ query, documents: searchResult.documents, history: messages }, props, context)
156
+ : await executeRagHandler(
157
+ { query, documents: 'No specific documentation available. Answer based on general knowledge.', history: messages },
158
+ props,
159
+ context
160
+ );
161
+
162
+ ragStep.status = ragResult.error ? 'error' : 'success';
163
+ ragStep.endTime = Date.now();
164
+ ragStep.duration = ragStep.endTime - ragStep.startTime;
165
+ if (ragResult.error) ragStep.error = ragResult.error;
166
+
167
+ return {
168
+ response: ragResult.response,
169
+ timestamp: ragResult.timestamp,
170
+ execution_steps: executionSteps,
171
+ total_duration: Date.now() - startTime,
172
+ };
173
+ }
174
+
175
+ /**
176
+ * Execute chat orchestration
177
+ */
178
+ export async function executeChatHandler(
179
+ params: ChatHandlerParams,
180
+ props: Record<string, string>,
181
+ context: ExecutionContext
182
+ ): Promise<ChatHandlerResult> {
183
+ const executionSteps: ExecutionStep[] = [];
184
+ const messages = params.messages || [];
185
+ const lastUserMessage = [...messages].reverse().find((m) => m.role === 'user');
186
+ const query = params.query || lastUserMessage?.content || '';
187
+ const mode: ChatMode = params.mode || 'rag';
188
+
189
+ if (!query) {
190
+ throw new Error('No query found in messages or query parameter');
191
+ }
192
+
193
+ try {
194
+ return mode === 'simple'
195
+ ? await executeSimpleChat(query, messages, props, context, executionSteps)
196
+ : await executeRagChat(query, messages, props, context, executionSteps);
197
+ } catch (error: unknown) {
198
+ const message = error instanceof Error ? error.message : String(error);
199
+ context.log(`[Chat] Error: ${message}`);
200
+ context.setError(message);
201
+
202
+ return {
203
+ response: `Error processing your request: ${message}`,
204
+ timestamp: new Date().toISOString(),
205
+ execution_steps: executionSteps,
206
+ total_duration: 0,
207
+ };
208
+ }
209
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Chat Agent Schema - Zod validation schemas
3
+ * Safe for both client and server
4
+ */
5
+
6
+ import { z } from 'zod';
7
+
8
+ export const ChatInputSchema = z.object({
9
+ messages: z.array(z.object({
10
+ role: z.enum(['user', 'assistant', 'system']),
11
+ content: z.string(),
12
+ })),
13
+ query: z.string().optional(),
14
+ knowledge_sources: z.array(z.string()).optional(),
15
+ });
16
+
17
+ export const ChatOutputSchema = z.object({
18
+ response: z.string(),
19
+ timestamp: z.string(),
20
+ execution_steps: z.array(z.object({
21
+ agent: z.string(),
22
+ action: z.string(),
23
+ status: z.enum(['running', 'success', 'error']),
24
+ startTime: z.number(),
25
+ endTime: z.number().optional(),
26
+ duration: z.number().optional(),
27
+ error: z.string().optional(),
28
+ })).optional(),
29
+ total_duration: z.number().optional(),
30
+ });
31
+
32
+ export type ChatInput = z.infer<typeof ChatInputSchema>;
33
+ export type ChatOutput = z.infer<typeof ChatOutputSchema>;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Chat Agent Types - Shared between client and server
3
+ */
4
+
5
+ import type { ConversationMessage } from '../rag/rag.types';
6
+ import type { ExecutionStep } from '../../shared/types/agent.types';
7
+
8
+ /**
9
+ * Chat mode determines the execution flow
10
+ * - 'rag': Full RAG pipeline with knowledge base (default)
11
+ * - 'simple': Direct LLM chat maintaining conversation context only
12
+ */
13
+ export type ChatMode = 'rag' | 'simple';
14
+
15
+ /**
16
+ * Parameters for chat orchestration
17
+ */
18
+ export interface ChatHandlerParams {
19
+ messages: ConversationMessage[];
20
+ query?: string;
21
+ mode?: ChatMode;
22
+ knowledge_sources?: string[];
23
+ }
24
+
25
+ /**
26
+ * Result from chat orchestration
27
+ */
28
+ export interface ChatHandlerResult {
29
+ response: string;
30
+ timestamp: string;
31
+ execution_steps?: ExecutionStep[];
32
+ total_duration?: number;
33
+ }
34
+
35
+ /**
36
+ * Chat agent metadata
37
+ */
38
+ export interface ChatMetadata {
39
+ id: 'chat';
40
+ name: string;
41
+ description: string;
42
+ category: 'chat';
43
+ route: '/agents/chat';
44
+ knowledge_sources: string[];
45
+ tags: string[];
46
+ }
@@ -0,0 +1,150 @@
1
+ # Chat Agent - Native Builtin Orchestrator Agent for Beddel Runtime
2
+ # Route: /agents/chat
3
+ # Method: chat.execute
4
+
5
+ agent:
6
+ id: chat
7
+ version: 1.0.0
8
+ protocol: beddel-declarative-protocol/v2.0
9
+
10
+ metadata:
11
+ name: "Q&A Context Chat Agent"
12
+ description: "Orchestrates RAG pipeline or simple chat based on mode selection"
13
+ category: "chat"
14
+ route: "/agents/chat"
15
+ knowledge_sources:
16
+ - "gitmcp-agent"
17
+ tags:
18
+ - "chat"
19
+ - "orchestrator"
20
+ - "rag"
21
+ - "qa"
22
+ - "simple"
23
+
24
+ schema:
25
+ input:
26
+ type: "object"
27
+ properties:
28
+ messages:
29
+ type: "array"
30
+ items:
31
+ type: "object"
32
+ properties:
33
+ role:
34
+ type: "string"
35
+ enum: ["user", "assistant", "system"]
36
+ content:
37
+ type: "string"
38
+ required: ["role", "content"]
39
+ description: "Conversation messages"
40
+ query:
41
+ type: "string"
42
+ description: "Direct query (alternative to messages)"
43
+ mode:
44
+ type: "string"
45
+ enum: ["rag", "simple"]
46
+ default: "rag"
47
+ description: "Chat mode: 'rag' for knowledge-based answers, 'simple' for direct LLM chat"
48
+ knowledge_sources:
49
+ type: "array"
50
+ items:
51
+ type: "string"
52
+ description: "GitMCP URLs to use as knowledge sources"
53
+ required: ["messages"]
54
+
55
+ output:
56
+ type: "object"
57
+ properties:
58
+ response:
59
+ type: "string"
60
+ description: "Generated answer"
61
+ timestamp:
62
+ type: "string"
63
+ description: "ISO timestamp"
64
+ execution_steps:
65
+ type: "array"
66
+ description: "Detailed execution steps for observability"
67
+ total_duration:
68
+ type: "number"
69
+ description: "Total execution time in milliseconds"
70
+ required: ["response", "timestamp"]
71
+
72
+ logic:
73
+ variables:
74
+ - name: "userQuery"
75
+ type: "string"
76
+ init: '""'
77
+ - name: "allDocuments"
78
+ type: "string"
79
+ init: '""'
80
+
81
+ workflow:
82
+ # Step 1: Extract user query from messages
83
+ - name: "extract-query"
84
+ type: "output-generator"
85
+ action:
86
+ type: "generate"
87
+ output:
88
+ _extracted: true
89
+
90
+ # Step 2: Mode branch - Simple chat or RAG pipeline
91
+ - name: "mode-check"
92
+ type: "conditional"
93
+ condition: "$input.mode == 'simple'"
94
+ then:
95
+ # Simple mode: Direct LLM chat with conversation history
96
+ - name: "simple-chat"
97
+ type: "rag"
98
+ action:
99
+ query: "$input.query"
100
+ history: "$input.messages"
101
+ mode: "simple"
102
+ result: "ragResult"
103
+ else:
104
+ # RAG mode: Full pipeline with knowledge base
105
+ - name: "vectorize-query"
106
+ type: "gemini-vectorize"
107
+ action:
108
+ action: "embedSingle"
109
+ text: "$input.query"
110
+ result: "queryVector"
111
+
112
+ - name: "check-knowledge"
113
+ type: "chromadb"
114
+ action:
115
+ action: "hasData"
116
+ collection_name: "beddel_knowledge"
117
+ min_count: 5
118
+ result: "hasDataResult"
119
+
120
+ - name: "search-knowledge"
121
+ type: "chromadb"
122
+ action:
123
+ action: "search"
124
+ collection_name: "beddel_knowledge"
125
+ query_vector: "$queryVector.vector"
126
+ limit: 5
127
+ result: "searchResult"
128
+
129
+ - name: "generate-answer"
130
+ type: "rag"
131
+ action:
132
+ query: "$input.query"
133
+ documents: "$searchResult.documents"
134
+ history: "$input.messages"
135
+ mode: "rag"
136
+ result: "ragResult"
137
+
138
+ # Step 3: Deliver final response
139
+ - name: "deliver-response"
140
+ type: "output-generator"
141
+ action:
142
+ type: "generate"
143
+ output:
144
+ response: "$ragResult.response"
145
+ timestamp: "$ragResult.timestamp"
146
+
147
+ output:
148
+ schema:
149
+ response: "$ragResult.response"
150
+ timestamp: "$ragResult.timestamp"
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Chat Agent - Public exports (client-safe)
3
+ */
4
+
5
+ // Schema exports (client-safe)
6
+ export { ChatInputSchema, ChatOutputSchema } from './chat.schema';
7
+ export type { ChatInput, ChatOutput } from './chat.schema';
8
+
9
+ // Type exports (client-safe)
10
+ export type { ChatHandlerParams, ChatHandlerResult, ChatMetadata } from './chat.types';
11
+
12
+ // Metadata (client-safe)
13
+ export const chatMetadata = {
14
+ id: 'chat',
15
+ name: 'Q&A Context Chat Agent',
16
+ description: 'Orchestrates RAG pipeline: vectorization, storage, retrieval and answer generation',
17
+ category: 'chat',
18
+ route: '/agents/chat',
19
+ knowledge_sources: ['gitmcp-agent'],
20
+ tags: ['chat', 'orchestrator', 'rag', 'qa'],
21
+ } as const;
@@ -0,0 +1,130 @@
1
+ import 'server-only';
2
+
3
+ /**
4
+ * ChromaDB Agent Handler - Server-only execution logic
5
+ * Vector storage and retrieval using ChromaDB
6
+ */
7
+
8
+ import type { ExecutionContext } from '../../types/executionContext';
9
+ import type { ChromaDBHandlerParams, ChromaDBHandlerResult, ChromaDBSearchResult } from './chromadb.types';
10
+
11
+ // ChromaDB imports (lazy loaded)
12
+ let chromaClient: any = null;
13
+
14
+ /**
15
+ * Execute ChromaDB operations
16
+ */
17
+ export async function executeChromaDBHandler(
18
+ params: ChromaDBHandlerParams,
19
+ _props: Record<string, string>,
20
+ context: ExecutionContext
21
+ ): Promise<ChromaDBHandlerResult> {
22
+ const action = params.action;
23
+ const collectionName = params.collection_name;
24
+
25
+ if (!collectionName) {
26
+ throw new Error('Missing required ChromaDB input: collection_name');
27
+ }
28
+
29
+ try {
30
+ // Lazy load ChromaDB
31
+ if (!chromaClient) {
32
+ const chromaModule = await import('chromadb');
33
+
34
+ if (process.env.CHROMADB_API_KEY) {
35
+ context.log('[ChromaDB] Initializing CloudClient...');
36
+ chromaClient = new chromaModule.CloudClient({
37
+ apiKey: process.env.CHROMADB_API_KEY,
38
+ tenant: process.env.CHROMADB_TENANT || 'default_tenant',
39
+ database: process.env.CHROMADB_DATABASE || 'dev',
40
+ });
41
+ } else {
42
+ context.log('[ChromaDB] Initializing Local ChromaClient...');
43
+ chromaClient = new chromaModule.ChromaClient({
44
+ path: process.env.CHROMADB_URL || 'http://localhost:8000',
45
+ });
46
+ }
47
+ }
48
+
49
+ if (action === 'hasData') {
50
+ const minCount = params.min_count || 1;
51
+ context.log(`[ChromaDB] Checking data for collection: ${collectionName}`);
52
+
53
+ try {
54
+ const collection = await chromaClient.getCollection({
55
+ name: collectionName,
56
+ embeddingFunction: undefined,
57
+ });
58
+ const count = await collection.count();
59
+ const hasEnoughData = count >= minCount;
60
+
61
+ return { success: true, has_data: hasEnoughData, count };
62
+ } catch {
63
+ return { success: true, has_data: false, count: 0 };
64
+ }
65
+
66
+ } else if (action === 'store') {
67
+ const ids = params.ids;
68
+ const vectors = params.vectors;
69
+ const documents = params.documents;
70
+ const metadatas = params.metadatas;
71
+
72
+ context.log(`[ChromaDB] Storing ${ids?.length || 0} items in ${collectionName}...`);
73
+
74
+ const collection = await chromaClient.getOrCreateCollection({
75
+ name: collectionName,
76
+ embeddingFunction: undefined,
77
+ });
78
+
79
+ await collection.add({
80
+ ids,
81
+ embeddings: vectors,
82
+ documents,
83
+ metadatas,
84
+ });
85
+
86
+ return { success: true, stored_count: ids?.length || 0 };
87
+
88
+ } else if (action === 'search') {
89
+ const queryVector = params.query_vector;
90
+ const limit = params.limit || 5;
91
+
92
+ context.log(`[ChromaDB] Searching ${collectionName}...`);
93
+
94
+ try {
95
+ const collection = await chromaClient.getCollection({
96
+ name: collectionName,
97
+ embeddingFunction: undefined,
98
+ });
99
+
100
+ const results = await collection.query({
101
+ queryEmbeddings: [queryVector],
102
+ nResults: limit,
103
+ });
104
+
105
+ const flatResults: ChromaDBSearchResult[] = (results.documents[0] || []).map(
106
+ (doc: string | null, idx: number) => ({
107
+ text: doc,
108
+ metadata: results.metadatas[0]?.[idx] || null,
109
+ distance: results.distances?.[0]?.[idx] || null,
110
+ })
111
+ );
112
+
113
+ const documentsString = flatResults.map((r) => r.text).join('\n\n---\n\n');
114
+
115
+ return { success: true, results: flatResults, documents: documentsString };
116
+ } catch {
117
+ // Collection doesn't exist - return empty results
118
+ context.log(`[ChromaDB] Collection ${collectionName} not found, returning empty results`);
119
+ return { success: true, results: [], documents: '' };
120
+ }
121
+
122
+ } else {
123
+ throw new Error(`Unknown ChromaDB action: ${action}`);
124
+ }
125
+ } catch (error: unknown) {
126
+ const message = error instanceof Error ? error.message : String(error);
127
+ context.log(`[ChromaDB] Error: ${message}`);
128
+ return { success: false, error: message };
129
+ }
130
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * ChromaDB Agent Schema - Zod validation schemas
3
+ * Safe for both client and server
4
+ */
5
+
6
+ import { z } from 'zod';
7
+
8
+ export const ChromaDBInputSchema = z.object({
9
+ action: z.enum(['hasData', 'store', 'search']),
10
+ collection_name: z.string().min(1),
11
+ min_count: z.number().optional(),
12
+ ids: z.array(z.string()).optional(),
13
+ vectors: z.array(z.array(z.number())).optional(),
14
+ documents: z.array(z.string()).optional(),
15
+ metadatas: z.array(z.record(z.string(), z.unknown())).optional(),
16
+ query_vector: z.array(z.number()).optional(),
17
+ limit: z.number().optional(),
18
+ });
19
+
20
+ export const ChromaDBOutputSchema = z.object({
21
+ success: z.boolean(),
22
+ has_data: z.boolean().optional(),
23
+ count: z.number().optional(),
24
+ stored_count: z.number().optional(),
25
+ results: z.array(z.object({
26
+ text: z.string().nullable(),
27
+ metadata: z.record(z.string(), z.unknown()).nullable(),
28
+ distance: z.number().nullable(),
29
+ })).optional(),
30
+ documents: z.string().optional(),
31
+ error: z.string().optional(),
32
+ });
33
+
34
+ export type ChromaDBInput = z.infer<typeof ChromaDBInputSchema>;
35
+ export type ChromaDBOutput = z.infer<typeof ChromaDBOutputSchema>;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * ChromaDB Agent Types - Shared between client and server
3
+ */
4
+
5
+ /**
6
+ * Parameters for ChromaDB operations
7
+ */
8
+ export interface ChromaDBHandlerParams {
9
+ action: 'hasData' | 'store' | 'search';
10
+ collection_name: string;
11
+ min_count?: number;
12
+ ids?: string[];
13
+ vectors?: number[][];
14
+ documents?: string[];
15
+ metadatas?: Record<string, unknown>[];
16
+ query_vector?: number[];
17
+ limit?: number;
18
+ }
19
+
20
+ /**
21
+ * Search result item
22
+ */
23
+ export interface ChromaDBSearchResult {
24
+ text: string | null;
25
+ metadata: Record<string, unknown> | null;
26
+ distance: number | null;
27
+ }
28
+
29
+ /**
30
+ * Result from ChromaDB operations
31
+ */
32
+ export interface ChromaDBHandlerResult {
33
+ success: boolean;
34
+ has_data?: boolean;
35
+ count?: number;
36
+ stored_count?: number;
37
+ results?: ChromaDBSearchResult[];
38
+ documents?: string;
39
+ error?: string;
40
+ }
41
+
42
+ /**
43
+ * ChromaDB agent metadata
44
+ */
45
+ export interface ChromaDBMetadata {
46
+ id: 'chromadb';
47
+ name: string;
48
+ description: string;
49
+ category: 'database';
50
+ route: '/agents/chromadb';
51
+ tags: string[];
52
+ }