agor-live 0.22.0 → 0.23.1

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 (905) hide show
  1. package/dist/cli/commands/admin/add-to-branch-group.d.ts +2 -13
  2. package/dist/cli/commands/admin/add-to-branch-group.d.ts.map +1 -1
  3. package/dist/cli/commands/admin/add-to-branch-group.js +133 -33
  4. package/dist/cli/commands/admin/create-branch-group.d.ts +2 -13
  5. package/dist/cli/commands/admin/create-branch-group.d.ts.map +1 -1
  6. package/dist/cli/commands/admin/create-branch-group.js +132 -38
  7. package/dist/cli/commands/admin/create-symlink.d.ts +2 -14
  8. package/dist/cli/commands/admin/create-symlink.d.ts.map +1 -1
  9. package/dist/cli/commands/admin/create-symlink.js +138 -61
  10. package/dist/cli/commands/admin/delete-branch-group.d.ts +2 -13
  11. package/dist/cli/commands/admin/delete-branch-group.d.ts.map +1 -1
  12. package/dist/cli/commands/admin/delete-branch-group.js +132 -28
  13. package/dist/cli/commands/admin/delete-user.d.ts +2 -13
  14. package/dist/cli/commands/admin/delete-user.d.ts.map +1 -1
  15. package/dist/cli/commands/admin/delete-user.js +132 -38
  16. package/dist/cli/commands/admin/ensure-user.d.ts +2 -14
  17. package/dist/cli/commands/admin/ensure-user.d.ts.map +1 -1
  18. package/dist/cli/commands/admin/ensure-user.js +131 -46
  19. package/dist/cli/commands/admin/remove-from-branch-group.d.ts +2 -13
  20. package/dist/cli/commands/admin/remove-from-branch-group.d.ts.map +1 -1
  21. package/dist/cli/commands/admin/remove-from-branch-group.js +133 -33
  22. package/dist/cli/commands/admin/remove-symlink.d.ts +2 -14
  23. package/dist/cli/commands/admin/remove-symlink.d.ts.map +1 -1
  24. package/dist/cli/commands/admin/remove-symlink.js +136 -49
  25. package/dist/cli/commands/admin/scrub-git-remotes.d.ts +2 -2
  26. package/dist/cli/commands/admin/scrub-git-remotes.d.ts.map +1 -1
  27. package/dist/cli/commands/admin/scrub-git-remotes.js +128 -86
  28. package/dist/cli/commands/admin/sync-user-symlinks.d.ts +2 -14
  29. package/dist/cli/commands/admin/sync-user-symlinks.d.ts.map +1 -1
  30. package/dist/cli/commands/admin/sync-user-symlinks.js +132 -43
  31. package/dist/cli/commands/auth/whoami.d.ts.map +1 -1
  32. package/dist/cli/commands/auth/whoami.js +2 -1
  33. package/dist/cli/commands/branch/env/request.test.d.ts +2 -0
  34. package/dist/cli/commands/branch/env/request.test.d.ts.map +1 -0
  35. package/dist/cli/commands/branch/env/request.test.js +17723 -0
  36. package/dist/cli/commands/branch/env/restart.d.ts.map +1 -1
  37. package/dist/cli/commands/branch/env/restart.js +7 -1
  38. package/dist/cli/commands/branch/env/start.d.ts.map +1 -1
  39. package/dist/cli/commands/branch/env/start.js +7 -1
  40. package/dist/cli/commands/branch/env/stop.d.ts.map +1 -1
  41. package/dist/cli/commands/branch/env/stop.js +7 -1
  42. package/dist/cli/commands/daemon/status.d.ts.map +1 -1
  43. package/dist/cli/commands/daemon/status.js +2 -1
  44. package/dist/cli/commands/init.d.ts +6 -0
  45. package/dist/cli/commands/init.d.ts.map +1 -1
  46. package/dist/cli/commands/init.js +140 -2
  47. package/dist/cli/commands/local/add-to-branch-group.d.ts +13 -0
  48. package/dist/cli/commands/local/add-to-branch-group.d.ts.map +1 -0
  49. package/dist/cli/commands/local/add-to-branch-group.js +37 -0
  50. package/dist/cli/commands/local/create-branch-group.d.ts +12 -0
  51. package/dist/cli/commands/local/create-branch-group.d.ts.map +1 -0
  52. package/dist/cli/commands/local/create-branch-group.js +35 -0
  53. package/dist/cli/commands/local/create-symlink.d.ts +14 -0
  54. package/dist/cli/commands/local/create-symlink.d.ts.map +1 -0
  55. package/dist/cli/commands/local/create-symlink.js +45 -0
  56. package/dist/cli/commands/{daemon → local/daemon}/sync.d.ts +1 -1
  57. package/dist/cli/commands/local/daemon/sync.d.ts.map +1 -0
  58. package/dist/cli/commands/{daemon → local/daemon}/sync.js +7 -6
  59. package/dist/cli/commands/local/delete-branch-group.d.ts +12 -0
  60. package/dist/cli/commands/local/delete-branch-group.d.ts.map +1 -0
  61. package/dist/cli/commands/local/delete-branch-group.js +35 -0
  62. package/dist/cli/commands/local/delete-user.d.ts +12 -0
  63. package/dist/cli/commands/local/delete-user.d.ts.map +1 -0
  64. package/dist/cli/commands/local/delete-user.js +36 -0
  65. package/dist/cli/commands/local/ensure-user.d.ts +12 -0
  66. package/dist/cli/commands/local/ensure-user.d.ts.map +1 -0
  67. package/dist/cli/commands/local/ensure-user.js +41 -0
  68. package/dist/cli/commands/local/remove-from-branch-group.d.ts +13 -0
  69. package/dist/cli/commands/local/remove-from-branch-group.d.ts.map +1 -0
  70. package/dist/cli/commands/local/remove-from-branch-group.js +37 -0
  71. package/dist/cli/commands/local/remove-symlink.d.ts +13 -0
  72. package/dist/cli/commands/local/remove-symlink.d.ts.map +1 -0
  73. package/dist/cli/commands/local/remove-symlink.js +39 -0
  74. package/dist/cli/commands/local/scrub-git-remotes.d.ts +9 -0
  75. package/dist/cli/commands/local/scrub-git-remotes.d.ts.map +1 -0
  76. package/dist/cli/commands/local/scrub-git-remotes.js +23 -0
  77. package/dist/cli/commands/{admin → local}/sync-unix.d.ts.map +1 -1
  78. package/dist/cli/commands/{admin → local}/sync-unix.js +3 -3
  79. package/dist/cli/commands/local/sync-user-symlinks.d.ts +12 -0
  80. package/dist/cli/commands/local/sync-user-symlinks.d.ts.map +1 -0
  81. package/dist/cli/commands/local/sync-user-symlinks.js +37 -0
  82. package/dist/cli/commands/telemetry/index.d.ts +7 -0
  83. package/dist/cli/commands/telemetry/index.d.ts.map +1 -0
  84. package/dist/cli/commands/telemetry/index.js +40 -0
  85. package/dist/cli/commands/telemetry/off.d.ts +6 -0
  86. package/dist/cli/commands/telemetry/off.d.ts.map +1 -0
  87. package/dist/cli/commands/telemetry/off.js +35 -0
  88. package/dist/cli/commands/telemetry/on.d.ts +6 -0
  89. package/dist/cli/commands/telemetry/on.d.ts.map +1 -0
  90. package/dist/cli/commands/telemetry/on.js +37 -0
  91. package/dist/cli/commands/telemetry/test.d.ts +6 -0
  92. package/dist/cli/commands/telemetry/test.d.ts.map +1 -0
  93. package/dist/cli/commands/telemetry/test.js +56 -0
  94. package/dist/cli/commands/user/create-admin.d.ts.map +1 -1
  95. package/dist/cli/commands/user/create-admin.js +81 -72
  96. package/dist/cli/commands/user/list.d.ts.map +1 -1
  97. package/dist/cli/commands/user/list.js +1 -0
  98. package/dist/cli/commands/whoami.js +2 -1
  99. package/dist/cli/lib/branch-environment-action.d.ts +21 -0
  100. package/dist/cli/lib/branch-environment-action.d.ts.map +1 -0
  101. package/dist/cli/lib/branch-environment-action.js +8 -0
  102. package/dist/core/api/index.cjs +7 -2
  103. package/dist/core/api/index.d.ts +13 -4
  104. package/dist/core/api/index.d.ts.map +1 -1
  105. package/dist/core/api/index.js +7 -2
  106. package/dist/core/claude/index.cjs +482 -77
  107. package/dist/core/claude/index.js +479 -76
  108. package/dist/core/claude-cli/index.cjs +11 -0
  109. package/dist/core/claude-cli/index.js +11 -0
  110. package/dist/core/claude-cli/pricing.d.ts.map +1 -1
  111. package/dist/core/client/index.cjs +35 -7
  112. package/dist/core/client/index.js +32 -7
  113. package/dist/core/config/browser.cjs +3 -5
  114. package/dist/core/config/browser.js +3 -5
  115. package/dist/core/config/config-manager.d.ts +33 -13
  116. package/dist/core/config/config-manager.d.ts.map +1 -1
  117. package/dist/core/config/index.cjs +4259 -4527
  118. package/dist/core/config/index.d.ts +1 -0
  119. package/dist/core/config/index.d.ts.map +1 -1
  120. package/dist/core/config/index.js +4295 -4583
  121. package/dist/core/config/key-resolver.d.ts.map +1 -1
  122. package/dist/core/config/multitenancy.d.ts +33 -0
  123. package/dist/core/config/multitenancy.d.ts.map +1 -0
  124. package/dist/core/config/security-resolver.d.ts +1 -0
  125. package/dist/core/config/security-resolver.d.ts.map +1 -1
  126. package/dist/core/config/types.d.ts +67 -4
  127. package/dist/core/config/types.d.ts.map +1 -1
  128. package/dist/core/db/client.d.ts +34 -2
  129. package/dist/core/db/client.d.ts.map +1 -1
  130. package/dist/core/db/database-wrapper.d.ts.map +1 -1
  131. package/dist/core/db/first-run-bootstrap.d.ts.map +1 -1
  132. package/dist/core/db/index.cjs +2422 -1084
  133. package/dist/core/db/index.d.ts +2 -1
  134. package/dist/core/db/index.d.ts.map +1 -1
  135. package/dist/core/db/index.js +2162 -852
  136. package/dist/core/db/migrate.d.ts.map +1 -1
  137. package/dist/core/db/repositories/artifacts.d.ts +27 -2
  138. package/dist/core/db/repositories/artifacts.d.ts.map +1 -1
  139. package/dist/core/db/repositories/base.d.ts +18 -0
  140. package/dist/core/db/repositories/base.d.ts.map +1 -1
  141. package/dist/core/db/repositories/board-comments.d.ts +17 -1
  142. package/dist/core/db/repositories/board-comments.d.ts.map +1 -1
  143. package/dist/core/db/repositories/board-objects.d.ts.map +1 -1
  144. package/dist/core/db/repositories/boards.d.ts +28 -4
  145. package/dist/core/db/repositories/boards.d.ts.map +1 -1
  146. package/dist/core/db/repositories/branch-access.d.ts +32 -0
  147. package/dist/core/db/repositories/branch-access.d.ts.map +1 -1
  148. package/dist/core/db/repositories/branches.d.ts +41 -1
  149. package/dist/core/db/repositories/branches.d.ts.map +1 -1
  150. package/dist/core/db/repositories/cards.d.ts +15 -1
  151. package/dist/core/db/repositories/cards.d.ts.map +1 -1
  152. package/dist/core/db/repositories/gateway-channels.d.ts.map +1 -1
  153. package/dist/core/db/repositories/gateway-outbound-messages.d.ts +19 -0
  154. package/dist/core/db/repositories/gateway-outbound-messages.d.ts.map +1 -0
  155. package/dist/core/db/repositories/index.d.ts +2 -0
  156. package/dist/core/db/repositories/index.d.ts.map +1 -1
  157. package/dist/core/db/repositories/messages.d.ts +9 -2
  158. package/dist/core/db/repositories/messages.d.ts.map +1 -1
  159. package/dist/core/db/repositories/repos.d.ts.map +1 -1
  160. package/dist/core/db/repositories/schedules.d.ts +12 -1
  161. package/dist/core/db/repositories/schedules.d.ts.map +1 -1
  162. package/dist/core/db/repositories/sessions.d.ts +49 -5
  163. package/dist/core/db/repositories/sessions.d.ts.map +1 -1
  164. package/dist/core/db/repositories/tasks.d.ts +7 -2
  165. package/dist/core/db/repositories/tasks.d.ts.map +1 -1
  166. package/dist/core/db/repositories/user-api-keys.d.ts +10 -1
  167. package/dist/core/db/repositories/user-api-keys.d.ts.map +1 -1
  168. package/dist/core/db/repositories/users.d.ts +8 -8
  169. package/dist/core/db/repositories/users.d.ts.map +1 -1
  170. package/dist/core/db/schema.d.ts +1460 -38
  171. package/dist/core/db/schema.d.ts.map +1 -1
  172. package/dist/core/db/schema.postgres.d.ts +1082 -37
  173. package/dist/core/db/schema.postgres.d.ts.map +1 -1
  174. package/dist/core/db/schema.sqlite.d.ts +397 -1
  175. package/dist/core/db/schema.sqlite.d.ts.map +1 -1
  176. package/dist/core/db/tenant-context.d.ts +26 -0
  177. package/dist/core/db/tenant-context.d.ts.map +1 -0
  178. package/dist/core/db/tenant-scope.d.ts +31 -0
  179. package/dist/core/db/tenant-scope.d.ts.map +1 -0
  180. package/dist/core/db/user-utils.d.ts +2 -2
  181. package/dist/core/db/user-utils.d.ts.map +1 -1
  182. package/dist/core/drizzle/postgres/0052_gateway_outbound_messages.sql +45 -0
  183. package/dist/core/drizzle/postgres/0053_user_token_invalidation.sql +1 -0
  184. package/dist/core/drizzle/postgres/0054_app_level_multitenancy.sql +219 -0
  185. package/dist/core/drizzle/postgres/0055_app_level_multitenancy_rls.sql +411 -0
  186. package/dist/core/drizzle/postgres/0056_composite_indexes.sql +15 -0
  187. package/dist/core/drizzle/postgres/0057_message_timestamp_indexes.sql +3 -0
  188. package/dist/core/drizzle/postgres/meta/_journal.json +42 -0
  189. package/dist/core/drizzle/sqlite/0061_gateway_outbound_messages.sql +38 -0
  190. package/dist/core/drizzle/sqlite/0062_user_token_invalidation.sql +1 -0
  191. package/dist/core/drizzle/sqlite/0063_composite_indexes.sql +10 -0
  192. package/dist/core/drizzle/sqlite/0064_message_timestamp_indexes.sql +2 -0
  193. package/dist/core/drizzle/sqlite/meta/_journal.json +28 -0
  194. package/dist/core/environment/render-snapshot.cjs +1 -4
  195. package/dist/core/environment/render-snapshot.js +1 -4
  196. package/dist/core/environment/webhook.cjs +1 -4
  197. package/dist/core/environment/webhook.js +1 -4
  198. package/dist/core/gateway/connector.d.ts +10 -1
  199. package/dist/core/gateway/connector.d.ts.map +1 -1
  200. package/dist/core/gateway/connectors/slack-manifest.cjs +108 -0
  201. package/dist/core/gateway/connectors/slack-manifest.d.ts +85 -0
  202. package/dist/core/gateway/connectors/slack-manifest.d.ts.map +1 -0
  203. package/dist/core/gateway/connectors/slack-manifest.js +81 -0
  204. package/dist/core/gateway/connectors/slack.d.ts +101 -4
  205. package/dist/core/gateway/connectors/slack.d.ts.map +1 -1
  206. package/dist/core/gateway/index.cjs +495 -29
  207. package/dist/core/gateway/index.d.ts +4 -1
  208. package/dist/core/gateway/index.d.ts.map +1 -1
  209. package/dist/core/gateway/index.js +490 -28
  210. package/dist/core/gateway/system-message.d.ts.map +1 -1
  211. package/dist/core/git/exec.cjs +24 -0
  212. package/dist/core/git/exec.d.ts +6 -4
  213. package/dist/core/git/exec.d.ts.map +1 -1
  214. package/dist/core/git/exec.js +2 -0
  215. package/dist/core/git/index.cjs +3 -1363
  216. package/dist/core/git/index.d.ts +4 -614
  217. package/dist/core/git/index.d.ts.map +1 -1
  218. package/dist/core/git/index.js +1 -1304
  219. package/dist/core/git/pure.cjs +24 -0
  220. package/dist/core/git/pure.d.ts +2 -27
  221. package/dist/core/git/pure.d.ts.map +1 -1
  222. package/dist/core/git/pure.js +2 -0
  223. package/dist/core/index.cjs +11137 -10604
  224. package/dist/core/index.d.ts +2 -0
  225. package/dist/core/index.d.ts.map +1 -1
  226. package/dist/core/index.js +11673 -10630
  227. package/dist/core/lib/feathers-validation.cjs +6 -1
  228. package/dist/core/lib/feathers-validation.d.ts +1 -0
  229. package/dist/core/lib/feathers-validation.d.ts.map +1 -1
  230. package/dist/core/lib/feathers-validation.js +6 -1
  231. package/dist/core/local-actions/git-remotes.d.ts +7 -0
  232. package/dist/core/local-actions/git-remotes.d.ts.map +1 -0
  233. package/dist/core/local-actions/index.cjs +7941 -0
  234. package/dist/core/local-actions/index.d.ts +6 -0
  235. package/dist/core/local-actions/index.d.ts.map +1 -0
  236. package/dist/core/local-actions/index.js +7943 -0
  237. package/dist/core/local-actions/symlinks.d.ts +20 -0
  238. package/dist/core/local-actions/symlinks.d.ts.map +1 -0
  239. package/dist/core/local-actions/types.d.ts +14 -0
  240. package/dist/core/local-actions/types.d.ts.map +1 -0
  241. package/dist/core/local-actions/unix-groups.d.ts +16 -0
  242. package/dist/core/local-actions/unix-groups.d.ts.map +1 -0
  243. package/dist/core/local-actions/unix-users.d.ts +12 -0
  244. package/dist/core/local-actions/unix-users.d.ts.map +1 -0
  245. package/dist/core/mcp/index.cjs +352 -25
  246. package/dist/core/mcp/index.js +351 -24
  247. package/dist/core/models/browser.cjs +148 -25
  248. package/dist/core/models/browser.js +144 -25
  249. package/dist/core/models/claude.d.ts +2 -2
  250. package/dist/core/models/claude.d.ts.map +1 -1
  251. package/dist/core/models/codex.d.ts +205 -21
  252. package/dist/core/models/codex.d.ts.map +1 -1
  253. package/dist/core/models/index.cjs +148 -25
  254. package/dist/core/models/index.js +144 -25
  255. package/dist/core/package.json +24 -0
  256. package/dist/core/seed/demo-fixtures.d.ts +87 -0
  257. package/dist/core/seed/demo-fixtures.d.ts.map +1 -0
  258. package/dist/core/seed/dev-fixtures.d.ts.map +1 -1
  259. package/dist/core/seed/index.cjs +8410 -5504
  260. package/dist/core/seed/index.d.ts +1 -0
  261. package/dist/core/seed/index.d.ts.map +1 -1
  262. package/dist/core/seed/index.js +8434 -5533
  263. package/dist/core/sessions/index.cjs +110 -24
  264. package/dist/core/sessions/index.js +110 -24
  265. package/dist/core/telemetry/index.cjs +361 -0
  266. package/dist/core/telemetry/index.d.ts +5 -0
  267. package/dist/core/telemetry/index.d.ts.map +1 -0
  268. package/dist/core/telemetry/index.js +315 -0
  269. package/dist/core/telemetry/logger.d.ts +44 -0
  270. package/dist/core/telemetry/logger.d.ts.map +1 -0
  271. package/dist/core/telemetry/model-normalization.d.ts +3 -0
  272. package/dist/core/telemetry/model-normalization.d.ts.map +1 -0
  273. package/dist/core/telemetry/types.d.ts +47 -0
  274. package/dist/core/telemetry/types.d.ts.map +1 -0
  275. package/dist/core/telemetry/version.d.ts +9 -0
  276. package/dist/core/telemetry/version.d.ts.map +1 -0
  277. package/dist/core/templates/agor-system-prompt.md +1 -0
  278. package/dist/core/tools/mcp/oauth-refresh.cjs +532 -102
  279. package/dist/core/tools/mcp/oauth-refresh.js +530 -103
  280. package/dist/core/types/board.d.ts +2 -0
  281. package/dist/core/types/board.d.ts.map +1 -1
  282. package/dist/core/types/branch.d.ts +13 -0
  283. package/dist/core/types/branch.d.ts.map +1 -1
  284. package/dist/core/types/config-services.d.ts.map +1 -1
  285. package/dist/core/types/feathers.d.ts +6 -0
  286. package/dist/core/types/feathers.d.ts.map +1 -1
  287. package/dist/core/types/gateway.d.ts +76 -1
  288. package/dist/core/types/gateway.d.ts.map +1 -1
  289. package/dist/core/types/index.cjs +25 -0
  290. package/dist/core/types/index.d.ts +1 -0
  291. package/dist/core/types/index.d.ts.map +1 -1
  292. package/dist/core/types/index.js +22 -0
  293. package/dist/core/types/schedule.d.ts +4 -3
  294. package/dist/core/types/schedule.d.ts.map +1 -1
  295. package/dist/core/types/session.d.ts +7 -1
  296. package/dist/core/types/session.d.ts.map +1 -1
  297. package/dist/core/types/tenant.d.ts +15 -0
  298. package/dist/core/types/tenant.d.ts.map +1 -0
  299. package/dist/core/types/user.d.ts +61 -0
  300. package/dist/core/types/user.d.ts.map +1 -1
  301. package/dist/core/unix/index.cjs +1056 -674
  302. package/dist/core/unix/index.js +1003 -623
  303. package/dist/core/utils/emoji-shortcodes.d.ts +13 -0
  304. package/dist/core/utils/emoji-shortcodes.d.ts.map +1 -0
  305. package/dist/core/yaml/index.cjs +8 -8
  306. package/dist/core/yaml/index.d.ts +1 -1
  307. package/dist/core/yaml/index.d.ts.map +1 -1
  308. package/dist/core/yaml/index.js +7 -7
  309. package/dist/daemon/adapters/drizzle.d.ts +26 -4
  310. package/dist/daemon/adapters/drizzle.d.ts.map +1 -1
  311. package/dist/daemon/adapters/drizzle.js +68 -7
  312. package/dist/daemon/auth/api-key-strategy.js +1 -1
  313. package/dist/daemon/auth/executor-runtime-scope.d.ts.map +1 -1
  314. package/dist/daemon/auth/executor-runtime-scope.js +19 -5
  315. package/dist/daemon/auth/launch-auth.d.ts +5 -4
  316. package/dist/daemon/auth/launch-auth.d.ts.map +1 -1
  317. package/dist/daemon/auth/launch-auth.js +123 -39
  318. package/dist/daemon/auth/refresh-token-service.d.ts +22 -0
  319. package/dist/daemon/auth/refresh-token-service.d.ts.map +1 -0
  320. package/dist/daemon/auth/refresh-token-service.js +133 -0
  321. package/dist/daemon/auth/runtime-tokens.d.ts +3 -1
  322. package/dist/daemon/auth/runtime-tokens.d.ts.map +1 -1
  323. package/dist/daemon/auth/runtime-tokens.js +17 -4
  324. package/dist/daemon/auth/service-jwt-strategy.d.ts +2 -1
  325. package/dist/daemon/auth/service-jwt-strategy.d.ts.map +1 -1
  326. package/dist/daemon/auth/service-jwt-strategy.js +127 -1
  327. package/dist/daemon/auth/token-invalidation.d.ts +11 -0
  328. package/dist/daemon/auth/token-invalidation.d.ts.map +1 -0
  329. package/dist/daemon/auth/token-invalidation.js +38 -0
  330. package/dist/daemon/auth/user-redaction.d.ts +12 -0
  331. package/dist/daemon/auth/user-redaction.d.ts.map +1 -0
  332. package/dist/daemon/auth/user-redaction.js +13 -0
  333. package/dist/daemon/declarations.d.ts +4 -4
  334. package/dist/daemon/declarations.d.ts.map +1 -1
  335. package/dist/daemon/hooks/gateway-route.d.ts.map +1 -1
  336. package/dist/daemon/hooks/gateway-route.js +23 -13
  337. package/dist/daemon/index.d.ts.map +1 -1
  338. package/dist/daemon/index.js +7234 -2866
  339. package/dist/daemon/knowledge/pgvector.d.ts +3 -3
  340. package/dist/daemon/knowledge/pgvector.d.ts.map +1 -1
  341. package/dist/daemon/knowledge/pgvector.js +24 -0
  342. package/dist/daemon/knowledge/units.d.ts +2 -2
  343. package/dist/daemon/knowledge/units.d.ts.map +1 -1
  344. package/dist/daemon/main.js +7234 -2866
  345. package/dist/daemon/mcp/server.d.ts +3 -3
  346. package/dist/daemon/mcp/server.d.ts.map +1 -1
  347. package/dist/daemon/mcp/server.js +1467 -71
  348. package/dist/daemon/mcp/tokens.d.ts +2 -2
  349. package/dist/daemon/mcp/tokens.d.ts.map +1 -1
  350. package/dist/daemon/mcp/tokens.js +5 -1
  351. package/dist/daemon/mcp/tool-registry.d.ts.map +1 -1
  352. package/dist/daemon/mcp/tool-registry.js +1 -0
  353. package/dist/daemon/mcp/tools/analytics.d.ts.map +1 -1
  354. package/dist/daemon/mcp/tools/analytics.js +548 -23
  355. package/dist/daemon/mcp/tools/artifacts.js +510 -19
  356. package/dist/daemon/mcp/tools/boards.d.ts.map +1 -1
  357. package/dist/daemon/mcp/tools/boards.js +517 -20
  358. package/dist/daemon/mcp/tools/branches.d.ts.map +1 -1
  359. package/dist/daemon/mcp/tools/branches.js +574 -49
  360. package/dist/daemon/mcp/tools/card-types.js +508 -17
  361. package/dist/daemon/mcp/tools/cards.js +508 -17
  362. package/dist/daemon/mcp/tools/environment.js +516 -17
  363. package/dist/daemon/mcp/tools/gateway-channels.d.ts +4 -0
  364. package/dist/daemon/mcp/tools/gateway-channels.d.ts.map +1 -0
  365. package/dist/daemon/mcp/tools/gateway-channels.js +16035 -0
  366. package/dist/daemon/mcp/tools/knowledge.js +508 -17
  367. package/dist/daemon/mcp/tools/mcp-servers.d.ts.map +1 -1
  368. package/dist/daemon/mcp/tools/mcp-servers.js +843 -17
  369. package/dist/daemon/mcp/tools/messages.d.ts.map +1 -1
  370. package/dist/daemon/mcp/tools/messages.js +568 -31
  371. package/dist/daemon/mcp/tools/proxies.js +518 -19
  372. package/dist/daemon/mcp/tools/repos.js +508 -17
  373. package/dist/daemon/mcp/tools/schedules.d.ts.map +1 -1
  374. package/dist/daemon/mcp/tools/schedules.js +511 -18
  375. package/dist/daemon/mcp/tools/search.js +508 -17
  376. package/dist/daemon/mcp/tools/sessions.d.ts.map +1 -1
  377. package/dist/daemon/mcp/tools/sessions.js +521 -23
  378. package/dist/daemon/mcp/tools/tasks.js +508 -17
  379. package/dist/daemon/mcp/tools/users.d.ts.map +1 -1
  380. package/dist/daemon/mcp/tools/users.js +527 -22
  381. package/dist/daemon/mcp/tools/widgets.d.ts.map +1 -1
  382. package/dist/daemon/mcp/tools/widgets.js +536 -18
  383. package/dist/daemon/register-hooks.d.ts +3 -2
  384. package/dist/daemon/register-hooks.d.ts.map +1 -1
  385. package/dist/daemon/register-hooks.js +894 -582
  386. package/dist/daemon/register-routes.d.ts +3 -2
  387. package/dist/daemon/register-routes.d.ts.map +1 -1
  388. package/dist/daemon/register-routes.js +2715 -816
  389. package/dist/daemon/register-services.d.ts +2 -2
  390. package/dist/daemon/register-services.d.ts.map +1 -1
  391. package/dist/daemon/register-services.js +2445 -633
  392. package/dist/daemon/services/artifacts.d.ts +34 -6
  393. package/dist/daemon/services/artifacts.d.ts.map +1 -1
  394. package/dist/daemon/services/artifacts.js +109 -8
  395. package/dist/daemon/services/assistant-knowledge.d.ts +2 -2
  396. package/dist/daemon/services/assistant-knowledge.d.ts.map +1 -1
  397. package/dist/daemon/services/board-comments.d.ts +8 -5
  398. package/dist/daemon/services/board-comments.d.ts.map +1 -1
  399. package/dist/daemon/services/board-comments.js +78 -13
  400. package/dist/daemon/services/board-objects.d.ts +8 -5
  401. package/dist/daemon/services/board-objects.d.ts.map +1 -1
  402. package/dist/daemon/services/board-objects.js +14 -4
  403. package/dist/daemon/services/boards.d.ts +34 -5
  404. package/dist/daemon/services/boards.d.ts.map +1 -1
  405. package/dist/daemon/services/boards.js +116 -8
  406. package/dist/daemon/services/branch-owners.d.ts +3 -1
  407. package/dist/daemon/services/branch-owners.d.ts.map +1 -1
  408. package/dist/daemon/services/branch-owners.js +31 -4
  409. package/dist/daemon/services/branches.d.ts +31 -8
  410. package/dist/daemon/services/branches.d.ts.map +1 -1
  411. package/dist/daemon/services/branches.js +242 -35
  412. package/dist/daemon/services/card-types.d.ts +3 -3
  413. package/dist/daemon/services/card-types.d.ts.map +1 -1
  414. package/dist/daemon/services/card-types.js +68 -7
  415. package/dist/daemon/services/cards.d.ts +19 -4
  416. package/dist/daemon/services/cards.d.ts.map +1 -1
  417. package/dist/daemon/services/cards.js +92 -8
  418. package/dist/daemon/services/check-auth.d.ts +2 -2
  419. package/dist/daemon/services/check-auth.d.ts.map +1 -1
  420. package/dist/daemon/services/claude-cli-integration.d.ts +4 -1
  421. package/dist/daemon/services/claude-cli-integration.d.ts.map +1 -1
  422. package/dist/daemon/services/claude-cli-integration.js +117 -65
  423. package/dist/daemon/services/claude-models.d.ts +3 -3
  424. package/dist/daemon/services/claude-models.d.ts.map +1 -1
  425. package/dist/daemon/services/claude-models.js +383 -272
  426. package/dist/daemon/services/config.d.ts +12 -4
  427. package/dist/daemon/services/config.d.ts.map +1 -1
  428. package/dist/daemon/services/config.js +39 -3
  429. package/dist/daemon/services/copilot-models.d.ts +3 -3
  430. package/dist/daemon/services/copilot-models.d.ts.map +1 -1
  431. package/dist/daemon/services/cursor-models.d.ts +3 -3
  432. package/dist/daemon/services/cursor-models.d.ts.map +1 -1
  433. package/dist/daemon/services/files.d.ts +3 -3
  434. package/dist/daemon/services/files.d.ts.map +1 -1
  435. package/dist/daemon/services/files.js +24 -5
  436. package/dist/daemon/services/gateway-channels-test.d.ts +24 -0
  437. package/dist/daemon/services/gateway-channels-test.d.ts.map +1 -0
  438. package/dist/daemon/services/gateway-channels-test.js +66 -0
  439. package/dist/daemon/services/gateway-channels.d.ts +3 -3
  440. package/dist/daemon/services/gateway-channels.d.ts.map +1 -1
  441. package/dist/daemon/services/gateway-channels.js +68 -7
  442. package/dist/daemon/services/gateway.d.ts +48 -3
  443. package/dist/daemon/services/gateway.d.ts.map +1 -1
  444. package/dist/daemon/services/gateway.js +606 -60
  445. package/dist/daemon/services/github-app-setup.d.ts +3 -3
  446. package/dist/daemon/services/github-app-setup.d.ts.map +1 -1
  447. package/dist/daemon/services/groups.d.ts +5 -5
  448. package/dist/daemon/services/groups.d.ts.map +1 -1
  449. package/dist/daemon/services/health-monitor.d.ts +34 -2
  450. package/dist/daemon/services/health-monitor.d.ts.map +1 -1
  451. package/dist/daemon/services/health-monitor.js +145 -23
  452. package/dist/daemon/services/knowledge-document-edits.d.ts +3 -3
  453. package/dist/daemon/services/knowledge-document-edits.d.ts.map +1 -1
  454. package/dist/daemon/services/knowledge-documents.d.ts +3 -3
  455. package/dist/daemon/services/knowledge-documents.d.ts.map +1 -1
  456. package/dist/daemon/services/knowledge-documents.js +92 -7
  457. package/dist/daemon/services/knowledge-embedding-indexer.d.ts +7 -2
  458. package/dist/daemon/services/knowledge-embedding-indexer.d.ts.map +1 -1
  459. package/dist/daemon/services/knowledge-embedding-indexer.js +37 -3
  460. package/dist/daemon/services/knowledge-graph.d.ts +3 -3
  461. package/dist/daemon/services/knowledge-graph.d.ts.map +1 -1
  462. package/dist/daemon/services/knowledge-indexing.d.ts +3 -3
  463. package/dist/daemon/services/knowledge-indexing.d.ts.map +1 -1
  464. package/dist/daemon/services/knowledge-namespaces.d.ts +3 -3
  465. package/dist/daemon/services/knowledge-namespaces.d.ts.map +1 -1
  466. package/dist/daemon/services/knowledge-namespaces.js +72 -8
  467. package/dist/daemon/services/knowledge-reindex.d.ts +3 -3
  468. package/dist/daemon/services/knowledge-reindex.d.ts.map +1 -1
  469. package/dist/daemon/services/knowledge-reindex.js +28 -1
  470. package/dist/daemon/services/knowledge-search.d.ts +3 -3
  471. package/dist/daemon/services/knowledge-search.d.ts.map +1 -1
  472. package/dist/daemon/services/knowledge-settings.d.ts +3 -3
  473. package/dist/daemon/services/knowledge-settings.d.ts.map +1 -1
  474. package/dist/daemon/services/knowledge-settings.js +24 -0
  475. package/dist/daemon/services/knowledge-versions.d.ts +3 -3
  476. package/dist/daemon/services/knowledge-versions.d.ts.map +1 -1
  477. package/dist/daemon/services/knowledge-versions.js +68 -7
  478. package/dist/daemon/services/leaderboard.d.ts +14 -6
  479. package/dist/daemon/services/leaderboard.d.ts.map +1 -1
  480. package/dist/daemon/services/leaderboard.js +74 -15
  481. package/dist/daemon/services/local-actions.d.ts +13 -0
  482. package/dist/daemon/services/local-actions.d.ts.map +1 -0
  483. package/dist/daemon/services/local-actions.js +120 -0
  484. package/dist/daemon/services/mcp-servers.d.ts +3 -3
  485. package/dist/daemon/services/mcp-servers.d.ts.map +1 -1
  486. package/dist/daemon/services/mcp-servers.js +68 -7
  487. package/dist/daemon/services/messages.d.ts +10 -6
  488. package/dist/daemon/services/messages.d.ts.map +1 -1
  489. package/dist/daemon/services/messages.js +87 -7
  490. package/dist/daemon/services/repos.d.ts +6 -6
  491. package/dist/daemon/services/repos.d.ts.map +1 -1
  492. package/dist/daemon/services/repos.js +131 -32
  493. package/dist/daemon/services/scheduler.d.ts +23 -27
  494. package/dist/daemon/services/scheduler.d.ts.map +1 -1
  495. package/dist/daemon/services/scheduler.js +55 -28
  496. package/dist/daemon/services/schedules.d.ts +3 -3
  497. package/dist/daemon/services/schedules.d.ts.map +1 -1
  498. package/dist/daemon/services/schedules.js +68 -7
  499. package/dist/daemon/services/session-env-selections.d.ts +3 -3
  500. package/dist/daemon/services/session-env-selections.d.ts.map +1 -1
  501. package/dist/daemon/services/session-mcp-servers.d.ts +3 -3
  502. package/dist/daemon/services/session-mcp-servers.d.ts.map +1 -1
  503. package/dist/daemon/services/session-token-service.d.ts.map +1 -1
  504. package/dist/daemon/services/session-token-service.js +3 -0
  505. package/dist/daemon/services/sessions.d.ts +9 -5
  506. package/dist/daemon/services/sessions.d.ts.map +1 -1
  507. package/dist/daemon/services/sessions.js +143 -10
  508. package/dist/daemon/services/tasks.d.ts +11 -5
  509. package/dist/daemon/services/tasks.d.ts.map +1 -1
  510. package/dist/daemon/services/tasks.js +199 -39
  511. package/dist/daemon/services/terminals.d.ts +21 -3
  512. package/dist/daemon/services/terminals.d.ts.map +1 -1
  513. package/dist/daemon/services/terminals.js +81 -25
  514. package/dist/daemon/services/thread-session-map.d.ts +3 -3
  515. package/dist/daemon/services/thread-session-map.d.ts.map +1 -1
  516. package/dist/daemon/services/thread-session-map.js +68 -7
  517. package/dist/daemon/services/user-avatar-sync.d.ts +21 -0
  518. package/dist/daemon/services/user-avatar-sync.d.ts.map +1 -0
  519. package/dist/daemon/services/user-avatar-sync.js +267 -0
  520. package/dist/daemon/services/users.d.ts +29 -9
  521. package/dist/daemon/services/users.d.ts.map +1 -1
  522. package/dist/daemon/services/users.js +383 -30
  523. package/dist/daemon/services/zone-trigger.d.ts.map +1 -1
  524. package/dist/daemon/services/zone-trigger.js +17 -4
  525. package/dist/daemon/setup/build-info.d.ts +1 -1
  526. package/dist/daemon/setup/build-info.d.ts.map +1 -1
  527. package/dist/daemon/setup/build-info.js +5 -1
  528. package/dist/daemon/setup/database.d.ts +8 -3
  529. package/dist/daemon/setup/database.d.ts.map +1 -1
  530. package/dist/daemon/setup/database.js +26 -6
  531. package/dist/daemon/setup/first-run-admin.d.ts +2 -2
  532. package/dist/daemon/setup/first-run-admin.d.ts.map +1 -1
  533. package/dist/daemon/setup/index.js +97 -17
  534. package/dist/daemon/setup/socketio.d.ts +10 -1
  535. package/dist/daemon/setup/socketio.d.ts.map +1 -1
  536. package/dist/daemon/setup/socketio.js +68 -10
  537. package/dist/daemon/startup.d.ts +13 -2
  538. package/dist/daemon/startup.d.ts.map +1 -1
  539. package/dist/daemon/startup.js +348 -86
  540. package/dist/daemon/utils/append-system-message.d.ts +2 -2
  541. package/dist/daemon/utils/append-system-message.d.ts.map +1 -1
  542. package/dist/daemon/utils/apply-session-config-defaults.d.ts.map +1 -1
  543. package/dist/daemon/utils/apply-session-config-defaults.js +12 -1
  544. package/dist/daemon/utils/authorization.d.ts +3 -1
  545. package/dist/daemon/utils/authorization.d.ts.map +1 -1
  546. package/dist/daemon/utils/authorization.js +21 -6
  547. package/dist/daemon/utils/branch-authorization.d.ts +30 -0
  548. package/dist/daemon/utils/branch-authorization.d.ts.map +1 -1
  549. package/dist/daemon/utils/branch-authorization.js +63 -5
  550. package/dist/daemon/utils/branch-inspect.d.ts +1 -0
  551. package/dist/daemon/utils/branch-inspect.d.ts.map +1 -1
  552. package/dist/daemon/utils/branch-inspect.js +11 -3
  553. package/dist/daemon/utils/executor-read-impersonation.d.ts +2 -2
  554. package/dist/daemon/utils/executor-read-impersonation.d.ts.map +1 -1
  555. package/dist/daemon/utils/git-impersonation.d.ts +10 -10
  556. package/dist/daemon/utils/git-impersonation.d.ts.map +1 -1
  557. package/dist/daemon/utils/git-remote-credential-scan.d.ts +3 -3
  558. package/dist/daemon/utils/git-remote-credential-scan.d.ts.map +1 -1
  559. package/dist/daemon/utils/git-remote-credential-scan.js +6 -2
  560. package/dist/daemon/utils/mcp-token-authorization.d.ts +18 -13
  561. package/dist/daemon/utils/mcp-token-authorization.d.ts.map +1 -1
  562. package/dist/daemon/utils/mcp-token-authorization.js +11 -5
  563. package/dist/daemon/utils/open-source-telemetry-config.d.ts +6 -0
  564. package/dist/daemon/utils/open-source-telemetry-config.d.ts.map +1 -0
  565. package/dist/daemon/utils/open-source-telemetry-config.js +21 -0
  566. package/dist/daemon/utils/open-source-telemetry-heartbeat.d.ts +7 -0
  567. package/dist/daemon/utils/open-source-telemetry-heartbeat.d.ts.map +1 -0
  568. package/dist/daemon/utils/open-source-telemetry-heartbeat.js +15 -0
  569. package/dist/daemon/utils/open-source-telemetry-usage.d.ts +9 -0
  570. package/dist/daemon/utils/open-source-telemetry-usage.d.ts.map +1 -0
  571. package/dist/daemon/utils/open-source-telemetry-usage.js +121 -0
  572. package/dist/daemon/utils/realign-repo-origin.d.ts +3 -3
  573. package/dist/daemon/utils/realign-repo-origin.d.ts.map +1 -1
  574. package/dist/daemon/utils/realign-repo-origin.js +47 -16
  575. package/dist/daemon/utils/realtime-publish.d.ts +2 -0
  576. package/dist/daemon/utils/realtime-publish.d.ts.map +1 -1
  577. package/dist/daemon/utils/realtime-publish.js +51 -10
  578. package/dist/daemon/utils/session-state-hooks.d.ts +3 -3
  579. package/dist/daemon/utils/session-state-hooks.d.ts.map +1 -1
  580. package/dist/daemon/utils/session-turn-lock.d.ts +8 -1
  581. package/dist/daemon/utils/session-turn-lock.d.ts.map +1 -1
  582. package/dist/daemon/utils/session-turn-lock.js +25 -2
  583. package/dist/daemon/utils/spawn-executor.d.ts +23 -1
  584. package/dist/daemon/utils/spawn-executor.d.ts.map +1 -1
  585. package/dist/daemon/utils/spawn-executor.js +34 -4
  586. package/dist/daemon/utils/tenant-db-scope.d.ts +20 -0
  587. package/dist/daemon/utils/tenant-db-scope.d.ts.map +1 -0
  588. package/dist/daemon/utils/tenant-db-scope.js +114 -0
  589. package/dist/daemon/utils/unix-group-init.d.ts +3 -3
  590. package/dist/daemon/utils/unix-group-init.d.ts.map +1 -1
  591. package/dist/daemon/utils/upload.d.ts +6 -9
  592. package/dist/daemon/utils/upload.d.ts.map +1 -1
  593. package/dist/daemon/utils/upload.js +30 -37
  594. package/dist/daemon/widgets/env-vars/index.d.ts +26 -1
  595. package/dist/daemon/widgets/env-vars/index.d.ts.map +1 -1
  596. package/dist/daemon/widgets/env-vars/index.js +145 -21
  597. package/dist/daemon/widgets/index.js +137 -21
  598. package/dist/executor/commands/environment.d.ts.map +1 -1
  599. package/dist/executor/commands/environment.js +9 -5
  600. package/dist/executor/commands/git.js +1 -1
  601. package/dist/executor/git/index.d.ts +8 -0
  602. package/dist/executor/git/index.d.ts.map +1 -0
  603. package/dist/executor/git/index.js +7 -0
  604. package/dist/executor/handlers/sdk/base-executor.d.ts.map +1 -1
  605. package/dist/executor/handlers/sdk/base-executor.js +4 -1
  606. package/dist/executor/handlers/sdk/git-safe-directory.d.ts.map +1 -1
  607. package/dist/executor/handlers/sdk/git-safe-directory.js +1 -1
  608. package/dist/executor/sdk-handlers/base/diff-enrichment.js +1 -1
  609. package/dist/executor/sdk-handlers/codex/codex-tool.d.ts +6 -10
  610. package/dist/executor/sdk-handlers/codex/codex-tool.d.ts.map +1 -1
  611. package/dist/executor/sdk-handlers/codex/codex-tool.js +12 -15
  612. package/dist/executor/sdk-handlers/codex/normalizer.d.ts.map +1 -1
  613. package/dist/executor/sdk-handlers/codex/normalizer.js +11 -1
  614. package/dist/executor/sdk-handlers/codex/pricing/litellm-openai-model-prices.json +3663 -0
  615. package/dist/executor/sdk-handlers/codex/pricing/litellm-pricing.d.ts +31 -0
  616. package/dist/executor/sdk-handlers/codex/pricing/litellm-pricing.d.ts.map +1 -0
  617. package/dist/executor/sdk-handlers/codex/pricing/litellm-pricing.js +46 -0
  618. package/dist/executor/sdk-handlers/codex/prompt-service.d.ts.map +1 -1
  619. package/dist/executor/sdk-handlers/codex/prompt-service.js +61 -6
  620. package/dist/executor/sdk-handlers/codex/usage.d.ts +14 -23
  621. package/dist/executor/sdk-handlers/codex/usage.d.ts.map +1 -1
  622. package/dist/executor/sdk-handlers/codex/usage.js +18 -33
  623. package/dist/executor/services/feathers-client.js +5 -5
  624. package/dist/git/index.cjs +1101 -0
  625. package/dist/git/index.d.ts +533 -0
  626. package/dist/git/index.d.ts.map +1 -0
  627. package/dist/git/index.js +1022 -0
  628. package/dist/git/package.json +21 -0
  629. package/dist/git/pure.cjs +185 -0
  630. package/dist/git/pure.d.ts +39 -0
  631. package/dist/git/pure.d.ts.map +1 -0
  632. package/dist/git/pure.js +139 -0
  633. package/dist/ui/assets/AgorEmojiPickerInner-DQjr8M3_.js +1 -0
  634. package/dist/ui/assets/App-hJtcOxHv.js +5 -0
  635. package/dist/ui/assets/App-hJtcOxHv.js.gz +0 -0
  636. package/dist/ui/assets/AppNode-BhuMpn8O.js +1 -0
  637. package/dist/ui/assets/AppNode-BhuMpn8O.js.gz +0 -0
  638. package/dist/ui/assets/ArtifactConsentModal-oMMzRn8L.js +1 -0
  639. package/dist/ui/assets/ArtifactConsentModal-oMMzRn8L.js.gz +0 -0
  640. package/dist/ui/assets/ArtifactFullscreenPage-B3wT8t8f.js +9 -0
  641. package/dist/ui/assets/ArtifactFullscreenPage-B3wT8t8f.js.gz +0 -0
  642. package/dist/ui/assets/ArtifactNode-BzQcrwFS.js +9 -0
  643. package/dist/ui/assets/ArtifactNode-BzQcrwFS.js.gz +0 -0
  644. package/dist/ui/assets/AutocompleteTextarea-Dau-V_30.js +19 -0
  645. package/dist/ui/assets/AutocompleteTextarea-Dau-V_30.js.gz +0 -0
  646. package/dist/ui/assets/BoardObjectNodes-DdKWv_ZT.js +34 -0
  647. package/dist/ui/assets/BoardObjectNodes-DdKWv_ZT.js.gz +0 -0
  648. package/dist/ui/assets/CodeEditor.inner-Cuj6RuLL.js +7 -0
  649. package/dist/ui/assets/CodeEditor.inner-Cuj6RuLL.js.gz +0 -0
  650. package/dist/ui/assets/ConversationView-9-3ma1u-.js +1 -0
  651. package/dist/ui/assets/ConversationView-9-3ma1u-.js.gz +0 -0
  652. package/dist/ui/assets/EmbeddedTerminal-Lx5I9EOJ.js +2 -0
  653. package/dist/ui/assets/EmbeddedTerminal-Lx5I9EOJ.js.gz +0 -0
  654. package/dist/ui/assets/KnowledgePage-Dz8YAMYC.js +24 -0
  655. package/dist/ui/assets/KnowledgePage-Dz8YAMYC.js.gz +0 -0
  656. package/dist/ui/assets/{MarketingScreenshotPage-zv5RUCuV.js → MarketingScreenshotPage-CmDPBHOl.js} +2 -2
  657. package/dist/ui/assets/MarketingScreenshotPage-CmDPBHOl.js.gz +0 -0
  658. package/dist/ui/assets/MobileApp-BpgSG_gz.js +1 -0
  659. package/dist/ui/assets/MobileApp-BpgSG_gz.js.gz +0 -0
  660. package/dist/ui/assets/SessionCanvas-B6_mtlxK.js +13 -0
  661. package/dist/ui/assets/SessionCanvas-B6_mtlxK.js.gz +0 -0
  662. package/dist/ui/assets/{SessionCanvas-mEmYGZhC.css → SessionCanvas-Bh7Yg5dZ.css} +1 -1
  663. package/dist/ui/assets/SessionCanvas-Bh7Yg5dZ.css.gz +0 -0
  664. package/dist/ui/assets/{StreamdownDemoPage-wzWaqWwr.js → StreamdownDemoPage-okKKR2QH.js} +2 -2
  665. package/dist/ui/assets/StreamdownDemoPage-okKKR2QH.js.gz +0 -0
  666. package/dist/ui/assets/TerminalModal-D9jMGZXv.js +2 -0
  667. package/dist/ui/assets/TerminalModal-D9jMGZXv.js.gz +0 -0
  668. package/dist/ui/assets/ThemeSwitcher-D9HgT37l.js +1 -0
  669. package/dist/ui/assets/ThemeSwitcher-D9HgT37l.js.gz +0 -0
  670. package/dist/ui/assets/ThemedSyntaxHighlighter.inner-C1FdIHn0.js +1 -0
  671. package/dist/ui/assets/{antd-CfbbHJOz.js → antd-DT5ackd0.js} +5 -5
  672. package/dist/ui/assets/{antd-CfbbHJOz.js.gz → antd-DT5ackd0.js.gz} +0 -0
  673. package/dist/ui/assets/architecture-U656AL7Q-DMnxkQRZ.js +1 -0
  674. package/dist/ui/assets/architectureDiagram-VXUJARFQ-DwTJGGoj.js +36 -0
  675. package/dist/ui/assets/architectureDiagram-VXUJARFQ-DwTJGGoj.js.gz +0 -0
  676. package/dist/ui/assets/{blockDiagram-VD42YOAC-BhZaEN19.js → blockDiagram-VD42YOAC-Dh1_TVW2.js} +4 -4
  677. package/dist/ui/assets/blockDiagram-VD42YOAC-Dh1_TVW2.js.gz +0 -0
  678. package/dist/ui/assets/{c4Diagram-YG6GDRKO-Dk_UH-sY.js → c4Diagram-YG6GDRKO-B1e96AcB.js} +2 -2
  679. package/dist/ui/assets/c4Diagram-YG6GDRKO-B1e96AcB.js.gz +0 -0
  680. package/dist/ui/assets/channel-Jv4dT4S5.js +1 -0
  681. package/dist/ui/assets/{chunk-4BX2VUAB-XprbG2TG.js → chunk-4BX2VUAB-BODpCjJx.js} +1 -1
  682. package/dist/ui/assets/chunk-55IACEB6-lJXvUquf.js +1 -0
  683. package/dist/ui/assets/{chunk-ABZYJK2D-BJcrryHK.js → chunk-ABZYJK2D-DCTXWSzV.js} +3 -3
  684. package/dist/ui/assets/chunk-ABZYJK2D-DCTXWSzV.js.gz +0 -0
  685. package/dist/ui/assets/{chunk-AGHRB4JF-DvxmfbM0.js → chunk-AGHRB4JF-CbNphBjE.js} +1 -1
  686. package/dist/ui/assets/chunk-AGHRB4JF-CbNphBjE.js.gz +0 -0
  687. package/dist/ui/assets/{chunk-ATLVNIR6-DbeJ0OrR.js → chunk-ATLVNIR6-rWg3qxof.js} +1 -1
  688. package/dist/ui/assets/chunk-ATLVNIR6-rWg3qxof.js.gz +0 -0
  689. package/dist/ui/assets/{chunk-B4BG7PRW-C53q2ggf.js → chunk-B4BG7PRW-CgtLCbpE.js} +3 -3
  690. package/dist/ui/assets/chunk-B4BG7PRW-CgtLCbpE.js.gz +0 -0
  691. package/dist/ui/assets/{chunk-CVBHYZKI-B3EBSlb3.js → chunk-CVBHYZKI-DTL6Zgr0.js} +1 -1
  692. package/dist/ui/assets/{chunk-DI55MBZ5-vIyNEQN-.js → chunk-DI55MBZ5-Dwvx2Kva.js} +1 -1
  693. package/dist/ui/assets/chunk-DI55MBZ5-Dwvx2Kva.js.gz +0 -0
  694. package/dist/ui/assets/chunk-EXTU4WIE-DHyaqTsP.js +1 -0
  695. package/dist/ui/assets/{chunk-FMBD7UC4-rddmfK-Z.js → chunk-FMBD7UC4-BogA_9CV.js} +1 -1
  696. package/dist/ui/assets/{chunk-HN2XXSSU-Dttqcg3b.js → chunk-HN2XXSSU-2blQO3Gb.js} +1 -1
  697. package/dist/ui/assets/chunk-HN2XXSSU-2blQO3Gb.js.gz +0 -0
  698. package/dist/ui/assets/chunk-JA3XYJ7Z-Cr1rmOui.js +11 -0
  699. package/dist/ui/assets/chunk-JA3XYJ7Z-Cr1rmOui.js.gz +0 -0
  700. package/dist/ui/assets/{chunk-JZLCHNYA-EUmx2y4H.js → chunk-JZLCHNYA-BsgZ79Fa.js} +5 -5
  701. package/dist/ui/assets/chunk-JZLCHNYA-BsgZ79Fa.js.gz +0 -0
  702. package/dist/ui/assets/{chunk-MI3HLSF2-65n9Mkyc.js → chunk-MI3HLSF2-dwYeUy5S.js} +1 -1
  703. package/dist/ui/assets/chunk-MI3HLSF2-dwYeUy5S.js.gz +0 -0
  704. package/dist/ui/assets/chunk-N4CR4FBY-DEMgSRVe.js +2 -0
  705. package/dist/ui/assets/chunk-N4CR4FBY-DEMgSRVe.js.gz +0 -0
  706. package/dist/ui/assets/{chunk-QN33PNHL-DsRKK6NR.js → chunk-QN33PNHL-DxdIDCAa.js} +1 -1
  707. package/dist/ui/assets/{chunk-QXUST7PY-BCYnMiS3.js → chunk-QXUST7PY-BCK2V0i-.js} +2 -2
  708. package/dist/ui/assets/chunk-QXUST7PY-BCK2V0i-.js.gz +0 -0
  709. package/dist/ui/assets/chunk-QZHKN3VN-CALjGrEE.js +1 -0
  710. package/dist/ui/assets/chunk-S3R3BYOJ-GP3zIxrB.js +2 -0
  711. package/dist/ui/assets/chunk-S3R3BYOJ-GP3zIxrB.js.gz +0 -0
  712. package/dist/ui/assets/{chunk-TZMSLE5B-BuQUQcTr.js → chunk-TZMSLE5B-dX5RaM6g.js} +1 -1
  713. package/dist/ui/assets/chunk-TZMSLE5B-dX5RaM6g.js.gz +0 -0
  714. package/dist/ui/assets/classDiagram-2ON5EDUG-C3_RVP70.js +1 -0
  715. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-C3_RVP70.js +1 -0
  716. package/dist/ui/assets/constants-GjIDNVyt.js +1 -0
  717. package/dist/ui/assets/{cose-bilkent-S5V4N54A-CnPB3ARO.js → cose-bilkent-S5V4N54A-Dx0BJVDl.js} +1 -1
  718. package/dist/ui/assets/cose-bilkent-S5V4N54A-Dx0BJVDl.js.gz +0 -0
  719. package/dist/ui/assets/{dagre-6UL2VRFP-DhS-k_Se.js → dagre-6UL2VRFP-DiQSUxqN.js} +1 -1
  720. package/dist/ui/assets/dagre-6UL2VRFP-DiQSUxqN.js.gz +0 -0
  721. package/dist/ui/assets/{dagre-KgLoHEuy.js → dagre-Bekd9Vdj.js} +1 -1
  722. package/dist/ui/assets/dagre-Bekd9Vdj.js.gz +0 -0
  723. package/dist/ui/assets/diagram-PSM6KHXK-DtJnDQjc.js +24 -0
  724. package/dist/ui/assets/diagram-PSM6KHXK-DtJnDQjc.js.gz +0 -0
  725. package/dist/ui/assets/{diagram-QEK2KX5R-BPCitvbo.js → diagram-QEK2KX5R-CobkCRdj.js} +1 -1
  726. package/dist/ui/assets/diagram-QEK2KX5R-CobkCRdj.js.gz +0 -0
  727. package/dist/ui/assets/{diagram-S2PKOQOG-NW4uK6sx.js → diagram-S2PKOQOG-DHEZYivc.js} +1 -1
  728. package/dist/ui/assets/diagram-S2PKOQOG-DHEZYivc.js.gz +0 -0
  729. package/dist/ui/assets/editor-DQIG-JYZ.js +43 -0
  730. package/dist/ui/assets/editor-DQIG-JYZ.js.gz +0 -0
  731. package/dist/ui/assets/emoji-B0hLmSLZ.js +3 -0
  732. package/dist/ui/assets/emoji-B0hLmSLZ.js.gz +0 -0
  733. package/dist/ui/assets/{erDiagram-Q2GNP2WA-me1fboaf.js → erDiagram-Q2GNP2WA-BVNeTZPQ.js} +2 -2
  734. package/dist/ui/assets/erDiagram-Q2GNP2WA-BVNeTZPQ.js.gz +0 -0
  735. package/dist/ui/assets/flowDiagram-NV44I4VS-C73VFdyk.js +162 -0
  736. package/dist/ui/assets/flowDiagram-NV44I4VS-C73VFdyk.js.gz +0 -0
  737. package/dist/ui/assets/ganttDiagram-LVOFAZNH-B_RosuD1.js +267 -0
  738. package/dist/ui/assets/ganttDiagram-LVOFAZNH-B_RosuD1.js.gz +0 -0
  739. package/dist/ui/assets/{gitGraph-F6HP7TQM-CfFE_uAC.js → gitGraph-F6HP7TQM-DMFIqn4h.js} +1 -1
  740. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-hxbgwNA1.js +65 -0
  741. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-hxbgwNA1.js.gz +0 -0
  742. package/dist/ui/assets/index-DTz1Dif6.js +64 -0
  743. package/dist/ui/assets/index-DTz1Dif6.js.gz +0 -0
  744. package/dist/ui/assets/{index-DxuPq13l.css → index-qkT7Qqm2.css} +1 -1
  745. package/dist/ui/assets/index-qkT7Qqm2.css.gz +0 -0
  746. package/dist/ui/assets/{info-NVLQJR56-i_xHYg3f.js → info-NVLQJR56-DZ3K-w48.js} +1 -1
  747. package/dist/ui/assets/{infoDiagram-ER5ION4S-2NL93b78.js → infoDiagram-ER5ION4S-CxnBJQu6.js} +1 -1
  748. package/dist/ui/assets/{journeyDiagram-XKPGCS4Q-CZF-2DHU.js → journeyDiagram-XKPGCS4Q-CHYNj-f8.js} +3 -3
  749. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CHYNj-f8.js.gz +0 -0
  750. package/dist/ui/assets/{kanban-definition-3W4ZIXB7-CfvJIOny.js → kanban-definition-3W4ZIXB7-DQPCCsj2.js} +1 -1
  751. package/dist/ui/assets/kanban-definition-3W4ZIXB7-DQPCCsj2.js.gz +0 -0
  752. package/dist/ui/assets/{line-DDv8kOJk.js → line-DBRjKmfa.js} +1 -1
  753. package/dist/ui/assets/{linear-Daef-l29.js → linear-DFao5Wyp.js} +1 -1
  754. package/dist/ui/assets/linear-DFao5Wyp.js.gz +0 -0
  755. package/dist/ui/assets/{mermaid-parser.core-CdK9QgYV.js → mermaid-parser.core-DYCfacHj.js} +2 -2
  756. package/dist/ui/assets/mermaid-parser.core-DYCfacHj.js.gz +0 -0
  757. package/dist/ui/assets/mermaid.core-C6xGFSdE.js +11 -0
  758. package/dist/ui/assets/mermaid.core-C6xGFSdE.js.gz +0 -0
  759. package/dist/ui/assets/{mindmap-definition-VGOIOE7T-Cb3QMflX.js → mindmap-definition-VGOIOE7T-L3Pw-YM7.js} +1 -1
  760. package/dist/ui/assets/mindmap-definition-VGOIOE7T-L3Pw-YM7.js.gz +0 -0
  761. package/dist/ui/assets/{packet-BFZMPI3H-Bm2uwz4i.js → packet-BFZMPI3H-CpL6iNoa.js} +1 -1
  762. package/dist/ui/assets/{particles-DsJFOarW.js → particles-CT8hcJOA.js} +1 -1
  763. package/dist/ui/assets/particles-CT8hcJOA.js.gz +0 -0
  764. package/dist/ui/assets/{pie-7BOR55EZ-5i17tVnF.js → pie-7BOR55EZ-hTqChbTo.js} +1 -1
  765. package/dist/ui/assets/{pieDiagram-ADFJNKIX-BxIwQWvw.js → pieDiagram-ADFJNKIX-Bf4Nou75.js} +1 -1
  766. package/dist/ui/assets/pieDiagram-ADFJNKIX-Bf4Nou75.js.gz +0 -0
  767. package/dist/ui/assets/{quadrantDiagram-AYHSOK5B-B5HPe4ga.js → quadrantDiagram-AYHSOK5B-DpjUTLB1.js} +3 -3
  768. package/dist/ui/assets/quadrantDiagram-AYHSOK5B-DpjUTLB1.js.gz +0 -0
  769. package/dist/ui/assets/{radar-NHE76QYJ-BTn-tq0k.js → radar-NHE76QYJ-myy7OENC.js} +1 -1
  770. package/dist/ui/assets/reactflow-Cubtnk8i.js +2 -0
  771. package/dist/ui/assets/reactflow-Cubtnk8i.js.gz +0 -0
  772. package/dist/ui/assets/{requirementDiagram-UZGBJVZJ-YfI6llkX.js → requirementDiagram-UZGBJVZJ-Bfrfh-0-.js} +1 -1
  773. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-Bfrfh-0-.js.gz +0 -0
  774. package/dist/ui/assets/{sandpack-D7koO5op.js → sandpack-C58bwfIS.js} +38 -38
  775. package/dist/ui/assets/sandpack-C58bwfIS.js.gz +0 -0
  776. package/dist/ui/assets/sandpackDefaults-Bkga8XAE.js +1 -0
  777. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-ClZAZ6va.js +10 -0
  778. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-ClZAZ6va.js.gz +0 -0
  779. package/dist/ui/assets/{sequenceDiagram-WL72ISMW-DAe4Um17.js → sequenceDiagram-WL72ISMW-CNgly63p.js} +6 -6
  780. package/dist/ui/assets/sequenceDiagram-WL72ISMW-CNgly63p.js.gz +0 -0
  781. package/dist/ui/assets/src-DAeyG22O.js +34 -0
  782. package/dist/ui/assets/src-DAeyG22O.js.gz +0 -0
  783. package/dist/ui/assets/stateDiagram-FKZM4ZOC-BrEAoDpE.js +1 -0
  784. package/dist/ui/assets/stateDiagram-FKZM4ZOC-BrEAoDpE.js.gz +0 -0
  785. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-BNL52_oN.js +1 -0
  786. package/dist/ui/assets/streamdown-BdAVfkeF.js +521 -0
  787. package/dist/ui/assets/streamdown-BdAVfkeF.js.gz +0 -0
  788. package/dist/ui/assets/syntax-BOfTnQiy.js +9 -0
  789. package/dist/ui/assets/syntax-BOfTnQiy.js.gz +0 -0
  790. package/dist/ui/assets/{timeline-definition-IT6M3QCI-D6P5txjT.js → timeline-definition-IT6M3QCI-CaRH3k4l.js} +16 -16
  791. package/dist/ui/assets/timeline-definition-IT6M3QCI-CaRH3k4l.js.gz +0 -0
  792. package/dist/ui/assets/{treemap-KMMF4GRG-Bitm3gy4.js → treemap-KMMF4GRG-CUaLOV_B.js} +1 -1
  793. package/dist/ui/assets/{useUserLocalStorage-Ckb8HsIw.js → useUserLocalStorage-C8sgXgXR.js} +1 -1
  794. package/dist/ui/assets/useUserLocalStorage-C8sgXgXR.js.gz +0 -0
  795. package/dist/ui/assets/{xychartDiagram-PRI3JC2R-CsybjUbd.js → xychartDiagram-PRI3JC2R-BlhkI9T_.js} +1 -1
  796. package/dist/ui/assets/xychartDiagram-PRI3JC2R-BlhkI9T_.js.gz +0 -0
  797. package/dist/ui/index.html +10 -11
  798. package/dist/ui/index.html.gz +0 -0
  799. package/package.json +6 -5
  800. package/scripts/postinstall.js +27 -19
  801. package/dist/cli/commands/daemon/sync.d.ts.map +0 -1
  802. package/dist/ui/assets/App-DcEY8Ota.js +0 -3
  803. package/dist/ui/assets/App-DcEY8Ota.js.gz +0 -0
  804. package/dist/ui/assets/ArtifactConsentModal-CiCbK9iv.js +0 -1
  805. package/dist/ui/assets/ArtifactConsentModal-CiCbK9iv.js.gz +0 -0
  806. package/dist/ui/assets/ArtifactFullscreenPage-CfsTEGKd.js +0 -9
  807. package/dist/ui/assets/ArtifactFullscreenPage-CfsTEGKd.js.gz +0 -0
  808. package/dist/ui/assets/AutocompleteTextarea-BAFFH_5e.js +0 -18
  809. package/dist/ui/assets/AutocompleteTextarea-BAFFH_5e.js.gz +0 -0
  810. package/dist/ui/assets/BoardObjectNodes-D-O6bZIG.js +0 -34
  811. package/dist/ui/assets/BoardObjectNodes-D-O6bZIG.js.gz +0 -0
  812. package/dist/ui/assets/CodeEditor.inner-DBgsP4tn.js +0 -8
  813. package/dist/ui/assets/CodeEditor.inner-DBgsP4tn.js.gz +0 -0
  814. package/dist/ui/assets/ConversationView-CUWR0gR6.js +0 -1
  815. package/dist/ui/assets/ConversationView-CUWR0gR6.js.gz +0 -0
  816. package/dist/ui/assets/KnowledgePage-B2bzlXfn.js +0 -24
  817. package/dist/ui/assets/KnowledgePage-B2bzlXfn.js.gz +0 -0
  818. package/dist/ui/assets/MarketingScreenshotPage-zv5RUCuV.js.gz +0 -0
  819. package/dist/ui/assets/MobileApp-VgVnsnsN.js +0 -1
  820. package/dist/ui/assets/MobileApp-VgVnsnsN.js.gz +0 -0
  821. package/dist/ui/assets/SessionCanvas-f1-1Gbcw.js +0 -20
  822. package/dist/ui/assets/SessionCanvas-f1-1Gbcw.js.gz +0 -0
  823. package/dist/ui/assets/SessionCanvas-mEmYGZhC.css.gz +0 -0
  824. package/dist/ui/assets/StreamdownDemoPage-wzWaqWwr.js.gz +0 -0
  825. package/dist/ui/assets/ThemeSwitcher-Dly2y9pi.js +0 -1
  826. package/dist/ui/assets/ThemeSwitcher-Dly2y9pi.js.gz +0 -0
  827. package/dist/ui/assets/architecture-U656AL7Q-CykGFbQU.js +0 -1
  828. package/dist/ui/assets/architectureDiagram-VXUJARFQ-C8HXAenz.js +0 -36
  829. package/dist/ui/assets/architectureDiagram-VXUJARFQ-C8HXAenz.js.gz +0 -0
  830. package/dist/ui/assets/blockDiagram-VD42YOAC-BhZaEN19.js.gz +0 -0
  831. package/dist/ui/assets/c4Diagram-YG6GDRKO-Dk_UH-sY.js.gz +0 -0
  832. package/dist/ui/assets/channel-D6_nUWlW.js +0 -1
  833. package/dist/ui/assets/chunk-55IACEB6-ByzqIgSb.js +0 -1
  834. package/dist/ui/assets/chunk-ABZYJK2D-BJcrryHK.js.gz +0 -0
  835. package/dist/ui/assets/chunk-AGHRB4JF-DvxmfbM0.js.gz +0 -0
  836. package/dist/ui/assets/chunk-ATLVNIR6-DbeJ0OrR.js.gz +0 -0
  837. package/dist/ui/assets/chunk-B4BG7PRW-C53q2ggf.js.gz +0 -0
  838. package/dist/ui/assets/chunk-DI55MBZ5-vIyNEQN-.js.gz +0 -0
  839. package/dist/ui/assets/chunk-EXTU4WIE-B3ObkuOm.js +0 -1
  840. package/dist/ui/assets/chunk-HN2XXSSU-Dttqcg3b.js.gz +0 -0
  841. package/dist/ui/assets/chunk-JA3XYJ7Z-DbNDev3D.js +0 -11
  842. package/dist/ui/assets/chunk-JA3XYJ7Z-DbNDev3D.js.gz +0 -0
  843. package/dist/ui/assets/chunk-JZLCHNYA-EUmx2y4H.js.gz +0 -0
  844. package/dist/ui/assets/chunk-MI3HLSF2-65n9Mkyc.js.gz +0 -0
  845. package/dist/ui/assets/chunk-N4CR4FBY-mv5koXqW.js +0 -2
  846. package/dist/ui/assets/chunk-N4CR4FBY-mv5koXqW.js.gz +0 -0
  847. package/dist/ui/assets/chunk-QXUST7PY-BCYnMiS3.js.gz +0 -0
  848. package/dist/ui/assets/chunk-QZHKN3VN-HucAw4xW.js +0 -1
  849. package/dist/ui/assets/chunk-S3R3BYOJ-CWMEa9Dc.js +0 -2
  850. package/dist/ui/assets/chunk-S3R3BYOJ-CWMEa9Dc.js.gz +0 -0
  851. package/dist/ui/assets/chunk-TZMSLE5B-BuQUQcTr.js.gz +0 -0
  852. package/dist/ui/assets/classDiagram-2ON5EDUG-CUT3rPTB.js +0 -1
  853. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-CUT3rPTB.js +0 -1
  854. package/dist/ui/assets/cose-bilkent-S5V4N54A-CnPB3ARO.js.gz +0 -0
  855. package/dist/ui/assets/dagre-6UL2VRFP-DhS-k_Se.js.gz +0 -0
  856. package/dist/ui/assets/dagre-KgLoHEuy.js.gz +0 -0
  857. package/dist/ui/assets/diagram-PSM6KHXK-BZg3MJmb.js +0 -24
  858. package/dist/ui/assets/diagram-PSM6KHXK-BZg3MJmb.js.gz +0 -0
  859. package/dist/ui/assets/diagram-QEK2KX5R-BPCitvbo.js.gz +0 -0
  860. package/dist/ui/assets/diagram-S2PKOQOG-NW4uK6sx.js.gz +0 -0
  861. package/dist/ui/assets/editor-CzFWIUw2.js +0 -39
  862. package/dist/ui/assets/editor-CzFWIUw2.js.gz +0 -0
  863. package/dist/ui/assets/emoji-Dkz4Zzv_.js +0 -3
  864. package/dist/ui/assets/emoji-Dkz4Zzv_.js.gz +0 -0
  865. package/dist/ui/assets/erDiagram-Q2GNP2WA-me1fboaf.js.gz +0 -0
  866. package/dist/ui/assets/flowDiagram-NV44I4VS-DzE8dGsh.js +0 -162
  867. package/dist/ui/assets/flowDiagram-NV44I4VS-DzE8dGsh.js.gz +0 -0
  868. package/dist/ui/assets/ganttDiagram-LVOFAZNH-CFQD09Mi.js +0 -267
  869. package/dist/ui/assets/ganttDiagram-LVOFAZNH-CFQD09Mi.js.gz +0 -0
  870. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-CaVoxU4C.js +0 -65
  871. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-CaVoxU4C.js.gz +0 -0
  872. package/dist/ui/assets/index-BN5_Qq7R.js +0 -324
  873. package/dist/ui/assets/index-BN5_Qq7R.js.gz +0 -0
  874. package/dist/ui/assets/index-DxuPq13l.css.gz +0 -0
  875. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CZF-2DHU.js.gz +0 -0
  876. package/dist/ui/assets/kanban-definition-3W4ZIXB7-CfvJIOny.js.gz +0 -0
  877. package/dist/ui/assets/katex-CamJ39w1.js +0 -257
  878. package/dist/ui/assets/katex-CamJ39w1.js.gz +0 -0
  879. package/dist/ui/assets/linear-Daef-l29.js.gz +0 -0
  880. package/dist/ui/assets/mermaid-parser.core-CdK9QgYV.js.gz +0 -0
  881. package/dist/ui/assets/mermaid.core-D6GS9mU-.js +0 -11
  882. package/dist/ui/assets/mermaid.core-D6GS9mU-.js.gz +0 -0
  883. package/dist/ui/assets/message-SqLqNYcv.js +0 -36
  884. package/dist/ui/assets/message-SqLqNYcv.js.gz +0 -0
  885. package/dist/ui/assets/mindmap-definition-VGOIOE7T-Cb3QMflX.js.gz +0 -0
  886. package/dist/ui/assets/particles-DsJFOarW.js.gz +0 -0
  887. package/dist/ui/assets/pieDiagram-ADFJNKIX-BxIwQWvw.js.gz +0 -0
  888. package/dist/ui/assets/quadrantDiagram-AYHSOK5B-B5HPe4ga.js.gz +0 -0
  889. package/dist/ui/assets/reactflow-Bf74ngoo.js +0 -2
  890. package/dist/ui/assets/reactflow-Bf74ngoo.js.gz +0 -0
  891. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-YfI6llkX.js.gz +0 -0
  892. package/dist/ui/assets/sandpack-D7koO5op.js.gz +0 -0
  893. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-DOk_B10B.js +0 -10
  894. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-DOk_B10B.js.gz +0 -0
  895. package/dist/ui/assets/sequenceDiagram-WL72ISMW-DAe4Um17.js.gz +0 -0
  896. package/dist/ui/assets/stateDiagram-FKZM4ZOC-CCesDu_C.js +0 -1
  897. package/dist/ui/assets/stateDiagram-FKZM4ZOC-CCesDu_C.js.gz +0 -0
  898. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-CMlIrsoO.js +0 -1
  899. package/dist/ui/assets/syntax-C-M-8jOU.js +0 -10
  900. package/dist/ui/assets/syntax-C-M-8jOU.js.gz +0 -0
  901. package/dist/ui/assets/theme-BQZdiqwv.js +0 -1
  902. package/dist/ui/assets/timeline-definition-IT6M3QCI-D6P5txjT.js.gz +0 -0
  903. package/dist/ui/assets/useUserLocalStorage-Ckb8HsIw.js.gz +0 -0
  904. package/dist/ui/assets/xychartDiagram-PRI3JC2R-CsybjUbd.js.gz +0 -0
  905. /package/dist/cli/commands/{admin → local}/sync-unix.d.ts +0 -0
