expxagents 0.25.1 → 0.25.2

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 (594) hide show
  1. package/assets/agents/_catalog.yaml +35 -0
  2. package/assets/agents/accounting/accountant.agent.md +41 -0
  3. package/assets/agents/accounting/audit-analyst.agent.md +41 -0
  4. package/assets/agents/accounting/financial-reporting.agent.md +41 -0
  5. package/assets/agents/accounting/fiscal-analyst.agent.md +41 -0
  6. package/assets/agents/accounting/payroll-specialist.agent.md +41 -0
  7. package/assets/agents/accounting/tax-compliance.agent.md +41 -0
  8. package/assets/agents/administrative/document-controller.agent.md +41 -0
  9. package/assets/agents/administrative/office-manager.agent.md +41 -0
  10. package/assets/agents/administrative/process-documentation-officer.agent.md +41 -0
  11. package/assets/agents/administrative/procurement-specialist.agent.md +41 -0
  12. package/assets/agents/board/board-report-writer.agent.md +41 -0
  13. package/assets/agents/board/business-intelligence.agent.md +41 -0
  14. package/assets/agents/board/governance-officer.agent.md +41 -0
  15. package/assets/agents/board/okr-manager.agent.md +41 -0
  16. package/assets/agents/board/risk-analyst.agent.md +41 -0
  17. package/assets/agents/board/strategic-advisor.agent.md +41 -0
  18. package/assets/agents/commercial/account-executive.agent.md +41 -0
  19. package/assets/agents/commercial/crm-manager.agent.md +41 -0
  20. package/assets/agents/commercial/pricing-strategist.agent.md +41 -0
  21. package/assets/agents/commercial/proposal-writer.agent.md +41 -0
  22. package/assets/agents/commercial/sdr.agent.md +41 -0
  23. package/assets/agents/compliance/compliance-officer.agent.md +41 -0
  24. package/assets/agents/compliance/data-privacy-specialist.agent.md +41 -0
  25. package/assets/agents/compliance/internal-auditor.agent.md +41 -0
  26. package/assets/agents/compliance/regulatory-monitor.agent.md +41 -0
  27. package/assets/agents/customer-success/churn-prevention.agent.md +41 -0
  28. package/assets/agents/customer-success/csm.agent.md +41 -0
  29. package/assets/agents/customer-success/expansion-manager.agent.md +41 -0
  30. package/assets/agents/customer-success/nps-analyst.agent.md +41 -0
  31. package/assets/agents/customer-success/renewal-manager.agent.md +41 -0
  32. package/assets/agents/development/android-developer.agent.md +41 -0
  33. package/assets/agents/development/backend-developer.agent.md +42 -0
  34. package/assets/agents/development/business-analyst.agent.md +41 -0
  35. package/assets/agents/development/code-reviewer.agent.md +41 -0
  36. package/assets/agents/development/cross-platform-mobile.agent.md +41 -0
  37. package/assets/agents/development/dba.agent.md +41 -0
  38. package/assets/agents/development/desktop-developer.agent.md +41 -0
  39. package/assets/agents/development/devops-engineer.agent.md +41 -0
  40. package/assets/agents/development/frontend-developer.agent.md +103 -0
  41. package/assets/agents/development/ios-developer.agent.md +41 -0
  42. package/assets/agents/development/product-manager.agent.md +41 -0
  43. package/assets/agents/development/qa-engineer.agent.md +41 -0
  44. package/assets/agents/development/scrum-master.agent.md +41 -0
  45. package/assets/agents/development/security-analyst.agent.md +41 -0
  46. package/assets/agents/development/tech-lead.agent.md +42 -0
  47. package/assets/agents/development/tech-writer.agent.md +41 -0
  48. package/assets/agents/development/ux-design-expert.agent.md +108 -0
  49. package/assets/agents/development/ux-designer.agent.md +41 -0
  50. package/assets/agents/finance/accounts-manager.agent.md +41 -0
  51. package/assets/agents/finance/billing-analyst.agent.md +41 -0
  52. package/assets/agents/finance/budget-planner.agent.md +41 -0
  53. package/assets/agents/finance/financial-controller.agent.md +41 -0
  54. package/assets/agents/hr/benefits-manager.agent.md +41 -0
  55. package/assets/agents/hr/hr-onboarding.agent.md +41 -0
  56. package/assets/agents/hr/interview-coordinator.agent.md +41 -0
  57. package/assets/agents/hr/people-culture.agent.md +41 -0
  58. package/assets/agents/hr/performance-analyst.agent.md +41 -0
  59. package/assets/agents/hr/recruiter.agent.md +41 -0
  60. package/assets/agents/implantation/deployment-manager.agent.md +41 -0
  61. package/assets/agents/implantation/environment-specialist.agent.md +41 -0
  62. package/assets/agents/implantation/go-live-coordinator.agent.md +41 -0
  63. package/assets/agents/implantation/integration-specialist.agent.md +41 -0
  64. package/assets/agents/implantation/migration-specialist.agent.md +41 -0
  65. package/assets/agents/legal/contract-manager.agent.md +41 -0
  66. package/assets/agents/legal/ip-specialist.agent.md +41 -0
  67. package/assets/agents/legal/labor-attorney.agent.md +41 -0
  68. package/assets/agents/legal/legal-counsel.agent.md +41 -0
  69. package/assets/agents/marketing/brand-guardian.agent.md +40 -0
  70. package/assets/agents/marketing/content-creator.agent.md +41 -0
  71. package/assets/agents/marketing/email-marketing.agent.md +41 -0
  72. package/assets/agents/marketing/landing-page-builder.agent.md +138 -0
  73. package/assets/agents/marketing/marketing-analyst.agent.md +41 -0
  74. package/assets/agents/marketing/paid-ads-manager.agent.md +41 -0
  75. package/assets/agents/marketing/seo-specialist.agent.md +41 -0
  76. package/assets/agents/marketing/social-media-manager.agent.md +41 -0
  77. package/assets/agents/rnd/benchmark-analyst.agent.md +41 -0
  78. package/assets/agents/rnd/innovation-scout.agent.md +41 -0
  79. package/assets/agents/rnd/market-researcher.agent.md +41 -0
  80. package/assets/agents/rnd/product-analyst.agent.md +41 -0
  81. package/assets/agents/rnd/prototype-builder.agent.md +41 -0
  82. package/assets/agents/support/knowledge-base-manager.agent.md +41 -0
  83. package/assets/agents/support/l1-support.agent.md +41 -0
  84. package/assets/agents/support/l2-support.agent.md +41 -0
  85. package/assets/agents/support/l3-support.agent.md +41 -0
  86. package/assets/agents/support/sla-monitor.agent.md +41 -0
  87. package/assets/agents/training/assessment-creator.agent.md +41 -0
  88. package/assets/agents/training/onboarding-coach.agent.md +41 -0
  89. package/assets/agents/training/training-designer.agent.md +41 -0
  90. package/assets/agents/training/workshop-facilitator.agent.md +41 -0
  91. package/assets/core/best-practices/_catalog.yaml +91 -0
  92. package/assets/core/best-practices/api-documentation.md +137 -0
  93. package/assets/core/best-practices/blog-post.md +86 -0
  94. package/assets/core/best-practices/blog-seo.md +91 -0
  95. package/assets/core/best-practices/code-review.md +97 -0
  96. package/assets/core/best-practices/copywriting.md +75 -0
  97. package/assets/core/best-practices/data-analysis.md +93 -0
  98. package/assets/core/best-practices/deploy-checklist.md +99 -0
  99. package/assets/core/best-practices/email-newsletter.md +84 -0
  100. package/assets/core/best-practices/email-sales.md +91 -0
  101. package/assets/core/best-practices/fullstack-page-generation.md +936 -0
  102. package/assets/core/best-practices/image-design.md +78 -0
  103. package/assets/core/best-practices/instagram-feed.md +70 -0
  104. package/assets/core/best-practices/instagram-reels.md +75 -0
  105. package/assets/core/best-practices/instagram-stories.md +68 -0
  106. package/assets/core/best-practices/landing-page-react.md +2263 -0
  107. package/assets/core/best-practices/landing-page.md +279 -0
  108. package/assets/core/best-practices/linkedin-article.md +83 -0
  109. package/assets/core/best-practices/linkedin-post.md +84 -0
  110. package/assets/core/best-practices/researching.md +89 -0
  111. package/assets/core/best-practices/review.md +95 -0
  112. package/assets/core/best-practices/sprint-planning.md +91 -0
  113. package/assets/core/best-practices/strategist.md +95 -0
  114. package/assets/core/best-practices/technical-writing.md +104 -0
  115. package/assets/core/best-practices/twitter-post.md +75 -0
  116. package/assets/core/best-practices/twitter-thread.md +92 -0
  117. package/assets/core/best-practices/whatsapp-broadcast.md +95 -0
  118. package/assets/core/best-practices/youtube-script.md +80 -0
  119. package/assets/core/best-practices/youtube-shorts.md +76 -0
  120. package/assets/core/prompts/insight-hunter.prompt.md +62 -0
  121. package/assets/core/runner.pipeline.md +200 -0
  122. package/assets/core/skills.engine.md +65 -0
  123. package/assets/core/solution-architect.agent.md +329 -0
  124. package/assets/mcps/_catalog.yaml +17 -0
  125. package/assets/mcps/figma.mcp.yaml +35 -0
  126. package/assets/mcps/github.mcp.yaml +44 -0
  127. package/assets/mcps/linear.mcp.yaml +37 -0
  128. package/assets/mcps/notion.mcp.yaml +37 -0
  129. package/assets/mcps/pencil.mcp.yaml +32 -0
  130. package/assets/mcps/postgresql.mcp.yaml +39 -0
  131. package/assets/mcps/sentry.mcp.yaml +41 -0
  132. package/assets/mcps/slack.mcp.yaml +37 -0
  133. package/assets/mcps/vercel.mcp.yaml +39 -0
  134. package/assets/templates/_expxagents/_memory/company.md +25 -0
  135. package/assets/templates/_expxagents/_memory/preferences.md +6 -0
  136. package/assets/templates/squads/_memory/memories.md +16 -0
  137. package/dist/dashboard/assets/BufferResource-D79vaoFm.js +185 -0
  138. package/dist/dashboard/assets/CanvasRenderer-BUoxTNKV.js +1 -0
  139. package/dist/dashboard/assets/JarvisView-DSN7xWMz.js +1 -0
  140. package/dist/dashboard/assets/RenderTargetSystem-B7rwTXA1.js +172 -0
  141. package/dist/dashboard/assets/ThreeBackground-BQTdScX-.js +1 -0
  142. package/dist/dashboard/assets/WebGLRenderer-DgdVNsZ9.js +156 -0
  143. package/dist/dashboard/assets/WebGPURenderer-DnQNvjEQ.js +41 -0
  144. package/dist/dashboard/assets/browserAll-Cbsk7DE4.js +14 -0
  145. package/dist/dashboard/assets/index-CrlhoBta.js +783 -0
  146. package/dist/dashboard/assets/index-DtbIzZ5n.css +1 -0
  147. package/dist/dashboard/assets/three-BZk_I9Ly.js +4057 -0
  148. package/dist/dashboard/assets/webworkerAll-BLmfReEj.js +83 -0
  149. package/dist/dashboard/index.html +13 -0
  150. package/dist/server/api/__tests__/cost-routes.test.d.ts +2 -0
  151. package/dist/server/api/__tests__/cost-routes.test.d.ts.map +1 -0
  152. package/dist/server/api/__tests__/cost-routes.test.js +54 -0
  153. package/dist/server/api/__tests__/cost-routes.test.js.map +1 -0
  154. package/dist/server/api/__tests__/files-routes.test.d.ts +2 -0
  155. package/dist/server/api/__tests__/files-routes.test.d.ts.map +1 -0
  156. package/dist/server/api/__tests__/files-routes.test.js +85 -0
  157. package/dist/server/api/__tests__/files-routes.test.js.map +1 -0
  158. package/dist/server/api/__tests__/graph-routes.test.d.ts +2 -0
  159. package/dist/server/api/__tests__/graph-routes.test.d.ts.map +1 -0
  160. package/dist/server/api/__tests__/graph-routes.test.js +105 -0
  161. package/dist/server/api/__tests__/graph-routes.test.js.map +1 -0
  162. package/dist/server/api/__tests__/health-routes.test.d.ts +2 -0
  163. package/dist/server/api/__tests__/health-routes.test.d.ts.map +1 -0
  164. package/dist/server/api/__tests__/health-routes.test.js +22 -0
  165. package/dist/server/api/__tests__/health-routes.test.js.map +1 -0
  166. package/dist/server/api/__tests__/integration-routes.test.d.ts +2 -0
  167. package/dist/server/api/__tests__/integration-routes.test.d.ts.map +1 -0
  168. package/dist/server/api/__tests__/integration-routes.test.js +243 -0
  169. package/dist/server/api/__tests__/integration-routes.test.js.map +1 -0
  170. package/dist/server/api/__tests__/kanban-routes.test.d.ts +2 -0
  171. package/dist/server/api/__tests__/kanban-routes.test.d.ts.map +1 -0
  172. package/dist/server/api/__tests__/kanban-routes.test.js +316 -0
  173. package/dist/server/api/__tests__/kanban-routes.test.js.map +1 -0
  174. package/dist/server/api/__tests__/log-routes.test.d.ts +2 -0
  175. package/dist/server/api/__tests__/log-routes.test.d.ts.map +1 -0
  176. package/dist/server/api/__tests__/log-routes.test.js +35 -0
  177. package/dist/server/api/__tests__/log-routes.test.js.map +1 -0
  178. package/dist/server/api/__tests__/orgchart-routes.test.d.ts +2 -0
  179. package/dist/server/api/__tests__/orgchart-routes.test.d.ts.map +1 -0
  180. package/dist/server/api/__tests__/orgchart-routes.test.js +161 -0
  181. package/dist/server/api/__tests__/orgchart-routes.test.js.map +1 -0
  182. package/dist/server/api/__tests__/settings-routes.test.d.ts +2 -0
  183. package/dist/server/api/__tests__/settings-routes.test.d.ts.map +1 -0
  184. package/dist/server/api/__tests__/settings-routes.test.js +177 -0
  185. package/dist/server/api/__tests__/settings-routes.test.js.map +1 -0
  186. package/dist/server/api/__tests__/system-routes.test.d.ts +2 -0
  187. package/dist/server/api/__tests__/system-routes.test.d.ts.map +1 -0
  188. package/dist/server/api/__tests__/system-routes.test.js +79 -0
  189. package/dist/server/api/__tests__/system-routes.test.js.map +1 -0
  190. package/dist/server/api/__tests__/team-routes.test.d.ts +2 -0
  191. package/dist/server/api/__tests__/team-routes.test.d.ts.map +1 -0
  192. package/dist/server/api/__tests__/team-routes.test.js +116 -0
  193. package/dist/server/api/__tests__/team-routes.test.js.map +1 -0
  194. package/dist/server/api/__tests__/webhook-routes.test.d.ts +2 -0
  195. package/dist/server/api/__tests__/webhook-routes.test.d.ts.map +1 -0
  196. package/dist/server/api/__tests__/webhook-routes.test.js +111 -0
  197. package/dist/server/api/__tests__/webhook-routes.test.js.map +1 -0
  198. package/dist/server/api/activity-routes.d.ts +8 -0
  199. package/dist/server/api/activity-routes.d.ts.map +1 -0
  200. package/dist/server/api/activity-routes.js +34 -0
  201. package/dist/server/api/activity-routes.js.map +1 -0
  202. package/dist/server/api/chat-api-routes.d.ts +4 -0
  203. package/dist/server/api/chat-api-routes.d.ts.map +1 -0
  204. package/dist/server/api/chat-api-routes.js +28 -0
  205. package/dist/server/api/chat-api-routes.js.map +1 -0
  206. package/dist/server/api/cost-routes.d.ts +8 -0
  207. package/dist/server/api/cost-routes.d.ts.map +1 -0
  208. package/dist/server/api/cost-routes.js +39 -0
  209. package/dist/server/api/cost-routes.js.map +1 -0
  210. package/dist/server/api/dashboard-routes.d.ts +10 -0
  211. package/dist/server/api/dashboard-routes.d.ts.map +1 -0
  212. package/dist/server/api/dashboard-routes.js +128 -0
  213. package/dist/server/api/dashboard-routes.js.map +1 -0
  214. package/dist/server/api/files-routes.d.ts +5 -0
  215. package/dist/server/api/files-routes.d.ts.map +1 -0
  216. package/dist/server/api/files-routes.js +218 -0
  217. package/dist/server/api/files-routes.js.map +1 -0
  218. package/dist/server/api/graph-routes.d.ts +24 -0
  219. package/dist/server/api/graph-routes.d.ts.map +1 -0
  220. package/dist/server/api/graph-routes.js +208 -0
  221. package/dist/server/api/graph-routes.js.map +1 -0
  222. package/dist/server/api/health-routes.d.ts +9 -0
  223. package/dist/server/api/health-routes.d.ts.map +1 -0
  224. package/dist/server/api/health-routes.js +46 -0
  225. package/dist/server/api/health-routes.js.map +1 -0
  226. package/dist/server/api/integration-routes.d.ts +23 -0
  227. package/dist/server/api/integration-routes.d.ts.map +1 -0
  228. package/dist/server/api/integration-routes.js +326 -0
  229. package/dist/server/api/integration-routes.js.map +1 -0
  230. package/dist/server/api/kanban-routes.d.ts +8 -0
  231. package/dist/server/api/kanban-routes.d.ts.map +1 -0
  232. package/dist/server/api/kanban-routes.js +128 -0
  233. package/dist/server/api/kanban-routes.js.map +1 -0
  234. package/dist/server/api/knowledge-routes.d.ts +8 -0
  235. package/dist/server/api/knowledge-routes.d.ts.map +1 -0
  236. package/dist/server/api/knowledge-routes.js +82 -0
  237. package/dist/server/api/knowledge-routes.js.map +1 -0
  238. package/dist/server/api/log-routes.d.ts +8 -0
  239. package/dist/server/api/log-routes.d.ts.map +1 -0
  240. package/dist/server/api/log-routes.js +31 -0
  241. package/dist/server/api/log-routes.js.map +1 -0
  242. package/dist/server/api/orgchart-routes.d.ts +7 -0
  243. package/dist/server/api/orgchart-routes.d.ts.map +1 -0
  244. package/dist/server/api/orgchart-routes.js +154 -0
  245. package/dist/server/api/orgchart-routes.js.map +1 -0
  246. package/dist/server/api/permissions-routes.d.ts +8 -0
  247. package/dist/server/api/permissions-routes.d.ts.map +1 -0
  248. package/dist/server/api/permissions-routes.js +37 -0
  249. package/dist/server/api/permissions-routes.js.map +1 -0
  250. package/dist/server/api/registry-routes.d.ts +7 -0
  251. package/dist/server/api/registry-routes.d.ts.map +1 -0
  252. package/dist/server/api/registry-routes.js +51 -0
  253. package/dist/server/api/registry-routes.js.map +1 -0
  254. package/dist/server/api/settings-routes.d.ts +11 -0
  255. package/dist/server/api/settings-routes.d.ts.map +1 -0
  256. package/dist/server/api/settings-routes.js +167 -0
  257. package/dist/server/api/settings-routes.js.map +1 -0
  258. package/dist/server/api/squads-routes.d.ts +9 -0
  259. package/dist/server/api/squads-routes.d.ts.map +1 -0
  260. package/dist/server/api/squads-routes.js +171 -0
  261. package/dist/server/api/squads-routes.js.map +1 -0
  262. package/dist/server/api/system-routes.d.ts +9 -0
  263. package/dist/server/api/system-routes.d.ts.map +1 -0
  264. package/dist/server/api/system-routes.js +241 -0
  265. package/dist/server/api/system-routes.js.map +1 -0
  266. package/dist/server/api/team-routes.d.ts +8 -0
  267. package/dist/server/api/team-routes.d.ts.map +1 -0
  268. package/dist/server/api/team-routes.js +55 -0
  269. package/dist/server/api/team-routes.js.map +1 -0
  270. package/dist/server/api/users-routes.d.ts +8 -0
  271. package/dist/server/api/users-routes.d.ts.map +1 -0
  272. package/dist/server/api/users-routes.js +65 -0
  273. package/dist/server/api/users-routes.js.map +1 -0
  274. package/dist/server/api/webhook-routes.d.ts +9 -0
  275. package/dist/server/api/webhook-routes.d.ts.map +1 -0
  276. package/dist/server/api/webhook-routes.js +82 -0
  277. package/dist/server/api/webhook-routes.js.map +1 -0
  278. package/dist/server/app.d.ts +9 -0
  279. package/dist/server/app.d.ts.map +1 -0
  280. package/dist/server/app.js +265 -0
  281. package/dist/server/app.js.map +1 -0
  282. package/dist/server/auth/auth-middleware.d.ts +13 -0
  283. package/dist/server/auth/auth-middleware.d.ts.map +1 -0
  284. package/dist/server/auth/auth-middleware.js +25 -0
  285. package/dist/server/auth/auth-middleware.js.map +1 -0
  286. package/dist/server/auth/auth-routes.d.ts +9 -0
  287. package/dist/server/auth/auth-routes.d.ts.map +1 -0
  288. package/dist/server/auth/auth-routes.js +152 -0
  289. package/dist/server/auth/auth-routes.js.map +1 -0
  290. package/dist/server/auth/jwt.d.ts +14 -0
  291. package/dist/server/auth/jwt.d.ts.map +1 -0
  292. package/dist/server/auth/jwt.js +16 -0
  293. package/dist/server/auth/jwt.js.map +1 -0
  294. package/dist/server/auth/password.d.ts +3 -0
  295. package/dist/server/auth/password.d.ts.map +1 -0
  296. package/dist/server/auth/password.js +9 -0
  297. package/dist/server/auth/password.js.map +1 -0
  298. package/dist/server/bridge/__tests__/chat-handler.test.d.ts +2 -0
  299. package/dist/server/bridge/__tests__/chat-handler.test.d.ts.map +1 -0
  300. package/dist/server/bridge/__tests__/chat-handler.test.js +143 -0
  301. package/dist/server/bridge/__tests__/chat-handler.test.js.map +1 -0
  302. package/dist/server/bridge/__tests__/chat-integration.test.d.ts +2 -0
  303. package/dist/server/bridge/__tests__/chat-integration.test.d.ts.map +1 -0
  304. package/dist/server/bridge/__tests__/chat-integration.test.js +129 -0
  305. package/dist/server/bridge/__tests__/chat-integration.test.js.map +1 -0
  306. package/dist/server/bridge/__tests__/claude-bridge.test.d.ts +2 -0
  307. package/dist/server/bridge/__tests__/claude-bridge.test.d.ts.map +1 -0
  308. package/dist/server/bridge/__tests__/claude-bridge.test.js +300 -0
  309. package/dist/server/bridge/__tests__/claude-bridge.test.js.map +1 -0
  310. package/dist/server/bridge/__tests__/conversation.test.d.ts +2 -0
  311. package/dist/server/bridge/__tests__/conversation.test.d.ts.map +1 -0
  312. package/dist/server/bridge/__tests__/conversation.test.js +168 -0
  313. package/dist/server/bridge/__tests__/conversation.test.js.map +1 -0
  314. package/dist/server/bridge/__tests__/registry.test.d.ts +2 -0
  315. package/dist/server/bridge/__tests__/registry.test.d.ts.map +1 -0
  316. package/dist/server/bridge/__tests__/registry.test.js +45 -0
  317. package/dist/server/bridge/__tests__/registry.test.js.map +1 -0
  318. package/dist/server/bridge/__tests__/stream-parser.test.d.ts +2 -0
  319. package/dist/server/bridge/__tests__/stream-parser.test.d.ts.map +1 -0
  320. package/dist/server/bridge/__tests__/stream-parser.test.js +66 -0
  321. package/dist/server/bridge/__tests__/stream-parser.test.js.map +1 -0
  322. package/dist/server/bridge/chat-handler.d.ts +32 -0
  323. package/dist/server/bridge/chat-handler.d.ts.map +1 -0
  324. package/dist/server/bridge/chat-handler.js +356 -0
  325. package/dist/server/bridge/chat-handler.js.map +1 -0
  326. package/dist/server/bridge/claude-bridge.d.ts +21 -0
  327. package/dist/server/bridge/claude-bridge.d.ts.map +1 -0
  328. package/dist/server/bridge/claude-bridge.js +273 -0
  329. package/dist/server/bridge/claude-bridge.js.map +1 -0
  330. package/dist/server/bridge/conversation.d.ts +45 -0
  331. package/dist/server/bridge/conversation.d.ts.map +1 -0
  332. package/dist/server/bridge/conversation.js +78 -0
  333. package/dist/server/bridge/conversation.js.map +1 -0
  334. package/dist/server/bridge/engine-manager.d.ts +13 -0
  335. package/dist/server/bridge/engine-manager.d.ts.map +1 -0
  336. package/dist/server/bridge/engine-manager.js +54 -0
  337. package/dist/server/bridge/engine-manager.js.map +1 -0
  338. package/dist/server/bridge/engine.d.ts +37 -0
  339. package/dist/server/bridge/engine.d.ts.map +1 -0
  340. package/dist/server/bridge/engine.js +2 -0
  341. package/dist/server/bridge/engine.js.map +1 -0
  342. package/dist/server/bridge/factory.d.ts +4 -0
  343. package/dist/server/bridge/factory.d.ts.map +1 -0
  344. package/dist/server/bridge/factory.js +18 -0
  345. package/dist/server/bridge/factory.js.map +1 -0
  346. package/dist/server/bridge/opencode-bridge.d.ts +27 -0
  347. package/dist/server/bridge/opencode-bridge.d.ts.map +1 -0
  348. package/dist/server/bridge/opencode-bridge.js +163 -0
  349. package/dist/server/bridge/opencode-bridge.js.map +1 -0
  350. package/dist/server/bridge/registry.d.ts +19 -0
  351. package/dist/server/bridge/registry.d.ts.map +1 -0
  352. package/dist/server/bridge/registry.js +29 -0
  353. package/dist/server/bridge/registry.js.map +1 -0
  354. package/dist/server/bridge/session-journal.d.ts +25 -0
  355. package/dist/server/bridge/session-journal.d.ts.map +1 -0
  356. package/dist/server/bridge/session-journal.js +69 -0
  357. package/dist/server/bridge/session-journal.js.map +1 -0
  358. package/dist/server/bridge/stream-parser.d.ts +14 -0
  359. package/dist/server/bridge/stream-parser.d.ts.map +1 -0
  360. package/dist/server/bridge/stream-parser.js +26 -0
  361. package/dist/server/bridge/stream-parser.js.map +1 -0
  362. package/dist/server/config/engine-config.d.ts +4 -0
  363. package/dist/server/config/engine-config.d.ts.map +1 -0
  364. package/dist/server/config/engine-config.js +24 -0
  365. package/dist/server/config/engine-config.js.map +1 -0
  366. package/dist/server/config.d.ts +17 -0
  367. package/dist/server/config.d.ts.map +1 -0
  368. package/dist/server/config.js +39 -0
  369. package/dist/server/config.js.map +1 -0
  370. package/dist/server/db/__tests__/chat-tables.test.d.ts +2 -0
  371. package/dist/server/db/__tests__/chat-tables.test.d.ts.map +1 -0
  372. package/dist/server/db/__tests__/chat-tables.test.js +82 -0
  373. package/dist/server/db/__tests__/chat-tables.test.js.map +1 -0
  374. package/dist/server/db/__tests__/email-schema.test.d.ts +2 -0
  375. package/dist/server/db/__tests__/email-schema.test.d.ts.map +1 -0
  376. package/dist/server/db/__tests__/email-schema.test.js +53 -0
  377. package/dist/server/db/__tests__/email-schema.test.js.map +1 -0
  378. package/dist/server/db/__tests__/scheduler-schema.test.d.ts +2 -0
  379. package/dist/server/db/__tests__/scheduler-schema.test.d.ts.map +1 -0
  380. package/dist/server/db/__tests__/scheduler-schema.test.js +52 -0
  381. package/dist/server/db/__tests__/scheduler-schema.test.js.map +1 -0
  382. package/dist/server/db/connection.d.ts +4 -0
  383. package/dist/server/db/connection.d.ts.map +1 -0
  384. package/dist/server/db/connection.js +40 -0
  385. package/dist/server/db/connection.js.map +1 -0
  386. package/dist/server/db/migrations.d.ts +4 -0
  387. package/dist/server/db/migrations.d.ts.map +1 -0
  388. package/dist/server/db/migrations.js +47 -0
  389. package/dist/server/db/migrations.js.map +1 -0
  390. package/dist/server/db/schema.d.ts +2 -0
  391. package/dist/server/db/schema.d.ts.map +1 -0
  392. package/dist/server/db/schema.js +288 -0
  393. package/dist/server/db/schema.js.map +1 -0
  394. package/dist/server/email/__tests__/campaign-routes.test.d.ts +2 -0
  395. package/dist/server/email/__tests__/campaign-routes.test.d.ts.map +1 -0
  396. package/dist/server/email/__tests__/campaign-routes.test.js +216 -0
  397. package/dist/server/email/__tests__/campaign-routes.test.js.map +1 -0
  398. package/dist/server/email/__tests__/campaign-service.test.d.ts +2 -0
  399. package/dist/server/email/__tests__/campaign-service.test.d.ts.map +1 -0
  400. package/dist/server/email/__tests__/campaign-service.test.js +79 -0
  401. package/dist/server/email/__tests__/campaign-service.test.js.map +1 -0
  402. package/dist/server/email/__tests__/email-queue-worker.test.d.ts +2 -0
  403. package/dist/server/email/__tests__/email-queue-worker.test.d.ts.map +1 -0
  404. package/dist/server/email/__tests__/email-queue-worker.test.js +93 -0
  405. package/dist/server/email/__tests__/email-queue-worker.test.js.map +1 -0
  406. package/dist/server/email/__tests__/email-utils.test.d.ts +2 -0
  407. package/dist/server/email/__tests__/email-utils.test.d.ts.map +1 -0
  408. package/dist/server/email/__tests__/email-utils.test.js +36 -0
  409. package/dist/server/email/__tests__/email-utils.test.js.map +1 -0
  410. package/dist/server/email/__tests__/lead-routes.test.d.ts +2 -0
  411. package/dist/server/email/__tests__/lead-routes.test.d.ts.map +1 -0
  412. package/dist/server/email/__tests__/lead-routes.test.js +180 -0
  413. package/dist/server/email/__tests__/lead-routes.test.js.map +1 -0
  414. package/dist/server/email/__tests__/lead-service.test.d.ts +2 -0
  415. package/dist/server/email/__tests__/lead-service.test.d.ts.map +1 -0
  416. package/dist/server/email/__tests__/lead-service.test.js +113 -0
  417. package/dist/server/email/__tests__/lead-service.test.js.map +1 -0
  418. package/dist/server/email/__tests__/ses-client.test.d.ts +2 -0
  419. package/dist/server/email/__tests__/ses-client.test.d.ts.map +1 -0
  420. package/dist/server/email/__tests__/ses-client.test.js +48 -0
  421. package/dist/server/email/__tests__/ses-client.test.js.map +1 -0
  422. package/dist/server/email/__tests__/sns-webhook.test.d.ts +2 -0
  423. package/dist/server/email/__tests__/sns-webhook.test.d.ts.map +1 -0
  424. package/dist/server/email/__tests__/sns-webhook.test.js +40 -0
  425. package/dist/server/email/__tests__/sns-webhook.test.js.map +1 -0
  426. package/dist/server/email/campaign-routes.d.ts +8 -0
  427. package/dist/server/email/campaign-routes.d.ts.map +1 -0
  428. package/dist/server/email/campaign-routes.js +65 -0
  429. package/dist/server/email/campaign-routes.js.map +1 -0
  430. package/dist/server/email/campaign-service.d.ts +55 -0
  431. package/dist/server/email/campaign-service.d.ts.map +1 -0
  432. package/dist/server/email/campaign-service.js +89 -0
  433. package/dist/server/email/campaign-service.js.map +1 -0
  434. package/dist/server/email/email-queue-worker.d.ts +27 -0
  435. package/dist/server/email/email-queue-worker.d.ts.map +1 -0
  436. package/dist/server/email/email-queue-worker.js +119 -0
  437. package/dist/server/email/email-queue-worker.js.map +1 -0
  438. package/dist/server/email/email-utils.d.ts +5 -0
  439. package/dist/server/email/email-utils.d.ts.map +1 -0
  440. package/dist/server/email/email-utils.js +24 -0
  441. package/dist/server/email/email-utils.js.map +1 -0
  442. package/dist/server/email/lead-routes.d.ts +8 -0
  443. package/dist/server/email/lead-routes.d.ts.map +1 -0
  444. package/dist/server/email/lead-routes.js +56 -0
  445. package/dist/server/email/lead-routes.js.map +1 -0
  446. package/dist/server/email/lead-service.d.ts +66 -0
  447. package/dist/server/email/lead-service.d.ts.map +1 -0
  448. package/dist/server/email/lead-service.js +138 -0
  449. package/dist/server/email/lead-service.js.map +1 -0
  450. package/dist/server/email/ses-client.d.ts +27 -0
  451. package/dist/server/email/ses-client.d.ts.map +1 -0
  452. package/dist/server/email/ses-client.js +44 -0
  453. package/dist/server/email/ses-client.js.map +1 -0
  454. package/dist/server/email/sns-webhook.d.ts +10 -0
  455. package/dist/server/email/sns-webhook.d.ts.map +1 -0
  456. package/dist/server/email/sns-webhook.js +73 -0
  457. package/dist/server/email/sns-webhook.js.map +1 -0
  458. package/dist/server/index.d.ts +2 -0
  459. package/dist/server/index.d.ts.map +1 -0
  460. package/dist/server/index.js +36 -0
  461. package/dist/server/index.js.map +1 -0
  462. package/dist/server/mcp/expxagents-mcp.d.ts +2 -0
  463. package/dist/server/mcp/expxagents-mcp.d.ts.map +1 -0
  464. package/dist/server/mcp/expxagents-mcp.js +230 -0
  465. package/dist/server/mcp/expxagents-mcp.js.map +1 -0
  466. package/dist/server/routes/__tests__/conversations.test.d.ts +2 -0
  467. package/dist/server/routes/__tests__/conversations.test.d.ts.map +1 -0
  468. package/dist/server/routes/__tests__/conversations.test.js +111 -0
  469. package/dist/server/routes/__tests__/conversations.test.js.map +1 -0
  470. package/dist/server/routes/conversations.d.ts +8 -0
  471. package/dist/server/routes/conversations.d.ts.map +1 -0
  472. package/dist/server/routes/conversations.js +36 -0
  473. package/dist/server/routes/conversations.js.map +1 -0
  474. package/dist/server/scheduler/__tests__/job-runner.test.d.ts +2 -0
  475. package/dist/server/scheduler/__tests__/job-runner.test.d.ts.map +1 -0
  476. package/dist/server/scheduler/__tests__/job-runner.test.js +488 -0
  477. package/dist/server/scheduler/__tests__/job-runner.test.js.map +1 -0
  478. package/dist/server/scheduler/__tests__/scheduler-routes.test.d.ts +2 -0
  479. package/dist/server/scheduler/__tests__/scheduler-routes.test.d.ts.map +1 -0
  480. package/dist/server/scheduler/__tests__/scheduler-routes.test.js +167 -0
  481. package/dist/server/scheduler/__tests__/scheduler-routes.test.js.map +1 -0
  482. package/dist/server/scheduler/__tests__/scheduler-service.test.d.ts +2 -0
  483. package/dist/server/scheduler/__tests__/scheduler-service.test.d.ts.map +1 -0
  484. package/dist/server/scheduler/__tests__/scheduler-service.test.js +207 -0
  485. package/dist/server/scheduler/__tests__/scheduler-service.test.js.map +1 -0
  486. package/dist/server/scheduler/job-runner.d.ts +73 -0
  487. package/dist/server/scheduler/job-runner.d.ts.map +1 -0
  488. package/dist/server/scheduler/job-runner.js +407 -0
  489. package/dist/server/scheduler/job-runner.js.map +1 -0
  490. package/dist/server/scheduler/scheduler-routes.d.ts +10 -0
  491. package/dist/server/scheduler/scheduler-routes.d.ts.map +1 -0
  492. package/dist/server/scheduler/scheduler-routes.js +105 -0
  493. package/dist/server/scheduler/scheduler-routes.js.map +1 -0
  494. package/dist/server/scheduler/scheduler-service.d.ts +55 -0
  495. package/dist/server/scheduler/scheduler-service.d.ts.map +1 -0
  496. package/dist/server/scheduler/scheduler-service.js +271 -0
  497. package/dist/server/scheduler/scheduler-service.js.map +1 -0
  498. package/dist/server/services/__tests__/cost-service.test.d.ts +2 -0
  499. package/dist/server/services/__tests__/cost-service.test.d.ts.map +1 -0
  500. package/dist/server/services/__tests__/cost-service.test.js +72 -0
  501. package/dist/server/services/__tests__/cost-service.test.js.map +1 -0
  502. package/dist/server/services/__tests__/execution-log-service.test.d.ts +2 -0
  503. package/dist/server/services/__tests__/execution-log-service.test.d.ts.map +1 -0
  504. package/dist/server/services/__tests__/execution-log-service.test.js +40 -0
  505. package/dist/server/services/__tests__/execution-log-service.test.js.map +1 -0
  506. package/dist/server/services/__tests__/integration-registry.test.d.ts +2 -0
  507. package/dist/server/services/__tests__/integration-registry.test.d.ts.map +1 -0
  508. package/dist/server/services/__tests__/integration-registry.test.js +28 -0
  509. package/dist/server/services/__tests__/integration-registry.test.js.map +1 -0
  510. package/dist/server/services/__tests__/log-service.test.d.ts +2 -0
  511. package/dist/server/services/__tests__/log-service.test.d.ts.map +1 -0
  512. package/dist/server/services/__tests__/log-service.test.js +49 -0
  513. package/dist/server/services/__tests__/log-service.test.js.map +1 -0
  514. package/dist/server/services/__tests__/permissions-service.test.d.ts +2 -0
  515. package/dist/server/services/__tests__/permissions-service.test.d.ts.map +1 -0
  516. package/dist/server/services/__tests__/permissions-service.test.js +46 -0
  517. package/dist/server/services/__tests__/permissions-service.test.js.map +1 -0
  518. package/dist/server/services/__tests__/pipeline-task-service.test.d.ts +2 -0
  519. package/dist/server/services/__tests__/pipeline-task-service.test.d.ts.map +1 -0
  520. package/dist/server/services/__tests__/pipeline-task-service.test.js +268 -0
  521. package/dist/server/services/__tests__/pipeline-task-service.test.js.map +1 -0
  522. package/dist/server/services/__tests__/state-service.test.d.ts +2 -0
  523. package/dist/server/services/__tests__/state-service.test.d.ts.map +1 -0
  524. package/dist/server/services/__tests__/state-service.test.js +136 -0
  525. package/dist/server/services/__tests__/state-service.test.js.map +1 -0
  526. package/dist/server/services/activity-service.d.ts +35 -0
  527. package/dist/server/services/activity-service.d.ts.map +1 -0
  528. package/dist/server/services/activity-service.js +92 -0
  529. package/dist/server/services/activity-service.js.map +1 -0
  530. package/dist/server/services/cost-service.d.ts +55 -0
  531. package/dist/server/services/cost-service.d.ts.map +1 -0
  532. package/dist/server/services/cost-service.js +59 -0
  533. package/dist/server/services/cost-service.js.map +1 -0
  534. package/dist/server/services/execution-log-service.d.ts +20 -0
  535. package/dist/server/services/execution-log-service.d.ts.map +1 -0
  536. package/dist/server/services/execution-log-service.js +17 -0
  537. package/dist/server/services/execution-log-service.js.map +1 -0
  538. package/dist/server/services/integration-registry.d.ts +9 -0
  539. package/dist/server/services/integration-registry.d.ts.map +1 -0
  540. package/dist/server/services/integration-registry.js +14 -0
  541. package/dist/server/services/integration-registry.js.map +1 -0
  542. package/dist/server/services/log-service.d.ts +28 -0
  543. package/dist/server/services/log-service.d.ts.map +1 -0
  544. package/dist/server/services/log-service.js +34 -0
  545. package/dist/server/services/log-service.js.map +1 -0
  546. package/dist/server/services/permissions-service.d.ts +10 -0
  547. package/dist/server/services/permissions-service.d.ts.map +1 -0
  548. package/dist/server/services/permissions-service.js +48 -0
  549. package/dist/server/services/permissions-service.js.map +1 -0
  550. package/dist/server/services/pipeline-task-service.d.ts +79 -0
  551. package/dist/server/services/pipeline-task-service.d.ts.map +1 -0
  552. package/dist/server/services/pipeline-task-service.js +122 -0
  553. package/dist/server/services/pipeline-task-service.js.map +1 -0
  554. package/dist/server/services/squad-registry.d.ts +35 -0
  555. package/dist/server/services/squad-registry.d.ts.map +1 -0
  556. package/dist/server/services/squad-registry.js +141 -0
  557. package/dist/server/services/squad-registry.js.map +1 -0
  558. package/dist/server/services/state-service.d.ts +22 -0
  559. package/dist/server/services/state-service.d.ts.map +1 -0
  560. package/dist/server/services/state-service.js +114 -0
  561. package/dist/server/services/state-service.js.map +1 -0
  562. package/dist/server/types/a2ui.d.ts +27 -0
  563. package/dist/server/types/a2ui.d.ts.map +1 -0
  564. package/dist/server/types/a2ui.js +2 -0
  565. package/dist/server/types/a2ui.js.map +1 -0
  566. package/dist/server/utils/find-free-port.d.ts +2 -0
  567. package/dist/server/utils/find-free-port.d.ts.map +1 -0
  568. package/dist/server/utils/find-free-port.js +17 -0
  569. package/dist/server/utils/find-free-port.js.map +1 -0
  570. package/dist/server/watcher/__tests__/file-watcher.test.d.ts +2 -0
  571. package/dist/server/watcher/__tests__/file-watcher.test.d.ts.map +1 -0
  572. package/dist/server/watcher/__tests__/file-watcher.test.js +81 -0
  573. package/dist/server/watcher/__tests__/file-watcher.test.js.map +1 -0
  574. package/dist/server/watcher/file-watcher.d.ts +19 -0
  575. package/dist/server/watcher/file-watcher.d.ts.map +1 -0
  576. package/dist/server/watcher/file-watcher.js +105 -0
  577. package/dist/server/watcher/file-watcher.js.map +1 -0
  578. package/dist/server/watcher/state-parser.d.ts +77 -0
  579. package/dist/server/watcher/state-parser.d.ts.map +1 -0
  580. package/dist/server/watcher/state-parser.js +78 -0
  581. package/dist/server/watcher/state-parser.js.map +1 -0
  582. package/dist/server/ws/ws-auth.d.ts +4 -0
  583. package/dist/server/ws/ws-auth.d.ts.map +1 -0
  584. package/dist/server/ws/ws-auth.js +42 -0
  585. package/dist/server/ws/ws-auth.js.map +1 -0
  586. package/dist/server/ws/ws-handler.d.ts +12 -0
  587. package/dist/server/ws/ws-handler.d.ts.map +1 -0
  588. package/dist/server/ws/ws-handler.js +171 -0
  589. package/dist/server/ws/ws-handler.js.map +1 -0
  590. package/dist/server/ws/ws-rooms.d.ts +12 -0
  591. package/dist/server/ws/ws-rooms.d.ts.map +1 -0
  592. package/dist/server/ws/ws-rooms.js +52 -0
  593. package/dist/server/ws/ws-rooms.js.map +1 -0
  594. package/package.json +2 -2
