@rudderhq/server 0.1.0-canary.0

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 (902) hide show
  1. package/LICENSE +14 -0
  2. package/dist/agent-auth-jwt.d.ts +14 -0
  3. package/dist/agent-auth-jwt.d.ts.map +1 -0
  4. package/dist/agent-auth-jwt.js +119 -0
  5. package/dist/agent-auth-jwt.js.map +1 -0
  6. package/dist/agent-runtimes/codex-models.d.ts +4 -0
  7. package/dist/agent-runtimes/codex-models.d.ts.map +1 -0
  8. package/dist/agent-runtimes/codex-models.js +98 -0
  9. package/dist/agent-runtimes/codex-models.js.map +1 -0
  10. package/dist/agent-runtimes/cursor-models.d.ts +13 -0
  11. package/dist/agent-runtimes/cursor-models.d.ts.map +1 -0
  12. package/dist/agent-runtimes/cursor-models.js +148 -0
  13. package/dist/agent-runtimes/cursor-models.js.map +1 -0
  14. package/dist/agent-runtimes/http/execute.d.ts +3 -0
  15. package/dist/agent-runtimes/http/execute.d.ts.map +1 -0
  16. package/dist/agent-runtimes/http/execute.js +39 -0
  17. package/dist/agent-runtimes/http/execute.js.map +1 -0
  18. package/dist/agent-runtimes/http/index.d.ts +3 -0
  19. package/dist/agent-runtimes/http/index.d.ts.map +1 -0
  20. package/dist/agent-runtimes/http/index.js +20 -0
  21. package/dist/agent-runtimes/http/index.js.map +1 -0
  22. package/dist/agent-runtimes/http/test.d.ts +3 -0
  23. package/dist/agent-runtimes/http/test.d.ts.map +1 -0
  24. package/dist/agent-runtimes/http/test.js +106 -0
  25. package/dist/agent-runtimes/http/test.js.map +1 -0
  26. package/dist/agent-runtimes/index.d.ts +4 -0
  27. package/dist/agent-runtimes/index.d.ts.map +1 -0
  28. package/dist/agent-runtimes/index.js +3 -0
  29. package/dist/agent-runtimes/index.js.map +1 -0
  30. package/dist/agent-runtimes/process/execute.d.ts +3 -0
  31. package/dist/agent-runtimes/process/execute.d.ts.map +1 -0
  32. package/dist/agent-runtimes/process/execute.js +63 -0
  33. package/dist/agent-runtimes/process/execute.js.map +1 -0
  34. package/dist/agent-runtimes/process/index.d.ts +3 -0
  35. package/dist/agent-runtimes/process/index.d.ts.map +1 -0
  36. package/dist/agent-runtimes/process/index.js +23 -0
  37. package/dist/agent-runtimes/process/index.js.map +1 -0
  38. package/dist/agent-runtimes/process/test.d.ts +3 -0
  39. package/dist/agent-runtimes/process/test.d.ts.map +1 -0
  40. package/dist/agent-runtimes/process/test.js +77 -0
  41. package/dist/agent-runtimes/process/test.js.map +1 -0
  42. package/dist/agent-runtimes/registry.d.ts +9 -0
  43. package/dist/agent-runtimes/registry.d.ts.map +1 -0
  44. package/dist/agent-runtimes/registry.js +189 -0
  45. package/dist/agent-runtimes/registry.js.map +1 -0
  46. package/dist/agent-runtimes/types.d.ts +2 -0
  47. package/dist/agent-runtimes/types.d.ts.map +1 -0
  48. package/dist/agent-runtimes/types.js +2 -0
  49. package/dist/agent-runtimes/types.js.map +1 -0
  50. package/dist/agent-runtimes/utils.d.ts +10 -0
  51. package/dist/agent-runtimes/utils.d.ts.map +1 -0
  52. package/dist/agent-runtimes/utils.js +14 -0
  53. package/dist/agent-runtimes/utils.js.map +1 -0
  54. package/dist/agent-workspace-key.d.ts +17 -0
  55. package/dist/agent-workspace-key.d.ts.map +1 -0
  56. package/dist/agent-workspace-key.js +49 -0
  57. package/dist/agent-workspace-key.js.map +1 -0
  58. package/dist/app.d.ts +14 -0
  59. package/dist/app.d.ts.map +1 -0
  60. package/dist/app.js +19 -0
  61. package/dist/app.js.map +1 -0
  62. package/dist/attachment-types.d.ts +33 -0
  63. package/dist/attachment-types.d.ts.map +1 -0
  64. package/dist/attachment-types.js +67 -0
  65. package/dist/attachment-types.js.map +1 -0
  66. package/dist/auth/better-auth.d.ts +24 -0
  67. package/dist/auth/better-auth.d.ts.map +1 -0
  68. package/dist/auth/better-auth.js +108 -0
  69. package/dist/auth/better-auth.js.map +1 -0
  70. package/dist/board-claim.d.ts +23 -0
  71. package/dist/board-claim.d.ts.map +1 -0
  72. package/dist/board-claim.js +115 -0
  73. package/dist/board-claim.js.map +1 -0
  74. package/dist/bootstrap/create-http-app.d.ts +6 -0
  75. package/dist/bootstrap/create-http-app.d.ts.map +1 -0
  76. package/dist/bootstrap/create-http-app.js +122 -0
  77. package/dist/bootstrap/create-http-app.js.map +1 -0
  78. package/dist/bootstrap/plugin-host-runtime.d.ts +116 -0
  79. package/dist/bootstrap/plugin-host-runtime.d.ts.map +1 -0
  80. package/dist/bootstrap/plugin-host-runtime.js +121 -0
  81. package/dist/bootstrap/plugin-host-runtime.js.map +1 -0
  82. package/dist/bootstrap/register-api-routes.d.ts +5 -0
  83. package/dist/bootstrap/register-api-routes.d.ts.map +1 -0
  84. package/dist/bootstrap/register-api-routes.js +65 -0
  85. package/dist/bootstrap/register-api-routes.js.map +1 -0
  86. package/dist/bootstrap/types.d.ts +24 -0
  87. package/dist/bootstrap/types.d.ts.map +1 -0
  88. package/dist/bootstrap/types.js +2 -0
  89. package/dist/bootstrap/types.js.map +1 -0
  90. package/dist/config-file.d.ts +5 -0
  91. package/dist/config-file.d.ts.map +1 -0
  92. package/dist/config-file.js +48 -0
  93. package/dist/config-file.js.map +1 -0
  94. package/dist/config.d.ts +45 -0
  95. package/dist/config.d.ts.map +1 -0
  96. package/dist/config.js +233 -0
  97. package/dist/config.js.map +1 -0
  98. package/dist/dev-server-status.d.ts +29 -0
  99. package/dist/dev-server-status.d.ts.map +1 -0
  100. package/dist/dev-server-status.js +75 -0
  101. package/dist/dev-server-status.js.map +1 -0
  102. package/dist/errors.d.ts +12 -0
  103. package/dist/errors.d.ts.map +1 -0
  104. package/dist/errors.js +28 -0
  105. package/dist/errors.js.map +1 -0
  106. package/dist/home-paths.d.ts +50 -0
  107. package/dist/home-paths.d.ts.map +1 -0
  108. package/dist/home-paths.js +183 -0
  109. package/dist/home-paths.js.map +1 -0
  110. package/dist/index.d.ts +69 -0
  111. package/dist/index.d.ts.map +1 -0
  112. package/dist/index.js +827 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/langfuse-transcript.d.ts +32 -0
  115. package/dist/langfuse-transcript.d.ts.map +1 -0
  116. package/dist/langfuse-transcript.js +341 -0
  117. package/dist/langfuse-transcript.js.map +1 -0
  118. package/dist/langfuse.d.ts +93 -0
  119. package/dist/langfuse.d.ts.map +1 -0
  120. package/dist/langfuse.js +412 -0
  121. package/dist/langfuse.js.map +1 -0
  122. package/dist/local-runtime.d.ts +67 -0
  123. package/dist/local-runtime.d.ts.map +1 -0
  124. package/dist/local-runtime.js +302 -0
  125. package/dist/local-runtime.js.map +1 -0
  126. package/dist/log-redaction.d.ts +11 -0
  127. package/dist/log-redaction.d.ts.map +1 -0
  128. package/dist/log-redaction.js +118 -0
  129. package/dist/log-redaction.js.map +1 -0
  130. package/dist/middleware/auth.d.ts +12 -0
  131. package/dist/middleware/auth.d.ts.map +1 -0
  132. package/dist/middleware/auth.js +144 -0
  133. package/dist/middleware/auth.js.map +1 -0
  134. package/dist/middleware/board-mutation-guard.d.ts +3 -0
  135. package/dist/middleware/board-mutation-guard.d.ts.map +1 -0
  136. package/dist/middleware/board-mutation-guard.js +59 -0
  137. package/dist/middleware/board-mutation-guard.js.map +1 -0
  138. package/dist/middleware/error-handler.d.ts +17 -0
  139. package/dist/middleware/error-handler.d.ts.map +1 -0
  140. package/dist/middleware/error-handler.js +37 -0
  141. package/dist/middleware/error-handler.js.map +1 -0
  142. package/dist/middleware/index.d.ts +4 -0
  143. package/dist/middleware/index.d.ts.map +1 -0
  144. package/dist/middleware/index.js +4 -0
  145. package/dist/middleware/index.js.map +1 -0
  146. package/dist/middleware/logger.d.ts +4 -0
  147. package/dist/middleware/logger.d.ts.map +1 -0
  148. package/dist/middleware/logger.js +133 -0
  149. package/dist/middleware/logger.js.map +1 -0
  150. package/dist/middleware/private-hostname-guard.d.ts +11 -0
  151. package/dist/middleware/private-hostname-guard.d.ts.map +1 -0
  152. package/dist/middleware/private-hostname-guard.js +78 -0
  153. package/dist/middleware/private-hostname-guard.js.map +1 -0
  154. package/dist/middleware/validate.d.ts +4 -0
  155. package/dist/middleware/validate.d.ts.map +1 -0
  156. package/dist/middleware/validate.js +7 -0
  157. package/dist/middleware/validate.js.map +1 -0
  158. package/dist/onboarding-assets/ceo/AGENTS.md +33 -0
  159. package/dist/onboarding-assets/ceo/HEARTBEAT.md +77 -0
  160. package/dist/onboarding-assets/ceo/SOUL.md +33 -0
  161. package/dist/onboarding-assets/ceo/TOOLS.md +3 -0
  162. package/dist/onboarding-assets/default/AGENTS.md +9 -0
  163. package/dist/onboarding-assets/default/HEARTBEAT.md +36 -0
  164. package/dist/onboarding-assets/default/SOUL.md +23 -0
  165. package/dist/onboarding-assets/default/TOOLS.md +3 -0
  166. package/dist/paths.d.ts +3 -0
  167. package/dist/paths.d.ts.map +1 -0
  168. package/dist/paths.js +31 -0
  169. package/dist/paths.js.map +1 -0
  170. package/dist/realtime/live-events-ws.d.ts +28 -0
  171. package/dist/realtime/live-events-ws.d.ts.map +1 -0
  172. package/dist/realtime/live-events-ws.js +187 -0
  173. package/dist/realtime/live-events-ws.js.map +1 -0
  174. package/dist/redaction.d.ts +4 -0
  175. package/dist/redaction.d.ts.map +1 -0
  176. package/dist/redaction.js +63 -0
  177. package/dist/redaction.js.map +1 -0
  178. package/dist/routes/access.d.ts +57 -0
  179. package/dist/routes/access.d.ts.map +1 -0
  180. package/dist/routes/access.js +2266 -0
  181. package/dist/routes/access.js.map +1 -0
  182. package/dist/routes/activity.d.ts +3 -0
  183. package/dist/routes/activity.d.ts.map +1 -0
  184. package/dist/routes/activity.js +78 -0
  185. package/dist/routes/activity.js.map +1 -0
  186. package/dist/routes/agents.d.ts +3 -0
  187. package/dist/routes/agents.d.ts.map +1 -0
  188. package/dist/routes/agents.js +1913 -0
  189. package/dist/routes/agents.js.map +1 -0
  190. package/dist/routes/approvals.d.ts +3 -0
  191. package/dist/routes/approvals.d.ts.map +1 -0
  192. package/dist/routes/approvals.js +365 -0
  193. package/dist/routes/approvals.js.map +1 -0
  194. package/dist/routes/assets.d.ts +4 -0
  195. package/dist/routes/assets.d.ts.map +1 -0
  196. package/dist/routes/assets.js +309 -0
  197. package/dist/routes/assets.js.map +1 -0
  198. package/dist/routes/authz.d.ts +16 -0
  199. package/dist/routes/authz.d.ts.map +1 -0
  200. package/dist/routes/authz.js +47 -0
  201. package/dist/routes/authz.js.map +1 -0
  202. package/dist/routes/automations.d.ts +3 -0
  203. package/dist/routes/automations.d.ts.map +1 -0
  204. package/dist/routes/automations.js +277 -0
  205. package/dist/routes/automations.js.map +1 -0
  206. package/dist/routes/chats.d.ts +4 -0
  207. package/dist/routes/chats.d.ts.map +1 -0
  208. package/dist/routes/chats.js +1162 -0
  209. package/dist/routes/chats.js.map +1 -0
  210. package/dist/routes/costs.d.ts +3 -0
  211. package/dist/routes/costs.d.ts.map +1 -0
  212. package/dist/routes/costs.js +268 -0
  213. package/dist/routes/costs.js.map +1 -0
  214. package/dist/routes/dashboard.d.ts +3 -0
  215. package/dist/routes/dashboard.d.ts.map +1 -0
  216. package/dist/routes/dashboard.js +15 -0
  217. package/dist/routes/dashboard.js.map +1 -0
  218. package/dist/routes/execution-workspaces.d.ts +3 -0
  219. package/dist/routes/execution-workspaces.d.ts.map +1 -0
  220. package/dist/routes/execution-workspaces.js +165 -0
  221. package/dist/routes/execution-workspaces.js.map +1 -0
  222. package/dist/routes/goals.d.ts +3 -0
  223. package/dist/routes/goals.d.ts.map +1 -0
  224. package/dist/routes/goals.js +95 -0
  225. package/dist/routes/goals.js.map +1 -0
  226. package/dist/routes/health.d.ts +12 -0
  227. package/dist/routes/health.d.ts.map +1 -0
  228. package/dist/routes/health.js +85 -0
  229. package/dist/routes/health.js.map +1 -0
  230. package/dist/routes/index.d.ts +19 -0
  231. package/dist/routes/index.d.ts.map +1 -0
  232. package/dist/routes/index.js +19 -0
  233. package/dist/routes/index.js.map +1 -0
  234. package/dist/routes/instance-settings.d.ts +6 -0
  235. package/dist/routes/instance-settings.d.ts.map +1 -0
  236. package/dist/routes/instance-settings.js +250 -0
  237. package/dist/routes/instance-settings.js.map +1 -0
  238. package/dist/routes/issues-checkout-wakeup.d.ts +9 -0
  239. package/dist/routes/issues-checkout-wakeup.d.ts.map +1 -0
  240. package/dist/routes/issues-checkout-wakeup.js +12 -0
  241. package/dist/routes/issues-checkout-wakeup.js.map +1 -0
  242. package/dist/routes/issues.d.ts +4 -0
  243. package/dist/routes/issues.d.ts.map +1 -0
  244. package/dist/routes/issues.js +1615 -0
  245. package/dist/routes/issues.js.map +1 -0
  246. package/dist/routes/llms.d.ts +3 -0
  247. package/dist/routes/llms.d.ts.map +1 -0
  248. package/dist/routes/llms.js +78 -0
  249. package/dist/routes/llms.js.map +1 -0
  250. package/dist/routes/messenger.d.ts +3 -0
  251. package/dist/routes/messenger.d.ts.map +1 -0
  252. package/dist/routes/messenger.js +108 -0
  253. package/dist/routes/messenger.js.map +1 -0
  254. package/dist/routes/org-chart-logo.d.ts +2 -0
  255. package/dist/routes/org-chart-logo.d.ts.map +1 -0
  256. package/dist/routes/org-chart-logo.js +2 -0
  257. package/dist/routes/org-chart-logo.js.map +1 -0
  258. package/dist/routes/org-chart-svg.d.ts +25 -0
  259. package/dist/routes/org-chart-svg.d.ts.map +1 -0
  260. package/dist/routes/org-chart-svg.js +652 -0
  261. package/dist/routes/org-chart-svg.js.map +1 -0
  262. package/dist/routes/organization-skills.d.ts +3 -0
  263. package/dist/routes/organization-skills.d.ts.map +1 -0
  264. package/dist/routes/organization-skills.js +253 -0
  265. package/dist/routes/organization-skills.js.map +1 -0
  266. package/dist/routes/orgs.d.ts +4 -0
  267. package/dist/routes/orgs.d.ts.map +1 -0
  268. package/dist/routes/orgs.js +575 -0
  269. package/dist/routes/orgs.js.map +1 -0
  270. package/dist/routes/plugin-ui-static.d.ts +69 -0
  271. package/dist/routes/plugin-ui-static.d.ts.map +1 -0
  272. package/dist/routes/plugin-ui-static.js +411 -0
  273. package/dist/routes/plugin-ui-static.js.map +1 -0
  274. package/dist/routes/plugins.d.ts +120 -0
  275. package/dist/routes/plugins.d.ts.map +1 -0
  276. package/dist/routes/plugins.js +1776 -0
  277. package/dist/routes/plugins.js.map +1 -0
  278. package/dist/routes/projects.d.ts +3 -0
  279. package/dist/routes/projects.d.ts.map +1 -0
  280. package/dist/routes/projects.js +235 -0
  281. package/dist/routes/projects.js.map +1 -0
  282. package/dist/routes/run-intelligence.d.ts +3 -0
  283. package/dist/routes/run-intelligence.d.ts.map +1 -0
  284. package/dist/routes/run-intelligence.js +58 -0
  285. package/dist/routes/run-intelligence.js.map +1 -0
  286. package/dist/routes/secrets.d.ts +3 -0
  287. package/dist/routes/secrets.d.ts.map +1 -0
  288. package/dist/routes/secrets.js +128 -0
  289. package/dist/routes/secrets.js.map +1 -0
  290. package/dist/routes/sidebar-badges.d.ts +3 -0
  291. package/dist/routes/sidebar-badges.d.ts.map +1 -0
  292. package/dist/routes/sidebar-badges.js +70 -0
  293. package/dist/routes/sidebar-badges.js.map +1 -0
  294. package/dist/secrets/external-stub-providers.d.ts +5 -0
  295. package/dist/secrets/external-stub-providers.d.ts.map +1 -0
  296. package/dist/secrets/external-stub-providers.js +21 -0
  297. package/dist/secrets/external-stub-providers.js.map +1 -0
  298. package/dist/secrets/local-encrypted-provider.d.ts +3 -0
  299. package/dist/secrets/local-encrypted-provider.d.ts.map +1 -0
  300. package/dist/secrets/local-encrypted-provider.js +116 -0
  301. package/dist/secrets/local-encrypted-provider.js.map +1 -0
  302. package/dist/secrets/provider-registry.d.ts +5 -0
  303. package/dist/secrets/provider-registry.d.ts.map +1 -0
  304. package/dist/secrets/provider-registry.js +20 -0
  305. package/dist/secrets/provider-registry.js.map +1 -0
  306. package/dist/secrets/types.d.ts +21 -0
  307. package/dist/secrets/types.d.ts.map +1 -0
  308. package/dist/secrets/types.js +2 -0
  309. package/dist/secrets/types.js.map +1 -0
  310. package/dist/services/access.d.ts +113 -0
  311. package/dist/services/access.d.ts.map +1 -0
  312. package/dist/services/access.js +247 -0
  313. package/dist/services/access.js.map +1 -0
  314. package/dist/services/activity-log.d.ts +17 -0
  315. package/dist/services/activity-log.d.ts.map +1 -0
  316. package/dist/services/activity-log.js +109 -0
  317. package/dist/services/activity-log.js.map +1 -0
  318. package/dist/services/activity.d.ts +472 -0
  319. package/dist/services/activity.d.ts.map +1 -0
  320. package/dist/services/activity.js +134 -0
  321. package/dist/services/activity.js.map +1 -0
  322. package/dist/services/agent-enabled-skills.d.ts +9 -0
  323. package/dist/services/agent-enabled-skills.d.ts.map +1 -0
  324. package/dist/services/agent-enabled-skills.js +89 -0
  325. package/dist/services/agent-enabled-skills.js.map +1 -0
  326. package/dist/services/agent-instructions.d.ts +98 -0
  327. package/dist/services/agent-instructions.d.ts.map +1 -0
  328. package/dist/services/agent-instructions.js +596 -0
  329. package/dist/services/agent-instructions.js.map +1 -0
  330. package/dist/services/agent-name-pool.d.ts +10 -0
  331. package/dist/services/agent-name-pool.d.ts.map +1 -0
  332. package/dist/services/agent-name-pool.js +230 -0
  333. package/dist/services/agent-name-pool.js.map +1 -0
  334. package/dist/services/agent-permissions.d.ts +6 -0
  335. package/dist/services/agent-permissions.d.ts.map +1 -0
  336. package/dist/services/agent-permissions.js +18 -0
  337. package/dist/services/agent-permissions.js.map +1 -0
  338. package/dist/services/agent-run-context.d.ts +142 -0
  339. package/dist/services/agent-run-context.d.ts.map +1 -0
  340. package/dist/services/agent-run-context.js +451 -0
  341. package/dist/services/agent-run-context.js.map +1 -0
  342. package/dist/services/agents.d.ts +1713 -0
  343. package/dist/services/agents.d.ts.map +1 -0
  344. package/dist/services/agents.js +750 -0
  345. package/dist/services/agents.js.map +1 -0
  346. package/dist/services/approvals.d.ts +546 -0
  347. package/dist/services/approvals.d.ts.map +1 -0
  348. package/dist/services/approvals.js +212 -0
  349. package/dist/services/approvals.js.map +1 -0
  350. package/dist/services/assets.d.ts +33 -0
  351. package/dist/services/assets.d.ts.map +1 -0
  352. package/dist/services/assets.js +17 -0
  353. package/dist/services/assets.js.map +1 -0
  354. package/dist/services/automations.d.ts +135 -0
  355. package/dist/services/automations.d.ts.map +1 -0
  356. package/dist/services/automations.js +1105 -0
  357. package/dist/services/automations.js.map +1 -0
  358. package/dist/services/board-auth.d.ts +234 -0
  359. package/dist/services/board-auth.d.ts.map +1 -0
  360. package/dist/services/board-auth.js +295 -0
  361. package/dist/services/board-auth.js.map +1 -0
  362. package/dist/services/budgets.d.ts +38 -0
  363. package/dist/services/budgets.d.ts.map +1 -0
  364. package/dist/services/budgets.js +784 -0
  365. package/dist/services/budgets.js.map +1 -0
  366. package/dist/services/chat-assistant.d.ts +62 -0
  367. package/dist/services/chat-assistant.d.ts.map +1 -0
  368. package/dist/services/chat-assistant.js +943 -0
  369. package/dist/services/chat-assistant.js.map +1 -0
  370. package/dist/services/chat-generation-locks.d.ts +3 -0
  371. package/dist/services/chat-generation-locks.d.ts.map +1 -0
  372. package/dist/services/chat-generation-locks.js +16 -0
  373. package/dist/services/chat-generation-locks.js.map +1 -0
  374. package/dist/services/chats.d.ts +723 -0
  375. package/dist/services/chats.d.ts.map +1 -0
  376. package/dist/services/chats.js +1188 -0
  377. package/dist/services/chats.js.map +1 -0
  378. package/dist/services/costs.d.ts +114 -0
  379. package/dist/services/costs.d.ts.map +1 -0
  380. package/dist/services/costs.js +326 -0
  381. package/dist/services/costs.js.map +1 -0
  382. package/dist/services/cron.d.ts +80 -0
  383. package/dist/services/cron.d.ts.map +1 -0
  384. package/dist/services/cron.js +300 -0
  385. package/dist/services/cron.js.map +1 -0
  386. package/dist/services/dashboard.d.ts +26 -0
  387. package/dist/services/dashboard.d.ts.map +1 -0
  388. package/dist/services/dashboard.js +98 -0
  389. package/dist/services/dashboard.js.map +1 -0
  390. package/dist/services/default-agent-instructions.d.ts +9 -0
  391. package/dist/services/default-agent-instructions.d.ts.map +1 -0
  392. package/dist/services/default-agent-instructions.js +20 -0
  393. package/dist/services/default-agent-instructions.js.map +1 -0
  394. package/dist/services/documents.d.ts +164 -0
  395. package/dist/services/documents.d.ts.map +1 -0
  396. package/dist/services/documents.js +382 -0
  397. package/dist/services/documents.js.map +1 -0
  398. package/dist/services/execution-workspace-policy.d.ts +20 -0
  399. package/dist/services/execution-workspace-policy.d.ts.map +1 -0
  400. package/dist/services/execution-workspace-policy.js +172 -0
  401. package/dist/services/execution-workspace-policy.js.map +1 -0
  402. package/dist/services/execution-workspaces.d.ts +19 -0
  403. package/dist/services/execution-workspaces.d.ts.map +1 -0
  404. package/dist/services/execution-workspaces.js +87 -0
  405. package/dist/services/execution-workspaces.js.map +1 -0
  406. package/dist/services/finance.d.ts +93 -0
  407. package/dist/services/finance.d.ts.map +1 -0
  408. package/dist/services/finance.js +120 -0
  409. package/dist/services/finance.js.map +1 -0
  410. package/dist/services/goals.d.ts +433 -0
  411. package/dist/services/goals.d.ts.map +1 -0
  412. package/dist/services/goals.js +54 -0
  413. package/dist/services/goals.js.map +1 -0
  414. package/dist/services/heartbeat-run-summary.d.ts +2 -0
  415. package/dist/services/heartbeat-run-summary.d.ts.map +1 -0
  416. package/dist/services/heartbeat-run-summary.js +131 -0
  417. package/dist/services/heartbeat-run-summary.js.map +1 -0
  418. package/dist/services/heartbeat.d.ts +2 -0
  419. package/dist/services/heartbeat.d.ts.map +1 -0
  420. package/dist/services/heartbeat.js +2 -0
  421. package/dist/services/heartbeat.js.map +1 -0
  422. package/dist/services/hire-hook.d.ts +14 -0
  423. package/dist/services/hire-hook.d.ts.map +1 -0
  424. package/dist/services/hire-hook.js +85 -0
  425. package/dist/services/hire-hook.js.map +1 -0
  426. package/dist/services/index.d.ts +38 -0
  427. package/dist/services/index.d.ts.map +1 -0
  428. package/dist/services/index.js +38 -0
  429. package/dist/services/index.js.map +1 -0
  430. package/dist/services/instance-settings.d.ts +14 -0
  431. package/dist/services/instance-settings.d.ts.map +1 -0
  432. package/dist/services/instance-settings.js +158 -0
  433. package/dist/services/instance-settings.js.map +1 -0
  434. package/dist/services/issue-approvals.d.ts +56 -0
  435. package/dist/services/issue-approvals.d.ts.map +1 -0
  436. package/dist/services/issue-approvals.js +153 -0
  437. package/dist/services/issue-approvals.js.map +1 -0
  438. package/dist/services/issue-assignment-wakeup.d.ts +32 -0
  439. package/dist/services/issue-assignment-wakeup.d.ts.map +1 -0
  440. package/dist/services/issue-assignment-wakeup.js +43 -0
  441. package/dist/services/issue-assignment-wakeup.js.map +1 -0
  442. package/dist/services/issue-goal-fallback.d.ts +15 -0
  443. package/dist/services/issue-goal-fallback.d.ts.map +1 -0
  444. package/dist/services/issue-goal-fallback.js +15 -0
  445. package/dist/services/issue-goal-fallback.js.map +1 -0
  446. package/dist/services/issues.d.ts +580 -0
  447. package/dist/services/issues.d.ts.map +1 -0
  448. package/dist/services/issues.js +1464 -0
  449. package/dist/services/issues.js.map +1 -0
  450. package/dist/services/knowledge-portability/organization-portability.d.ts +23 -0
  451. package/dist/services/knowledge-portability/organization-portability.d.ts.map +1 -0
  452. package/dist/services/knowledge-portability/organization-portability.js +3795 -0
  453. package/dist/services/knowledge-portability/organization-portability.js.map +1 -0
  454. package/dist/services/knowledge-portability/organization-skills.d.ts +105 -0
  455. package/dist/services/knowledge-portability/organization-skills.d.ts.map +1 -0
  456. package/dist/services/knowledge-portability/organization-skills.js +3172 -0
  457. package/dist/services/knowledge-portability/organization-skills.js.map +1 -0
  458. package/dist/services/live-events.d.ts +17 -0
  459. package/dist/services/live-events.d.ts.map +1 -0
  460. package/dist/services/live-events.js +33 -0
  461. package/dist/services/live-events.js.map +1 -0
  462. package/dist/services/messenger.d.ts +111 -0
  463. package/dist/services/messenger.d.ts.map +1 -0
  464. package/dist/services/messenger.js +774 -0
  465. package/dist/services/messenger.js.map +1 -0
  466. package/dist/services/native-path-picker.d.ts +18 -0
  467. package/dist/services/native-path-picker.d.ts.map +1 -0
  468. package/dist/services/native-path-picker.js +119 -0
  469. package/dist/services/native-path-picker.js.map +1 -0
  470. package/dist/services/operator-profile.d.ts +7 -0
  471. package/dist/services/operator-profile.d.ts.map +1 -0
  472. package/dist/services/operator-profile.js +66 -0
  473. package/dist/services/operator-profile.js.map +1 -0
  474. package/dist/services/organization-export-readme.d.ts +17 -0
  475. package/dist/services/organization-export-readme.d.ts.map +1 -0
  476. package/dist/services/organization-export-readme.js +148 -0
  477. package/dist/services/organization-export-readme.js.map +1 -0
  478. package/dist/services/organization-portability.d.ts +2 -0
  479. package/dist/services/organization-portability.d.ts.map +1 -0
  480. package/dist/services/organization-portability.js +2 -0
  481. package/dist/services/organization-portability.js.map +1 -0
  482. package/dist/services/organization-skills.d.ts +2 -0
  483. package/dist/services/organization-skills.d.ts.map +1 -0
  484. package/dist/services/organization-skills.js +2 -0
  485. package/dist/services/organization-skills.js.map +1 -0
  486. package/dist/services/organization-workspace-browser.d.ts +8 -0
  487. package/dist/services/organization-workspace-browser.d.ts.map +1 -0
  488. package/dist/services/organization-workspace-browser.js +229 -0
  489. package/dist/services/organization-workspace-browser.js.map +1 -0
  490. package/dist/services/organization-workspace.d.ts +5 -0
  491. package/dist/services/organization-workspace.d.ts.map +1 -0
  492. package/dist/services/organization-workspace.js +71 -0
  493. package/dist/services/organization-workspace.js.map +1 -0
  494. package/dist/services/orgs.d.ts +163 -0
  495. package/dist/services/orgs.d.ts.map +1 -0
  496. package/dist/services/orgs.js +327 -0
  497. package/dist/services/orgs.js.map +1 -0
  498. package/dist/services/plugin-capability-validator.d.ts +108 -0
  499. package/dist/services/plugin-capability-validator.d.ts.map +1 -0
  500. package/dist/services/plugin-capability-validator.js +268 -0
  501. package/dist/services/plugin-capability-validator.js.map +1 -0
  502. package/dist/services/plugin-config-validator.d.ts +26 -0
  503. package/dist/services/plugin-config-validator.d.ts.map +1 -0
  504. package/dist/services/plugin-config-validator.js +41 -0
  505. package/dist/services/plugin-config-validator.js.map +1 -0
  506. package/dist/services/plugin-dev-watcher.d.ts +30 -0
  507. package/dist/services/plugin-dev-watcher.d.ts.map +1 -0
  508. package/dist/services/plugin-dev-watcher.js +241 -0
  509. package/dist/services/plugin-dev-watcher.js.map +1 -0
  510. package/dist/services/plugin-event-bus.d.ts +149 -0
  511. package/dist/services/plugin-event-bus.d.ts.map +1 -0
  512. package/dist/services/plugin-event-bus.js +258 -0
  513. package/dist/services/plugin-event-bus.js.map +1 -0
  514. package/dist/services/plugin-host-service-cleanup.d.ts +14 -0
  515. package/dist/services/plugin-host-service-cleanup.d.ts.map +1 -0
  516. package/dist/services/plugin-host-service-cleanup.js +37 -0
  517. package/dist/services/plugin-host-service-cleanup.js.map +1 -0
  518. package/dist/services/plugin-host-services.d.ts +13 -0
  519. package/dist/services/plugin-host-services.d.ts.map +1 -0
  520. package/dist/services/plugin-host-services.js +973 -0
  521. package/dist/services/plugin-host-services.js.map +1 -0
  522. package/dist/services/plugin-job-coordinator.d.ts +81 -0
  523. package/dist/services/plugin-job-coordinator.d.ts.map +1 -0
  524. package/dist/services/plugin-job-coordinator.js +172 -0
  525. package/dist/services/plugin-job-coordinator.js.map +1 -0
  526. package/dist/services/plugin-job-scheduler.d.ts +163 -0
  527. package/dist/services/plugin-job-scheduler.d.ts.map +1 -0
  528. package/dist/services/plugin-job-scheduler.js +564 -0
  529. package/dist/services/plugin-job-scheduler.js.map +1 -0
  530. package/dist/services/plugin-job-store.d.ts +208 -0
  531. package/dist/services/plugin-job-store.d.ts.map +1 -0
  532. package/dist/services/plugin-job-store.js +350 -0
  533. package/dist/services/plugin-job-store.js.map +1 -0
  534. package/dist/services/plugin-lifecycle.d.ts +203 -0
  535. package/dist/services/plugin-lifecycle.d.ts.map +1 -0
  536. package/dist/services/plugin-lifecycle.js +476 -0
  537. package/dist/services/plugin-lifecycle.js.map +1 -0
  538. package/dist/services/plugin-loader.d.ts +441 -0
  539. package/dist/services/plugin-loader.d.ts.map +1 -0
  540. package/dist/services/plugin-loader.js +1192 -0
  541. package/dist/services/plugin-loader.js.map +1 -0
  542. package/dist/services/plugin-log-retention.d.ts +20 -0
  543. package/dist/services/plugin-log-retention.d.ts.map +1 -0
  544. package/dist/services/plugin-log-retention.js +63 -0
  545. package/dist/services/plugin-log-retention.js.map +1 -0
  546. package/dist/services/plugin-manifest-validator.d.ts +79 -0
  547. package/dist/services/plugin-manifest-validator.d.ts.map +1 -0
  548. package/dist/services/plugin-manifest-validator.js +84 -0
  549. package/dist/services/plugin-manifest-validator.js.map +1 -0
  550. package/dist/services/plugin-registry.d.ts +2542 -0
  551. package/dist/services/plugin-registry.d.ts.map +1 -0
  552. package/dist/services/plugin-registry.js +539 -0
  553. package/dist/services/plugin-registry.js.map +1 -0
  554. package/dist/services/plugin-runtime-sandbox.d.ts +40 -0
  555. package/dist/services/plugin-runtime-sandbox.d.ts.map +1 -0
  556. package/dist/services/plugin-runtime-sandbox.js +154 -0
  557. package/dist/services/plugin-runtime-sandbox.js.map +1 -0
  558. package/dist/services/plugin-secrets-handler.d.ts +81 -0
  559. package/dist/services/plugin-secrets-handler.d.ts.map +1 -0
  560. package/dist/services/plugin-secrets-handler.js +275 -0
  561. package/dist/services/plugin-secrets-handler.js.map +1 -0
  562. package/dist/services/plugin-state-store.d.ts +92 -0
  563. package/dist/services/plugin-state-store.d.ts.map +1 -0
  564. package/dist/services/plugin-state-store.js +190 -0
  565. package/dist/services/plugin-state-store.js.map +1 -0
  566. package/dist/services/plugin-stream-bus.d.ts +29 -0
  567. package/dist/services/plugin-stream-bus.d.ts.map +1 -0
  568. package/dist/services/plugin-stream-bus.js +48 -0
  569. package/dist/services/plugin-stream-bus.js.map +1 -0
  570. package/dist/services/plugin-tool-dispatcher.d.ts +180 -0
  571. package/dist/services/plugin-tool-dispatcher.d.ts.map +1 -0
  572. package/dist/services/plugin-tool-dispatcher.js +224 -0
  573. package/dist/services/plugin-tool-dispatcher.js.map +1 -0
  574. package/dist/services/plugin-tool-registry.d.ts +192 -0
  575. package/dist/services/plugin-tool-registry.d.ts.map +1 -0
  576. package/dist/services/plugin-tool-registry.js +224 -0
  577. package/dist/services/plugin-tool-registry.js.map +1 -0
  578. package/dist/services/plugin-worker-manager.d.ts +260 -0
  579. package/dist/services/plugin-worker-manager.d.ts.map +1 -0
  580. package/dist/services/plugin-worker-manager.js +835 -0
  581. package/dist/services/plugin-worker-manager.js.map +1 -0
  582. package/dist/services/projects.d.ts +92 -0
  583. package/dist/services/projects.d.ts.map +1 -0
  584. package/dist/services/projects.js +705 -0
  585. package/dist/services/projects.js.map +1 -0
  586. package/dist/services/quota-windows.d.ts +9 -0
  587. package/dist/services/quota-windows.d.ts.map +1 -0
  588. package/dist/services/quota-windows.js +56 -0
  589. package/dist/services/quota-windows.js.map +1 -0
  590. package/dist/services/resource-catalog.d.ts +29 -0
  591. package/dist/services/resource-catalog.d.ts.map +1 -0
  592. package/dist/services/resource-catalog.js +298 -0
  593. package/dist/services/resource-catalog.js.map +1 -0
  594. package/dist/services/run-intelligence.d.ts +31 -0
  595. package/dist/services/run-intelligence.d.ts.map +1 -0
  596. package/dist/services/run-intelligence.js +315 -0
  597. package/dist/services/run-intelligence.js.map +1 -0
  598. package/dist/services/run-log-store.d.ts +36 -0
  599. package/dist/services/run-log-store.d.ts.map +1 -0
  600. package/dist/services/run-log-store.js +114 -0
  601. package/dist/services/run-log-store.js.map +1 -0
  602. package/dist/services/runtime-kernel/heartbeat.d.ts +882 -0
  603. package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -0
  604. package/dist/services/runtime-kernel/heartbeat.js +4345 -0
  605. package/dist/services/runtime-kernel/heartbeat.js.map +1 -0
  606. package/dist/services/runtime-trace-metadata.d.ts +12 -0
  607. package/dist/services/runtime-trace-metadata.d.ts.map +1 -0
  608. package/dist/services/runtime-trace-metadata.js +13 -0
  609. package/dist/services/runtime-trace-metadata.js.map +1 -0
  610. package/dist/services/secrets.d.ts +511 -0
  611. package/dist/services/secrets.d.ts.map +1 -0
  612. package/dist/services/secrets.js +289 -0
  613. package/dist/services/secrets.js.map +1 -0
  614. package/dist/services/sidebar-badges.d.ts +11 -0
  615. package/dist/services/sidebar-badges.d.ts.map +1 -0
  616. package/dist/services/sidebar-badges.js +43 -0
  617. package/dist/services/sidebar-badges.js.map +1 -0
  618. package/dist/services/work-products.d.ts +14 -0
  619. package/dist/services/work-products.d.ts.map +1 -0
  620. package/dist/services/work-products.js +100 -0
  621. package/dist/services/work-products.js.map +1 -0
  622. package/dist/services/workspace-operation-log-store.d.ts +35 -0
  623. package/dist/services/workspace-operation-log-store.d.ts.map +1 -0
  624. package/dist/services/workspace-operation-log-store.js +115 -0
  625. package/dist/services/workspace-operation-log-store.js.map +1 -0
  626. package/dist/services/workspace-operations.d.ts +46 -0
  627. package/dist/services/workspace-operations.d.ts.map +1 -0
  628. package/dist/services/workspace-operations.js +237 -0
  629. package/dist/services/workspace-operations.js.map +1 -0
  630. package/dist/services/workspace-runtime.d.ts +164 -0
  631. package/dist/services/workspace-runtime.d.ts.map +1 -0
  632. package/dist/services/workspace-runtime.js +1235 -0
  633. package/dist/services/workspace-runtime.js.map +1 -0
  634. package/dist/startup-banner.d.ts +31 -0
  635. package/dist/startup-banner.d.ts.map +1 -0
  636. package/dist/startup-banner.js +121 -0
  637. package/dist/startup-banner.js.map +1 -0
  638. package/dist/storage/index.d.ts +6 -0
  639. package/dist/storage/index.d.ts.map +1 -0
  640. package/dist/storage/index.js +29 -0
  641. package/dist/storage/index.js.map +1 -0
  642. package/dist/storage/local-disk-provider.d.ts +3 -0
  643. package/dist/storage/local-disk-provider.d.ts.map +1 -0
  644. package/dist/storage/local-disk-provider.js +79 -0
  645. package/dist/storage/local-disk-provider.js.map +1 -0
  646. package/dist/storage/provider-registry.d.ts +4 -0
  647. package/dist/storage/provider-registry.d.ts.map +1 -0
  648. package/dist/storage/provider-registry.js +15 -0
  649. package/dist/storage/provider-registry.js.map +1 -0
  650. package/dist/storage/s3-provider.d.ts +11 -0
  651. package/dist/storage/s3-provider.d.ts.map +1 -0
  652. package/dist/storage/s3-provider.js +123 -0
  653. package/dist/storage/s3-provider.js.map +1 -0
  654. package/dist/storage/service.d.ts +3 -0
  655. package/dist/storage/service.d.ts.map +1 -0
  656. package/dist/storage/service.js +120 -0
  657. package/dist/storage/service.js.map +1 -0
  658. package/dist/storage/types.d.ts +55 -0
  659. package/dist/storage/types.d.ts.map +1 -0
  660. package/dist/storage/types.js +2 -0
  661. package/dist/storage/types.js.map +1 -0
  662. package/dist/ui-branding.d.ts +14 -0
  663. package/dist/ui-branding.d.ts.map +1 -0
  664. package/dist/ui-branding.js +201 -0
  665. package/dist/ui-branding.js.map +1 -0
  666. package/dist/version.d.ts +2 -0
  667. package/dist/version.d.ts.map +1 -0
  668. package/dist/version.js +5 -0
  669. package/dist/version.js.map +1 -0
  670. package/package.json +101 -0
  671. package/resources/bundled-skills/para-memory-files/SKILL.md +114 -0
  672. package/resources/bundled-skills/para-memory-files/references/schemas.md +35 -0
  673. package/resources/bundled-skills/rudder/SKILL.md +265 -0
  674. package/resources/bundled-skills/rudder/references/api-reference.md +253 -0
  675. package/resources/bundled-skills/rudder/references/cli-reference.md +67 -0
  676. package/resources/bundled-skills/rudder/references/organization-skills.md +155 -0
  677. package/resources/bundled-skills/rudder-create-agent/SKILL.md +166 -0
  678. package/resources/bundled-skills/rudder-create-agent/references/api-reference.md +172 -0
  679. package/resources/bundled-skills/rudder-create-agent/references/cli-reference.md +126 -0
  680. package/resources/bundled-skills/rudder-create-plugin/SKILL.md +103 -0
  681. package/resources/community-skills/deep-research/README.md +124 -0
  682. package/resources/community-skills/deep-research/SKILL.md +107 -0
  683. package/resources/community-skills/deep-research/reference/continuation.md +169 -0
  684. package/resources/community-skills/deep-research/reference/html-generation.md +103 -0
  685. package/resources/community-skills/deep-research/reference/methodology.md +421 -0
  686. package/resources/community-skills/deep-research/reference/quality-gates.md +197 -0
  687. package/resources/community-skills/deep-research/reference/report-assembly.md +119 -0
  688. package/resources/community-skills/deep-research/reference/weasyprint_guidelines.md +324 -0
  689. package/resources/community-skills/deep-research/requirements.txt +14 -0
  690. package/resources/community-skills/deep-research/scripts/citation_manager.py +177 -0
  691. package/resources/community-skills/deep-research/scripts/md_to_html.py +330 -0
  692. package/resources/community-skills/deep-research/scripts/research_engine.py +582 -0
  693. package/resources/community-skills/deep-research/scripts/source_evaluator.py +292 -0
  694. package/resources/community-skills/deep-research/scripts/validate_report.py +403 -0
  695. package/resources/community-skills/deep-research/scripts/verify_citations.py +426 -0
  696. package/resources/community-skills/deep-research/scripts/verify_html.py +220 -0
  697. package/resources/community-skills/deep-research/templates/mckinsey_report_template.html +443 -0
  698. package/resources/community-skills/deep-research/templates/report_template.md +433 -0
  699. package/resources/community-skills/skill-creator/SKILL.md +9 -0
  700. package/resources/community-skills/software-product-advisor/SKILL.md +290 -0
  701. package/skills/para-memory-files/SKILL.md +114 -0
  702. package/skills/para-memory-files/references/schemas.md +35 -0
  703. package/skills/rudder/SKILL.md +265 -0
  704. package/skills/rudder/references/api-reference.md +253 -0
  705. package/skills/rudder/references/cli-reference.md +67 -0
  706. package/skills/rudder/references/organization-skills.md +155 -0
  707. package/skills/rudder-create-agent/SKILL.md +166 -0
  708. package/skills/rudder-create-agent/references/api-reference.md +172 -0
  709. package/skills/rudder-create-agent/references/cli-reference.md +126 -0
  710. package/skills/rudder-create-plugin/SKILL.md +103 -0
  711. package/ui-dist/android-chrome-192x192.png +0 -0
  712. package/ui-dist/android-chrome-512x512.png +0 -0
  713. package/ui-dist/android-chrome-maskable-512x512.png +0 -0
  714. package/ui-dist/apple-touch-icon.png +0 -0
  715. package/ui-dist/assets/_basePickBy-CjUu04_e.js +1 -0
  716. package/ui-dist/assets/_baseUniq-C9YNlrVG.js +1 -0
  717. package/ui-dist/assets/apl-B4CMkyY2.js +1 -0
  718. package/ui-dist/assets/arc-CSSZfktq.js +1 -0
  719. package/ui-dist/assets/architectureDiagram-2XIMDMQ5-Co78JKUi.js +36 -0
  720. package/ui-dist/assets/asciiarmor-Df11BRmG.js +1 -0
  721. package/ui-dist/assets/asn1-EdZsLKOL.js +1 -0
  722. package/ui-dist/assets/asterisk-B-8jnY81.js +1 -0
  723. package/ui-dist/assets/blockDiagram-WCTKOSBZ-2KUUIzzz.js +132 -0
  724. package/ui-dist/assets/brainfuck-C4LP7Hcl.js +1 -0
  725. package/ui-dist/assets/c4Diagram-IC4MRINW-C6pq8tPP.js +10 -0
  726. package/ui-dist/assets/channel-BEODbRMk.js +1 -0
  727. package/ui-dist/assets/chunk-4BX2VUAB-ojCLkixe.js +1 -0
  728. package/ui-dist/assets/chunk-55IACEB6-MGONqzmz.js +1 -0
  729. package/ui-dist/assets/chunk-FMBD7UC4-CmGuLv2P.js +15 -0
  730. package/ui-dist/assets/chunk-JSJVCQXG-BNBefVr6.js +1 -0
  731. package/ui-dist/assets/chunk-KX2RTZJC-DIGBQLn5.js +1 -0
  732. package/ui-dist/assets/chunk-NQ4KR5QH-_KEutsaQ.js +220 -0
  733. package/ui-dist/assets/chunk-QZHKN3VN-B6pzyuwm.js +1 -0
  734. package/ui-dist/assets/chunk-WL4C6EOR-B8NDzcfm.js +189 -0
  735. package/ui-dist/assets/classDiagram-VBA2DB6C-CsSqaaRj.js +1 -0
  736. package/ui-dist/assets/classDiagram-v2-RAHNMMFH-CsSqaaRj.js +1 -0
  737. package/ui-dist/assets/clike-B9uivgTg.js +1 -0
  738. package/ui-dist/assets/clojure-BMjYHr_A.js +1 -0
  739. package/ui-dist/assets/clone-5oWMCI0u.js +1 -0
  740. package/ui-dist/assets/cmake-BQqOBYOt.js +1 -0
  741. package/ui-dist/assets/cobol-CWcv1MsR.js +1 -0
  742. package/ui-dist/assets/coffeescript-S37ZYGWr.js +1 -0
  743. package/ui-dist/assets/commonlisp-DBKNyK5s.js +1 -0
  744. package/ui-dist/assets/cose-bilkent-S5V4N54A-B1t6ulcV.js +1 -0
  745. package/ui-dist/assets/crystal-SjHAIU92.js +1 -0
  746. package/ui-dist/assets/css-BnMrqG3P.js +1 -0
  747. package/ui-dist/assets/cypher-C_CwsFkJ.js +1 -0
  748. package/ui-dist/assets/cytoscape.esm-BQaXIfA_.js +331 -0
  749. package/ui-dist/assets/d-pRatUO7H.js +1 -0
  750. package/ui-dist/assets/dagre-KLK3FWXG-DWVC5_HJ.js +4 -0
  751. package/ui-dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  752. package/ui-dist/assets/diagram-E7M64L7V-C4ztYLox.js +24 -0
  753. package/ui-dist/assets/diagram-IFDJBPK2-DtWBGLnA.js +43 -0
  754. package/ui-dist/assets/diagram-P4PSJMXO-BiqiI4Df.js +24 -0
  755. package/ui-dist/assets/diff-DbItnlRl.js +1 -0
  756. package/ui-dist/assets/dockerfile-BKs6k2Af.js +1 -0
  757. package/ui-dist/assets/dtd-DF_7sFjM.js +1 -0
  758. package/ui-dist/assets/dylan-DwRh75JA.js +1 -0
  759. package/ui-dist/assets/ebnf-CDyGwa7X.js +1 -0
  760. package/ui-dist/assets/ecl-Cabwm37j.js +1 -0
  761. package/ui-dist/assets/eiffel-CnydiIhH.js +1 -0
  762. package/ui-dist/assets/elm-vLlmbW-K.js +1 -0
  763. package/ui-dist/assets/erDiagram-INFDFZHY-CUhr9rIh.js +70 -0
  764. package/ui-dist/assets/erlang-BNw1qcRV.js +1 -0
  765. package/ui-dist/assets/factor-kuTfRLto.js +1 -0
  766. package/ui-dist/assets/fcl-Kvtd6kyn.js +1 -0
  767. package/ui-dist/assets/flowDiagram-PKNHOUZH-BEqBmNL-.js +162 -0
  768. package/ui-dist/assets/forth-Ffai-XNe.js +1 -0
  769. package/ui-dist/assets/fortran-DYz_wnZ1.js +1 -0
  770. package/ui-dist/assets/ganttDiagram-A5KZAMGK-CdeWhdno.js +292 -0
  771. package/ui-dist/assets/gas-Bneqetm1.js +1 -0
  772. package/ui-dist/assets/gherkin-heZmZLOM.js +1 -0
  773. package/ui-dist/assets/gitGraphDiagram-K3NZZRJ6-CgG66QFg.js +65 -0
  774. package/ui-dist/assets/graph-rmownl79.js +1 -0
  775. package/ui-dist/assets/groovy-D9Dt4D0W.js +1 -0
  776. package/ui-dist/assets/haskell-Cw1EW3IL.js +1 -0
  777. package/ui-dist/assets/haxe-H-WmDvRZ.js +1 -0
  778. package/ui-dist/assets/http-DBlCnlav.js +1 -0
  779. package/ui-dist/assets/idl-BEugSyMb.js +1 -0
  780. package/ui-dist/assets/index-B1YyDqaG.js +1 -0
  781. package/ui-dist/assets/index-B7exNxYd.js +1 -0
  782. package/ui-dist/assets/index-BIuriVDl.js +1 -0
  783. package/ui-dist/assets/index-BT9rfwYt.js +1 -0
  784. package/ui-dist/assets/index-BZhmacJG.js +1 -0
  785. package/ui-dist/assets/index-B_ebS3U_.js +3 -0
  786. package/ui-dist/assets/index-BnQqZOsc.js +1 -0
  787. package/ui-dist/assets/index-BwPbAax6.js +1 -0
  788. package/ui-dist/assets/index-C5i670o5.js +1 -0
  789. package/ui-dist/assets/index-C9KwE7Yr.js +1 -0
  790. package/ui-dist/assets/index-CDId_UjP.js +1 -0
  791. package/ui-dist/assets/index-CI9ydSGM.js +1 -0
  792. package/ui-dist/assets/index-CKpm3WGI.css +1 -0
  793. package/ui-dist/assets/index-CMP_bzP3.js +2 -0
  794. package/ui-dist/assets/index-CRcHIoCW.js +1 -0
  795. package/ui-dist/assets/index-DZqNY-Lg.js +1 -0
  796. package/ui-dist/assets/index-DbDKJhW-.js +7 -0
  797. package/ui-dist/assets/index-Dkg6MwQ_.js +1 -0
  798. package/ui-dist/assets/index-Dn0iitKg.js +1 -0
  799. package/ui-dist/assets/index-GvHywIOA.js +1323 -0
  800. package/ui-dist/assets/index-WtX4Y4Fx.js +13 -0
  801. package/ui-dist/assets/index-iyC5PHC3.js +6 -0
  802. package/ui-dist/assets/index-jMlzlqoV.js +1 -0
  803. package/ui-dist/assets/index-pTIOLGTe.js +1 -0
  804. package/ui-dist/assets/infoDiagram-LFFYTUFH-CEhdbTYQ.js +2 -0
  805. package/ui-dist/assets/init-Gi6I4Gst.js +1 -0
  806. package/ui-dist/assets/ishikawaDiagram-PHBUUO56-g9GiiXI2.js +70 -0
  807. package/ui-dist/assets/javascript-iXu5QeM3.js +1 -0
  808. package/ui-dist/assets/journeyDiagram-4ABVD52K-CheeZzlg.js +139 -0
  809. package/ui-dist/assets/julia-DuME0IfC.js +1 -0
  810. package/ui-dist/assets/kanban-definition-K7BYSVSG-BTpuAgUJ.js +89 -0
  811. package/ui-dist/assets/katex-B1X10hvy.js +261 -0
  812. package/ui-dist/assets/layout-CuBgufef.js +1 -0
  813. package/ui-dist/assets/linear-CnXO6wXw.js +1 -0
  814. package/ui-dist/assets/livescript-BwQOo05w.js +1 -0
  815. package/ui-dist/assets/lua-BgMRiT3U.js +1 -0
  816. package/ui-dist/assets/mathematica-DTrFuWx2.js +1 -0
  817. package/ui-dist/assets/mbox-CNhZ1qSd.js +1 -0
  818. package/ui-dist/assets/mermaid.core-DVaYxfh9.js +255 -0
  819. package/ui-dist/assets/mindmap-definition-YRQLILUH-00nAuexq.js +68 -0
  820. package/ui-dist/assets/mirc-CjQqDB4T.js +1 -0
  821. package/ui-dist/assets/mllike-CXdrOF99.js +1 -0
  822. package/ui-dist/assets/modelica-Dc1JOy9r.js +1 -0
  823. package/ui-dist/assets/mscgen-BA5vi2Kp.js +1 -0
  824. package/ui-dist/assets/mumps-BT43cFF4.js +1 -0
  825. package/ui-dist/assets/nginx-DdIZxoE0.js +1 -0
  826. package/ui-dist/assets/nsis-LdVXkNf5.js +1 -0
  827. package/ui-dist/assets/ntriples-BfvgReVJ.js +1 -0
  828. package/ui-dist/assets/octave-Ck1zUtKM.js +1 -0
  829. package/ui-dist/assets/ordinal-Cboi1Yqb.js +1 -0
  830. package/ui-dist/assets/oz-BzwKVEFT.js +1 -0
  831. package/ui-dist/assets/pascal--L3eBynH.js +1 -0
  832. package/ui-dist/assets/perl-CdXCOZ3F.js +1 -0
  833. package/ui-dist/assets/pieDiagram-SKSYHLDU-NaOgRqIj.js +30 -0
  834. package/ui-dist/assets/pig-CevX1Tat.js +1 -0
  835. package/ui-dist/assets/powershell-CFHJl5sT.js +1 -0
  836. package/ui-dist/assets/properties-C78fOPTZ.js +1 -0
  837. package/ui-dist/assets/protobuf-ChK-085T.js +1 -0
  838. package/ui-dist/assets/pug-DeIclll2.js +1 -0
  839. package/ui-dist/assets/puppet-DMA9R1ak.js +1 -0
  840. package/ui-dist/assets/python-BuPzkPfP.js +1 -0
  841. package/ui-dist/assets/q-pXgVlZs6.js +1 -0
  842. package/ui-dist/assets/quadrantDiagram-337W2JSQ-Bnf9OCW0.js +7 -0
  843. package/ui-dist/assets/r-B6wPVr8A.js +1 -0
  844. package/ui-dist/assets/requirementDiagram-Z7DCOOCP-BiacZTTh.js +73 -0
  845. package/ui-dist/assets/rpm-CTu-6PCP.js +1 -0
  846. package/ui-dist/assets/ruby-B2Rjki9n.js +1 -0
  847. package/ui-dist/assets/sankeyDiagram-WA2Y5GQK-DOuD4D2Q.js +10 -0
  848. package/ui-dist/assets/sas-B4kiWyti.js +1 -0
  849. package/ui-dist/assets/scheme-C41bIUwD.js +1 -0
  850. package/ui-dist/assets/sequenceDiagram-2WXFIKYE-oV3M_w-H.js +145 -0
  851. package/ui-dist/assets/shell-CjFT_Tl9.js +1 -0
  852. package/ui-dist/assets/sieve-C3Gn_uJK.js +1 -0
  853. package/ui-dist/assets/simple-mode-GW_nhZxv.js +1 -0
  854. package/ui-dist/assets/smalltalk-CnHTOXQT.js +1 -0
  855. package/ui-dist/assets/solr-DehyRSwq.js +1 -0
  856. package/ui-dist/assets/sparql-DkYu6x3z.js +1 -0
  857. package/ui-dist/assets/spreadsheet-BCZA_wO0.js +1 -0
  858. package/ui-dist/assets/sql-D0XecflT.js +1 -0
  859. package/ui-dist/assets/stateDiagram-RAJIS63D-CdRc2Pqb.js +1 -0
  860. package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-CIMHFJYg.js +1 -0
  861. package/ui-dist/assets/stex-C3f8Ysf7.js +1 -0
  862. package/ui-dist/assets/stylus-B533Al4x.js +1 -0
  863. package/ui-dist/assets/swift-BzpIVaGY.js +1 -0
  864. package/ui-dist/assets/tcl-DVfN8rqt.js +1 -0
  865. package/ui-dist/assets/textile-CnDTJFAw.js +1 -0
  866. package/ui-dist/assets/tiddlywiki-DO-Gjzrf.js +1 -0
  867. package/ui-dist/assets/tiki-DGYXhP31.js +1 -0
  868. package/ui-dist/assets/timeline-definition-YZTLITO2-BCWQDIwt.js +61 -0
  869. package/ui-dist/assets/toml-Bm5Em-hy.js +1 -0
  870. package/ui-dist/assets/treemap-KZPCXAKY-BvsIxXAi.js +162 -0
  871. package/ui-dist/assets/troff-wAsdV37c.js +1 -0
  872. package/ui-dist/assets/ttcn-CfJYG6tj.js +1 -0
  873. package/ui-dist/assets/ttcn-cfg-B9xdYoR4.js +1 -0
  874. package/ui-dist/assets/turtle-B1tBg_DP.js +1 -0
  875. package/ui-dist/assets/vb-CmGdzxic.js +1 -0
  876. package/ui-dist/assets/vbscript-BuJXcnF6.js +1 -0
  877. package/ui-dist/assets/velocity-D8B20fx6.js +1 -0
  878. package/ui-dist/assets/vennDiagram-LZ73GAT5-BzibHs4r.js +34 -0
  879. package/ui-dist/assets/verilog-C6RDOZhf.js +1 -0
  880. package/ui-dist/assets/vhdl-lSbBsy5d.js +1 -0
  881. package/ui-dist/assets/webidl-ZXfAyPTL.js +1 -0
  882. package/ui-dist/assets/xquery-DzFWVndE.js +1 -0
  883. package/ui-dist/assets/xychartDiagram-JWTSCODW-CX_Xt_y-.js +7 -0
  884. package/ui-dist/assets/yacas-BJ4BC0dw.js +1 -0
  885. package/ui-dist/assets/z80-Hz9HOZM7.js +1 -0
  886. package/ui-dist/brands/opencode-logo-dark-square.svg +18 -0
  887. package/ui-dist/brands/opencode-logo-light-square.svg +18 -0
  888. package/ui-dist/favicon-16x16.png +0 -0
  889. package/ui-dist/favicon-32x32.png +0 -0
  890. package/ui-dist/favicon-dev-16x16.png +0 -0
  891. package/ui-dist/favicon-dev-32x32.png +0 -0
  892. package/ui-dist/favicon-dev.ico +0 -0
  893. package/ui-dist/favicon.ico +0 -0
  894. package/ui-dist/favicon.svg +1 -0
  895. package/ui-dist/index.html +61 -0
  896. package/ui-dist/rudder-logo.png +0 -0
  897. package/ui-dist/site.webmanifest +30 -0
  898. package/ui-dist/sw.js +42 -0
  899. package/ui-dist/worktree-favicon-16x16.png +0 -0
  900. package/ui-dist/worktree-favicon-32x32.png +0 -0
  901. package/ui-dist/worktree-favicon.ico +0 -0
  902. package/ui-dist/worktree-favicon.svg +1 -0