@@ -12,14 +12,15 @@ var __export = (target, all) => {
12
12
  for (var name in all)
13
13
  __defProp(target, name, { get: all[name], enumerable: true });
14
14
  };
15
- var __copyProps = (to, from, except, desc7) => {
15
+ var __copyProps = (to, from, except, desc6) => {
16
16
  if (from && typeof from === "object" || typeof from === "function") {
17
17
  for (let key of __getOwnPropNames(from))
18
18
  if (!__hasOwnProp.call(to, key) && key !== except)
19
- __defProp(to, key, { get: () => from[key], enumerable: !(desc7 = __getOwnPropDesc(from, key)) || desc7.enumerable });
19
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc6 = __getOwnPropDesc(from, key)) || desc6.enumerable });
20
20
  }
21
21
  return to;
22
22
  };
23
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
23
24
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
24
25
  // If the importer is in node compatibility mode or this is not an ESM
25
26
  // file that has been converted to a CommonJS file using a Babel-
@@ -31,9 +32,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
31
32
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
32
33
 
33
34
  // ../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.15_tsx@4.22.4_typescript@6.0.3_yaml@2.9.0/node_modules/tsup/assets/cjs_shims.js
35
+ var getImportMetaUrl, importMetaUrl;
34
36
  var init_cjs_shims = __esm({
35
37
  "../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.15_tsx@4.22.4_typescript@6.0.3_yaml@2.9.0/node_modules/tsup/assets/cjs_shims.js"() {
36
38
  "use strict";
39
+ getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.tagName.toUpperCase() === "SCRIPT" ? document.currentScript.src : new URL("main.js", document.baseURI).href;
40
+ importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
37
41
  }
38
42
  });