@@ -0,0 +1,163 @@
1
+ import { execSync } from 'node:child_process';
2
+ export class OpenCodeBridge {
3
+ type = 'opencode';
4
+ activeSessions = new Map();
5
+ timeoutMs;
6
+ baseUrl;
7
+ authHeader;
8
+ constructor(config) {
9
+ this.baseUrl = config?.baseUrl ?? process.env.OPENCODE_BASE_URL ?? 'http://127.0.0.1:4096';
10
+ this.timeoutMs = config?.timeoutMs ?? parseInt(process.env.BRIDGE_TIMEOUT_MS ?? '300000', 10);
11
+ const password = process.env.OPENCODE_PASSWORD;
12
+ if (password) {
13
+ const username = process.env.OPENCODE_USERNAME ?? 'opencode';
14
+ this.authHeader = `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`;
15
+ }
16
+ else {
17
+ this.authHeader = null;
18
+ }
19
+ console.log(`[opencode-bridge] Using OpenCode at ${this.baseUrl}`);
20
+ }
21
+ async fetch(path, options) {
22
+ const headers = {
23
+ 'Content-Type': 'application/json',
24
+ ...(options?.headers ?? {}),
25
+ };
26
+ if (this.authHeader) {
27
+ headers['Authorization'] = this.authHeader;
28
+ }
29
+ return fetch(`${this.baseUrl}${path}`, { ...options, headers });
30
+ }
31
+ async createSession() {
32
+ const res = await this.fetch('/session', {
33
+ method: 'POST',
34
+ body: JSON.stringify({}),
35
+ });
36
+ if (!res.ok) {
37
+ const text = await res.text();
38
+ throw new Error(`Failed to create OpenCode session: ${res.status} ${text}`);
39
+ }
40
+ const data = await res.json();
41
+ return data.id;
42
+ }
43
+ async pollStream(sessionId, onChunk) {
44
+ const timeoutAt = Date.now() + this.timeoutMs;
45
+ let fullText = '';
46
+ while (Date.now() < timeoutAt) {
47
+ const res = await this.fetch(`/session/${sessionId}/message?limit=5`);
48
+ if (!res.ok) {
49
+ const text = await res.text();
50
+ throw new Error(`Failed to get messages: ${res.status} ${text}`);
51
+ }
52
+ const messages = await res.json();
53
+ let newText = '';
54
+ for (const msg of messages) {
55
+ if (msg.info?.role === 'assistant') {
56
+ const content = msg.info.content ?? msg.parts ?? [];
57
+ for (const block of content) {
58
+ if (block.type === 'text' && block.text) {
59
+ newText += block.text;
60
+ }
61
+ }
62
+ }
63
+ }
64
+ if (newText.length > fullText.length) {
65
+ const delta = newText.slice(fullText.length);
66
+ fullText = newText;
67
+ onChunk(delta);
68
+ }
69
+ if (fullText.trim()) {
70
+ return fullText;
71
+ }
72
+ await new Promise((r) => setTimeout(r, 500));
73
+ }
74
+ throw new Error('OpenCode session timed out');
75
+ }
76
+ send(opts) {
77
+ const key = opts.squadName ?? opts.cwd;
78
+ const sessionIdPromise = this.createSession();
79
+ sessionIdPromise
80
+ .then(async (sessionId) => {
81
+ this.activeSessions.set(key, sessionId);
82
+ console.log(`[opencode-bridge] Created session ${sessionId} for key="${key}"`);
83
+ try {
84
+ const res = await this.fetch(`/session/${sessionId}/message`, {
85
+ method: 'POST',
86
+ body: JSON.stringify({
87
+ parts: [{ type: 'text', text: opts.prompt }],
88
+ ...(opts.model ? { model: opts.model } : {}),
89
+ }),
90
+ });
91
+ if (!res.ok) {
92
+ const text = await res.text();
93
+ throw new Error(`Failed to send prompt: ${res.status} ${text}`);
94
+ }
95
+ const fullText = await this.pollStream(sessionId, opts.onChunk);
96
+ if (!fullText.trim()) {
97
+ console.log(`[opencode-bridge] WARNING: empty response from OpenCode for key="${key}"`);
98
+ opts.onError({ code: null, message: 'Empty response from OpenCode' });
99
+ return;
100
+ }
101
+ console.log(`[opencode-bridge] SUCCESS for key="${key}": ${fullText.slice(0, 100)}`);
102
+ opts.onDone(fullText);
103
+ }
104
+ catch (err) {
105
+ const msg = err instanceof Error ? err.message : String(err);
106
+ console.error(`[opencode-bridge] Error for key="${key}":`, msg);
107
+ opts.onError({ code: null, message: msg });
108
+ }
109
+ finally {
110
+ this.activeSessions.delete(key);
111
+ try {
112
+ await this.fetch(`/session/${sessionId}`, { method: 'DELETE' });
113
+ }
114
+ catch {
115
+ // ignore cleanup errors
116
+ }
117
+ }
118
+ })
119
+ .catch((err) => {
120
+ const msg = err instanceof Error ? err.message : String(err);
121
+ console.error(`[opencode-bridge] Failed to create session for key="${key}":`, msg);
122
+ opts.onError({ code: null, message: `OpenCode unavailable: ${msg}` });
123
+ });
124
+ }
125
+ isActive(squadName) {
126
+ return this.activeSessions.has(squadName);
127
+ }
128
+ kill(squadName) {
129
+ if (squadName === '__all__') {
130
+ console.log(`[opencode-bridge] Killing all ${this.activeSessions.size} active sessions`);
131
+ for (const [key, sessionId] of this.activeSessions) {
132
+ console.log(`[opencode-bridge] Aborting session for "${key}"`);
133
+ this.fetch(`/session/${sessionId}/abort`, { method: 'POST' }).catch(() => { });
134
+ }
135
+ this.activeSessions.clear();
136
+ return;
137
+ }
138
+ const sessionId = this.activeSessions.get(squadName);
139
+ if (sessionId) {
140
+ this.fetch(`/session/${sessionId}/abort`, { method: 'POST' }).catch(() => { });
141
+ this.activeSessions.delete(squadName);
142
+ }
143
+ }
144
+ }
145
+ export class OpenCodeBridgeFactory {
146
+ type = 'opencode';
147
+ detect() {
148
+ try {
149
+ execSync('which opencode', { encoding: 'utf-8', timeout: 3000 });
150
+ return true;
151
+ }
152
+ catch {
153
+ return false;
154
+ }
155
+ }
156
+ create(config) {
157
+ return new OpenCodeBridge({
158
+ baseUrl: process.env.OPENCODE_BASE_URL,
159
+ timeoutMs: config?.timeoutMs ?? parseInt(process.env.BRIDGE_TIMEOUT_MS ?? '300000', 10),
160
+ });
161
+ }
162
+ }
163
+ //# sourceMappingURL=opencode-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-bridge.js","sourceRoot":"","sources":["../../src/bridge/opencode-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { AgentEngine } from './engine.js';
2
+ export interface BridgeConfig {
3
+ timeoutMs: number;
4
+ [key: string]: unknown;
5
+ }
6
+ export interface BridgeFactory {
7
+ readonly type: string;
8
+ detect(): boolean;
9
+ create(config?: BridgeConfig): AgentEngine;
10
+ }
11
+ export declare class BridgeRegistry {
12
+ private factories;
13
+ register(factory: BridgeFactory): void;
14
+ create(type: string): AgentEngine;
15
+ list(): string[];
16
+ private getConfig;
17
+ }
18
+ export declare const bridgeRegistry: BridgeRegistry;
19
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/bridge/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,MAAM,IAAI,OAAO,CAAC;IAClB,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,WAAW,CAAC;CAC5C;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAoC;IAErD,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAItC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAYjC,IAAI,IAAI,MAAM,EAAE;IAIhB,OAAO,CAAC,SAAS;CAKlB;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
@@ -0,0 +1,29 @@
1
+ export class BridgeRegistry {
2
+ factories = new Map();
3
+ register(factory) {
4
+ this.factories.set(factory.type, factory);
5
+ }
6
+ create(type) {
7
+ if (type !== 'auto') {
8
+ const factory = this.factories.get(type);
9
+ if (!factory)
10
+ throw new Error(`Unknown bridge: ${type}`);
11
+ return factory.create(this.getConfig());
12
+ }
13
+ for (const factory of this.factories.values()) {
14
+ if (factory.detect())
15
+ return factory.create(this.getConfig());
16
+ }
17
+ throw new Error('No engine detected');
18
+ }
19
+ list() {
20
+ return [...this.factories.keys()];
21
+ }
22
+ getConfig() {
23
+ return {
24
+ timeoutMs: parseInt(process.env.BRIDGE_TIMEOUT_MS ?? '300000', 10),
25
+ };
26
+ }
27
+ }
28
+ export const bridgeRegistry = new BridgeRegistry();
29
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/bridge/registry.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,cAAc;IACjB,SAAS,GAAG,IAAI,GAAG,EAAyB,CAAC;IAErD,QAAQ,CAAC,OAAsB;QAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;YACzD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,IAAI,OAAO,CAAC,MAAM,EAAE;gBAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IAEO,SAAS;QACf,OAAO;YACL,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,QAAQ,EAAE,EAAE,CAAC;SACnE,CAAC;IACJ,CAAC;CACF;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * SessionJournal — compact action memory between bridge calls.
3
+ *
4
+ * After each completed Claude response, extracts "action statements" (created,
5
+ * fixed, updated, etc.) and stores them per session key. Before the next call,
6
+ * the journal can be injected as a context prefix so the model doesn't lose track
7
+ * of what it has already done — especially in long multi-step workflows.
8
+ */
9
+ declare class SessionJournalStore {
10
+ private sessions;
11
+ /** Extract action lines from a response and append to this session's journal. */
12
+ record(key: string, responseText: string): void;
13
+ /**
14
+ * Build a compact context string to prepend to the next prompt.
15
+ * Returns empty string if no journal exists or session has expired.
16
+ */
17
+ buildInjection(key: string): string;
18
+ /** Clear journal for a session (e.g., after a run completes). */
19
+ clear(key: string): void;
20
+ /** Number of sessions currently tracked. */
21
+ get size(): number;
22
+ }
23
+ export declare const sessionJournal: SessionJournalStore;
24
+ export {};
25
+ //# sourceMappingURL=session-journal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-journal.d.ts","sourceRoot":"","sources":["../../src/bridge/session-journal.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAwBH,cAAM,mBAAmB;IACvB,OAAO,CAAC,QAAQ,CAAkC;IAElD,iFAAiF;IACjF,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAuB/C;;;OAGG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAWnC,iEAAiE;IACjE,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIxB,4CAA4C;IAC5C,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAED,eAAO,MAAM,cAAc,qBAA4B,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * SessionJournal — compact action memory between bridge calls.
3
+ *
4
+ * After each completed Claude response, extracts "action statements" (created,
5
+ * fixed, updated, etc.) and stores them per session key. Before the next call,
6
+ * the journal can be injected as a context prefix so the model doesn't lose track
7
+ * of what it has already done — especially in long multi-step workflows.
8
+ */
9
+ const MAX_ENTRIES = 20;
10
+ const SESSION_TTL_MS = 60 * 60 * 1_000; // 1 hour inactivity
11
+ const ACTION_PATTERNS = [
12
+ // "I created/wrote/added/…"
13
+ /^I (?:created?|wrote|added|updated?|modified|deleted?|fixed|implemented|built|configured|installed|refactored?|moved?|renamed?) .{10,120}/gim,
14
+ // "Successfully created/…"
15
+ /^Successfully (?:created?|wrote|added|updated?|modified|fixed|implemented|built|configured|installed) .{10,120}/gim,
16
+ // Leading past-tense verbs
17
+ /^(?:Created?|Wrote|Added|Updated?|Modified|Fixed|Implemented|Built|Installed) .{10,120}/gim,
18
+ ];
19
+ class SessionJournalStore {
20
+ sessions = new Map();
21
+ /** Extract action lines from a response and append to this session's journal. */
22
+ record(key, responseText) {
23
+ const found = new Set();
24
+ for (const pattern of ACTION_PATTERNS) {
25
+ // reset lastIndex for global patterns
26
+ pattern.lastIndex = 0;
27
+ let match;
28
+ while ((match = pattern.exec(responseText)) !== null) {
29
+ const line = match[0].trim().replace(/\s+/g, ' ').slice(0, 120);
30
+ found.add(line);
31
+ }
32
+ }
33
+ if (found.size === 0)
34
+ return;
35
+ const existing = this.sessions.get(key) ?? { entries: [], updatedAt: Date.now() };
36
+ const newEntries = [...existing.entries, ...[...found].map(text => ({
37
+ timestamp: Date.now(),
38
+ text,
39
+ }))];
40
+ // Keep only the last MAX_ENTRIES
41
+ const trimmed = newEntries.slice(-MAX_ENTRIES);
42
+ this.sessions.set(key, { entries: trimmed, updatedAt: Date.now() });
43
+ }
44
+ /**
45
+ * Build a compact context string to prepend to the next prompt.
46
+ * Returns empty string if no journal exists or session has expired.
47
+ */
48
+ buildInjection(key) {
49
+ const session = this.sessions.get(key);
50
+ if (!session || session.entries.length === 0)
51
+ return '';
52
+ if (Date.now() - session.updatedAt > SESSION_TTL_MS) {
53
+ this.sessions.delete(key);
54
+ return '';
55
+ }
56
+ const lines = session.entries.map(e => `- ${e.text}`).join('\n');
57
+ return `[Context — actions already completed in this session:\n${lines}]\n\n`;
58
+ }
59
+ /** Clear journal for a session (e.g., after a run completes). */
60
+ clear(key) {
61
+ this.sessions.delete(key);
62
+ }
63
+ /** Number of sessions currently tracked. */
64
+ get size() {
65
+ return this.sessions.size;
66
+ }
67
+ }
68
+ export const sessionJournal = new SessionJournalStore();
69
+ //# sourceMappingURL=session-journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-journal.js","sourceRoot":"","sources":["../../src/bridge/session-journal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface StreamParserOptions {
2
+ onChunk: (text: string) => void;
3
+ onDone: (fullText: string) => void;
4
+ }
5
+ export declare class StreamParser {
6
+ private buffer;
7
+ private ended;
8
+ private onChunk;
9
+ private onDone;
10
+ constructor(opts: StreamParserOptions);
11
+ write(data: string | Buffer): void;
12
+ end(): void;
13
+ }
14
+ //# sourceMappingURL=stream-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-parser.d.ts","sourceRoot":"","sources":["../../src/bridge/stream-parser.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,MAAM,CAA6B;gBAE/B,IAAI,EAAE,mBAAmB;IAKrC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAUlC,GAAG,IAAI,IAAI;CAKZ"}
@@ -0,0 +1,26 @@
1
+ export class StreamParser {
2
+ buffer = '';
3
+ ended = false;
4
+ onChunk;
5
+ onDone;
6
+ constructor(opts) {
7
+ this.onChunk = opts.onChunk;
8
+ this.onDone = opts.onDone;
9
+ }
10
+ write(data) {
11
+ if (this.ended)
12
+ return;
13
+ const text = typeof data === 'string' ? data : data.toString('utf-8');
14
+ if (text.length === 0)
15
+ return;
16
+ this.buffer += text;
17
+ this.onChunk(text);
18
+ }
19
+ end() {
20
+ if (this.ended)
21
+ return;
22
+ this.ended = true;
23
+ this.onDone(this.buffer);
24
+ }
25
+ }
26
+ //# sourceMappingURL=stream-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-parser.js","sourceRoot":"","sources":["../../src/bridge/stream-parser.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,YAAY;IACf,MAAM,GAAW,EAAE,CAAC;IACpB,KAAK,GAAY,KAAK,CAAC;IACvB,OAAO,CAAyB;IAChC,MAAM,CAA6B;IAE3C,YAAY,IAAyB;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,IAAqB;QACzB,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QAEvB,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE9B,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,GAAG;QACD,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export type EngineType = 'claude-code' | 'opencode' | 'auto';
2
+ export declare function getEngine(): EngineType;
3
+ export declare function setEngine(engine: EngineType): void;
4
+ //# sourceMappingURL=engine-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-config.d.ts","sourceRoot":"","sources":["../../src/config/engine-config.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,UAAU,GAAG,MAAM,CAAC;AAI7D,wBAAgB,SAAS,IAAI,UAAU,CAiBtC;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAIlD"}
@@ -0,0 +1,24 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ const ENGINE_FILE = '.engine';
4
+ export function getEngine() {
5
+ const cwd = process.cwd();
6
+ const engineFile = path.join(cwd, ENGINE_FILE);
7
+ if (fs.existsSync(engineFile)) {
8
+ const content = fs.readFileSync(engineFile, 'utf-8').trim();
9
+ if (content === 'claude-code' || content === 'opencode' || content === 'auto') {
10
+ return content;
11
+ }
12
+ }
13
+ const envEngine = process.env.AGENT_ENGINE;
14
+ if (envEngine === 'claude-code' || envEngine === 'opencode' || envEngine === 'auto') {
15
+ return envEngine;
16
+ }
17
+ return 'auto';
18
+ }
19
+ export function setEngine(engine) {
20
+ const cwd = process.cwd();
21
+ const engineFile = path.join(cwd, ENGINE_FILE);
22
+ fs.writeFileSync(engineFile, engine, 'utf-8');
23
+ }
24
+ //# sourceMappingURL=engine-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-config.js","sourceRoot":"","sources":["../../src/config/engine-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,WAAW,GAAG,SAAS,CAAC;AAE9B,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAE/C,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5D,IAAI,OAAO,KAAK,aAAa,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YAC9E,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,YAAsC,CAAC;IACrE,IAAI,SAAS,KAAK,aAAa,IAAI,SAAS,KAAK,UAAU,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACpF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAkB;IAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC/C,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface Config {
2
+ port: number;
3
+ corsOrigin: string;
4
+ nodeEnv: string;
5
+ jwtSecret: string;
6
+ dataDir: string;
7
+ squadsDir: string;
8
+ awsAccessKeyId?: string;
9
+ awsSecretAccessKey?: string;
10
+ awsRegion: string;
11
+ sesFromEmail: string;
12
+ sesRateLimit: number;
13
+ serverUrl: string;
14
+ knowledgeWatchPaths: string[];
15
+ }
16
+ export declare function loadConfig(): Config;
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,wBAAgB,UAAU,IAAI,MAAM,CAsCnC"}
@@ -0,0 +1,39 @@
1
+ import dotenv from 'dotenv';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
5
+ export function loadConfig() {
6
+ // Load .env — prefer DOTENV_PATH (set by CLI), fallback to project root
7
+ const projectRoot = path.resolve(__dirname, '..', '..');
8
+ const dotenvFile = process.env.DOTENV_PATH ?? path.join(projectRoot, '.env');
9
+ dotenv.config({ path: dotenvFile });
10
+ const jwtSecret = process.env.JWT_SECRET;
11
+ if (!jwtSecret || jwtSecret.length < 32) {
12
+ throw new Error('JWT_SECRET environment variable is required and must be at least 32 characters. ' +
13
+ 'Run "npx expxagents init" to generate one.');
14
+ }
15
+ const port = parseInt(process.env.PORT || '3001', 10);
16
+ const corsOrigin = process.env.CORS_ORIGIN || `http://localhost:${port}`;
17
+ const nodeEnv = process.env.NODE_ENV || 'development';
18
+ // DATA_DIR must be set by CLI in production; fallback uses cwd for dev
19
+ const dataDir = process.env.DATA_DIR ?? path.join(process.cwd(), '.expxagents', 'data');
20
+ const squadsDir = process.env.SQUADS_DIR ?? path.resolve(projectRoot, 'squads');
21
+ return {
22
+ port,
23
+ corsOrigin,
24
+ nodeEnv,
25
+ jwtSecret,
26
+ dataDir,
27
+ squadsDir,
28
+ awsAccessKeyId: process.env.AWS_ACCESS_KEY_ID || undefined,
29
+ awsSecretAccessKey: process.env.AWS_SECRET_ACCESS_KEY || undefined,
30
+ awsRegion: process.env.AWS_REGION || 'us-east-1',
31
+ sesFromEmail: process.env.SES_FROM_EMAIL || '',
32
+ sesRateLimit: parseInt(process.env.SES_RATE_LIMIT || '14', 10),
33
+ serverUrl: process.env.SERVER_URL || `http://localhost:${port}`,
34
+ knowledgeWatchPaths: process.env.KNOWLEDGE_WATCH_PATHS
35
+ ? process.env.KNOWLEDGE_WATCH_PATHS.split(',').map(p => path.resolve(p.trim()))
36
+ : [],
37
+ };
38
+ }
39
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAkB/D,MAAM,UAAU,UAAU;IACxB,wEAAwE;IACxE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC7E,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACzC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CACb,kFAAkF;YAClF,4CAA4C,CAC7C,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,oBAAoB,IAAI,EAAE,CAAC;IACzE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAC;IACtD,uEAAuE;IACvE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IACxF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAEhF,OAAO;QACL,IAAI;QACJ,UAAU;QACV,OAAO;QACP,SAAS;QACT,OAAO;QACP,SAAS;QACT,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,SAAS;QAC1D,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,SAAS;QAClE,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,WAAW;QAChD,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE;QAC9C,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,EAAE,EAAE,CAAC;QAC9D,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,oBAAoB,IAAI,EAAE;QAC/D,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB;YACpD,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/E,CAAC,CAAC,EAAE;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chat-tables.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-tables.test.d.ts","sourceRoot":"","sources":["../../../src/db/__tests__/chat-tables.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,82 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import Database from 'better-sqlite3';
3
+ function createTestDb() {
4
+ const db = new Database(':memory:');
5
+ db.pragma('journal_mode = WAL');
6
+ db.exec(`
7
+ CREATE TABLE IF NOT EXISTS conversations (
8
+ id TEXT PRIMARY KEY,
9
+ squad_name TEXT NOT NULL,
10
+ created_at TEXT NOT NULL
11
+ );
12
+
13
+ CREATE TABLE IF NOT EXISTS chat_messages (
14
+ id TEXT PRIMARY KEY,
15
+ conversation_id TEXT NOT NULL REFERENCES conversations(id),
16
+ role TEXT NOT NULL,
17
+ content TEXT NOT NULL,
18
+ agent_id TEXT,
19
+ agent_name TEXT,
20
+ created_at TEXT NOT NULL
21
+ );
22
+ `);
23
+ return db;
24
+ }
25
+ describe('chat tables', () => {
26
+ let db;
27
+ beforeEach(() => {
28
+ db = createTestDb();
29
+ });
30
+ it('should insert and retrieve a conversation', () => {
31
+ const id = '2026-03-13T10:00:00Z-abc123';
32
+ db.prepare('INSERT INTO conversations (id, squad_name, created_at) VALUES (?, ?, ?)').run(id, 'content-team', '2026-03-13T10:00:00Z');
33
+ const row = db.prepare('SELECT * FROM conversations WHERE id = ?').get(id);
34
+ expect(row.id).toBe(id);
35
+ expect(row.squad_name).toBe('content-team');
36
+ });
37
+ it('should insert and retrieve chat messages', () => {
38
+ const convId = '2026-03-13T10:00:00Z-conv1';
39
+ db.prepare('INSERT INTO conversations (id, squad_name, created_at) VALUES (?, ?, ?)').run(convId, 'content-team', '2026-03-13T10:00:00Z');
40
+ const msgId = '2026-03-13T10:00:01Z-msg1';
41
+ db.prepare('INSERT INTO chat_messages (id, conversation_id, role, content, agent_id, agent_name, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)').run(msgId, convId, 'user', 'Hello', null, null, '2026-03-13T10:00:01Z');
42
+ const msg = db.prepare('SELECT * FROM chat_messages WHERE id = ?').get(msgId);
43
+ expect(msg.role).toBe('user');
44
+ expect(msg.content).toBe('Hello');
45
+ expect(msg.conversation_id).toBe(convId);
46
+ });
47
+ it('should insert agent_dm messages with agent metadata', () => {
48
+ const convId = '2026-03-13T10:00:00Z-conv2';
49
+ db.prepare('INSERT INTO conversations (id, squad_name, created_at) VALUES (?, ?, ?)').run(convId, 'content-team', '2026-03-13T10:00:00Z');
50
+ const msgId = '2026-03-13T10:00:02Z-dm1';
51
+ db.prepare('INSERT INTO chat_messages (id, conversation_id, role, content, agent_id, agent_name, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)').run(msgId, convId, 'agent_dm', 'Found 5 topics', 'researcher', 'Researcher', '2026-03-13T10:00:02Z');
52
+ const msg = db.prepare('SELECT * FROM chat_messages WHERE id = ?').get(msgId);
53
+ expect(msg.role).toBe('agent_dm');
54
+ expect(msg.agent_id).toBe('researcher');
55
+ expect(msg.agent_name).toBe('Researcher');
56
+ });
57
+ it('should list conversations newest-first by id', () => {
58
+ db.prepare('INSERT INTO conversations (id, squad_name, created_at) VALUES (?, ?, ?)').run('2026-03-13T10:00:00Z-aaa', 'content-team', '2026-03-13T10:00:00Z');
59
+ db.prepare('INSERT INTO conversations (id, squad_name, created_at) VALUES (?, ?, ?)').run('2026-03-13T11:00:00Z-bbb', 'content-team', '2026-03-13T11:00:00Z');
60
+ const rows = db.prepare('SELECT * FROM conversations WHERE squad_name = ? ORDER BY id DESC').all('content-team');
61
+ expect(rows[0].id).toBe('2026-03-13T11:00:00Z-bbb');
62
+ expect(rows[1].id).toBe('2026-03-13T10:00:00Z-aaa');
63
+ });
64
+ it('should list messages oldest-first by id with cursor pagination', () => {
65
+ const convId = '2026-03-13T10:00:00Z-conv3';
66
+ db.prepare('INSERT INTO conversations (id, squad_name, created_at) VALUES (?, ?, ?)').run(convId, 'content-team', '2026-03-13T10:00:00Z');
67
+ for (let i = 1; i <= 5; i++) {
68
+ const ts = `2026-03-13T10:00:0${i}Z`;
69
+ db.prepare('INSERT INTO chat_messages (id, conversation_id, role, content, created_at) VALUES (?, ?, ?, ?, ?)').run(`${ts}-m${i}`, convId, 'user', `msg ${i}`, ts);
70
+ }
71
+ // First page (limit 2)
72
+ const page1 = db.prepare('SELECT * FROM chat_messages WHERE conversation_id = ? ORDER BY id ASC LIMIT ?').all(convId, 2);
73
+ expect(page1).toHaveLength(2);
74
+ expect(page1[0].content).toBe('msg 1');
75
+ // Second page using cursor
76
+ const cursor = page1[1].id;
77
+ const page2 = db.prepare('SELECT * FROM chat_messages WHERE conversation_id = ? AND id > ? ORDER BY id ASC LIMIT ?').all(convId, cursor, 2);
78
+ expect(page2).toHaveLength(2);
79
+ expect(page2[0].content).toBe('msg 3');
80
+ });
81
+ });
82
+ //# sourceMappingURL=chat-tables.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-tables.test.js","sourceRoot":"","sources":["../../../src/db/__tests__/chat-tables.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=email-schema.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-schema.test.d.ts","sourceRoot":"","sources":["../../../src/db/__tests__/email-schema.test.ts"],"names":[],"mappings":""}