@@ -0,0 +1,1188 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { and, desc, eq, gt, gte, inArray, isNull, sql } from "drizzle-orm";
3
+ import { agents, approvals, assets, chatAttachments, chatContextLinks, chatConversations, chatConversationUserStates, chatMessages, issues, projects, } from "@rudderhq/db";
4
+ import { notFound, unprocessable } from "../errors.js";
5
+ import { agentService } from "./agents.js";
6
+ import { logActivity } from "./activity-log.js";
7
+ import { approvalService } from "./approvals.js";
8
+ import { documentService } from "./documents.js";
9
+ import { organizationService } from "./orgs.js";
10
+ import { issueApprovalService } from "./issue-approvals.js";
11
+ import { issueService } from "./issues.js";
12
+ const CHAT_TRANSCRIPT_KEY = "__chatTranscript";
13
+ function contentPath(assetId) {
14
+ return `/api/assets/${assetId}/content`;
15
+ }
16
+ function safeTrim(value) {
17
+ const trimmed = value?.trim();
18
+ return trimmed ? trimmed : null;
19
+ }
20
+ function firstLine(value) {
21
+ if (!value)
22
+ return null;
23
+ const line = value
24
+ .split(/\r?\n/)
25
+ .map((part) => part.trim())
26
+ .find(Boolean);
27
+ return line ?? null;
28
+ }
29
+ function truncatePreview(value, max = 140) {
30
+ const text = firstLine(value)?.replace(/\s+/g, " ");
31
+ if (!text)
32
+ return null;
33
+ if (text.length <= max)
34
+ return text;
35
+ return `${text.slice(0, max - 1)}…`;
36
+ }
37
+ function chatTranscriptFromPayload(payload) {
38
+ const transcript = payload?.[CHAT_TRANSCRIPT_KEY];
39
+ return Array.isArray(transcript) ? transcript : [];
40
+ }
41
+ function stripChatMetadataFromPayload(payload) {
42
+ if (!payload)
43
+ return null;
44
+ if (!(CHAT_TRANSCRIPT_KEY in payload))
45
+ return payload;
46
+ const { [CHAT_TRANSCRIPT_KEY]: _ignored, ...rest } = payload;
47
+ return Object.keys(rest).length > 0 ? rest : null;
48
+ }
49
+ function withPersistedTranscript(payload, transcript) {
50
+ const cleanPayload = stripChatMetadataFromPayload(payload);
51
+ if (!transcript || transcript.length === 0) {
52
+ return cleanPayload;
53
+ }
54
+ return {
55
+ ...(cleanPayload ?? {}),
56
+ [CHAT_TRANSCRIPT_KEY]: transcript,
57
+ };
58
+ }
59
+ function issueProposalFromPayload(payload) {
60
+ const root = payload ?? {};
61
+ const proposal = root.issueProposal && typeof root.issueProposal === "object" && !Array.isArray(root.issueProposal)
62
+ ? root.issueProposal
63
+ : root;
64
+ const title = safeTrim(typeof proposal.title === "string" ? proposal.title : null);
65
+ const description = safeTrim(typeof proposal.description === "string" ? proposal.description : null);
66
+ if (!title || !description)
67
+ return null;
68
+ return {
69
+ title,
70
+ description,
71
+ priority: typeof proposal.priority === "string" &&
72
+ ["critical", "high", "medium", "low"].includes(proposal.priority)
73
+ ? proposal.priority
74
+ : "medium",
75
+ projectId: safeTrim(typeof proposal.projectId === "string" ? proposal.projectId : null),
76
+ goalId: safeTrim(typeof proposal.goalId === "string" ? proposal.goalId : null),
77
+ parentId: safeTrim(typeof proposal.parentId === "string" ? proposal.parentId : null),
78
+ assigneeAgentId: safeTrim(typeof proposal.assigneeAgentId === "string" ? proposal.assigneeAgentId : null),
79
+ assigneeUserId: safeTrim(typeof proposal.assigneeUserId === "string" ? proposal.assigneeUserId : null),
80
+ };
81
+ }
82
+ function planDocumentFromPayload(payload, fallbackBody) {
83
+ const root = payload ?? {};
84
+ const rawDocument = root.planDocument && typeof root.planDocument === "object" && !Array.isArray(root.planDocument)
85
+ ? root.planDocument
86
+ : root.plan && typeof root.plan === "object" && !Array.isArray(root.plan)
87
+ ? root.plan
88
+ : null;
89
+ const title = safeTrim(typeof rawDocument?.title === "string" ? rawDocument.title : null) ?? "Plan";
90
+ const body = safeTrim(typeof rawDocument?.body === "string" ? rawDocument.body : null)
91
+ ?? safeTrim(fallbackBody);
92
+ if (!body)
93
+ return null;
94
+ return {
95
+ title,
96
+ body,
97
+ changeSummary: safeTrim(typeof rawDocument?.changeSummary === "string" ? rawDocument.changeSummary : null)
98
+ ?? "Created from chat plan mode",
99
+ };
100
+ }
101
+ function operationProposalFromPayload(payload) {
102
+ const root = payload ?? {};
103
+ const proposal = root.operationProposal && typeof root.operationProposal === "object" && !Array.isArray(root.operationProposal)
104
+ ? root.operationProposal
105
+ : root;
106
+ const targetType = typeof proposal.targetType === "string" ? proposal.targetType : null;
107
+ const targetId = safeTrim(typeof proposal.targetId === "string" ? proposal.targetId : null);
108
+ const summary = safeTrim(typeof proposal.summary === "string" ? proposal.summary : null);
109
+ const patch = proposal.patch && typeof proposal.patch === "object" && !Array.isArray(proposal.patch)
110
+ ? proposal.patch
111
+ : null;
112
+ if ((targetType !== "organization" && targetType !== "agent") || !targetId || !summary || !patch) {
113
+ return null;
114
+ }
115
+ return {
116
+ targetType,
117
+ targetId,
118
+ summary,
119
+ patch,
120
+ };
121
+ }
122
+ function operationProposalDecisionStatusFromPayload(payload) {
123
+ const root = payload ?? {};
124
+ const rawState = root.operationProposalState && typeof root.operationProposalState === "object" && !Array.isArray(root.operationProposalState)
125
+ ? root.operationProposalState
126
+ : null;
127
+ const status = typeof rawState?.status === "string"
128
+ && ["pending", "approved", "rejected", "revision_requested"].includes(rawState.status)
129
+ ? rawState.status
130
+ : "pending";
131
+ return {
132
+ status,
133
+ decisionNote: safeTrim(typeof rawState?.decisionNote === "string" ? rawState.decisionNote : null),
134
+ decidedByUserId: safeTrim(typeof rawState?.decidedByUserId === "string" ? rawState.decidedByUserId : null),
135
+ decidedAt: safeTrim(typeof rawState?.decidedAt === "string" ? rawState.decidedAt : null),
136
+ };
137
+ }
138
+ function withOperationProposalDecisionState(payload, state) {
139
+ return {
140
+ ...(payload ?? {}),
141
+ operationProposalState: state,
142
+ };
143
+ }
144
+ export function chatService(db) {
145
+ const issuesSvc = issueService(db);
146
+ const approvalsSvc = approvalService(db);
147
+ const issueApprovalsSvc = issueApprovalService(db);
148
+ const organizationsSvc = organizationService(db);
149
+ const agentsSvc = agentService(db);
150
+ const documentsSvc = documentService(db);
151
+ async function resolveContextEntities(rows) {
152
+ const issueIds = rows.filter((row) => row.entityType === "issue").map((row) => row.entityId);
153
+ const projectIds = rows.filter((row) => row.entityType === "project").map((row) => row.entityId);
154
+ const agentIds = rows.filter((row) => row.entityType === "agent").map((row) => row.entityId);
155
+ const [issueRows, projectRows, agentRows] = await Promise.all([
156
+ issueIds.length
157
+ ? db
158
+ .select({
159
+ id: issues.id,
160
+ identifier: issues.identifier,
161
+ title: issues.title,
162
+ status: issues.status,
163
+ })
164
+ .from(issues)
165
+ .where(inArray(issues.id, issueIds))
166
+ : Promise.resolve([]),
167
+ projectIds.length
168
+ ? db
169
+ .select({
170
+ id: projects.id,
171
+ name: projects.name,
172
+ description: projects.description,
173
+ status: projects.status,
174
+ })
175
+ .from(projects)
176
+ .where(inArray(projects.id, projectIds))
177
+ : Promise.resolve([]),
178
+ agentIds.length
179
+ ? db
180
+ .select({
181
+ id: agents.id,
182
+ name: agents.name,
183
+ title: agents.title,
184
+ status: agents.status,
185
+ })
186
+ .from(agents)
187
+ .where(inArray(agents.id, agentIds))
188
+ : Promise.resolve([]),
189
+ ]);
190
+ const entityMap = new Map();
191
+ for (const row of issueRows) {
192
+ entityMap.set(`issue:${row.id}`, {
193
+ type: "issue",
194
+ id: row.id,
195
+ label: row.title,
196
+ subtitle: row.status,
197
+ identifier: row.identifier,
198
+ status: row.status,
199
+ href: `/issues/${row.identifier ?? row.id}`,
200
+ });
201
+ }
202
+ for (const row of projectRows) {
203
+ entityMap.set(`project:${row.id}`, {
204
+ type: "project",
205
+ id: row.id,
206
+ label: row.name,
207
+ subtitle: row.description,
208
+ identifier: null,
209
+ status: row.status,
210
+ href: `/projects/${row.id}`,
211
+ });
212
+ }
213
+ for (const row of agentRows) {
214
+ entityMap.set(`agent:${row.id}`, {
215
+ type: "agent",
216
+ id: row.id,
217
+ label: row.name,
218
+ subtitle: row.title,
219
+ identifier: null,
220
+ status: row.status,
221
+ href: `/agents/${row.id}`,
222
+ });
223
+ }
224
+ return rows.map((row) => ({
225
+ ...row,
226
+ entity: entityMap.get(`${row.entityType}:${row.entityId}`) ?? null,
227
+ }));
228
+ }
229
+ async function listContextLinksForConversationIds(conversationIds) {
230
+ if (conversationIds.length === 0)
231
+ return new Map();
232
+ const rows = await db
233
+ .select()
234
+ .from(chatContextLinks)
235
+ .where(inArray(chatContextLinks.conversationId, conversationIds))
236
+ .orderBy(chatContextLinks.createdAt);
237
+ const resolved = await resolveContextEntities(rows);
238
+ const map = new Map();
239
+ for (const row of resolved) {
240
+ const list = map.get(row.conversationId);
241
+ if (list)
242
+ list.push(row);
243
+ else
244
+ map.set(row.conversationId, [row]);
245
+ }
246
+ return map;
247
+ }
248
+ async function listPrimaryIssues(conversationRows) {
249
+ const primaryIssueIds = conversationRows
250
+ .map((row) => row.primaryIssueId)
251
+ .filter((id) => Boolean(id));
252
+ if (primaryIssueIds.length === 0)
253
+ return new Map();
254
+ const rows = await db
255
+ .select({
256
+ id: issues.id,
257
+ identifier: issues.identifier,
258
+ title: issues.title,
259
+ status: issues.status,
260
+ priority: issues.priority,
261
+ })
262
+ .from(issues)
263
+ .where(inArray(issues.id, primaryIssueIds));
264
+ return new Map(rows.map((row) => [row.id, row]));
265
+ }
266
+ async function ensureConversationUserStates(rows, userId) {
267
+ if (rows.length === 0)
268
+ return;
269
+ const now = new Date();
270
+ await db
271
+ .insert(chatConversationUserStates)
272
+ .values(rows.map((row) => ({
273
+ orgId: row.orgId,
274
+ conversationId: row.id,
275
+ userId,
276
+ lastReadAt: row.lastMessageAt ?? row.updatedAt ?? row.createdAt,
277
+ updatedAt: now,
278
+ })))
279
+ .onConflictDoNothing();
280
+ }
281
+ async function listConversationUserStates(orgId, userId, conversationIds) {
282
+ if (conversationIds.length === 0)
283
+ return new Map();
284
+ const rows = await db
285
+ .select()
286
+ .from(chatConversationUserStates)
287
+ .where(and(eq(chatConversationUserStates.orgId, orgId), eq(chatConversationUserStates.userId, userId), inArray(chatConversationUserStates.conversationId, conversationIds)));
288
+ return new Map(rows.map((row) => [row.conversationId, row]));
289
+ }
290
+ async function listUnreadCountsByConversation(orgId, userId, conversationIds) {
291
+ if (conversationIds.length === 0)
292
+ return new Map();
293
+ const rows = await db
294
+ .select({
295
+ conversationId: chatMessages.conversationId,
296
+ count: sql `count(*)`,
297
+ })
298
+ .from(chatMessages)
299
+ .innerJoin(chatConversationUserStates, and(eq(chatConversationUserStates.orgId, orgId), eq(chatConversationUserStates.userId, userId), eq(chatConversationUserStates.conversationId, chatMessages.conversationId)))
300
+ .where(and(eq(chatMessages.orgId, orgId), inArray(chatMessages.conversationId, conversationIds), isNull(chatMessages.supersededAt), sql `${chatMessages.role} <> 'user'`, gt(chatMessages.createdAt, chatConversationUserStates.lastReadAt)))
301
+ .groupBy(chatMessages.conversationId);
302
+ return new Map(rows.map((row) => [row.conversationId, Number(row.count ?? 0)]));
303
+ }
304
+ async function listPendingProposalStates(orgId, conversationIds) {
305
+ if (conversationIds.length === 0)
306
+ return new Set();
307
+ const rows = await db
308
+ .select({
309
+ conversationId: chatMessages.conversationId,
310
+ })
311
+ .from(chatMessages)
312
+ .innerJoin(approvals, eq(chatMessages.approvalId, approvals.id))
313
+ .where(and(eq(chatMessages.orgId, orgId), inArray(chatMessages.conversationId, conversationIds), isNull(chatMessages.supersededAt), inArray(approvals.status, ["pending", "revision_requested"])))
314
+ .groupBy(chatMessages.conversationId);
315
+ return new Set(rows.map((row) => row.conversationId));
316
+ }
317
+ async function listLatestReplyPreviews(orgId, conversationIds) {
318
+ if (conversationIds.length === 0)
319
+ return new Map();
320
+ const latestReplyAt = db
321
+ .select({
322
+ conversationId: chatMessages.conversationId,
323
+ latestReplyAt: sql `max(${chatMessages.createdAt})`.as("latest_reply_at"),
324
+ })
325
+ .from(chatMessages)
326
+ .where(and(eq(chatMessages.orgId, orgId), inArray(chatMessages.conversationId, conversationIds), isNull(chatMessages.supersededAt), sql `${chatMessages.role} <> 'user'`))
327
+ .groupBy(chatMessages.conversationId)
328
+ .as("latest_chat_reply_at");
329
+ const rows = await db
330
+ .select({
331
+ conversationId: chatMessages.conversationId,
332
+ body: chatMessages.body,
333
+ })
334
+ .from(chatMessages)
335
+ .innerJoin(latestReplyAt, and(eq(chatMessages.conversationId, latestReplyAt.conversationId), eq(chatMessages.createdAt, latestReplyAt.latestReplyAt)))
336
+ .where(and(eq(chatMessages.orgId, orgId), inArray(chatMessages.conversationId, conversationIds), isNull(chatMessages.supersededAt), sql `${chatMessages.role} <> 'user'`))
337
+ .orderBy(desc(chatMessages.createdAt));
338
+ const map = new Map();
339
+ for (const row of rows) {
340
+ if (!map.has(row.conversationId)) {
341
+ map.set(row.conversationId, truncatePreview(row.body));
342
+ }
343
+ }
344
+ return map;
345
+ }
346
+ async function hydrateConversations(rows, userId) {
347
+ if (userId) {
348
+ await ensureConversationUserStates(rows, userId);
349
+ }
350
+ const conversationIds = rows.map((row) => row.id);
351
+ const orgId = rows[0]?.orgId ?? null;
352
+ const [contextLinksByConversationId, primaryIssuesById, userStatesByConversationId, unreadCountsByConversationId, pendingProposalConversationIds, latestReplyPreviewsByConversationId,] = await Promise.all([
353
+ listContextLinksForConversationIds(rows.map((row) => row.id)),
354
+ listPrimaryIssues(rows),
355
+ userId && orgId
356
+ ? listConversationUserStates(orgId, userId, conversationIds)
357
+ : Promise.resolve(new Map()),
358
+ userId && orgId
359
+ ? listUnreadCountsByConversation(orgId, userId, conversationIds)
360
+ : Promise.resolve(new Map()),
361
+ orgId
362
+ ? listPendingProposalStates(orgId, conversationIds)
363
+ : Promise.resolve(new Set()),
364
+ orgId
365
+ ? listLatestReplyPreviews(orgId, conversationIds)
366
+ : Promise.resolve(new Map()),
367
+ ]);
368
+ return rows.map((row) => ({
369
+ ...row,
370
+ primaryIssue: row.primaryIssueId ? (primaryIssuesById.get(row.primaryIssueId) ?? null) : null,
371
+ latestReplyPreview: latestReplyPreviewsByConversationId.get(row.id) ?? null,
372
+ contextLinks: contextLinksByConversationId.get(row.id) ?? [],
373
+ lastReadAt: userStatesByConversationId.get(row.id)?.lastReadAt ?? null,
374
+ isPinned: Boolean(userStatesByConversationId.get(row.id)?.pinnedAt),
375
+ unreadCount: unreadCountsByConversationId.get(row.id) ?? 0,
376
+ isUnread: (unreadCountsByConversationId.get(row.id) ?? 0) > 0,
377
+ needsAttention: (unreadCountsByConversationId.get(row.id) ?? 0) > 0 ||
378
+ pendingProposalConversationIds.has(row.id),
379
+ }));
380
+ }
381
+ async function getConversationOrThrow(id) {
382
+ const row = await db
383
+ .select()
384
+ .from(chatConversations)
385
+ .where(eq(chatConversations.id, id))
386
+ .then((rows) => rows[0] ?? null);
387
+ if (!row)
388
+ throw notFound("Chat conversation not found");
389
+ return row;
390
+ }
391
+ async function listAttachmentsForMessageIds(messageIds) {
392
+ if (messageIds.length === 0)
393
+ return new Map();
394
+ const rows = await db
395
+ .select({
396
+ id: chatAttachments.id,
397
+ orgId: chatAttachments.orgId,
398
+ conversationId: chatAttachments.conversationId,
399
+ messageId: chatAttachments.messageId,
400
+ assetId: chatAttachments.assetId,
401
+ provider: assets.provider,
402
+ objectKey: assets.objectKey,
403
+ contentType: assets.contentType,
404
+ byteSize: assets.byteSize,
405
+ sha256: assets.sha256,
406
+ originalFilename: assets.originalFilename,
407
+ createdByAgentId: assets.createdByAgentId,
408
+ createdByUserId: assets.createdByUserId,
409
+ createdAt: chatAttachments.createdAt,
410
+ updatedAt: chatAttachments.updatedAt,
411
+ })
412
+ .from(chatAttachments)
413
+ .innerJoin(assets, eq(chatAttachments.assetId, assets.id))
414
+ .where(inArray(chatAttachments.messageId, messageIds))
415
+ .orderBy(chatAttachments.createdAt);
416
+ const map = new Map();
417
+ for (const row of rows) {
418
+ const attachment = {
419
+ ...row,
420
+ contentPath: contentPath(row.assetId),
421
+ };
422
+ const list = map.get(row.messageId);
423
+ if (list)
424
+ list.push(attachment);
425
+ else
426
+ map.set(row.messageId, [attachment]);
427
+ }
428
+ return map;
429
+ }
430
+ async function listApprovalsForMessages(rows) {
431
+ const approvalIds = rows.map((row) => row.approvalId).filter((id) => Boolean(id));
432
+ if (approvalIds.length === 0)
433
+ return new Map();
434
+ const approvalRows = await db
435
+ .select()
436
+ .from(approvals)
437
+ .where(inArray(approvals.id, approvalIds));
438
+ return new Map(approvalRows.map((row) => [row.id, row]));
439
+ }
440
+ async function hydrateMessages(rows) {
441
+ const [attachmentsByMessageId, approvalsById] = await Promise.all([
442
+ listAttachmentsForMessageIds(rows.map((row) => row.id)),
443
+ listApprovalsForMessages(rows),
444
+ ]);
445
+ return rows.map((row) => ({
446
+ ...row,
447
+ structuredPayload: stripChatMetadataFromPayload(row.structuredPayload),
448
+ transcript: chatTranscriptFromPayload(row.structuredPayload),
449
+ approval: row.approvalId ? (approvalsById.get(row.approvalId) ?? null) : null,
450
+ attachments: attachmentsByMessageId.get(row.id) ?? [],
451
+ }));
452
+ }
453
+ async function refreshConversationTouch(conversationId, at = new Date()) {
454
+ await db
455
+ .update(chatConversations)
456
+ .set({
457
+ lastMessageAt: at,
458
+ updatedAt: at,
459
+ })
460
+ .where(eq(chatConversations.id, conversationId));
461
+ }
462
+ async function maybePromoteConversationTitle(conversationId, body) {
463
+ const conversation = await getConversationOrThrow(conversationId);
464
+ const title = conversation.title.trim();
465
+ if (title !== "New chat")
466
+ return;
467
+ const nextTitle = body.split(/\r?\n/, 1)[0]?.trim().slice(0, 80);
468
+ if (!nextTitle)
469
+ return;
470
+ await db
471
+ .update(chatConversations)
472
+ .set({ title: nextTitle, updatedAt: new Date() })
473
+ .where(eq(chatConversations.id, conversationId));
474
+ }
475
+ async function list(orgId, options, userId) {
476
+ const status = options?.status ?? "active";
477
+ const where = status === "all"
478
+ ? eq(chatConversations.orgId, orgId)
479
+ : and(eq(chatConversations.orgId, orgId), eq(chatConversations.status, status));
480
+ const rows = await db
481
+ .select()
482
+ .from(chatConversations)
483
+ .where(where)
484
+ .orderBy(desc(sql `coalesce(${chatConversations.lastMessageAt}, ${chatConversations.updatedAt})`));
485
+ return hydrateConversations(rows, userId);
486
+ }
487
+ async function getById(id, userId) {
488
+ const row = await db
489
+ .select()
490
+ .from(chatConversations)
491
+ .where(eq(chatConversations.id, id))
492
+ .then((rows) => rows[0] ?? null);
493
+ if (!row)
494
+ return null;
495
+ const [conversation] = await hydrateConversations([row], userId);
496
+ return conversation ?? null;
497
+ }
498
+ async function create(orgId, data) {
499
+ const created = await db.transaction(async (tx) => {
500
+ const [conversation] = await tx
501
+ .insert(chatConversations)
502
+ .values({
503
+ orgId,
504
+ title: data.title?.trim() || "New chat",
505
+ summary: data.summary ?? null,
506
+ preferredAgentId: data.preferredAgentId ?? null,
507
+ issueCreationMode: data.issueCreationMode,
508
+ planMode: data.planMode,
509
+ createdByUserId: data.createdByUserId,
510
+ })
511
+ .returning();
512
+ if (!conversation)
513
+ throw new Error("Failed to create chat conversation");
514
+ const contextLinks = data.contextLinks ?? [];
515
+ if (contextLinks.length > 0) {
516
+ await tx
517
+ .insert(chatContextLinks)
518
+ .values(contextLinks.map((link) => ({
519
+ orgId,
520
+ conversationId: conversation.id,
521
+ entityType: link.entityType,
522
+ entityId: link.entityId,
523
+ metadata: link.metadata ?? null,
524
+ })))
525
+ .onConflictDoNothing();
526
+ }
527
+ return conversation;
528
+ });
529
+ return getById(created.id);
530
+ }
531
+ async function update(id, patch) {
532
+ const [updated] = await db
533
+ .update(chatConversations)
534
+ .set({
535
+ ...patch,
536
+ updatedAt: new Date(),
537
+ })
538
+ .where(eq(chatConversations.id, id))
539
+ .returning();
540
+ if (!updated)
541
+ return null;
542
+ return getById(id);
543
+ }
544
+ async function resolve(id) {
545
+ const [updated] = await db
546
+ .update(chatConversations)
547
+ .set({
548
+ status: "resolved",
549
+ resolvedAt: new Date(),
550
+ updatedAt: new Date(),
551
+ })
552
+ .where(eq(chatConversations.id, id))
553
+ .returning();
554
+ if (!updated)
555
+ return null;
556
+ return getById(id);
557
+ }
558
+ async function markRead(conversationId, orgId, userId, readAt = new Date()) {
559
+ const now = new Date();
560
+ const [row] = await db
561
+ .insert(chatConversationUserStates)
562
+ .values({
563
+ orgId,
564
+ conversationId,
565
+ userId,
566
+ lastReadAt: readAt,
567
+ updatedAt: now,
568
+ })
569
+ .onConflictDoUpdate({
570
+ target: [
571
+ chatConversationUserStates.orgId,
572
+ chatConversationUserStates.conversationId,
573
+ chatConversationUserStates.userId,
574
+ ],
575
+ set: {
576
+ lastReadAt: readAt,
577
+ updatedAt: now,
578
+ },
579
+ })
580
+ .returning();
581
+ return row;
582
+ }
583
+ async function setPinned(conversationId, orgId, userId, pinned) {
584
+ const conversation = await getConversationOrThrow(conversationId);
585
+ const now = new Date();
586
+ const [row] = await db
587
+ .insert(chatConversationUserStates)
588
+ .values({
589
+ orgId,
590
+ conversationId,
591
+ userId,
592
+ lastReadAt: conversation.lastMessageAt ?? conversation.updatedAt ?? conversation.createdAt,
593
+ pinnedAt: pinned ? now : null,
594
+ updatedAt: now,
595
+ })
596
+ .onConflictDoUpdate({
597
+ target: [
598
+ chatConversationUserStates.orgId,
599
+ chatConversationUserStates.conversationId,
600
+ chatConversationUserStates.userId,
601
+ ],
602
+ set: {
603
+ pinnedAt: pinned ? now : null,
604
+ updatedAt: now,
605
+ },
606
+ })
607
+ .returning();
608
+ return row;
609
+ }
610
+ async function listMessages(conversationId) {
611
+ const rows = await db
612
+ .select()
613
+ .from(chatMessages)
614
+ .where(eq(chatMessages.conversationId, conversationId))
615
+ .orderBy(chatMessages.createdAt);
616
+ return hydrateMessages(rows);
617
+ }
618
+ async function getMessage(conversationId, messageId) {
619
+ const row = await db
620
+ .select()
621
+ .from(chatMessages)
622
+ .where(and(eq(chatMessages.conversationId, conversationId), eq(chatMessages.id, messageId)))
623
+ .then((rows) => rows[0] ?? null);
624
+ if (!row)
625
+ return null;
626
+ const [hydrated] = await hydrateMessages([row]);
627
+ return hydrated ?? null;
628
+ }
629
+ async function assignLegacyTurnChainForUserMessage(target) {
630
+ const turnId = randomUUID();
631
+ const now = new Date();
632
+ await db
633
+ .update(chatMessages)
634
+ .set({ chatTurnId: turnId, turnVariant: 0, updatedAt: now })
635
+ .where(eq(chatMessages.id, target.id));
636
+ const following = await db
637
+ .select()
638
+ .from(chatMessages)
639
+ .where(and(eq(chatMessages.conversationId, target.conversationId), gt(chatMessages.createdAt, target.createdAt)))
640
+ .orderBy(chatMessages.createdAt);
641
+ for (const row of following) {
642
+ if (row.role === "user")
643
+ break;
644
+ await db
645
+ .update(chatMessages)
646
+ .set({ chatTurnId: turnId, turnVariant: 0, updatedAt: now })
647
+ .where(eq(chatMessages.id, row.id));
648
+ }
649
+ }
650
+ async function supersedeActiveMessagesFrom(conversationId, fromCreatedAt) {
651
+ const now = new Date();
652
+ await db
653
+ .update(chatMessages)
654
+ .set({ supersededAt: now, updatedAt: now })
655
+ .where(and(eq(chatMessages.conversationId, conversationId), isNull(chatMessages.supersededAt), gte(chatMessages.createdAt, fromCreatedAt)));
656
+ }
657
+ async function addUserChatMessage(conversationId, orgId, body, editUserMessageId) {
658
+ if (editUserMessageId) {
659
+ let [target] = await db
660
+ .select()
661
+ .from(chatMessages)
662
+ .where(and(eq(chatMessages.id, editUserMessageId), eq(chatMessages.conversationId, conversationId)))
663
+ .limit(1);
664
+ if (!target) {
665
+ throw notFound("Chat message not found");
666
+ }
667
+ if (target.role !== "user" || target.kind !== "message") {
668
+ throw unprocessable("Only plain user messages can be edited");
669
+ }
670
+ if (target.supersededAt) {
671
+ throw unprocessable("Cannot edit a superseded message");
672
+ }
673
+ if (!target.chatTurnId) {
674
+ await assignLegacyTurnChainForUserMessage(target);
675
+ [target] = await db
676
+ .select()
677
+ .from(chatMessages)
678
+ .where(eq(chatMessages.id, editUserMessageId))
679
+ .limit(1);
680
+ if (!target?.chatTurnId) {
681
+ throw new Error("Failed to assign chat turn metadata");
682
+ }
683
+ }
684
+ await supersedeActiveMessagesFrom(conversationId, target.createdAt);
685
+ const turnId = target.chatTurnId;
686
+ const nextVariant = target.turnVariant + 1;
687
+ return addMessage(conversationId, {
688
+ orgId,
689
+ role: "user",
690
+ kind: "message",
691
+ body,
692
+ chatTurnId: turnId,
693
+ turnVariant: nextVariant,
694
+ });
695
+ }
696
+ const turnId = randomUUID();
697
+ return addMessage(conversationId, {
698
+ orgId,
699
+ role: "user",
700
+ kind: "message",
701
+ body,
702
+ chatTurnId: turnId,
703
+ turnVariant: 0,
704
+ });
705
+ }
706
+ async function addMessage(conversationId, input) {
707
+ const [message] = await db
708
+ .insert(chatMessages)
709
+ .values({
710
+ orgId: input.orgId,
711
+ conversationId,
712
+ role: input.role,
713
+ kind: input.kind,
714
+ status: input.status ?? "completed",
715
+ body: input.body,
716
+ structuredPayload: withPersistedTranscript(input.structuredPayload ?? null, input.transcript ?? []),
717
+ approvalId: input.approvalId ?? null,
718
+ replyingAgentId: input.replyingAgentId ?? null,
719
+ chatTurnId: input.chatTurnId ?? null,
720
+ turnVariant: input.turnVariant ?? 0,
721
+ })
722
+ .returning();
723
+ if (!message)
724
+ throw new Error("Failed to create chat message");
725
+ await refreshConversationTouch(conversationId, message.createdAt);
726
+ if (input.role === "user") {
727
+ await maybePromoteConversationTitle(conversationId, input.body);
728
+ }
729
+ const [hydrated] = await hydrateMessages([message]);
730
+ return hydrated;
731
+ }
732
+ async function updateMessageStructuredPayload(conversationId, messageId, structuredPayload) {
733
+ const existing = await db
734
+ .select()
735
+ .from(chatMessages)
736
+ .where(and(eq(chatMessages.conversationId, conversationId), eq(chatMessages.id, messageId)))
737
+ .then((rows) => rows[0] ?? null);
738
+ if (!existing)
739
+ return null;
740
+ const [updated] = await db
741
+ .update(chatMessages)
742
+ .set({
743
+ structuredPayload: withPersistedTranscript(structuredPayload, chatTranscriptFromPayload(existing.structuredPayload)),
744
+ updatedAt: new Date(),
745
+ })
746
+ .where(and(eq(chatMessages.conversationId, conversationId), eq(chatMessages.id, messageId)))
747
+ .returning();
748
+ const [hydrated] = await hydrateMessages([updated]);
749
+ return hydrated ?? null;
750
+ }
751
+ async function addContextLink(conversationId, orgId, input) {
752
+ await db
753
+ .insert(chatContextLinks)
754
+ .values({
755
+ orgId,
756
+ conversationId,
757
+ entityType: input.entityType,
758
+ entityId: input.entityId,
759
+ metadata: input.metadata ?? null,
760
+ })
761
+ .onConflictDoNothing();
762
+ const links = await db
763
+ .select()
764
+ .from(chatContextLinks)
765
+ .where(eq(chatContextLinks.conversationId, conversationId))
766
+ .orderBy(chatContextLinks.createdAt);
767
+ const resolved = await resolveContextEntities(links);
768
+ return resolved.find((row) => row.entityType === input.entityType && row.entityId === input.entityId) ?? null;
769
+ }
770
+ async function createAttachment(input) {
771
+ const conversation = await getConversationOrThrow(input.conversationId);
772
+ if (conversation.orgId !== input.orgId) {
773
+ throw unprocessable("Chat conversation does not belong to organization");
774
+ }
775
+ const message = await db
776
+ .select()
777
+ .from(chatMessages)
778
+ .where(and(eq(chatMessages.id, input.messageId), eq(chatMessages.conversationId, input.conversationId)))
779
+ .then((rows) => rows[0] ?? null);
780
+ if (!message) {
781
+ throw notFound("Chat message not found");
782
+ }
783
+ return db.transaction(async (tx) => {
784
+ const [asset] = await tx
785
+ .insert(assets)
786
+ .values({
787
+ orgId: input.orgId,
788
+ provider: input.provider,
789
+ objectKey: input.objectKey,
790
+ contentType: input.contentType,
791
+ byteSize: input.byteSize,
792
+ sha256: input.sha256,
793
+ originalFilename: input.originalFilename,
794
+ createdByAgentId: input.createdByAgentId,
795
+ createdByUserId: input.createdByUserId,
796
+ })
797
+ .returning();
798
+ if (!asset)
799
+ throw new Error("Failed to create asset");
800
+ const [attachment] = await tx
801
+ .insert(chatAttachments)
802
+ .values({
803
+ orgId: input.orgId,
804
+ conversationId: input.conversationId,
805
+ messageId: input.messageId,
806
+ assetId: asset.id,
807
+ })
808
+ .returning();
809
+ if (!attachment)
810
+ throw new Error("Failed to create chat attachment");
811
+ return {
812
+ ...attachment,
813
+ provider: asset.provider,
814
+ objectKey: asset.objectKey,
815
+ contentType: asset.contentType,
816
+ byteSize: asset.byteSize,
817
+ sha256: asset.sha256,
818
+ originalFilename: asset.originalFilename,
819
+ createdByAgentId: asset.createdByAgentId,
820
+ createdByUserId: asset.createdByUserId,
821
+ contentPath: contentPath(asset.id),
822
+ };
823
+ });
824
+ }
825
+ async function convertToIssue(conversationId, input) {
826
+ const conversation = await getConversationOrThrow(conversationId);
827
+ const existingPrimaryIssueId = conversation.primaryIssueId;
828
+ if (existingPrimaryIssueId) {
829
+ const issue = await issuesSvc.getById(existingPrimaryIssueId);
830
+ if (issue)
831
+ return issue;
832
+ }
833
+ let issueProposal = input.proposal ? issueProposalFromPayload(input.proposal) : null;
834
+ let sourceMessage = null;
835
+ if (!issueProposal) {
836
+ const message = input.messageId
837
+ ? await db
838
+ .select()
839
+ .from(chatMessages)
840
+ .where(and(eq(chatMessages.id, input.messageId), eq(chatMessages.conversationId, conversationId)))
841
+ .then((rows) => rows[0] ?? null)
842
+ : await db
843
+ .select()
844
+ .from(chatMessages)
845
+ .where(and(eq(chatMessages.conversationId, conversationId), eq(chatMessages.kind, "issue_proposal")))
846
+ .orderBy(desc(chatMessages.createdAt))
847
+ .then((rows) => rows[0] ?? null);
848
+ if (!message)
849
+ throw unprocessable("No issue proposal found for this conversation");
850
+ sourceMessage = message;
851
+ issueProposal = issueProposalFromPayload(message.structuredPayload);
852
+ }
853
+ if (!issueProposal) {
854
+ throw unprocessable("Issue proposal payload was incomplete");
855
+ }
856
+ const issue = await issuesSvc.create(conversation.orgId, {
857
+ ...issueProposal,
858
+ createdByUserId: input.actorUserId,
859
+ });
860
+ const planDocument = planDocumentFromPayload(sourceMessage?.structuredPayload ?? input.proposal ?? null, sourceMessage?.body ?? null);
861
+ await db.transaction(async (tx) => {
862
+ await tx
863
+ .update(chatConversations)
864
+ .set({
865
+ primaryIssueId: issue.id,
866
+ updatedAt: new Date(),
867
+ })
868
+ .where(eq(chatConversations.id, conversationId));
869
+ await tx
870
+ .insert(chatContextLinks)
871
+ .values({
872
+ orgId: conversation.orgId,
873
+ conversationId,
874
+ entityType: "issue",
875
+ entityId: issue.id,
876
+ metadata: sourceMessage ? { sourceMessageId: sourceMessage.id } : null,
877
+ })
878
+ .onConflictDoNothing();
879
+ });
880
+ if (planDocument) {
881
+ await documentsSvc.upsertIssueDocument({
882
+ issueId: issue.id,
883
+ key: "plan",
884
+ title: planDocument.title,
885
+ format: "markdown",
886
+ body: planDocument.body,
887
+ changeSummary: planDocument.changeSummary,
888
+ createdByUserId: input.actorUserId,
889
+ });
890
+ }
891
+ return issue;
892
+ }
893
+ async function resolveOperationProposal(conversationId, messageId, input) {
894
+ const conversation = await getConversationOrThrow(conversationId);
895
+ const message = await db
896
+ .select()
897
+ .from(chatMessages)
898
+ .where(and(eq(chatMessages.conversationId, conversationId), eq(chatMessages.id, messageId)))
899
+ .then((rows) => rows[0] ?? null);
900
+ if (!message || message.kind !== "operation_proposal") {
901
+ throw notFound("Operation proposal not found");
902
+ }
903
+ if (message.approvalId) {
904
+ throw unprocessable("This operation proposal is managed through approvals");
905
+ }
906
+ const currentState = operationProposalDecisionStatusFromPayload(message.structuredPayload);
907
+ if (currentState.status !== "pending") {
908
+ throw unprocessable("Only pending lightweight changes can be resolved");
909
+ }
910
+ const proposal = operationProposalFromPayload(message.structuredPayload);
911
+ if (!proposal) {
912
+ throw unprocessable("Chat operation proposal payload was incomplete");
913
+ }
914
+ if (proposal.targetType === "organization" && proposal.targetId !== conversation.orgId) {
915
+ throw unprocessable("Organization lightweight changes must target the active organization");
916
+ }
917
+ if (proposal.targetType === "agent") {
918
+ const targetAgent = await agentsSvc.getById(proposal.targetId);
919
+ if (!targetAgent || targetAgent.orgId !== conversation.orgId) {
920
+ throw unprocessable("Agent lightweight changes must target an agent in the same organization");
921
+ }
922
+ }
923
+ const decisionNote = safeTrim(input.decisionNote);
924
+ const decidedAtIso = new Date().toISOString();
925
+ if (input.action === "approve") {
926
+ if (proposal.targetType === "organization") {
927
+ const updated = await organizationsSvc.update(proposal.targetId, proposal.patch);
928
+ if (!updated)
929
+ throw notFound("Organization not found");
930
+ const updatedMessage = await updateMessageStructuredPayload(conversationId, messageId, withOperationProposalDecisionState(message.structuredPayload, {
931
+ status: "approved",
932
+ decisionNote,
933
+ decidedByUserId: input.actorUserId,
934
+ decidedAt: decidedAtIso,
935
+ }));
936
+ if (!updatedMessage) {
937
+ throw notFound("Operation proposal not found");
938
+ }
939
+ const systemMessage = await addMessage(conversationId, {
940
+ orgId: conversation.orgId,
941
+ role: "system",
942
+ kind: "system_event",
943
+ body: `Applied lightweight change: ${proposal.summary}.`,
944
+ structuredPayload: {
945
+ eventType: "operation_applied",
946
+ source: "chat",
947
+ sourceMessageId: messageId,
948
+ targetType: "organization",
949
+ targetId: proposal.targetId,
950
+ decisionNote,
951
+ },
952
+ });
953
+ await logActivity(db, {
954
+ orgId: conversation.orgId,
955
+ actorType: "user",
956
+ actorId: input.actorUserId ?? "board",
957
+ action: "organization.updated",
958
+ entityType: "organization",
959
+ entityId: proposal.targetId,
960
+ details: {
961
+ source: "chat_lightweight_change",
962
+ sourceMessageId: messageId,
963
+ decisionNote,
964
+ ...proposal.patch,
965
+ },
966
+ });
967
+ return { message: updatedMessage, systemMessage };
968
+ }
969
+ const updated = await agentsSvc.update(proposal.targetId, proposal.patch);
970
+ if (!updated || updated.orgId !== conversation.orgId) {
971
+ throw notFound("Agent not found");
972
+ }
973
+ const updatedMessage = await updateMessageStructuredPayload(conversationId, messageId, withOperationProposalDecisionState(message.structuredPayload, {
974
+ status: "approved",
975
+ decisionNote,
976
+ decidedByUserId: input.actorUserId,
977
+ decidedAt: decidedAtIso,
978
+ }));
979
+ if (!updatedMessage) {
980
+ throw notFound("Operation proposal not found");
981
+ }
982
+ const systemMessage = await addMessage(conversationId, {
983
+ orgId: conversation.orgId,
984
+ role: "system",
985
+ kind: "system_event",
986
+ body: `Applied lightweight change: ${proposal.summary}.`,
987
+ structuredPayload: {
988
+ eventType: "operation_applied",
989
+ source: "chat",
990
+ sourceMessageId: messageId,
991
+ targetType: "agent",
992
+ targetId: proposal.targetId,
993
+ decisionNote,
994
+ },
995
+ });
996
+ await logActivity(db, {
997
+ orgId: conversation.orgId,
998
+ actorType: "user",
999
+ actorId: input.actorUserId ?? "board",
1000
+ action: "agent.updated",
1001
+ entityType: "agent",
1002
+ entityId: proposal.targetId,
1003
+ details: {
1004
+ source: "chat_lightweight_change",
1005
+ sourceMessageId: messageId,
1006
+ decisionNote,
1007
+ ...proposal.patch,
1008
+ },
1009
+ });
1010
+ return { message: updatedMessage, systemMessage };
1011
+ }
1012
+ const updatedMessage = await updateMessageStructuredPayload(conversationId, messageId, withOperationProposalDecisionState(message.structuredPayload, {
1013
+ status: input.action === "requestRevision" ? "revision_requested" : "rejected",
1014
+ decisionNote,
1015
+ decidedByUserId: input.actorUserId,
1016
+ decidedAt: decidedAtIso,
1017
+ }));
1018
+ if (!updatedMessage) {
1019
+ throw notFound("Operation proposal not found");
1020
+ }
1021
+ const systemMessage = await addMessage(conversationId, {
1022
+ orgId: conversation.orgId,
1023
+ role: "system",
1024
+ kind: "system_event",
1025
+ body: input.action === "requestRevision"
1026
+ ? `Requested changes before applying lightweight change: ${proposal.summary}.`
1027
+ : `Rejected lightweight change: ${proposal.summary}.`,
1028
+ structuredPayload: {
1029
+ eventType: input.action === "requestRevision" ? "operation_revision_requested" : "operation_rejected",
1030
+ source: "chat",
1031
+ sourceMessageId: messageId,
1032
+ targetType: proposal.targetType,
1033
+ targetId: proposal.targetId,
1034
+ decisionNote,
1035
+ },
1036
+ });
1037
+ return { message: updatedMessage, systemMessage };
1038
+ }
1039
+ async function applyApprovedApproval(approval, actorUserId) {
1040
+ if (approval.type !== "chat_issue_creation" && approval.type !== "chat_operation") {
1041
+ return null;
1042
+ }
1043
+ const payload = approval.payload;
1044
+ const conversationId = safeTrim(typeof payload.chatConversationId === "string" ? payload.chatConversationId : null);
1045
+ const messageId = safeTrim(typeof payload.chatMessageId === "string" ? payload.chatMessageId : null);
1046
+ if (!conversationId) {
1047
+ throw unprocessable("Chat approval missing chatConversationId");
1048
+ }
1049
+ if (approval.type === "chat_issue_creation") {
1050
+ const proposedIssue = payload.proposedIssue && typeof payload.proposedIssue === "object" && !Array.isArray(payload.proposedIssue)
1051
+ ? payload.proposedIssue
1052
+ : null;
1053
+ const issue = await convertToIssue(conversationId, {
1054
+ actorUserId,
1055
+ messageId,
1056
+ proposal: proposedIssue,
1057
+ });
1058
+ await issueApprovalsSvc.linkManyForApproval(approval.id, [issue.id], {
1059
+ agentId: null,
1060
+ userId: actorUserId ?? "board",
1061
+ });
1062
+ await addMessage(conversationId, {
1063
+ orgId: approval.orgId,
1064
+ role: "system",
1065
+ kind: "system_event",
1066
+ body: `Created issue ${issue.identifier ?? issue.id} from this chat conversation.`,
1067
+ structuredPayload: {
1068
+ eventType: "issue_created",
1069
+ issueId: issue.id,
1070
+ issueIdentifier: issue.identifier,
1071
+ approvalId: approval.id,
1072
+ },
1073
+ });
1074
+ await logActivity(db, {
1075
+ orgId: approval.orgId,
1076
+ actorType: "user",
1077
+ actorId: actorUserId ?? "board",
1078
+ action: "chat.issue_converted",
1079
+ entityType: "chat",
1080
+ entityId: conversationId,
1081
+ details: {
1082
+ approvalId: approval.id,
1083
+ issueId: issue.id,
1084
+ issueIdentifier: issue.identifier,
1085
+ source: "approval",
1086
+ },
1087
+ });
1088
+ return issue;
1089
+ }
1090
+ const proposal = operationProposalFromPayload(payload.operationProposal ?? payload);
1091
+ if (!proposal) {
1092
+ throw unprocessable("Chat operation approval payload was incomplete");
1093
+ }
1094
+ if (proposal.targetType === "organization" && proposal.targetId !== approval.orgId) {
1095
+ throw unprocessable("Organization approvals can only update the same organization");
1096
+ }
1097
+ if (proposal.targetType === "agent") {
1098
+ const targetAgent = await agentsSvc.getById(proposal.targetId);
1099
+ if (!targetAgent || targetAgent.orgId !== approval.orgId) {
1100
+ throw unprocessable("Agent approvals must target an agent in the same organization");
1101
+ }
1102
+ }
1103
+ if (proposal.targetType === "organization") {
1104
+ const updated = await organizationsSvc.update(proposal.targetId, proposal.patch);
1105
+ if (!updated)
1106
+ throw notFound("Organization not found");
1107
+ await addMessage(conversationId, {
1108
+ orgId: approval.orgId,
1109
+ role: "system",
1110
+ kind: "system_event",
1111
+ body: `Applied approved organization change: ${proposal.summary}.`,
1112
+ structuredPayload: {
1113
+ eventType: "operation_applied",
1114
+ approvalId: approval.id,
1115
+ targetType: "organization",
1116
+ targetId: proposal.targetId,
1117
+ },
1118
+ });
1119
+ await logActivity(db, {
1120
+ orgId: approval.orgId,
1121
+ actorType: "user",
1122
+ actorId: actorUserId ?? "board",
1123
+ action: "organization.updated",
1124
+ entityType: "organization",
1125
+ entityId: proposal.targetId,
1126
+ details: proposal.patch,
1127
+ });
1128
+ return updated;
1129
+ }
1130
+ const updated = await agentsSvc.update(proposal.targetId, proposal.patch);
1131
+ if (!updated)
1132
+ throw notFound("Agent not found");
1133
+ await addMessage(conversationId, {
1134
+ orgId: approval.orgId,
1135
+ role: "system",
1136
+ kind: "system_event",
1137
+ body: `Applied approved agent change: ${proposal.summary}.`,
1138
+ structuredPayload: {
1139
+ eventType: "operation_applied",
1140
+ approvalId: approval.id,
1141
+ targetType: "agent",
1142
+ targetId: proposal.targetId,
1143
+ },
1144
+ });
1145
+ await logActivity(db, {
1146
+ orgId: approval.orgId,
1147
+ actorType: "user",
1148
+ actorId: actorUserId ?? "board",
1149
+ action: "agent.updated",
1150
+ entityType: "agent",
1151
+ entityId: proposal.targetId,
1152
+ details: proposal.patch,
1153
+ });
1154
+ return updated;
1155
+ }
1156
+ async function createProposalApproval(orgId, input) {
1157
+ return approvalsSvc.create(orgId, {
1158
+ type: input.type,
1159
+ requestedByAgentId: null,
1160
+ requestedByUserId: input.requestedByUserId,
1161
+ status: "pending",
1162
+ payload: input.payload,
1163
+ decisionNote: null,
1164
+ decidedByUserId: null,
1165
+ decidedAt: null,
1166
+ });
1167
+ }
1168
+ return {
1169
+ list,
1170
+ getById,
1171
+ create,
1172
+ update,
1173
+ resolve,
1174
+ markRead,
1175
+ setPinned,
1176
+ listMessages,
1177
+ addMessage,
1178
+ addUserChatMessage,
1179
+ addContextLink,
1180
+ createAttachment,
1181
+ convertToIssue,
1182
+ getMessage,
1183
+ applyApprovedApproval,
1184
+ createProposalApproval,
1185
+ resolveOperationProposal,
1186
+ };
1187
+ }
1188
+ //# sourceMappingURL=chats.js.map