39
43
 
@@ -156,6 +160,71 @@ var init_executor_heartbeat = __esm({
156
160
  }
157
161
  });
158
162
 
163
+ // src/config/multitenancy.ts
164
+ function detectPostgresUrl(url) {
165
+ if (!url) return false;
166
+ const lower = url.toLowerCase();
167
+ return lower.startsWith("postgresql://") || lower.startsWith("postgres://") || lower.startsWith("pg://");
168
+ }
169
+ function resolveMultiTenancyDatabaseDialect(config = {}) {
170
+ if (process.env.AGOR_DB_DIALECT === "postgresql" || process.env.AGOR_DB_DIALECT === "sqlite") {
171
+ return process.env.AGOR_DB_DIALECT;
172
+ }
173
+ if (detectPostgresUrl(process.env.DATABASE_URL)) return "postgresql";
174
+ if (config.database?.dialect === "postgresql" || config.database?.dialect === "sqlite") {
175
+ return config.database.dialect;
176
+ }
177
+ if (detectPostgresUrl(config.database?.postgresql?.url) || config.database?.postgresql?.host) {
178
+ return "postgresql";
179
+ }
180
+ return "sqlite";
181
+ }
182
+ function resolveMultiTenancyConfig(config) {
183
+ const raw = config.multi_tenancy ?? {};
184
+ const mode = raw.mode ?? "static";
185
+ return {
186
+ mode,
187
+ static_tenant_id: raw.static_tenant_id?.trim() || DEFAULT_STATIC_TENANT_ID,
188
+ ...raw.auth_claim ? { auth_claim: raw.auth_claim } : {},
189
+ ...raw.trusted_header ? { trusted_header: raw.trusted_header } : {}
190
+ };
191
+ }
192
+ function assertValidMultiTenancyConfig(config) {
193
+ const resolved = resolveMultiTenancyConfig(config);
194
+ if (resolved.mode !== "static" && resolved.mode !== "required_from_auth") {
195
+ throw new Error("Config error: multi_tenancy.mode must be one of: static, required_from_auth");
196
+ }
197
+ if (!resolved.static_tenant_id) {
198
+ throw new Error("Config error: multi_tenancy.static_tenant_id must not be empty");
199
+ }
200
+ if (resolved.auth_claim && RESERVED_AUTH_CLAIMS.has(resolved.auth_claim)) {
201
+ throw new Error(
202
+ `Config error: multi_tenancy.auth_claim cannot be reserved JWT claim '${resolved.auth_claim}'`
203
+ );
204
+ }
205
+ if (resolved.mode === "required_from_auth") {
206
+ if (resolveMultiTenancyDatabaseDialect(config) !== "postgresql") {
207
+ throw new Error(
208
+ "Config error: multi_tenancy.required_from_auth requires database.dialect: postgresql"
209
+ );
210
+ }
211
+ if (!resolved.auth_claim && !resolved.trusted_header) {
212
+ throw new Error(
213
+ "Config error: multi_tenancy.required_from_auth requires multi_tenancy.auth_claim or multi_tenancy.trusted_header"
214
+ );
215
+ }
216
+ }
217
+ }
218
+ var DEFAULT_STATIC_TENANT_ID, RESERVED_AUTH_CLAIMS;
219
+ var init_multitenancy = __esm({
220
+ "src/config/multitenancy.ts"() {
221
+ "use strict";
222
+ init_cjs_shims();
223
+ DEFAULT_STATIC_TENANT_ID = "default";
224
+ RESERVED_AUTH_CLAIMS = /* @__PURE__ */ new Set(["aud", "exp", "iat", "iss", "jti", "nbf", "sub", "type"]);
225
+ }
226
+ });
227
+
159
228
  // src/config/types.ts
160
229
  var BRANCH_STORAGE_MODES, DEFAULT_BRANCH_STORAGE_MODE;
161
230
  var init_types = __esm({
@@ -200,6 +269,7 @@ __export(config_manager_exports, {
200
269
  requireDaemonUser: () => requireDaemonUser,
201
270
  requirePublicBaseUrl: () => requirePublicBaseUrl,
202
271
  resolveBranchStorageConfig: () => resolveBranchStorageConfig,
272
+ resolveExecutionSecurityMode: () => resolveExecutionSecurityMode,
203
273
  saveConfig: () => saveConfig,
204
274
  setConfigValue: () => setConfigValue,
205
275
  unsetConfigValue: () => unsetConfigValue
@@ -209,8 +279,8 @@ function cacheKeyMatches(a, b) {
209
279
  }
210
280
  function statCacheKey(configPath) {
211
281
  try {
212
- const stat2 = (0, import_node_fs2.statSync)(configPath);
213
- return { mtimeMs: stat2.mtimeMs, size: stat2.size };
282
+ const stat = (0, import_node_fs2.statSync)(configPath);
283
+ return { mtimeMs: stat.mtimeMs, size: stat.size };
214
284
  } catch (error) {
215
285
  if (error.code === "ENOENT") {
216
286
  return NO_FILE_KEY;
@@ -238,7 +308,10 @@ function __resetConfigCacheForTests() {
238
308
  invalidateConfigCache();
239
309
  }
240
310
  function parseAndValidateConfig(content) {
241
- const parsed = import_js_yaml2.default.load(content);
311
+ if (content.trim() === "") {
312
+ return {};
313
+ }
314
+ const parsed = yaml2.load(content);
242
315
  const finalConfig = parsed || {};
243
316
  validateConfig(finalConfig);
244
317
  return finalConfig;
@@ -275,6 +348,7 @@ To update: agor config set execution.unix_user_mode insulated`
275
348
  `Config error: execution.managed_envs_execution_mode must be one of: hybrid, webhook-only`
276
349
  );
277
350
  }
351
+ assertValidMultiTenancyConfig(config);
278
352
  validateOptionalHttpUrl(
279
353
  config.external_launch,
280
354
  "login_redirect_url",
@@ -354,7 +428,7 @@ async function saveConfig(config) {
354
428
  validateConfig(config);
355
429
  await ensureAgorHome();
356
430
  const configPath = getConfigPath();
357
- const content = import_js_yaml2.default.dump(config, {
431
+ const content = yaml2.dump(config, {
358
432
  indent: 2,
359
433
  lineWidth: 120,
360
434
  noRefs: true
@@ -392,7 +466,12 @@ function getDefaultConfig() {
392
466
  // Default: sync passwords to Unix
393
467
  executor_heartbeat: resolveExecutorHeartbeatConfig()
394
468
  },
395
- analytics: getDefaultAnalyticsConfig()
469
+ analytics: getDefaultAnalyticsConfig(),
470
+ telemetry: {},
471
+ multi_tenancy: {
472
+ mode: "static",
473
+ static_tenant_id: "default"
474
+ }
396
475
  };
397
476
  }
398
477
  function expandHomePath(input) {
@@ -424,7 +503,8 @@ async function getConfigValue(key) {
424
503
  ui: { ...defaults.ui, ...config.ui },
425
504
  execution: { ...defaults.execution, ...config.execution },
426
505
  paths: { ...defaults.paths, ...config.paths },
427
- analytics: { ...defaults.analytics, ...config.analytics }
506
+ analytics: { ...defaults.analytics, ...config.analytics },
507
+ telemetry: { ...defaults.telemetry, ...config.telemetry }
428
508
  };
429
509
  const parts = key.split(".");
430
510
  let value = merged;
@@ -586,10 +666,10 @@ function requireDaemonUser(config) {
586
666
  if (config.daemon?.unix_user) {
587
667
  return config.daemon.unix_user;
588
668
  }
589
- const unixIsolationEnabled = config.execution?.branch_rbac === true || config.execution?.unix_user_mode && config.execution.unix_user_mode !== "simple";
669
+ const unixIsolationEnabled = resolveExecutionSecurityMode(config).requiresDaemonUnixUser;
590
670
  if (unixIsolationEnabled) {
591
671
  throw new Error(
592
- "Unix isolation is enabled (branch_rbac or unix_user_mode) but daemon.unix_user is not configured.\nPlease set daemon.unix_user in ~/.agor/config.yaml to the user running the daemon.\nExample:\n daemon:\n unix_user: agor"
672
+ "Unix isolation is enabled (execution.unix_user_mode is insulated or strict) but daemon.unix_user is not configured.\nPlease set daemon.unix_user in ~/.agor/config.yaml to the user running the daemon.\nExample:\n daemon:\n unix_user: agor"
593
673
  );
594
674
  }
595
675
  const user = process.env.USER || import_node_os.default.userInfo().username;
@@ -600,19 +680,29 @@ function requireDaemonUser(config) {
600
680
  }
601
681
  return user;
602
682
  }
683
+ function resolveExecutionSecurityMode(config = loadConfigSync()) {
684
+ const unixUserMode = config.execution?.unix_user_mode ?? "simple";
685
+ const unixIsolationEnabled = unixUserMode !== "simple";
686
+ return {
687
+ appRbacEnabled: config.execution?.branch_rbac === true,
688
+ unixUserMode,
689
+ unixImpersonationEnabled: unixIsolationEnabled,
690
+ unixFsIsolationEnabled: unixIsolationEnabled,
691
+ unixGroupRefreshNeeded: unixIsolationEnabled,
692
+ requiresDaemonUnixUser: unixIsolationEnabled,
693
+ shouldInitUnixGroups: unixIsolationEnabled
694
+ };
695
+ }
603
696
  function isBranchRbacEnabled() {
604
697
  try {
605
- const config = loadConfigSync();
606
- return config.execution?.branch_rbac === true;
698
+ return resolveExecutionSecurityMode().appRbacEnabled;
607
699
  } catch {
608
700
  return false;
609
701
  }
610
702
  }
611
703
  function isUnixImpersonationEnabled() {
612
704
  try {
613
- const config = loadConfigSync();
614
- const mode = config.execution?.unix_user_mode;
615
- return mode !== void 0 && mode !== "simple";
705
+ return resolveExecutionSecurityMode().unixImpersonationEnabled;
616
706
  } catch {
617
707
  return false;
618
708
  }
@@ -638,7 +728,7 @@ function ensureBranchStorageModeAllowed(mode) {
638
728
  }
639
729
  }
640
730
  function isUnixGroupRefreshNeeded() {
641
- return isBranchRbacEnabled() || isUnixImpersonationEnabled();
731
+ return resolveExecutionSecurityMode().unixGroupRefreshNeeded;
642
732
  }
643
733
  function getDataHome() {
644
734
  if (process.env.AGOR_DATA_HOME) {
@@ -681,7 +771,7 @@ async function getReposDirAsync() {
681
771
  async function getBranchesDirAsync() {
682
772
  return import_node_path.default.join(await getDataHomeAsync(), "worktrees");
683
773
  }
684
- var import_node_fs2, import_promises, import_node_os, import_node_path, import_js_yaml2, NO_FILE, NO_FILE_KEY, cachedEntry, PublicBaseUrlNotConfiguredError, CONFIG_CREDENTIAL_KEYS;
774
+ var import_node_fs2, import_promises, import_node_os, import_node_path, yaml2, NO_FILE, NO_FILE_KEY, cachedEntry, PublicBaseUrlNotConfiguredError, CONFIG_CREDENTIAL_KEYS;
685
775
  var init_config_manager = __esm({
686
776
  "src/config/config-manager.ts"() {
687
777
  "use strict";
@@ -690,10 +780,11 @@ var init_config_manager = __esm({
690
780
  import_promises = __toESM(require("fs/promises"), 1);
691
781
  import_node_os = __toESM(require("os"), 1);
692
782
  import_node_path = __toESM(require("path"), 1);
693
- import_js_yaml2 = __toESM(require("js-yaml"), 1);
783
+ yaml2 = __toESM(require("js-yaml"), 1);
694
784
  init_analytics_defaults();
695
785
  init_constants();
696
786
  init_executor_heartbeat();
787
+ init_multitenancy();
697
788
  init_types();
698
789
  NO_FILE = -1;
699
790
  NO_FILE_KEY = { mtimeMs: NO_FILE, size: 0 };
@@ -716,6 +807,21 @@ var init_config_manager = __esm({
716
807
  }
717
808
  });
718
809
 
810
+ // src/db/tenant-context.ts
811
+ function getCurrentTenantId() {
812
+ const store = tenantDatabaseScope.getStore();
813
+ return store?.kind === "tenant" ? store.tenantId : void 0;
814
+ }
815
+ var import_node_async_hooks, tenantDatabaseScope;
816
+ var init_tenant_context = __esm({
817
+ "src/db/tenant-context.ts"() {
818
+ "use strict";
819
+ init_cjs_shims();
820
+ import_node_async_hooks = require("async_hooks");
821
+ tenantDatabaseScope = new import_node_async_hooks.AsyncLocalStorage();
822
+ }
823
+ });
824
+
719
825
  // src/db/database-wrapper.ts
720
826
  var database_wrapper_exports = {};
721
827
  __export(database_wrapper_exports, {
@@ -781,7 +887,7 @@ function dateTruncUtc(db, column, bucket) {
781
887
  }
782
888
  } else {
783
889
  return import_drizzle_orm.sql`to_char(
784
- date_trunc(${bucket}, ${column} AT TIME ZONE 'UTC'),
890
+ date_trunc(${import_drizzle_orm.sql.raw(`'${bucket}'`)}, ${column} AT TIME ZONE 'UTC'),
785
891
  'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"'
786
892
  )`;
787
893
  }
@@ -803,12 +909,12 @@ function advisoryLockKeyForUuid(uuid) {
803
909
  const FNV_OFFSET = 0xcbf29ce484222325n;
804
910
  const FNV_PRIME = 0x100000001b3n;
805
911
  const MASK_64 = 0xffffffffffffffffn;
806
- let hash2 = FNV_OFFSET;
912
+ let hash = FNV_OFFSET;
807
913
  for (let i = 0; i < uuid.length; i++) {
808
- hash2 ^= BigInt(uuid.charCodeAt(i));
809
- hash2 = hash2 * FNV_PRIME & MASK_64;
914
+ hash ^= BigInt(uuid.charCodeAt(i));
915
+ hash = hash * FNV_PRIME & MASK_64;
810
916
  }
811
- return hash2 > 0x7fffffffffffffffn ? hash2 - 0x10000000000000000n : hash2;
917
+ return hash > 0x7fffffffffffffffn ? hash - 0x10000000000000000n : hash;
812
918
  }
813
919
  async function executeRaw(db, query) {
814
920
  if (isSQLiteDatabase(db)) {
@@ -836,21 +942,36 @@ async function getOne(db, table, where) {
836
942
  }
837
943
  async function insertOne(db, table, values) {
838
944
  if (isSQLiteDatabase(db)) {
839
- const result = await db.insert(table).values(values).returning();
945
+ const result = await db.insert(table).values(withTenantInsertValues(values, table)).returning();
840
946
  return result;
841
947
  } else {
842
- const result = await db.insert(table).values(values).returning();
948
+ const result = await db.insert(table).values(withTenantInsertValues(values, table)).returning();
843
949
  return result[0];
844
950
  }
845
951
  }
846
- function wrapQuery(query, db) {
952
+ function tableHasTenantColumn(table) {
953
+ return Boolean(table && "tenant_id" in table);
954
+ }
955
+ function withTenantInsertValues(values, table) {
956
+ const tenantId = getCurrentTenantId();
957
+ if (!tenantId || !tableHasTenantColumn(table)) return values;
958
+ const stamp = (row) => {
959
+ if (!row || typeof row !== "object" || Array.isArray(row)) return row;
960
+ if ("tenant_id" in row) return row;
961
+ return { tenant_id: tenantId, ...row };
962
+ };
963
+ return Array.isArray(values) ? values.map(stamp) : stamp(values);
964
+ }
965
+ function wrapQuery(query, db, table) {
847
966
  return {
848
967
  ...query,
849
968
  one: async () => {
850
969
  if (isSQLiteDatabase(db)) {
851
970
  return await query.get();
852
971
  } else {
853
- const results = await query.limit(1);
972
+ const results = await query.limit(
973
+ 1
974
+ );
854
975
  return results[0] || null;
855
976
  }
856
977
  },
@@ -872,30 +993,55 @@ function wrapQuery(query, db) {
872
993
  return { rowsAffected: result.length || 0 };
873
994
  }
874
995
  },
875
- // biome-ignore lint/suspicious/noExplicitAny: Drizzle query builder types vary by dialect
876
996
  returning: () => wrapReturning(query.returning(), db),
877
997
  // Preserve chainable methods
878
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
879
- where: (...args) => wrapQuery(query.where(...args), db),
880
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
881
- limit: (...args) => wrapQuery(query.limit(...args), db),
882
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
883
- offset: (...args) => wrapQuery(query.offset(...args), db),
884
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
885
- orderBy: (...args) => wrapQuery(query.orderBy(...args), db),
886
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
887
- groupBy: (...args) => wrapQuery(query.groupBy(...args), db),
888
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
889
- set: (...args) => wrapQuery(query.set(...args), db),
890
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
891
- values: (...args) => wrapQuery(query.values(...args), db),
892
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
893
- innerJoin: (...args) => wrapQuery(query.innerJoin(...args), db),
894
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
895
- leftJoin: (...args) => wrapQuery(query.leftJoin(...args), db),
896
- onConflictDoNothing: (...args) => (
897
- // biome-ignore lint/suspicious/noExplicitAny: Drizzle exposes onConflictDoNothing on both dialects after .values()
898
- wrapQuery(query.onConflictDoNothing(...args), db)
998
+ where: (...args) => wrapQuery(
999
+ query.where(...args),
1000
+ db,
1001
+ table
1002
+ ),
1003
+ limit: (...args) => wrapQuery(
1004
+ query.limit(...args),
1005
+ db,
1006
+ table
1007
+ ),
1008
+ offset: (...args) => wrapQuery(
1009
+ query.offset(...args),
1010
+ db,
1011
+ table
1012
+ ),
1013
+ orderBy: (...args) => wrapQuery(
1014
+ query.orderBy(...args),
1015
+ db,
1016
+ table
1017
+ ),
1018
+ groupBy: (...args) => wrapQuery(
1019
+ query.groupBy(...args),
1020
+ db,
1021
+ table
1022
+ ),
1023
+ set: (...args) => wrapQuery(query.set(...args), db, table),
1024
+ values: (...args) => wrapQuery(
1025
+ query.values(
1026
+ ...args.map((arg) => withTenantInsertValues(arg, table))
1027
+ ),
1028
+ db,
1029
+ table
1030
+ ),
1031
+ innerJoin: (...args) => wrapQuery(
1032
+ query.innerJoin(...args),
1033
+ db,
1034
+ table
1035
+ ),
1036
+ leftJoin: (...args) => wrapQuery(
1037
+ query.leftJoin(...args),
1038
+ db,
1039
+ table
1040
+ ),
1041
+ onConflictDoNothing: (...args) => wrapQuery(
1042
+ query.onConflictDoNothing(...args),
1043
+ db,
1044
+ table
899
1045
  )
900
1046
  };
901
1047
  }
@@ -928,7 +1074,7 @@ function select(db, columns) {
928
1074
  }
929
1075
  function insert(db, table) {
930
1076
  const query = db.insert(table);
931
- return wrapQuery(query, db);
1077
+ return wrapQuery(query, db, table);
932
1078
  }
933
1079
  function update(db, table) {
934
1080
  const query = db.update(table);
@@ -968,6 +1114,7 @@ var init_database_wrapper = __esm({
968
1114
  "use strict";
969
1115
  init_cjs_shims();
970
1116
  import_drizzle_orm = require("drizzle-orm");
1117
+ init_tenant_context();
971
1118
  }
972
1119
  });
973
1120
 
@@ -1245,6 +1392,14 @@ var init_template = __esm({
1245
1392
  }
1246
1393
  });
1247
1394
 
1395
+ // src/types/tenant.ts
1396
+ var init_tenant = __esm({
1397
+ "src/types/tenant.ts"() {
1398
+ "use strict";
1399
+ init_cjs_shims();
1400
+ }
1401
+ });
1402
+
1248
1403
  // src/types/ui.ts
1249
1404
  var init_ui = __esm({
1250
1405
  "src/types/ui.ts"() {
@@ -1350,6 +1505,7 @@ var init_types2 = __esm({
1350
1505
  init_session();
1351
1506
  init_task();
1352
1507
  init_template();
1508
+ init_tenant();
1353
1509
  init_ui();
1354
1510
  init_user();
1355
1511
  init_utils();
@@ -1375,6 +1531,7 @@ __export(schema_postgres_exports, {
1375
1531
  cardTypes: () => cardTypes,
1376
1532
  cards: () => cards,
1377
1533
  gatewayChannels: () => gatewayChannels,
1534
+ gatewayOutboundMessages: () => gatewayOutboundMessages,
1378
1535
  groupMemberships: () => groupMemberships,
1379
1536
  groups: () => groups,
1380
1537
  kbDocumentUnits: () => kbDocumentUnits,
@@ -1403,7 +1560,7 @@ __export(schema_postgres_exports, {
1403
1560
  userMcpOauthTokens: () => userMcpOauthTokens,
1404
1561
  users: () => users
1405
1562
  });
1406
- var import_drizzle_orm2, import_pg_core, bytea, t, sessions, sessionRelationships, tasks, serializedSessions, messages, boards, repos, branches, branchOwners, boardOwners, schedules, users, groups, groupMemberships, branchGroupGrants, boardGroupGrants, appVariables, userApiKeys, mcpServers, cardTypes, cards, artifacts, artifactTrustGrants, boardObjects, sessionMcpServers, userMcpOauthTokens, boardComments, gatewayChannels, threadSessionMap, sessionEnvSelections, kbNamespaces, kbNamespaceAcl, kbDocuments, kbDocumentVersions, kbDocumentUnits, kbEmbeddingSpaces, kbGraphNodes, kbGraphEdges, sessionsRelations, sessionRelationshipsRelations, branchesRelations, schedulesRelations;
1563
+ var import_drizzle_orm2, import_pg_core, bytea, t, sessions, sessionRelationships, tasks, serializedSessions, messages, boards, repos, branches, branchOwners, boardOwners, schedules, users, groups, groupMemberships, branchGroupGrants, boardGroupGrants, appVariables, userApiKeys, mcpServers, cardTypes, cards, artifacts, artifactTrustGrants, boardObjects, sessionMcpServers, userMcpOauthTokens, boardComments, gatewayChannels, threadSessionMap, gatewayOutboundMessages, sessionEnvSelections, kbNamespaces, kbNamespaceAcl, kbDocuments, kbDocumentVersions, kbDocumentUnits, kbEmbeddingSpaces, kbGraphNodes, kbGraphEdges, sessionsRelations, sessionRelationshipsRelations, branchesRelations, schedulesRelations;
1407
1564
  var init_schema_postgres = __esm({
1408
1565
  "src/db/schema.postgres.ts"() {
1409
1566
  "use strict";
@@ -1424,6 +1581,7 @@ var init_schema_postgres = __esm({
1424
1581
  sessions = (0, import_pg_core.pgTable)(
1425
1582
  "sessions",
1426
1583
  {
1584
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1427
1585
  // Primary identity
1428
1586
  session_id: (0, import_pg_core.varchar)("session_id", { length: 36 }).primaryKey(),
1429
1587
  created_at: t.timestamp("created_at").notNull(),
@@ -1483,7 +1641,9 @@ var init_schema_postgres = __esm({
1483
1641
  data: t.json("data").$type().notNull()
1484
1642
  },
1485
1643
  (table) => ({
1644
+ tenantIdx: (0, import_pg_core.index)("sessions_tenant_id_idx").on(table.tenant_id),
1486
1645
  statusIdx: (0, import_pg_core.index)("sessions_status_idx").on(table.status),
1646
+ statusReadyIdx: (0, import_pg_core.index)("sessions_status_ready_idx").on(table.status, table.ready_for_prompt),
1487
1647
  agenticToolIdx: (0, import_pg_core.index)("sessions_agentic_tool_idx").on(table.agentic_tool),
1488
1648
  boardIdx: (0, import_pg_core.index)("sessions_board_idx").on(table.board_id),
1489
1649
  branchIdx: (0, import_pg_core.index)("sessions_branch_idx").on(table.branch_id),
@@ -1495,12 +1655,13 @@ var init_schema_postgres = __esm({
1495
1655
  // Partial unique index — covering for the scheduler's dedup lookup
1496
1656
  // AND serves as the DB-level guard against check-then-create races
1497
1657
  // in spawnScheduledSession.
1498
- scheduleRunUnique: (0, import_pg_core.uniqueIndex)("sessions_schedule_run_unique").on(table.schedule_id, table.scheduled_run_at).where(import_drizzle_orm2.sql`${table.schedule_id} IS NOT NULL AND ${table.scheduled_run_at} IS NOT NULL`)
1658
+ scheduleRunUnique: (0, import_pg_core.uniqueIndex)("sessions_schedule_run_unique").on(table.tenant_id, table.schedule_id, table.scheduled_run_at).where(import_drizzle_orm2.sql`${table.schedule_id} IS NOT NULL AND ${table.scheduled_run_at} IS NOT NULL`)
1499
1659
  })
1500
1660
  );
1501
1661
  sessionRelationships = (0, import_pg_core.pgTable)(
1502
1662
  "session_relationships",
1503
1663
  {
1664
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1504
1665
  relationship_id: (0, import_pg_core.varchar)("relationship_id", { length: 36 }).primaryKey(),
1505
1666
  source_session_id: (0, import_pg_core.varchar)("source_session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
1506
1667
  target_session_id: (0, import_pg_core.varchar)("target_session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
@@ -1518,10 +1679,23 @@ var init_schema_postgres = __esm({
1518
1679
  data: t.json("data")
1519
1680
  },
1520
1681
  (table) => ({
1682
+ tenantIdx: (0, import_pg_core.index)("session_relationships_tenant_id_idx").on(table.tenant_id),
1521
1683
  sourceIdx: (0, import_pg_core.index)("session_relationships_source_idx").on(table.source_session_id),
1522
1684
  targetIdx: (0, import_pg_core.index)("session_relationships_target_idx").on(table.target_session_id),
1523
1685
  callbackIdx: (0, import_pg_core.index)("session_relationships_callback_idx").on(table.callback_session_id),
1686
+ // Composite indexes so the OR predicate in dispatchCompletionCallbacks
1687
+ // (WHERE source_session_id = $1 OR target_session_id = $2) uses BitmapOr
1688
+ // over these instead of a full tenant table scan via tenant_id_idx.
1689
+ tenantSourceIdx: (0, import_pg_core.index)("session_relationships_tenant_source_idx").on(
1690
+ table.tenant_id,
1691
+ table.source_session_id
1692
+ ),
1693
+ tenantTargetIdx: (0, import_pg_core.index)("session_relationships_tenant_target_idx").on(
1694
+ table.tenant_id,
1695
+ table.target_session_id
1696
+ ),
1524
1697
  sourceTargetTypeUnique: (0, import_pg_core.uniqueIndex)("session_relationships_source_target_type_unique").on(
1698
+ table.tenant_id,
1525
1699
  table.source_session_id,
1526
1700
  table.target_session_id,
1527
1701
  table.relationship_type
@@ -1531,6 +1705,7 @@ var init_schema_postgres = __esm({
1531
1705
  tasks = (0, import_pg_core.pgTable)(
1532
1706
  "tasks",
1533
1707
  {
1708
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1534
1709
  task_id: (0, import_pg_core.varchar)("task_id", { length: 36 }).primaryKey(),
1535
1710
  session_id: (0, import_pg_core.varchar)("session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
1536
1711
  created_at: t.timestamp("created_at").notNull(),
@@ -1560,19 +1735,23 @@ var init_schema_postgres = __esm({
1560
1735
  data: t.json("data").$type().notNull()
1561
1736
  },
1562
1737
  (table) => ({
1738
+ tenantIdx: (0, import_pg_core.index)("tasks_tenant_id_idx").on(table.tenant_id),
1563
1739
  sessionIdx: (0, import_pg_core.index)("tasks_session_idx").on(table.session_id),
1564
1740
  statusIdx: (0, import_pg_core.index)("tasks_status_idx").on(table.status),
1565
1741
  createdIdx: (0, import_pg_core.index)("tasks_created_idx").on(table.created_at),
1742
+ // Composite for "latest task for session" queries (ORDER BY created_at DESC LIMIT 1).
1743
+ sessionCreatedIdx: (0, import_pg_core.index)("tasks_session_created_idx").on(table.session_id, table.created_at),
1566
1744
  queueIdx: (0, import_pg_core.index)("tasks_queue_idx").on(table.session_id, table.status, table.queue_position),
1567
1745
  // Partial unique index — defense-in-depth for `tasks.createPending` race
1568
1746
  // serialization. Only QUEUED rows are constrained; CREATED/RUNNING/done
1569
1747
  // rows have NULL queue_position and are unaffected.
1570
- queuedPositionUnique: (0, import_pg_core.uniqueIndex)("tasks_queued_position_unique").on(table.session_id, table.queue_position).where(import_drizzle_orm2.sql`${table.status} = 'queued'`)
1748
+ queuedPositionUnique: (0, import_pg_core.uniqueIndex)("tasks_queued_position_unique").on(table.tenant_id, table.session_id, table.queue_position).where(import_drizzle_orm2.sql`${table.status} = 'queued'`)
1571
1749
  })
1572
1750
  );
1573
1751
  serializedSessions = (0, import_pg_core.pgTable)(
1574
1752
  "serialized_sessions",
1575
1753
  {
1754
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1576
1755
  id: (0, import_pg_core.varchar)("id", { length: 36 }).primaryKey(),
1577
1756
  session_id: (0, import_pg_core.varchar)("session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
1578
1757
  branch_id: (0, import_pg_core.varchar)("branch_id", { length: 36 }).notNull().references(() => branches.branch_id, { onDelete: "cascade" }),
@@ -1588,6 +1767,7 @@ var init_schema_postgres = __esm({
1588
1767
  // gzipped; NULL while status='processing'
1589
1768
  },
1590
1769
  (table) => ({
1770
+ tenantIdx: (0, import_pg_core.index)("serialized_sessions_tenant_id_idx").on(table.tenant_id),
1591
1771
  sessionTurnIdx: (0, import_pg_core.index)("serialized_sessions_session_turn_idx").on(
1592
1772
  table.session_id,
1593
1773
  table.turn_index
@@ -1598,6 +1778,7 @@ var init_schema_postgres = __esm({
1598
1778
  messages = (0, import_pg_core.pgTable)(
1599
1779
  "messages",
1600
1780
  {
1781
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1601
1782
  // Primary identity
1602
1783
  message_id: (0, import_pg_core.varchar)("message_id", { length: 36 }).primaryKey(),
1603
1784
  created_at: t.timestamp("created_at").notNull(),
@@ -1637,15 +1818,23 @@ var init_schema_postgres = __esm({
1637
1818
  data: t.json("data").$type().notNull()
1638
1819
  },
1639
1820
  (table) => ({
1821
+ tenantIdx: (0, import_pg_core.index)("messages_tenant_id_idx").on(table.tenant_id),
1822
+ tenantTimestampIdx: (0, import_pg_core.index)("messages_tenant_timestamp_idx").on(table.tenant_id, table.timestamp),
1640
1823
  // Indexes for efficient lookups
1641
1824
  sessionIdx: (0, import_pg_core.index)("messages_session_id_idx").on(table.session_id),
1642
1825
  taskIdx: (0, import_pg_core.index)("messages_task_id_idx").on(table.task_id),
1643
- sessionIndexIdx: (0, import_pg_core.index)("messages_session_index_idx").on(table.session_id, table.index)
1826
+ sessionIndexIdx: (0, import_pg_core.index)("messages_session_index_idx").on(table.session_id, table.index),
1827
+ timestampIdx: (0, import_pg_core.index)("messages_timestamp_idx").on(table.timestamp),
1828
+ sessionTimestampIdx: (0, import_pg_core.index)("messages_session_timestamp_idx").on(
1829
+ table.session_id,
1830
+ table.timestamp
1831
+ )
1644
1832
  })
1645
1833
  );
1646
1834
  boards = (0, import_pg_core.pgTable)(
1647
1835
  "boards",
1648
1836
  {
1837
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1649
1838
  board_id: (0, import_pg_core.varchar)("board_id", { length: 36 }).primaryKey(),
1650
1839
  created_at: t.timestamp("created_at").notNull(),
1651
1840
  updated_at: t.timestamp("updated_at"),
@@ -1653,7 +1842,7 @@ var init_schema_postgres = __esm({
1653
1842
  created_by: (0, import_pg_core.varchar)("created_by", { length: 36 }).notNull(),
1654
1843
  // Materialized for lookups
1655
1844
  name: (0, import_pg_core.text)("name").notNull(),
1656
- slug: (0, import_pg_core.text)("slug").unique(),
1845
+ slug: (0, import_pg_core.text)("slug"),
1657
1846
  primary_assistant_id: (0, import_pg_core.varchar)("primary_assistant_id", { length: 36 }).references(
1658
1847
  () => branches.branch_id,
1659
1848
  {
@@ -1668,18 +1857,21 @@ var init_schema_postgres = __esm({
1668
1857
  archived_by: (0, import_pg_core.varchar)("archived_by", { length: 36 })
1669
1858
  },
1670
1859
  (table) => ({
1860
+ tenantIdx: (0, import_pg_core.index)("boards_tenant_id_idx").on(table.tenant_id),
1671
1861
  nameIdx: (0, import_pg_core.index)("boards_name_idx").on(table.name),
1672
- slugIdx: (0, import_pg_core.index)("boards_slug_idx").on(table.slug)
1862
+ slugIdx: (0, import_pg_core.index)("boards_slug_idx").on(table.slug),
1863
+ slugTenantUnique: (0, import_pg_core.uniqueIndex)("boards_tenant_slug_unique").on(table.tenant_id, table.slug)
1673
1864
  })
1674
1865
  );
1675
1866
  repos = (0, import_pg_core.pgTable)(
1676
1867
  "repos",
1677
1868
  {
1869
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1678
1870
  repo_id: (0, import_pg_core.varchar)("repo_id", { length: 36 }).primaryKey(),
1679
1871
  created_at: t.timestamp("created_at").notNull(),
1680
1872
  updated_at: t.timestamp("updated_at"),
1681
1873
  // Materialized for querying
1682
- slug: (0, import_pg_core.text)("slug").notNull().unique(),
1874
+ slug: (0, import_pg_core.text)("slug").notNull(),
1683
1875
  repo_type: (0, import_pg_core.text)("repo_type", { enum: ["remote", "local"] }).notNull().default("remote"),
1684
1876
  // Unix group for repo-level git access (agor_rp_<short-id>)
1685
1877
  // Users who have access to ANY branch in this repo get added to this group.
@@ -1690,12 +1882,15 @@ var init_schema_postgres = __esm({
1690
1882
  data: t.json("data").$type().notNull()
1691
1883
  },
1692
1884
  (table) => ({
1693
- slugIdx: (0, import_pg_core.index)("repos_slug_idx").on(table.slug)
1885
+ tenantIdx: (0, import_pg_core.index)("repos_tenant_id_idx").on(table.tenant_id),
1886
+ slugIdx: (0, import_pg_core.index)("repos_slug_idx").on(table.slug),
1887
+ slugTenantUnique: (0, import_pg_core.uniqueIndex)("repos_tenant_slug_unique").on(table.tenant_id, table.slug)
1694
1888
  })
1695
1889
  );
1696
1890
  branches = (0, import_pg_core.pgTable)(
1697
1891
  "branches",
1698
1892
  {
1893
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1699
1894
  // Primary identity
1700
1895
  branch_id: (0, import_pg_core.varchar)("branch_id", { length: 36 }).primaryKey(),
1701
1896
  repo_id: (0, import_pg_core.varchar)("repo_id", { length: 36 }).notNull().references(() => repos.repo_id, { onDelete: "cascade" }),
@@ -1770,6 +1965,7 @@ var init_schema_postgres = __esm({
1770
1965
  data: t.json("data").$type().notNull()
1771
1966
  },
1772
1967
  (table) => ({
1968
+ tenantIdx: (0, import_pg_core.index)("branches_tenant_id_idx").on(table.tenant_id),
1773
1969
  repoIdx: (0, import_pg_core.index)("branches_repo_idx").on(table.repo_id),
1774
1970
  nameIdx: (0, import_pg_core.index)("branches_name_idx").on(table.name),
1775
1971
  refIdx: (0, import_pg_core.index)("branches_ref_idx").on(table.ref),
@@ -1783,22 +1979,26 @@ var init_schema_postgres = __esm({
1783
1979
  branchOwners = (0, import_pg_core.pgTable)(
1784
1980
  "branch_owners",
1785
1981
  {
1982
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1786
1983
  branch_id: (0, import_pg_core.varchar)("branch_id", { length: 36 }).notNull().references(() => branches.branch_id, { onDelete: "cascade" }),
1787
1984
  user_id: (0, import_pg_core.varchar)("user_id", { length: 36 }).notNull().references(() => users.user_id, { onDelete: "cascade" }),
1788
1985
  created_at: t.timestamp("created_at").defaultNow()
1789
1986
  },
1790
1987
  (table) => ({
1988
+ tenantIdx: (0, import_pg_core.index)("branch_owners_tenant_id_idx").on(table.tenant_id),
1791
1989
  pk: (0, import_pg_core.primaryKey)({ columns: [table.branch_id, table.user_id] })
1792
1990
  })
1793
1991
  );
1794
1992
  boardOwners = (0, import_pg_core.pgTable)(
1795
1993
  "board_owners",
1796
1994
  {
1995
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1797
1996
  board_id: (0, import_pg_core.varchar)("board_id", { length: 36 }).notNull().references(() => boards.board_id, { onDelete: "cascade" }),
1798
1997
  user_id: (0, import_pg_core.varchar)("user_id", { length: 36 }).notNull().references(() => users.user_id, { onDelete: "cascade" }),
1799
1998
  created_at: t.timestamp("created_at")
1800
1999
  },
1801
2000
  (table) => ({
2001
+ tenantIdx: (0, import_pg_core.index)("board_owners_tenant_id_idx").on(table.tenant_id),
1802
2002
  pk: (0, import_pg_core.primaryKey)({ columns: [table.board_id, table.user_id] }),
1803
2003
  userIdx: (0, import_pg_core.index)("board_owners_user_idx").on(table.user_id)
1804
2004
  })
@@ -1806,6 +2006,7 @@ var init_schema_postgres = __esm({
1806
2006
  schedules = (0, import_pg_core.pgTable)(
1807
2007
  "schedules",
1808
2008
  {
2009
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1809
2010
  schedule_id: (0, import_pg_core.varchar)("schedule_id", { length: 36 }).primaryKey(),
1810
2011
  branch_id: (0, import_pg_core.varchar)("branch_id", { length: 36 }).notNull().references(() => branches.branch_id, { onDelete: "cascade" }),
1811
2012
  name: (0, import_pg_core.text)("name").notNull(),
@@ -1829,6 +2030,7 @@ var init_schema_postgres = __esm({
1829
2030
  created_by: (0, import_pg_core.varchar)("created_by", { length: 36 }).notNull().references(() => users.user_id)
1830
2031
  },
1831
2032
  (table) => ({
2033
+ tenantIdx: (0, import_pg_core.index)("schedules_tenant_id_idx").on(table.tenant_id),
1832
2034
  enabledNextRunIdx: (0, import_pg_core.index)("schedules_enabled_next_run_idx").on(table.enabled, table.next_run_at),
1833
2035
  branchIdx: (0, import_pg_core.index)("schedules_branch_idx").on(table.branch_id),
1834
2036
  createdByIdx: (0, import_pg_core.index)("schedules_created_by_idx").on(table.created_by)
@@ -1837,12 +2039,13 @@ var init_schema_postgres = __esm({
1837
2039
  users = (0, import_pg_core.pgTable)(
1838
2040
  "users",
1839
2041
  {
2042
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1840
2043
  // Primary identity
1841
2044
  user_id: (0, import_pg_core.varchar)("user_id", { length: 36 }).primaryKey(),
1842
2045
  created_at: t.timestamp("created_at").notNull(),
1843
2046
  updated_at: t.timestamp("updated_at"),
1844
2047
  // Materialized for auth lookups
1845
- email: (0, import_pg_core.text)("email").unique().notNull(),
2048
+ email: (0, import_pg_core.text)("email").notNull(),
1846
2049
  password: (0, import_pg_core.text)("password").notNull(),
1847
2050
  // bcrypt hashed
1848
2051
  // Basic profile (materialized for display)
@@ -1858,16 +2061,22 @@ var init_schema_postgres = __esm({
1858
2061
  onboarding_completed: t.bool("onboarding_completed").notNull().default(false),
1859
2062
  // Force password change flag (admin-settable, auto-cleared on password change)
1860
2063
  must_change_password: t.bool("must_change_password").notNull().default(false),
2064
+ // Auth invalidation marker. Password changes set this timestamp so any
2065
+ // previously issued browser access or refresh token is rejected.
2066
+ tokens_valid_after: t.timestamp("tokens_valid_after"),
1861
2067
  // JSON blob for profile/preferences
1862
2068
  data: t.json("data").$type().notNull()
1863
2069
  },
1864
2070
  (table) => ({
1865
- emailIdx: (0, import_pg_core.index)("users_email_idx").on(table.email)
2071
+ tenantIdx: (0, import_pg_core.index)("users_tenant_id_idx").on(table.tenant_id),
2072
+ emailIdx: (0, import_pg_core.index)("users_email_idx").on(table.email),
2073
+ emailTenantUnique: (0, import_pg_core.uniqueIndex)("users_tenant_email_unique").on(table.tenant_id, table.email)
1866
2074
  })
1867
2075
  );
1868
2076
  groups = (0, import_pg_core.pgTable)(
1869
2077
  "groups",
1870
2078
  {
2079
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1871
2080
  group_id: (0, import_pg_core.varchar)("group_id", { length: 36 }).primaryKey(),
1872
2081
  name: (0, import_pg_core.text)("name").notNull(),
1873
2082
  slug: (0, import_pg_core.text)("slug").notNull(),
@@ -1880,13 +2089,15 @@ var init_schema_postgres = __esm({
1880
2089
  updated_at: t.timestamp("updated_at")
1881
2090
  },
1882
2091
  (table) => ({
1883
- slugIdx: (0, import_pg_core.uniqueIndex)("groups_slug_idx").on(table.slug),
2092
+ tenantIdx: (0, import_pg_core.index)("groups_tenant_id_idx").on(table.tenant_id),
2093
+ slugIdx: (0, import_pg_core.uniqueIndex)("groups_tenant_slug_unique").on(table.tenant_id, table.slug),
1884
2094
  archivedIdx: (0, import_pg_core.index)("groups_archived_idx").on(table.archived)
1885
2095
  })
1886
2096
  );
1887
2097
  groupMemberships = (0, import_pg_core.pgTable)(
1888
2098
  "group_memberships",
1889
2099
  {
2100
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1890
2101
  group_id: (0, import_pg_core.varchar)("group_id", { length: 36 }).notNull().references(() => groups.group_id, { onDelete: "cascade" }),
1891
2102
  user_id: (0, import_pg_core.varchar)("user_id", { length: 36 }).notNull().references(() => users.user_id, { onDelete: "cascade" }),
1892
2103
  added_by: (0, import_pg_core.varchar)("added_by", { length: 36 }).references(() => users.user_id, {
@@ -1895,6 +2106,7 @@ var init_schema_postgres = __esm({
1895
2106
  created_at: t.timestamp("created_at").notNull()
1896
2107
  },
1897
2108
  (table) => ({
2109
+ tenantIdx: (0, import_pg_core.index)("group_memberships_tenant_id_idx").on(table.tenant_id),
1898
2110
  pk: (0, import_pg_core.primaryKey)({ columns: [table.group_id, table.user_id] }),
1899
2111
  userIdx: (0, import_pg_core.index)("group_memberships_user_idx").on(table.user_id)
1900
2112
  })
@@ -1902,6 +2114,7 @@ var init_schema_postgres = __esm({
1902
2114
  branchGroupGrants = (0, import_pg_core.pgTable)(
1903
2115
  "branch_group_grants",
1904
2116
  {
2117
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1905
2118
  branch_id: (0, import_pg_core.varchar)("branch_id", { length: 36 }).notNull().references(() => branches.branch_id, { onDelete: "cascade" }),
1906
2119
  group_id: (0, import_pg_core.varchar)("group_id", { length: 36 }).notNull().references(() => groups.group_id, { onDelete: "cascade" }),
1907
2120
  can: (0, import_pg_core.text)("can", { enum: [...BRANCH_PERMISSION_LEVELS] }).notNull().default("view"),
@@ -1913,6 +2126,7 @@ var init_schema_postgres = __esm({
1913
2126
  updated_at: t.timestamp("updated_at")
1914
2127
  },
1915
2128
  (table) => ({
2129
+ tenantIdx: (0, import_pg_core.index)("branch_group_grants_tenant_id_idx").on(table.tenant_id),
1916
2130
  pk: (0, import_pg_core.primaryKey)({ columns: [table.branch_id, table.group_id] }),
1917
2131
  groupIdx: (0, import_pg_core.index)("branch_group_grants_group_idx").on(table.group_id)
1918
2132
  })
@@ -1920,6 +2134,7 @@ var init_schema_postgres = __esm({
1920
2134
  boardGroupGrants = (0, import_pg_core.pgTable)(
1921
2135
  "board_group_grants",
1922
2136
  {
2137
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1923
2138
  board_id: (0, import_pg_core.varchar)("board_id", { length: 36 }).notNull().references(() => boards.board_id, { onDelete: "cascade" }),
1924
2139
  group_id: (0, import_pg_core.varchar)("group_id", { length: 36 }).notNull().references(() => groups.group_id, { onDelete: "cascade" }),
1925
2140
  can: (0, import_pg_core.text)("can", { enum: [...BRANCH_PERMISSION_LEVELS] }).notNull().default("view"),
@@ -1931,6 +2146,7 @@ var init_schema_postgres = __esm({
1931
2146
  updated_at: t.timestamp("updated_at")
1932
2147
  },
1933
2148
  (table) => ({
2149
+ tenantIdx: (0, import_pg_core.index)("board_group_grants_tenant_id_idx").on(table.tenant_id),
1934
2150
  pk: (0, import_pg_core.primaryKey)({ columns: [table.board_id, table.group_id] }),
1935
2151
  groupIdx: (0, import_pg_core.index)("board_group_grants_group_idx").on(table.group_id)
1936
2152
  })
@@ -1938,6 +2154,7 @@ var init_schema_postgres = __esm({
1938
2154
  appVariables = (0, import_pg_core.pgTable)(
1939
2155
  "app_variables",
1940
2156
  {
2157
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1941
2158
  variable_id: (0, import_pg_core.varchar)("variable_id", { length: 36 }).primaryKey(),
1942
2159
  namespace: (0, import_pg_core.text)("namespace").notNull(),
1943
2160
  key: (0, import_pg_core.text)("key").notNull(),
@@ -1953,13 +2170,19 @@ var init_schema_postgres = __esm({
1953
2170
  updated_at: t.timestamp("updated_at").notNull()
1954
2171
  },
1955
2172
  (table) => ({
1956
- namespaceKeyIdx: (0, import_pg_core.uniqueIndex)("app_variables_namespace_key_idx").on(table.namespace, table.key),
2173
+ tenantIdx: (0, import_pg_core.index)("app_variables_tenant_id_idx").on(table.tenant_id),
2174
+ namespaceKeyIdx: (0, import_pg_core.uniqueIndex)("app_variables_tenant_namespace_key_unique").on(
2175
+ table.tenant_id,
2176
+ table.namespace,
2177
+ table.key
2178
+ ),
1957
2179
  namespaceIdx: (0, import_pg_core.index)("app_variables_namespace_idx").on(table.namespace)
1958
2180
  })
1959
2181
  );
1960
2182
  userApiKeys = (0, import_pg_core.pgTable)(
1961
2183
  "user_api_keys",
1962
2184
  {
2185
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1963
2186
  id: (0, import_pg_core.varchar)("id", { length: 36 }).primaryKey(),
1964
2187
  user_id: (0, import_pg_core.varchar)("user_id", { length: 36 }).notNull().references(() => users.user_id, { onDelete: "cascade" }),
1965
2188
  name: (0, import_pg_core.text)("name").notNull(),
@@ -1971,6 +2194,7 @@ var init_schema_postgres = __esm({
1971
2194
  last_used_at: t.timestamp("last_used_at")
1972
2195
  },
1973
2196
  (table) => ({
2197
+ tenantIdx: (0, import_pg_core.index)("user_api_keys_tenant_id_idx").on(table.tenant_id),
1974
2198
  userIdx: (0, import_pg_core.index)("user_api_keys_user_idx").on(table.user_id),
1975
2199
  prefixIdx: (0, import_pg_core.index)("user_api_keys_prefix_idx").on(table.prefix)
1976
2200
  })
@@ -1978,6 +2202,7 @@ var init_schema_postgres = __esm({
1978
2202
  mcpServers = (0, import_pg_core.pgTable)(
1979
2203
  "mcp_servers",
1980
2204
  {
2205
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
1981
2206
  // Primary identity
1982
2207
  mcp_server_id: (0, import_pg_core.varchar)("mcp_server_id", { length: 36 }).primaryKey(),
1983
2208
  created_at: t.timestamp("created_at").notNull(),
@@ -2004,6 +2229,7 @@ var init_schema_postgres = __esm({
2004
2229
  data: t.json("data").$type().notNull()
2005
2230
  },
2006
2231
  (table) => ({
2232
+ tenantIdx: (0, import_pg_core.index)("mcp_servers_tenant_id_idx").on(table.tenant_id),
2007
2233
  nameIdx: (0, import_pg_core.index)("mcp_servers_name_idx").on(table.name),
2008
2234
  scopeIdx: (0, import_pg_core.index)("mcp_servers_scope_idx").on(table.scope),
2009
2235
  ownerIdx: (0, import_pg_core.index)("mcp_servers_owner_idx").on(table.owner_user_id),
@@ -2013,6 +2239,7 @@ var init_schema_postgres = __esm({
2013
2239
  cardTypes = (0, import_pg_core.pgTable)(
2014
2240
  "card_types",
2015
2241
  {
2242
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2016
2243
  card_type_id: (0, import_pg_core.varchar)("card_type_id", { length: 36 }).primaryKey(),
2017
2244
  name: (0, import_pg_core.text)("name").notNull(),
2018
2245
  emoji: (0, import_pg_core.text)("emoji"),
@@ -2024,12 +2251,14 @@ var init_schema_postgres = __esm({
2024
2251
  updated_at: t.timestamp("updated_at").notNull()
2025
2252
  },
2026
2253
  (table) => ({
2254
+ tenantIdx: (0, import_pg_core.index)("card_types_tenant_id_idx").on(table.tenant_id),
2027
2255
  nameIdx: (0, import_pg_core.index)("card_types_name_idx").on(table.name)
2028
2256
  })
2029
2257
  );
2030
2258
  cards = (0, import_pg_core.pgTable)(
2031
2259
  "cards",
2032
2260
  {
2261
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2033
2262
  card_id: (0, import_pg_core.varchar)("card_id", { length: 36 }).primaryKey(),
2034
2263
  board_id: (0, import_pg_core.varchar)("board_id", { length: 36 }).notNull().references(() => boards.board_id, { onDelete: "cascade" }),
2035
2264
  card_type_id: (0, import_pg_core.varchar)("card_type_id", { length: 36 }).references(() => cardTypes.card_type_id, {
@@ -2050,6 +2279,7 @@ var init_schema_postgres = __esm({
2050
2279
  archived_at: t.timestamp("archived_at")
2051
2280
  },
2052
2281
  (table) => ({
2282
+ tenantIdx: (0, import_pg_core.index)("cards_tenant_id_idx").on(table.tenant_id),
2053
2283
  boardIdx: (0, import_pg_core.index)("cards_board_idx").on(table.board_id),
2054
2284
  cardTypeIdx: (0, import_pg_core.index)("cards_card_type_idx").on(table.card_type_id),
2055
2285
  titleIdx: (0, import_pg_core.index)("cards_title_idx").on(table.title),
@@ -2060,6 +2290,7 @@ var init_schema_postgres = __esm({
2060
2290
  artifacts = (0, import_pg_core.pgTable)(
2061
2291
  "artifacts",
2062
2292
  {
2293
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2063
2294
  artifact_id: (0, import_pg_core.varchar)("artifact_id", { length: 36 }).primaryKey(),
2064
2295
  branch_id: (0, import_pg_core.varchar)("branch_id", { length: 36 }).references(() => branches.branch_id, {
2065
2296
  onDelete: "set null"
@@ -2095,6 +2326,7 @@ var init_schema_postgres = __esm({
2095
2326
  archived_at: t.timestamp("archived_at")
2096
2327
  },
2097
2328
  (table) => ({
2329
+ tenantIdx: (0, import_pg_core.index)("artifacts_tenant_id_idx").on(table.tenant_id),
2098
2330
  branchIdx: (0, import_pg_core.index)("artifacts_branch_idx").on(table.branch_id),
2099
2331
  sourceSessionIdx: (0, import_pg_core.index)("artifacts_source_session_idx").on(table.source_session_id),
2100
2332
  boardIdx: (0, import_pg_core.index)("artifacts_board_idx").on(table.board_id),
@@ -2105,6 +2337,7 @@ var init_schema_postgres = __esm({
2105
2337
  artifactTrustGrants = (0, import_pg_core.pgTable)(
2106
2338
  "artifact_trust_grants",
2107
2339
  {
2340
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2108
2341
  grant_id: (0, import_pg_core.varchar)("grant_id", { length: 36 }).primaryKey(),
2109
2342
  user_id: (0, import_pg_core.varchar)("user_id", { length: 36 }).notNull(),
2110
2343
  scope_type: (0, import_pg_core.text)("scope_type").notNull(),
@@ -2115,6 +2348,7 @@ var init_schema_postgres = __esm({
2115
2348
  revoked_at: t.timestamp("revoked_at")
2116
2349
  },
2117
2350
  (table) => ({
2351
+ tenantIdx: (0, import_pg_core.index)("artifact_trust_grants_tenant_id_idx").on(table.tenant_id),
2118
2352
  userIdx: (0, import_pg_core.index)("artifact_trust_grants_user_idx").on(table.user_id),
2119
2353
  scopeIdx: (0, import_pg_core.index)("artifact_trust_grants_scope_idx").on(table.scope_type, table.scope_value)
2120
2354
  })
@@ -2122,6 +2356,7 @@ var init_schema_postgres = __esm({
2122
2356
  boardObjects = (0, import_pg_core.pgTable)(
2123
2357
  "board_objects",
2124
2358
  {
2359
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2125
2360
  // Primary identity
2126
2361
  object_id: (0, import_pg_core.varchar)("object_id", { length: 36 }).primaryKey(),
2127
2362
  board_id: (0, import_pg_core.varchar)("board_id", { length: 36 }).notNull().references(() => boards.board_id, { onDelete: "cascade" }),
@@ -2137,6 +2372,7 @@ var init_schema_postgres = __esm({
2137
2372
  data: t.json("data").$type().notNull()
2138
2373
  },
2139
2374
  (table) => ({
2375
+ tenantIdx: (0, import_pg_core.index)("board_objects_tenant_id_idx").on(table.tenant_id),
2140
2376
  boardIdx: (0, import_pg_core.index)("board_objects_board_idx").on(table.board_id),
2141
2377
  branchIdx: (0, import_pg_core.index)("board_objects_branch_idx").on(table.branch_id),
2142
2378
  cardIdx: (0, import_pg_core.index)("board_objects_card_idx").on(table.card_id)
@@ -2145,12 +2381,14 @@ var init_schema_postgres = __esm({
2145
2381
  sessionMcpServers = (0, import_pg_core.pgTable)(
2146
2382
  "session_mcp_servers",
2147
2383
  {
2384
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2148
2385
  session_id: (0, import_pg_core.varchar)("session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
2149
2386
  mcp_server_id: (0, import_pg_core.varchar)("mcp_server_id", { length: 36 }).notNull().references(() => mcpServers.mcp_server_id, { onDelete: "cascade" }),
2150
2387
  enabled: t.bool("enabled").notNull().default(true),
2151
2388
  added_at: t.timestamp("added_at").notNull()
2152
2389
  },
2153
2390
  (table) => ({
2391
+ tenantIdx: (0, import_pg_core.index)("session_mcp_servers_tenant_id_idx").on(table.tenant_id),
2154
2392
  // Composite primary key
2155
2393
  pk: (0, import_pg_core.index)("session_mcp_servers_pk").on(table.session_id, table.mcp_server_id),
2156
2394
  // Indexes for queries
@@ -2162,6 +2400,7 @@ var init_schema_postgres = __esm({
2162
2400
  userMcpOauthTokens = (0, import_pg_core.pgTable)(
2163
2401
  "user_mcp_oauth_tokens",
2164
2402
  {
2403
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2165
2404
  // NULL = shared-mode token (one per mcp_server_id)
2166
2405
  user_id: (0, import_pg_core.varchar)("user_id", { length: 36 }).references(() => users.user_id, {
2167
2406
  onDelete: "cascade"
@@ -2179,6 +2418,7 @@ var init_schema_postgres = __esm({
2179
2418
  updated_at: t.timestamp("updated_at")
2180
2419
  },
2181
2420
  (table) => ({
2421
+ tenantIdx: (0, import_pg_core.index)("user_mcp_oauth_tokens_tenant_id_idx").on(table.tenant_id),
2182
2422
  // Composite lookup indexes. Uniqueness enforced via partial unique indexes
2183
2423
  // created in the migration (one for per-user rows, one for the shared row).
2184
2424
  pk: (0, import_pg_core.index)("user_mcp_oauth_tokens_pk").on(table.user_id, table.mcp_server_id),
@@ -2189,6 +2429,7 @@ var init_schema_postgres = __esm({
2189
2429
  boardComments = (0, import_pg_core.pgTable)(
2190
2430
  "board_comments",
2191
2431
  {
2432
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2192
2433
  // Primary identity
2193
2434
  comment_id: (0, import_pg_core.varchar)("comment_id", { length: 36 }).primaryKey(),
2194
2435
  created_at: t.timestamp("created_at").notNull(),
@@ -2230,6 +2471,7 @@ var init_schema_postgres = __esm({
2230
2471
  data: t.json("data").$type().notNull()
2231
2472
  },
2232
2473
  (table) => ({
2474
+ tenantIdx: (0, import_pg_core.index)("board_comments_tenant_id_idx").on(table.tenant_id),
2233
2475
  boardIdx: (0, import_pg_core.index)("board_comments_board_idx").on(table.board_id),
2234
2476
  sessionIdx: (0, import_pg_core.index)("board_comments_session_idx").on(table.session_id),
2235
2477
  taskIdx: (0, import_pg_core.index)("board_comments_task_idx").on(table.task_id),
@@ -2244,6 +2486,7 @@ var init_schema_postgres = __esm({
2244
2486
  gatewayChannels = (0, import_pg_core.pgTable)(
2245
2487
  "gateway_channels",
2246
2488
  {
2489
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2247
2490
  // Primary identity
2248
2491
  id: (0, import_pg_core.varchar)("id", { length: 36 }).primaryKey(),
2249
2492
  created_at: t.timestamp("created_at").notNull(),
@@ -2257,7 +2500,7 @@ var init_schema_postgres = __esm({
2257
2500
  }).notNull(),
2258
2501
  target_branch_id: (0, import_pg_core.varchar)("target_branch_id", { length: 36 }).notNull().references(() => branches.branch_id, { onDelete: "cascade" }),
2259
2502
  agor_user_id: (0, import_pg_core.varchar)("agor_user_id", { length: 36 }).notNull(),
2260
- channel_key: (0, import_pg_core.text)("channel_key").notNull().unique(),
2503
+ channel_key: (0, import_pg_core.text)("channel_key").notNull(),
2261
2504
  enabled: t.bool("enabled").notNull().default(true),
2262
2505
  last_message_at: t.timestamp("last_message_at"),
2263
2506
  // JSON blob for platform credentials (encrypted at rest)
@@ -2266,13 +2509,19 @@ var init_schema_postgres = __esm({
2266
2509
  agentic_config: t.json("agentic_config")
2267
2510
  },
2268
2511
  (table) => ({
2512
+ tenantIdx: (0, import_pg_core.index)("gateway_channels_tenant_id_idx").on(table.tenant_id),
2269
2513
  channelKeyIdx: (0, import_pg_core.index)("idx_gateway_channel_key").on(table.channel_key),
2514
+ channelKeyTenantUnique: (0, import_pg_core.uniqueIndex)("gateway_channels_tenant_channel_key_unique").on(
2515
+ table.tenant_id,
2516
+ table.channel_key
2517
+ ),
2270
2518
  enabledTypeIdx: (0, import_pg_core.index)("idx_gateway_enabled_type").on(table.enabled, table.channel_type)
2271
2519
  })
2272
2520
  );
2273
2521
  threadSessionMap = (0, import_pg_core.pgTable)(
2274
2522
  "thread_session_map",
2275
2523
  {
2524
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2276
2525
  // Primary identity
2277
2526
  id: (0, import_pg_core.varchar)("id", { length: 36 }).primaryKey(),
2278
2527
  created_at: t.timestamp("created_at").notNull(),
@@ -2290,7 +2539,9 @@ var init_schema_postgres = __esm({
2290
2539
  metadata: t.json("metadata")
2291
2540
  },
2292
2541
  (table) => ({
2293
- uniqueChannelThread: (0, import_pg_core.uniqueIndex)("uniq_thread_map_channel_thread").on(
2542
+ tenantIdx: (0, import_pg_core.index)("thread_session_map_tenant_id_idx").on(table.tenant_id),
2543
+ uniqueChannelThread: (0, import_pg_core.uniqueIndex)("uniq_thread_map_tenant_channel_thread").on(
2544
+ table.tenant_id,
2294
2545
  table.channel_id,
2295
2546
  table.thread_id
2296
2547
  ),
@@ -2299,14 +2550,82 @@ var init_schema_postgres = __esm({
2299
2550
  channelStatusIdx: (0, import_pg_core.index)("idx_thread_map_channel_status").on(table.channel_id, table.status)
2300
2551
  })
2301
2552
  );
2553
+ gatewayOutboundMessages = (0, import_pg_core.pgTable)(
2554
+ "gateway_outbound_messages",
2555
+ {
2556
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2557
+ id: (0, import_pg_core.varchar)("id", { length: 36 }).primaryKey(),
2558
+ created_at: t.timestamp("created_at").notNull(),
2559
+ updated_at: t.timestamp("updated_at").notNull(),
2560
+ gateway_channel_id: (0, import_pg_core.varchar)("gateway_channel_id", { length: 36 }).notNull().references(() => gatewayChannels.id, { onDelete: "cascade" }),
2561
+ channel_type: (0, import_pg_core.text)("channel_type", {
2562
+ enum: ["slack", "discord", "whatsapp", "telegram", "github", "teams"]
2563
+ }).notNull(),
2564
+ platform_channel_id: (0, import_pg_core.text)("platform_channel_id").notNull(),
2565
+ platform_message_id: (0, import_pg_core.text)("platform_message_id").notNull(),
2566
+ platform_thread_id: (0, import_pg_core.text)("platform_thread_id").notNull(),
2567
+ platform_permalink: (0, import_pg_core.text)("platform_permalink"),
2568
+ target_branch_id: (0, import_pg_core.varchar)("target_branch_id", { length: 36 }).notNull().references(() => branches.branch_id),
2569
+ emitted_by_user_id: (0, import_pg_core.varchar)("emitted_by_user_id", { length: 36 }).notNull().references(() => users.user_id),
2570
+ emitted_by_session_id: (0, import_pg_core.varchar)("emitted_by_session_id", { length: 36 }).references(
2571
+ () => sessions.session_id,
2572
+ {
2573
+ onDelete: "set null"
2574
+ }
2575
+ ),
2576
+ emitted_by_task_id: (0, import_pg_core.varchar)("emitted_by_task_id", { length: 36 }).references(
2577
+ () => tasks.task_id,
2578
+ {
2579
+ onDelete: "set null"
2580
+ }
2581
+ ),
2582
+ emitted_by_schedule_id: (0, import_pg_core.varchar)("emitted_by_schedule_id", { length: 36 }).references(
2583
+ () => schedules.schedule_id,
2584
+ {
2585
+ onDelete: "set null"
2586
+ }
2587
+ ),
2588
+ message_text: (0, import_pg_core.text)("message_text").notNull(),
2589
+ message_preview: (0, import_pg_core.text)("message_preview").notNull(),
2590
+ metadata: t.json("metadata"),
2591
+ consumed_by_session_id: (0, import_pg_core.varchar)("consumed_by_session_id", { length: 36 }).references(
2592
+ () => sessions.session_id,
2593
+ {
2594
+ onDelete: "set null"
2595
+ }
2596
+ ),
2597
+ consumed_at: t.timestamp("consumed_at")
2598
+ },
2599
+ (table) => ({
2600
+ tenantIdx: (0, import_pg_core.index)("gateway_outbound_messages_tenant_id_idx").on(table.tenant_id),
2601
+ uniqueChannelThread: (0, import_pg_core.uniqueIndex)("uniq_gateway_outbound_tenant_channel_thread").on(
2602
+ table.tenant_id,
2603
+ table.gateway_channel_id,
2604
+ table.platform_thread_id
2605
+ ),
2606
+ emittedSessionIdx: (0, import_pg_core.index)("idx_gateway_outbound_emitted_session").on(
2607
+ table.emitted_by_session_id
2608
+ ),
2609
+ emittedScheduleIdx: (0, import_pg_core.index)("idx_gateway_outbound_emitted_schedule").on(
2610
+ table.emitted_by_schedule_id
2611
+ ),
2612
+ targetBranchCreatedIdx: (0, import_pg_core.index)("idx_gateway_outbound_branch_created").on(
2613
+ table.target_branch_id,
2614
+ table.created_at
2615
+ ),
2616
+ consumedIdx: (0, import_pg_core.index)("idx_gateway_outbound_consumed").on(table.consumed_at)
2617
+ })
2618
+ );
2302
2619
  sessionEnvSelections = (0, import_pg_core.pgTable)(
2303
2620
  "session_env_selections",
2304
2621
  {
2622
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2305
2623
  session_id: (0, import_pg_core.varchar)("session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
2306
2624
  env_var_name: (0, import_pg_core.text)("env_var_name").notNull(),
2307
2625
  created_at: t.timestamp("created_at").notNull()
2308
2626
  },
2309
2627
  (table) => ({
2628
+ tenantIdx: (0, import_pg_core.index)("session_env_selections_tenant_id_idx").on(table.tenant_id),
2310
2629
  pk: (0, import_pg_core.primaryKey)({ columns: [table.session_id, table.env_var_name] }),
2311
2630
  sessionIdx: (0, import_pg_core.index)("session_env_selections_session_idx").on(table.session_id)
2312
2631
  })
@@ -2314,6 +2633,7 @@ var init_schema_postgres = __esm({
2314
2633
  kbNamespaces = (0, import_pg_core.pgTable)(
2315
2634
  "kb_namespaces",
2316
2635
  {
2636
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2317
2637
  namespace_id: (0, import_pg_core.varchar)("namespace_id", { length: 36 }).primaryKey(),
2318
2638
  slug: (0, import_pg_core.text)("slug").notNull(),
2319
2639
  display_name: (0, import_pg_core.text)("display_name").notNull(),
@@ -2340,7 +2660,8 @@ var init_schema_postgres = __esm({
2340
2660
  archived_at: t.timestamp("archived_at")
2341
2661
  },
2342
2662
  (table) => ({
2343
- slugIdx: (0, import_pg_core.uniqueIndex)("kb_namespaces_slug_idx").on(table.slug).where(import_drizzle_orm2.sql`${table.archived} = false`),
2663
+ tenantIdx: (0, import_pg_core.index)("kb_namespaces_tenant_id_idx").on(table.tenant_id),
2664
+ slugIdx: (0, import_pg_core.uniqueIndex)("kb_namespaces_tenant_slug_unique").on(table.tenant_id, table.slug).where(import_drizzle_orm2.sql`${table.archived} = false`),
2344
2665
  kindIdx: (0, import_pg_core.index)("kb_namespaces_kind_idx").on(table.kind),
2345
2666
  ownerIdx: (0, import_pg_core.index)("kb_namespaces_owner_idx").on(table.owner_user_id),
2346
2667
  repoIdx: (0, import_pg_core.index)("kb_namespaces_repo_idx").on(table.repo_id),
@@ -2351,6 +2672,7 @@ var init_schema_postgres = __esm({
2351
2672
  kbNamespaceAcl = (0, import_pg_core.pgTable)(
2352
2673
  "kb_namespace_acl",
2353
2674
  {
2675
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2354
2676
  namespace_acl_id: (0, import_pg_core.varchar)("namespace_acl_id", { length: 36 }).primaryKey(),
2355
2677
  namespace_id: (0, import_pg_core.varchar)("namespace_id", { length: 36 }).notNull().references(() => kbNamespaces.namespace_id, { onDelete: "cascade" }),
2356
2678
  subject_type: (0, import_pg_core.text)("subject_type", { enum: ["user", "group"] }).notNull(),
@@ -2363,9 +2685,11 @@ var init_schema_postgres = __esm({
2363
2685
  updated_at: t.timestamp("updated_at")
2364
2686
  },
2365
2687
  (table) => ({
2688
+ tenantIdx: (0, import_pg_core.index)("kb_namespace_acl_tenant_id_idx").on(table.tenant_id),
2366
2689
  namespaceIdx: (0, import_pg_core.index)("kb_namespace_acl_namespace_idx").on(table.namespace_id),
2367
2690
  subjectIdx: (0, import_pg_core.index)("kb_namespace_acl_subject_idx").on(table.subject_type, table.subject_id),
2368
- namespaceSubjectIdx: (0, import_pg_core.uniqueIndex)("kb_namespace_acl_namespace_subject_idx").on(
2691
+ namespaceSubjectIdx: (0, import_pg_core.uniqueIndex)("kb_namespace_acl_tenant_namespace_subject_unique").on(
2692
+ table.tenant_id,
2369
2693
  table.namespace_id,
2370
2694
  table.subject_type,
2371
2695
  table.subject_id
@@ -2375,6 +2699,7 @@ var init_schema_postgres = __esm({
2375
2699
  kbDocuments = (0, import_pg_core.pgTable)(
2376
2700
  "kb_documents",
2377
2701
  {
2702
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2378
2703
  document_id: (0, import_pg_core.varchar)("document_id", { length: 36 }).primaryKey(),
2379
2704
  namespace_id: (0, import_pg_core.varchar)("namespace_id", { length: 36 }).notNull().references(() => kbNamespaces.namespace_id, { onDelete: "cascade" }),
2380
2705
  path: (0, import_pg_core.text)("path").notNull(),
@@ -2402,8 +2727,9 @@ var init_schema_postgres = __esm({
2402
2727
  archived_at: t.timestamp("archived_at")
2403
2728
  },
2404
2729
  (table) => ({
2405
- namespacePathIdx: (0, import_pg_core.uniqueIndex)("kb_documents_namespace_path_idx").on(table.namespace_id, table.path).where(import_drizzle_orm2.sql`${table.archived} = false`),
2406
- uriIdx: (0, import_pg_core.uniqueIndex)("kb_documents_uri_idx").on(table.uri).where(import_drizzle_orm2.sql`${table.archived} = false`),
2730
+ tenantIdx: (0, import_pg_core.index)("kb_documents_tenant_id_idx").on(table.tenant_id),
2731
+ namespacePathIdx: (0, import_pg_core.uniqueIndex)("kb_documents_tenant_namespace_path_unique").on(table.tenant_id, table.namespace_id, table.path).where(import_drizzle_orm2.sql`${table.archived} = false`),
2732
+ uriIdx: (0, import_pg_core.uniqueIndex)("kb_documents_tenant_uri_unique").on(table.tenant_id, table.uri).where(import_drizzle_orm2.sql`${table.archived} = false`),
2407
2733
  namespaceIdx: (0, import_pg_core.index)("kb_documents_namespace_idx").on(table.namespace_id),
2408
2734
  kindIdx: (0, import_pg_core.index)("kb_documents_kind_idx").on(table.kind),
2409
2735
  visibilityIdx: (0, import_pg_core.index)("kb_documents_visibility_idx").on(table.visibility),
@@ -2416,6 +2742,7 @@ var init_schema_postgres = __esm({
2416
2742
  kbDocumentVersions = (0, import_pg_core.pgTable)(
2417
2743
  "kb_document_versions",
2418
2744
  {
2745
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2419
2746
  version_id: (0, import_pg_core.varchar)("version_id", { length: 36 }).primaryKey(),
2420
2747
  document_id: (0, import_pg_core.varchar)("document_id", { length: 36 }).notNull().references(() => kbDocuments.document_id, { onDelete: "cascade" }),
2421
2748
  version_number: (0, import_pg_core.integer)("version_number").notNull(),
@@ -2435,7 +2762,9 @@ var init_schema_postgres = __esm({
2435
2762
  created_at: t.timestamp("created_at").notNull()
2436
2763
  },
2437
2764
  (table) => ({
2438
- documentVersionIdx: (0, import_pg_core.uniqueIndex)("kb_document_versions_document_version_idx").on(
2765
+ tenantIdx: (0, import_pg_core.index)("kb_document_versions_tenant_id_idx").on(table.tenant_id),
2766
+ documentVersionIdx: (0, import_pg_core.uniqueIndex)("kb_document_versions_tenant_document_version_unique").on(
2767
+ table.tenant_id,
2439
2768
  table.document_id,
2440
2769
  table.version_number
2441
2770
  ),
@@ -2447,6 +2776,7 @@ var init_schema_postgres = __esm({
2447
2776
  kbDocumentUnits = (0, import_pg_core.pgTable)(
2448
2777
  "kb_document_units",
2449
2778
  {
2779
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2450
2780
  unit_id: (0, import_pg_core.varchar)("unit_id", { length: 36 }).primaryKey(),
2451
2781
  document_id: (0, import_pg_core.varchar)("document_id", { length: 36 }).notNull().references(() => kbDocuments.document_id, { onDelete: "cascade" }),
2452
2782
  version_id: (0, import_pg_core.varchar)("version_id", { length: 36 }).notNull().references(() => kbDocumentVersions.version_id, { onDelete: "cascade" }),
@@ -2471,6 +2801,7 @@ var init_schema_postgres = __esm({
2471
2801
  updated_at: t.timestamp("updated_at")
2472
2802
  },
2473
2803
  (table) => ({
2804
+ tenantIdx: (0, import_pg_core.index)("kb_document_units_tenant_id_idx").on(table.tenant_id),
2474
2805
  documentIdx: (0, import_pg_core.index)("kb_document_units_document_idx").on(table.document_id),
2475
2806
  versionIdx: (0, import_pg_core.index)("kb_document_units_version_idx").on(table.version_id),
2476
2807
  versionOrdinalIdx: (0, import_pg_core.index)("kb_document_units_version_ordinal_idx").on(
@@ -2484,6 +2815,7 @@ var init_schema_postgres = __esm({
2484
2815
  kbEmbeddingSpaces = (0, import_pg_core.pgTable)(
2485
2816
  "kb_embedding_spaces",
2486
2817
  {
2818
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2487
2819
  embedding_space_id: (0, import_pg_core.varchar)("embedding_space_id", { length: 36 }).primaryKey(),
2488
2820
  provider: (0, import_pg_core.text)("provider").notNull(),
2489
2821
  model: (0, import_pg_core.text)("model").notNull(),
@@ -2496,7 +2828,9 @@ var init_schema_postgres = __esm({
2496
2828
  updated_at: t.timestamp("updated_at")
2497
2829
  },
2498
2830
  (table) => ({
2499
- providerModelIdx: (0, import_pg_core.uniqueIndex)("kb_embedding_spaces_provider_model_idx").on(
2831
+ tenantIdx: (0, import_pg_core.index)("kb_embedding_spaces_tenant_id_idx").on(table.tenant_id),
2832
+ providerModelIdx: (0, import_pg_core.uniqueIndex)("kb_embedding_spaces_tenant_provider_model_unique").on(
2833
+ table.tenant_id,
2500
2834
  table.provider,
2501
2835
  table.model,
2502
2836
  table.dimensions,
@@ -2509,6 +2843,7 @@ var init_schema_postgres = __esm({
2509
2843
  kbGraphNodes = (0, import_pg_core.pgTable)(
2510
2844
  "kb_graph_nodes",
2511
2845
  {
2846
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2512
2847
  node_id: (0, import_pg_core.varchar)("node_id", { length: 36 }).primaryKey(),
2513
2848
  node_type: (0, import_pg_core.text)("node_type", {
2514
2849
  enum: [
@@ -2574,7 +2909,8 @@ var init_schema_postgres = __esm({
2574
2909
  archived_at: t.timestamp("archived_at")
2575
2910
  },
2576
2911
  (table) => ({
2577
- uriIdx: (0, import_pg_core.uniqueIndex)("kb_graph_nodes_uri_idx").on(table.uri).where(import_drizzle_orm2.sql`${table.archived} = false`),
2912
+ tenantIdx: (0, import_pg_core.index)("kb_graph_nodes_tenant_id_idx").on(table.tenant_id),
2913
+ uriIdx: (0, import_pg_core.uniqueIndex)("kb_graph_nodes_tenant_uri_unique").on(table.tenant_id, table.uri).where(import_drizzle_orm2.sql`${table.archived} = false`),
2578
2914
  typeIdx: (0, import_pg_core.index)("kb_graph_nodes_type_idx").on(table.node_type),
2579
2915
  namespaceIdx: (0, import_pg_core.index)("kb_graph_nodes_namespace_idx").on(table.namespace_id),
2580
2916
  documentIdx: (0, import_pg_core.index)("kb_graph_nodes_document_idx").on(table.document_id),
@@ -2594,6 +2930,7 @@ var init_schema_postgres = __esm({
2594
2930
  kbGraphEdges = (0, import_pg_core.pgTable)(
2595
2931
  "kb_graph_edges",
2596
2932
  {
2933
+ tenant_id: (0, import_pg_core.text)("tenant_id").notNull().default("default"),
2597
2934
  edge_id: (0, import_pg_core.varchar)("edge_id", { length: 36 }).primaryKey(),
2598
2935
  source_node_id: (0, import_pg_core.varchar)("source_node_id", { length: 36 }).notNull().references(() => kbGraphNodes.node_id, { onDelete: "cascade" }),
2599
2936
  target_node_id: (0, import_pg_core.varchar)("target_node_id", { length: 36 }).notNull().references(() => kbGraphNodes.node_id, { onDelete: "cascade" }),
@@ -2622,6 +2959,7 @@ var init_schema_postgres = __esm({
2622
2959
  archived_at: t.timestamp("archived_at")
2623
2960
  },
2624
2961
  (table) => ({
2962
+ tenantIdx: (0, import_pg_core.index)("kb_graph_edges_tenant_id_idx").on(table.tenant_id),
2625
2963
  sourceIdx: (0, import_pg_core.index)("kb_graph_edges_source_idx").on(table.source_node_id),
2626
2964
  targetIdx: (0, import_pg_core.index)("kb_graph_edges_target_idx").on(table.target_node_id),
2627
2965
  typeIdx: (0, import_pg_core.index)("kb_graph_edges_type_idx").on(table.edge_type),
@@ -2633,7 +2971,7 @@ var init_schema_postgres = __esm({
2633
2971
  table.target_node_id,
2634
2972
  table.edge_type
2635
2973
  ),
2636
- sourceTargetTypeIdx: (0, import_pg_core.uniqueIndex)("kb_graph_edges_source_target_type_idx").on(table.source_node_id, table.target_node_id, table.edge_type).where(import_drizzle_orm2.sql`${table.archived} = false`),
2974
+ sourceTargetTypeIdx: (0, import_pg_core.uniqueIndex)("kb_graph_edges_tenant_source_target_type_unique").on(table.tenant_id, table.source_node_id, table.target_node_id, table.edge_type).where(import_drizzle_orm2.sql`${table.archived} = false`),
2637
2975
  archivedIdx: (0, import_pg_core.index)("kb_graph_edges_archived_idx").on(table.archived)
2638
2976
  })
2639
2977
  );
@@ -2697,6 +3035,7 @@ __export(schema_sqlite_exports, {
2697
3035
  cardTypes: () => cardTypes2,
2698
3036
  cards: () => cards2,
2699
3037
  gatewayChannels: () => gatewayChannels2,
3038
+ gatewayOutboundMessages: () => gatewayOutboundMessages2,
2700
3039
  groupMemberships: () => groupMemberships2,
2701
3040
  groups: () => groups2,
2702
3041
  kbDocumentUnits: () => kbDocumentUnits2,
@@ -2725,7 +3064,7 @@ __export(schema_sqlite_exports, {
2725
3064
  userMcpOauthTokens: () => userMcpOauthTokens2,
2726
3065
  users: () => users2
2727
3066
  });
2728
- var import_drizzle_orm3, import_sqlite_core, t2, sessions2, sessionRelationships2, tasks2, serializedSessions2, messages2, boards2, repos2, branches2, branchOwners2, boardOwners2, schedules2, users2, groups2, groupMemberships2, branchGroupGrants2, boardGroupGrants2, appVariables2, userApiKeys2, mcpServers2, cardTypes2, cards2, artifacts2, artifactTrustGrants2, boardObjects2, sessionMcpServers2, userMcpOauthTokens2, boardComments2, gatewayChannels2, threadSessionMap2, sessionEnvSelections2, kbNamespaces2, kbNamespaceAcl2, kbDocuments2, kbDocumentVersions2, kbDocumentUnits2, kbEmbeddingSpaces2, kbGraphNodes2, kbGraphEdges2, sessionsRelations2, sessionRelationshipsRelations2, branchesRelations2, schedulesRelations2;
3067
+ var import_drizzle_orm3, import_sqlite_core, t2, sessions2, sessionRelationships2, tasks2, serializedSessions2, messages2, boards2, repos2, branches2, branchOwners2, boardOwners2, schedules2, users2, groups2, groupMemberships2, branchGroupGrants2, boardGroupGrants2, appVariables2, userApiKeys2, mcpServers2, cardTypes2, cards2, artifacts2, artifactTrustGrants2, boardObjects2, sessionMcpServers2, userMcpOauthTokens2, boardComments2, gatewayChannels2, threadSessionMap2, gatewayOutboundMessages2, sessionEnvSelections2, kbNamespaces2, kbNamespaceAcl2, kbDocuments2, kbDocumentVersions2, kbDocumentUnits2, kbEmbeddingSpaces2, kbGraphNodes2, kbGraphEdges2, sessionsRelations2, sessionRelationshipsRelations2, branchesRelations2, schedulesRelations2;
2729
3068
  var init_schema_sqlite = __esm({
2730
3069
  "src/db/schema.sqlite.ts"() {
2731
3070
  "use strict";
@@ -2801,6 +3140,7 @@ var init_schema_sqlite = __esm({
2801
3140
  },
2802
3141
  (table) => ({
2803
3142
  statusIdx: (0, import_sqlite_core.index)("sessions_status_idx").on(table.status),
3143
+ statusReadyIdx: (0, import_sqlite_core.index)("sessions_status_ready_idx").on(table.status, table.ready_for_prompt),
2804
3144
  agenticToolIdx: (0, import_sqlite_core.index)("sessions_agentic_tool_idx").on(table.agentic_tool),
2805
3145
  boardIdx: (0, import_sqlite_core.index)("sessions_board_idx").on(table.board_id),
2806
3146
  branchIdx: (0, import_sqlite_core.index)("sessions_branch_idx").on(table.branch_id),
@@ -2840,6 +3180,9 @@ var init_schema_sqlite = __esm({
2840
3180
  sourceIdx: (0, import_sqlite_core.index)("session_relationships_source_idx").on(table.source_session_id),
2841
3181
  targetIdx: (0, import_sqlite_core.index)("session_relationships_target_idx").on(table.target_session_id),
2842
3182
  callbackIdx: (0, import_sqlite_core.index)("session_relationships_callback_idx").on(table.callback_session_id),
3183
+ // Note: no tenant_source/tenant_target composite indexes here — SQLite schema
3184
+ // has no tenant column on this table (RLS is Postgres-only). The standalone
3185
+ // source/target indexes above are sufficient for SQLite.
2843
3186
  sourceTargetTypeUnique: (0, import_sqlite_core.uniqueIndex)("session_relationships_source_target_type_unique").on(
2844
3187
  table.source_session_id,
2845
3188
  table.target_session_id,
@@ -2959,7 +3302,12 @@ var init_schema_sqlite = __esm({
2959
3302
  // Indexes for efficient lookups
2960
3303
  sessionIdx: (0, import_sqlite_core.index)("messages_session_id_idx").on(table.session_id),
2961
3304
  taskIdx: (0, import_sqlite_core.index)("messages_task_id_idx").on(table.task_id),
2962
- sessionIndexIdx: (0, import_sqlite_core.index)("messages_session_index_idx").on(table.session_id, table.index)
3305
+ sessionIndexIdx: (0, import_sqlite_core.index)("messages_session_index_idx").on(table.session_id, table.index),
3306
+ timestampIdx: (0, import_sqlite_core.index)("messages_timestamp_idx").on(table.timestamp),
3307
+ sessionTimestampIdx: (0, import_sqlite_core.index)("messages_session_timestamp_idx").on(
3308
+ table.session_id,
3309
+ table.timestamp
3310
+ )
2963
3311
  })
2964
3312
  );
2965
3313
  boards2 = (0, import_sqlite_core.sqliteTable)(
@@ -3185,6 +3533,9 @@ var init_schema_sqlite = __esm({
3185
3533
  onboarding_completed: t2.bool("onboarding_completed").notNull().default(false),
3186
3534
  // Force password change flag (admin-settable, auto-cleared on password change)
3187
3535
  must_change_password: t2.bool("must_change_password").notNull().default(false),
3536
+ // Auth invalidation marker. Password changes set this timestamp so any
3537
+ // previously issued browser access or refresh token is rejected.
3538
+ tokens_valid_after: t2.timestamp("tokens_valid_after"),
3188
3539
  // JSON blob for profile/preferences
3189
3540
  data: t2.json("data").$type().notNull()
3190
3541
  },
@@ -3628,6 +3979,66 @@ var init_schema_sqlite = __esm({
3628
3979
  channelStatusIdx: (0, import_sqlite_core.index)("idx_thread_map_channel_status").on(table.channel_id, table.status)
3629
3980
  })
3630
3981
  );
3982
+ gatewayOutboundMessages2 = (0, import_sqlite_core.sqliteTable)(
3983
+ "gateway_outbound_messages",
3984
+ {
3985
+ id: (0, import_sqlite_core.text)("id", { length: 36 }).primaryKey(),
3986
+ created_at: t2.timestamp("created_at").notNull(),
3987
+ updated_at: t2.timestamp("updated_at").notNull(),
3988
+ gateway_channel_id: (0, import_sqlite_core.text)("gateway_channel_id", { length: 36 }).notNull().references(() => gatewayChannels2.id, { onDelete: "cascade" }),
3989
+ channel_type: (0, import_sqlite_core.text)("channel_type", {
3990
+ enum: ["slack", "discord", "whatsapp", "telegram", "github", "teams"]
3991
+ }).notNull(),
3992
+ platform_channel_id: (0, import_sqlite_core.text)("platform_channel_id").notNull(),
3993
+ platform_message_id: (0, import_sqlite_core.text)("platform_message_id").notNull(),
3994
+ platform_thread_id: (0, import_sqlite_core.text)("platform_thread_id").notNull(),
3995
+ platform_permalink: (0, import_sqlite_core.text)("platform_permalink"),
3996
+ target_branch_id: (0, import_sqlite_core.text)("target_branch_id", { length: 36 }).notNull().references(() => branches2.branch_id),
3997
+ emitted_by_user_id: (0, import_sqlite_core.text)("emitted_by_user_id", { length: 36 }).notNull().references(() => users2.user_id),
3998
+ emitted_by_session_id: (0, import_sqlite_core.text)("emitted_by_session_id", { length: 36 }).references(
3999
+ () => sessions2.session_id,
4000
+ {
4001
+ onDelete: "set null"
4002
+ }
4003
+ ),
4004
+ emitted_by_task_id: (0, import_sqlite_core.text)("emitted_by_task_id", { length: 36 }).references(() => tasks2.task_id, {
4005
+ onDelete: "set null"
4006
+ }),
4007
+ emitted_by_schedule_id: (0, import_sqlite_core.text)("emitted_by_schedule_id", { length: 36 }).references(
4008
+ () => schedules2.schedule_id,
4009
+ {
4010
+ onDelete: "set null"
4011
+ }
4012
+ ),
4013
+ message_text: (0, import_sqlite_core.text)("message_text").notNull(),
4014
+ message_preview: (0, import_sqlite_core.text)("message_preview").notNull(),
4015
+ metadata: t2.json("metadata"),
4016
+ consumed_by_session_id: (0, import_sqlite_core.text)("consumed_by_session_id", { length: 36 }).references(
4017
+ () => sessions2.session_id,
4018
+ {
4019
+ onDelete: "set null"
4020
+ }
4021
+ ),
4022
+ consumed_at: t2.timestamp("consumed_at")
4023
+ },
4024
+ (table) => ({
4025
+ uniqueChannelThread: (0, import_sqlite_core.uniqueIndex)("uniq_gateway_outbound_channel_thread").on(
4026
+ table.gateway_channel_id,
4027
+ table.platform_thread_id
4028
+ ),
4029
+ emittedSessionIdx: (0, import_sqlite_core.index)("idx_gateway_outbound_emitted_session").on(
4030
+ table.emitted_by_session_id
4031
+ ),
4032
+ emittedScheduleIdx: (0, import_sqlite_core.index)("idx_gateway_outbound_emitted_schedule").on(
4033
+ table.emitted_by_schedule_id
4034
+ ),
4035
+ targetBranchCreatedIdx: (0, import_sqlite_core.index)("idx_gateway_outbound_branch_created").on(
4036
+ table.target_branch_id,
4037
+ table.created_at
4038
+ ),
4039
+ consumedIdx: (0, import_sqlite_core.index)("idx_gateway_outbound_consumed").on(table.consumed_at)
4040
+ })
4041
+ );
3631
4042
  sessionEnvSelections2 = (0, import_sqlite_core.sqliteTable)(
3632
4043
  "session_env_selections",
3633
4044
  {
@@ -4069,6 +4480,7 @@ __export(schema_exports, {
4069
4480
  cardTypes: () => cardTypes3,
4070
4481
  cards: () => cards3,
4071
4482
  gatewayChannels: () => gatewayChannels3,
4483
+ gatewayOutboundMessages: () => gatewayOutboundMessages3,
4072
4484
  groupMemberships: () => groupMemberships3,
4073
4485
  groups: () => groups3,
4074
4486
  kbDocumentUnits: () => kbDocumentUnits3,
@@ -4094,7 +4506,7 @@ __export(schema_exports, {
4094
4506
  userMcpOauthTokens: () => userMcpOauthTokens3,
4095
4507
  users: () => users3
4096
4508
  });
4097
- var dialect, schema, sessions3, tasks3, messages3, boards3, repos3, branches3, branchOwners3, boardOwners3, groups3, groupMemberships3, branchGroupGrants3, boardGroupGrants3, schedules3, users3, appVariables3, mcpServers3, cardTypes3, cards3, artifacts3, artifactTrustGrants3, boardObjects3, sessionMcpServers3, sessionRelationships3, sessionEnvSelections3, userMcpOauthTokens3, boardComments3, gatewayChannels3, threadSessionMap3, userApiKeys3, serializedSessions3, kbNamespaces3, kbNamespaceAcl3, kbDocuments3, kbDocumentVersions3, kbDocumentUnits3, kbEmbeddingSpaces3, kbGraphNodes3, kbGraphEdges3;
4509
+ var dialect, schema, sessions3, tasks3, messages3, boards3, repos3, branches3, branchOwners3, boardOwners3, groups3, groupMemberships3, branchGroupGrants3, boardGroupGrants3, schedules3, users3, appVariables3, mcpServers3, cardTypes3, cards3, artifacts3, artifactTrustGrants3, boardObjects3, sessionMcpServers3, sessionRelationships3, sessionEnvSelections3, userMcpOauthTokens3, boardComments3, gatewayChannels3, threadSessionMap3, gatewayOutboundMessages3, userApiKeys3, serializedSessions3, kbNamespaces3, kbNamespaceAcl3, kbDocuments3, kbDocumentVersions3, kbDocumentUnits3, kbEmbeddingSpaces3, kbGraphNodes3, kbGraphEdges3;
4098
4510
  var init_schema = __esm({
4099
4511
  "src/db/schema.ts"() {
4100
4512
  "use strict";
@@ -4132,6 +4544,7 @@ var init_schema = __esm({
4132
4544
  boardComments3 = schema.boardComments;
4133
4545
  gatewayChannels3 = schema.gatewayChannels;
4134
4546
  threadSessionMap3 = schema.threadSessionMap;
4547
+ gatewayOutboundMessages3 = schema.gatewayOutboundMessages;
4135
4548
  userApiKeys3 = schema.userApiKeys;
4136
4549
  serializedSessions3 = schema.serializedSessions;
4137
4550
  kbNamespaces3 = schema.kbNamespaces;
@@ -4164,35 +4577,6 @@ var init_ids = __esm({
4164
4577
  }
4165
4578
  });
4166
4579
 
4167
- // src/db/user-utils.ts
4168
- var import_bcryptjs, import_drizzle_orm6;
4169
- var init_user_utils = __esm({
4170
- "src/db/user-utils.ts"() {
4171
- "use strict";
4172
- init_cjs_shims();
4173
- import_bcryptjs = __toESM(require("bcryptjs"), 1);
4174
- import_drizzle_orm6 = require("drizzle-orm");
4175
- init_ids();
4176
- init_user();
4177
- init_database_wrapper();
4178
- init_schema();
4179
- }
4180
- });
4181
-
4182
- // src/db/first-run-bootstrap.ts
4183
- var import_node_crypto3, import_drizzle_orm7;
4184
- var init_first_run_bootstrap = __esm({
4185
- "src/db/first-run-bootstrap.ts"() {
4186
- "use strict";
4187
- init_cjs_shims();
4188
- import_node_crypto3 = require("crypto");
4189
- import_drizzle_orm7 = require("drizzle-orm");
4190
- init_database_wrapper();
4191
- init_schema();
4192
- init_user_utils();
4193
- }
4194
- });
4195
-
4196
4580
  // src/unix/index.ts
4197
4581
  var unix_exports = {};
4198
4582
  __export(unix_exports, {
@@ -4277,7 +4661,7 @@ var import_node_child_process = require("child_process");
4277
4661
  var import_node_util = require("util");
4278
4662
  var execAsync = (0, import_node_util.promisify)(import_node_child_process.exec);
4279
4663
  function spawnWithInput(cmd, args, input) {
4280
- return new Promise((resolve2, reject) => {
4664
+ return new Promise((resolve, reject) => {
4281
4665
  const child = (0, import_node_child_process.spawn)(cmd, args, {
4282
4666
  stdio: ["pipe", "pipe", "pipe"]
4283
4667
  });
@@ -4291,7 +4675,7 @@ function spawnWithInput(cmd, args, input) {
4291
4675
  });
4292
4676
  child.on("error", reject);
4293
4677
  child.on("close", (code) => {
4294
- resolve2({
4678
+ resolve({
4295
4679
  stdout,
4296
4680
  stderr,
4297
4681
  exitCode: code ?? 1
@@ -4775,10 +5159,7 @@ var import_node_fs = __toESM(require("fs"), 1);
4775
5159
 
4776
5160
  // src/yaml/index.ts
4777
5161
  init_cjs_shims();
4778
- var import_js_yaml = __toESM(require("js-yaml"), 1);
4779
- var load = import_js_yaml.default.load;
4780
- var dump = import_js_yaml.default.dump;
4781
- var YAMLException = import_js_yaml.default.YAMLException;
5162
+ var yaml = __toESM(require("js-yaml"), 1);
4782
5163
 
4783
5164
  // src/config/variant-resolver.ts
4784
5165
  init_cjs_shims();
@@ -4970,6 +5351,7 @@ init_schema();
4970
5351
  init_cjs_shims();
4971
5352
  init_ids();
4972
5353
  init_id();
5354
+ init_tenant_context();
4973
5355
  var RepositoryError = class extends Error {
4974
5356
  constructor(message, cause) {
4975
5357
  super(message);
@@ -5011,6 +5393,21 @@ async function resolveByShortIdPrefix(id, entityType, fetchMatches) {
5011
5393
  return matches[0];
5012
5394
  }
5013
5395
  var RESOLVE_SHORT_ID_FETCH_LIMIT = 11;
5396
+ function getHiddenTenantId(row) {
5397
+ const tenantId = row?.tenant_id;
5398
+ return typeof tenantId === "string" && tenantId.length > 0 ? tenantId : void 0;
5399
+ }
5400
+ function attachHiddenTenant(dto, row) {
5401
+ const tenantId = getHiddenTenantId(row);
5402
+ if (tenantId) {
5403
+ Object.defineProperty(dto, "tenant_id", {
5404
+ value: tenantId,
5405
+ enumerable: false,
5406
+ configurable: true
5407
+ });
5408
+ }
5409
+ return dto;
5410
+ }
5014
5411
 
5015
5412
  // src/db/repositories/session-env-selections.ts
5016
5413
  var SessionEnvSelectionRepository = class {
@@ -5398,71 +5795,103 @@ init_executor_heartbeat();
5398
5795
 
5399
5796
  // src/config/key-resolver.ts
5400
5797
  init_cjs_shims();
5401
-
5402
- // src/db/index.ts
5403
- init_cjs_shims();
5404
- var import_drizzle_orm35 = require("drizzle-orm");
5405
- var import_bcryptjs3 = __toESM(require("bcryptjs"), 1);
5798
+ var import_drizzle_orm6 = require("drizzle-orm");
5799
+ init_database_wrapper();
5800
+ init_schema();
5406
5801
  init_ids();
5407
-
5408
- // src/lib/slugs.ts
5409
- init_cjs_shims();
5410
-
5411
- // src/db/client.ts
5412
- init_cjs_shims();
5413
- var import_client = require("@libsql/client");
5414
- var import_libsql = require("drizzle-orm/libsql");
5415
- var import_postgres_js = require("drizzle-orm/postgres-js");
5416
- var import_postgres = __toESM(require("postgres"), 1);
5417
5802
  init_config_manager();
5418
- init_schema_postgres();
5419
- init_schema_sqlite();
5420
- init_schema_factory();
5803
+ var DEBUG_KEY_RESOLUTION = process.env.AGOR_DEBUG_KEY_RESOLUTION === "1" || process.env.DEBUG?.includes("key-resolution");
5421
5804
 
5422
- // src/utils/path.ts
5423
- init_cjs_shims();
5424
- var import_node_os2 = require("os");
5425
- var import_node_path2 = require("path");
5805
+ // src/config/index.ts
5806
+ init_multitenancy();
5426
5807
 
5427
- // src/db/index.ts
5428
- init_database_wrapper();
5429
- init_first_run_bootstrap();
5808
+ // src/config/proxies-resolver.ts
5809
+ init_cjs_shims();
5430
5810
 
5431
- // src/db/migrate.ts
5811
+ // src/config/repo-list.ts
5432
5812
  init_cjs_shims();
5433
- var import_node_path3 = require("path");
5434
- var import_node_url = require("url");
5435
- var import_drizzle_orm8 = require("drizzle-orm");
5436
- var import_migrator = require("drizzle-orm/libsql/migrator");
5437
- var import_migrator2 = require("drizzle-orm/postgres-js/migrator");
5438
- init_database_wrapper();
5439
- init_schema();
5440
5813
 
5441
- // src/db/pending-migrations.ts
5814
+ // src/config/repo-reference.ts
5442
5815
  init_cjs_shims();
5816
+ var REPO_SLUG_PATTERN = /^[a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+$/;
5443
5817
 
5444
- // src/db/repositories/index.ts
5818
+ // src/config/resolved-config-slice.ts
5445
5819
  init_cjs_shims();
5820
+ var import_zod = require("zod");
5821
+ var ResolvedConfigSliceSchema = import_zod.z.object({
5822
+ /** From `config.execution.*` */
5823
+ execution: import_zod.z.object({
5824
+ permission_timeout_ms: import_zod.z.number().int().nonnegative().optional(),
5825
+ executor_heartbeat: import_zod.z.object({
5826
+ enabled: import_zod.z.boolean(),
5827
+ interval_ms: import_zod.z.number().int().positive()
5828
+ }).optional()
5829
+ }).optional(),
5830
+ /** From `config.opencode.*` */
5831
+ opencode: import_zod.z.object({
5832
+ serverUrl: import_zod.z.string().optional()
5833
+ }).optional(),
5834
+ /** From `config.daemon.*` (selected fields only) */
5835
+ daemon: import_zod.z.object({
5836
+ host_ip_address: import_zod.z.string().optional()
5837
+ }).optional()
5838
+ });
5446
5839
 
5447
- // src/db/repositories/app-variables.ts
5840
+ // src/config/resource-schemas.ts
5448
5841
  init_cjs_shims();
5449
- var import_drizzle_orm9 = require("drizzle-orm");
5450
- init_ids();
5451
- init_database_wrapper();
5452
- init_schema();
5842
+ var import_zod2 = require("zod");
5843
+ var uuidSchema = import_zod2.z.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, "Must be a valid UUID");
5844
+ var repoSlugSchema = import_zod2.z.string().regex(
5845
+ REPO_SLUG_PATTERN,
5846
+ 'Must be org/name format with alphanumeric, hyphens, underscores, or dots (e.g., "my-org/my-repo")'
5847
+ );
5848
+ var enforcedAgentConfigSchema = import_zod2.z.object({
5849
+ agentic_tool: import_zod2.z.enum(["claude-code", "claude-code-cli", "codex", "gemini", "opencode", "copilot", "cursor"]).optional(),
5850
+ permission_mode: import_zod2.z.string().optional(),
5851
+ model: import_zod2.z.string().optional(),
5852
+ mcp_server_ids: import_zod2.z.array(import_zod2.z.string()).optional()
5853
+ });
5854
+ var resourceRepoConfigSchema = import_zod2.z.object({
5855
+ repo_id: uuidSchema,
5856
+ slug: repoSlugSchema,
5857
+ remote_url: import_zod2.z.string().optional(),
5858
+ repo_type: import_zod2.z.enum(["remote", "local"]).default("remote"),
5859
+ default_branch: import_zod2.z.string().optional(),
5860
+ shallow: import_zod2.z.boolean().optional()
5861
+ }).refine((data) => data.repo_type !== "remote" || data.remote_url, {
5862
+ message: 'remote_url is required when repo_type is "remote"',
5863
+ path: ["remote_url"]
5864
+ });
5865
+ var resourceBranchConfigSchema = import_zod2.z.object({
5866
+ branch_id: uuidSchema,
5867
+ name: import_zod2.z.string().min(1, "Branch name is required"),
5868
+ ref: import_zod2.z.string().min(1, "Git ref is required"),
5869
+ ref_type: import_zod2.z.enum(["branch", "tag"]).optional(),
5870
+ others_can: import_zod2.z.enum(["none", "view", "session", "prompt", "all"]).optional(),
5871
+ mcp_server_ids: import_zod2.z.array(import_zod2.z.string()).optional(),
5872
+ repo: repoSlugSchema,
5873
+ readonly: import_zod2.z.boolean().optional(),
5874
+ agent: enforcedAgentConfigSchema.optional()
5875
+ });
5876
+ var resourceUserConfigSchema = import_zod2.z.object({
5877
+ user_id: uuidSchema,
5878
+ email: import_zod2.z.string().email("Must be a valid email address"),
5879
+ name: import_zod2.z.string().optional(),
5880
+ role: import_zod2.z.enum(["superadmin", "admin", "member", "viewer"]).default("member"),
5881
+ unix_username: import_zod2.z.string().optional(),
5882
+ password: import_zod2.z.string().optional()
5883
+ });
5884
+ var daemonResourcesConfigSchema = import_zod2.z.object({
5885
+ repos: import_zod2.z.array(resourceRepoConfigSchema).optional(),
5886
+ branches: import_zod2.z.array(resourceBranchConfigSchema).optional(),
5887
+ users: import_zod2.z.array(resourceUserConfigSchema).optional()
5888
+ });
5453
5889
 
5454
- // src/db/repositories/artifact-trust.ts
5890
+ // src/config/resource-sync.ts
5455
5891
  init_cjs_shims();
5456
- var import_drizzle_orm10 = require("drizzle-orm");
5457
- init_ids();
5458
- init_database_wrapper();
5459
- init_schema();
5460
5892
 
5461
- // src/db/repositories/artifacts.ts
5893
+ // src/config/security-resolver.ts
5462
5894
  init_cjs_shims();
5463
- var import_drizzle_orm11 = require("drizzle-orm");
5464
- init_config_manager();
5465
- init_ids();
5466
5895
 
5467
5896
  // src/utils/url.ts
5468
5897
  init_cjs_shims();
@@ -5514,99 +5943,113 @@ function stripHttpUrlUserinfo(rawUrl) {
5514
5943
  }
5515
5944
  }
5516
5945
 
5517
- // src/db/repositories/artifacts.ts
5518
- init_database_wrapper();
5519
- init_schema();
5520
-
5521
- // src/db/repositories/board-comments.ts
5946
+ // src/config/security-resolver.ts
5947
+ var DEFAULT_GIT_CONFIG_PARAMETERS = Object.freeze([
5948
+ "transfer.credentialsInUrl=die",
5949
+ "protocol.file.allow=user",
5950
+ "protocol.ext.allow=never",
5951
+ "core.protectHFS=true",
5952
+ "core.protectNTFS=true"
5953
+ ]);
5954
+
5955
+ // src/config/index.ts
5956
+ init_types();
5957
+
5958
+ // src/db/repositories/index.ts
5522
5959
  init_cjs_shims();
5523
- var import_drizzle_orm12 = require("drizzle-orm");
5960
+
5961
+ // src/db/repositories/app-variables.ts
5962
+ init_cjs_shims();
5963
+ var import_drizzle_orm7 = require("drizzle-orm");
5524
5964
  init_ids();
5525
5965
  init_database_wrapper();
5526
5966
  init_schema();
5527
5967
 
5528
- // src/db/repositories/board-objects.ts
5968
+ // src/db/repositories/artifact-trust.ts
5529
5969
  init_cjs_shims();
5530
- var import_drizzle_orm14 = require("drizzle-orm");
5970
+ var import_drizzle_orm8 = require("drizzle-orm");
5531
5971
  init_ids();
5972
+ init_database_wrapper();
5973
+ init_schema();
5532
5974
 
5533
- // src/utils/board-placement.ts
5975
+ // src/db/repositories/artifacts.ts
5534
5976
  init_cjs_shims();
5535
-
5536
- // src/db/repositories/board-objects.ts
5977
+ var import_drizzle_orm10 = require("drizzle-orm");
5978
+ init_config_manager();
5979
+ init_ids();
5537
5980
  init_database_wrapper();
5538
5981
  init_schema();
5539
5982
 
5540
5983
  // src/db/repositories/branch-access.ts
5541
5984
  init_cjs_shims();
5542
5985
  init_types2();
5543
- var import_drizzle_orm13 = require("drizzle-orm");
5986
+ var import_drizzle_orm9 = require("drizzle-orm");
5544
5987
  init_database_wrapper();
5545
5988
  init_schema();
5546
5989
  var VISIBLE_BRANCH_PERMISSION_LEVELS = BRANCH_PERMISSION_LEVELS.filter(
5547
5990
  (level) => level !== "none"
5548
5991
  );
5549
5992
  function activeGroupGrantAccessExists(db, userId) {
5550
- return (0, import_drizzle_orm13.exists)(
5993
+ return (0, import_drizzle_orm9.exists)(
5551
5994
  // biome-ignore lint/suspicious/noExplicitAny: Drizzle select has complex cross-dialect overloads
5552
- db.select({ _: import_drizzle_orm13.sql`1` }).from(branchGroupGrants3).innerJoin(
5995
+ db.select({ _: import_drizzle_orm9.sql`1` }).from(branchGroupGrants3).innerJoin(
5553
5996
  groupMemberships3,
5554
- (0, import_drizzle_orm13.and)(
5555
- (0, import_drizzle_orm13.eq)(groupMemberships3.group_id, branchGroupGrants3.group_id),
5556
- (0, import_drizzle_orm13.eq)(groupMemberships3.user_id, userId)
5997
+ (0, import_drizzle_orm9.and)(
5998
+ (0, import_drizzle_orm9.eq)(groupMemberships3.group_id, branchGroupGrants3.group_id),
5999
+ (0, import_drizzle_orm9.eq)(groupMemberships3.user_id, userId)
5557
6000
  )
5558
6001
  ).innerJoin(
5559
6002
  groups3,
5560
- (0, import_drizzle_orm13.and)((0, import_drizzle_orm13.eq)(groups3.group_id, branchGroupGrants3.group_id), (0, import_drizzle_orm13.eq)(groups3.archived, false))
6003
+ (0, import_drizzle_orm9.and)((0, import_drizzle_orm9.eq)(groups3.group_id, branchGroupGrants3.group_id), (0, import_drizzle_orm9.eq)(groups3.archived, false))
5561
6004
  ).where(
5562
- (0, import_drizzle_orm13.and)(
5563
- (0, import_drizzle_orm13.eq)(branchGroupGrants3.branch_id, branches3.branch_id),
5564
- (0, import_drizzle_orm13.inArray)(branchGroupGrants3.can, VISIBLE_BRANCH_PERMISSION_LEVELS)
6005
+ (0, import_drizzle_orm9.and)(
6006
+ (0, import_drizzle_orm9.eq)(branchGroupGrants3.branch_id, branches3.branch_id),
6007
+ (0, import_drizzle_orm9.inArray)(branchGroupGrants3.can, VISIBLE_BRANCH_PERMISSION_LEVELS)
5565
6008
  )
5566
6009
  )
5567
6010
  );
5568
6011
  }
5569
6012
  function activeBoardGroupGrantAccessExists(db, userId) {
5570
- return (0, import_drizzle_orm13.exists)(
6013
+ return (0, import_drizzle_orm9.exists)(
5571
6014
  // biome-ignore lint/suspicious/noExplicitAny: Drizzle select has complex cross-dialect overloads
5572
- db.select({ _: import_drizzle_orm13.sql`1` }).from(boardGroupGrants3).innerJoin(
6015
+ db.select({ _: import_drizzle_orm9.sql`1` }).from(boardGroupGrants3).innerJoin(
5573
6016
  groupMemberships3,
5574
- (0, import_drizzle_orm13.and)(
5575
- (0, import_drizzle_orm13.eq)(groupMemberships3.group_id, boardGroupGrants3.group_id),
5576
- (0, import_drizzle_orm13.eq)(groupMemberships3.user_id, userId)
6017
+ (0, import_drizzle_orm9.and)(
6018
+ (0, import_drizzle_orm9.eq)(groupMemberships3.group_id, boardGroupGrants3.group_id),
6019
+ (0, import_drizzle_orm9.eq)(groupMemberships3.user_id, userId)
5577
6020
  )
5578
6021
  ).innerJoin(
5579
6022
  groups3,
5580
- (0, import_drizzle_orm13.and)((0, import_drizzle_orm13.eq)(groups3.group_id, boardGroupGrants3.group_id), (0, import_drizzle_orm13.eq)(groups3.archived, false))
6023
+ (0, import_drizzle_orm9.and)((0, import_drizzle_orm9.eq)(groups3.group_id, boardGroupGrants3.group_id), (0, import_drizzle_orm9.eq)(groups3.archived, false))
5581
6024
  ).innerJoin(
5582
6025
  boards3,
5583
- (0, import_drizzle_orm13.and)(
5584
- (0, import_drizzle_orm13.eq)(boards3.board_id, boardGroupGrants3.board_id),
5585
- (0, import_drizzle_orm13.eq)(import_drizzle_orm13.sql`coalesce(${jsonExtract(db, boards3.data, "access_mode")}, 'shared')`, "shared")
6026
+ (0, import_drizzle_orm9.and)(
6027
+ (0, import_drizzle_orm9.eq)(boards3.board_id, boardGroupGrants3.board_id),
6028
+ (0, import_drizzle_orm9.eq)(import_drizzle_orm9.sql`coalesce(${jsonExtract(db, boards3.data, "access_mode")}, 'shared')`, "shared")
5586
6029
  )
5587
6030
  ).where(
5588
- (0, import_drizzle_orm13.and)(
5589
- (0, import_drizzle_orm13.eq)(boardGroupGrants3.board_id, branches3.board_id),
5590
- (0, import_drizzle_orm13.inArray)(boardGroupGrants3.can, VISIBLE_BRANCH_PERMISSION_LEVELS)
6031
+ (0, import_drizzle_orm9.and)(
6032
+ (0, import_drizzle_orm9.eq)(boardGroupGrants3.board_id, branches3.board_id),
6033
+ (0, import_drizzle_orm9.inArray)(boardGroupGrants3.can, VISIBLE_BRANCH_PERMISSION_LEVELS)
5591
6034
  )
5592
6035
  )
5593
6036
  );
5594
6037
  }
5595
6038
  function activeBoardOwnerAccessExists(db, userId) {
5596
- return (0, import_drizzle_orm13.exists)(
6039
+ return (0, import_drizzle_orm9.exists)(
5597
6040
  // biome-ignore lint/suspicious/noExplicitAny: Drizzle select has complex cross-dialect overloads
5598
- db.select({ _: import_drizzle_orm13.sql`1` }).from(boardOwners3).where((0, import_drizzle_orm13.and)((0, import_drizzle_orm13.eq)(boardOwners3.board_id, branches3.board_id), (0, import_drizzle_orm13.eq)(boardOwners3.user_id, userId)))
6041
+ db.select({ _: import_drizzle_orm9.sql`1` }).from(boardOwners3).where((0, import_drizzle_orm9.and)((0, import_drizzle_orm9.eq)(boardOwners3.board_id, branches3.board_id), (0, import_drizzle_orm9.eq)(boardOwners3.user_id, userId)))
5599
6042
  );
5600
6043
  }
5601
6044
  function alignedBoardDefaultVisible(db) {
5602
- return (0, import_drizzle_orm13.exists)(
6045
+ return (0, import_drizzle_orm9.exists)(
5603
6046
  // biome-ignore lint/suspicious/noExplicitAny: Drizzle select has complex cross-dialect overloads
5604
- db.select({ _: import_drizzle_orm13.sql`1` }).from(boards3).where(
5605
- (0, import_drizzle_orm13.and)(
5606
- (0, import_drizzle_orm13.eq)(boards3.board_id, branches3.board_id),
5607
- (0, import_drizzle_orm13.eq)(import_drizzle_orm13.sql`coalesce(${jsonExtract(db, boards3.data, "access_mode")}, 'shared')`, "shared"),
5608
- (0, import_drizzle_orm13.inArray)(
5609
- import_drizzle_orm13.sql`coalesce(${jsonExtract(db, boards3.data, "default_others_can")}, 'session')`,
6047
+ db.select({ _: import_drizzle_orm9.sql`1` }).from(boards3).where(
6048
+ (0, import_drizzle_orm9.and)(
6049
+ (0, import_drizzle_orm9.eq)(boards3.board_id, branches3.board_id),
6050
+ (0, import_drizzle_orm9.eq)(import_drizzle_orm9.sql`coalesce(${jsonExtract(db, boards3.data, "access_mode")}, 'shared')`, "shared"),
6051
+ (0, import_drizzle_orm9.inArray)(
6052
+ import_drizzle_orm9.sql`coalesce(${jsonExtract(db, boards3.data, "default_others_can")}, 'session')`,
5610
6053
  VISIBLE_BRANCH_PERMISSION_LEVELS
5611
6054
  )
5612
6055
  )
@@ -5614,33 +6057,81 @@ function alignedBoardDefaultVisible(db) {
5614
6057
  );
5615
6058
  }
5616
6059
  function visibleBranchAccessCondition(db, userId) {
5617
- return (0, import_drizzle_orm13.or)(
5618
- (0, import_drizzle_orm13.isNotNull)(branchOwners3.user_id),
6060
+ return (0, import_drizzle_orm9.or)(
6061
+ (0, import_drizzle_orm9.isNotNull)(branchOwners3.user_id),
5619
6062
  activeGroupGrantAccessExists(db, userId),
5620
- (0, import_drizzle_orm13.and)((0, import_drizzle_orm13.eq)(branches3.permission_source, "board"), activeBoardOwnerAccessExists(db, userId)),
5621
- (0, import_drizzle_orm13.and)((0, import_drizzle_orm13.eq)(branches3.permission_source, "board"), activeBoardGroupGrantAccessExists(db, userId)),
5622
- (0, import_drizzle_orm13.and)((0, import_drizzle_orm13.eq)(branches3.permission_source, "board"), alignedBoardDefaultVisible(db)),
5623
- (0, import_drizzle_orm13.and)(
5624
- (0, import_drizzle_orm13.eq)(branches3.permission_source, "override"),
5625
- (0, import_drizzle_orm13.inArray)(branches3.others_can, VISIBLE_BRANCH_PERMISSION_LEVELS)
6063
+ (0, import_drizzle_orm9.and)((0, import_drizzle_orm9.eq)(branches3.permission_source, "board"), activeBoardOwnerAccessExists(db, userId)),
6064
+ (0, import_drizzle_orm9.and)((0, import_drizzle_orm9.eq)(branches3.permission_source, "board"), activeBoardGroupGrantAccessExists(db, userId)),
6065
+ (0, import_drizzle_orm9.and)((0, import_drizzle_orm9.eq)(branches3.permission_source, "board"), alignedBoardDefaultVisible(db)),
6066
+ (0, import_drizzle_orm9.and)(
6067
+ (0, import_drizzle_orm9.eq)(branches3.permission_source, "override"),
6068
+ (0, import_drizzle_orm9.inArray)(branches3.others_can, VISIBLE_BRANCH_PERMISSION_LEVELS)
5626
6069
  )
5627
- ) ?? import_drizzle_orm13.sql`false`;
6070
+ ) ?? import_drizzle_orm9.sql`false`;
5628
6071
  }
5629
6072
 
6073
+ // src/db/repositories/board-comments.ts
6074
+ init_cjs_shims();
6075
+ var import_drizzle_orm11 = require("drizzle-orm");
6076
+ init_ids();
6077
+ init_database_wrapper();
6078
+ init_schema();
6079
+
6080
+ // src/db/repositories/board-objects.ts
6081
+ init_cjs_shims();
6082
+ var import_drizzle_orm12 = require("drizzle-orm");
6083
+ init_ids();
6084
+
6085
+ // src/utils/board-placement.ts
6086
+ init_cjs_shims();
6087
+
6088
+ // src/db/repositories/board-objects.ts
6089
+ init_database_wrapper();
6090
+ init_schema();
6091
+
5630
6092
  // src/db/repositories/boards.ts
5631
6093
  init_cjs_shims();
5632
6094
  init_types2();
5633
- var import_drizzle_orm17 = require("drizzle-orm");
6095
+ var import_drizzle_orm15 = require("drizzle-orm");
5634
6096
  var yaml3 = __toESM(require("js-yaml"), 1);
5635
6097
  init_config_manager();
5636
6098
  init_ids();
6099
+
6100
+ // src/lib/slugs.ts
6101
+ init_cjs_shims();
6102
+
6103
+ // src/utils/emoji-shortcodes.ts
6104
+ init_cjs_shims();
6105
+ var import_node_module = require("module");
6106
+ var requireJson = (0, import_node_module.createRequire)(importMetaUrl);
6107
+ var emojiData = requireJson("emojibase-data/en/compact.json");
6108
+ var shortcodes = requireJson(
6109
+ "emojibase-data/en/shortcodes/emojibase.json"
6110
+ );
6111
+ var emojiByHexcode = /* @__PURE__ */ new Map();
6112
+ for (const emoji of emojiData) {
6113
+ if (emoji.unicode) {
6114
+ emojiByHexcode.set(emoji.hexcode, emoji.unicode);
6115
+ }
6116
+ }
6117
+ var emojiByShortcode = /* @__PURE__ */ new Map();
6118
+ for (const [hexcode, codes] of Object.entries(shortcodes)) {
6119
+ const emoji = emojiByHexcode.get(hexcode);
6120
+ if (!emoji) continue;
6121
+ const codeList = Array.isArray(codes) ? codes : [codes];
6122
+ for (const code of codeList) {
6123
+ emojiByShortcode.set(code.toLowerCase(), emoji);
6124
+ }
6125
+ }
6126
+
6127
+ // src/db/repositories/boards.ts
5637
6128
  init_database_wrapper();
5638
6129
  init_schema();
5639
6130
 
5640
6131
  // src/db/repositories/branches.ts
5641
6132
  init_cjs_shims();
5642
6133
  init_types2();
5643
- var import_drizzle_orm16 = require("drizzle-orm");
6134
+ var import_drizzle_orm14 = require("drizzle-orm");
5644
6135
  init_config_manager();
5645
6136
  init_ids();
5646
6137
  init_database_wrapper();
@@ -5648,7 +6139,7 @@ init_schema();
5648
6139
 
5649
6140
  // src/db/repositories/groups.ts
5650
6141
  init_cjs_shims();
5651
- var import_drizzle_orm15 = require("drizzle-orm");
6142
+ var import_drizzle_orm13 = require("drizzle-orm");
5652
6143
  init_ids();
5653
6144
  init_database_wrapper();
5654
6145
  init_schema();
@@ -5712,17 +6203,17 @@ var GroupRepository = class {
5712
6203
  }
5713
6204
  async findAll(filter) {
5714
6205
  const conditions = [];
5715
- if (filter?.archived !== void 0) conditions.push((0, import_drizzle_orm15.eq)(groups3.archived, filter.archived));
6206
+ if (filter?.archived !== void 0) conditions.push((0, import_drizzle_orm13.eq)(groups3.archived, filter.archived));
5716
6207
  const query = select(this.db).from(groups3);
5717
- const rows = conditions.length > 0 ? await query.where((0, import_drizzle_orm15.and)(...conditions)).all() : await query.all();
6208
+ const rows = conditions.length > 0 ? await query.where((0, import_drizzle_orm13.and)(...conditions)).all() : await query.all();
5718
6209
  return rows.map((row) => this.rowToGroup(row));
5719
6210
  }
5720
6211
  async findById(id) {
5721
- const row = await select(this.db).from(groups3).where((0, import_drizzle_orm15.eq)(groups3.group_id, id)).one();
6212
+ const row = await select(this.db).from(groups3).where((0, import_drizzle_orm13.eq)(groups3.group_id, id)).one();
5722
6213
  return row ? this.rowToGroup(row) : null;
5723
6214
  }
5724
6215
  async findBySlug(slug) {
5725
- const row = await select(this.db).from(groups3).where((0, import_drizzle_orm15.eq)(groups3.slug, slug)).one();
6216
+ const row = await select(this.db).from(groups3).where((0, import_drizzle_orm13.eq)(groups3.slug, slug)).one();
5726
6217
  return row ? this.rowToGroup(row) : null;
5727
6218
  }
5728
6219
  async create(data) {
@@ -5756,7 +6247,7 @@ var GroupRepository = class {
5756
6247
  if (updates.slug !== void 0) patch.slug = normalizeSlug(updates.slug);
5757
6248
  if (updates.description !== void 0) patch.description = updates.description;
5758
6249
  if (updates.archived !== void 0) patch.archived = updates.archived;
5759
- await update(this.db, groups3).set(patch).where((0, import_drizzle_orm15.eq)(groups3.group_id, existing.group_id)).run();
6250
+ await update(this.db, groups3).set(patch).where((0, import_drizzle_orm13.eq)(groups3.group_id, existing.group_id)).run();
5760
6251
  const updatedGroup = await this.findById(existing.group_id);
5761
6252
  if (!updatedGroup) throw new RepositoryError("Failed to retrieve updated group");
5762
6253
  return updatedGroup;
@@ -5764,19 +6255,19 @@ var GroupRepository = class {
5764
6255
  async delete(id) {
5765
6256
  const existing = await this.findById(id);
5766
6257
  if (!existing) throw new EntityNotFoundError("Group", id);
5767
- await deleteFrom(this.db, groups3).where((0, import_drizzle_orm15.eq)(groups3.group_id, existing.group_id)).run();
6258
+ await deleteFrom(this.db, groups3).where((0, import_drizzle_orm13.eq)(groups3.group_id, existing.group_id)).run();
5768
6259
  return existing;
5769
6260
  }
5770
6261
  async listMemberships(filter) {
5771
6262
  const conditions = [];
5772
- if (filter?.group_id) conditions.push((0, import_drizzle_orm15.eq)(groupMemberships3.group_id, filter.group_id));
5773
- if (filter?.user_id) conditions.push((0, import_drizzle_orm15.eq)(groupMemberships3.user_id, filter.user_id));
6263
+ if (filter?.group_id) conditions.push((0, import_drizzle_orm13.eq)(groupMemberships3.group_id, filter.group_id));
6264
+ if (filter?.user_id) conditions.push((0, import_drizzle_orm13.eq)(groupMemberships3.user_id, filter.user_id));
5774
6265
  const query = select(this.db).from(groupMemberships3);
5775
- const rows = conditions.length > 0 ? await query.where((0, import_drizzle_orm15.and)(...conditions)).all() : await query.all();
6266
+ const rows = conditions.length > 0 ? await query.where((0, import_drizzle_orm13.and)(...conditions)).all() : await query.all();
5776
6267
  return rows.map((row) => this.rowToMembership(row));
5777
6268
  }
5778
6269
  async addMember(groupId, userId, addedBy) {
5779
- const existing = await select(this.db).from(groupMemberships3).where((0, import_drizzle_orm15.and)((0, import_drizzle_orm15.eq)(groupMemberships3.group_id, groupId), (0, import_drizzle_orm15.eq)(groupMemberships3.user_id, userId))).one();
6270
+ const existing = await select(this.db).from(groupMemberships3).where((0, import_drizzle_orm13.and)((0, import_drizzle_orm13.eq)(groupMemberships3.group_id, groupId), (0, import_drizzle_orm13.eq)(groupMemberships3.user_id, userId))).one();
5780
6271
  if (existing) return this.rowToMembership(existing);
5781
6272
  const row = {
5782
6273
  group_id: groupId,
@@ -5788,17 +6279,17 @@ var GroupRepository = class {
5788
6279
  return this.rowToMembership(row);
5789
6280
  }
5790
6281
  async removeMember(groupId, userId) {
5791
- const existing = await select(this.db).from(groupMemberships3).where((0, import_drizzle_orm15.and)((0, import_drizzle_orm15.eq)(groupMemberships3.group_id, groupId), (0, import_drizzle_orm15.eq)(groupMemberships3.user_id, userId))).one();
6282
+ const existing = await select(this.db).from(groupMemberships3).where((0, import_drizzle_orm13.and)((0, import_drizzle_orm13.eq)(groupMemberships3.group_id, groupId), (0, import_drizzle_orm13.eq)(groupMemberships3.user_id, userId))).one();
5792
6283
  if (!existing) return null;
5793
- await deleteFrom(this.db, groupMemberships3).where((0, import_drizzle_orm15.and)((0, import_drizzle_orm15.eq)(groupMemberships3.group_id, groupId), (0, import_drizzle_orm15.eq)(groupMemberships3.user_id, userId))).run();
6284
+ await deleteFrom(this.db, groupMemberships3).where((0, import_drizzle_orm13.and)((0, import_drizzle_orm13.eq)(groupMemberships3.group_id, groupId), (0, import_drizzle_orm13.eq)(groupMemberships3.user_id, userId))).run();
5794
6285
  return this.rowToMembership(existing);
5795
6286
  }
5796
6287
  async getGroupIdsForUser(userId) {
5797
- const rows = await select(this.db, { group_id: groupMemberships3.group_id }).from(groupMemberships3).where((0, import_drizzle_orm15.eq)(groupMemberships3.user_id, userId)).all();
6288
+ const rows = await select(this.db, { group_id: groupMemberships3.group_id }).from(groupMemberships3).where((0, import_drizzle_orm13.eq)(groupMemberships3.user_id, userId)).all();
5798
6289
  return rows.map((r) => r.group_id);
5799
6290
  }
5800
6291
  async listBranchGrants(branchId) {
5801
- const rows = await select(this.db).from(branchGroupGrants3).leftJoin(groups3, (0, import_drizzle_orm15.eq)(branchGroupGrants3.group_id, groups3.group_id)).where((0, import_drizzle_orm15.eq)(branchGroupGrants3.branch_id, branchId)).all();
6292
+ const rows = await select(this.db).from(branchGroupGrants3).leftJoin(groups3, (0, import_drizzle_orm13.eq)(branchGroupGrants3.group_id, groups3.group_id)).where((0, import_drizzle_orm13.eq)(branchGroupGrants3.branch_id, branchId)).all();
5802
6293
  return rows.map(
5803
6294
  (r) => this.rowToGrant(r.branch_group_grants, r.groups ? this.rowToGroup(r.groups) : void 0)
5804
6295
  );
@@ -5806,16 +6297,16 @@ var GroupRepository = class {
5806
6297
  async upsertBranchGrant(data) {
5807
6298
  const now = /* @__PURE__ */ new Date();
5808
6299
  const existing = await select(this.db).from(branchGroupGrants3).where(
5809
- (0, import_drizzle_orm15.and)(
5810
- (0, import_drizzle_orm15.eq)(branchGroupGrants3.branch_id, data.branch_id),
5811
- (0, import_drizzle_orm15.eq)(branchGroupGrants3.group_id, data.group_id)
6300
+ (0, import_drizzle_orm13.and)(
6301
+ (0, import_drizzle_orm13.eq)(branchGroupGrants3.branch_id, data.branch_id),
6302
+ (0, import_drizzle_orm13.eq)(branchGroupGrants3.group_id, data.group_id)
5812
6303
  )
5813
6304
  ).one();
5814
6305
  if (existing) {
5815
6306
  await update(this.db, branchGroupGrants3).set({ can: data.can, fs_access: data.fs_access ?? null, updated_at: now }).where(
5816
- (0, import_drizzle_orm15.and)(
5817
- (0, import_drizzle_orm15.eq)(branchGroupGrants3.branch_id, data.branch_id),
5818
- (0, import_drizzle_orm15.eq)(branchGroupGrants3.group_id, data.group_id)
6307
+ (0, import_drizzle_orm13.and)(
6308
+ (0, import_drizzle_orm13.eq)(branchGroupGrants3.branch_id, data.branch_id),
6309
+ (0, import_drizzle_orm13.eq)(branchGroupGrants3.group_id, data.group_id)
5819
6310
  )
5820
6311
  ).run();
5821
6312
  } else {
@@ -5838,16 +6329,16 @@ var GroupRepository = class {
5838
6329
  const existing = (await this.listBranchGrants(branchId)).find((g) => g.group_id === groupId) ?? null;
5839
6330
  if (!existing) return null;
5840
6331
  await deleteFrom(this.db, branchGroupGrants3).where(
5841
- (0, import_drizzle_orm15.and)((0, import_drizzle_orm15.eq)(branchGroupGrants3.branch_id, branchId), (0, import_drizzle_orm15.eq)(branchGroupGrants3.group_id, groupId))
6332
+ (0, import_drizzle_orm13.and)((0, import_drizzle_orm13.eq)(branchGroupGrants3.branch_id, branchId), (0, import_drizzle_orm13.eq)(branchGroupGrants3.group_id, groupId))
5842
6333
  ).run();
5843
6334
  return existing;
5844
6335
  }
5845
6336
  async getBranchGrantsForUser(branchId, userId) {
5846
- const rows = await select(this.db).from(branchGroupGrants3).innerJoin(groupMemberships3, (0, import_drizzle_orm15.eq)(branchGroupGrants3.group_id, groupMemberships3.group_id)).innerJoin(groups3, (0, import_drizzle_orm15.eq)(groupMemberships3.group_id, groups3.group_id)).where(
5847
- (0, import_drizzle_orm15.and)(
5848
- (0, import_drizzle_orm15.eq)(branchGroupGrants3.branch_id, branchId),
5849
- (0, import_drizzle_orm15.eq)(groupMemberships3.user_id, userId),
5850
- (0, import_drizzle_orm15.eq)(groups3.archived, false)
6337
+ const rows = await select(this.db).from(branchGroupGrants3).innerJoin(groupMemberships3, (0, import_drizzle_orm13.eq)(branchGroupGrants3.group_id, groupMemberships3.group_id)).innerJoin(groups3, (0, import_drizzle_orm13.eq)(groupMemberships3.group_id, groups3.group_id)).where(
6338
+ (0, import_drizzle_orm13.and)(
6339
+ (0, import_drizzle_orm13.eq)(branchGroupGrants3.branch_id, branchId),
6340
+ (0, import_drizzle_orm13.eq)(groupMemberships3.user_id, userId),
6341
+ (0, import_drizzle_orm13.eq)(groups3.archived, false)
5851
6342
  )
5852
6343
  ).all();
5853
6344
  return rows.map(
@@ -5855,7 +6346,7 @@ var GroupRepository = class {
5855
6346
  );
5856
6347
  }
5857
6348
  async listBoardGrants(boardId) {
5858
- const rows = await select(this.db).from(boardGroupGrants3).leftJoin(groups3, (0, import_drizzle_orm15.eq)(boardGroupGrants3.group_id, groups3.group_id)).where((0, import_drizzle_orm15.eq)(boardGroupGrants3.board_id, boardId)).all();
6349
+ const rows = await select(this.db).from(boardGroupGrants3).leftJoin(groups3, (0, import_drizzle_orm13.eq)(boardGroupGrants3.group_id, groups3.group_id)).where((0, import_drizzle_orm13.eq)(boardGroupGrants3.board_id, boardId)).all();
5859
6350
  return rows.map(
5860
6351
  (r) => this.rowToBoardGrant(r.board_group_grants, r.groups ? this.rowToGroup(r.groups) : void 0)
5861
6352
  );
@@ -5863,16 +6354,16 @@ var GroupRepository = class {
5863
6354
  async upsertBoardGrant(data) {
5864
6355
  const now = /* @__PURE__ */ new Date();
5865
6356
  const existing = await select(this.db).from(boardGroupGrants3).where(
5866
- (0, import_drizzle_orm15.and)(
5867
- (0, import_drizzle_orm15.eq)(boardGroupGrants3.board_id, data.board_id),
5868
- (0, import_drizzle_orm15.eq)(boardGroupGrants3.group_id, data.group_id)
6357
+ (0, import_drizzle_orm13.and)(
6358
+ (0, import_drizzle_orm13.eq)(boardGroupGrants3.board_id, data.board_id),
6359
+ (0, import_drizzle_orm13.eq)(boardGroupGrants3.group_id, data.group_id)
5869
6360
  )
5870
6361
  ).one();
5871
6362
  if (existing) {
5872
6363
  await update(this.db, boardGroupGrants3).set({ can: data.can, fs_access: data.fs_access ?? null, updated_at: now }).where(
5873
- (0, import_drizzle_orm15.and)(
5874
- (0, import_drizzle_orm15.eq)(boardGroupGrants3.board_id, data.board_id),
5875
- (0, import_drizzle_orm15.eq)(boardGroupGrants3.group_id, data.group_id)
6364
+ (0, import_drizzle_orm13.and)(
6365
+ (0, import_drizzle_orm13.eq)(boardGroupGrants3.board_id, data.board_id),
6366
+ (0, import_drizzle_orm13.eq)(boardGroupGrants3.group_id, data.group_id)
5876
6367
  )
5877
6368
  ).run();
5878
6369
  } else {
@@ -5894,15 +6385,15 @@ var GroupRepository = class {
5894
6385
  async removeBoardGrant(boardId, groupId) {
5895
6386
  const existing = (await this.listBoardGrants(boardId)).find((g) => g.group_id === groupId) ?? null;
5896
6387
  if (!existing) return null;
5897
- await deleteFrom(this.db, boardGroupGrants3).where((0, import_drizzle_orm15.and)((0, import_drizzle_orm15.eq)(boardGroupGrants3.board_id, boardId), (0, import_drizzle_orm15.eq)(boardGroupGrants3.group_id, groupId))).run();
6388
+ await deleteFrom(this.db, boardGroupGrants3).where((0, import_drizzle_orm13.and)((0, import_drizzle_orm13.eq)(boardGroupGrants3.board_id, boardId), (0, import_drizzle_orm13.eq)(boardGroupGrants3.group_id, groupId))).run();
5898
6389
  return existing;
5899
6390
  }
5900
6391
  async getBoardGrantsForUser(boardId, userId) {
5901
- const rows = await select(this.db).from(boardGroupGrants3).innerJoin(groupMemberships3, (0, import_drizzle_orm15.eq)(boardGroupGrants3.group_id, groupMemberships3.group_id)).innerJoin(groups3, (0, import_drizzle_orm15.eq)(groupMemberships3.group_id, groups3.group_id)).where(
5902
- (0, import_drizzle_orm15.and)(
5903
- (0, import_drizzle_orm15.eq)(boardGroupGrants3.board_id, boardId),
5904
- (0, import_drizzle_orm15.eq)(groupMemberships3.user_id, userId),
5905
- (0, import_drizzle_orm15.eq)(groups3.archived, false)
6392
+ const rows = await select(this.db).from(boardGroupGrants3).innerJoin(groupMemberships3, (0, import_drizzle_orm13.eq)(boardGroupGrants3.group_id, groupMemberships3.group_id)).innerJoin(groups3, (0, import_drizzle_orm13.eq)(groupMemberships3.group_id, groups3.group_id)).where(
6393
+ (0, import_drizzle_orm13.and)(
6394
+ (0, import_drizzle_orm13.eq)(boardGroupGrants3.board_id, boardId),
6395
+ (0, import_drizzle_orm13.eq)(groupMemberships3.user_id, userId),
6396
+ (0, import_drizzle_orm13.eq)(groups3.archived, false)
5906
6397
  )
5907
6398
  ).all();
5908
6399
  return rows.map(
@@ -5979,44 +6470,47 @@ var BranchRepository = class {
5979
6470
  rowToBranch(row, baseUrl) {
5980
6471
  const branchId = row.branch_id;
5981
6472
  const url = baseUrl && row.board_id ? getBranchUrl(branchId, baseUrl) : null;
5982
- return {
5983
- branch_id: branchId,
5984
- repo_id: row.repo_id,
5985
- created_at: new Date(row.created_at).toISOString(),
5986
- updated_at: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
5987
- created_by: row.created_by,
5988
- name: row.name,
5989
- ref: row.ref,
5990
- ref_type: row.ref_type ?? "branch",
5991
- branch_unique_id: row.branch_unique_id,
5992
- start_command: row.start_command ?? void 0,
5993
- // Static environment fields
5994
- stop_command: row.stop_command ?? void 0,
5995
- nuke_command: row.nuke_command ?? void 0,
5996
- health_check_url: row.health_check_url ?? void 0,
5997
- app_url: row.app_url ?? void 0,
5998
- logs_command: row.logs_command ?? void 0,
5999
- environment_variant: row.environment_variant ?? void 0,
6000
- board_id: row.board_id ?? void 0,
6001
- // Top-level column
6002
- needs_attention: Boolean(row.needs_attention),
6003
- // Convert SQLite integer (0/1) to boolean
6004
- archived: Boolean(row.archived),
6005
- // Convert SQLite integer (0/1) to boolean
6006
- archived_at: row.archived_at ? new Date(row.archived_at).toISOString() : void 0,
6007
- archived_by: row.archived_by ?? void 0,
6008
- filesystem_status: row.filesystem_status ?? void 0,
6009
- // RBAC fields
6010
- permission_source: row.permission_source ?? "override",
6011
- others_can: row.others_can ?? void 0,
6012
- others_fs_access: row.others_fs_access ?? void 0,
6013
- unix_group: row.unix_group ?? void 0,
6014
- // Branch storage mode
6015
- storage_mode: row.storage_mode ?? "worktree",
6016
- clone_depth: row.clone_depth ?? void 0,
6017
- ...row.data,
6018
- url
6019
- };
6473
+ return attachHiddenTenant(
6474
+ {
6475
+ branch_id: branchId,
6476
+ repo_id: row.repo_id,
6477
+ created_at: new Date(row.created_at).toISOString(),
6478
+ updated_at: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
6479
+ created_by: row.created_by,
6480
+ name: row.name,
6481
+ ref: row.ref,
6482
+ ref_type: row.ref_type ?? "branch",
6483
+ branch_unique_id: row.branch_unique_id,
6484
+ start_command: row.start_command ?? void 0,
6485
+ // Static environment fields
6486
+ stop_command: row.stop_command ?? void 0,
6487
+ nuke_command: row.nuke_command ?? void 0,
6488
+ health_check_url: row.health_check_url ?? void 0,
6489
+ app_url: row.app_url ?? void 0,
6490
+ logs_command: row.logs_command ?? void 0,
6491
+ environment_variant: row.environment_variant ?? void 0,
6492
+ board_id: row.board_id ?? void 0,
6493
+ // Top-level column
6494
+ needs_attention: Boolean(row.needs_attention),
6495
+ // Convert SQLite integer (0/1) to boolean
6496
+ archived: Boolean(row.archived),
6497
+ // Convert SQLite integer (0/1) to boolean
6498
+ archived_at: row.archived_at ? new Date(row.archived_at).toISOString() : void 0,
6499
+ archived_by: row.archived_by ?? void 0,
6500
+ filesystem_status: row.filesystem_status ?? void 0,
6501
+ // RBAC fields
6502
+ permission_source: row.permission_source ?? "override",
6503
+ others_can: row.others_can ?? void 0,
6504
+ others_fs_access: row.others_fs_access ?? void 0,
6505
+ unix_group: row.unix_group ?? void 0,
6506
+ // Branch storage mode
6507
+ storage_mode: row.storage_mode ?? "worktree",
6508
+ clone_depth: row.clone_depth ?? void 0,
6509
+ ...row.data,
6510
+ url
6511
+ },
6512
+ row
6513
+ );
6020
6514
  }
6021
6515
  /**
6022
6516
  * Convert Branch to database insert format
@@ -6123,10 +6617,10 @@ var BranchRepository = class {
6123
6617
  async findById(id) {
6124
6618
  try {
6125
6619
  const fullId = await resolveByShortIdPrefix(id, "Branch", async (pattern) => {
6126
- const rows = await select(this.db).from(branches3).where((0, import_drizzle_orm16.like)(branches3.branch_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
6620
+ const rows = await select(this.db).from(branches3).where((0, import_drizzle_orm14.like)(branches3.branch_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
6127
6621
  return rows.map((r) => r.branch_id);
6128
6622
  });
6129
- const row = await select(this.db).from(branches3).where((0, import_drizzle_orm16.eq)(branches3.branch_id, fullId)).one();
6623
+ const row = await select(this.db).from(branches3).where((0, import_drizzle_orm14.eq)(branches3.branch_id, fullId)).one();
6130
6624
  if (!row) return null;
6131
6625
  const baseUrl = await getBaseUrl();
6132
6626
  return this.rowToBranch(row, baseUrl);
@@ -6141,7 +6635,7 @@ var BranchRepository = class {
6141
6635
  async findRealtimeVisibilityBranch(id) {
6142
6636
  try {
6143
6637
  const fullId = await resolveByShortIdPrefix(id, "Branch", async (pattern) => {
6144
- const rows = await select(this.db, { branch_id: branches3.branch_id }).from(branches3).where((0, import_drizzle_orm16.like)(branches3.branch_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
6638
+ const rows = await select(this.db, { branch_id: branches3.branch_id }).from(branches3).where((0, import_drizzle_orm14.like)(branches3.branch_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
6145
6639
  return rows.map((r) => r.branch_id);
6146
6640
  });
6147
6641
  const row = await select(this.db, {
@@ -6149,11 +6643,11 @@ var BranchRepository = class {
6149
6643
  others_can: branches3.others_can,
6150
6644
  board_id: branches3.board_id,
6151
6645
  permission_source: branches3.permission_source
6152
- }).from(branches3).where((0, import_drizzle_orm16.eq)(branches3.branch_id, fullId)).one();
6646
+ }).from(branches3).where((0, import_drizzle_orm14.eq)(branches3.branch_id, fullId)).one();
6153
6647
  if (!row) return null;
6154
6648
  let othersCan = row.others_can;
6155
6649
  if (row.permission_source === "board" && row.board_id) {
6156
- const board = await select(this.db, { data: boards3.data }).from(boards3).where((0, import_drizzle_orm16.eq)(boards3.board_id, row.board_id)).one();
6650
+ const board = await select(this.db, { data: boards3.data }).from(boards3).where((0, import_drizzle_orm14.eq)(boards3.board_id, row.board_id)).one();
6157
6651
  const boardData = board?.data;
6158
6652
  othersCan = (boardData?.access_mode ?? "shared") === "private" ? "none" : boardData?.default_others_can ?? row.others_can;
6159
6653
  }
@@ -6173,21 +6667,109 @@ var BranchRepository = class {
6173
6667
  * Callers that explicitly want to exclude archived branches should pass
6174
6668
  * `{ includeArchived: false }`.
6175
6669
  *
6176
- * @param filter - Optional filters (repo_id, includeArchived)
6670
+ * The `board_id`, `archived`, and `branchIds` filters let the list read path
6671
+ * (`BranchesService.find`) push its high-selectivity predicates into SQL so it
6672
+ * no longer materializes the whole table before filtering in memory.
6673
+ *
6674
+ * @param filter - Optional filters
6177
6675
  * @param filter.repo_id - Filter by repository ID
6178
6676
  * @param filter.includeArchived - Include archived branches (default: true)
6677
+ * @param filter.board_id - Filter to a single board
6678
+ * @param filter.archived - Filter to an exact archived state (takes precedence
6679
+ * over `includeArchived`)
6680
+ * @param filter.branchIds - Restrict to a set of branch IDs (empty set yields
6681
+ * no rows, matching an `{ $in: [] }` filter)
6682
+ * @param filter.visibleToUserId - Restrict to branches visible to this user
6683
+ * under branch RBAC, pushed down as a SQL predicate instead of a preloaded
6684
+ * `branch_id IN (...)` list.
6179
6685
  */
6180
6686
  async findAll(filter) {
6687
+ if (filter?.branchIds !== void 0 && filter.branchIds.length === 0) {
6688
+ return [];
6689
+ }
6181
6690
  const includeArchived = filter?.includeArchived ?? true;
6182
6691
  const conditions = [];
6183
6692
  if (filter?.repo_id) {
6184
- conditions.push((0, import_drizzle_orm16.eq)(branches3.repo_id, filter.repo_id));
6693
+ conditions.push((0, import_drizzle_orm14.eq)(branches3.repo_id, filter.repo_id));
6694
+ }
6695
+ if (filter?.board_id) {
6696
+ conditions.push((0, import_drizzle_orm14.eq)(branches3.board_id, filter.board_id));
6185
6697
  }
6186
- if (!includeArchived) {
6187
- conditions.push((0, import_drizzle_orm16.eq)(branches3.archived, false));
6698
+ if (filter?.archived !== void 0) {
6699
+ conditions.push((0, import_drizzle_orm14.eq)(branches3.archived, filter.archived));
6700
+ } else if (!includeArchived) {
6701
+ conditions.push((0, import_drizzle_orm14.eq)(branches3.archived, false));
6188
6702
  }
6189
- const query = select(this.db).from(branches3);
6190
- const rows = conditions.length > 0 ? await query.where((0, import_drizzle_orm16.and)(...conditions)).all() : await query.all();
6703
+ if (filter?.branchIds !== void 0) {
6704
+ conditions.push((0, import_drizzle_orm14.inArray)(branches3.branch_id, filter.branchIds));
6705
+ }
6706
+ if (filter?.visibleToUserId) {
6707
+ conditions.push(visibleBranchAccessCondition(this.db, filter.visibleToUserId));
6708
+ }
6709
+ const baseQuery = filter?.visibleToUserId ? select(this.db, (0, import_drizzle_orm14.getTableColumns)(branches3)).from(branches3).leftJoin(
6710
+ branchOwners3,
6711
+ (0, import_drizzle_orm14.and)(
6712
+ (0, import_drizzle_orm14.eq)(branchOwners3.branch_id, branches3.branch_id),
6713
+ (0, import_drizzle_orm14.eq)(branchOwners3.user_id, filter.visibleToUserId)
6714
+ )
6715
+ ) : select(this.db).from(branches3);
6716
+ const rows = conditions.length > 0 ? await baseQuery.where((0, import_drizzle_orm14.and)(...conditions)).all() : await baseQuery.all();
6717
+ const baseUrl = await getBaseUrl();
6718
+ return rows.map((row) => this.rowToBranch(row, baseUrl));
6719
+ }
6720
+ /**
6721
+ * Health-monitor discovery query. Returns only routing metadata so the
6722
+ * background monitor can enter the correct tenant DB scope before loading
6723
+ * branch contents or patching health state.
6724
+ */
6725
+ async findActiveEnvironmentRefs() {
6726
+ const tenantColumn = branches3.tenant_id;
6727
+ const columns = isPostgresDatabase(this.db) && tenantColumn ? { branch_id: branches3.branch_id, tenant_id: tenantColumn } : { branch_id: branches3.branch_id };
6728
+ const statusExpr = import_drizzle_orm14.sql`${jsonExtract(this.db, branches3.data, "environment_instance.status")}`;
6729
+ const rows = await select(this.db, columns).from(branches3).where((0, import_drizzle_orm14.or)((0, import_drizzle_orm14.eq)(statusExpr, "running"), (0, import_drizzle_orm14.eq)(statusExpr, "starting"))).all();
6730
+ return rows.map((row) => ({
6731
+ branch_id: row.branch_id,
6732
+ ...typeof row.tenant_id === "string" && row.tenant_id.length > 0 ? { tenant_id: row.tenant_id } : {}
6733
+ }));
6734
+ }
6735
+ /**
6736
+ * Find active assistant branches without paginating the whole branch list first.
6737
+ *
6738
+ * A branch is discoverable as an assistant when it has the canonical assistant
6739
+ * marker in custom_context (new or legacy key), or as a read-time backfill for
6740
+ * older hand-bootstrapped assistants, when it has at least one enabled
6741
+ * first-class schedule.
6742
+ */
6743
+ async findAssistantBranches(filter) {
6744
+ const assistantKindConditions = [
6745
+ (0, import_drizzle_orm14.eq)(import_drizzle_orm14.sql`${jsonExtract(this.db, branches3.data, "custom_context.assistant.kind")}`, "assistant"),
6746
+ (0, import_drizzle_orm14.eq)(
6747
+ import_drizzle_orm14.sql`${jsonExtract(this.db, branches3.data, "custom_context.assistant.kind")}`,
6748
+ "persisted-agent"
6749
+ ),
6750
+ (0, import_drizzle_orm14.eq)(import_drizzle_orm14.sql`${jsonExtract(this.db, branches3.data, "custom_context.agent.kind")}`, "assistant"),
6751
+ (0, import_drizzle_orm14.eq)(
6752
+ import_drizzle_orm14.sql`${jsonExtract(this.db, branches3.data, "custom_context.agent.kind")}`,
6753
+ "persisted-agent"
6754
+ )
6755
+ ];
6756
+ const hasEnabledSchedule = (0, import_drizzle_orm14.exists)(
6757
+ // biome-ignore lint/suspicious/noExplicitAny: Drizzle select has complex cross-dialect overloads
6758
+ this.db.select({ _: import_drizzle_orm14.sql`1` }).from(schedules3).where((0, import_drizzle_orm14.and)((0, import_drizzle_orm14.eq)(schedules3.branch_id, branches3.branch_id), (0, import_drizzle_orm14.eq)(schedules3.enabled, true)))
6759
+ );
6760
+ const conditions = [(0, import_drizzle_orm14.or)(...assistantKindConditions, hasEnabledSchedule) ?? import_drizzle_orm14.sql`false`];
6761
+ if (filter?.repo_id) conditions.push((0, import_drizzle_orm14.eq)(branches3.repo_id, filter.repo_id));
6762
+ if (filter?.archived !== void 0) conditions.push((0, import_drizzle_orm14.eq)(branches3.archived, filter.archived));
6763
+ if (filter?.userId) conditions.push(visibleBranchAccessCondition(this.db, filter.userId));
6764
+ const baseQuery = select(this.db, (0, import_drizzle_orm14.getTableColumns)(branches3)).from(branches3);
6765
+ const query = filter?.userId ? baseQuery.leftJoin(
6766
+ branchOwners3,
6767
+ (0, import_drizzle_orm14.and)(
6768
+ (0, import_drizzle_orm14.eq)(branchOwners3.branch_id, branches3.branch_id),
6769
+ (0, import_drizzle_orm14.eq)(branchOwners3.user_id, filter.userId)
6770
+ )
6771
+ ) : baseQuery;
6772
+ const rows = await query.where((0, import_drizzle_orm14.and)(...conditions)).limit(filter?.limit ?? 200).all();
6191
6773
  const baseUrl = await getBaseUrl();
6192
6774
  return rows.map((row) => this.rowToBranch(row, baseUrl));
6193
6775
  }
@@ -6208,9 +6790,9 @@ var BranchRepository = class {
6208
6790
  txAsDb(tx),
6209
6791
  this.db,
6210
6792
  branches3,
6211
- (0, import_drizzle_orm16.eq)(branches3.branch_id, existing.branch_id)
6793
+ (0, import_drizzle_orm14.eq)(branches3.branch_id, existing.branch_id)
6212
6794
  );
6213
- const currentRow = await select(txAsDb(tx)).from(branches3).where((0, import_drizzle_orm16.eq)(branches3.branch_id, existing.branch_id)).one();
6795
+ const currentRow = await select(txAsDb(tx)).from(branches3).where((0, import_drizzle_orm14.eq)(branches3.branch_id, existing.branch_id)).one();
6214
6796
  if (!currentRow) {
6215
6797
  throw new EntityNotFoundError("Branch", id);
6216
6798
  }
@@ -6227,7 +6809,7 @@ var BranchRepository = class {
6227
6809
  // Always update timestamp
6228
6810
  });
6229
6811
  const insertData = this.branchToInsert(merged);
6230
- const row = await update(txAsDb(tx), branches3).set(insertData).where((0, import_drizzle_orm16.eq)(branches3.branch_id, current.branch_id)).returning().one();
6812
+ const row = await update(txAsDb(tx), branches3).set(insertData).where((0, import_drizzle_orm14.eq)(branches3.branch_id, current.branch_id)).returning().one();
6231
6813
  return this.rowToBranch(row, baseUrl);
6232
6814
  });
6233
6815
  }
@@ -6239,13 +6821,13 @@ var BranchRepository = class {
6239
6821
  if (!existing) {
6240
6822
  throw new EntityNotFoundError("Branch", id);
6241
6823
  }
6242
- await deleteFrom(this.db, branches3).where((0, import_drizzle_orm16.eq)(branches3.branch_id, existing.branch_id)).run();
6824
+ await deleteFrom(this.db, branches3).where((0, import_drizzle_orm14.eq)(branches3.branch_id, existing.branch_id)).run();
6243
6825
  }
6244
6826
  /**
6245
6827
  * Find branch by repo_id and name
6246
6828
  */
6247
6829
  async findByRepoAndName(repoId, name) {
6248
- const row = await select(this.db).from(branches3).where((0, import_drizzle_orm16.and)((0, import_drizzle_orm16.eq)(branches3.repo_id, repoId), (0, import_drizzle_orm16.eq)(branches3.name, name))).one();
6830
+ const row = await select(this.db).from(branches3).where((0, import_drizzle_orm14.and)((0, import_drizzle_orm14.eq)(branches3.repo_id, repoId), (0, import_drizzle_orm14.eq)(branches3.name, name))).one();
6249
6831
  if (!row) return null;
6250
6832
  const baseUrl = await getBaseUrl();
6251
6833
  return this.rowToBranch(row, baseUrl);
@@ -6255,7 +6837,7 @@ var BranchRepository = class {
6255
6837
  */
6256
6838
  async findActiveByRepoAndName(repoId, name) {
6257
6839
  const row = await select(this.db).from(branches3).where(
6258
- (0, import_drizzle_orm16.and)((0, import_drizzle_orm16.eq)(branches3.repo_id, repoId), (0, import_drizzle_orm16.eq)(branches3.name, name), (0, import_drizzle_orm16.eq)(branches3.archived, false))
6840
+ (0, import_drizzle_orm14.and)((0, import_drizzle_orm14.eq)(branches3.repo_id, repoId), (0, import_drizzle_orm14.eq)(branches3.name, name), (0, import_drizzle_orm14.eq)(branches3.archived, false))
6259
6841
  ).one();
6260
6842
  if (!row) return null;
6261
6843
  const baseUrl = await getBaseUrl();
@@ -6274,7 +6856,7 @@ var BranchRepository = class {
6274
6856
  * Used for auto-suffix name conflict resolution — bypasses Feathers pagination.
6275
6857
  */
6276
6858
  async getActiveNamesByRepo(repoId) {
6277
- const rows = await select(this.db, { name: branches3.name }).from(branches3).where((0, import_drizzle_orm16.and)((0, import_drizzle_orm16.eq)(branches3.repo_id, repoId), (0, import_drizzle_orm16.eq)(branches3.archived, false))).all();
6859
+ const rows = await select(this.db, { name: branches3.name }).from(branches3).where((0, import_drizzle_orm14.and)((0, import_drizzle_orm14.eq)(branches3.repo_id, repoId), (0, import_drizzle_orm14.eq)(branches3.archived, false))).all();
6278
6860
  return rows.map((row) => row.name);
6279
6861
  }
6280
6862
  // ===== RBAC: Ownership Management =====
@@ -6286,7 +6868,7 @@ var BranchRepository = class {
6286
6868
  * @returns true if user is an owner
6287
6869
  */
6288
6870
  async isOwner(branchId, userId) {
6289
- const row = await select(this.db).from(branchOwners3).where((0, import_drizzle_orm16.and)((0, import_drizzle_orm16.eq)(branchOwners3.branch_id, branchId), (0, import_drizzle_orm16.eq)(branchOwners3.user_id, userId))).one();
6871
+ const row = await select(this.db).from(branchOwners3).where((0, import_drizzle_orm14.and)((0, import_drizzle_orm14.eq)(branchOwners3.branch_id, branchId), (0, import_drizzle_orm14.eq)(branchOwners3.user_id, userId))).one();
6290
6872
  return row != null;
6291
6873
  }
6292
6874
  /**
@@ -6298,17 +6880,17 @@ var BranchRepository = class {
6298
6880
  async getBestGroupGrantForUser(branchId, userId) {
6299
6881
  const rows = await select(this.db).from(branchGroupGrants3).innerJoin(
6300
6882
  groupMemberships3,
6301
- (0, import_drizzle_orm16.and)(
6302
- (0, import_drizzle_orm16.eq)(groupMemberships3.group_id, branchGroupGrants3.group_id),
6303
- (0, import_drizzle_orm16.eq)(groupMemberships3.user_id, userId)
6883
+ (0, import_drizzle_orm14.and)(
6884
+ (0, import_drizzle_orm14.eq)(groupMemberships3.group_id, branchGroupGrants3.group_id),
6885
+ (0, import_drizzle_orm14.eq)(groupMemberships3.user_id, userId)
6304
6886
  )
6305
6887
  ).innerJoin(
6306
6888
  groups3,
6307
- (0, import_drizzle_orm16.and)((0, import_drizzle_orm16.eq)(groups3.group_id, branchGroupGrants3.group_id), (0, import_drizzle_orm16.eq)(groups3.archived, false))
6889
+ (0, import_drizzle_orm14.and)((0, import_drizzle_orm14.eq)(groups3.group_id, branchGroupGrants3.group_id), (0, import_drizzle_orm14.eq)(groups3.archived, false))
6308
6890
  ).where(
6309
- (0, import_drizzle_orm16.and)(
6310
- (0, import_drizzle_orm16.eq)(branchGroupGrants3.branch_id, branchId),
6311
- (0, import_drizzle_orm16.inArray)(branchGroupGrants3.can, BRANCH_PERMISSION_LEVELS)
6891
+ (0, import_drizzle_orm14.and)(
6892
+ (0, import_drizzle_orm14.eq)(branchGroupGrants3.branch_id, branchId),
6893
+ (0, import_drizzle_orm14.inArray)(branchGroupGrants3.can, BRANCH_PERMISSION_LEVELS)
6312
6894
  )
6313
6895
  ).all();
6314
6896
  let best = null;
@@ -6338,7 +6920,7 @@ var BranchRepository = class {
6338
6920
  * this method.
6339
6921
  */
6340
6922
  async resolveUserAccess(branch, userId) {
6341
- const board = branch.permission_source === "board" && branch.board_id ? await select(this.db, { data: boards3.data, board_id: boards3.board_id }).from(boards3).where((0, import_drizzle_orm16.eq)(boards3.board_id, branch.board_id)).one() : null;
6923
+ const board = branch.permission_source === "board" && branch.board_id ? await select(this.db, { data: boards3.data, board_id: boards3.board_id }).from(boards3).where((0, import_drizzle_orm14.eq)(boards3.board_id, branch.board_id)).one() : null;
6342
6924
  const boardData = board?.data;
6343
6925
  const boardIsShared = (boardData?.access_mode ?? "shared") === "shared";
6344
6926
  const sharing = branch.permission_source === "board" && boardIsShared ? boardData?.default_dangerously_allow_session_sharing ?? false : branch.dangerously_allow_session_sharing ?? false;
@@ -6354,7 +6936,7 @@ var BranchRepository = class {
6354
6936
  const groupRepo = new GroupRepository(this.db);
6355
6937
  const branchGroupGrants4 = await groupRepo.getBranchGrantsForUser(branch.branch_id, userId);
6356
6938
  if (branch.permission_source === "board" && branch.board_id) {
6357
- const boardOwner = await select(this.db).from(boardOwners3).where((0, import_drizzle_orm16.and)((0, import_drizzle_orm16.eq)(boardOwners3.board_id, branch.board_id), (0, import_drizzle_orm16.eq)(boardOwners3.user_id, userId))).one();
6939
+ const boardOwner = await select(this.db).from(boardOwners3).where((0, import_drizzle_orm14.and)((0, import_drizzle_orm14.eq)(boardOwners3.board_id, branch.board_id), (0, import_drizzle_orm14.eq)(boardOwners3.user_id, userId))).one();
6358
6940
  if (boardOwner) {
6359
6941
  return {
6360
6942
  can: "all",
@@ -6411,34 +6993,34 @@ var BranchRepository = class {
6411
6993
  const branchRow = await select(this.db, {
6412
6994
  board_id: branches3.board_id,
6413
6995
  permission_source: branches3.permission_source
6414
- }).from(branches3).where((0, import_drizzle_orm16.eq)(branches3.branch_id, branchId)).one();
6415
- const ownerRows = await select(this.db, { user_id: branchOwners3.user_id }).from(branchOwners3).where((0, import_drizzle_orm16.eq)(branchOwners3.branch_id, branchId)).all();
6416
- const groupRows = await select(this.db, { user_id: groupMemberships3.user_id }).from(branchGroupGrants3).innerJoin(groupMemberships3, (0, import_drizzle_orm16.eq)(groupMemberships3.group_id, branchGroupGrants3.group_id)).innerJoin(
6996
+ }).from(branches3).where((0, import_drizzle_orm14.eq)(branches3.branch_id, branchId)).one();
6997
+ const ownerRows = await select(this.db, { user_id: branchOwners3.user_id }).from(branchOwners3).where((0, import_drizzle_orm14.eq)(branchOwners3.branch_id, branchId)).all();
6998
+ const groupRows = await select(this.db, { user_id: groupMemberships3.user_id }).from(branchGroupGrants3).innerJoin(groupMemberships3, (0, import_drizzle_orm14.eq)(groupMemberships3.group_id, branchGroupGrants3.group_id)).innerJoin(
6417
6999
  groups3,
6418
- (0, import_drizzle_orm16.and)((0, import_drizzle_orm16.eq)(groups3.group_id, branchGroupGrants3.group_id), (0, import_drizzle_orm16.eq)(groups3.archived, false))
7000
+ (0, import_drizzle_orm14.and)((0, import_drizzle_orm14.eq)(groups3.group_id, branchGroupGrants3.group_id), (0, import_drizzle_orm14.eq)(groups3.archived, false))
6419
7001
  ).where(
6420
- (0, import_drizzle_orm16.and)(
6421
- (0, import_drizzle_orm16.eq)(branchGroupGrants3.branch_id, branchId),
6422
- (0, import_drizzle_orm16.inArray)(branchGroupGrants3.can, VIEW_OR_BETTER_BRANCH_PERMISSIONS)
7002
+ (0, import_drizzle_orm14.and)(
7003
+ (0, import_drizzle_orm14.eq)(branchGroupGrants3.branch_id, branchId),
7004
+ (0, import_drizzle_orm14.inArray)(branchGroupGrants3.can, VIEW_OR_BETTER_BRANCH_PERMISSIONS)
6423
7005
  )
6424
7006
  ).all();
6425
- const boardOwnerRows = branchRow?.permission_source === "board" && branchRow.board_id ? await select(this.db, { user_id: boardOwners3.user_id }).from(boardOwners3).where((0, import_drizzle_orm16.eq)(boardOwners3.board_id, branchRow.board_id)).all() : [];
6426
- const boardGroupRows = branchRow?.permission_source === "board" && branchRow.board_id ? await select(this.db, { user_id: groupMemberships3.user_id }).from(boardGroupGrants3).innerJoin(groupMemberships3, (0, import_drizzle_orm16.eq)(groupMemberships3.group_id, boardGroupGrants3.group_id)).innerJoin(
7007
+ const boardOwnerRows = branchRow?.permission_source === "board" && branchRow.board_id ? await select(this.db, { user_id: boardOwners3.user_id }).from(boardOwners3).where((0, import_drizzle_orm14.eq)(boardOwners3.board_id, branchRow.board_id)).all() : [];
7008
+ const boardGroupRows = branchRow?.permission_source === "board" && branchRow.board_id ? await select(this.db, { user_id: groupMemberships3.user_id }).from(boardGroupGrants3).innerJoin(groupMemberships3, (0, import_drizzle_orm14.eq)(groupMemberships3.group_id, boardGroupGrants3.group_id)).innerJoin(
6427
7009
  groups3,
6428
- (0, import_drizzle_orm16.and)((0, import_drizzle_orm16.eq)(groups3.group_id, boardGroupGrants3.group_id), (0, import_drizzle_orm16.eq)(groups3.archived, false))
7010
+ (0, import_drizzle_orm14.and)((0, import_drizzle_orm14.eq)(groups3.group_id, boardGroupGrants3.group_id), (0, import_drizzle_orm14.eq)(groups3.archived, false))
6429
7011
  ).innerJoin(
6430
7012
  boards3,
6431
- (0, import_drizzle_orm16.and)(
6432
- (0, import_drizzle_orm16.eq)(boards3.board_id, boardGroupGrants3.board_id),
6433
- (0, import_drizzle_orm16.eq)(
6434
- import_drizzle_orm16.sql`coalesce(${jsonExtract(this.db, boards3.data, "access_mode")}, 'shared')`,
7013
+ (0, import_drizzle_orm14.and)(
7014
+ (0, import_drizzle_orm14.eq)(boards3.board_id, boardGroupGrants3.board_id),
7015
+ (0, import_drizzle_orm14.eq)(
7016
+ import_drizzle_orm14.sql`coalesce(${jsonExtract(this.db, boards3.data, "access_mode")}, 'shared')`,
6435
7017
  "shared"
6436
7018
  )
6437
7019
  )
6438
7020
  ).where(
6439
- (0, import_drizzle_orm16.and)(
6440
- (0, import_drizzle_orm16.eq)(boardGroupGrants3.board_id, branchRow.board_id),
6441
- (0, import_drizzle_orm16.inArray)(boardGroupGrants3.can, VIEW_OR_BETTER_BRANCH_PERMISSIONS)
7021
+ (0, import_drizzle_orm14.and)(
7022
+ (0, import_drizzle_orm14.eq)(boardGroupGrants3.board_id, branchRow.board_id),
7023
+ (0, import_drizzle_orm14.inArray)(boardGroupGrants3.can, VIEW_OR_BETTER_BRANCH_PERMISSIONS)
6442
7024
  )
6443
7025
  ).all() : [];
6444
7026
  const userIds = /* @__PURE__ */ new Set();
@@ -6470,39 +7052,39 @@ var BranchRepository = class {
6470
7052
  const branchRow = await select(this.db, {
6471
7053
  board_id: branches3.board_id,
6472
7054
  permission_source: branches3.permission_source
6473
- }).from(branches3).where((0, import_drizzle_orm16.eq)(branches3.branch_id, branchId)).one();
6474
- const ownerRows = await select(this.db, { user_id: branchOwners3.user_id }).from(branchOwners3).where((0, import_drizzle_orm16.eq)(branchOwners3.branch_id, branchId)).all();
6475
- const groupRows = await select(this.db, { user_id: groupMemberships3.user_id }).from(branchGroupGrants3).innerJoin(groupMemberships3, (0, import_drizzle_orm16.eq)(groupMemberships3.group_id, branchGroupGrants3.group_id)).innerJoin(
7055
+ }).from(branches3).where((0, import_drizzle_orm14.eq)(branches3.branch_id, branchId)).one();
7056
+ const ownerRows = await select(this.db, { user_id: branchOwners3.user_id }).from(branchOwners3).where((0, import_drizzle_orm14.eq)(branchOwners3.branch_id, branchId)).all();
7057
+ const groupRows = await select(this.db, { user_id: groupMemberships3.user_id }).from(branchGroupGrants3).innerJoin(groupMemberships3, (0, import_drizzle_orm14.eq)(groupMemberships3.group_id, branchGroupGrants3.group_id)).innerJoin(
6476
7058
  groups3,
6477
- (0, import_drizzle_orm16.and)((0, import_drizzle_orm16.eq)(groups3.group_id, branchGroupGrants3.group_id), (0, import_drizzle_orm16.eq)(groups3.archived, false))
7059
+ (0, import_drizzle_orm14.and)((0, import_drizzle_orm14.eq)(groups3.group_id, branchGroupGrants3.group_id), (0, import_drizzle_orm14.eq)(groups3.archived, false))
6478
7060
  ).where(
6479
- (0, import_drizzle_orm16.and)(
6480
- (0, import_drizzle_orm16.eq)(branchGroupGrants3.branch_id, branchId),
6481
- (0, import_drizzle_orm16.inArray)(
6482
- import_drizzle_orm16.sql`coalesce(${branchGroupGrants3.fs_access}, 'read')`,
7061
+ (0, import_drizzle_orm14.and)(
7062
+ (0, import_drizzle_orm14.eq)(branchGroupGrants3.branch_id, branchId),
7063
+ (0, import_drizzle_orm14.inArray)(
7064
+ import_drizzle_orm14.sql`coalesce(${branchGroupGrants3.fs_access}, 'read')`,
6483
7065
  FS_ACCESS_BRANCH_PERMISSIONS
6484
7066
  )
6485
7067
  )
6486
7068
  ).all();
6487
7069
  const isBoardAligned = branchRow?.permission_source === "board" && branchRow.board_id;
6488
- const boardOwnerRows = isBoardAligned ? await select(this.db, { user_id: boardOwners3.user_id }).from(boardOwners3).where((0, import_drizzle_orm16.eq)(boardOwners3.board_id, branchRow.board_id)).all() : [];
6489
- const boardGroupRows = isBoardAligned ? await select(this.db, { user_id: groupMemberships3.user_id }).from(boardGroupGrants3).innerJoin(groupMemberships3, (0, import_drizzle_orm16.eq)(groupMemberships3.group_id, boardGroupGrants3.group_id)).innerJoin(
7070
+ const boardOwnerRows = isBoardAligned ? await select(this.db, { user_id: boardOwners3.user_id }).from(boardOwners3).where((0, import_drizzle_orm14.eq)(boardOwners3.board_id, branchRow.board_id)).all() : [];
7071
+ const boardGroupRows = isBoardAligned ? await select(this.db, { user_id: groupMemberships3.user_id }).from(boardGroupGrants3).innerJoin(groupMemberships3, (0, import_drizzle_orm14.eq)(groupMemberships3.group_id, boardGroupGrants3.group_id)).innerJoin(
6490
7072
  groups3,
6491
- (0, import_drizzle_orm16.and)((0, import_drizzle_orm16.eq)(groups3.group_id, boardGroupGrants3.group_id), (0, import_drizzle_orm16.eq)(groups3.archived, false))
7073
+ (0, import_drizzle_orm14.and)((0, import_drizzle_orm14.eq)(groups3.group_id, boardGroupGrants3.group_id), (0, import_drizzle_orm14.eq)(groups3.archived, false))
6492
7074
  ).innerJoin(
6493
7075
  boards3,
6494
- (0, import_drizzle_orm16.and)(
6495
- (0, import_drizzle_orm16.eq)(boards3.board_id, boardGroupGrants3.board_id),
6496
- (0, import_drizzle_orm16.eq)(
6497
- import_drizzle_orm16.sql`coalesce(${jsonExtract(this.db, boards3.data, "access_mode")}, 'shared')`,
7076
+ (0, import_drizzle_orm14.and)(
7077
+ (0, import_drizzle_orm14.eq)(boards3.board_id, boardGroupGrants3.board_id),
7078
+ (0, import_drizzle_orm14.eq)(
7079
+ import_drizzle_orm14.sql`coalesce(${jsonExtract(this.db, boards3.data, "access_mode")}, 'shared')`,
6498
7080
  "shared"
6499
7081
  )
6500
7082
  )
6501
7083
  ).where(
6502
- (0, import_drizzle_orm16.and)(
6503
- (0, import_drizzle_orm16.eq)(boardGroupGrants3.board_id, branchRow.board_id),
6504
- (0, import_drizzle_orm16.inArray)(
6505
- import_drizzle_orm16.sql`coalesce(${boardGroupGrants3.fs_access}, 'read')`,
7084
+ (0, import_drizzle_orm14.and)(
7085
+ (0, import_drizzle_orm14.eq)(boardGroupGrants3.board_id, branchRow.board_id),
7086
+ (0, import_drizzle_orm14.inArray)(
7087
+ import_drizzle_orm14.sql`coalesce(${boardGroupGrants3.fs_access}, 'read')`,
6506
7088
  FS_ACCESS_BRANCH_PERMISSIONS
6507
7089
  )
6508
7090
  )
@@ -6524,10 +7106,10 @@ var BranchRepository = class {
6524
7106
  }
6525
7107
  async findBoardAlignedBranches(boardId) {
6526
7108
  const rows = await select(this.db).from(branches3).where(
6527
- (0, import_drizzle_orm16.and)(
6528
- (0, import_drizzle_orm16.eq)(branches3.board_id, boardId),
6529
- (0, import_drizzle_orm16.eq)(branches3.permission_source, "board"),
6530
- (0, import_drizzle_orm16.eq)(branches3.archived, false)
7109
+ (0, import_drizzle_orm14.and)(
7110
+ (0, import_drizzle_orm14.eq)(branches3.board_id, boardId),
7111
+ (0, import_drizzle_orm14.eq)(branches3.permission_source, "board"),
7112
+ (0, import_drizzle_orm14.eq)(branches3.archived, false)
6531
7113
  )
6532
7114
  ).all();
6533
7115
  const baseUrl = await getBaseUrl();
@@ -6544,7 +7126,7 @@ var BranchRepository = class {
6544
7126
  if (!branch) {
6545
7127
  throw new EntityNotFoundError("Branch", branchId);
6546
7128
  }
6547
- const rows = await select(this.db).from(branchOwners3).where((0, import_drizzle_orm16.eq)(branchOwners3.branch_id, branch.branch_id)).all();
7129
+ const rows = await select(this.db).from(branchOwners3).where((0, import_drizzle_orm14.eq)(branchOwners3.branch_id, branch.branch_id)).all();
6548
7130
  return rows.map((row) => row.user_id);
6549
7131
  }
6550
7132
  /**
@@ -6584,7 +7166,7 @@ var BranchRepository = class {
6584
7166
  if (!branch) {
6585
7167
  throw new EntityNotFoundError("Branch", branchId);
6586
7168
  }
6587
- await deleteFrom(this.db, branchOwners3).where((0, import_drizzle_orm16.and)((0, import_drizzle_orm16.eq)(branchOwners3.branch_id, branch.branch_id), (0, import_drizzle_orm16.eq)(branchOwners3.user_id, userId))).run();
7169
+ await deleteFrom(this.db, branchOwners3).where((0, import_drizzle_orm14.and)((0, import_drizzle_orm14.eq)(branchOwners3.branch_id, branch.branch_id), (0, import_drizzle_orm14.eq)(branchOwners3.user_id, userId))).run();
6588
7170
  }
6589
7171
  /**
6590
7172
  * Bulk-load ownership for multiple branches
@@ -6599,7 +7181,7 @@ var BranchRepository = class {
6599
7181
  if (branchIds.length === 0) {
6600
7182
  return /* @__PURE__ */ new Map();
6601
7183
  }
6602
- const rows = await select(this.db).from(branchOwners3).where((0, import_drizzle_orm16.inArray)(branchOwners3.branch_id, branchIds)).all();
7184
+ const rows = await select(this.db).from(branchOwners3).where((0, import_drizzle_orm14.inArray)(branchOwners3.branch_id, branchIds)).all();
6603
7185
  const ownersByBranch = /* @__PURE__ */ new Map();
6604
7186
  for (const row of rows) {
6605
7187
  const wtId = row.branch_id;
@@ -6630,14 +7212,14 @@ var BranchRepository = class {
6630
7212
  async findAccessibleBranches(userId, filter) {
6631
7213
  const conditions = [visibleBranchAccessCondition(this.db, userId)];
6632
7214
  if (filter?.archived === true) {
6633
- conditions.push((0, import_drizzle_orm16.eq)(branches3.archived, true));
7215
+ conditions.push((0, import_drizzle_orm14.eq)(branches3.archived, true));
6634
7216
  } else if (filter?.archived === false) {
6635
- conditions.push((0, import_drizzle_orm16.eq)(branches3.archived, false));
7217
+ conditions.push((0, import_drizzle_orm14.eq)(branches3.archived, false));
6636
7218
  }
6637
- const rows = await select(this.db, (0, import_drizzle_orm16.getTableColumns)(branches3)).from(branches3).leftJoin(
7219
+ const rows = await select(this.db, (0, import_drizzle_orm14.getTableColumns)(branches3)).from(branches3).leftJoin(
6638
7220
  branchOwners3,
6639
- (0, import_drizzle_orm16.and)((0, import_drizzle_orm16.eq)(branchOwners3.branch_id, branches3.branch_id), (0, import_drizzle_orm16.eq)(branchOwners3.user_id, userId))
6640
- ).where((0, import_drizzle_orm16.and)(...conditions)).all();
7221
+ (0, import_drizzle_orm14.and)((0, import_drizzle_orm14.eq)(branchOwners3.branch_id, branches3.branch_id), (0, import_drizzle_orm14.eq)(branchOwners3.user_id, userId))
7222
+ ).where((0, import_drizzle_orm14.and)(...conditions)).all();
6641
7223
  const baseUrl = await getBaseUrl();
6642
7224
  const seen = /* @__PURE__ */ new Set();
6643
7225
  const result = [];
@@ -6660,7 +7242,7 @@ var BranchRepository = class {
6660
7242
  const { jsonExtract: jsonExtract2 } = await Promise.resolve().then(() => (init_database_wrapper(), database_wrapper_exports));
6661
7243
  const rows = await select(this.db, {
6662
7244
  branch_id: boardObjectsTable.branch_id
6663
- }).from(boardObjectsTable).where(import_drizzle_orm16.sql`${jsonExtract2(this.db, boardObjectsTable.data, "zone_id")} = ${zoneId}`).all();
7245
+ }).from(boardObjectsTable).where(import_drizzle_orm14.sql`${jsonExtract2(this.db, boardObjectsTable.data, "zone_id")} = ${zoneId}`).all();
6664
7246
  const uniqueIds = /* @__PURE__ */ new Set();
6665
7247
  for (const row of rows) {
6666
7248
  if (row.branch_id) {
@@ -6712,7 +7294,7 @@ var BranchRepository = class {
6712
7294
  zone_id: jsonExtract2(this.db, boardObjectsTable.data, "zone_id"),
6713
7295
  position: jsonExtract2(this.db, boardObjectsTable.data, "position"),
6714
7296
  board_data: boardsTable.data
6715
- }).from(boardObjectsTable).leftJoin(boardsTable, (0, import_drizzle_orm16.eq)(boardObjectsTable.board_id, boardsTable.board_id)).where((0, import_drizzle_orm16.inArray)(boardObjectsTable.branch_id, branchIds)).all();
7297
+ }).from(boardObjectsTable).leftJoin(boardsTable, (0, import_drizzle_orm14.eq)(boardObjectsTable.board_id, boardsTable.board_id)).where((0, import_drizzle_orm14.inArray)(boardObjectsTable.branch_id, branchIds)).all();
6716
7298
  const boardObjectInfoByBranch = /* @__PURE__ */ new Map();
6717
7299
  for (const row of rows) {
6718
7300
  const info = {
@@ -6791,7 +7373,7 @@ var BranchRepository = class {
6791
7373
  agentic_tool: sessionsTable.agentic_tool,
6792
7374
  updated_at: sessionsTable.updated_at,
6793
7375
  unix_username: sessionsTable.unix_username
6794
- }).from(sessionsTable).where((0, import_drizzle_orm16.inArray)(sessionsTable.branch_id, branchIds)).orderBy(sessionsTable.updated_at).all();
7376
+ }).from(sessionsTable).where((0, import_drizzle_orm14.inArray)(sessionsTable.branch_id, branchIds)).orderBy(sessionsTable.updated_at).all();
6795
7377
  const sessionIds = sessionRows.map((s) => s.session_id);
6796
7378
  if (sessionIds.length === 0) {
6797
7379
  return branches4.map((wt) => ({ ...wt, sessions: [] }));
@@ -6800,8 +7382,8 @@ var BranchRepository = class {
6800
7382
  for (const sessionId of sessionIds) {
6801
7383
  const query = select(this.db, {
6802
7384
  data: messagesTable.data
6803
- }).from(messagesTable).where((0, import_drizzle_orm16.and)((0, import_drizzle_orm16.eq)(messagesTable.session_id, sessionId), (0, import_drizzle_orm16.eq)(messagesTable.role, "assistant")));
6804
- const lastMessage = await query.orderBy((0, import_drizzle_orm16.desc)(messagesTable.index)).limit(1).one();
7385
+ }).from(messagesTable).where((0, import_drizzle_orm14.and)((0, import_drizzle_orm14.eq)(messagesTable.session_id, sessionId), (0, import_drizzle_orm14.eq)(messagesTable.role, "assistant")));
7386
+ const lastMessage = await query.orderBy((0, import_drizzle_orm14.desc)(messagesTable.index)).limit(1).one();
6805
7387
  if (lastMessage) {
6806
7388
  const messageData = lastMessage.data;
6807
7389
  let fullText = "";
@@ -6816,8 +7398,8 @@ var BranchRepository = class {
6816
7398
  }
6817
7399
  const countRows = await select(this.db, {
6818
7400
  session_id: messagesTable.session_id,
6819
- count: import_drizzle_orm16.sql`count(*)`
6820
- }).from(messagesTable).where((0, import_drizzle_orm16.inArray)(messagesTable.session_id, sessionIds)).groupBy(messagesTable.session_id).all();
7401
+ count: import_drizzle_orm14.sql`count(*)`
7402
+ }).from(messagesTable).where((0, import_drizzle_orm14.inArray)(messagesTable.session_id, sessionIds)).groupBy(messagesTable.session_id).all();
6821
7403
  const messageCountBySession = /* @__PURE__ */ new Map();
6822
7404
  for (const r of countRows) {
6823
7405
  messageCountBySession.set(r.session_id, Number(r.count));
@@ -6869,14 +7451,14 @@ var BranchRepository = class {
6869
7451
 
6870
7452
  // src/db/repositories/card-types.ts
6871
7453
  init_cjs_shims();
6872
- var import_drizzle_orm18 = require("drizzle-orm");
7454
+ var import_drizzle_orm16 = require("drizzle-orm");
6873
7455
  init_ids();
6874
7456
  init_database_wrapper();
6875
7457
  init_schema();
6876
7458
 
6877
7459
  // src/db/repositories/cards.ts
6878
7460
  init_cjs_shims();
6879
- var import_drizzle_orm19 = require("drizzle-orm");
7461
+ var import_drizzle_orm17 = require("drizzle-orm");
6880
7462
  init_ids();
6881
7463
  init_database_wrapper();
6882
7464
  init_schema();
@@ -6884,16 +7466,24 @@ init_schema();
6884
7466
  // src/db/repositories/gateway-channels.ts
6885
7467
  init_cjs_shims();
6886
7468
  init_types2();
6887
- var import_drizzle_orm20 = require("drizzle-orm");
7469
+ var import_drizzle_orm18 = require("drizzle-orm");
7470
+ init_ids();
7471
+ init_database_wrapper();
7472
+ init_schema();
7473
+
7474
+ // src/db/repositories/gateway-outbound-messages.ts
7475
+ init_cjs_shims();
7476
+ init_types2();
7477
+ var import_drizzle_orm19 = require("drizzle-orm");
6888
7478
  init_ids();
6889
7479
  init_database_wrapper();
6890
7480
  init_schema();
6891
7481
 
6892
7482
  // src/db/repositories/knowledge.ts
6893
7483
  init_cjs_shims();
6894
- var import_node_crypto4 = require("crypto");
7484
+ var import_node_crypto3 = require("crypto");
6895
7485
  init_types2();
6896
- var import_drizzle_orm21 = require("drizzle-orm");
7486
+ var import_drizzle_orm20 = require("drizzle-orm");
6897
7487
  init_config_manager();
6898
7488
  init_ids();
6899
7489
  init_database_wrapper();
@@ -6901,7 +7491,7 @@ init_schema();
6901
7491
 
6902
7492
  // src/db/repositories/mcp-servers.ts
6903
7493
  init_cjs_shims();
6904
- var import_drizzle_orm22 = require("drizzle-orm");
7494
+ var import_drizzle_orm21 = require("drizzle-orm");
6905
7495
  init_ids();
6906
7496
 
6907
7497
  // src/tools/mcp/auth-secrets.ts
@@ -6916,13 +7506,13 @@ init_schema();
6916
7506
 
6917
7507
  // src/db/repositories/messages.ts
6918
7508
  init_cjs_shims();
6919
- var import_drizzle_orm23 = require("drizzle-orm");
7509
+ var import_drizzle_orm22 = require("drizzle-orm");
6920
7510
  init_database_wrapper();
6921
7511
  init_schema();
6922
7512
 
6923
7513
  // src/db/repositories/repos.ts
6924
7514
  init_cjs_shims();
6925
- var import_drizzle_orm24 = require("drizzle-orm");
7515
+ var import_drizzle_orm23 = require("drizzle-orm");
6926
7516
  init_ids();
6927
7517
  init_database_wrapper();
6928
7518
  init_schema();
@@ -6958,20 +7548,23 @@ var RepoRepository = class {
6958
7548
  const environment = data.environment ?? wrapV1AsV2(data.environment_config);
6959
7549
  const environment_config = data.environment_config ?? deriveV1FromV2(environment);
6960
7550
  const remote_url = typeof data.remote_url === "string" ? stripHttpUrlUserinfo(data.remote_url) : data.remote_url;
6961
- return {
6962
- repo_id: row.repo_id,
6963
- slug: row.slug,
6964
- repo_type: row.repo_type ?? "remote",
6965
- unix_group: row.unix_group ?? void 0,
6966
- created_at: new Date(row.created_at).toISOString(),
6967
- last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
6968
- ...data,
6969
- remote_url,
6970
- environment,
6971
- environment_config,
6972
- clone_status: data.clone_status,
6973
- clone_error: data.clone_error
6974
- };
7551
+ return attachHiddenTenant(
7552
+ {
7553
+ repo_id: row.repo_id,
7554
+ slug: row.slug,
7555
+ repo_type: row.repo_type ?? "remote",
7556
+ unix_group: row.unix_group ?? void 0,
7557
+ created_at: new Date(row.created_at).toISOString(),
7558
+ last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
7559
+ ...data,
7560
+ remote_url,
7561
+ environment,
7562
+ environment_config,
7563
+ clone_status: data.clone_status,
7564
+ clone_error: data.clone_error
7565
+ },
7566
+ row
7567
+ );
6975
7568
  }
6976
7569
  /**
6977
7570
  * Convert Repo to database insert format
@@ -7021,7 +7614,7 @@ var RepoRepository = class {
7021
7614
  */
7022
7615
  async resolveId(id) {
7023
7616
  return resolveByShortIdPrefix(id, "Repo", async (pattern) => {
7024
- const rows = await select(this.db).from(repos3).where((0, import_drizzle_orm24.like)(repos3.repo_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
7617
+ const rows = await select(this.db).from(repos3).where((0, import_drizzle_orm23.like)(repos3.repo_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
7025
7618
  return rows.map((r) => r.repo_id);
7026
7619
  });
7027
7620
  }
@@ -7032,7 +7625,7 @@ var RepoRepository = class {
7032
7625
  try {
7033
7626
  const insertData = this.repoToInsert(data);
7034
7627
  await insert(this.db, repos3).values(insertData).run();
7035
- const row = await select(this.db).from(repos3).where((0, import_drizzle_orm24.eq)(repos3.repo_id, insertData.repo_id)).one();
7628
+ const row = await select(this.db).from(repos3).where((0, import_drizzle_orm23.eq)(repos3.repo_id, insertData.repo_id)).one();
7036
7629
  if (!row) {
7037
7630
  throw new RepositoryError("Failed to retrieve created repo");
7038
7631
  }
@@ -7051,7 +7644,7 @@ var RepoRepository = class {
7051
7644
  async findById(id) {
7052
7645
  try {
7053
7646
  const fullId = await this.resolveId(id);
7054
- const row = await select(this.db).from(repos3).where((0, import_drizzle_orm24.eq)(repos3.repo_id, fullId)).one();
7647
+ const row = await select(this.db).from(repos3).where((0, import_drizzle_orm23.eq)(repos3.repo_id, fullId)).one();
7055
7648
  return row ? this.rowToRepo(row) : null;
7056
7649
  } catch (error) {
7057
7650
  if (error instanceof EntityNotFoundError) return null;
@@ -7067,7 +7660,7 @@ var RepoRepository = class {
7067
7660
  */
7068
7661
  async findBySlug(slug) {
7069
7662
  try {
7070
- const row = await select(this.db).from(repos3).where((0, import_drizzle_orm24.eq)(repos3.slug, slug)).one();
7663
+ const row = await select(this.db).from(repos3).where((0, import_drizzle_orm23.eq)(repos3.slug, slug)).one();
7071
7664
  return row ? this.rowToRepo(row) : null;
7072
7665
  } catch (error) {
7073
7666
  throw new RepositoryError(
@@ -7135,8 +7728,8 @@ var RepoRepository = class {
7135
7728
  let changed = 0;
7136
7729
  for (const finding of scan.findings) {
7137
7730
  await this.db.transaction(async (tx) => {
7138
- await lockRowForUpdate(txAsDb(tx), this.db, repos3, (0, import_drizzle_orm24.eq)(repos3.repo_id, finding.repo_id));
7139
- const currentRow = await select(txAsDb(tx)).from(repos3).where((0, import_drizzle_orm24.eq)(repos3.repo_id, finding.repo_id)).one();
7731
+ await lockRowForUpdate(txAsDb(tx), this.db, repos3, (0, import_drizzle_orm23.eq)(repos3.repo_id, finding.repo_id));
7732
+ const currentRow = await select(txAsDb(tx)).from(repos3).where((0, import_drizzle_orm23.eq)(repos3.repo_id, finding.repo_id)).one();
7140
7733
  if (!currentRow) return;
7141
7734
  const data = currentRow.data;
7142
7735
  if (typeof data.remote_url !== "string" || !httpUrlHasUserinfo(data.remote_url)) {
@@ -7148,7 +7741,7 @@ var RepoRepository = class {
7148
7741
  ...data,
7149
7742
  remote_url: stripHttpUrlUserinfo(data.remote_url)
7150
7743
  }
7151
- }).where((0, import_drizzle_orm24.eq)(repos3.repo_id, finding.repo_id)).run();
7744
+ }).where((0, import_drizzle_orm23.eq)(repos3.repo_id, finding.repo_id)).run();
7152
7745
  changed += 1;
7153
7746
  });
7154
7747
  }
@@ -7170,8 +7763,8 @@ var RepoRepository = class {
7170
7763
  try {
7171
7764
  const fullId = await this.resolveId(id);
7172
7765
  return await this.db.transaction(async (tx) => {
7173
- await lockRowForUpdate(txAsDb(tx), this.db, repos3, (0, import_drizzle_orm24.eq)(repos3.repo_id, fullId));
7174
- const currentRow = await select(txAsDb(tx)).from(repos3).where((0, import_drizzle_orm24.eq)(repos3.repo_id, fullId)).one();
7766
+ await lockRowForUpdate(txAsDb(tx), this.db, repos3, (0, import_drizzle_orm23.eq)(repos3.repo_id, fullId));
7767
+ const currentRow = await select(txAsDb(tx)).from(repos3).where((0, import_drizzle_orm23.eq)(repos3.repo_id, fullId)).one();
7175
7768
  if (!currentRow) {
7176
7769
  throw new EntityNotFoundError("Repo", id);
7177
7770
  }
@@ -7185,7 +7778,7 @@ var RepoRepository = class {
7185
7778
  repo_type: insertData.repo_type,
7186
7779
  unix_group: merged.unix_group ?? null,
7187
7780
  data: insertData.data
7188
- }).where((0, import_drizzle_orm24.eq)(repos3.repo_id, fullId)).run();
7781
+ }).where((0, import_drizzle_orm23.eq)(repos3.repo_id, fullId)).run();
7189
7782
  merged.clone_error = insertData.data.clone_error;
7190
7783
  merged.remote_url = insertData.data.remote_url;
7191
7784
  merged.last_updated = newUpdatedAt.toISOString();
@@ -7219,8 +7812,8 @@ var RepoRepository = class {
7219
7812
  try {
7220
7813
  const fullId = await this.resolveId(id);
7221
7814
  return await this.db.transaction(async (tx) => {
7222
- await lockRowForUpdate(txAsDb(tx), this.db, repos3, (0, import_drizzle_orm24.eq)(repos3.repo_id, fullId));
7223
- const currentRow = await select(txAsDb(tx)).from(repos3).where((0, import_drizzle_orm24.eq)(repos3.repo_id, fullId)).one();
7815
+ await lockRowForUpdate(txAsDb(tx), this.db, repos3, (0, import_drizzle_orm23.eq)(repos3.repo_id, fullId));
7816
+ const currentRow = await select(txAsDb(tx)).from(repos3).where((0, import_drizzle_orm23.eq)(repos3.repo_id, fullId)).one();
7224
7817
  if (!currentRow) {
7225
7818
  throw new EntityNotFoundError("Repo", id);
7226
7819
  }
@@ -7234,7 +7827,7 @@ var RepoRepository = class {
7234
7827
  repo_type: insertData.repo_type,
7235
7828
  unix_group: next.unix_group ?? null,
7236
7829
  data: insertData.data
7237
- }).where((0, import_drizzle_orm24.eq)(repos3.repo_id, fullId)).run();
7830
+ }).where((0, import_drizzle_orm23.eq)(repos3.repo_id, fullId)).run();
7238
7831
  next.environment = insertData.data.environment;
7239
7832
  next.environment_config = insertData.data.environment_config;
7240
7833
  next.remote_url = insertData.data.remote_url;
@@ -7274,7 +7867,7 @@ var RepoRepository = class {
7274
7867
  async delete(id) {
7275
7868
  try {
7276
7869
  const fullId = await this.resolveId(id);
7277
- const result = await deleteFrom(this.db, repos3).where((0, import_drizzle_orm24.eq)(repos3.repo_id, fullId)).run();
7870
+ const result = await deleteFrom(this.db, repos3).where((0, import_drizzle_orm23.eq)(repos3.repo_id, fullId)).run();
7278
7871
  if (result.rowsAffected === 0) {
7279
7872
  throw new EntityNotFoundError("Repo", id);
7280
7873
  }
@@ -7305,7 +7898,7 @@ var RepoRepository = class {
7305
7898
  */
7306
7899
  async count() {
7307
7900
  try {
7308
- const result = await select(this.db, { count: import_drizzle_orm24.sql`count(*)` }).from(repos3).one();
7901
+ const result = await select(this.db, { count: import_drizzle_orm23.sql`count(*)` }).from(repos3).one();
7309
7902
  return result?.count ?? 0;
7310
7903
  } catch (error) {
7311
7904
  throw new RepositoryError(
@@ -7318,28 +7911,28 @@ var RepoRepository = class {
7318
7911
 
7319
7912
  // src/db/repositories/schedules.ts
7320
7913
  init_cjs_shims();
7321
- var import_drizzle_orm25 = require("drizzle-orm");
7914
+ var import_drizzle_orm24 = require("drizzle-orm");
7322
7915
  init_ids();
7323
7916
  init_database_wrapper();
7324
7917
  init_schema();
7325
7918
 
7326
7919
  // src/db/repositories/serialized-sessions.ts
7327
7920
  init_cjs_shims();
7328
- var import_drizzle_orm26 = require("drizzle-orm");
7921
+ var import_drizzle_orm25 = require("drizzle-orm");
7329
7922
  init_ids();
7330
7923
  init_database_wrapper();
7331
7924
  init_schema();
7332
7925
 
7333
7926
  // src/db/repositories/session-mcp-servers.ts
7334
7927
  init_cjs_shims();
7335
- var import_drizzle_orm28 = require("drizzle-orm");
7928
+ var import_drizzle_orm27 = require("drizzle-orm");
7336
7929
  init_database_wrapper();
7337
7930
  init_schema();
7338
7931
 
7339
7932
  // src/db/repositories/sessions.ts
7340
7933
  init_cjs_shims();
7341
7934
  init_types2();
7342
- var import_drizzle_orm27 = require("drizzle-orm");
7935
+ var import_drizzle_orm26 = require("drizzle-orm");
7343
7936
  init_config_manager();
7344
7937
  init_ids();
7345
7938
  init_database_wrapper();
@@ -7347,7 +7940,7 @@ init_schema();
7347
7940
 
7348
7941
  // src/db/repositories/session-relationships.ts
7349
7942
  init_cjs_shims();
7350
- var import_drizzle_orm29 = require("drizzle-orm");
7943
+ var import_drizzle_orm28 = require("drizzle-orm");
7351
7944
  init_ids();
7352
7945
  init_database_wrapper();
7353
7946
  init_schema();
@@ -7355,7 +7948,7 @@ init_schema();
7355
7948
  // src/db/repositories/tasks.ts
7356
7949
  init_cjs_shims();
7357
7950
  init_types2();
7358
- var import_drizzle_orm30 = require("drizzle-orm");
7951
+ var import_drizzle_orm29 = require("drizzle-orm");
7359
7952
  init_ids();
7360
7953
  init_database_wrapper();
7361
7954
  init_schema();
@@ -7363,30 +7956,31 @@ init_schema();
7363
7956
  // src/db/repositories/thread-session-map.ts
7364
7957
  init_cjs_shims();
7365
7958
  init_types2();
7366
- var import_drizzle_orm31 = require("drizzle-orm");
7959
+ var import_drizzle_orm30 = require("drizzle-orm");
7367
7960
  init_ids();
7368
7961
  init_database_wrapper();
7369
7962
  init_schema();
7370
7963
 
7371
7964
  // src/db/repositories/user-api-keys.ts
7372
7965
  init_cjs_shims();
7373
- var import_node_crypto5 = require("crypto");
7374
- var import_bcryptjs2 = __toESM(require("bcryptjs"), 1);
7375
- var import_drizzle_orm32 = require("drizzle-orm");
7966
+ var import_node_crypto4 = require("crypto");
7967
+ var import_bcryptjs = __toESM(require("bcryptjs"), 1);
7968
+ var import_drizzle_orm31 = require("drizzle-orm");
7376
7969
  init_ids();
7377
7970
  init_database_wrapper();
7378
7971
  init_schema();
7972
+ init_tenant_context();
7379
7973
 
7380
7974
  // src/db/repositories/user-mcp-oauth-tokens.ts
7381
7975
  init_cjs_shims();
7382
- var import_drizzle_orm33 = require("drizzle-orm");
7976
+ var import_drizzle_orm32 = require("drizzle-orm");
7383
7977
  init_database_wrapper();
7384
7978
  init_schema();
7385
7979
 
7386
7980
  // src/db/repositories/users.ts
7387
7981
  init_cjs_shims();
7388
7982
  init_types2();
7389
- var import_drizzle_orm34 = require("drizzle-orm");
7983
+ var import_drizzle_orm33 = require("drizzle-orm");
7390
7984
  init_ids();
7391
7985
  init_database_wrapper();
7392
7986
  init_schema();
@@ -7411,7 +8005,12 @@ var UsersRepository = class {
7411
8005
  unix_username: row.unix_username ?? void 0,
7412
8006
  onboarding_completed: row.onboarding_completed,
7413
8007
  must_change_password: row.must_change_password,
8008
+ tokens_valid_after: row.tokens_valid_after ? new Date(row.tokens_valid_after) : void 0,
8009
+ avatar_url: row.data.avatar_url ?? row.data.avatar,
7414
8010
  avatar: row.data.avatar,
8011
+ avatar_source: row.data.avatar_source,
8012
+ avatar_source_id: row.data.avatar_source_id,
8013
+ avatar_synced_at: row.data.avatar_synced_at,
7415
8014
  preferences: row.data.preferences,
7416
8015
  // Convert encrypted per-tool credential blobs into boolean presence flags.
7417
8016
  agentic_tools: toAgenticToolsStatus(row.data.agentic_tools),
@@ -7455,8 +8054,14 @@ var UsersRepository = class {
7455
8054
  role: user.role ?? "member",
7456
8055
  unix_username: user.unix_username ?? null,
7457
8056
  onboarding_completed: user.onboarding_completed ?? false,
8057
+ must_change_password: user.must_change_password ?? false,
8058
+ tokens_valid_after: user.tokens_valid_after ? new Date(user.tokens_valid_after) : null,
7458
8059
  data: {
8060
+ avatar_url: user.avatar_url,
7459
8061
  avatar: user.avatar,
8062
+ avatar_source: user.avatar_source,
8063
+ avatar_source_id: user.avatar_source_id,
8064
+ avatar_synced_at: user.avatar_synced_at,
7460
8065
  preferences: user.preferences,
7461
8066
  // Encrypted per-tool credentials. Only forwarded when caller passes the
7462
8067
  // raw shape (internal credential mutators); regular updates leave it undefined,
@@ -7478,7 +8083,7 @@ var UsersRepository = class {
7478
8083
  */
7479
8084
  async resolveId(id) {
7480
8085
  return resolveByShortIdPrefix(id, "User", async (pattern) => {
7481
- const rows = await select(this.db).from(users3).where((0, import_drizzle_orm34.like)(users3.user_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
8086
+ const rows = await select(this.db).from(users3).where((0, import_drizzle_orm33.like)(users3.user_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
7482
8087
  return rows.map((r) => r.user_id);
7483
8088
  });
7484
8089
  }
@@ -7486,7 +8091,7 @@ var UsersRepository = class {
7486
8091
  * Check if unix_username is already taken by another user
7487
8092
  */
7488
8093
  async isUnixUsernameTaken(unixUsername, excludeUserId) {
7489
- const result = await select(this.db).from(users3).where((0, import_drizzle_orm34.eq)(users3.unix_username, unixUsername)).one();
8094
+ const result = await select(this.db).from(users3).where((0, import_drizzle_orm33.eq)(users3.unix_username, unixUsername)).one();
7490
8095
  if (!result) {
7491
8096
  return false;
7492
8097
  }
@@ -7509,7 +8114,7 @@ var UsersRepository = class {
7509
8114
  }
7510
8115
  const insertData = this.userToInsert(data);
7511
8116
  await insert(this.db, users3).values(insertData).run();
7512
- const row = await select(this.db).from(users3).where((0, import_drizzle_orm34.eq)(users3.user_id, insertData.user_id)).one();
8117
+ const row = await select(this.db).from(users3).where((0, import_drizzle_orm33.eq)(users3.user_id, insertData.user_id)).one();
7513
8118
  if (!row) {
7514
8119
  throw new RepositoryError("Failed to retrieve created user");
7515
8120
  }
@@ -7521,7 +8126,7 @@ var UsersRepository = class {
7521
8126
  async findById(id) {
7522
8127
  try {
7523
8128
  const fullId = await this.resolveId(id);
7524
- const result = await select(this.db).from(users3).where((0, import_drizzle_orm34.eq)(users3.user_id, fullId)).one();
8129
+ const result = await select(this.db).from(users3).where((0, import_drizzle_orm33.eq)(users3.user_id, fullId)).one();
7525
8130
  if (!result) {
7526
8131
  return null;
7527
8132
  }
@@ -7537,7 +8142,7 @@ var UsersRepository = class {
7537
8142
  * Find user by email
7538
8143
  */
7539
8144
  async findByEmail(email) {
7540
- const result = await select(this.db).from(users3).where((0, import_drizzle_orm34.eq)(users3.email, email)).one();
8145
+ const result = await select(this.db).from(users3).where((0, import_drizzle_orm33.eq)(users3.email, email)).one();
7541
8146
  if (!result) {
7542
8147
  return null;
7543
8148
  }
@@ -7558,7 +8163,7 @@ var UsersRepository = class {
7558
8163
  if (!normalizedEmail) return null;
7559
8164
  const exact = await this.findByEmail(normalizedEmail);
7560
8165
  if (exact) return exact;
7561
- const results = await select(this.db).from(users3).where(import_drizzle_orm34.sql`LOWER(${users3.email}) = ${normalizedEmail}`).all();
8166
+ const results = await select(this.db).from(users3).where(import_drizzle_orm33.sql`LOWER(${users3.email}) = ${normalizedEmail}`).all();
7562
8167
  if (results.length !== 1) {
7563
8168
  if (results.length > 1) {
7564
8169
  console.warn(
@@ -7608,8 +8213,8 @@ var UsersRepository = class {
7608
8213
  await update(this.db, users3).set({
7609
8214
  ...insertData,
7610
8215
  updated_at: /* @__PURE__ */ new Date()
7611
- }).where((0, import_drizzle_orm34.eq)(users3.user_id, fullId)).run();
7612
- const row = await select(this.db).from(users3).where((0, import_drizzle_orm34.eq)(users3.user_id, fullId)).one();
8216
+ }).where((0, import_drizzle_orm33.eq)(users3.user_id, fullId)).run();
8217
+ const row = await select(this.db).from(users3).where((0, import_drizzle_orm33.eq)(users3.user_id, fullId)).one();
7613
8218
  if (!row) {
7614
8219
  throw new RepositoryError("Failed to retrieve updated user");
7615
8220
  }
@@ -7620,7 +8225,7 @@ var UsersRepository = class {
7620
8225
  */
7621
8226
  async delete(id) {
7622
8227
  const fullId = await this.resolveId(id);
7623
- await deleteFrom(this.db, users3).where((0, import_drizzle_orm34.eq)(users3.user_id, fullId)).run();
8228
+ await deleteFrom(this.db, users3).where((0, import_drizzle_orm33.eq)(users3.user_id, fullId)).run();
7624
8229
  }
7625
8230
  /**
7626
8231
  * Get raw database row (internal use only - includes encrypted keys)
@@ -7628,7 +8233,7 @@ var UsersRepository = class {
7628
8233
  async getRawRow(id) {
7629
8234
  try {
7630
8235
  const fullId = await this.resolveId(id);
7631
- const result = await select(this.db).from(users3).where((0, import_drizzle_orm34.eq)(users3.user_id, fullId)).one();
8236
+ const result = await select(this.db).from(users3).where((0, import_drizzle_orm33.eq)(users3.user_id, fullId)).one();
7632
8237
  return result;
7633
8238
  } catch (error) {
7634
8239
  if (error instanceof EntityNotFoundError) {
@@ -7710,7 +8315,7 @@ var UsersRepository = class {
7710
8315
  await update(this.db, users3).set({
7711
8316
  data: { ...row.data, agentic_tools: next },
7712
8317
  updated_at: /* @__PURE__ */ new Date()
7713
- }).where((0, import_drizzle_orm34.eq)(users3.user_id, fullId)).run();
8318
+ }).where((0, import_drizzle_orm33.eq)(users3.user_id, fullId)).run();
7714
8319
  }
7715
8320
  /**
7716
8321
  * Delete a single credential field for a tool.
@@ -7736,134 +8341,14 @@ var UsersRepository = class {
7736
8341
  await update(this.db, users3).set({
7737
8342
  data: { ...row.data, agentic_tools: next },
7738
8343
  updated_at: /* @__PURE__ */ new Date()
7739
- }).where((0, import_drizzle_orm34.eq)(users3.user_id, fullId)).run();
8344
+ }).where((0, import_drizzle_orm33.eq)(users3.user_id, fullId)).run();
7740
8345
  }
7741
8346
  };
7742
8347
 
7743
- // src/db/index.ts
7744
- init_schema();
7745
-
7746
- // src/db/session-guard.ts
7747
- init_cjs_shims();
7748
- init_ids();
7749
-
7750
- // src/db/index.ts
7751
- init_user_utils();
7752
- var compare = import_bcryptjs3.default.compare;
7753
- var hash = import_bcryptjs3.default.hash;
7754
-
7755
- // src/config/key-resolver.ts
7756
- init_database_wrapper();
7757
- init_schema();
7758
- init_ids();
7759
- init_config_manager();
7760
- var DEBUG_KEY_RESOLUTION = process.env.AGOR_DEBUG_KEY_RESOLUTION === "1" || process.env.DEBUG?.includes("key-resolution");
7761
-
7762
- // src/config/proxies-resolver.ts
7763
- init_cjs_shims();
7764
-
7765
- // src/config/repo-list.ts
7766
- init_cjs_shims();
7767
-
7768
- // src/config/repo-reference.ts
7769
- init_cjs_shims();
7770
- var REPO_SLUG_PATTERN = /^[a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+$/;
7771
-
7772
- // src/config/resolved-config-slice.ts
7773
- init_cjs_shims();
7774
- var import_zod = require("zod");
7775
- var ResolvedConfigSliceSchema = import_zod.z.object({
7776
- /** From `config.execution.*` */
7777
- execution: import_zod.z.object({
7778
- permission_timeout_ms: import_zod.z.number().int().nonnegative().optional(),
7779
- executor_heartbeat: import_zod.z.object({
7780
- enabled: import_zod.z.boolean(),
7781
- interval_ms: import_zod.z.number().int().positive()
7782
- }).optional()
7783
- }).optional(),
7784
- /** From `config.opencode.*` */
7785
- opencode: import_zod.z.object({
7786
- serverUrl: import_zod.z.string().optional()
7787
- }).optional(),
7788
- /** From `config.daemon.*` (selected fields only) */
7789
- daemon: import_zod.z.object({
7790
- host_ip_address: import_zod.z.string().optional()
7791
- }).optional()
7792
- });
7793
-
7794
- // src/config/resource-schemas.ts
7795
- init_cjs_shims();
7796
- var import_zod2 = require("zod");
7797
- var uuidSchema = import_zod2.z.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, "Must be a valid UUID");
7798
- var repoSlugSchema = import_zod2.z.string().regex(
7799
- REPO_SLUG_PATTERN,
7800
- 'Must be org/name format with alphanumeric, hyphens, underscores, or dots (e.g., "my-org/my-repo")'
7801
- );
7802
- var enforcedAgentConfigSchema = import_zod2.z.object({
7803
- agentic_tool: import_zod2.z.enum(["claude-code", "claude-code-cli", "codex", "gemini", "opencode", "copilot", "cursor"]).optional(),
7804
- permission_mode: import_zod2.z.string().optional(),
7805
- model: import_zod2.z.string().optional(),
7806
- mcp_server_ids: import_zod2.z.array(import_zod2.z.string()).optional()
7807
- });
7808
- var resourceRepoConfigSchema = import_zod2.z.object({
7809
- repo_id: uuidSchema,
7810
- slug: repoSlugSchema,
7811
- remote_url: import_zod2.z.string().optional(),
7812
- repo_type: import_zod2.z.enum(["remote", "local"]).default("remote"),
7813
- default_branch: import_zod2.z.string().optional(),
7814
- shallow: import_zod2.z.boolean().optional()
7815
- }).refine((data) => data.repo_type !== "remote" || data.remote_url, {
7816
- message: 'remote_url is required when repo_type is "remote"',
7817
- path: ["remote_url"]
7818
- });
7819
- var resourceBranchConfigSchema = import_zod2.z.object({
7820
- branch_id: uuidSchema,
7821
- name: import_zod2.z.string().min(1, "Branch name is required"),
7822
- ref: import_zod2.z.string().min(1, "Git ref is required"),
7823
- ref_type: import_zod2.z.enum(["branch", "tag"]).optional(),
7824
- others_can: import_zod2.z.enum(["none", "view", "session", "prompt", "all"]).optional(),
7825
- mcp_server_ids: import_zod2.z.array(import_zod2.z.string()).optional(),
7826
- repo: repoSlugSchema,
7827
- readonly: import_zod2.z.boolean().optional(),
7828
- agent: enforcedAgentConfigSchema.optional()
7829
- });
7830
- var resourceUserConfigSchema = import_zod2.z.object({
7831
- user_id: uuidSchema,
7832
- email: import_zod2.z.string().email("Must be a valid email address"),
7833
- name: import_zod2.z.string().optional(),
7834
- role: import_zod2.z.enum(["superadmin", "admin", "member", "viewer"]).default("member"),
7835
- unix_username: import_zod2.z.string().optional(),
7836
- password: import_zod2.z.string().optional()
7837
- });
7838
- var daemonResourcesConfigSchema = import_zod2.z.object({
7839
- repos: import_zod2.z.array(resourceRepoConfigSchema).optional(),
7840
- branches: import_zod2.z.array(resourceBranchConfigSchema).optional(),
7841
- users: import_zod2.z.array(resourceUserConfigSchema).optional()
7842
- });
7843
-
7844
- // src/config/resource-sync.ts
7845
- init_cjs_shims();
7846
-
7847
- // src/config/security-resolver.ts
7848
- init_cjs_shims();
7849
- var DEFAULT_GIT_CONFIG_PARAMETERS = Object.freeze([
7850
- "transfer.credentialsInUrl=die",
7851
- "protocol.file.allow=user",
7852
- "protocol.ext.allow=never",
7853
- "core.protectHFS=true",
7854
- "core.protectNTFS=true"
7855
- ]);
7856
-
7857
- // src/config/index.ts
7858
- init_types();
7859
-
7860
8348
  // src/git/index.ts
8349
+ var git_exports = {};
7861
8350
  init_cjs_shims();
7862
- var import_node_fs3 = require("fs");
7863
- var import_promises2 = require("fs/promises");
7864
- var import_node_path4 = require("path");
7865
- var import_simple_git = require("simple-git");
7866
- init_config_manager();
8351
+ __reExport(git_exports, require("@agor/git"));
7867
8352
 
7868
8353
  // src/unix/run-as-user.ts
7869
8354
  init_cjs_shims();
@@ -8219,116 +8704,13 @@ function buildSpawnArgs(command, args = [], options) {
8219
8704
  };
8220
8705
  }
8221
8706
 
8222
- // src/git/index.ts
8223
- init_config_manager();
8224
- var cachedGitBinary;
8225
- function getGitBinary() {
8226
- if (cachedGitBinary !== void 0) return cachedGitBinary;
8227
- const commonPaths = [
8228
- "/opt/homebrew/bin/git",
8229
- // Homebrew on Apple Silicon
8230
- "/usr/local/bin/git",
8231
- // Homebrew on Intel
8232
- "/usr/bin/git"
8233
- // System git (Docker and Linux)
8234
- ];
8235
- for (const path2 of commonPaths) {
8236
- if ((0, import_node_fs3.existsSync)(path2)) {
8237
- cachedGitBinary = path2;
8238
- return path2;
8239
- }
8240
- }
8241
- cachedGitBinary = "git";
8242
- return cachedGitBinary;
8243
- }
8244
- function isLikelyGitToken(token) {
8245
- return /^[A-Za-z0-9_-]{20,255}$/.test(token);
8246
- }
8247
- var DEFAULT_AUTH_HEADER_HOST = "github.com";
8248
- function buildGitConfigEnv(entries) {
8249
- if (entries.length === 0) return {};
8250
- const out = {
8251
- GIT_CONFIG_COUNT: String(entries.length)
8252
- };
8253
- for (let i = 0; i < entries.length; i++) {
8254
- const [key, value] = entries[i];
8255
- out[`GIT_CONFIG_KEY_${i}`] = key;
8256
- out[`GIT_CONFIG_VALUE_${i}`] = value;
8257
- }
8258
- return out;
8259
- }
8260
- function buildAuthHeaderEnv(token, host = DEFAULT_AUTH_HEADER_HOST) {
8261
- if (!token) return [];
8262
- if (!isLikelyGitToken(token)) {
8263
- console.warn(
8264
- "\u{1F511} Skipping http.extraheader: token does not match expected shape. Tokens must match /^[A-Za-z0-9_-]{20,255}$/. Re-save the token to enable the auth header."
8265
- );
8266
- return [];
8267
- }
8268
- const credential = Buffer.from(`x-access-token:${token}`, "utf8").toString("base64");
8269
- const key = `http.https://${host}/.extraheader`;
8270
- return [[key, `Authorization: Basic ${credential}`]];
8271
- }
8272
- function createGit(baseDir, env, authHost) {
8273
- const gitBinary = getGitBinary();
8274
- const config = [];
8275
- const rawToken = env?.GITHUB_TOKEN ?? env?.GH_TOKEN;
8276
- const authConfigEntries = buildAuthHeaderEnv(rawToken, authHost ?? DEFAULT_AUTH_HEADER_HOST);
8277
- let spawnEnv;
8278
- if (env || authConfigEntries.length > 0) {
8279
- spawnEnv = {
8280
- ...process.env,
8281
- ...env ?? {},
8282
- // Inheritance kill (GLOBAL only): ignore the daemon user's
8283
- // ~/.gitconfig. /etc/gitconfig is intentionally NOT killed — it is
8284
- // admin-policy territory (CA bundles, proxies). See block comment.
8285
- GIT_CONFIG_GLOBAL: "/dev/null",
8286
- // Fail fast instead of blocking on an interactive credential prompt
8287
- // (which would hang the daemon).
8288
- GIT_TERMINAL_PROMPT: "0",
8289
- // Inject http.extraheader (and any future server-constructed config)
8290
- // via the env-var protocol so it never lands on argv.
8291
- ...buildGitConfigEnv(authConfigEntries)
8292
- };
8293
- }
8294
- const git = (0, import_simple_git.simpleGit)({
8295
- baseDir,
8296
- binary: gitBinary,
8297
- config,
8298
- unsafe: {
8299
- // simple-git's scanner blocks spawning when these env vars / config keys
8300
- // are present. We own the daemon env (in strict mode it's the user's own
8301
- // env) and inject GIT_CONFIG_* ourselves — opting in here mirrors what a
8302
- // direct `git` invocation on the same machine does.
8303
- allowUnsafeSshCommand: true,
8304
- allowUnsafeConfigPaths: true,
8305
- allowUnsafeConfigEnvCount: true,
8306
- allowUnsafeEditor: true,
8307
- allowUnsafeAskPass: true,
8308
- allowUnsafePager: true,
8309
- allowUnsafeGitProxy: true,
8310
- allowUnsafeTemplateDir: true,
8311
- allowUnsafeDiffExternal: true
8312
- }
8313
- });
8314
- if (spawnEnv) {
8315
- git.env(spawnEnv);
8316
- }
8317
- return { git };
8318
- }
8319
- async function getCurrentSha(repoPath) {
8320
- const { git } = createGit(repoPath);
8321
- const log = await git.log({ maxCount: 1 });
8322
- return log.latest?.hash || "";
8323
- }
8324
-
8325
8707
  // src/unix/user-env-file.ts
8326
8708
  init_cjs_shims();
8327
8709
  var import_node_child_process4 = require("child_process");
8328
- var import_node_crypto6 = require("crypto");
8329
- var import_node_fs4 = require("fs");
8330
- var import_node_os3 = require("os");
8331
- var import_node_path5 = require("path");
8710
+ var import_node_crypto5 = require("crypto");
8711
+ var import_node_fs3 = require("fs");
8712
+ var import_node_os2 = require("os");
8713
+ var import_node_path2 = require("path");
8332
8714
 
8333
8715
  // src/unix/secret-env.ts
8334
8716
  init_cjs_shims();
@@ -8370,8 +8752,8 @@ function writeUserEnvFile(asUser, env) {
8370
8752
  if (!isValidUnixUsername(asUser)) {
8371
8753
  throw new Error(`writeUserEnvFile: invalid Unix username: ${JSON.stringify(asUser)}`);
8372
8754
  }
8373
- const nonce = (0, import_node_crypto6.randomBytes)(16).toString("hex");
8374
- const envFilePath = (0, import_node_path5.join)((0, import_node_os3.tmpdir)(), `${ENV_FILE_PREFIX}${nonce}`);
8755
+ const nonce = (0, import_node_crypto5.randomBytes)(16).toString("hex");
8756
+ const envFilePath = (0, import_node_path2.join)((0, import_node_os2.tmpdir)(), `${ENV_FILE_PREFIX}${nonce}`);
8375
8757
  const lines = [];
8376
8758
  for (const [key, value] of Object.entries(env)) {
8377
8759
  if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {
@@ -8391,7 +8773,7 @@ function writeUserEnvFile(asUser, env) {
8391
8773
  }
8392
8774
  function tryUnlinkEnvFile(path2) {
8393
8775
  try {
8394
- (0, import_node_fs4.unlinkSync)(path2);
8776
+ (0, import_node_fs3.unlinkSync)(path2);
8395
8777
  } catch {
8396
8778
  }
8397
8779
  }
@@ -8437,7 +8819,7 @@ function prepareImpersonationEnv(options) {
8437
8819
  // src/unix/environment-command-spawn.ts
8438
8820
  async function captureBranchBuildSha(branchPath2) {
8439
8821
  try {
8440
- const sha = await getCurrentSha(branchPath2);
8822
+ const sha = await (0, git_exports.getCurrentSha)(branchPath2);
8441
8823
  return sha ? sha.slice(0, 7) : void 0;
8442
8824
  } catch {
8443
8825
  return void 0;
@@ -8736,7 +9118,7 @@ var REPO_GIT_PERMISSION_MODE = "2770";
8736
9118
  // src/unix/id-lookups.ts
8737
9119
  init_cjs_shims();
8738
9120
  var import_node_child_process6 = require("child_process");
8739
- var import_node_fs5 = __toESM(require("fs"), 1);
9121
+ var import_node_fs4 = __toESM(require("fs"), 1);
8740
9122
  function getGidFromGroupName(groupName) {
8741
9123
  if (!groupName) {
8742
9124
  return void 0;
@@ -8757,8 +9139,8 @@ function getGidFromGroupName(groupName) {
8757
9139
  }
8758
9140
  } catch {
8759
9141
  }
8760
- if (import_node_fs5.default.existsSync("/etc/group")) {
8761
- const groupFile = import_node_fs5.default.readFileSync("/etc/group", "utf-8");
9142
+ if (import_node_fs4.default.existsSync("/etc/group")) {
9143
+ const groupFile = import_node_fs4.default.readFileSync("/etc/group", "utf-8");
8762
9144
  const line = groupFile.split("\n").find((l) => l.startsWith(`${groupName}:`));
8763
9145
  if (line) {
8764
9146
  const parts = line.split(":");
@@ -8812,8 +9194,8 @@ function getUidFromUsername(username) {
8812
9194
  }
8813
9195
  } catch {
8814
9196
  }
8815
- if (import_node_fs5.default.existsSync("/etc/passwd")) {
8816
- const passwdFile = import_node_fs5.default.readFileSync("/etc/passwd", "utf-8");
9197
+ if (import_node_fs4.default.existsSync("/etc/passwd")) {
9198
+ const passwdFile = import_node_fs4.default.readFileSync("/etc/passwd", "utf-8");
8817
9199
  const line = passwdFile.split("\n").find((l) => l.startsWith(`${username}:`));
8818
9200
  if (line) {
8819
9201
  const parts = line.split(":");
@@ -8852,8 +9234,8 @@ function getHomedirFromUsername(username) {
8852
9234
  }
8853
9235
  } catch {
8854
9236
  }
8855
- if (import_node_fs5.default.existsSync("/etc/passwd")) {
8856
- const passwdFile = import_node_fs5.default.readFileSync("/etc/passwd", "utf-8");
9237
+ if (import_node_fs4.default.existsSync("/etc/passwd")) {
9238
+ const passwdFile = import_node_fs4.default.readFileSync("/etc/passwd", "utf-8");
8857
9239
  const line = passwdFile.split("\n").find((l) => l.startsWith(`${username}:`));
8858
9240
  if (line) {
8859
9241
  const parts = line.split(":");