agor-live 0.22.0 → 0.23.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1006) 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 +518 -89
  107. package/dist/core/claude/index.js +515 -88
  108. package/dist/core/claude-cli/index.cjs +24 -0
  109. package/dist/core/claude-cli/index.js +24 -0
  110. package/dist/core/claude-cli/pricing.d.ts.map +1 -1
  111. package/dist/core/client/index.cjs +52 -7
  112. package/dist/core/client/index.js +48 -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 +2767 -1232
  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 +2601 -1094
  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 +54 -3
  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 +52 -2
  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 +9 -0
  153. package/dist/core/db/repositories/gateway-channels.d.ts.map +1 -1
  154. package/dist/core/db/repositories/gateway-outbound-messages.d.ts +19 -0
  155. package/dist/core/db/repositories/gateway-outbound-messages.d.ts.map +1 -0
  156. package/dist/core/db/repositories/index.d.ts +2 -0
  157. package/dist/core/db/repositories/index.d.ts.map +1 -1
  158. package/dist/core/db/repositories/messages.d.ts +9 -2
  159. package/dist/core/db/repositories/messages.d.ts.map +1 -1
  160. package/dist/core/db/repositories/repos.d.ts.map +1 -1
  161. package/dist/core/db/repositories/schedules.d.ts +12 -1
  162. package/dist/core/db/repositories/schedules.d.ts.map +1 -1
  163. package/dist/core/db/repositories/sessions.d.ts +56 -5
  164. package/dist/core/db/repositories/sessions.d.ts.map +1 -1
  165. package/dist/core/db/repositories/tasks.d.ts +7 -2
  166. package/dist/core/db/repositories/tasks.d.ts.map +1 -1
  167. package/dist/core/db/repositories/user-api-keys.d.ts +10 -1
  168. package/dist/core/db/repositories/user-api-keys.d.ts.map +1 -1
  169. package/dist/core/db/repositories/users.d.ts +8 -8
  170. package/dist/core/db/repositories/users.d.ts.map +1 -1
  171. package/dist/core/db/schema.d.ts +1460 -38
  172. package/dist/core/db/schema.d.ts.map +1 -1
  173. package/dist/core/db/schema.postgres.d.ts +1082 -37
  174. package/dist/core/db/schema.postgres.d.ts.map +1 -1
  175. package/dist/core/db/schema.sqlite.d.ts +397 -1
  176. package/dist/core/db/schema.sqlite.d.ts.map +1 -1
  177. package/dist/core/db/tenant-context.d.ts +26 -0
  178. package/dist/core/db/tenant-context.d.ts.map +1 -0
  179. package/dist/core/db/tenant-scope.d.ts +31 -0
  180. package/dist/core/db/tenant-scope.d.ts.map +1 -0
  181. package/dist/core/db/user-utils.d.ts +2 -2
  182. package/dist/core/db/user-utils.d.ts.map +1 -1
  183. package/dist/core/drizzle/postgres/0052_gateway_outbound_messages.sql +45 -0
  184. package/dist/core/drizzle/postgres/0053_user_token_invalidation.sql +1 -0
  185. package/dist/core/drizzle/postgres/0054_app_level_multitenancy.sql +219 -0
  186. package/dist/core/drizzle/postgres/0055_app_level_multitenancy_rls.sql +411 -0
  187. package/dist/core/drizzle/postgres/0056_composite_indexes.sql +15 -0
  188. package/dist/core/drizzle/postgres/0057_message_timestamp_indexes.sql +3 -0
  189. package/dist/core/drizzle/postgres/meta/_journal.json +42 -0
  190. package/dist/core/drizzle/sqlite/0061_gateway_outbound_messages.sql +38 -0
  191. package/dist/core/drizzle/sqlite/0062_user_token_invalidation.sql +1 -0
  192. package/dist/core/drizzle/sqlite/0063_composite_indexes.sql +10 -0
  193. package/dist/core/drizzle/sqlite/0064_message_timestamp_indexes.sql +2 -0
  194. package/dist/core/drizzle/sqlite/meta/_journal.json +28 -0
  195. package/dist/core/environment/render-snapshot.cjs +7 -6
  196. package/dist/core/environment/render-snapshot.d.ts +2 -0
  197. package/dist/core/environment/render-snapshot.d.ts.map +1 -1
  198. package/dist/core/environment/render-snapshot.js +7 -6
  199. package/dist/core/environment/variable-resolver.cjs +3 -1
  200. package/dist/core/environment/variable-resolver.js +3 -1
  201. package/dist/core/environment/webhook.cjs +1 -4
  202. package/dist/core/environment/webhook.js +1 -4
  203. package/dist/core/gateway/connector.d.ts +10 -1
  204. package/dist/core/gateway/connector.d.ts.map +1 -1
  205. package/dist/core/gateway/connectors/slack-manifest.cjs +108 -0
  206. package/dist/core/gateway/connectors/slack-manifest.d.ts +85 -0
  207. package/dist/core/gateway/connectors/slack-manifest.d.ts.map +1 -0
  208. package/dist/core/gateway/connectors/slack-manifest.js +81 -0
  209. package/dist/core/gateway/connectors/slack.d.ts +101 -4
  210. package/dist/core/gateway/connectors/slack.d.ts.map +1 -1
  211. package/dist/core/gateway/index.cjs +495 -29
  212. package/dist/core/gateway/index.d.ts +4 -1
  213. package/dist/core/gateway/index.d.ts.map +1 -1
  214. package/dist/core/gateway/index.js +490 -28
  215. package/dist/core/gateway/system-message.d.ts.map +1 -1
  216. package/dist/core/git/exec.cjs +24 -0
  217. package/dist/core/git/exec.d.ts +6 -4
  218. package/dist/core/git/exec.d.ts.map +1 -1
  219. package/dist/core/git/exec.js +2 -0
  220. package/dist/core/git/index.cjs +3 -1363
  221. package/dist/core/git/index.d.ts +4 -614
  222. package/dist/core/git/index.d.ts.map +1 -1
  223. package/dist/core/git/index.js +1 -1304
  224. package/dist/core/git/pure.cjs +24 -0
  225. package/dist/core/git/pure.d.ts +2 -27
  226. package/dist/core/git/pure.d.ts.map +1 -1
  227. package/dist/core/git/pure.js +2 -0
  228. package/dist/core/index.cjs +11563 -10832
  229. package/dist/core/index.d.ts +2 -0
  230. package/dist/core/index.d.ts.map +1 -1
  231. package/dist/core/index.js +12203 -10962
  232. package/dist/core/lib/feathers-validation.cjs +9 -1
  233. package/dist/core/lib/feathers-validation.d.ts +2 -0
  234. package/dist/core/lib/feathers-validation.d.ts.map +1 -1
  235. package/dist/core/lib/feathers-validation.js +9 -1
  236. package/dist/core/local-actions/git-remotes.d.ts +7 -0
  237. package/dist/core/local-actions/git-remotes.d.ts.map +1 -0
  238. package/dist/core/local-actions/index.cjs +8008 -0
  239. package/dist/core/local-actions/index.d.ts +6 -0
  240. package/dist/core/local-actions/index.d.ts.map +1 -0
  241. package/dist/core/local-actions/index.js +8010 -0
  242. package/dist/core/local-actions/symlinks.d.ts +20 -0
  243. package/dist/core/local-actions/symlinks.d.ts.map +1 -0
  244. package/dist/core/local-actions/types.d.ts +14 -0
  245. package/dist/core/local-actions/types.d.ts.map +1 -0
  246. package/dist/core/local-actions/unix-groups.d.ts +16 -0
  247. package/dist/core/local-actions/unix-groups.d.ts.map +1 -0
  248. package/dist/core/local-actions/unix-users.d.ts +12 -0
  249. package/dist/core/local-actions/unix-users.d.ts.map +1 -0
  250. package/dist/core/mcp/index.cjs +373 -28
  251. package/dist/core/mcp/index.d.ts +1 -1
  252. package/dist/core/mcp/index.d.ts.map +1 -1
  253. package/dist/core/mcp/index.js +369 -27
  254. package/dist/core/mcp/template-patterns.d.ts +15 -0
  255. package/dist/core/mcp/template-patterns.d.ts.map +1 -0
  256. package/dist/core/mcp/template-resolver.d.ts +13 -0
  257. package/dist/core/mcp/template-resolver.d.ts.map +1 -1
  258. package/dist/core/models/browser.cjs +154 -25
  259. package/dist/core/models/browser.js +150 -25
  260. package/dist/core/models/claude.d.ts +2 -2
  261. package/dist/core/models/claude.d.ts.map +1 -1
  262. package/dist/core/models/codex.d.ts +205 -21
  263. package/dist/core/models/codex.d.ts.map +1 -1
  264. package/dist/core/models/index.cjs +154 -25
  265. package/dist/core/models/index.js +150 -25
  266. package/dist/core/package.json +24 -0
  267. package/dist/core/seed/demo-fixtures.d.ts +87 -0
  268. package/dist/core/seed/demo-fixtures.d.ts.map +1 -0
  269. package/dist/core/seed/dev-fixtures.d.ts.map +1 -1
  270. package/dist/core/seed/index.cjs +8569 -5519
  271. package/dist/core/seed/index.d.ts +1 -0
  272. package/dist/core/seed/index.d.ts.map +1 -1
  273. package/dist/core/seed/index.js +8580 -5535
  274. package/dist/core/sessions/index.cjs +110 -24
  275. package/dist/core/sessions/index.js +110 -24
  276. package/dist/core/telemetry/index.cjs +361 -0
  277. package/dist/core/telemetry/index.d.ts +5 -0
  278. package/dist/core/telemetry/index.d.ts.map +1 -0
  279. package/dist/core/telemetry/index.js +315 -0
  280. package/dist/core/telemetry/logger.d.ts +44 -0
  281. package/dist/core/telemetry/logger.d.ts.map +1 -0
  282. package/dist/core/telemetry/model-normalization.d.ts +3 -0
  283. package/dist/core/telemetry/model-normalization.d.ts.map +1 -0
  284. package/dist/core/telemetry/types.d.ts +47 -0
  285. package/dist/core/telemetry/types.d.ts.map +1 -0
  286. package/dist/core/telemetry/version.d.ts +9 -0
  287. package/dist/core/telemetry/version.d.ts.map +1 -0
  288. package/dist/core/templates/agor-system-prompt.md +1 -0
  289. package/dist/core/templates/handlebars-helpers.cjs +3 -1
  290. package/dist/core/templates/handlebars-helpers.d.ts +5 -0
  291. package/dist/core/templates/handlebars-helpers.d.ts.map +1 -1
  292. package/dist/core/templates/handlebars-helpers.js +3 -1
  293. package/dist/core/tools/mcp/auth-secrets.cjs +3460 -3
  294. package/dist/core/tools/mcp/auth-secrets.d.ts.map +1 -1
  295. package/dist/core/tools/mcp/auth-secrets.js +3477 -3
  296. package/dist/core/tools/mcp/http-headers.cjs +17 -1
  297. package/dist/core/tools/mcp/http-headers.d.ts.map +1 -1
  298. package/dist/core/tools/mcp/http-headers.js +15 -1
  299. package/dist/core/tools/mcp/oauth-refresh.cjs +568 -114
  300. package/dist/core/tools/mcp/oauth-refresh.js +566 -115
  301. package/dist/core/types/board.d.ts +14 -0
  302. package/dist/core/types/board.d.ts.map +1 -1
  303. package/dist/core/types/branch.d.ts +13 -0
  304. package/dist/core/types/branch.d.ts.map +1 -1
  305. package/dist/core/types/config-services.d.ts.map +1 -1
  306. package/dist/core/types/feathers.d.ts +6 -0
  307. package/dist/core/types/feathers.d.ts.map +1 -1
  308. package/dist/core/types/gateway.d.ts +90 -1
  309. package/dist/core/types/gateway.d.ts.map +1 -1
  310. package/dist/core/types/index.cjs +42 -0
  311. package/dist/core/types/index.d.ts +1 -0
  312. package/dist/core/types/index.d.ts.map +1 -1
  313. package/dist/core/types/index.js +38 -0
  314. package/dist/core/types/schedule.d.ts +4 -3
  315. package/dist/core/types/schedule.d.ts.map +1 -1
  316. package/dist/core/types/session.d.ts +7 -1
  317. package/dist/core/types/session.d.ts.map +1 -1
  318. package/dist/core/types/tenant.d.ts +15 -0
  319. package/dist/core/types/tenant.d.ts.map +1 -0
  320. package/dist/core/types/user.d.ts +61 -0
  321. package/dist/core/types/user.d.ts.map +1 -1
  322. package/dist/core/unix/index.cjs +1123 -674
  323. package/dist/core/unix/index.js +1071 -624
  324. package/dist/core/utils/emoji-shortcodes.d.ts +13 -0
  325. package/dist/core/utils/emoji-shortcodes.d.ts.map +1 -0
  326. package/dist/core/yaml/index.cjs +8 -8
  327. package/dist/core/yaml/index.d.ts +1 -1
  328. package/dist/core/yaml/index.d.ts.map +1 -1
  329. package/dist/core/yaml/index.js +7 -7
  330. package/dist/daemon/adapters/drizzle.d.ts +26 -4
  331. package/dist/daemon/adapters/drizzle.d.ts.map +1 -1
  332. package/dist/daemon/adapters/drizzle.js +68 -7
  333. package/dist/daemon/auth/api-key-strategy.js +1 -1
  334. package/dist/daemon/auth/executor-runtime-scope.d.ts.map +1 -1
  335. package/dist/daemon/auth/executor-runtime-scope.js +34 -6
  336. package/dist/daemon/auth/executor-session-token.d.ts +15 -0
  337. package/dist/daemon/auth/executor-session-token.d.ts.map +1 -0
  338. package/dist/daemon/auth/executor-session-token.js +17 -0
  339. package/dist/daemon/auth/issue-browser-tokens-hook.d.ts +24 -0
  340. package/dist/daemon/auth/issue-browser-tokens-hook.d.ts.map +1 -0
  341. package/dist/daemon/auth/issue-browser-tokens-hook.js +95 -0
  342. package/dist/daemon/auth/launch-auth.d.ts +5 -4
  343. package/dist/daemon/auth/launch-auth.d.ts.map +1 -1
  344. package/dist/daemon/auth/launch-auth.js +123 -39
  345. package/dist/daemon/auth/refresh-token-service.d.ts +22 -0
  346. package/dist/daemon/auth/refresh-token-service.d.ts.map +1 -0
  347. package/dist/daemon/auth/refresh-token-service.js +133 -0
  348. package/dist/daemon/auth/runtime-tokens.d.ts +3 -1
  349. package/dist/daemon/auth/runtime-tokens.d.ts.map +1 -1
  350. package/dist/daemon/auth/runtime-tokens.js +17 -4
  351. package/dist/daemon/auth/service-jwt-strategy.d.ts +2 -1
  352. package/dist/daemon/auth/service-jwt-strategy.d.ts.map +1 -1
  353. package/dist/daemon/auth/service-jwt-strategy.js +141 -3
  354. package/dist/daemon/auth/token-invalidation.d.ts +11 -0
  355. package/dist/daemon/auth/token-invalidation.d.ts.map +1 -0
  356. package/dist/daemon/auth/token-invalidation.js +38 -0
  357. package/dist/daemon/auth/user-redaction.d.ts +12 -0
  358. package/dist/daemon/auth/user-redaction.d.ts.map +1 -0
  359. package/dist/daemon/auth/user-redaction.js +13 -0
  360. package/dist/daemon/declarations.d.ts +5 -4
  361. package/dist/daemon/declarations.d.ts.map +1 -1
  362. package/dist/daemon/hooks/gateway-route.d.ts.map +1 -1
  363. package/dist/daemon/hooks/gateway-route.js +23 -13
  364. package/dist/daemon/index.d.ts.map +1 -1
  365. package/dist/daemon/index.js +8271 -2956
  366. package/dist/daemon/knowledge/pgvector.d.ts +3 -3
  367. package/dist/daemon/knowledge/pgvector.d.ts.map +1 -1
  368. package/dist/daemon/knowledge/pgvector.js +24 -0
  369. package/dist/daemon/knowledge/units.d.ts +2 -2
  370. package/dist/daemon/knowledge/units.d.ts.map +1 -1
  371. package/dist/daemon/main.js +8271 -2956
  372. package/dist/daemon/mcp/server.d.ts +3 -3
  373. package/dist/daemon/mcp/server.d.ts.map +1 -1
  374. package/dist/daemon/mcp/server.js +1740 -81
  375. package/dist/daemon/mcp/tokens.d.ts +2 -2
  376. package/dist/daemon/mcp/tokens.d.ts.map +1 -1
  377. package/dist/daemon/mcp/tokens.js +5 -1
  378. package/dist/daemon/mcp/tool-registry.d.ts.map +1 -1
  379. package/dist/daemon/mcp/tool-registry.js +1 -0
  380. package/dist/daemon/mcp/tools/analytics.d.ts.map +1 -1
  381. package/dist/daemon/mcp/tools/analytics.js +598 -24
  382. package/dist/daemon/mcp/tools/artifacts.js +560 -20
  383. package/dist/daemon/mcp/tools/boards.d.ts.map +1 -1
  384. package/dist/daemon/mcp/tools/boards.js +567 -21
  385. package/dist/daemon/mcp/tools/branches.d.ts.map +1 -1
  386. package/dist/daemon/mcp/tools/branches.js +624 -50
  387. package/dist/daemon/mcp/tools/card-types.js +558 -18
  388. package/dist/daemon/mcp/tools/cards.js +558 -18
  389. package/dist/daemon/mcp/tools/environment.js +566 -18
  390. package/dist/daemon/mcp/tools/gateway-channels.d.ts +4 -0
  391. package/dist/daemon/mcp/tools/gateway-channels.d.ts.map +1 -0
  392. package/dist/daemon/mcp/tools/gateway-channels.js +16187 -0
  393. package/dist/daemon/mcp/tools/knowledge.js +558 -18
  394. package/dist/daemon/mcp/tools/mcp-servers.d.ts.map +1 -1
  395. package/dist/daemon/mcp/tools/mcp-servers.js +893 -18
  396. package/dist/daemon/mcp/tools/messages.d.ts.map +1 -1
  397. package/dist/daemon/mcp/tools/messages.js +618 -32
  398. package/dist/daemon/mcp/tools/proxies.js +568 -20
  399. package/dist/daemon/mcp/tools/repos.js +558 -18
  400. package/dist/daemon/mcp/tools/schedules.d.ts.map +1 -1
  401. package/dist/daemon/mcp/tools/schedules.js +561 -19
  402. package/dist/daemon/mcp/tools/search.js +558 -18
  403. package/dist/daemon/mcp/tools/sessions.d.ts.map +1 -1
  404. package/dist/daemon/mcp/tools/sessions.js +571 -24
  405. package/dist/daemon/mcp/tools/tasks.js +558 -18
  406. package/dist/daemon/mcp/tools/users.d.ts.map +1 -1
  407. package/dist/daemon/mcp/tools/users.js +577 -23
  408. package/dist/daemon/mcp/tools/widgets.d.ts.map +1 -1
  409. package/dist/daemon/mcp/tools/widgets.js +759 -83
  410. package/dist/daemon/oauth-auth-helpers.d.ts +35 -0
  411. package/dist/daemon/oauth-auth-helpers.d.ts.map +1 -0
  412. package/dist/daemon/oauth-auth-helpers.js +14 -0
  413. package/dist/daemon/register-hooks.d.ts +4 -2
  414. package/dist/daemon/register-hooks.d.ts.map +1 -1
  415. package/dist/daemon/register-hooks.js +1158 -595
  416. package/dist/daemon/register-routes.d.ts +3 -2
  417. package/dist/daemon/register-routes.d.ts.map +1 -1
  418. package/dist/daemon/register-routes.js +3161 -812
  419. package/dist/daemon/register-services.d.ts +2 -2
  420. package/dist/daemon/register-services.d.ts.map +1 -1
  421. package/dist/daemon/register-services.js +2782 -739
  422. package/dist/daemon/services/artifacts.d.ts +34 -6
  423. package/dist/daemon/services/artifacts.d.ts.map +1 -1
  424. package/dist/daemon/services/artifacts.js +109 -8
  425. package/dist/daemon/services/assistant-knowledge.d.ts +2 -2
  426. package/dist/daemon/services/assistant-knowledge.d.ts.map +1 -1
  427. package/dist/daemon/services/board-comments.d.ts +8 -5
  428. package/dist/daemon/services/board-comments.d.ts.map +1 -1
  429. package/dist/daemon/services/board-comments.js +78 -13
  430. package/dist/daemon/services/board-objects.d.ts +8 -5
  431. package/dist/daemon/services/board-objects.d.ts.map +1 -1
  432. package/dist/daemon/services/board-objects.js +14 -4
  433. package/dist/daemon/services/boards.d.ts +39 -5
  434. package/dist/daemon/services/boards.d.ts.map +1 -1
  435. package/dist/daemon/services/boards.js +123 -8
  436. package/dist/daemon/services/branch-owners.d.ts +3 -1
  437. package/dist/daemon/services/branch-owners.d.ts.map +1 -1
  438. package/dist/daemon/services/branch-owners.js +31 -4
  439. package/dist/daemon/services/branches.d.ts +31 -8
  440. package/dist/daemon/services/branches.d.ts.map +1 -1
  441. package/dist/daemon/services/branches.js +272 -36
  442. package/dist/daemon/services/card-types.d.ts +3 -3
  443. package/dist/daemon/services/card-types.d.ts.map +1 -1
  444. package/dist/daemon/services/card-types.js +68 -7
  445. package/dist/daemon/services/cards.d.ts +19 -4
  446. package/dist/daemon/services/cards.d.ts.map +1 -1
  447. package/dist/daemon/services/cards.js +92 -8
  448. package/dist/daemon/services/check-auth.d.ts +2 -2
  449. package/dist/daemon/services/check-auth.d.ts.map +1 -1
  450. package/dist/daemon/services/claude-cli-integration.d.ts +4 -1
  451. package/dist/daemon/services/claude-cli-integration.d.ts.map +1 -1
  452. package/dist/daemon/services/claude-cli-integration.js +117 -65
  453. package/dist/daemon/services/claude-models.d.ts +3 -3
  454. package/dist/daemon/services/claude-models.d.ts.map +1 -1
  455. package/dist/daemon/services/claude-models.js +387 -273
  456. package/dist/daemon/services/config.d.ts +12 -4
  457. package/dist/daemon/services/config.d.ts.map +1 -1
  458. package/dist/daemon/services/config.js +39 -3
  459. package/dist/daemon/services/copilot-models.d.ts +3 -3
  460. package/dist/daemon/services/copilot-models.d.ts.map +1 -1
  461. package/dist/daemon/services/cursor-models.d.ts +3 -3
  462. package/dist/daemon/services/cursor-models.d.ts.map +1 -1
  463. package/dist/daemon/services/files.d.ts +3 -3
  464. package/dist/daemon/services/files.d.ts.map +1 -1
  465. package/dist/daemon/services/files.js +24 -5
  466. package/dist/daemon/services/gateway-channels-test.d.ts +24 -0
  467. package/dist/daemon/services/gateway-channels-test.d.ts.map +1 -0
  468. package/dist/daemon/services/gateway-channels-test.js +66 -0
  469. package/dist/daemon/services/gateway-channels.d.ts +3 -3
  470. package/dist/daemon/services/gateway-channels.d.ts.map +1 -1
  471. package/dist/daemon/services/gateway-channels.js +68 -7
  472. package/dist/daemon/services/gateway.d.ts +63 -3
  473. package/dist/daemon/services/gateway.d.ts.map +1 -1
  474. package/dist/daemon/services/gateway.js +640 -60
  475. package/dist/daemon/services/github-app-setup.d.ts +3 -3
  476. package/dist/daemon/services/github-app-setup.d.ts.map +1 -1
  477. package/dist/daemon/services/groups.d.ts +5 -5
  478. package/dist/daemon/services/groups.d.ts.map +1 -1
  479. package/dist/daemon/services/health-monitor.d.ts +34 -2
  480. package/dist/daemon/services/health-monitor.d.ts.map +1 -1
  481. package/dist/daemon/services/health-monitor.js +155 -30
  482. package/dist/daemon/services/knowledge-document-edits.d.ts +3 -3
  483. package/dist/daemon/services/knowledge-document-edits.d.ts.map +1 -1
  484. package/dist/daemon/services/knowledge-documents.d.ts +3 -3
  485. package/dist/daemon/services/knowledge-documents.d.ts.map +1 -1
  486. package/dist/daemon/services/knowledge-documents.js +92 -7
  487. package/dist/daemon/services/knowledge-embedding-indexer.d.ts +7 -2
  488. package/dist/daemon/services/knowledge-embedding-indexer.d.ts.map +1 -1
  489. package/dist/daemon/services/knowledge-embedding-indexer.js +37 -3
  490. package/dist/daemon/services/knowledge-graph.d.ts +3 -3
  491. package/dist/daemon/services/knowledge-graph.d.ts.map +1 -1
  492. package/dist/daemon/services/knowledge-indexing.d.ts +3 -3
  493. package/dist/daemon/services/knowledge-indexing.d.ts.map +1 -1
  494. package/dist/daemon/services/knowledge-namespaces.d.ts +3 -3
  495. package/dist/daemon/services/knowledge-namespaces.d.ts.map +1 -1
  496. package/dist/daemon/services/knowledge-namespaces.js +72 -8
  497. package/dist/daemon/services/knowledge-reindex.d.ts +3 -3
  498. package/dist/daemon/services/knowledge-reindex.d.ts.map +1 -1
  499. package/dist/daemon/services/knowledge-reindex.js +28 -1
  500. package/dist/daemon/services/knowledge-search.d.ts +3 -3
  501. package/dist/daemon/services/knowledge-search.d.ts.map +1 -1
  502. package/dist/daemon/services/knowledge-settings.d.ts +3 -3
  503. package/dist/daemon/services/knowledge-settings.d.ts.map +1 -1
  504. package/dist/daemon/services/knowledge-settings.js +24 -0
  505. package/dist/daemon/services/knowledge-versions.d.ts +3 -3
  506. package/dist/daemon/services/knowledge-versions.d.ts.map +1 -1
  507. package/dist/daemon/services/knowledge-versions.js +68 -7
  508. package/dist/daemon/services/leaderboard.d.ts +14 -6
  509. package/dist/daemon/services/leaderboard.d.ts.map +1 -1
  510. package/dist/daemon/services/leaderboard.js +74 -15
  511. package/dist/daemon/services/local-actions.d.ts +13 -0
  512. package/dist/daemon/services/local-actions.d.ts.map +1 -0
  513. package/dist/daemon/services/local-actions.js +120 -0
  514. package/dist/daemon/services/mcp-servers.d.ts +3 -3
  515. package/dist/daemon/services/mcp-servers.d.ts.map +1 -1
  516. package/dist/daemon/services/mcp-servers.js +68 -7
  517. package/dist/daemon/services/messages.d.ts +10 -6
  518. package/dist/daemon/services/messages.d.ts.map +1 -1
  519. package/dist/daemon/services/messages.js +87 -7
  520. package/dist/daemon/services/repos.d.ts +6 -6
  521. package/dist/daemon/services/repos.d.ts.map +1 -1
  522. package/dist/daemon/services/repos.js +131 -32
  523. package/dist/daemon/services/scheduler.d.ts +23 -27
  524. package/dist/daemon/services/scheduler.d.ts.map +1 -1
  525. package/dist/daemon/services/scheduler.js +55 -28
  526. package/dist/daemon/services/schedules.d.ts +3 -3
  527. package/dist/daemon/services/schedules.d.ts.map +1 -1
  528. package/dist/daemon/services/schedules.js +68 -7
  529. package/dist/daemon/services/session-env-selections.d.ts +3 -3
  530. package/dist/daemon/services/session-env-selections.d.ts.map +1 -1
  531. package/dist/daemon/services/session-mcp-servers.d.ts +3 -3
  532. package/dist/daemon/services/session-mcp-servers.d.ts.map +1 -1
  533. package/dist/daemon/services/session-streams.d.ts +29 -0
  534. package/dist/daemon/services/session-streams.d.ts.map +1 -0
  535. package/dist/daemon/services/session-streams.js +84 -0
  536. package/dist/daemon/services/session-token-service.d.ts.map +1 -1
  537. package/dist/daemon/services/session-token-service.js +11 -4
  538. package/dist/daemon/services/sessions.d.ts +9 -5
  539. package/dist/daemon/services/sessions.d.ts.map +1 -1
  540. package/dist/daemon/services/sessions.js +143 -10
  541. package/dist/daemon/services/tasks.d.ts +11 -5
  542. package/dist/daemon/services/tasks.d.ts.map +1 -1
  543. package/dist/daemon/services/tasks.js +199 -39
  544. package/dist/daemon/services/terminals.d.ts +21 -3
  545. package/dist/daemon/services/terminals.d.ts.map +1 -1
  546. package/dist/daemon/services/terminals.js +81 -25
  547. package/dist/daemon/services/thread-session-map.d.ts +3 -3
  548. package/dist/daemon/services/thread-session-map.d.ts.map +1 -1
  549. package/dist/daemon/services/thread-session-map.js +68 -7
  550. package/dist/daemon/services/user-avatar-sync.d.ts +21 -0
  551. package/dist/daemon/services/user-avatar-sync.d.ts.map +1 -0
  552. package/dist/daemon/services/user-avatar-sync.js +267 -0
  553. package/dist/daemon/services/users.d.ts +29 -9
  554. package/dist/daemon/services/users.d.ts.map +1 -1
  555. package/dist/daemon/services/users.js +383 -30
  556. package/dist/daemon/services/zone-trigger.d.ts.map +1 -1
  557. package/dist/daemon/services/zone-trigger.js +17 -4
  558. package/dist/daemon/setup/build-info.d.ts +1 -1
  559. package/dist/daemon/setup/build-info.d.ts.map +1 -1
  560. package/dist/daemon/setup/build-info.js +5 -1
  561. package/dist/daemon/setup/database.d.ts +8 -3
  562. package/dist/daemon/setup/database.d.ts.map +1 -1
  563. package/dist/daemon/setup/database.js +26 -6
  564. package/dist/daemon/setup/first-run-admin.d.ts +2 -2
  565. package/dist/daemon/setup/first-run-admin.d.ts.map +1 -1
  566. package/dist/daemon/setup/index.js +137 -25
  567. package/dist/daemon/setup/socketio.d.ts +10 -1
  568. package/dist/daemon/setup/socketio.d.ts.map +1 -1
  569. package/dist/daemon/setup/socketio.js +108 -18
  570. package/dist/daemon/startup.d.ts +13 -2
  571. package/dist/daemon/startup.d.ts.map +1 -1
  572. package/dist/daemon/startup.js +377 -94
  573. package/dist/daemon/utils/append-system-message.d.ts +2 -2
  574. package/dist/daemon/utils/append-system-message.d.ts.map +1 -1
  575. package/dist/daemon/utils/apply-session-config-defaults.d.ts.map +1 -1
  576. package/dist/daemon/utils/apply-session-config-defaults.js +12 -1
  577. package/dist/daemon/utils/authorization.d.ts +3 -1
  578. package/dist/daemon/utils/authorization.d.ts.map +1 -1
  579. package/dist/daemon/utils/authorization.js +36 -7
  580. package/dist/daemon/utils/branch-authorization.d.ts +30 -0
  581. package/dist/daemon/utils/branch-authorization.d.ts.map +1 -1
  582. package/dist/daemon/utils/branch-authorization.js +63 -5
  583. package/dist/daemon/utils/branch-inspect.d.ts +1 -0
  584. package/dist/daemon/utils/branch-inspect.d.ts.map +1 -1
  585. package/dist/daemon/utils/branch-inspect.js +11 -3
  586. package/dist/daemon/utils/emit-service-event.d.ts +56 -0
  587. package/dist/daemon/utils/emit-service-event.d.ts.map +1 -0
  588. package/dist/daemon/utils/emit-service-event.js +23 -0
  589. package/dist/daemon/utils/executor-read-impersonation.d.ts +2 -2
  590. package/dist/daemon/utils/executor-read-impersonation.d.ts.map +1 -1
  591. package/dist/daemon/utils/git-impersonation.d.ts +10 -10
  592. package/dist/daemon/utils/git-impersonation.d.ts.map +1 -1
  593. package/dist/daemon/utils/git-remote-credential-scan.d.ts +3 -3
  594. package/dist/daemon/utils/git-remote-credential-scan.d.ts.map +1 -1
  595. package/dist/daemon/utils/git-remote-credential-scan.js +6 -2
  596. package/dist/daemon/utils/mcp-header-secrets.d.ts +3 -5
  597. package/dist/daemon/utils/mcp-header-secrets.d.ts.map +1 -1
  598. package/dist/daemon/utils/mcp-header-secrets.js +31 -2
  599. package/dist/daemon/utils/mcp-token-authorization.d.ts +18 -13
  600. package/dist/daemon/utils/mcp-token-authorization.d.ts.map +1 -1
  601. package/dist/daemon/utils/mcp-token-authorization.js +11 -5
  602. package/dist/daemon/utils/open-source-telemetry-config.d.ts +6 -0
  603. package/dist/daemon/utils/open-source-telemetry-config.d.ts.map +1 -0
  604. package/dist/daemon/utils/open-source-telemetry-config.js +21 -0
  605. package/dist/daemon/utils/open-source-telemetry-heartbeat.d.ts +7 -0
  606. package/dist/daemon/utils/open-source-telemetry-heartbeat.d.ts.map +1 -0
  607. package/dist/daemon/utils/open-source-telemetry-heartbeat.js +15 -0
  608. package/dist/daemon/utils/open-source-telemetry-usage.d.ts +9 -0
  609. package/dist/daemon/utils/open-source-telemetry-usage.d.ts.map +1 -0
  610. package/dist/daemon/utils/open-source-telemetry-usage.js +121 -0
  611. package/dist/daemon/utils/realign-repo-origin.d.ts +3 -3
  612. package/dist/daemon/utils/realign-repo-origin.d.ts.map +1 -1
  613. package/dist/daemon/utils/realign-repo-origin.js +47 -16
  614. package/dist/daemon/utils/realtime-access-cache.d.ts +9 -0
  615. package/dist/daemon/utils/realtime-access-cache.d.ts.map +1 -1
  616. package/dist/daemon/utils/realtime-access-cache.js +24 -0
  617. package/dist/daemon/utils/realtime-publish.d.ts +26 -0
  618. package/dist/daemon/utils/realtime-publish.d.ts.map +1 -1
  619. package/dist/daemon/utils/realtime-publish.js +171 -12
  620. package/dist/daemon/utils/session-queue-tenant-scope.d.ts +24 -0
  621. package/dist/daemon/utils/session-queue-tenant-scope.d.ts.map +1 -0
  622. package/dist/daemon/utils/session-queue-tenant-scope.js +133 -0
  623. package/dist/daemon/utils/session-state-hooks.d.ts +3 -3
  624. package/dist/daemon/utils/session-state-hooks.d.ts.map +1 -1
  625. package/dist/daemon/utils/session-turn-lock.d.ts +8 -1
  626. package/dist/daemon/utils/session-turn-lock.d.ts.map +1 -1
  627. package/dist/daemon/utils/session-turn-lock.js +25 -2
  628. package/dist/daemon/utils/spawn-executor.d.ts +23 -1
  629. package/dist/daemon/utils/spawn-executor.d.ts.map +1 -1
  630. package/dist/daemon/utils/spawn-executor.js +34 -4
  631. package/dist/daemon/utils/tenant-db-scope.d.ts +20 -0
  632. package/dist/daemon/utils/tenant-db-scope.d.ts.map +1 -0
  633. package/dist/daemon/utils/tenant-db-scope.js +114 -0
  634. package/dist/daemon/utils/unix-group-init.d.ts +3 -3
  635. package/dist/daemon/utils/unix-group-init.d.ts.map +1 -1
  636. package/dist/daemon/utils/upload.d.ts +6 -9
  637. package/dist/daemon/utils/upload.d.ts.map +1 -1
  638. package/dist/daemon/utils/upload.js +30 -37
  639. package/dist/daemon/widgets/env-vars/index.d.ts +26 -1
  640. package/dist/daemon/widgets/env-vars/index.d.ts.map +1 -1
  641. package/dist/daemon/widgets/env-vars/index.js +145 -21
  642. package/dist/daemon/widgets/gateway-token/index.d.ts +114 -0
  643. package/dist/daemon/widgets/gateway-token/index.d.ts.map +1 -0
  644. package/dist/daemon/widgets/gateway-token/index.js +14711 -0
  645. package/dist/daemon/widgets/index.d.ts.map +1 -1
  646. package/dist/daemon/widgets/index.js +327 -37
  647. package/dist/daemon/widgets/registry.d.ts +7 -0
  648. package/dist/daemon/widgets/registry.d.ts.map +1 -1
  649. package/dist/daemon/widgets/submissions.js +12 -9
  650. package/dist/executor/commands/environment.d.ts.map +1 -1
  651. package/dist/executor/commands/environment.js +9 -5
  652. package/dist/executor/commands/git.d.ts.map +1 -1
  653. package/dist/executor/commands/git.js +3 -1
  654. package/dist/executor/db/feathers-repositories.d.ts +19 -1
  655. package/dist/executor/db/feathers-repositories.d.ts.map +1 -1
  656. package/dist/executor/db/feathers-repositories.js +31 -1
  657. package/dist/executor/git/index.d.ts +8 -0
  658. package/dist/executor/git/index.d.ts.map +1 -0
  659. package/dist/executor/git/index.js +7 -0
  660. package/dist/executor/handlers/sdk/base-executor.d.ts.map +1 -1
  661. package/dist/executor/handlers/sdk/base-executor.js +4 -1
  662. package/dist/executor/handlers/sdk/claude.d.ts.map +1 -1
  663. package/dist/executor/handlers/sdk/claude.js +1 -1
  664. package/dist/executor/handlers/sdk/codex.d.ts.map +1 -1
  665. package/dist/executor/handlers/sdk/codex.js +1 -1
  666. package/dist/executor/handlers/sdk/copilot.d.ts.map +1 -1
  667. package/dist/executor/handlers/sdk/copilot.js +1 -1
  668. package/dist/executor/handlers/sdk/cursor.d.ts.map +1 -1
  669. package/dist/executor/handlers/sdk/cursor.js +1 -0
  670. package/dist/executor/handlers/sdk/gemini.d.ts.map +1 -1
  671. package/dist/executor/handlers/sdk/gemini.js +1 -1
  672. package/dist/executor/handlers/sdk/git-safe-directory.d.ts.map +1 -1
  673. package/dist/executor/handlers/sdk/git-safe-directory.js +1 -1
  674. package/dist/executor/handlers/sdk/opencode.d.ts.map +1 -1
  675. package/dist/executor/handlers/sdk/opencode.js +1 -1
  676. package/dist/executor/payload-types.d.ts +5 -5
  677. package/dist/executor/sdk-handlers/base/diff-enrichment.js +1 -1
  678. package/dist/executor/sdk-handlers/base/mcp-scoping.d.ts +8 -1
  679. package/dist/executor/sdk-handlers/base/mcp-scoping.d.ts.map +1 -1
  680. package/dist/executor/sdk-handlers/base/mcp-scoping.js +58 -6
  681. package/dist/executor/sdk-handlers/claude/claude-tool.d.ts +2 -2
  682. package/dist/executor/sdk-handlers/claude/claude-tool.d.ts.map +1 -1
  683. package/dist/executor/sdk-handlers/claude/claude-tool.js +2 -2
  684. package/dist/executor/sdk-handlers/claude/prompt-service.d.ts +13 -3
  685. package/dist/executor/sdk-handlers/claude/prompt-service.d.ts.map +1 -1
  686. package/dist/executor/sdk-handlers/claude/prompt-service.js +16 -3
  687. package/dist/executor/sdk-handlers/claude/query-builder.d.ts +2 -1
  688. package/dist/executor/sdk-handlers/claude/query-builder.d.ts.map +1 -1
  689. package/dist/executor/sdk-handlers/claude/query-builder.js +2 -1
  690. package/dist/executor/sdk-handlers/codex/codex-tool.d.ts +8 -12
  691. package/dist/executor/sdk-handlers/codex/codex-tool.d.ts.map +1 -1
  692. package/dist/executor/sdk-handlers/codex/codex-tool.js +14 -17
  693. package/dist/executor/sdk-handlers/codex/normalizer.d.ts.map +1 -1
  694. package/dist/executor/sdk-handlers/codex/normalizer.js +11 -1
  695. package/dist/executor/sdk-handlers/codex/pricing/litellm-openai-model-prices.json +3663 -0
  696. package/dist/executor/sdk-handlers/codex/pricing/litellm-pricing.d.ts +31 -0
  697. package/dist/executor/sdk-handlers/codex/pricing/litellm-pricing.d.ts.map +1 -0
  698. package/dist/executor/sdk-handlers/codex/pricing/litellm-pricing.js +46 -0
  699. package/dist/executor/sdk-handlers/codex/prompt-service.d.ts +3 -2
  700. package/dist/executor/sdk-handlers/codex/prompt-service.d.ts.map +1 -1
  701. package/dist/executor/sdk-handlers/codex/prompt-service.js +131 -12
  702. package/dist/executor/sdk-handlers/codex/usage.d.ts +14 -23
  703. package/dist/executor/sdk-handlers/codex/usage.d.ts.map +1 -1
  704. package/dist/executor/sdk-handlers/codex/usage.js +18 -33
  705. package/dist/executor/sdk-handlers/copilot/copilot-tool.d.ts +2 -2
  706. package/dist/executor/sdk-handlers/copilot/copilot-tool.d.ts.map +1 -1
  707. package/dist/executor/sdk-handlers/copilot/copilot-tool.js +2 -2
  708. package/dist/executor/sdk-handlers/copilot/prompt-service.d.ts +3 -2
  709. package/dist/executor/sdk-handlers/copilot/prompt-service.d.ts.map +1 -1
  710. package/dist/executor/sdk-handlers/copilot/prompt-service.js +4 -1
  711. package/dist/executor/sdk-handlers/gemini/gemini-tool.d.ts +2 -2
  712. package/dist/executor/sdk-handlers/gemini/gemini-tool.d.ts.map +1 -1
  713. package/dist/executor/sdk-handlers/gemini/gemini-tool.js +2 -2
  714. package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts +3 -2
  715. package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts.map +1 -1
  716. package/dist/executor/sdk-handlers/gemini/prompt-service.js +4 -1
  717. package/dist/executor/sdk-handlers/opencode/opencode-tool.d.ts +3 -2
  718. package/dist/executor/sdk-handlers/opencode/opencode-tool.d.ts.map +1 -1
  719. package/dist/executor/sdk-handlers/opencode/opencode-tool.js +4 -1
  720. package/dist/executor/services/feathers-client.d.ts.map +1 -1
  721. package/dist/executor/services/feathers-client.js +124 -25
  722. package/dist/git/index.cjs +1101 -0
  723. package/dist/git/index.d.ts +533 -0
  724. package/dist/git/index.d.ts.map +1 -0
  725. package/dist/git/index.js +1022 -0
  726. package/dist/git/package.json +21 -0
  727. package/dist/git/pure.cjs +185 -0
  728. package/dist/git/pure.d.ts +39 -0
  729. package/dist/git/pure.d.ts.map +1 -0
  730. package/dist/git/pure.js +139 -0
  731. package/dist/ui/assets/AgorEmojiPickerInner-leeNywMc.js +1 -0
  732. package/dist/ui/assets/App-Dpl4Cc0U.js +4 -0
  733. package/dist/ui/assets/App-Dpl4Cc0U.js.gz +0 -0
  734. package/dist/ui/assets/AppNode-wN3UZlFK.js +1 -0
  735. package/dist/ui/assets/AppNode-wN3UZlFK.js.gz +0 -0
  736. package/dist/ui/assets/ArtifactConsentModal-DjzXcP_L.js +1 -0
  737. package/dist/ui/assets/ArtifactConsentModal-DjzXcP_L.js.gz +0 -0
  738. package/dist/ui/assets/ArtifactFullscreenPage-B3b_EZ0F.js +9 -0
  739. package/dist/ui/assets/ArtifactFullscreenPage-B3b_EZ0F.js.gz +0 -0
  740. package/dist/ui/assets/ArtifactNode-DISy2T-6.js +9 -0
  741. package/dist/ui/assets/ArtifactNode-DISy2T-6.js.gz +0 -0
  742. package/dist/ui/assets/AutocompleteTextarea-DUpsoEGr.js +19 -0
  743. package/dist/ui/assets/AutocompleteTextarea-DUpsoEGr.js.gz +0 -0
  744. package/dist/ui/assets/BoardObjectNodes-BakeGpIX.js +34 -0
  745. package/dist/ui/assets/BoardObjectNodes-BakeGpIX.js.gz +0 -0
  746. package/dist/ui/assets/CodeEditor.inner-HmSdTLW5.js +7 -0
  747. package/dist/ui/assets/CodeEditor.inner-HmSdTLW5.js.gz +0 -0
  748. package/dist/ui/assets/ConversationView-mWaA-B1f.js +1 -0
  749. package/dist/ui/assets/ConversationView-mWaA-B1f.js.gz +0 -0
  750. package/dist/ui/assets/EmbeddedTerminal-NNoyPA81.js +2 -0
  751. package/dist/ui/assets/EmbeddedTerminal-NNoyPA81.js.gz +0 -0
  752. package/dist/ui/assets/KnowledgePage-CkxVnRvz.js +24 -0
  753. package/dist/ui/assets/KnowledgePage-CkxVnRvz.js.gz +0 -0
  754. package/dist/ui/assets/{MarketingScreenshotPage-zv5RUCuV.js → MarketingScreenshotPage-B86Gs8jx.js} +2 -2
  755. package/dist/ui/assets/MarketingScreenshotPage-B86Gs8jx.js.gz +0 -0
  756. package/dist/ui/assets/MobileApp-BPs-SXvz.js +1 -0
  757. package/dist/ui/assets/MobileApp-BPs-SXvz.js.gz +0 -0
  758. package/dist/ui/assets/{SessionCanvas-mEmYGZhC.css → SessionCanvas-Bh7Yg5dZ.css} +1 -1
  759. package/dist/ui/assets/SessionCanvas-Bh7Yg5dZ.css.gz +0 -0
  760. package/dist/ui/assets/SessionCanvas-xVfDoEtz.js +13 -0
  761. package/dist/ui/assets/SessionCanvas-xVfDoEtz.js.gz +0 -0
  762. package/dist/ui/assets/{StreamdownDemoPage-wzWaqWwr.js → StreamdownDemoPage-CvWLzVsv.js} +2 -2
  763. package/dist/ui/assets/StreamdownDemoPage-CvWLzVsv.js.gz +0 -0
  764. package/dist/ui/assets/TerminalModal-ExOgsuOP.js +2 -0
  765. package/dist/ui/assets/TerminalModal-ExOgsuOP.js.gz +0 -0
  766. package/dist/ui/assets/ThemeSwitcher-Cgyp5ruu.js +1 -0
  767. package/dist/ui/assets/ThemeSwitcher-Cgyp5ruu.js.gz +0 -0
  768. package/dist/ui/assets/ThemedSyntaxHighlighter.inner-rpCN9S6K.js +1 -0
  769. package/dist/ui/assets/{antd-CfbbHJOz.js → antd-BCqimh1J.js} +5 -5
  770. package/dist/ui/assets/{antd-CfbbHJOz.js.gz → antd-BCqimh1J.js.gz} +0 -0
  771. package/dist/ui/assets/architecture-U656AL7Q-BxSQIjrE.js +1 -0
  772. package/dist/ui/assets/architectureDiagram-VXUJARFQ-pDpGHSqT.js +36 -0
  773. package/dist/ui/assets/architectureDiagram-VXUJARFQ-pDpGHSqT.js.gz +0 -0
  774. package/dist/ui/assets/{blockDiagram-VD42YOAC-BhZaEN19.js → blockDiagram-VD42YOAC-uP8JTJpK.js} +4 -4
  775. package/dist/ui/assets/blockDiagram-VD42YOAC-uP8JTJpK.js.gz +0 -0
  776. package/dist/ui/assets/{c4Diagram-YG6GDRKO-Dk_UH-sY.js → c4Diagram-YG6GDRKO-qQe72Mm7.js} +2 -2
  777. package/dist/ui/assets/c4Diagram-YG6GDRKO-qQe72Mm7.js.gz +0 -0
  778. package/dist/ui/assets/channel-CoUBs6Zn.js +1 -0
  779. package/dist/ui/assets/{chunk-4BX2VUAB-XprbG2TG.js → chunk-4BX2VUAB-sz-YE8Nt.js} +1 -1
  780. package/dist/ui/assets/chunk-4ZMWKKQ3-3oKtfWXp.js +3 -0
  781. package/dist/ui/assets/chunk-4ZMWKKQ3-3oKtfWXp.js.gz +0 -0
  782. package/dist/ui/assets/chunk-55IACEB6-BS04dgKF.js +1 -0
  783. package/dist/ui/assets/{chunk-ABZYJK2D-BJcrryHK.js → chunk-ABZYJK2D-t3Gkphds.js} +3 -3
  784. package/dist/ui/assets/chunk-ABZYJK2D-t3Gkphds.js.gz +0 -0
  785. package/dist/ui/assets/{chunk-AGHRB4JF-DvxmfbM0.js → chunk-AGHRB4JF-D_QmWxbY.js} +1 -1
  786. package/dist/ui/assets/chunk-AGHRB4JF-D_QmWxbY.js.gz +0 -0
  787. package/dist/ui/assets/{chunk-ATLVNIR6-DbeJ0OrR.js → chunk-ATLVNIR6-Bmg7-Ufz.js} +1 -1
  788. package/dist/ui/assets/chunk-ATLVNIR6-Bmg7-Ufz.js.gz +0 -0
  789. package/dist/ui/assets/{chunk-B4BG7PRW-C53q2ggf.js → chunk-B4BG7PRW-dnSEE1u-.js} +3 -3
  790. package/dist/ui/assets/chunk-B4BG7PRW-dnSEE1u-.js.gz +0 -0
  791. package/dist/ui/assets/{chunk-CVBHYZKI-B3EBSlb3.js → chunk-CVBHYZKI-BStaYnF0.js} +1 -1
  792. package/dist/ui/assets/{chunk-DI55MBZ5-vIyNEQN-.js → chunk-DI55MBZ5-28dvx6o3.js} +1 -1
  793. package/dist/ui/assets/chunk-DI55MBZ5-28dvx6o3.js.gz +0 -0
  794. package/dist/ui/assets/chunk-EXTU4WIE-X-FURkEh.js +1 -0
  795. package/dist/ui/assets/{chunk-FMBD7UC4-rddmfK-Z.js → chunk-FMBD7UC4-C_63gC9S.js} +1 -1
  796. package/dist/ui/assets/{chunk-HN2XXSSU-Dttqcg3b.js → chunk-HN2XXSSU-UFD374KI.js} +1 -1
  797. package/dist/ui/assets/chunk-HN2XXSSU-UFD374KI.js.gz +0 -0
  798. package/dist/ui/assets/chunk-JA3XYJ7Z-B60hLNeR.js +11 -0
  799. package/dist/ui/assets/chunk-JA3XYJ7Z-B60hLNeR.js.gz +0 -0
  800. package/dist/ui/assets/{chunk-JZLCHNYA-EUmx2y4H.js → chunk-JZLCHNYA-ButC6pwN.js} +5 -5
  801. package/dist/ui/assets/chunk-JZLCHNYA-ButC6pwN.js.gz +0 -0
  802. package/dist/ui/assets/{chunk-MI3HLSF2-65n9Mkyc.js → chunk-MI3HLSF2-BivYzoSV.js} +1 -1
  803. package/dist/ui/assets/chunk-MI3HLSF2-BivYzoSV.js.gz +0 -0
  804. package/dist/ui/assets/chunk-N4CR4FBY-mVWzo5wJ.js +2 -0
  805. package/dist/ui/assets/chunk-N4CR4FBY-mVWzo5wJ.js.gz +0 -0
  806. package/dist/ui/assets/{chunk-QN33PNHL-DsRKK6NR.js → chunk-QN33PNHL-tXtHZpaG.js} +1 -1
  807. package/dist/ui/assets/{chunk-QXUST7PY-BCYnMiS3.js → chunk-QXUST7PY-DATib_Vv.js} +2 -2
  808. package/dist/ui/assets/chunk-QXUST7PY-DATib_Vv.js.gz +0 -0
  809. package/dist/ui/assets/chunk-QZHKN3VN-y6l249e5.js +1 -0
  810. package/dist/ui/assets/chunk-S3R3BYOJ-BEtfmflI.js +2 -0
  811. package/dist/ui/assets/chunk-S3R3BYOJ-BEtfmflI.js.gz +0 -0
  812. package/dist/ui/assets/{chunk-TZMSLE5B-BuQUQcTr.js → chunk-TZMSLE5B-BY1ZtogK.js} +1 -1
  813. package/dist/ui/assets/chunk-TZMSLE5B-BY1ZtogK.js.gz +0 -0
  814. package/dist/ui/assets/classDiagram-2ON5EDUG-BYvq-uPY.js +1 -0
  815. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-BYvq-uPY.js +1 -0
  816. package/dist/ui/assets/constants-CYzQKfD1.js +1 -0
  817. package/dist/ui/assets/{cose-bilkent-S5V4N54A-CnPB3ARO.js → cose-bilkent-S5V4N54A-DPvYrqGG.js} +1 -1
  818. package/dist/ui/assets/cose-bilkent-S5V4N54A-DPvYrqGG.js.gz +0 -0
  819. package/dist/ui/assets/{dagre-6UL2VRFP-DhS-k_Se.js → dagre-6UL2VRFP-D800J6qb.js} +1 -1
  820. package/dist/ui/assets/dagre-6UL2VRFP-D800J6qb.js.gz +0 -0
  821. package/dist/ui/assets/{dagre-KgLoHEuy.js → dagre-TNc4wezg.js} +1 -1
  822. package/dist/ui/assets/dagre-TNc4wezg.js.gz +0 -0
  823. package/dist/ui/assets/diagram-PSM6KHXK-CGdP9F-X.js +24 -0
  824. package/dist/ui/assets/diagram-PSM6KHXK-CGdP9F-X.js.gz +0 -0
  825. package/dist/ui/assets/{diagram-QEK2KX5R-BPCitvbo.js → diagram-QEK2KX5R-BD5lOCe5.js} +1 -1
  826. package/dist/ui/assets/diagram-QEK2KX5R-BD5lOCe5.js.gz +0 -0
  827. package/dist/ui/assets/{diagram-S2PKOQOG-NW4uK6sx.js → diagram-S2PKOQOG-cp3l22vN.js} +1 -1
  828. package/dist/ui/assets/diagram-S2PKOQOG-cp3l22vN.js.gz +0 -0
  829. package/dist/ui/assets/editor-Cr0W5BQI.js +39 -0
  830. package/dist/ui/assets/editor-Cr0W5BQI.js.gz +0 -0
  831. package/dist/ui/assets/emoji-Bv3m24sO.js +3 -0
  832. package/dist/ui/assets/emoji-Bv3m24sO.js.gz +0 -0
  833. package/dist/ui/assets/{erDiagram-Q2GNP2WA-me1fboaf.js → erDiagram-Q2GNP2WA-CQSXRgqr.js} +2 -2
  834. package/dist/ui/assets/erDiagram-Q2GNP2WA-CQSXRgqr.js.gz +0 -0
  835. package/dist/ui/assets/flowDiagram-NV44I4VS-CKcKpkph.js +162 -0
  836. package/dist/ui/assets/flowDiagram-NV44I4VS-CKcKpkph.js.gz +0 -0
  837. package/dist/ui/assets/ganttDiagram-LVOFAZNH-DlAHzXO5.js +267 -0
  838. package/dist/ui/assets/ganttDiagram-LVOFAZNH-DlAHzXO5.js.gz +0 -0
  839. package/dist/ui/assets/{gitGraph-F6HP7TQM-CfFE_uAC.js → gitGraph-F6HP7TQM-DeuXy4B1.js} +1 -1
  840. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-aB-AI4Vq.js +65 -0
  841. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-aB-AI4Vq.js.gz +0 -0
  842. package/dist/ui/assets/index-B-qHc0o5.js +63 -0
  843. package/dist/ui/assets/index-B-qHc0o5.js.gz +0 -0
  844. package/dist/ui/assets/{index-DxuPq13l.css → index-qkT7Qqm2.css} +1 -1
  845. package/dist/ui/assets/index-qkT7Qqm2.css.gz +0 -0
  846. package/dist/ui/assets/{info-NVLQJR56-i_xHYg3f.js → info-NVLQJR56-B9PG7xsc.js} +1 -1
  847. package/dist/ui/assets/{infoDiagram-ER5ION4S-2NL93b78.js → infoDiagram-ER5ION4S-C5Wpoqim.js} +1 -1
  848. package/dist/ui/assets/{journeyDiagram-XKPGCS4Q-CZF-2DHU.js → journeyDiagram-XKPGCS4Q-CHLziqfS.js} +3 -3
  849. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CHLziqfS.js.gz +0 -0
  850. package/dist/ui/assets/{kanban-definition-3W4ZIXB7-CfvJIOny.js → kanban-definition-3W4ZIXB7-Dq7GzQE_.js} +1 -1
  851. package/dist/ui/assets/kanban-definition-3W4ZIXB7-Dq7GzQE_.js.gz +0 -0
  852. package/dist/ui/assets/{line-DDv8kOJk.js → line-DHKNg83I.js} +1 -1
  853. package/dist/ui/assets/{linear-Daef-l29.js → linear-BvUfn0I8.js} +1 -1
  854. package/dist/ui/assets/linear-BvUfn0I8.js.gz +0 -0
  855. package/dist/ui/assets/{mermaid-parser.core-CdK9QgYV.js → mermaid-parser.core-C6d9tKoo.js} +2 -2
  856. package/dist/ui/assets/mermaid-parser.core-C6d9tKoo.js.gz +0 -0
  857. package/dist/ui/assets/mermaid.core-CxE5KezR.js +11 -0
  858. package/dist/ui/assets/mermaid.core-CxE5KezR.js.gz +0 -0
  859. package/dist/ui/assets/{mindmap-definition-VGOIOE7T-Cb3QMflX.js → mindmap-definition-VGOIOE7T-DmPoQ48w.js} +1 -1
  860. package/dist/ui/assets/mindmap-definition-VGOIOE7T-DmPoQ48w.js.gz +0 -0
  861. package/dist/ui/assets/{packet-BFZMPI3H-Bm2uwz4i.js → packet-BFZMPI3H-JZEkVZxU.js} +1 -1
  862. package/dist/ui/assets/{particles-DsJFOarW.js → particles-CxMmUw86.js} +1 -1
  863. package/dist/ui/assets/particles-CxMmUw86.js.gz +0 -0
  864. package/dist/ui/assets/{pie-7BOR55EZ-5i17tVnF.js → pie-7BOR55EZ-_1II5pYQ.js} +1 -1
  865. package/dist/ui/assets/{pieDiagram-ADFJNKIX-BxIwQWvw.js → pieDiagram-ADFJNKIX-DrNkH33i.js} +1 -1
  866. package/dist/ui/assets/pieDiagram-ADFJNKIX-DrNkH33i.js.gz +0 -0
  867. package/dist/ui/assets/{quadrantDiagram-AYHSOK5B-B5HPe4ga.js → quadrantDiagram-AYHSOK5B-DOpC-HEF.js} +3 -3
  868. package/dist/ui/assets/quadrantDiagram-AYHSOK5B-DOpC-HEF.js.gz +0 -0
  869. package/dist/ui/assets/{radar-NHE76QYJ-BTn-tq0k.js → radar-NHE76QYJ-DDmqhzEZ.js} +1 -1
  870. package/dist/ui/assets/reactflow-D98uPOMq.js +2 -0
  871. package/dist/ui/assets/reactflow-D98uPOMq.js.gz +0 -0
  872. package/dist/ui/assets/{requirementDiagram-UZGBJVZJ-YfI6llkX.js → requirementDiagram-UZGBJVZJ-Bzx0iEPP.js} +1 -1
  873. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-Bzx0iEPP.js.gz +0 -0
  874. package/dist/ui/assets/{sandpack-D7koO5op.js → sandpack-059Z4UWP.js} +38 -38
  875. package/dist/ui/assets/sandpack-059Z4UWP.js.gz +0 -0
  876. package/dist/ui/assets/sandpackDefaults-CPMNDsw7.js +1 -0
  877. package/dist/ui/assets/sandpackDefaults-CPMNDsw7.js.gz +0 -0
  878. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-Do9pvfDv.js +10 -0
  879. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-Do9pvfDv.js.gz +0 -0
  880. package/dist/ui/assets/{sequenceDiagram-WL72ISMW-DAe4Um17.js → sequenceDiagram-WL72ISMW-CN8neUTA.js} +6 -6
  881. package/dist/ui/assets/sequenceDiagram-WL72ISMW-CN8neUTA.js.gz +0 -0
  882. package/dist/ui/assets/src-DEbsv3pp.js +34 -0
  883. package/dist/ui/assets/src-DEbsv3pp.js.gz +0 -0
  884. package/dist/ui/assets/stateDiagram-FKZM4ZOC-BluWJi8n.js +1 -0
  885. package/dist/ui/assets/stateDiagram-FKZM4ZOC-BluWJi8n.js.gz +0 -0
  886. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-DeyqBMDR.js +1 -0
  887. package/dist/ui/assets/streamdown-BT1twtFc.js +521 -0
  888. package/dist/ui/assets/streamdown-BT1twtFc.js.gz +0 -0
  889. package/dist/ui/assets/syntax-CBu6nLfm.js +9 -0
  890. package/dist/ui/assets/syntax-CBu6nLfm.js.gz +0 -0
  891. package/dist/ui/assets/{timeline-definition-IT6M3QCI-D6P5txjT.js → timeline-definition-IT6M3QCI-WdUNkiRj.js} +16 -16
  892. package/dist/ui/assets/timeline-definition-IT6M3QCI-WdUNkiRj.js.gz +0 -0
  893. package/dist/ui/assets/{treemap-KMMF4GRG-Bitm3gy4.js → treemap-KMMF4GRG-CoriU4Jl.js} +1 -1
  894. package/dist/ui/assets/{useUserLocalStorage-Ckb8HsIw.js → useUserLocalStorage-GidNiOPC.js} +1 -1
  895. package/dist/ui/assets/useUserLocalStorage-GidNiOPC.js.gz +0 -0
  896. package/dist/ui/assets/{xychartDiagram-PRI3JC2R-CsybjUbd.js → xychartDiagram-PRI3JC2R-CgBAKNt2.js} +1 -1
  897. package/dist/ui/assets/xychartDiagram-PRI3JC2R-CgBAKNt2.js.gz +0 -0
  898. package/dist/ui/index.html +11 -11
  899. package/dist/ui/index.html.gz +0 -0
  900. package/package.json +6 -5
  901. package/scripts/postinstall.js +27 -19
  902. package/dist/cli/commands/daemon/sync.d.ts.map +0 -1
  903. package/dist/ui/assets/App-DcEY8Ota.js +0 -3
  904. package/dist/ui/assets/App-DcEY8Ota.js.gz +0 -0
  905. package/dist/ui/assets/ArtifactConsentModal-CiCbK9iv.js +0 -1
  906. package/dist/ui/assets/ArtifactConsentModal-CiCbK9iv.js.gz +0 -0
  907. package/dist/ui/assets/ArtifactFullscreenPage-CfsTEGKd.js +0 -9
  908. package/dist/ui/assets/ArtifactFullscreenPage-CfsTEGKd.js.gz +0 -0
  909. package/dist/ui/assets/AutocompleteTextarea-BAFFH_5e.js +0 -18
  910. package/dist/ui/assets/AutocompleteTextarea-BAFFH_5e.js.gz +0 -0
  911. package/dist/ui/assets/BoardObjectNodes-D-O6bZIG.js +0 -34
  912. package/dist/ui/assets/BoardObjectNodes-D-O6bZIG.js.gz +0 -0
  913. package/dist/ui/assets/CodeEditor.inner-DBgsP4tn.js +0 -8
  914. package/dist/ui/assets/CodeEditor.inner-DBgsP4tn.js.gz +0 -0
  915. package/dist/ui/assets/ConversationView-CUWR0gR6.js +0 -1
  916. package/dist/ui/assets/ConversationView-CUWR0gR6.js.gz +0 -0
  917. package/dist/ui/assets/KnowledgePage-B2bzlXfn.js +0 -24
  918. package/dist/ui/assets/KnowledgePage-B2bzlXfn.js.gz +0 -0
  919. package/dist/ui/assets/MarketingScreenshotPage-zv5RUCuV.js.gz +0 -0
  920. package/dist/ui/assets/MobileApp-VgVnsnsN.js +0 -1
  921. package/dist/ui/assets/MobileApp-VgVnsnsN.js.gz +0 -0
  922. package/dist/ui/assets/SessionCanvas-f1-1Gbcw.js +0 -20
  923. package/dist/ui/assets/SessionCanvas-f1-1Gbcw.js.gz +0 -0
  924. package/dist/ui/assets/SessionCanvas-mEmYGZhC.css.gz +0 -0
  925. package/dist/ui/assets/StreamdownDemoPage-wzWaqWwr.js.gz +0 -0
  926. package/dist/ui/assets/ThemeSwitcher-Dly2y9pi.js +0 -1
  927. package/dist/ui/assets/ThemeSwitcher-Dly2y9pi.js.gz +0 -0
  928. package/dist/ui/assets/architecture-U656AL7Q-CykGFbQU.js +0 -1
  929. package/dist/ui/assets/architectureDiagram-VXUJARFQ-C8HXAenz.js +0 -36
  930. package/dist/ui/assets/architectureDiagram-VXUJARFQ-C8HXAenz.js.gz +0 -0
  931. package/dist/ui/assets/blockDiagram-VD42YOAC-BhZaEN19.js.gz +0 -0
  932. package/dist/ui/assets/c4Diagram-YG6GDRKO-Dk_UH-sY.js.gz +0 -0
  933. package/dist/ui/assets/channel-D6_nUWlW.js +0 -1
  934. package/dist/ui/assets/chunk-55IACEB6-ByzqIgSb.js +0 -1
  935. package/dist/ui/assets/chunk-ABZYJK2D-BJcrryHK.js.gz +0 -0
  936. package/dist/ui/assets/chunk-AGHRB4JF-DvxmfbM0.js.gz +0 -0
  937. package/dist/ui/assets/chunk-ATLVNIR6-DbeJ0OrR.js.gz +0 -0
  938. package/dist/ui/assets/chunk-B4BG7PRW-C53q2ggf.js.gz +0 -0
  939. package/dist/ui/assets/chunk-DI55MBZ5-vIyNEQN-.js.gz +0 -0
  940. package/dist/ui/assets/chunk-EXTU4WIE-B3ObkuOm.js +0 -1
  941. package/dist/ui/assets/chunk-HN2XXSSU-Dttqcg3b.js.gz +0 -0
  942. package/dist/ui/assets/chunk-JA3XYJ7Z-DbNDev3D.js +0 -11
  943. package/dist/ui/assets/chunk-JA3XYJ7Z-DbNDev3D.js.gz +0 -0
  944. package/dist/ui/assets/chunk-JZLCHNYA-EUmx2y4H.js.gz +0 -0
  945. package/dist/ui/assets/chunk-MI3HLSF2-65n9Mkyc.js.gz +0 -0
  946. package/dist/ui/assets/chunk-N4CR4FBY-mv5koXqW.js +0 -2
  947. package/dist/ui/assets/chunk-N4CR4FBY-mv5koXqW.js.gz +0 -0
  948. package/dist/ui/assets/chunk-QXUST7PY-BCYnMiS3.js.gz +0 -0
  949. package/dist/ui/assets/chunk-QZHKN3VN-HucAw4xW.js +0 -1
  950. package/dist/ui/assets/chunk-S3R3BYOJ-CWMEa9Dc.js +0 -2
  951. package/dist/ui/assets/chunk-S3R3BYOJ-CWMEa9Dc.js.gz +0 -0
  952. package/dist/ui/assets/chunk-TZMSLE5B-BuQUQcTr.js.gz +0 -0
  953. package/dist/ui/assets/classDiagram-2ON5EDUG-CUT3rPTB.js +0 -1
  954. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-CUT3rPTB.js +0 -1
  955. package/dist/ui/assets/cose-bilkent-S5V4N54A-CnPB3ARO.js.gz +0 -0
  956. package/dist/ui/assets/dagre-6UL2VRFP-DhS-k_Se.js.gz +0 -0
  957. package/dist/ui/assets/dagre-KgLoHEuy.js.gz +0 -0
  958. package/dist/ui/assets/diagram-PSM6KHXK-BZg3MJmb.js +0 -24
  959. package/dist/ui/assets/diagram-PSM6KHXK-BZg3MJmb.js.gz +0 -0
  960. package/dist/ui/assets/diagram-QEK2KX5R-BPCitvbo.js.gz +0 -0
  961. package/dist/ui/assets/diagram-S2PKOQOG-NW4uK6sx.js.gz +0 -0
  962. package/dist/ui/assets/editor-CzFWIUw2.js +0 -39
  963. package/dist/ui/assets/editor-CzFWIUw2.js.gz +0 -0
  964. package/dist/ui/assets/emoji-Dkz4Zzv_.js +0 -3
  965. package/dist/ui/assets/emoji-Dkz4Zzv_.js.gz +0 -0
  966. package/dist/ui/assets/erDiagram-Q2GNP2WA-me1fboaf.js.gz +0 -0
  967. package/dist/ui/assets/flowDiagram-NV44I4VS-DzE8dGsh.js +0 -162
  968. package/dist/ui/assets/flowDiagram-NV44I4VS-DzE8dGsh.js.gz +0 -0
  969. package/dist/ui/assets/ganttDiagram-LVOFAZNH-CFQD09Mi.js +0 -267
  970. package/dist/ui/assets/ganttDiagram-LVOFAZNH-CFQD09Mi.js.gz +0 -0
  971. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-CaVoxU4C.js +0 -65
  972. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-CaVoxU4C.js.gz +0 -0
  973. package/dist/ui/assets/index-BN5_Qq7R.js +0 -324
  974. package/dist/ui/assets/index-BN5_Qq7R.js.gz +0 -0
  975. package/dist/ui/assets/index-DxuPq13l.css.gz +0 -0
  976. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CZF-2DHU.js.gz +0 -0
  977. package/dist/ui/assets/kanban-definition-3W4ZIXB7-CfvJIOny.js.gz +0 -0
  978. package/dist/ui/assets/katex-CamJ39w1.js +0 -257
  979. package/dist/ui/assets/katex-CamJ39w1.js.gz +0 -0
  980. package/dist/ui/assets/linear-Daef-l29.js.gz +0 -0
  981. package/dist/ui/assets/mermaid-parser.core-CdK9QgYV.js.gz +0 -0
  982. package/dist/ui/assets/mermaid.core-D6GS9mU-.js +0 -11
  983. package/dist/ui/assets/mermaid.core-D6GS9mU-.js.gz +0 -0
  984. package/dist/ui/assets/message-SqLqNYcv.js +0 -36
  985. package/dist/ui/assets/message-SqLqNYcv.js.gz +0 -0
  986. package/dist/ui/assets/mindmap-definition-VGOIOE7T-Cb3QMflX.js.gz +0 -0
  987. package/dist/ui/assets/particles-DsJFOarW.js.gz +0 -0
  988. package/dist/ui/assets/pieDiagram-ADFJNKIX-BxIwQWvw.js.gz +0 -0
  989. package/dist/ui/assets/quadrantDiagram-AYHSOK5B-B5HPe4ga.js.gz +0 -0
  990. package/dist/ui/assets/reactflow-Bf74ngoo.js +0 -2
  991. package/dist/ui/assets/reactflow-Bf74ngoo.js.gz +0 -0
  992. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-YfI6llkX.js.gz +0 -0
  993. package/dist/ui/assets/sandpack-D7koO5op.js.gz +0 -0
  994. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-DOk_B10B.js +0 -10
  995. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-DOk_B10B.js.gz +0 -0
  996. package/dist/ui/assets/sequenceDiagram-WL72ISMW-DAe4Um17.js.gz +0 -0
  997. package/dist/ui/assets/stateDiagram-FKZM4ZOC-CCesDu_C.js +0 -1
  998. package/dist/ui/assets/stateDiagram-FKZM4ZOC-CCesDu_C.js.gz +0 -0
  999. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-CMlIrsoO.js +0 -1
  1000. package/dist/ui/assets/syntax-C-M-8jOU.js +0 -10
  1001. package/dist/ui/assets/syntax-C-M-8jOU.js.gz +0 -0
  1002. package/dist/ui/assets/theme-BQZdiqwv.js +0 -1
  1003. package/dist/ui/assets/timeline-definition-IT6M3QCI-D6P5txjT.js.gz +0 -0
  1004. package/dist/ui/assets/useUserLocalStorage-Ckb8HsIw.js.gz +0 -0
  1005. package/dist/ui/assets/xychartDiagram-PRI3JC2R-CsybjUbd.js.gz +0 -0
  1006. /package/dist/cli/commands/{admin → local}/sync-unix.d.ts +0 -0
@@ -1,5 +1,7 @@
1
1
  var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
2
3
  var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
3
5
  var __esm = (fn, res) => function __init() {
4
6
  return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
5
7
  };
@@ -7,6 +9,15 @@ var __export = (target, all) => {
7
9
  for (var name in all)
8
10
  __defProp(target, name, { get: all[name], enumerable: true });
9
11
  };
12
+ var __copyProps = (to, from, except, desc6) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc6 = __getOwnPropDesc(from, key)) || desc6.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
10
21
 
11
22
  // ../../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/esm_shims.js
12
23
  import path from "path";
@@ -136,6 +147,71 @@ var init_executor_heartbeat = __esm({
136
147
  }
137
148
  });
138
149
 
150
+ // src/config/multitenancy.ts
151
+ function detectPostgresUrl(url) {
152
+ if (!url) return false;
153
+ const lower = url.toLowerCase();
154
+ return lower.startsWith("postgresql://") || lower.startsWith("postgres://") || lower.startsWith("pg://");
155
+ }
156
+ function resolveMultiTenancyDatabaseDialect(config = {}) {
157
+ if (process.env.AGOR_DB_DIALECT === "postgresql" || process.env.AGOR_DB_DIALECT === "sqlite") {
158
+ return process.env.AGOR_DB_DIALECT;
159
+ }
160
+ if (detectPostgresUrl(process.env.DATABASE_URL)) return "postgresql";
161
+ if (config.database?.dialect === "postgresql" || config.database?.dialect === "sqlite") {
162
+ return config.database.dialect;
163
+ }
164
+ if (detectPostgresUrl(config.database?.postgresql?.url) || config.database?.postgresql?.host) {
165
+ return "postgresql";
166
+ }
167
+ return "sqlite";
168
+ }
169
+ function resolveMultiTenancyConfig(config) {
170
+ const raw = config.multi_tenancy ?? {};
171
+ const mode = raw.mode ?? "static";
172
+ return {
173
+ mode,
174
+ static_tenant_id: raw.static_tenant_id?.trim() || DEFAULT_STATIC_TENANT_ID,
175
+ ...raw.auth_claim ? { auth_claim: raw.auth_claim } : {},
176
+ ...raw.trusted_header ? { trusted_header: raw.trusted_header } : {}
177
+ };
178
+ }
179
+ function assertValidMultiTenancyConfig(config) {
180
+ const resolved = resolveMultiTenancyConfig(config);
181
+ if (resolved.mode !== "static" && resolved.mode !== "required_from_auth") {
182
+ throw new Error("Config error: multi_tenancy.mode must be one of: static, required_from_auth");
183
+ }
184
+ if (!resolved.static_tenant_id) {
185
+ throw new Error("Config error: multi_tenancy.static_tenant_id must not be empty");
186
+ }
187
+ if (resolved.auth_claim && RESERVED_AUTH_CLAIMS.has(resolved.auth_claim)) {
188
+ throw new Error(
189
+ `Config error: multi_tenancy.auth_claim cannot be reserved JWT claim '${resolved.auth_claim}'`
190
+ );
191
+ }
192
+ if (resolved.mode === "required_from_auth") {
193
+ if (resolveMultiTenancyDatabaseDialect(config) !== "postgresql") {
194
+ throw new Error(
195
+ "Config error: multi_tenancy.required_from_auth requires database.dialect: postgresql"
196
+ );
197
+ }
198
+ if (!resolved.auth_claim && !resolved.trusted_header) {
199
+ throw new Error(
200
+ "Config error: multi_tenancy.required_from_auth requires multi_tenancy.auth_claim or multi_tenancy.trusted_header"
201
+ );
202
+ }
203
+ }
204
+ }
205
+ var DEFAULT_STATIC_TENANT_ID, RESERVED_AUTH_CLAIMS;
206
+ var init_multitenancy = __esm({
207
+ "src/config/multitenancy.ts"() {
208
+ "use strict";
209
+ init_esm_shims();
210
+ DEFAULT_STATIC_TENANT_ID = "default";
211
+ RESERVED_AUTH_CLAIMS = /* @__PURE__ */ new Set(["aud", "exp", "iat", "iss", "jti", "nbf", "sub", "type"]);
212
+ }
213
+ });
214
+
139
215
  // src/config/types.ts
140
216
  var BRANCH_STORAGE_MODES, DEFAULT_BRANCH_STORAGE_MODE;
141
217
  var init_types = __esm({
@@ -180,6 +256,7 @@ __export(config_manager_exports, {
180
256
  requireDaemonUser: () => requireDaemonUser,
181
257
  requirePublicBaseUrl: () => requirePublicBaseUrl,
182
258
  resolveBranchStorageConfig: () => resolveBranchStorageConfig,
259
+ resolveExecutionSecurityMode: () => resolveExecutionSecurityMode,
183
260
  saveConfig: () => saveConfig,
184
261
  setConfigValue: () => setConfigValue,
185
262
  unsetConfigValue: () => unsetConfigValue
@@ -188,14 +265,14 @@ import { readFileSync, statSync } from "fs";
188
265
  import fs2 from "fs/promises";
189
266
  import os from "os";
190
267
  import path2 from "path";
191
- import yaml2 from "js-yaml";
268
+ import * as yaml2 from "js-yaml";
192
269
  function cacheKeyMatches(a, b) {
193
270
  return a.mtimeMs === b.mtimeMs && a.size === b.size;
194
271
  }
195
272
  function statCacheKey(configPath) {
196
273
  try {
197
- const stat2 = statSync(configPath);
198
- return { mtimeMs: stat2.mtimeMs, size: stat2.size };
274
+ const stat = statSync(configPath);
275
+ return { mtimeMs: stat.mtimeMs, size: stat.size };
199
276
  } catch (error) {
200
277
  if (error.code === "ENOENT") {
201
278
  return NO_FILE_KEY;
@@ -223,6 +300,9 @@ function __resetConfigCacheForTests() {
223
300
  invalidateConfigCache();
224
301
  }
225
302
  function parseAndValidateConfig(content) {
303
+ if (content.trim() === "") {
304
+ return {};
305
+ }
226
306
  const parsed = yaml2.load(content);
227
307
  const finalConfig = parsed || {};
228
308
  validateConfig(finalConfig);
@@ -260,6 +340,7 @@ To update: agor config set execution.unix_user_mode insulated`
260
340
  `Config error: execution.managed_envs_execution_mode must be one of: hybrid, webhook-only`
261
341
  );
262
342
  }
343
+ assertValidMultiTenancyConfig(config);
263
344
  validateOptionalHttpUrl(
264
345
  config.external_launch,
265
346
  "login_redirect_url",
@@ -377,7 +458,12 @@ function getDefaultConfig() {
377
458
  // Default: sync passwords to Unix
378
459
  executor_heartbeat: resolveExecutorHeartbeatConfig()
379
460
  },
380
- analytics: getDefaultAnalyticsConfig()
461
+ analytics: getDefaultAnalyticsConfig(),
462
+ telemetry: {},
463
+ multi_tenancy: {
464
+ mode: "static",
465
+ static_tenant_id: "default"
466
+ }
381
467
  };
382
468
  }
383
469
  function expandHomePath(input) {
@@ -409,7 +495,8 @@ async function getConfigValue(key) {
409
495
  ui: { ...defaults.ui, ...config.ui },
410
496
  execution: { ...defaults.execution, ...config.execution },
411
497
  paths: { ...defaults.paths, ...config.paths },
412
- analytics: { ...defaults.analytics, ...config.analytics }
498
+ analytics: { ...defaults.analytics, ...config.analytics },
499
+ telemetry: { ...defaults.telemetry, ...config.telemetry }
413
500
  };
414
501
  const parts = key.split(".");
415
502
  let value = merged;
@@ -571,10 +658,10 @@ function requireDaemonUser(config) {
571
658
  if (config.daemon?.unix_user) {
572
659
  return config.daemon.unix_user;
573
660
  }
574
- const unixIsolationEnabled = config.execution?.branch_rbac === true || config.execution?.unix_user_mode && config.execution.unix_user_mode !== "simple";
661
+ const unixIsolationEnabled = resolveExecutionSecurityMode(config).requiresDaemonUnixUser;
575
662
  if (unixIsolationEnabled) {
576
663
  throw new Error(
577
- "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"
664
+ "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"
578
665
  );
579
666
  }
580
667
  const user = process.env.USER || os.userInfo().username;
@@ -585,19 +672,29 @@ function requireDaemonUser(config) {
585
672
  }
586
673
  return user;
587
674
  }
675
+ function resolveExecutionSecurityMode(config = loadConfigSync()) {
676
+ const unixUserMode = config.execution?.unix_user_mode ?? "simple";
677
+ const unixIsolationEnabled = unixUserMode !== "simple";
678
+ return {
679
+ appRbacEnabled: config.execution?.branch_rbac === true,
680
+ unixUserMode,
681
+ unixImpersonationEnabled: unixIsolationEnabled,
682
+ unixFsIsolationEnabled: unixIsolationEnabled,
683
+ unixGroupRefreshNeeded: unixIsolationEnabled,
684
+ requiresDaemonUnixUser: unixIsolationEnabled,
685
+ shouldInitUnixGroups: unixIsolationEnabled
686
+ };
687
+ }
588
688
  function isBranchRbacEnabled() {
589
689
  try {
590
- const config = loadConfigSync();
591
- return config.execution?.branch_rbac === true;
690
+ return resolveExecutionSecurityMode().appRbacEnabled;
592
691
  } catch {
593
692
  return false;
594
693
  }
595
694
  }
596
695
  function isUnixImpersonationEnabled() {
597
696
  try {
598
- const config = loadConfigSync();
599
- const mode = config.execution?.unix_user_mode;
600
- return mode !== void 0 && mode !== "simple";
697
+ return resolveExecutionSecurityMode().unixImpersonationEnabled;
601
698
  } catch {
602
699
  return false;
603
700
  }
@@ -623,7 +720,7 @@ function ensureBranchStorageModeAllowed(mode) {
623
720
  }
624
721
  }
625
722
  function isUnixGroupRefreshNeeded() {
626
- return isBranchRbacEnabled() || isUnixImpersonationEnabled();
723
+ return resolveExecutionSecurityMode().unixGroupRefreshNeeded;
627
724
  }
628
725
  function getDataHome() {
629
726
  if (process.env.AGOR_DATA_HOME) {
@@ -674,6 +771,7 @@ var init_config_manager = __esm({
674
771
  init_analytics_defaults();
675
772
  init_constants();
676
773
  init_executor_heartbeat();
774
+ init_multitenancy();
677
775
  init_types();
678
776
  NO_FILE = -1;
679
777
  NO_FILE_KEY = { mtimeMs: NO_FILE, size: 0 };
@@ -696,6 +794,21 @@ var init_config_manager = __esm({
696
794
  }
697
795
  });
698
796
 
797
+ // src/db/tenant-context.ts
798
+ import { AsyncLocalStorage } from "async_hooks";
799
+ function getCurrentTenantId() {
800
+ const store = tenantDatabaseScope.getStore();
801
+ return store?.kind === "tenant" ? store.tenantId : void 0;
802
+ }
803
+ var tenantDatabaseScope;
804
+ var init_tenant_context = __esm({
805
+ "src/db/tenant-context.ts"() {
806
+ "use strict";
807
+ init_esm_shims();
808
+ tenantDatabaseScope = new AsyncLocalStorage();
809
+ }
810
+ });
811
+
699
812
  // src/db/database-wrapper.ts
700
813
  var database_wrapper_exports = {};
701
814
  __export(database_wrapper_exports, {
@@ -762,7 +875,7 @@ function dateTruncUtc(db, column, bucket) {
762
875
  }
763
876
  } else {
764
877
  return sql`to_char(
765
- date_trunc(${bucket}, ${column} AT TIME ZONE 'UTC'),
878
+ date_trunc(${sql.raw(`'${bucket}'`)}, ${column} AT TIME ZONE 'UTC'),
766
879
  'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"'
767
880
  )`;
768
881
  }
@@ -784,12 +897,12 @@ function advisoryLockKeyForUuid(uuid) {
784
897
  const FNV_OFFSET = 0xcbf29ce484222325n;
785
898
  const FNV_PRIME = 0x100000001b3n;
786
899
  const MASK_64 = 0xffffffffffffffffn;
787
- let hash2 = FNV_OFFSET;
900
+ let hash = FNV_OFFSET;
788
901
  for (let i = 0; i < uuid.length; i++) {
789
- hash2 ^= BigInt(uuid.charCodeAt(i));
790
- hash2 = hash2 * FNV_PRIME & MASK_64;
902
+ hash ^= BigInt(uuid.charCodeAt(i));
903
+ hash = hash * FNV_PRIME & MASK_64;
791
904
  }
792
- return hash2 > 0x7fffffffffffffffn ? hash2 - 0x10000000000000000n : hash2;
905
+ return hash > 0x7fffffffffffffffn ? hash - 0x10000000000000000n : hash;
793
906
  }
794
907
  async function executeRaw(db, query) {
795
908
  if (isSQLiteDatabase(db)) {
@@ -817,21 +930,36 @@ async function getOne(db, table, where) {
817
930
  }
818
931
  async function insertOne(db, table, values) {
819
932
  if (isSQLiteDatabase(db)) {
820
- const result = await db.insert(table).values(values).returning();
933
+ const result = await db.insert(table).values(withTenantInsertValues(values, table)).returning();
821
934
  return result;
822
935
  } else {
823
- const result = await db.insert(table).values(values).returning();
936
+ const result = await db.insert(table).values(withTenantInsertValues(values, table)).returning();
824
937
  return result[0];
825
938
  }
826
939
  }
827
- function wrapQuery(query, db) {
940
+ function tableHasTenantColumn(table) {
941
+ return Boolean(table && "tenant_id" in table);
942
+ }
943
+ function withTenantInsertValues(values, table) {
944
+ const tenantId = getCurrentTenantId();
945
+ if (!tenantId || !tableHasTenantColumn(table)) return values;
946
+ const stamp = (row) => {
947
+ if (!row || typeof row !== "object" || Array.isArray(row)) return row;
948
+ if ("tenant_id" in row) return row;
949
+ return { tenant_id: tenantId, ...row };
950
+ };
951
+ return Array.isArray(values) ? values.map(stamp) : stamp(values);
952
+ }
953
+ function wrapQuery(query, db, table) {
828
954
  return {
829
955
  ...query,
830
956
  one: async () => {
831
957
  if (isSQLiteDatabase(db)) {
832
958
  return await query.get();
833
959
  } else {
834
- const results = await query.limit(1);
960
+ const results = await query.limit(
961
+ 1
962
+ );
835
963
  return results[0] || null;
836
964
  }
837
965
  },
@@ -853,30 +981,55 @@ function wrapQuery(query, db) {
853
981
  return { rowsAffected: result.length || 0 };
854
982
  }
855
983
  },
856
- // biome-ignore lint/suspicious/noExplicitAny: Drizzle query builder types vary by dialect
857
984
  returning: () => wrapReturning(query.returning(), db),
858
985
  // Preserve chainable methods
859
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
860
- where: (...args) => wrapQuery(query.where(...args), db),
861
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
862
- limit: (...args) => wrapQuery(query.limit(...args), db),
863
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
864
- offset: (...args) => wrapQuery(query.offset(...args), db),
865
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
866
- orderBy: (...args) => wrapQuery(query.orderBy(...args), db),
867
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
868
- groupBy: (...args) => wrapQuery(query.groupBy(...args), db),
869
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
870
- set: (...args) => wrapQuery(query.set(...args), db),
871
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
872
- values: (...args) => wrapQuery(query.values(...args), db),
873
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
874
- innerJoin: (...args) => wrapQuery(query.innerJoin(...args), db),
875
- // biome-ignore lint/suspicious/noExplicitAny: These methods accept varying argument types from Drizzle
876
- leftJoin: (...args) => wrapQuery(query.leftJoin(...args), db),
877
- onConflictDoNothing: (...args) => (
878
- // biome-ignore lint/suspicious/noExplicitAny: Drizzle exposes onConflictDoNothing on both dialects after .values()
879
- wrapQuery(query.onConflictDoNothing(...args), db)
986
+ where: (...args) => wrapQuery(
987
+ query.where(...args),
988
+ db,
989
+ table
990
+ ),
991
+ limit: (...args) => wrapQuery(
992
+ query.limit(...args),
993
+ db,
994
+ table
995
+ ),
996
+ offset: (...args) => wrapQuery(
997
+ query.offset(...args),
998
+ db,
999
+ table
1000
+ ),
1001
+ orderBy: (...args) => wrapQuery(
1002
+ query.orderBy(...args),
1003
+ db,
1004
+ table
1005
+ ),
1006
+ groupBy: (...args) => wrapQuery(
1007
+ query.groupBy(...args),
1008
+ db,
1009
+ table
1010
+ ),
1011
+ set: (...args) => wrapQuery(query.set(...args), db, table),
1012
+ values: (...args) => wrapQuery(
1013
+ query.values(
1014
+ ...args.map((arg) => withTenantInsertValues(arg, table))
1015
+ ),
1016
+ db,
1017
+ table
1018
+ ),
1019
+ innerJoin: (...args) => wrapQuery(
1020
+ query.innerJoin(...args),
1021
+ db,
1022
+ table
1023
+ ),
1024
+ leftJoin: (...args) => wrapQuery(
1025
+ query.leftJoin(...args),
1026
+ db,
1027
+ table
1028
+ ),
1029
+ onConflictDoNothing: (...args) => wrapQuery(
1030
+ query.onConflictDoNothing(...args),
1031
+ db,
1032
+ table
880
1033
  )
881
1034
  };
882
1035
  }
@@ -909,7 +1062,7 @@ function select(db, columns) {
909
1062
  }
910
1063
  function insert(db, table) {
911
1064
  const query = db.insert(table);
912
- return wrapQuery(query, db);
1065
+ return wrapQuery(query, db, table);
913
1066
  }
914
1067
  function update(db, table) {
915
1068
  const query = db.update(table);
@@ -947,6 +1100,7 @@ var init_database_wrapper = __esm({
947
1100
  "src/db/database-wrapper.ts"() {
948
1101
  "use strict";
949
1102
  init_esm_shims();
1103
+ init_tenant_context();
950
1104
  }
951
1105
  });
952
1106
 
@@ -1224,6 +1378,14 @@ var init_template = __esm({
1224
1378
  }
1225
1379
  });
1226
1380
 
1381
+ // src/types/tenant.ts
1382
+ var init_tenant = __esm({
1383
+ "src/types/tenant.ts"() {
1384
+ "use strict";
1385
+ init_esm_shims();
1386
+ }
1387
+ });
1388
+
1227
1389
  // src/types/ui.ts
1228
1390
  var init_ui = __esm({
1229
1391
  "src/types/ui.ts"() {
@@ -1329,6 +1491,7 @@ var init_types2 = __esm({
1329
1491
  init_session();
1330
1492
  init_task();
1331
1493
  init_template();
1494
+ init_tenant();
1332
1495
  init_ui();
1333
1496
  init_user();
1334
1497
  init_utils();
@@ -1354,6 +1517,7 @@ __export(schema_postgres_exports, {
1354
1517
  cardTypes: () => cardTypes,
1355
1518
  cards: () => cards,
1356
1519
  gatewayChannels: () => gatewayChannels,
1520
+ gatewayOutboundMessages: () => gatewayOutboundMessages,
1357
1521
  groupMemberships: () => groupMemberships,
1358
1522
  groups: () => groups,
1359
1523
  kbDocumentUnits: () => kbDocumentUnits,
@@ -1397,7 +1561,7 @@ import {
1397
1561
  uniqueIndex,
1398
1562
  varchar
1399
1563
  } from "drizzle-orm/pg-core";
1400
- var 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;
1564
+ var 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;
1401
1565
  var init_schema_postgres = __esm({
1402
1566
  "src/db/schema.postgres.ts"() {
1403
1567
  "use strict";
@@ -1416,6 +1580,7 @@ var init_schema_postgres = __esm({
1416
1580
  sessions = pgTable(
1417
1581
  "sessions",
1418
1582
  {
1583
+ tenant_id: text("tenant_id").notNull().default("default"),
1419
1584
  // Primary identity
1420
1585
  session_id: varchar("session_id", { length: 36 }).primaryKey(),
1421
1586
  created_at: t.timestamp("created_at").notNull(),
@@ -1475,7 +1640,9 @@ var init_schema_postgres = __esm({
1475
1640
  data: t.json("data").$type().notNull()
1476
1641
  },
1477
1642
  (table) => ({
1643
+ tenantIdx: index("sessions_tenant_id_idx").on(table.tenant_id),
1478
1644
  statusIdx: index("sessions_status_idx").on(table.status),
1645
+ statusReadyIdx: index("sessions_status_ready_idx").on(table.status, table.ready_for_prompt),
1479
1646
  agenticToolIdx: index("sessions_agentic_tool_idx").on(table.agentic_tool),
1480
1647
  boardIdx: index("sessions_board_idx").on(table.board_id),
1481
1648
  branchIdx: index("sessions_branch_idx").on(table.branch_id),
@@ -1487,12 +1654,13 @@ var init_schema_postgres = __esm({
1487
1654
  // Partial unique index — covering for the scheduler's dedup lookup
1488
1655
  // AND serves as the DB-level guard against check-then-create races
1489
1656
  // in spawnScheduledSession.
1490
- scheduleRunUnique: uniqueIndex("sessions_schedule_run_unique").on(table.schedule_id, table.scheduled_run_at).where(sql2`${table.schedule_id} IS NOT NULL AND ${table.scheduled_run_at} IS NOT NULL`)
1657
+ scheduleRunUnique: uniqueIndex("sessions_schedule_run_unique").on(table.tenant_id, table.schedule_id, table.scheduled_run_at).where(sql2`${table.schedule_id} IS NOT NULL AND ${table.scheduled_run_at} IS NOT NULL`)
1491
1658
  })
1492
1659
  );
1493
1660
  sessionRelationships = pgTable(
1494
1661
  "session_relationships",
1495
1662
  {
1663
+ tenant_id: text("tenant_id").notNull().default("default"),
1496
1664
  relationship_id: varchar("relationship_id", { length: 36 }).primaryKey(),
1497
1665
  source_session_id: varchar("source_session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
1498
1666
  target_session_id: varchar("target_session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
@@ -1510,10 +1678,23 @@ var init_schema_postgres = __esm({
1510
1678
  data: t.json("data")
1511
1679
  },
1512
1680
  (table) => ({
1681
+ tenantIdx: index("session_relationships_tenant_id_idx").on(table.tenant_id),
1513
1682
  sourceIdx: index("session_relationships_source_idx").on(table.source_session_id),
1514
1683
  targetIdx: index("session_relationships_target_idx").on(table.target_session_id),
1515
1684
  callbackIdx: index("session_relationships_callback_idx").on(table.callback_session_id),
1685
+ // Composite indexes so the OR predicate in dispatchCompletionCallbacks
1686
+ // (WHERE source_session_id = $1 OR target_session_id = $2) uses BitmapOr
1687
+ // over these instead of a full tenant table scan via tenant_id_idx.
1688
+ tenantSourceIdx: index("session_relationships_tenant_source_idx").on(
1689
+ table.tenant_id,
1690
+ table.source_session_id
1691
+ ),
1692
+ tenantTargetIdx: index("session_relationships_tenant_target_idx").on(
1693
+ table.tenant_id,
1694
+ table.target_session_id
1695
+ ),
1516
1696
  sourceTargetTypeUnique: uniqueIndex("session_relationships_source_target_type_unique").on(
1697
+ table.tenant_id,
1517
1698
  table.source_session_id,
1518
1699
  table.target_session_id,
1519
1700
  table.relationship_type
@@ -1523,6 +1704,7 @@ var init_schema_postgres = __esm({
1523
1704
  tasks = pgTable(
1524
1705
  "tasks",
1525
1706
  {
1707
+ tenant_id: text("tenant_id").notNull().default("default"),
1526
1708
  task_id: varchar("task_id", { length: 36 }).primaryKey(),
1527
1709
  session_id: varchar("session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
1528
1710
  created_at: t.timestamp("created_at").notNull(),
@@ -1552,19 +1734,23 @@ var init_schema_postgres = __esm({
1552
1734
  data: t.json("data").$type().notNull()
1553
1735
  },
1554
1736
  (table) => ({
1737
+ tenantIdx: index("tasks_tenant_id_idx").on(table.tenant_id),
1555
1738
  sessionIdx: index("tasks_session_idx").on(table.session_id),
1556
1739
  statusIdx: index("tasks_status_idx").on(table.status),
1557
1740
  createdIdx: index("tasks_created_idx").on(table.created_at),
1741
+ // Composite for "latest task for session" queries (ORDER BY created_at DESC LIMIT 1).
1742
+ sessionCreatedIdx: index("tasks_session_created_idx").on(table.session_id, table.created_at),
1558
1743
  queueIdx: index("tasks_queue_idx").on(table.session_id, table.status, table.queue_position),
1559
1744
  // Partial unique index — defense-in-depth for `tasks.createPending` race
1560
1745
  // serialization. Only QUEUED rows are constrained; CREATED/RUNNING/done
1561
1746
  // rows have NULL queue_position and are unaffected.
1562
- queuedPositionUnique: uniqueIndex("tasks_queued_position_unique").on(table.session_id, table.queue_position).where(sql2`${table.status} = 'queued'`)
1747
+ queuedPositionUnique: uniqueIndex("tasks_queued_position_unique").on(table.tenant_id, table.session_id, table.queue_position).where(sql2`${table.status} = 'queued'`)
1563
1748
  })
1564
1749
  );
1565
1750
  serializedSessions = pgTable(
1566
1751
  "serialized_sessions",
1567
1752
  {
1753
+ tenant_id: text("tenant_id").notNull().default("default"),
1568
1754
  id: varchar("id", { length: 36 }).primaryKey(),
1569
1755
  session_id: varchar("session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
1570
1756
  branch_id: varchar("branch_id", { length: 36 }).notNull().references(() => branches.branch_id, { onDelete: "cascade" }),
@@ -1580,6 +1766,7 @@ var init_schema_postgres = __esm({
1580
1766
  // gzipped; NULL while status='processing'
1581
1767
  },
1582
1768
  (table) => ({
1769
+ tenantIdx: index("serialized_sessions_tenant_id_idx").on(table.tenant_id),
1583
1770
  sessionTurnIdx: index("serialized_sessions_session_turn_idx").on(
1584
1771
  table.session_id,
1585
1772
  table.turn_index
@@ -1590,6 +1777,7 @@ var init_schema_postgres = __esm({
1590
1777
  messages = pgTable(
1591
1778
  "messages",
1592
1779
  {
1780
+ tenant_id: text("tenant_id").notNull().default("default"),
1593
1781
  // Primary identity
1594
1782
  message_id: varchar("message_id", { length: 36 }).primaryKey(),
1595
1783
  created_at: t.timestamp("created_at").notNull(),
@@ -1629,15 +1817,23 @@ var init_schema_postgres = __esm({
1629
1817
  data: t.json("data").$type().notNull()
1630
1818
  },
1631
1819
  (table) => ({
1820
+ tenantIdx: index("messages_tenant_id_idx").on(table.tenant_id),
1821
+ tenantTimestampIdx: index("messages_tenant_timestamp_idx").on(table.tenant_id, table.timestamp),
1632
1822
  // Indexes for efficient lookups
1633
1823
  sessionIdx: index("messages_session_id_idx").on(table.session_id),
1634
1824
  taskIdx: index("messages_task_id_idx").on(table.task_id),
1635
- sessionIndexIdx: index("messages_session_index_idx").on(table.session_id, table.index)
1825
+ sessionIndexIdx: index("messages_session_index_idx").on(table.session_id, table.index),
1826
+ timestampIdx: index("messages_timestamp_idx").on(table.timestamp),
1827
+ sessionTimestampIdx: index("messages_session_timestamp_idx").on(
1828
+ table.session_id,
1829
+ table.timestamp
1830
+ )
1636
1831
  })
1637
1832
  );
1638
1833
  boards = pgTable(
1639
1834
  "boards",
1640
1835
  {
1836
+ tenant_id: text("tenant_id").notNull().default("default"),
1641
1837
  board_id: varchar("board_id", { length: 36 }).primaryKey(),
1642
1838
  created_at: t.timestamp("created_at").notNull(),
1643
1839
  updated_at: t.timestamp("updated_at"),
@@ -1645,7 +1841,7 @@ var init_schema_postgres = __esm({
1645
1841
  created_by: varchar("created_by", { length: 36 }).notNull(),
1646
1842
  // Materialized for lookups
1647
1843
  name: text("name").notNull(),
1648
- slug: text("slug").unique(),
1844
+ slug: text("slug"),
1649
1845
  primary_assistant_id: varchar("primary_assistant_id", { length: 36 }).references(
1650
1846
  () => branches.branch_id,
1651
1847
  {
@@ -1660,18 +1856,21 @@ var init_schema_postgres = __esm({
1660
1856
  archived_by: varchar("archived_by", { length: 36 })
1661
1857
  },
1662
1858
  (table) => ({
1859
+ tenantIdx: index("boards_tenant_id_idx").on(table.tenant_id),
1663
1860
  nameIdx: index("boards_name_idx").on(table.name),
1664
- slugIdx: index("boards_slug_idx").on(table.slug)
1861
+ slugIdx: index("boards_slug_idx").on(table.slug),
1862
+ slugTenantUnique: uniqueIndex("boards_tenant_slug_unique").on(table.tenant_id, table.slug)
1665
1863
  })
1666
1864
  );
1667
1865
  repos = pgTable(
1668
1866
  "repos",
1669
1867
  {
1868
+ tenant_id: text("tenant_id").notNull().default("default"),
1670
1869
  repo_id: varchar("repo_id", { length: 36 }).primaryKey(),
1671
1870
  created_at: t.timestamp("created_at").notNull(),
1672
1871
  updated_at: t.timestamp("updated_at"),
1673
1872
  // Materialized for querying
1674
- slug: text("slug").notNull().unique(),
1873
+ slug: text("slug").notNull(),
1675
1874
  repo_type: text("repo_type", { enum: ["remote", "local"] }).notNull().default("remote"),
1676
1875
  // Unix group for repo-level git access (agor_rp_<short-id>)
1677
1876
  // Users who have access to ANY branch in this repo get added to this group.
@@ -1682,12 +1881,15 @@ var init_schema_postgres = __esm({
1682
1881
  data: t.json("data").$type().notNull()
1683
1882
  },
1684
1883
  (table) => ({
1685
- slugIdx: index("repos_slug_idx").on(table.slug)
1884
+ tenantIdx: index("repos_tenant_id_idx").on(table.tenant_id),
1885
+ slugIdx: index("repos_slug_idx").on(table.slug),
1886
+ slugTenantUnique: uniqueIndex("repos_tenant_slug_unique").on(table.tenant_id, table.slug)
1686
1887
  })
1687
1888
  );
1688
1889
  branches = pgTable(
1689
1890
  "branches",
1690
1891
  {
1892
+ tenant_id: text("tenant_id").notNull().default("default"),
1691
1893
  // Primary identity
1692
1894
  branch_id: varchar("branch_id", { length: 36 }).primaryKey(),
1693
1895
  repo_id: varchar("repo_id", { length: 36 }).notNull().references(() => repos.repo_id, { onDelete: "cascade" }),
@@ -1762,6 +1964,7 @@ var init_schema_postgres = __esm({
1762
1964
  data: t.json("data").$type().notNull()
1763
1965
  },
1764
1966
  (table) => ({
1967
+ tenantIdx: index("branches_tenant_id_idx").on(table.tenant_id),
1765
1968
  repoIdx: index("branches_repo_idx").on(table.repo_id),
1766
1969
  nameIdx: index("branches_name_idx").on(table.name),
1767
1970
  refIdx: index("branches_ref_idx").on(table.ref),
@@ -1775,22 +1978,26 @@ var init_schema_postgres = __esm({
1775
1978
  branchOwners = pgTable(
1776
1979
  "branch_owners",
1777
1980
  {
1981
+ tenant_id: text("tenant_id").notNull().default("default"),
1778
1982
  branch_id: varchar("branch_id", { length: 36 }).notNull().references(() => branches.branch_id, { onDelete: "cascade" }),
1779
1983
  user_id: varchar("user_id", { length: 36 }).notNull().references(() => users.user_id, { onDelete: "cascade" }),
1780
1984
  created_at: t.timestamp("created_at").defaultNow()
1781
1985
  },
1782
1986
  (table) => ({
1987
+ tenantIdx: index("branch_owners_tenant_id_idx").on(table.tenant_id),
1783
1988
  pk: primaryKey({ columns: [table.branch_id, table.user_id] })
1784
1989
  })
1785
1990
  );
1786
1991
  boardOwners = pgTable(
1787
1992
  "board_owners",
1788
1993
  {
1994
+ tenant_id: text("tenant_id").notNull().default("default"),
1789
1995
  board_id: varchar("board_id", { length: 36 }).notNull().references(() => boards.board_id, { onDelete: "cascade" }),
1790
1996
  user_id: varchar("user_id", { length: 36 }).notNull().references(() => users.user_id, { onDelete: "cascade" }),
1791
1997
  created_at: t.timestamp("created_at")
1792
1998
  },
1793
1999
  (table) => ({
2000
+ tenantIdx: index("board_owners_tenant_id_idx").on(table.tenant_id),
1794
2001
  pk: primaryKey({ columns: [table.board_id, table.user_id] }),
1795
2002
  userIdx: index("board_owners_user_idx").on(table.user_id)
1796
2003
  })
@@ -1798,6 +2005,7 @@ var init_schema_postgres = __esm({
1798
2005
  schedules = pgTable(
1799
2006
  "schedules",
1800
2007
  {
2008
+ tenant_id: text("tenant_id").notNull().default("default"),
1801
2009
  schedule_id: varchar("schedule_id", { length: 36 }).primaryKey(),
1802
2010
  branch_id: varchar("branch_id", { length: 36 }).notNull().references(() => branches.branch_id, { onDelete: "cascade" }),
1803
2011
  name: text("name").notNull(),
@@ -1821,6 +2029,7 @@ var init_schema_postgres = __esm({
1821
2029
  created_by: varchar("created_by", { length: 36 }).notNull().references(() => users.user_id)
1822
2030
  },
1823
2031
  (table) => ({
2032
+ tenantIdx: index("schedules_tenant_id_idx").on(table.tenant_id),
1824
2033
  enabledNextRunIdx: index("schedules_enabled_next_run_idx").on(table.enabled, table.next_run_at),
1825
2034
  branchIdx: index("schedules_branch_idx").on(table.branch_id),
1826
2035
  createdByIdx: index("schedules_created_by_idx").on(table.created_by)
@@ -1829,12 +2038,13 @@ var init_schema_postgres = __esm({
1829
2038
  users = pgTable(
1830
2039
  "users",
1831
2040
  {
2041
+ tenant_id: text("tenant_id").notNull().default("default"),
1832
2042
  // Primary identity
1833
2043
  user_id: varchar("user_id", { length: 36 }).primaryKey(),
1834
2044
  created_at: t.timestamp("created_at").notNull(),
1835
2045
  updated_at: t.timestamp("updated_at"),
1836
2046
  // Materialized for auth lookups
1837
- email: text("email").unique().notNull(),
2047
+ email: text("email").notNull(),
1838
2048
  password: text("password").notNull(),
1839
2049
  // bcrypt hashed
1840
2050
  // Basic profile (materialized for display)
@@ -1850,16 +2060,22 @@ var init_schema_postgres = __esm({
1850
2060
  onboarding_completed: t.bool("onboarding_completed").notNull().default(false),
1851
2061
  // Force password change flag (admin-settable, auto-cleared on password change)
1852
2062
  must_change_password: t.bool("must_change_password").notNull().default(false),
2063
+ // Auth invalidation marker. Password changes set this timestamp so any
2064
+ // previously issued browser access or refresh token is rejected.
2065
+ tokens_valid_after: t.timestamp("tokens_valid_after"),
1853
2066
  // JSON blob for profile/preferences
1854
2067
  data: t.json("data").$type().notNull()
1855
2068
  },
1856
2069
  (table) => ({
1857
- emailIdx: index("users_email_idx").on(table.email)
2070
+ tenantIdx: index("users_tenant_id_idx").on(table.tenant_id),
2071
+ emailIdx: index("users_email_idx").on(table.email),
2072
+ emailTenantUnique: uniqueIndex("users_tenant_email_unique").on(table.tenant_id, table.email)
1858
2073
  })
1859
2074
  );
1860
2075
  groups = pgTable(
1861
2076
  "groups",
1862
2077
  {
2078
+ tenant_id: text("tenant_id").notNull().default("default"),
1863
2079
  group_id: varchar("group_id", { length: 36 }).primaryKey(),
1864
2080
  name: text("name").notNull(),
1865
2081
  slug: text("slug").notNull(),
@@ -1872,13 +2088,15 @@ var init_schema_postgres = __esm({
1872
2088
  updated_at: t.timestamp("updated_at")
1873
2089
  },
1874
2090
  (table) => ({
1875
- slugIdx: uniqueIndex("groups_slug_idx").on(table.slug),
2091
+ tenantIdx: index("groups_tenant_id_idx").on(table.tenant_id),
2092
+ slugIdx: uniqueIndex("groups_tenant_slug_unique").on(table.tenant_id, table.slug),
1876
2093
  archivedIdx: index("groups_archived_idx").on(table.archived)
1877
2094
  })
1878
2095
  );
1879
2096
  groupMemberships = pgTable(
1880
2097
  "group_memberships",
1881
2098
  {
2099
+ tenant_id: text("tenant_id").notNull().default("default"),
1882
2100
  group_id: varchar("group_id", { length: 36 }).notNull().references(() => groups.group_id, { onDelete: "cascade" }),
1883
2101
  user_id: varchar("user_id", { length: 36 }).notNull().references(() => users.user_id, { onDelete: "cascade" }),
1884
2102
  added_by: varchar("added_by", { length: 36 }).references(() => users.user_id, {
@@ -1887,6 +2105,7 @@ var init_schema_postgres = __esm({
1887
2105
  created_at: t.timestamp("created_at").notNull()
1888
2106
  },
1889
2107
  (table) => ({
2108
+ tenantIdx: index("group_memberships_tenant_id_idx").on(table.tenant_id),
1890
2109
  pk: primaryKey({ columns: [table.group_id, table.user_id] }),
1891
2110
  userIdx: index("group_memberships_user_idx").on(table.user_id)
1892
2111
  })
@@ -1894,6 +2113,7 @@ var init_schema_postgres = __esm({
1894
2113
  branchGroupGrants = pgTable(
1895
2114
  "branch_group_grants",
1896
2115
  {
2116
+ tenant_id: text("tenant_id").notNull().default("default"),
1897
2117
  branch_id: varchar("branch_id", { length: 36 }).notNull().references(() => branches.branch_id, { onDelete: "cascade" }),
1898
2118
  group_id: varchar("group_id", { length: 36 }).notNull().references(() => groups.group_id, { onDelete: "cascade" }),
1899
2119
  can: text("can", { enum: [...BRANCH_PERMISSION_LEVELS] }).notNull().default("view"),
@@ -1905,6 +2125,7 @@ var init_schema_postgres = __esm({
1905
2125
  updated_at: t.timestamp("updated_at")
1906
2126
  },
1907
2127
  (table) => ({
2128
+ tenantIdx: index("branch_group_grants_tenant_id_idx").on(table.tenant_id),
1908
2129
  pk: primaryKey({ columns: [table.branch_id, table.group_id] }),
1909
2130
  groupIdx: index("branch_group_grants_group_idx").on(table.group_id)
1910
2131
  })
@@ -1912,6 +2133,7 @@ var init_schema_postgres = __esm({
1912
2133
  boardGroupGrants = pgTable(
1913
2134
  "board_group_grants",
1914
2135
  {
2136
+ tenant_id: text("tenant_id").notNull().default("default"),
1915
2137
  board_id: varchar("board_id", { length: 36 }).notNull().references(() => boards.board_id, { onDelete: "cascade" }),
1916
2138
  group_id: varchar("group_id", { length: 36 }).notNull().references(() => groups.group_id, { onDelete: "cascade" }),
1917
2139
  can: text("can", { enum: [...BRANCH_PERMISSION_LEVELS] }).notNull().default("view"),
@@ -1923,6 +2145,7 @@ var init_schema_postgres = __esm({
1923
2145
  updated_at: t.timestamp("updated_at")
1924
2146
  },
1925
2147
  (table) => ({
2148
+ tenantIdx: index("board_group_grants_tenant_id_idx").on(table.tenant_id),
1926
2149
  pk: primaryKey({ columns: [table.board_id, table.group_id] }),
1927
2150
  groupIdx: index("board_group_grants_group_idx").on(table.group_id)
1928
2151
  })
@@ -1930,6 +2153,7 @@ var init_schema_postgres = __esm({
1930
2153
  appVariables = pgTable(
1931
2154
  "app_variables",
1932
2155
  {
2156
+ tenant_id: text("tenant_id").notNull().default("default"),
1933
2157
  variable_id: varchar("variable_id", { length: 36 }).primaryKey(),
1934
2158
  namespace: text("namespace").notNull(),
1935
2159
  key: text("key").notNull(),
@@ -1945,13 +2169,19 @@ var init_schema_postgres = __esm({
1945
2169
  updated_at: t.timestamp("updated_at").notNull()
1946
2170
  },
1947
2171
  (table) => ({
1948
- namespaceKeyIdx: uniqueIndex("app_variables_namespace_key_idx").on(table.namespace, table.key),
2172
+ tenantIdx: index("app_variables_tenant_id_idx").on(table.tenant_id),
2173
+ namespaceKeyIdx: uniqueIndex("app_variables_tenant_namespace_key_unique").on(
2174
+ table.tenant_id,
2175
+ table.namespace,
2176
+ table.key
2177
+ ),
1949
2178
  namespaceIdx: index("app_variables_namespace_idx").on(table.namespace)
1950
2179
  })
1951
2180
  );
1952
2181
  userApiKeys = pgTable(
1953
2182
  "user_api_keys",
1954
2183
  {
2184
+ tenant_id: text("tenant_id").notNull().default("default"),
1955
2185
  id: varchar("id", { length: 36 }).primaryKey(),
1956
2186
  user_id: varchar("user_id", { length: 36 }).notNull().references(() => users.user_id, { onDelete: "cascade" }),
1957
2187
  name: text("name").notNull(),
@@ -1963,6 +2193,7 @@ var init_schema_postgres = __esm({
1963
2193
  last_used_at: t.timestamp("last_used_at")
1964
2194
  },
1965
2195
  (table) => ({
2196
+ tenantIdx: index("user_api_keys_tenant_id_idx").on(table.tenant_id),
1966
2197
  userIdx: index("user_api_keys_user_idx").on(table.user_id),
1967
2198
  prefixIdx: index("user_api_keys_prefix_idx").on(table.prefix)
1968
2199
  })
@@ -1970,6 +2201,7 @@ var init_schema_postgres = __esm({
1970
2201
  mcpServers = pgTable(
1971
2202
  "mcp_servers",
1972
2203
  {
2204
+ tenant_id: text("tenant_id").notNull().default("default"),
1973
2205
  // Primary identity
1974
2206
  mcp_server_id: varchar("mcp_server_id", { length: 36 }).primaryKey(),
1975
2207
  created_at: t.timestamp("created_at").notNull(),
@@ -1996,6 +2228,7 @@ var init_schema_postgres = __esm({
1996
2228
  data: t.json("data").$type().notNull()
1997
2229
  },
1998
2230
  (table) => ({
2231
+ tenantIdx: index("mcp_servers_tenant_id_idx").on(table.tenant_id),
1999
2232
  nameIdx: index("mcp_servers_name_idx").on(table.name),
2000
2233
  scopeIdx: index("mcp_servers_scope_idx").on(table.scope),
2001
2234
  ownerIdx: index("mcp_servers_owner_idx").on(table.owner_user_id),
@@ -2005,6 +2238,7 @@ var init_schema_postgres = __esm({
2005
2238
  cardTypes = pgTable(
2006
2239
  "card_types",
2007
2240
  {
2241
+ tenant_id: text("tenant_id").notNull().default("default"),
2008
2242
  card_type_id: varchar("card_type_id", { length: 36 }).primaryKey(),
2009
2243
  name: text("name").notNull(),
2010
2244
  emoji: text("emoji"),
@@ -2016,12 +2250,14 @@ var init_schema_postgres = __esm({
2016
2250
  updated_at: t.timestamp("updated_at").notNull()
2017
2251
  },
2018
2252
  (table) => ({
2253
+ tenantIdx: index("card_types_tenant_id_idx").on(table.tenant_id),
2019
2254
  nameIdx: index("card_types_name_idx").on(table.name)
2020
2255
  })
2021
2256
  );
2022
2257
  cards = pgTable(
2023
2258
  "cards",
2024
2259
  {
2260
+ tenant_id: text("tenant_id").notNull().default("default"),
2025
2261
  card_id: varchar("card_id", { length: 36 }).primaryKey(),
2026
2262
  board_id: varchar("board_id", { length: 36 }).notNull().references(() => boards.board_id, { onDelete: "cascade" }),
2027
2263
  card_type_id: varchar("card_type_id", { length: 36 }).references(() => cardTypes.card_type_id, {
@@ -2042,6 +2278,7 @@ var init_schema_postgres = __esm({
2042
2278
  archived_at: t.timestamp("archived_at")
2043
2279
  },
2044
2280
  (table) => ({
2281
+ tenantIdx: index("cards_tenant_id_idx").on(table.tenant_id),
2045
2282
  boardIdx: index("cards_board_idx").on(table.board_id),
2046
2283
  cardTypeIdx: index("cards_card_type_idx").on(table.card_type_id),
2047
2284
  titleIdx: index("cards_title_idx").on(table.title),
@@ -2052,6 +2289,7 @@ var init_schema_postgres = __esm({
2052
2289
  artifacts = pgTable(
2053
2290
  "artifacts",
2054
2291
  {
2292
+ tenant_id: text("tenant_id").notNull().default("default"),
2055
2293
  artifact_id: varchar("artifact_id", { length: 36 }).primaryKey(),
2056
2294
  branch_id: varchar("branch_id", { length: 36 }).references(() => branches.branch_id, {
2057
2295
  onDelete: "set null"
@@ -2087,6 +2325,7 @@ var init_schema_postgres = __esm({
2087
2325
  archived_at: t.timestamp("archived_at")
2088
2326
  },
2089
2327
  (table) => ({
2328
+ tenantIdx: index("artifacts_tenant_id_idx").on(table.tenant_id),
2090
2329
  branchIdx: index("artifacts_branch_idx").on(table.branch_id),
2091
2330
  sourceSessionIdx: index("artifacts_source_session_idx").on(table.source_session_id),
2092
2331
  boardIdx: index("artifacts_board_idx").on(table.board_id),
@@ -2097,6 +2336,7 @@ var init_schema_postgres = __esm({
2097
2336
  artifactTrustGrants = pgTable(
2098
2337
  "artifact_trust_grants",
2099
2338
  {
2339
+ tenant_id: text("tenant_id").notNull().default("default"),
2100
2340
  grant_id: varchar("grant_id", { length: 36 }).primaryKey(),
2101
2341
  user_id: varchar("user_id", { length: 36 }).notNull(),
2102
2342
  scope_type: text("scope_type").notNull(),
@@ -2107,6 +2347,7 @@ var init_schema_postgres = __esm({
2107
2347
  revoked_at: t.timestamp("revoked_at")
2108
2348
  },
2109
2349
  (table) => ({
2350
+ tenantIdx: index("artifact_trust_grants_tenant_id_idx").on(table.tenant_id),
2110
2351
  userIdx: index("artifact_trust_grants_user_idx").on(table.user_id),
2111
2352
  scopeIdx: index("artifact_trust_grants_scope_idx").on(table.scope_type, table.scope_value)
2112
2353
  })
@@ -2114,6 +2355,7 @@ var init_schema_postgres = __esm({
2114
2355
  boardObjects = pgTable(
2115
2356
  "board_objects",
2116
2357
  {
2358
+ tenant_id: text("tenant_id").notNull().default("default"),
2117
2359
  // Primary identity
2118
2360
  object_id: varchar("object_id", { length: 36 }).primaryKey(),
2119
2361
  board_id: varchar("board_id", { length: 36 }).notNull().references(() => boards.board_id, { onDelete: "cascade" }),
@@ -2129,6 +2371,7 @@ var init_schema_postgres = __esm({
2129
2371
  data: t.json("data").$type().notNull()
2130
2372
  },
2131
2373
  (table) => ({
2374
+ tenantIdx: index("board_objects_tenant_id_idx").on(table.tenant_id),
2132
2375
  boardIdx: index("board_objects_board_idx").on(table.board_id),
2133
2376
  branchIdx: index("board_objects_branch_idx").on(table.branch_id),
2134
2377
  cardIdx: index("board_objects_card_idx").on(table.card_id)
@@ -2137,12 +2380,14 @@ var init_schema_postgres = __esm({
2137
2380
  sessionMcpServers = pgTable(
2138
2381
  "session_mcp_servers",
2139
2382
  {
2383
+ tenant_id: text("tenant_id").notNull().default("default"),
2140
2384
  session_id: varchar("session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
2141
2385
  mcp_server_id: varchar("mcp_server_id", { length: 36 }).notNull().references(() => mcpServers.mcp_server_id, { onDelete: "cascade" }),
2142
2386
  enabled: t.bool("enabled").notNull().default(true),
2143
2387
  added_at: t.timestamp("added_at").notNull()
2144
2388
  },
2145
2389
  (table) => ({
2390
+ tenantIdx: index("session_mcp_servers_tenant_id_idx").on(table.tenant_id),
2146
2391
  // Composite primary key
2147
2392
  pk: index("session_mcp_servers_pk").on(table.session_id, table.mcp_server_id),
2148
2393
  // Indexes for queries
@@ -2154,6 +2399,7 @@ var init_schema_postgres = __esm({
2154
2399
  userMcpOauthTokens = pgTable(
2155
2400
  "user_mcp_oauth_tokens",
2156
2401
  {
2402
+ tenant_id: text("tenant_id").notNull().default("default"),
2157
2403
  // NULL = shared-mode token (one per mcp_server_id)
2158
2404
  user_id: varchar("user_id", { length: 36 }).references(() => users.user_id, {
2159
2405
  onDelete: "cascade"
@@ -2171,6 +2417,7 @@ var init_schema_postgres = __esm({
2171
2417
  updated_at: t.timestamp("updated_at")
2172
2418
  },
2173
2419
  (table) => ({
2420
+ tenantIdx: index("user_mcp_oauth_tokens_tenant_id_idx").on(table.tenant_id),
2174
2421
  // Composite lookup indexes. Uniqueness enforced via partial unique indexes
2175
2422
  // created in the migration (one for per-user rows, one for the shared row).
2176
2423
  pk: index("user_mcp_oauth_tokens_pk").on(table.user_id, table.mcp_server_id),
@@ -2181,6 +2428,7 @@ var init_schema_postgres = __esm({
2181
2428
  boardComments = pgTable(
2182
2429
  "board_comments",
2183
2430
  {
2431
+ tenant_id: text("tenant_id").notNull().default("default"),
2184
2432
  // Primary identity
2185
2433
  comment_id: varchar("comment_id", { length: 36 }).primaryKey(),
2186
2434
  created_at: t.timestamp("created_at").notNull(),
@@ -2222,6 +2470,7 @@ var init_schema_postgres = __esm({
2222
2470
  data: t.json("data").$type().notNull()
2223
2471
  },
2224
2472
  (table) => ({
2473
+ tenantIdx: index("board_comments_tenant_id_idx").on(table.tenant_id),
2225
2474
  boardIdx: index("board_comments_board_idx").on(table.board_id),
2226
2475
  sessionIdx: index("board_comments_session_idx").on(table.session_id),
2227
2476
  taskIdx: index("board_comments_task_idx").on(table.task_id),
@@ -2236,6 +2485,7 @@ var init_schema_postgres = __esm({
2236
2485
  gatewayChannels = pgTable(
2237
2486
  "gateway_channels",
2238
2487
  {
2488
+ tenant_id: text("tenant_id").notNull().default("default"),
2239
2489
  // Primary identity
2240
2490
  id: varchar("id", { length: 36 }).primaryKey(),
2241
2491
  created_at: t.timestamp("created_at").notNull(),
@@ -2249,7 +2499,7 @@ var init_schema_postgres = __esm({
2249
2499
  }).notNull(),
2250
2500
  target_branch_id: varchar("target_branch_id", { length: 36 }).notNull().references(() => branches.branch_id, { onDelete: "cascade" }),
2251
2501
  agor_user_id: varchar("agor_user_id", { length: 36 }).notNull(),
2252
- channel_key: text("channel_key").notNull().unique(),
2502
+ channel_key: text("channel_key").notNull(),
2253
2503
  enabled: t.bool("enabled").notNull().default(true),
2254
2504
  last_message_at: t.timestamp("last_message_at"),
2255
2505
  // JSON blob for platform credentials (encrypted at rest)
@@ -2258,13 +2508,19 @@ var init_schema_postgres = __esm({
2258
2508
  agentic_config: t.json("agentic_config")
2259
2509
  },
2260
2510
  (table) => ({
2511
+ tenantIdx: index("gateway_channels_tenant_id_idx").on(table.tenant_id),
2261
2512
  channelKeyIdx: index("idx_gateway_channel_key").on(table.channel_key),
2513
+ channelKeyTenantUnique: uniqueIndex("gateway_channels_tenant_channel_key_unique").on(
2514
+ table.tenant_id,
2515
+ table.channel_key
2516
+ ),
2262
2517
  enabledTypeIdx: index("idx_gateway_enabled_type").on(table.enabled, table.channel_type)
2263
2518
  })
2264
2519
  );
2265
2520
  threadSessionMap = pgTable(
2266
2521
  "thread_session_map",
2267
2522
  {
2523
+ tenant_id: text("tenant_id").notNull().default("default"),
2268
2524
  // Primary identity
2269
2525
  id: varchar("id", { length: 36 }).primaryKey(),
2270
2526
  created_at: t.timestamp("created_at").notNull(),
@@ -2282,7 +2538,9 @@ var init_schema_postgres = __esm({
2282
2538
  metadata: t.json("metadata")
2283
2539
  },
2284
2540
  (table) => ({
2285
- uniqueChannelThread: uniqueIndex("uniq_thread_map_channel_thread").on(
2541
+ tenantIdx: index("thread_session_map_tenant_id_idx").on(table.tenant_id),
2542
+ uniqueChannelThread: uniqueIndex("uniq_thread_map_tenant_channel_thread").on(
2543
+ table.tenant_id,
2286
2544
  table.channel_id,
2287
2545
  table.thread_id
2288
2546
  ),
@@ -2291,14 +2549,82 @@ var init_schema_postgres = __esm({
2291
2549
  channelStatusIdx: index("idx_thread_map_channel_status").on(table.channel_id, table.status)
2292
2550
  })
2293
2551
  );
2552
+ gatewayOutboundMessages = pgTable(
2553
+ "gateway_outbound_messages",
2554
+ {
2555
+ tenant_id: text("tenant_id").notNull().default("default"),
2556
+ id: varchar("id", { length: 36 }).primaryKey(),
2557
+ created_at: t.timestamp("created_at").notNull(),
2558
+ updated_at: t.timestamp("updated_at").notNull(),
2559
+ gateway_channel_id: varchar("gateway_channel_id", { length: 36 }).notNull().references(() => gatewayChannels.id, { onDelete: "cascade" }),
2560
+ channel_type: text("channel_type", {
2561
+ enum: ["slack", "discord", "whatsapp", "telegram", "github", "teams"]
2562
+ }).notNull(),
2563
+ platform_channel_id: text("platform_channel_id").notNull(),
2564
+ platform_message_id: text("platform_message_id").notNull(),
2565
+ platform_thread_id: text("platform_thread_id").notNull(),
2566
+ platform_permalink: text("platform_permalink"),
2567
+ target_branch_id: varchar("target_branch_id", { length: 36 }).notNull().references(() => branches.branch_id),
2568
+ emitted_by_user_id: varchar("emitted_by_user_id", { length: 36 }).notNull().references(() => users.user_id),
2569
+ emitted_by_session_id: varchar("emitted_by_session_id", { length: 36 }).references(
2570
+ () => sessions.session_id,
2571
+ {
2572
+ onDelete: "set null"
2573
+ }
2574
+ ),
2575
+ emitted_by_task_id: varchar("emitted_by_task_id", { length: 36 }).references(
2576
+ () => tasks.task_id,
2577
+ {
2578
+ onDelete: "set null"
2579
+ }
2580
+ ),
2581
+ emitted_by_schedule_id: varchar("emitted_by_schedule_id", { length: 36 }).references(
2582
+ () => schedules.schedule_id,
2583
+ {
2584
+ onDelete: "set null"
2585
+ }
2586
+ ),
2587
+ message_text: text("message_text").notNull(),
2588
+ message_preview: text("message_preview").notNull(),
2589
+ metadata: t.json("metadata"),
2590
+ consumed_by_session_id: varchar("consumed_by_session_id", { length: 36 }).references(
2591
+ () => sessions.session_id,
2592
+ {
2593
+ onDelete: "set null"
2594
+ }
2595
+ ),
2596
+ consumed_at: t.timestamp("consumed_at")
2597
+ },
2598
+ (table) => ({
2599
+ tenantIdx: index("gateway_outbound_messages_tenant_id_idx").on(table.tenant_id),
2600
+ uniqueChannelThread: uniqueIndex("uniq_gateway_outbound_tenant_channel_thread").on(
2601
+ table.tenant_id,
2602
+ table.gateway_channel_id,
2603
+ table.platform_thread_id
2604
+ ),
2605
+ emittedSessionIdx: index("idx_gateway_outbound_emitted_session").on(
2606
+ table.emitted_by_session_id
2607
+ ),
2608
+ emittedScheduleIdx: index("idx_gateway_outbound_emitted_schedule").on(
2609
+ table.emitted_by_schedule_id
2610
+ ),
2611
+ targetBranchCreatedIdx: index("idx_gateway_outbound_branch_created").on(
2612
+ table.target_branch_id,
2613
+ table.created_at
2614
+ ),
2615
+ consumedIdx: index("idx_gateway_outbound_consumed").on(table.consumed_at)
2616
+ })
2617
+ );
2294
2618
  sessionEnvSelections = pgTable(
2295
2619
  "session_env_selections",
2296
2620
  {
2621
+ tenant_id: text("tenant_id").notNull().default("default"),
2297
2622
  session_id: varchar("session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
2298
2623
  env_var_name: text("env_var_name").notNull(),
2299
2624
  created_at: t.timestamp("created_at").notNull()
2300
2625
  },
2301
2626
  (table) => ({
2627
+ tenantIdx: index("session_env_selections_tenant_id_idx").on(table.tenant_id),
2302
2628
  pk: primaryKey({ columns: [table.session_id, table.env_var_name] }),
2303
2629
  sessionIdx: index("session_env_selections_session_idx").on(table.session_id)
2304
2630
  })
@@ -2306,6 +2632,7 @@ var init_schema_postgres = __esm({
2306
2632
  kbNamespaces = pgTable(
2307
2633
  "kb_namespaces",
2308
2634
  {
2635
+ tenant_id: text("tenant_id").notNull().default("default"),
2309
2636
  namespace_id: varchar("namespace_id", { length: 36 }).primaryKey(),
2310
2637
  slug: text("slug").notNull(),
2311
2638
  display_name: text("display_name").notNull(),
@@ -2332,7 +2659,8 @@ var init_schema_postgres = __esm({
2332
2659
  archived_at: t.timestamp("archived_at")
2333
2660
  },
2334
2661
  (table) => ({
2335
- slugIdx: uniqueIndex("kb_namespaces_slug_idx").on(table.slug).where(sql2`${table.archived} = false`),
2662
+ tenantIdx: index("kb_namespaces_tenant_id_idx").on(table.tenant_id),
2663
+ slugIdx: uniqueIndex("kb_namespaces_tenant_slug_unique").on(table.tenant_id, table.slug).where(sql2`${table.archived} = false`),
2336
2664
  kindIdx: index("kb_namespaces_kind_idx").on(table.kind),
2337
2665
  ownerIdx: index("kb_namespaces_owner_idx").on(table.owner_user_id),
2338
2666
  repoIdx: index("kb_namespaces_repo_idx").on(table.repo_id),
@@ -2343,6 +2671,7 @@ var init_schema_postgres = __esm({
2343
2671
  kbNamespaceAcl = pgTable(
2344
2672
  "kb_namespace_acl",
2345
2673
  {
2674
+ tenant_id: text("tenant_id").notNull().default("default"),
2346
2675
  namespace_acl_id: varchar("namespace_acl_id", { length: 36 }).primaryKey(),
2347
2676
  namespace_id: varchar("namespace_id", { length: 36 }).notNull().references(() => kbNamespaces.namespace_id, { onDelete: "cascade" }),
2348
2677
  subject_type: text("subject_type", { enum: ["user", "group"] }).notNull(),
@@ -2355,9 +2684,11 @@ var init_schema_postgres = __esm({
2355
2684
  updated_at: t.timestamp("updated_at")
2356
2685
  },
2357
2686
  (table) => ({
2687
+ tenantIdx: index("kb_namespace_acl_tenant_id_idx").on(table.tenant_id),
2358
2688
  namespaceIdx: index("kb_namespace_acl_namespace_idx").on(table.namespace_id),
2359
2689
  subjectIdx: index("kb_namespace_acl_subject_idx").on(table.subject_type, table.subject_id),
2360
- namespaceSubjectIdx: uniqueIndex("kb_namespace_acl_namespace_subject_idx").on(
2690
+ namespaceSubjectIdx: uniqueIndex("kb_namespace_acl_tenant_namespace_subject_unique").on(
2691
+ table.tenant_id,
2361
2692
  table.namespace_id,
2362
2693
  table.subject_type,
2363
2694
  table.subject_id
@@ -2367,6 +2698,7 @@ var init_schema_postgres = __esm({
2367
2698
  kbDocuments = pgTable(
2368
2699
  "kb_documents",
2369
2700
  {
2701
+ tenant_id: text("tenant_id").notNull().default("default"),
2370
2702
  document_id: varchar("document_id", { length: 36 }).primaryKey(),
2371
2703
  namespace_id: varchar("namespace_id", { length: 36 }).notNull().references(() => kbNamespaces.namespace_id, { onDelete: "cascade" }),
2372
2704
  path: text("path").notNull(),
@@ -2394,8 +2726,9 @@ var init_schema_postgres = __esm({
2394
2726
  archived_at: t.timestamp("archived_at")
2395
2727
  },
2396
2728
  (table) => ({
2397
- namespacePathIdx: uniqueIndex("kb_documents_namespace_path_idx").on(table.namespace_id, table.path).where(sql2`${table.archived} = false`),
2398
- uriIdx: uniqueIndex("kb_documents_uri_idx").on(table.uri).where(sql2`${table.archived} = false`),
2729
+ tenantIdx: index("kb_documents_tenant_id_idx").on(table.tenant_id),
2730
+ namespacePathIdx: uniqueIndex("kb_documents_tenant_namespace_path_unique").on(table.tenant_id, table.namespace_id, table.path).where(sql2`${table.archived} = false`),
2731
+ uriIdx: uniqueIndex("kb_documents_tenant_uri_unique").on(table.tenant_id, table.uri).where(sql2`${table.archived} = false`),
2399
2732
  namespaceIdx: index("kb_documents_namespace_idx").on(table.namespace_id),
2400
2733
  kindIdx: index("kb_documents_kind_idx").on(table.kind),
2401
2734
  visibilityIdx: index("kb_documents_visibility_idx").on(table.visibility),
@@ -2408,6 +2741,7 @@ var init_schema_postgres = __esm({
2408
2741
  kbDocumentVersions = pgTable(
2409
2742
  "kb_document_versions",
2410
2743
  {
2744
+ tenant_id: text("tenant_id").notNull().default("default"),
2411
2745
  version_id: varchar("version_id", { length: 36 }).primaryKey(),
2412
2746
  document_id: varchar("document_id", { length: 36 }).notNull().references(() => kbDocuments.document_id, { onDelete: "cascade" }),
2413
2747
  version_number: integer("version_number").notNull(),
@@ -2427,7 +2761,9 @@ var init_schema_postgres = __esm({
2427
2761
  created_at: t.timestamp("created_at").notNull()
2428
2762
  },
2429
2763
  (table) => ({
2430
- documentVersionIdx: uniqueIndex("kb_document_versions_document_version_idx").on(
2764
+ tenantIdx: index("kb_document_versions_tenant_id_idx").on(table.tenant_id),
2765
+ documentVersionIdx: uniqueIndex("kb_document_versions_tenant_document_version_unique").on(
2766
+ table.tenant_id,
2431
2767
  table.document_id,
2432
2768
  table.version_number
2433
2769
  ),
@@ -2439,6 +2775,7 @@ var init_schema_postgres = __esm({
2439
2775
  kbDocumentUnits = pgTable(
2440
2776
  "kb_document_units",
2441
2777
  {
2778
+ tenant_id: text("tenant_id").notNull().default("default"),
2442
2779
  unit_id: varchar("unit_id", { length: 36 }).primaryKey(),
2443
2780
  document_id: varchar("document_id", { length: 36 }).notNull().references(() => kbDocuments.document_id, { onDelete: "cascade" }),
2444
2781
  version_id: varchar("version_id", { length: 36 }).notNull().references(() => kbDocumentVersions.version_id, { onDelete: "cascade" }),
@@ -2463,6 +2800,7 @@ var init_schema_postgres = __esm({
2463
2800
  updated_at: t.timestamp("updated_at")
2464
2801
  },
2465
2802
  (table) => ({
2803
+ tenantIdx: index("kb_document_units_tenant_id_idx").on(table.tenant_id),
2466
2804
  documentIdx: index("kb_document_units_document_idx").on(table.document_id),
2467
2805
  versionIdx: index("kb_document_units_version_idx").on(table.version_id),
2468
2806
  versionOrdinalIdx: index("kb_document_units_version_ordinal_idx").on(
@@ -2476,6 +2814,7 @@ var init_schema_postgres = __esm({
2476
2814
  kbEmbeddingSpaces = pgTable(
2477
2815
  "kb_embedding_spaces",
2478
2816
  {
2817
+ tenant_id: text("tenant_id").notNull().default("default"),
2479
2818
  embedding_space_id: varchar("embedding_space_id", { length: 36 }).primaryKey(),
2480
2819
  provider: text("provider").notNull(),
2481
2820
  model: text("model").notNull(),
@@ -2488,7 +2827,9 @@ var init_schema_postgres = __esm({
2488
2827
  updated_at: t.timestamp("updated_at")
2489
2828
  },
2490
2829
  (table) => ({
2491
- providerModelIdx: uniqueIndex("kb_embedding_spaces_provider_model_idx").on(
2830
+ tenantIdx: index("kb_embedding_spaces_tenant_id_idx").on(table.tenant_id),
2831
+ providerModelIdx: uniqueIndex("kb_embedding_spaces_tenant_provider_model_unique").on(
2832
+ table.tenant_id,
2492
2833
  table.provider,
2493
2834
  table.model,
2494
2835
  table.dimensions,
@@ -2501,6 +2842,7 @@ var init_schema_postgres = __esm({
2501
2842
  kbGraphNodes = pgTable(
2502
2843
  "kb_graph_nodes",
2503
2844
  {
2845
+ tenant_id: text("tenant_id").notNull().default("default"),
2504
2846
  node_id: varchar("node_id", { length: 36 }).primaryKey(),
2505
2847
  node_type: text("node_type", {
2506
2848
  enum: [
@@ -2566,7 +2908,8 @@ var init_schema_postgres = __esm({
2566
2908
  archived_at: t.timestamp("archived_at")
2567
2909
  },
2568
2910
  (table) => ({
2569
- uriIdx: uniqueIndex("kb_graph_nodes_uri_idx").on(table.uri).where(sql2`${table.archived} = false`),
2911
+ tenantIdx: index("kb_graph_nodes_tenant_id_idx").on(table.tenant_id),
2912
+ uriIdx: uniqueIndex("kb_graph_nodes_tenant_uri_unique").on(table.tenant_id, table.uri).where(sql2`${table.archived} = false`),
2570
2913
  typeIdx: index("kb_graph_nodes_type_idx").on(table.node_type),
2571
2914
  namespaceIdx: index("kb_graph_nodes_namespace_idx").on(table.namespace_id),
2572
2915
  documentIdx: index("kb_graph_nodes_document_idx").on(table.document_id),
@@ -2586,6 +2929,7 @@ var init_schema_postgres = __esm({
2586
2929
  kbGraphEdges = pgTable(
2587
2930
  "kb_graph_edges",
2588
2931
  {
2932
+ tenant_id: text("tenant_id").notNull().default("default"),
2589
2933
  edge_id: varchar("edge_id", { length: 36 }).primaryKey(),
2590
2934
  source_node_id: varchar("source_node_id", { length: 36 }).notNull().references(() => kbGraphNodes.node_id, { onDelete: "cascade" }),
2591
2935
  target_node_id: varchar("target_node_id", { length: 36 }).notNull().references(() => kbGraphNodes.node_id, { onDelete: "cascade" }),
@@ -2614,6 +2958,7 @@ var init_schema_postgres = __esm({
2614
2958
  archived_at: t.timestamp("archived_at")
2615
2959
  },
2616
2960
  (table) => ({
2961
+ tenantIdx: index("kb_graph_edges_tenant_id_idx").on(table.tenant_id),
2617
2962
  sourceIdx: index("kb_graph_edges_source_idx").on(table.source_node_id),
2618
2963
  targetIdx: index("kb_graph_edges_target_idx").on(table.target_node_id),
2619
2964
  typeIdx: index("kb_graph_edges_type_idx").on(table.edge_type),
@@ -2625,7 +2970,7 @@ var init_schema_postgres = __esm({
2625
2970
  table.target_node_id,
2626
2971
  table.edge_type
2627
2972
  ),
2628
- sourceTargetTypeIdx: uniqueIndex("kb_graph_edges_source_target_type_idx").on(table.source_node_id, table.target_node_id, table.edge_type).where(sql2`${table.archived} = false`),
2973
+ sourceTargetTypeIdx: 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(sql2`${table.archived} = false`),
2629
2974
  archivedIdx: index("kb_graph_edges_archived_idx").on(table.archived)
2630
2975
  })
2631
2976
  );
@@ -2689,6 +3034,7 @@ __export(schema_sqlite_exports, {
2689
3034
  cardTypes: () => cardTypes2,
2690
3035
  cards: () => cards2,
2691
3036
  gatewayChannels: () => gatewayChannels2,
3037
+ gatewayOutboundMessages: () => gatewayOutboundMessages2,
2692
3038
  groupMemberships: () => groupMemberships2,
2693
3039
  groups: () => groups2,
2694
3040
  kbDocumentUnits: () => kbDocumentUnits2,
@@ -2727,7 +3073,7 @@ import {
2727
3073
  text as text2,
2728
3074
  uniqueIndex as uniqueIndex2
2729
3075
  } from "drizzle-orm/sqlite-core";
2730
- var 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;
3076
+ var 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;
2731
3077
  var init_schema_sqlite = __esm({
2732
3078
  "src/db/schema.sqlite.ts"() {
2733
3079
  "use strict";
@@ -2801,6 +3147,7 @@ var init_schema_sqlite = __esm({
2801
3147
  },
2802
3148
  (table) => ({
2803
3149
  statusIdx: index2("sessions_status_idx").on(table.status),
3150
+ statusReadyIdx: index2("sessions_status_ready_idx").on(table.status, table.ready_for_prompt),
2804
3151
  agenticToolIdx: index2("sessions_agentic_tool_idx").on(table.agentic_tool),
2805
3152
  boardIdx: index2("sessions_board_idx").on(table.board_id),
2806
3153
  branchIdx: index2("sessions_branch_idx").on(table.branch_id),
@@ -2840,6 +3187,9 @@ var init_schema_sqlite = __esm({
2840
3187
  sourceIdx: index2("session_relationships_source_idx").on(table.source_session_id),
2841
3188
  targetIdx: index2("session_relationships_target_idx").on(table.target_session_id),
2842
3189
  callbackIdx: index2("session_relationships_callback_idx").on(table.callback_session_id),
3190
+ // Note: no tenant_source/tenant_target composite indexes here — SQLite schema
3191
+ // has no tenant column on this table (RLS is Postgres-only). The standalone
3192
+ // source/target indexes above are sufficient for SQLite.
2843
3193
  sourceTargetTypeUnique: uniqueIndex2("session_relationships_source_target_type_unique").on(
2844
3194
  table.source_session_id,
2845
3195
  table.target_session_id,
@@ -2959,7 +3309,12 @@ var init_schema_sqlite = __esm({
2959
3309
  // Indexes for efficient lookups
2960
3310
  sessionIdx: index2("messages_session_id_idx").on(table.session_id),
2961
3311
  taskIdx: index2("messages_task_id_idx").on(table.task_id),
2962
- sessionIndexIdx: index2("messages_session_index_idx").on(table.session_id, table.index)
3312
+ sessionIndexIdx: index2("messages_session_index_idx").on(table.session_id, table.index),
3313
+ timestampIdx: index2("messages_timestamp_idx").on(table.timestamp),
3314
+ sessionTimestampIdx: index2("messages_session_timestamp_idx").on(
3315
+ table.session_id,
3316
+ table.timestamp
3317
+ )
2963
3318
  })
2964
3319
  );
2965
3320
  boards2 = sqliteTable(
@@ -3185,6 +3540,9 @@ var init_schema_sqlite = __esm({
3185
3540
  onboarding_completed: t2.bool("onboarding_completed").notNull().default(false),
3186
3541
  // Force password change flag (admin-settable, auto-cleared on password change)
3187
3542
  must_change_password: t2.bool("must_change_password").notNull().default(false),
3543
+ // Auth invalidation marker. Password changes set this timestamp so any
3544
+ // previously issued browser access or refresh token is rejected.
3545
+ tokens_valid_after: t2.timestamp("tokens_valid_after"),
3188
3546
  // JSON blob for profile/preferences
3189
3547
  data: t2.json("data").$type().notNull()
3190
3548
  },
@@ -3628,6 +3986,66 @@ var init_schema_sqlite = __esm({
3628
3986
  channelStatusIdx: index2("idx_thread_map_channel_status").on(table.channel_id, table.status)
3629
3987
  })
3630
3988
  );
3989
+ gatewayOutboundMessages2 = sqliteTable(
3990
+ "gateway_outbound_messages",
3991
+ {
3992
+ id: text2("id", { length: 36 }).primaryKey(),
3993
+ created_at: t2.timestamp("created_at").notNull(),
3994
+ updated_at: t2.timestamp("updated_at").notNull(),
3995
+ gateway_channel_id: text2("gateway_channel_id", { length: 36 }).notNull().references(() => gatewayChannels2.id, { onDelete: "cascade" }),
3996
+ channel_type: text2("channel_type", {
3997
+ enum: ["slack", "discord", "whatsapp", "telegram", "github", "teams"]
3998
+ }).notNull(),
3999
+ platform_channel_id: text2("platform_channel_id").notNull(),
4000
+ platform_message_id: text2("platform_message_id").notNull(),
4001
+ platform_thread_id: text2("platform_thread_id").notNull(),
4002
+ platform_permalink: text2("platform_permalink"),
4003
+ target_branch_id: text2("target_branch_id", { length: 36 }).notNull().references(() => branches2.branch_id),
4004
+ emitted_by_user_id: text2("emitted_by_user_id", { length: 36 }).notNull().references(() => users2.user_id),
4005
+ emitted_by_session_id: text2("emitted_by_session_id", { length: 36 }).references(
4006
+ () => sessions2.session_id,
4007
+ {
4008
+ onDelete: "set null"
4009
+ }
4010
+ ),
4011
+ emitted_by_task_id: text2("emitted_by_task_id", { length: 36 }).references(() => tasks2.task_id, {
4012
+ onDelete: "set null"
4013
+ }),
4014
+ emitted_by_schedule_id: text2("emitted_by_schedule_id", { length: 36 }).references(
4015
+ () => schedules2.schedule_id,
4016
+ {
4017
+ onDelete: "set null"
4018
+ }
4019
+ ),
4020
+ message_text: text2("message_text").notNull(),
4021
+ message_preview: text2("message_preview").notNull(),
4022
+ metadata: t2.json("metadata"),
4023
+ consumed_by_session_id: text2("consumed_by_session_id", { length: 36 }).references(
4024
+ () => sessions2.session_id,
4025
+ {
4026
+ onDelete: "set null"
4027
+ }
4028
+ ),
4029
+ consumed_at: t2.timestamp("consumed_at")
4030
+ },
4031
+ (table) => ({
4032
+ uniqueChannelThread: uniqueIndex2("uniq_gateway_outbound_channel_thread").on(
4033
+ table.gateway_channel_id,
4034
+ table.platform_thread_id
4035
+ ),
4036
+ emittedSessionIdx: index2("idx_gateway_outbound_emitted_session").on(
4037
+ table.emitted_by_session_id
4038
+ ),
4039
+ emittedScheduleIdx: index2("idx_gateway_outbound_emitted_schedule").on(
4040
+ table.emitted_by_schedule_id
4041
+ ),
4042
+ targetBranchCreatedIdx: index2("idx_gateway_outbound_branch_created").on(
4043
+ table.target_branch_id,
4044
+ table.created_at
4045
+ ),
4046
+ consumedIdx: index2("idx_gateway_outbound_consumed").on(table.consumed_at)
4047
+ })
4048
+ );
3631
4049
  sessionEnvSelections2 = sqliteTable(
3632
4050
  "session_env_selections",
3633
4051
  {
@@ -4069,6 +4487,7 @@ __export(schema_exports, {
4069
4487
  cardTypes: () => cardTypes3,
4070
4488
  cards: () => cards3,
4071
4489
  gatewayChannels: () => gatewayChannels3,
4490
+ gatewayOutboundMessages: () => gatewayOutboundMessages3,
4072
4491
  groupMemberships: () => groupMemberships3,
4073
4492
  groups: () => groups3,
4074
4493
  kbDocumentUnits: () => kbDocumentUnits3,
@@ -4094,7 +4513,7 @@ __export(schema_exports, {
4094
4513
  userMcpOauthTokens: () => userMcpOauthTokens3,
4095
4514
  users: () => users3
4096
4515
  });
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;
4516
+ 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
4517
  var init_schema = __esm({
4099
4518
  "src/db/schema.ts"() {
4100
4519
  "use strict";
@@ -4132,6 +4551,7 @@ var init_schema = __esm({
4132
4551
  boardComments3 = schema.boardComments;
4133
4552
  gatewayChannels3 = schema.gatewayChannels;
4134
4553
  threadSessionMap3 = schema.threadSessionMap;
4554
+ gatewayOutboundMessages3 = schema.gatewayOutboundMessages;
4135
4555
  userApiKeys3 = schema.userApiKeys;
4136
4556
  serializedSessions3 = schema.serializedSessions;
4137
4557
  kbNamespaces3 = schema.kbNamespaces;
@@ -4163,33 +4583,6 @@ var init_ids = __esm({
4163
4583
  }
4164
4584
  });
4165
4585
 
4166
- // src/db/user-utils.ts
4167
- import bcrypt from "bcryptjs";
4168
- import { eq as eq3 } from "drizzle-orm";
4169
- var init_user_utils = __esm({
4170
- "src/db/user-utils.ts"() {
4171
- "use strict";
4172
- init_esm_shims();
4173
- init_ids();
4174
- init_user();
4175
- init_database_wrapper();
4176
- init_schema();
4177
- }
4178
- });
4179
-
4180
- // src/db/first-run-bootstrap.ts
4181
- import { randomInt } from "crypto";
4182
- import { eq as eq4, inArray } from "drizzle-orm";
4183
- var init_first_run_bootstrap = __esm({
4184
- "src/db/first-run-bootstrap.ts"() {
4185
- "use strict";
4186
- init_esm_shims();
4187
- init_database_wrapper();
4188
- init_schema();
4189
- init_user_utils();
4190
- }
4191
- });
4192
-
4193
4586
  // src/unix/index.ts
4194
4587
  init_esm_shims();
4195
4588
 
@@ -4199,7 +4592,7 @@ import { exec, execSync, spawn } from "child_process";
4199
4592
  import { promisify } from "util";
4200
4593
  var execAsync = promisify(exec);
4201
4594
  function spawnWithInput(cmd, args, input) {
4202
- return new Promise((resolve2, reject) => {
4595
+ return new Promise((resolve, reject) => {
4203
4596
  const child = spawn(cmd, args, {
4204
4597
  stdio: ["pipe", "pipe", "pipe"]
4205
4598
  });
@@ -4213,7 +4606,7 @@ function spawnWithInput(cmd, args, input) {
4213
4606
  });
4214
4607
  child.on("error", reject);
4215
4608
  child.on("close", (code) => {
4216
- resolve2({
4609
+ resolve({
4217
4610
  stdout,
4218
4611
  stderr,
4219
4612
  exitCode: code ?? 1
@@ -4697,10 +5090,7 @@ import fs from "fs";
4697
5090
 
4698
5091
  // src/yaml/index.ts
4699
5092
  init_esm_shims();
4700
- import yaml from "js-yaml";
4701
- var load = yaml.load;
4702
- var dump = yaml.dump;
4703
- var YAMLException = yaml.YAMLException;
5093
+ import * as yaml from "js-yaml";
4704
5094
 
4705
5095
  // src/config/variant-resolver.ts
4706
5096
  init_esm_shims();
@@ -4892,6 +5282,7 @@ import { and, eq } from "drizzle-orm";
4892
5282
  init_esm_shims();
4893
5283
  init_ids();
4894
5284
  init_id();
5285
+ init_tenant_context();
4895
5286
  var RepositoryError = class extends Error {
4896
5287
  constructor(message, cause) {
4897
5288
  super(message);
@@ -4933,6 +5324,21 @@ async function resolveByShortIdPrefix(id, entityType, fetchMatches) {
4933
5324
  return matches[0];
4934
5325
  }
4935
5326
  var RESOLVE_SHORT_ID_FETCH_LIMIT = 11;
5327
+ function getHiddenTenantId(row) {
5328
+ const tenantId = row?.tenant_id;
5329
+ return typeof tenantId === "string" && tenantId.length > 0 ? tenantId : void 0;
5330
+ }
5331
+ function attachHiddenTenant(dto, row) {
5332
+ const tenantId = getHiddenTenantId(row);
5333
+ if (tenantId) {
5334
+ Object.defineProperty(dto, "tenant_id", {
5335
+ value: tenantId,
5336
+ enumerable: false,
5337
+ configurable: true
5338
+ });
5339
+ }
5340
+ return dto;
5341
+ }
4936
5342
 
4937
5343
  // src/db/repositories/session-env-selections.ts
4938
5344
  var SessionEnvSelectionRepository = class {
@@ -5320,83 +5726,103 @@ init_executor_heartbeat();
5320
5726
 
5321
5727
  // src/config/key-resolver.ts
5322
5728
  init_esm_shims();
5323
-
5324
- // src/db/index.ts
5325
- init_esm_shims();
5729
+ init_database_wrapper();
5730
+ import { eq as eq3 } from "drizzle-orm";
5731
+ init_schema();
5326
5732
  init_ids();
5327
- import {
5328
- and as and23,
5329
- asc as asc3,
5330
- desc as desc6,
5331
- eq as eq32,
5332
- gt,
5333
- gte,
5334
- inArray as inArray8,
5335
- like as like16,
5336
- lte as lte2,
5337
- or as or9,
5338
- sql as sql15
5339
- } from "drizzle-orm";
5340
- import bcryptjs from "bcryptjs";
5733
+ init_config_manager();
5734
+ var DEBUG_KEY_RESOLUTION = process.env.AGOR_DEBUG_KEY_RESOLUTION === "1" || process.env.DEBUG?.includes("key-resolution");
5341
5735
 
5342
- // src/lib/slugs.ts
5343
- init_esm_shims();
5736
+ // src/config/index.ts
5737
+ init_multitenancy();
5344
5738
 
5345
- // src/db/client.ts
5346
- init_esm_shims();
5347
- init_config_manager();
5348
- init_schema_postgres();
5349
- init_schema_sqlite();
5350
- init_schema_factory();
5351
- import { createClient } from "@libsql/client";
5352
- import { drizzle as drizzleSQLite } from "drizzle-orm/libsql";
5353
- import { drizzle as drizzlePostgres } from "drizzle-orm/postgres-js";
5354
- import postgres from "postgres";
5355
-
5356
- // src/utils/path.ts
5739
+ // src/config/proxies-resolver.ts
5357
5740
  init_esm_shims();
5358
- import { homedir } from "os";
5359
- import { join } from "path";
5360
-
5361
- // src/db/index.ts
5362
- init_database_wrapper();
5363
- init_first_run_bootstrap();
5364
5741
 
5365
- // src/db/migrate.ts
5742
+ // src/config/repo-list.ts
5366
5743
  init_esm_shims();
5367
- init_database_wrapper();
5368
- init_schema();
5369
- import { dirname, join as join2 } from "path";
5370
- import { fileURLToPath as fileURLToPath2 } from "url";
5371
- import { eq as eq5, sql as sql4 } from "drizzle-orm";
5372
- import { migrate as migrateSQLite } from "drizzle-orm/libsql/migrator";
5373
- import { migrate as migratePostgres } from "drizzle-orm/postgres-js/migrator";
5374
5744
 
5375
- // src/db/pending-migrations.ts
5745
+ // src/config/repo-reference.ts
5376
5746
  init_esm_shims();
5747
+ var REPO_SLUG_PATTERN = /^[a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+$/;
5377
5748
 
5378
- // src/db/repositories/index.ts
5749
+ // src/config/resolved-config-slice.ts
5379
5750
  init_esm_shims();
5751
+ import { z } from "zod";
5752
+ var ResolvedConfigSliceSchema = z.object({
5753
+ /** From `config.execution.*` */
5754
+ execution: z.object({
5755
+ permission_timeout_ms: z.number().int().nonnegative().optional(),
5756
+ executor_heartbeat: z.object({
5757
+ enabled: z.boolean(),
5758
+ interval_ms: z.number().int().positive()
5759
+ }).optional()
5760
+ }).optional(),
5761
+ /** From `config.opencode.*` */
5762
+ opencode: z.object({
5763
+ serverUrl: z.string().optional()
5764
+ }).optional(),
5765
+ /** From `config.daemon.*` (selected fields only) */
5766
+ daemon: z.object({
5767
+ host_ip_address: z.string().optional()
5768
+ }).optional()
5769
+ });
5380
5770
 
5381
- // src/db/repositories/app-variables.ts
5771
+ // src/config/resource-schemas.ts
5382
5772
  init_esm_shims();
5383
- init_ids();
5384
- init_database_wrapper();
5385
- import { and as and2, eq as eq6 } from "drizzle-orm";
5386
- init_schema();
5773
+ import { z as z2 } from "zod";
5774
+ var uuidSchema = z2.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");
5775
+ var repoSlugSchema = z2.string().regex(
5776
+ REPO_SLUG_PATTERN,
5777
+ 'Must be org/name format with alphanumeric, hyphens, underscores, or dots (e.g., "my-org/my-repo")'
5778
+ );
5779
+ var enforcedAgentConfigSchema = z2.object({
5780
+ agentic_tool: z2.enum(["claude-code", "claude-code-cli", "codex", "gemini", "opencode", "copilot", "cursor"]).optional(),
5781
+ permission_mode: z2.string().optional(),
5782
+ model: z2.string().optional(),
5783
+ mcp_server_ids: z2.array(z2.string()).optional()
5784
+ });
5785
+ var resourceRepoConfigSchema = z2.object({
5786
+ repo_id: uuidSchema,
5787
+ slug: repoSlugSchema,
5788
+ remote_url: z2.string().optional(),
5789
+ repo_type: z2.enum(["remote", "local"]).default("remote"),
5790
+ default_branch: z2.string().optional(),
5791
+ shallow: z2.boolean().optional()
5792
+ }).refine((data) => data.repo_type !== "remote" || data.remote_url, {
5793
+ message: 'remote_url is required when repo_type is "remote"',
5794
+ path: ["remote_url"]
5795
+ });
5796
+ var resourceBranchConfigSchema = z2.object({
5797
+ branch_id: uuidSchema,
5798
+ name: z2.string().min(1, "Branch name is required"),
5799
+ ref: z2.string().min(1, "Git ref is required"),
5800
+ ref_type: z2.enum(["branch", "tag"]).optional(),
5801
+ others_can: z2.enum(["none", "view", "session", "prompt", "all"]).optional(),
5802
+ mcp_server_ids: z2.array(z2.string()).optional(),
5803
+ repo: repoSlugSchema,
5804
+ readonly: z2.boolean().optional(),
5805
+ agent: enforcedAgentConfigSchema.optional()
5806
+ });
5807
+ var resourceUserConfigSchema = z2.object({
5808
+ user_id: uuidSchema,
5809
+ email: z2.string().email("Must be a valid email address"),
5810
+ name: z2.string().optional(),
5811
+ role: z2.enum(["superadmin", "admin", "member", "viewer"]).default("member"),
5812
+ unix_username: z2.string().optional(),
5813
+ password: z2.string().optional()
5814
+ });
5815
+ var daemonResourcesConfigSchema = z2.object({
5816
+ repos: z2.array(resourceRepoConfigSchema).optional(),
5817
+ branches: z2.array(resourceBranchConfigSchema).optional(),
5818
+ users: z2.array(resourceUserConfigSchema).optional()
5819
+ });
5387
5820
 
5388
- // src/db/repositories/artifact-trust.ts
5821
+ // src/config/resource-sync.ts
5389
5822
  init_esm_shims();
5390
- init_ids();
5391
- init_database_wrapper();
5392
- init_schema();
5393
- import { and as and3, eq as eq7, isNull } from "drizzle-orm";
5394
5823
 
5395
- // src/db/repositories/artifacts.ts
5824
+ // src/config/security-resolver.ts
5396
5825
  init_esm_shims();
5397
- init_config_manager();
5398
- init_ids();
5399
- import { and as and4, eq as eq8, like, or } from "drizzle-orm";
5400
5826
 
5401
5827
  // src/utils/url.ts
5402
5828
  init_esm_shims();
@@ -5448,26 +5874,40 @@ function stripHttpUrlUserinfo(rawUrl) {
5448
5874
  }
5449
5875
  }
5450
5876
 
5451
- // src/db/repositories/artifacts.ts
5452
- init_database_wrapper();
5453
- init_schema();
5454
-
5455
- // src/db/repositories/board-comments.ts
5877
+ // src/config/security-resolver.ts
5878
+ var DEFAULT_GIT_CONFIG_PARAMETERS = Object.freeze([
5879
+ "transfer.credentialsInUrl=die",
5880
+ "protocol.file.allow=user",
5881
+ "protocol.ext.allow=never",
5882
+ "core.protectHFS=true",
5883
+ "core.protectNTFS=true"
5884
+ ]);
5885
+
5886
+ // src/config/index.ts
5887
+ init_types();
5888
+
5889
+ // src/db/repositories/index.ts
5890
+ init_esm_shims();
5891
+
5892
+ // src/db/repositories/app-variables.ts
5456
5893
  init_esm_shims();
5457
5894
  init_ids();
5458
5895
  init_database_wrapper();
5896
+ import { and as and2, eq as eq4 } from "drizzle-orm";
5459
5897
  init_schema();
5460
- import { and as and5, eq as eq9, isNull as isNull2, like as like2 } from "drizzle-orm";
5461
5898
 
5462
- // src/db/repositories/board-objects.ts
5899
+ // src/db/repositories/artifact-trust.ts
5463
5900
  init_esm_shims();
5464
5901
  init_ids();
5465
- import { and as and7, asc, eq as eq11, getTableColumns, isNotNull as isNotNull2, isNull as isNull3, or as or3, sql as sql6 } from "drizzle-orm";
5902
+ init_database_wrapper();
5903
+ init_schema();
5904
+ import { and as and3, eq as eq5, isNull } from "drizzle-orm";
5466
5905
 
5467
- // src/utils/board-placement.ts
5906
+ // src/db/repositories/artifacts.ts
5468
5907
  init_esm_shims();
5469
-
5470
- // src/db/repositories/board-objects.ts
5908
+ init_config_manager();
5909
+ init_ids();
5910
+ import { and as and5, eq as eq7, inArray as inArray2, like, or as or2 } from "drizzle-orm";
5471
5911
  init_database_wrapper();
5472
5912
  init_schema();
5473
5913
 
@@ -5476,26 +5916,26 @@ init_esm_shims();
5476
5916
  init_types2();
5477
5917
  init_database_wrapper();
5478
5918
  init_schema();
5479
- import { and as and6, eq as eq10, exists, inArray as inArray2, isNotNull, or as or2, sql as sql5 } from "drizzle-orm";
5919
+ import { and as and4, eq as eq6, exists, inArray, isNotNull, or, sql as sql4 } from "drizzle-orm";
5480
5920
  var VISIBLE_BRANCH_PERMISSION_LEVELS = BRANCH_PERMISSION_LEVELS.filter(
5481
5921
  (level) => level !== "none"
5482
5922
  );
5483
5923
  function activeGroupGrantAccessExists(db, userId) {
5484
5924
  return exists(
5485
5925
  // biome-ignore lint/suspicious/noExplicitAny: Drizzle select has complex cross-dialect overloads
5486
- db.select({ _: sql5`1` }).from(branchGroupGrants3).innerJoin(
5926
+ db.select({ _: sql4`1` }).from(branchGroupGrants3).innerJoin(
5487
5927
  groupMemberships3,
5488
- and6(
5489
- eq10(groupMemberships3.group_id, branchGroupGrants3.group_id),
5490
- eq10(groupMemberships3.user_id, userId)
5928
+ and4(
5929
+ eq6(groupMemberships3.group_id, branchGroupGrants3.group_id),
5930
+ eq6(groupMemberships3.user_id, userId)
5491
5931
  )
5492
5932
  ).innerJoin(
5493
5933
  groups3,
5494
- and6(eq10(groups3.group_id, branchGroupGrants3.group_id), eq10(groups3.archived, false))
5934
+ and4(eq6(groups3.group_id, branchGroupGrants3.group_id), eq6(groups3.archived, false))
5495
5935
  ).where(
5496
- and6(
5497
- eq10(branchGroupGrants3.branch_id, branches3.branch_id),
5498
- inArray2(branchGroupGrants3.can, VISIBLE_BRANCH_PERMISSION_LEVELS)
5936
+ and4(
5937
+ eq6(branchGroupGrants3.branch_id, branches3.branch_id),
5938
+ inArray(branchGroupGrants3.can, VISIBLE_BRANCH_PERMISSION_LEVELS)
5499
5939
  )
5500
5940
  )
5501
5941
  );
@@ -5503,25 +5943,25 @@ function activeGroupGrantAccessExists(db, userId) {
5503
5943
  function activeBoardGroupGrantAccessExists(db, userId) {
5504
5944
  return exists(
5505
5945
  // biome-ignore lint/suspicious/noExplicitAny: Drizzle select has complex cross-dialect overloads
5506
- db.select({ _: sql5`1` }).from(boardGroupGrants3).innerJoin(
5946
+ db.select({ _: sql4`1` }).from(boardGroupGrants3).innerJoin(
5507
5947
  groupMemberships3,
5508
- and6(
5509
- eq10(groupMemberships3.group_id, boardGroupGrants3.group_id),
5510
- eq10(groupMemberships3.user_id, userId)
5948
+ and4(
5949
+ eq6(groupMemberships3.group_id, boardGroupGrants3.group_id),
5950
+ eq6(groupMemberships3.user_id, userId)
5511
5951
  )
5512
5952
  ).innerJoin(
5513
5953
  groups3,
5514
- and6(eq10(groups3.group_id, boardGroupGrants3.group_id), eq10(groups3.archived, false))
5954
+ and4(eq6(groups3.group_id, boardGroupGrants3.group_id), eq6(groups3.archived, false))
5515
5955
  ).innerJoin(
5516
5956
  boards3,
5517
- and6(
5518
- eq10(boards3.board_id, boardGroupGrants3.board_id),
5519
- eq10(sql5`coalesce(${jsonExtract(db, boards3.data, "access_mode")}, 'shared')`, "shared")
5957
+ and4(
5958
+ eq6(boards3.board_id, boardGroupGrants3.board_id),
5959
+ eq6(sql4`coalesce(${jsonExtract(db, boards3.data, "access_mode")}, 'shared')`, "shared")
5520
5960
  )
5521
5961
  ).where(
5522
- and6(
5523
- eq10(boardGroupGrants3.board_id, branches3.board_id),
5524
- inArray2(boardGroupGrants3.can, VISIBLE_BRANCH_PERMISSION_LEVELS)
5962
+ and4(
5963
+ eq6(boardGroupGrants3.board_id, branches3.board_id),
5964
+ inArray(boardGroupGrants3.can, VISIBLE_BRANCH_PERMISSION_LEVELS)
5525
5965
  )
5526
5966
  )
5527
5967
  );
@@ -5529,18 +5969,18 @@ function activeBoardGroupGrantAccessExists(db, userId) {
5529
5969
  function activeBoardOwnerAccessExists(db, userId) {
5530
5970
  return exists(
5531
5971
  // biome-ignore lint/suspicious/noExplicitAny: Drizzle select has complex cross-dialect overloads
5532
- db.select({ _: sql5`1` }).from(boardOwners3).where(and6(eq10(boardOwners3.board_id, branches3.board_id), eq10(boardOwners3.user_id, userId)))
5972
+ db.select({ _: sql4`1` }).from(boardOwners3).where(and4(eq6(boardOwners3.board_id, branches3.board_id), eq6(boardOwners3.user_id, userId)))
5533
5973
  );
5534
5974
  }
5535
5975
  function alignedBoardDefaultVisible(db) {
5536
5976
  return exists(
5537
5977
  // biome-ignore lint/suspicious/noExplicitAny: Drizzle select has complex cross-dialect overloads
5538
- db.select({ _: sql5`1` }).from(boards3).where(
5539
- and6(
5540
- eq10(boards3.board_id, branches3.board_id),
5541
- eq10(sql5`coalesce(${jsonExtract(db, boards3.data, "access_mode")}, 'shared')`, "shared"),
5542
- inArray2(
5543
- sql5`coalesce(${jsonExtract(db, boards3.data, "default_others_can")}, 'session')`,
5978
+ db.select({ _: sql4`1` }).from(boards3).where(
5979
+ and4(
5980
+ eq6(boards3.board_id, branches3.board_id),
5981
+ eq6(sql4`coalesce(${jsonExtract(db, boards3.data, "access_mode")}, 'shared')`, "shared"),
5982
+ inArray(
5983
+ sql4`coalesce(${jsonExtract(db, boards3.data, "default_others_can")}, 'session')`,
5544
5984
  VISIBLE_BRANCH_PERMISSION_LEVELS
5545
5985
  )
5546
5986
  )
@@ -5548,26 +5988,74 @@ function alignedBoardDefaultVisible(db) {
5548
5988
  );
5549
5989
  }
5550
5990
  function visibleBranchAccessCondition(db, userId) {
5551
- return or2(
5991
+ return or(
5552
5992
  isNotNull(branchOwners3.user_id),
5553
5993
  activeGroupGrantAccessExists(db, userId),
5554
- and6(eq10(branches3.permission_source, "board"), activeBoardOwnerAccessExists(db, userId)),
5555
- and6(eq10(branches3.permission_source, "board"), activeBoardGroupGrantAccessExists(db, userId)),
5556
- and6(eq10(branches3.permission_source, "board"), alignedBoardDefaultVisible(db)),
5557
- and6(
5558
- eq10(branches3.permission_source, "override"),
5559
- inArray2(branches3.others_can, VISIBLE_BRANCH_PERMISSION_LEVELS)
5994
+ and4(eq6(branches3.permission_source, "board"), activeBoardOwnerAccessExists(db, userId)),
5995
+ and4(eq6(branches3.permission_source, "board"), activeBoardGroupGrantAccessExists(db, userId)),
5996
+ and4(eq6(branches3.permission_source, "board"), alignedBoardDefaultVisible(db)),
5997
+ and4(
5998
+ eq6(branches3.permission_source, "override"),
5999
+ inArray(branches3.others_can, VISIBLE_BRANCH_PERMISSION_LEVELS)
5560
6000
  )
5561
- ) ?? sql5`false`;
6001
+ ) ?? sql4`false`;
5562
6002
  }
5563
6003
 
6004
+ // src/db/repositories/board-comments.ts
6005
+ init_esm_shims();
6006
+ init_ids();
6007
+ init_database_wrapper();
6008
+ init_schema();
6009
+ import { and as and6, eq as eq8, isNotNull as isNotNull2, isNull as isNull2, like as like2, or as or3, sql as sql5 } from "drizzle-orm";
6010
+
6011
+ // src/db/repositories/board-objects.ts
6012
+ init_esm_shims();
6013
+ init_ids();
6014
+ import { and as and7, asc, eq as eq9, getTableColumns, isNotNull as isNotNull3, isNull as isNull3, or as or4, sql as sql6 } from "drizzle-orm";
6015
+
6016
+ // src/utils/board-placement.ts
6017
+ init_esm_shims();
6018
+
6019
+ // src/db/repositories/board-objects.ts
6020
+ init_database_wrapper();
6021
+ init_schema();
6022
+
5564
6023
  // src/db/repositories/boards.ts
5565
6024
  init_esm_shims();
5566
6025
  init_types2();
5567
6026
  init_config_manager();
5568
6027
  init_ids();
5569
- import { and as and10, eq as eq14, exists as exists2, isNull as isNull4, like as like4, ne, or as or4, sql as sql8 } from "drizzle-orm";
6028
+ import { and as and10, eq as eq12, inArray as inArray4, isNull as isNull4, like as like4, ne } from "drizzle-orm";
5570
6029
  import * as yaml3 from "js-yaml";
6030
+
6031
+ // src/lib/slugs.ts
6032
+ init_esm_shims();
6033
+
6034
+ // src/utils/emoji-shortcodes.ts
6035
+ init_esm_shims();
6036
+ import { createRequire } from "module";
6037
+ var requireJson = createRequire(import.meta.url);
6038
+ var emojiData = requireJson("emojibase-data/en/compact.json");
6039
+ var shortcodes = requireJson(
6040
+ "emojibase-data/en/shortcodes/emojibase.json"
6041
+ );
6042
+ var emojiByHexcode = /* @__PURE__ */ new Map();
6043
+ for (const emoji of emojiData) {
6044
+ if (emoji.unicode) {
6045
+ emojiByHexcode.set(emoji.hexcode, emoji.unicode);
6046
+ }
6047
+ }
6048
+ var emojiByShortcode = /* @__PURE__ */ new Map();
6049
+ for (const [hexcode, codes] of Object.entries(shortcodes)) {
6050
+ const emoji = emojiByHexcode.get(hexcode);
6051
+ if (!emoji) continue;
6052
+ const codeList = Array.isArray(codes) ? codes : [codes];
6053
+ for (const code of codeList) {
6054
+ emojiByShortcode.set(code.toLowerCase(), emoji);
6055
+ }
6056
+ }
6057
+
6058
+ // src/db/repositories/boards.ts
5571
6059
  init_database_wrapper();
5572
6060
  init_schema();
5573
6061
 
@@ -5576,7 +6064,7 @@ init_esm_shims();
5576
6064
  init_types2();
5577
6065
  init_config_manager();
5578
6066
  init_ids();
5579
- import { and as and9, desc, eq as eq13, getTableColumns as getTableColumns2, inArray as inArray3, like as like3, sql as sql7 } from "drizzle-orm";
6067
+ import { and as and9, desc, eq as eq11, exists as exists2, getTableColumns as getTableColumns2, inArray as inArray3, like as like3, or as or5, sql as sql7 } from "drizzle-orm";
5580
6068
  init_database_wrapper();
5581
6069
  init_schema();
5582
6070
 
@@ -5585,7 +6073,7 @@ init_esm_shims();
5585
6073
  init_ids();
5586
6074
  init_database_wrapper();
5587
6075
  init_schema();
5588
- import { and as and8, eq as eq12 } from "drizzle-orm";
6076
+ import { and as and8, eq as eq10 } from "drizzle-orm";
5589
6077
  function slugify(value) {
5590
6078
  return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 80);
5591
6079
  }
@@ -5646,17 +6134,17 @@ var GroupRepository = class {
5646
6134
  }
5647
6135
  async findAll(filter) {
5648
6136
  const conditions = [];
5649
- if (filter?.archived !== void 0) conditions.push(eq12(groups3.archived, filter.archived));
6137
+ if (filter?.archived !== void 0) conditions.push(eq10(groups3.archived, filter.archived));
5650
6138
  const query = select(this.db).from(groups3);
5651
6139
  const rows = conditions.length > 0 ? await query.where(and8(...conditions)).all() : await query.all();
5652
6140
  return rows.map((row) => this.rowToGroup(row));
5653
6141
  }
5654
6142
  async findById(id) {
5655
- const row = await select(this.db).from(groups3).where(eq12(groups3.group_id, id)).one();
6143
+ const row = await select(this.db).from(groups3).where(eq10(groups3.group_id, id)).one();
5656
6144
  return row ? this.rowToGroup(row) : null;
5657
6145
  }
5658
6146
  async findBySlug(slug) {
5659
- const row = await select(this.db).from(groups3).where(eq12(groups3.slug, slug)).one();
6147
+ const row = await select(this.db).from(groups3).where(eq10(groups3.slug, slug)).one();
5660
6148
  return row ? this.rowToGroup(row) : null;
5661
6149
  }
5662
6150
  async create(data) {
@@ -5690,7 +6178,7 @@ var GroupRepository = class {
5690
6178
  if (updates.slug !== void 0) patch.slug = normalizeSlug(updates.slug);
5691
6179
  if (updates.description !== void 0) patch.description = updates.description;
5692
6180
  if (updates.archived !== void 0) patch.archived = updates.archived;
5693
- await update(this.db, groups3).set(patch).where(eq12(groups3.group_id, existing.group_id)).run();
6181
+ await update(this.db, groups3).set(patch).where(eq10(groups3.group_id, existing.group_id)).run();
5694
6182
  const updatedGroup = await this.findById(existing.group_id);
5695
6183
  if (!updatedGroup) throw new RepositoryError("Failed to retrieve updated group");
5696
6184
  return updatedGroup;
@@ -5698,19 +6186,19 @@ var GroupRepository = class {
5698
6186
  async delete(id) {
5699
6187
  const existing = await this.findById(id);
5700
6188
  if (!existing) throw new EntityNotFoundError("Group", id);
5701
- await deleteFrom(this.db, groups3).where(eq12(groups3.group_id, existing.group_id)).run();
6189
+ await deleteFrom(this.db, groups3).where(eq10(groups3.group_id, existing.group_id)).run();
5702
6190
  return existing;
5703
6191
  }
5704
6192
  async listMemberships(filter) {
5705
6193
  const conditions = [];
5706
- if (filter?.group_id) conditions.push(eq12(groupMemberships3.group_id, filter.group_id));
5707
- if (filter?.user_id) conditions.push(eq12(groupMemberships3.user_id, filter.user_id));
6194
+ if (filter?.group_id) conditions.push(eq10(groupMemberships3.group_id, filter.group_id));
6195
+ if (filter?.user_id) conditions.push(eq10(groupMemberships3.user_id, filter.user_id));
5708
6196
  const query = select(this.db).from(groupMemberships3);
5709
6197
  const rows = conditions.length > 0 ? await query.where(and8(...conditions)).all() : await query.all();
5710
6198
  return rows.map((row) => this.rowToMembership(row));
5711
6199
  }
5712
6200
  async addMember(groupId, userId, addedBy) {
5713
- const existing = await select(this.db).from(groupMemberships3).where(and8(eq12(groupMemberships3.group_id, groupId), eq12(groupMemberships3.user_id, userId))).one();
6201
+ const existing = await select(this.db).from(groupMemberships3).where(and8(eq10(groupMemberships3.group_id, groupId), eq10(groupMemberships3.user_id, userId))).one();
5714
6202
  if (existing) return this.rowToMembership(existing);
5715
6203
  const row = {
5716
6204
  group_id: groupId,
@@ -5722,17 +6210,17 @@ var GroupRepository = class {
5722
6210
  return this.rowToMembership(row);
5723
6211
  }
5724
6212
  async removeMember(groupId, userId) {
5725
- const existing = await select(this.db).from(groupMemberships3).where(and8(eq12(groupMemberships3.group_id, groupId), eq12(groupMemberships3.user_id, userId))).one();
6213
+ const existing = await select(this.db).from(groupMemberships3).where(and8(eq10(groupMemberships3.group_id, groupId), eq10(groupMemberships3.user_id, userId))).one();
5726
6214
  if (!existing) return null;
5727
- await deleteFrom(this.db, groupMemberships3).where(and8(eq12(groupMemberships3.group_id, groupId), eq12(groupMemberships3.user_id, userId))).run();
6215
+ await deleteFrom(this.db, groupMemberships3).where(and8(eq10(groupMemberships3.group_id, groupId), eq10(groupMemberships3.user_id, userId))).run();
5728
6216
  return this.rowToMembership(existing);
5729
6217
  }
5730
6218
  async getGroupIdsForUser(userId) {
5731
- const rows = await select(this.db, { group_id: groupMemberships3.group_id }).from(groupMemberships3).where(eq12(groupMemberships3.user_id, userId)).all();
6219
+ const rows = await select(this.db, { group_id: groupMemberships3.group_id }).from(groupMemberships3).where(eq10(groupMemberships3.user_id, userId)).all();
5732
6220
  return rows.map((r) => r.group_id);
5733
6221
  }
5734
6222
  async listBranchGrants(branchId) {
5735
- const rows = await select(this.db).from(branchGroupGrants3).leftJoin(groups3, eq12(branchGroupGrants3.group_id, groups3.group_id)).where(eq12(branchGroupGrants3.branch_id, branchId)).all();
6223
+ const rows = await select(this.db).from(branchGroupGrants3).leftJoin(groups3, eq10(branchGroupGrants3.group_id, groups3.group_id)).where(eq10(branchGroupGrants3.branch_id, branchId)).all();
5736
6224
  return rows.map(
5737
6225
  (r) => this.rowToGrant(r.branch_group_grants, r.groups ? this.rowToGroup(r.groups) : void 0)
5738
6226
  );
@@ -5741,15 +6229,15 @@ var GroupRepository = class {
5741
6229
  const now = /* @__PURE__ */ new Date();
5742
6230
  const existing = await select(this.db).from(branchGroupGrants3).where(
5743
6231
  and8(
5744
- eq12(branchGroupGrants3.branch_id, data.branch_id),
5745
- eq12(branchGroupGrants3.group_id, data.group_id)
6232
+ eq10(branchGroupGrants3.branch_id, data.branch_id),
6233
+ eq10(branchGroupGrants3.group_id, data.group_id)
5746
6234
  )
5747
6235
  ).one();
5748
6236
  if (existing) {
5749
6237
  await update(this.db, branchGroupGrants3).set({ can: data.can, fs_access: data.fs_access ?? null, updated_at: now }).where(
5750
6238
  and8(
5751
- eq12(branchGroupGrants3.branch_id, data.branch_id),
5752
- eq12(branchGroupGrants3.group_id, data.group_id)
6239
+ eq10(branchGroupGrants3.branch_id, data.branch_id),
6240
+ eq10(branchGroupGrants3.group_id, data.group_id)
5753
6241
  )
5754
6242
  ).run();
5755
6243
  } else {
@@ -5772,16 +6260,16 @@ var GroupRepository = class {
5772
6260
  const existing = (await this.listBranchGrants(branchId)).find((g) => g.group_id === groupId) ?? null;
5773
6261
  if (!existing) return null;
5774
6262
  await deleteFrom(this.db, branchGroupGrants3).where(
5775
- and8(eq12(branchGroupGrants3.branch_id, branchId), eq12(branchGroupGrants3.group_id, groupId))
6263
+ and8(eq10(branchGroupGrants3.branch_id, branchId), eq10(branchGroupGrants3.group_id, groupId))
5776
6264
  ).run();
5777
6265
  return existing;
5778
6266
  }
5779
6267
  async getBranchGrantsForUser(branchId, userId) {
5780
- const rows = await select(this.db).from(branchGroupGrants3).innerJoin(groupMemberships3, eq12(branchGroupGrants3.group_id, groupMemberships3.group_id)).innerJoin(groups3, eq12(groupMemberships3.group_id, groups3.group_id)).where(
6268
+ const rows = await select(this.db).from(branchGroupGrants3).innerJoin(groupMemberships3, eq10(branchGroupGrants3.group_id, groupMemberships3.group_id)).innerJoin(groups3, eq10(groupMemberships3.group_id, groups3.group_id)).where(
5781
6269
  and8(
5782
- eq12(branchGroupGrants3.branch_id, branchId),
5783
- eq12(groupMemberships3.user_id, userId),
5784
- eq12(groups3.archived, false)
6270
+ eq10(branchGroupGrants3.branch_id, branchId),
6271
+ eq10(groupMemberships3.user_id, userId),
6272
+ eq10(groups3.archived, false)
5785
6273
  )
5786
6274
  ).all();
5787
6275
  return rows.map(
@@ -5789,7 +6277,7 @@ var GroupRepository = class {
5789
6277
  );
5790
6278
  }
5791
6279
  async listBoardGrants(boardId) {
5792
- const rows = await select(this.db).from(boardGroupGrants3).leftJoin(groups3, eq12(boardGroupGrants3.group_id, groups3.group_id)).where(eq12(boardGroupGrants3.board_id, boardId)).all();
6280
+ const rows = await select(this.db).from(boardGroupGrants3).leftJoin(groups3, eq10(boardGroupGrants3.group_id, groups3.group_id)).where(eq10(boardGroupGrants3.board_id, boardId)).all();
5793
6281
  return rows.map(
5794
6282
  (r) => this.rowToBoardGrant(r.board_group_grants, r.groups ? this.rowToGroup(r.groups) : void 0)
5795
6283
  );
@@ -5798,15 +6286,15 @@ var GroupRepository = class {
5798
6286
  const now = /* @__PURE__ */ new Date();
5799
6287
  const existing = await select(this.db).from(boardGroupGrants3).where(
5800
6288
  and8(
5801
- eq12(boardGroupGrants3.board_id, data.board_id),
5802
- eq12(boardGroupGrants3.group_id, data.group_id)
6289
+ eq10(boardGroupGrants3.board_id, data.board_id),
6290
+ eq10(boardGroupGrants3.group_id, data.group_id)
5803
6291
  )
5804
6292
  ).one();
5805
6293
  if (existing) {
5806
6294
  await update(this.db, boardGroupGrants3).set({ can: data.can, fs_access: data.fs_access ?? null, updated_at: now }).where(
5807
6295
  and8(
5808
- eq12(boardGroupGrants3.board_id, data.board_id),
5809
- eq12(boardGroupGrants3.group_id, data.group_id)
6296
+ eq10(boardGroupGrants3.board_id, data.board_id),
6297
+ eq10(boardGroupGrants3.group_id, data.group_id)
5810
6298
  )
5811
6299
  ).run();
5812
6300
  } else {
@@ -5828,15 +6316,15 @@ var GroupRepository = class {
5828
6316
  async removeBoardGrant(boardId, groupId) {
5829
6317
  const existing = (await this.listBoardGrants(boardId)).find((g) => g.group_id === groupId) ?? null;
5830
6318
  if (!existing) return null;
5831
- await deleteFrom(this.db, boardGroupGrants3).where(and8(eq12(boardGroupGrants3.board_id, boardId), eq12(boardGroupGrants3.group_id, groupId))).run();
6319
+ await deleteFrom(this.db, boardGroupGrants3).where(and8(eq10(boardGroupGrants3.board_id, boardId), eq10(boardGroupGrants3.group_id, groupId))).run();
5832
6320
  return existing;
5833
6321
  }
5834
6322
  async getBoardGrantsForUser(boardId, userId) {
5835
- const rows = await select(this.db).from(boardGroupGrants3).innerJoin(groupMemberships3, eq12(boardGroupGrants3.group_id, groupMemberships3.group_id)).innerJoin(groups3, eq12(groupMemberships3.group_id, groups3.group_id)).where(
6323
+ const rows = await select(this.db).from(boardGroupGrants3).innerJoin(groupMemberships3, eq10(boardGroupGrants3.group_id, groupMemberships3.group_id)).innerJoin(groups3, eq10(groupMemberships3.group_id, groups3.group_id)).where(
5836
6324
  and8(
5837
- eq12(boardGroupGrants3.board_id, boardId),
5838
- eq12(groupMemberships3.user_id, userId),
5839
- eq12(groups3.archived, false)
6325
+ eq10(boardGroupGrants3.board_id, boardId),
6326
+ eq10(groupMemberships3.user_id, userId),
6327
+ eq10(groups3.archived, false)
5840
6328
  )
5841
6329
  ).all();
5842
6330
  return rows.map(
@@ -5913,44 +6401,47 @@ var BranchRepository = class {
5913
6401
  rowToBranch(row, baseUrl) {
5914
6402
  const branchId = row.branch_id;
5915
6403
  const url = baseUrl && row.board_id ? getBranchUrl(branchId, baseUrl) : null;
5916
- return {
5917
- branch_id: branchId,
5918
- repo_id: row.repo_id,
5919
- created_at: new Date(row.created_at).toISOString(),
5920
- updated_at: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
5921
- created_by: row.created_by,
5922
- name: row.name,
5923
- ref: row.ref,
5924
- ref_type: row.ref_type ?? "branch",
5925
- branch_unique_id: row.branch_unique_id,
5926
- start_command: row.start_command ?? void 0,
5927
- // Static environment fields
5928
- stop_command: row.stop_command ?? void 0,
5929
- nuke_command: row.nuke_command ?? void 0,
5930
- health_check_url: row.health_check_url ?? void 0,
5931
- app_url: row.app_url ?? void 0,
5932
- logs_command: row.logs_command ?? void 0,
5933
- environment_variant: row.environment_variant ?? void 0,
5934
- board_id: row.board_id ?? void 0,
5935
- // Top-level column
5936
- needs_attention: Boolean(row.needs_attention),
5937
- // Convert SQLite integer (0/1) to boolean
5938
- archived: Boolean(row.archived),
5939
- // Convert SQLite integer (0/1) to boolean
5940
- archived_at: row.archived_at ? new Date(row.archived_at).toISOString() : void 0,
5941
- archived_by: row.archived_by ?? void 0,
5942
- filesystem_status: row.filesystem_status ?? void 0,
5943
- // RBAC fields
5944
- permission_source: row.permission_source ?? "override",
5945
- others_can: row.others_can ?? void 0,
5946
- others_fs_access: row.others_fs_access ?? void 0,
5947
- unix_group: row.unix_group ?? void 0,
5948
- // Branch storage mode
5949
- storage_mode: row.storage_mode ?? "worktree",
5950
- clone_depth: row.clone_depth ?? void 0,
5951
- ...row.data,
5952
- url
5953
- };
6404
+ return attachHiddenTenant(
6405
+ {
6406
+ branch_id: branchId,
6407
+ repo_id: row.repo_id,
6408
+ created_at: new Date(row.created_at).toISOString(),
6409
+ updated_at: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
6410
+ created_by: row.created_by,
6411
+ name: row.name,
6412
+ ref: row.ref,
6413
+ ref_type: row.ref_type ?? "branch",
6414
+ branch_unique_id: row.branch_unique_id,
6415
+ start_command: row.start_command ?? void 0,
6416
+ // Static environment fields
6417
+ stop_command: row.stop_command ?? void 0,
6418
+ nuke_command: row.nuke_command ?? void 0,
6419
+ health_check_url: row.health_check_url ?? void 0,
6420
+ app_url: row.app_url ?? void 0,
6421
+ logs_command: row.logs_command ?? void 0,
6422
+ environment_variant: row.environment_variant ?? void 0,
6423
+ board_id: row.board_id ?? void 0,
6424
+ // Top-level column
6425
+ needs_attention: Boolean(row.needs_attention),
6426
+ // Convert SQLite integer (0/1) to boolean
6427
+ archived: Boolean(row.archived),
6428
+ // Convert SQLite integer (0/1) to boolean
6429
+ archived_at: row.archived_at ? new Date(row.archived_at).toISOString() : void 0,
6430
+ archived_by: row.archived_by ?? void 0,
6431
+ filesystem_status: row.filesystem_status ?? void 0,
6432
+ // RBAC fields
6433
+ permission_source: row.permission_source ?? "override",
6434
+ others_can: row.others_can ?? void 0,
6435
+ others_fs_access: row.others_fs_access ?? void 0,
6436
+ unix_group: row.unix_group ?? void 0,
6437
+ // Branch storage mode
6438
+ storage_mode: row.storage_mode ?? "worktree",
6439
+ clone_depth: row.clone_depth ?? void 0,
6440
+ ...row.data,
6441
+ url
6442
+ },
6443
+ row
6444
+ );
5954
6445
  }
5955
6446
  /**
5956
6447
  * Convert Branch to database insert format
@@ -6060,7 +6551,7 @@ var BranchRepository = class {
6060
6551
  const rows = await select(this.db).from(branches3).where(like3(branches3.branch_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
6061
6552
  return rows.map((r) => r.branch_id);
6062
6553
  });
6063
- const row = await select(this.db).from(branches3).where(eq13(branches3.branch_id, fullId)).one();
6554
+ const row = await select(this.db).from(branches3).where(eq11(branches3.branch_id, fullId)).one();
6064
6555
  if (!row) return null;
6065
6556
  const baseUrl = await getBaseUrl();
6066
6557
  return this.rowToBranch(row, baseUrl);
@@ -6083,11 +6574,11 @@ var BranchRepository = class {
6083
6574
  others_can: branches3.others_can,
6084
6575
  board_id: branches3.board_id,
6085
6576
  permission_source: branches3.permission_source
6086
- }).from(branches3).where(eq13(branches3.branch_id, fullId)).one();
6577
+ }).from(branches3).where(eq11(branches3.branch_id, fullId)).one();
6087
6578
  if (!row) return null;
6088
6579
  let othersCan = row.others_can;
6089
6580
  if (row.permission_source === "board" && row.board_id) {
6090
- const board = await select(this.db, { data: boards3.data }).from(boards3).where(eq13(boards3.board_id, row.board_id)).one();
6581
+ const board = await select(this.db, { data: boards3.data }).from(boards3).where(eq11(boards3.board_id, row.board_id)).one();
6091
6582
  const boardData = board?.data;
6092
6583
  othersCan = (boardData?.access_mode ?? "shared") === "private" ? "none" : boardData?.default_others_can ?? row.others_can;
6093
6584
  }
@@ -6107,21 +6598,109 @@ var BranchRepository = class {
6107
6598
  * Callers that explicitly want to exclude archived branches should pass
6108
6599
  * `{ includeArchived: false }`.
6109
6600
  *
6110
- * @param filter - Optional filters (repo_id, includeArchived)
6601
+ * The `board_id`, `archived`, and `branchIds` filters let the list read path
6602
+ * (`BranchesService.find`) push its high-selectivity predicates into SQL so it
6603
+ * no longer materializes the whole table before filtering in memory.
6604
+ *
6605
+ * @param filter - Optional filters
6111
6606
  * @param filter.repo_id - Filter by repository ID
6112
6607
  * @param filter.includeArchived - Include archived branches (default: true)
6608
+ * @param filter.board_id - Filter to a single board
6609
+ * @param filter.archived - Filter to an exact archived state (takes precedence
6610
+ * over `includeArchived`)
6611
+ * @param filter.branchIds - Restrict to a set of branch IDs (empty set yields
6612
+ * no rows, matching an `{ $in: [] }` filter)
6613
+ * @param filter.visibleToUserId - Restrict to branches visible to this user
6614
+ * under branch RBAC, pushed down as a SQL predicate instead of a preloaded
6615
+ * `branch_id IN (...)` list.
6113
6616
  */
6114
6617
  async findAll(filter) {
6618
+ if (filter?.branchIds !== void 0 && filter.branchIds.length === 0) {
6619
+ return [];
6620
+ }
6115
6621
  const includeArchived = filter?.includeArchived ?? true;
6116
6622
  const conditions = [];
6117
6623
  if (filter?.repo_id) {
6118
- conditions.push(eq13(branches3.repo_id, filter.repo_id));
6624
+ conditions.push(eq11(branches3.repo_id, filter.repo_id));
6119
6625
  }
6120
- if (!includeArchived) {
6121
- conditions.push(eq13(branches3.archived, false));
6626
+ if (filter?.board_id) {
6627
+ conditions.push(eq11(branches3.board_id, filter.board_id));
6122
6628
  }
6123
- const query = select(this.db).from(branches3);
6124
- const rows = conditions.length > 0 ? await query.where(and9(...conditions)).all() : await query.all();
6629
+ if (filter?.archived !== void 0) {
6630
+ conditions.push(eq11(branches3.archived, filter.archived));
6631
+ } else if (!includeArchived) {
6632
+ conditions.push(eq11(branches3.archived, false));
6633
+ }
6634
+ if (filter?.branchIds !== void 0) {
6635
+ conditions.push(inArray3(branches3.branch_id, filter.branchIds));
6636
+ }
6637
+ if (filter?.visibleToUserId) {
6638
+ conditions.push(visibleBranchAccessCondition(this.db, filter.visibleToUserId));
6639
+ }
6640
+ const baseQuery = filter?.visibleToUserId ? select(this.db, getTableColumns2(branches3)).from(branches3).leftJoin(
6641
+ branchOwners3,
6642
+ and9(
6643
+ eq11(branchOwners3.branch_id, branches3.branch_id),
6644
+ eq11(branchOwners3.user_id, filter.visibleToUserId)
6645
+ )
6646
+ ) : select(this.db).from(branches3);
6647
+ const rows = conditions.length > 0 ? await baseQuery.where(and9(...conditions)).all() : await baseQuery.all();
6648
+ const baseUrl = await getBaseUrl();
6649
+ return rows.map((row) => this.rowToBranch(row, baseUrl));
6650
+ }
6651
+ /**
6652
+ * Health-monitor discovery query. Returns only routing metadata so the
6653
+ * background monitor can enter the correct tenant DB scope before loading
6654
+ * branch contents or patching health state.
6655
+ */
6656
+ async findActiveEnvironmentRefs() {
6657
+ const tenantColumn = branches3.tenant_id;
6658
+ const columns = isPostgresDatabase(this.db) && tenantColumn ? { branch_id: branches3.branch_id, tenant_id: tenantColumn } : { branch_id: branches3.branch_id };
6659
+ const statusExpr = sql7`${jsonExtract(this.db, branches3.data, "environment_instance.status")}`;
6660
+ const rows = await select(this.db, columns).from(branches3).where(or5(eq11(statusExpr, "running"), eq11(statusExpr, "starting"))).all();
6661
+ return rows.map((row) => ({
6662
+ branch_id: row.branch_id,
6663
+ ...typeof row.tenant_id === "string" && row.tenant_id.length > 0 ? { tenant_id: row.tenant_id } : {}
6664
+ }));
6665
+ }
6666
+ /**
6667
+ * Find active assistant branches without paginating the whole branch list first.
6668
+ *
6669
+ * A branch is discoverable as an assistant when it has the canonical assistant
6670
+ * marker in custom_context (new or legacy key), or as a read-time backfill for
6671
+ * older hand-bootstrapped assistants, when it has at least one enabled
6672
+ * first-class schedule.
6673
+ */
6674
+ async findAssistantBranches(filter) {
6675
+ const assistantKindConditions = [
6676
+ eq11(sql7`${jsonExtract(this.db, branches3.data, "custom_context.assistant.kind")}`, "assistant"),
6677
+ eq11(
6678
+ sql7`${jsonExtract(this.db, branches3.data, "custom_context.assistant.kind")}`,
6679
+ "persisted-agent"
6680
+ ),
6681
+ eq11(sql7`${jsonExtract(this.db, branches3.data, "custom_context.agent.kind")}`, "assistant"),
6682
+ eq11(
6683
+ sql7`${jsonExtract(this.db, branches3.data, "custom_context.agent.kind")}`,
6684
+ "persisted-agent"
6685
+ )
6686
+ ];
6687
+ const hasEnabledSchedule = exists2(
6688
+ // biome-ignore lint/suspicious/noExplicitAny: Drizzle select has complex cross-dialect overloads
6689
+ this.db.select({ _: sql7`1` }).from(schedules3).where(and9(eq11(schedules3.branch_id, branches3.branch_id), eq11(schedules3.enabled, true)))
6690
+ );
6691
+ const conditions = [or5(...assistantKindConditions, hasEnabledSchedule) ?? sql7`false`];
6692
+ if (filter?.repo_id) conditions.push(eq11(branches3.repo_id, filter.repo_id));
6693
+ if (filter?.archived !== void 0) conditions.push(eq11(branches3.archived, filter.archived));
6694
+ if (filter?.userId) conditions.push(visibleBranchAccessCondition(this.db, filter.userId));
6695
+ const baseQuery = select(this.db, getTableColumns2(branches3)).from(branches3);
6696
+ const query = filter?.userId ? baseQuery.leftJoin(
6697
+ branchOwners3,
6698
+ and9(
6699
+ eq11(branchOwners3.branch_id, branches3.branch_id),
6700
+ eq11(branchOwners3.user_id, filter.userId)
6701
+ )
6702
+ ) : baseQuery;
6703
+ const rows = await query.where(and9(...conditions)).limit(filter?.limit ?? 200).all();
6125
6704
  const baseUrl = await getBaseUrl();
6126
6705
  return rows.map((row) => this.rowToBranch(row, baseUrl));
6127
6706
  }
@@ -6142,9 +6721,9 @@ var BranchRepository = class {
6142
6721
  txAsDb(tx),
6143
6722
  this.db,
6144
6723
  branches3,
6145
- eq13(branches3.branch_id, existing.branch_id)
6724
+ eq11(branches3.branch_id, existing.branch_id)
6146
6725
  );
6147
- const currentRow = await select(txAsDb(tx)).from(branches3).where(eq13(branches3.branch_id, existing.branch_id)).one();
6726
+ const currentRow = await select(txAsDb(tx)).from(branches3).where(eq11(branches3.branch_id, existing.branch_id)).one();
6148
6727
  if (!currentRow) {
6149
6728
  throw new EntityNotFoundError("Branch", id);
6150
6729
  }
@@ -6161,7 +6740,7 @@ var BranchRepository = class {
6161
6740
  // Always update timestamp
6162
6741
  });
6163
6742
  const insertData = this.branchToInsert(merged);
6164
- const row = await update(txAsDb(tx), branches3).set(insertData).where(eq13(branches3.branch_id, current.branch_id)).returning().one();
6743
+ const row = await update(txAsDb(tx), branches3).set(insertData).where(eq11(branches3.branch_id, current.branch_id)).returning().one();
6165
6744
  return this.rowToBranch(row, baseUrl);
6166
6745
  });
6167
6746
  }
@@ -6173,13 +6752,13 @@ var BranchRepository = class {
6173
6752
  if (!existing) {
6174
6753
  throw new EntityNotFoundError("Branch", id);
6175
6754
  }
6176
- await deleteFrom(this.db, branches3).where(eq13(branches3.branch_id, existing.branch_id)).run();
6755
+ await deleteFrom(this.db, branches3).where(eq11(branches3.branch_id, existing.branch_id)).run();
6177
6756
  }
6178
6757
  /**
6179
6758
  * Find branch by repo_id and name
6180
6759
  */
6181
6760
  async findByRepoAndName(repoId, name) {
6182
- const row = await select(this.db).from(branches3).where(and9(eq13(branches3.repo_id, repoId), eq13(branches3.name, name))).one();
6761
+ const row = await select(this.db).from(branches3).where(and9(eq11(branches3.repo_id, repoId), eq11(branches3.name, name))).one();
6183
6762
  if (!row) return null;
6184
6763
  const baseUrl = await getBaseUrl();
6185
6764
  return this.rowToBranch(row, baseUrl);
@@ -6189,7 +6768,7 @@ var BranchRepository = class {
6189
6768
  */
6190
6769
  async findActiveByRepoAndName(repoId, name) {
6191
6770
  const row = await select(this.db).from(branches3).where(
6192
- and9(eq13(branches3.repo_id, repoId), eq13(branches3.name, name), eq13(branches3.archived, false))
6771
+ and9(eq11(branches3.repo_id, repoId), eq11(branches3.name, name), eq11(branches3.archived, false))
6193
6772
  ).one();
6194
6773
  if (!row) return null;
6195
6774
  const baseUrl = await getBaseUrl();
@@ -6208,7 +6787,7 @@ var BranchRepository = class {
6208
6787
  * Used for auto-suffix name conflict resolution — bypasses Feathers pagination.
6209
6788
  */
6210
6789
  async getActiveNamesByRepo(repoId) {
6211
- const rows = await select(this.db, { name: branches3.name }).from(branches3).where(and9(eq13(branches3.repo_id, repoId), eq13(branches3.archived, false))).all();
6790
+ const rows = await select(this.db, { name: branches3.name }).from(branches3).where(and9(eq11(branches3.repo_id, repoId), eq11(branches3.archived, false))).all();
6212
6791
  return rows.map((row) => row.name);
6213
6792
  }
6214
6793
  // ===== RBAC: Ownership Management =====
@@ -6220,7 +6799,7 @@ var BranchRepository = class {
6220
6799
  * @returns true if user is an owner
6221
6800
  */
6222
6801
  async isOwner(branchId, userId) {
6223
- const row = await select(this.db).from(branchOwners3).where(and9(eq13(branchOwners3.branch_id, branchId), eq13(branchOwners3.user_id, userId))).one();
6802
+ const row = await select(this.db).from(branchOwners3).where(and9(eq11(branchOwners3.branch_id, branchId), eq11(branchOwners3.user_id, userId))).one();
6224
6803
  return row != null;
6225
6804
  }
6226
6805
  /**
@@ -6233,15 +6812,15 @@ var BranchRepository = class {
6233
6812
  const rows = await select(this.db).from(branchGroupGrants3).innerJoin(
6234
6813
  groupMemberships3,
6235
6814
  and9(
6236
- eq13(groupMemberships3.group_id, branchGroupGrants3.group_id),
6237
- eq13(groupMemberships3.user_id, userId)
6815
+ eq11(groupMemberships3.group_id, branchGroupGrants3.group_id),
6816
+ eq11(groupMemberships3.user_id, userId)
6238
6817
  )
6239
6818
  ).innerJoin(
6240
6819
  groups3,
6241
- and9(eq13(groups3.group_id, branchGroupGrants3.group_id), eq13(groups3.archived, false))
6820
+ and9(eq11(groups3.group_id, branchGroupGrants3.group_id), eq11(groups3.archived, false))
6242
6821
  ).where(
6243
6822
  and9(
6244
- eq13(branchGroupGrants3.branch_id, branchId),
6823
+ eq11(branchGroupGrants3.branch_id, branchId),
6245
6824
  inArray3(branchGroupGrants3.can, BRANCH_PERMISSION_LEVELS)
6246
6825
  )
6247
6826
  ).all();
@@ -6272,7 +6851,7 @@ var BranchRepository = class {
6272
6851
  * this method.
6273
6852
  */
6274
6853
  async resolveUserAccess(branch, userId) {
6275
- const board = branch.permission_source === "board" && branch.board_id ? await select(this.db, { data: boards3.data, board_id: boards3.board_id }).from(boards3).where(eq13(boards3.board_id, branch.board_id)).one() : null;
6854
+ const board = branch.permission_source === "board" && branch.board_id ? await select(this.db, { data: boards3.data, board_id: boards3.board_id }).from(boards3).where(eq11(boards3.board_id, branch.board_id)).one() : null;
6276
6855
  const boardData = board?.data;
6277
6856
  const boardIsShared = (boardData?.access_mode ?? "shared") === "shared";
6278
6857
  const sharing = branch.permission_source === "board" && boardIsShared ? boardData?.default_dangerously_allow_session_sharing ?? false : branch.dangerously_allow_session_sharing ?? false;
@@ -6288,7 +6867,7 @@ var BranchRepository = class {
6288
6867
  const groupRepo = new GroupRepository(this.db);
6289
6868
  const branchGroupGrants4 = await groupRepo.getBranchGrantsForUser(branch.branch_id, userId);
6290
6869
  if (branch.permission_source === "board" && branch.board_id) {
6291
- const boardOwner = await select(this.db).from(boardOwners3).where(and9(eq13(boardOwners3.board_id, branch.board_id), eq13(boardOwners3.user_id, userId))).one();
6870
+ const boardOwner = await select(this.db).from(boardOwners3).where(and9(eq11(boardOwners3.board_id, branch.board_id), eq11(boardOwners3.user_id, userId))).one();
6292
6871
  if (boardOwner) {
6293
6872
  return {
6294
6873
  can: "all",
@@ -6345,33 +6924,33 @@ var BranchRepository = class {
6345
6924
  const branchRow = await select(this.db, {
6346
6925
  board_id: branches3.board_id,
6347
6926
  permission_source: branches3.permission_source
6348
- }).from(branches3).where(eq13(branches3.branch_id, branchId)).one();
6349
- const ownerRows = await select(this.db, { user_id: branchOwners3.user_id }).from(branchOwners3).where(eq13(branchOwners3.branch_id, branchId)).all();
6350
- const groupRows = await select(this.db, { user_id: groupMemberships3.user_id }).from(branchGroupGrants3).innerJoin(groupMemberships3, eq13(groupMemberships3.group_id, branchGroupGrants3.group_id)).innerJoin(
6927
+ }).from(branches3).where(eq11(branches3.branch_id, branchId)).one();
6928
+ const ownerRows = await select(this.db, { user_id: branchOwners3.user_id }).from(branchOwners3).where(eq11(branchOwners3.branch_id, branchId)).all();
6929
+ const groupRows = await select(this.db, { user_id: groupMemberships3.user_id }).from(branchGroupGrants3).innerJoin(groupMemberships3, eq11(groupMemberships3.group_id, branchGroupGrants3.group_id)).innerJoin(
6351
6930
  groups3,
6352
- and9(eq13(groups3.group_id, branchGroupGrants3.group_id), eq13(groups3.archived, false))
6931
+ and9(eq11(groups3.group_id, branchGroupGrants3.group_id), eq11(groups3.archived, false))
6353
6932
  ).where(
6354
6933
  and9(
6355
- eq13(branchGroupGrants3.branch_id, branchId),
6934
+ eq11(branchGroupGrants3.branch_id, branchId),
6356
6935
  inArray3(branchGroupGrants3.can, VIEW_OR_BETTER_BRANCH_PERMISSIONS)
6357
6936
  )
6358
6937
  ).all();
6359
- const boardOwnerRows = branchRow?.permission_source === "board" && branchRow.board_id ? await select(this.db, { user_id: boardOwners3.user_id }).from(boardOwners3).where(eq13(boardOwners3.board_id, branchRow.board_id)).all() : [];
6360
- const boardGroupRows = branchRow?.permission_source === "board" && branchRow.board_id ? await select(this.db, { user_id: groupMemberships3.user_id }).from(boardGroupGrants3).innerJoin(groupMemberships3, eq13(groupMemberships3.group_id, boardGroupGrants3.group_id)).innerJoin(
6938
+ const boardOwnerRows = branchRow?.permission_source === "board" && branchRow.board_id ? await select(this.db, { user_id: boardOwners3.user_id }).from(boardOwners3).where(eq11(boardOwners3.board_id, branchRow.board_id)).all() : [];
6939
+ const boardGroupRows = branchRow?.permission_source === "board" && branchRow.board_id ? await select(this.db, { user_id: groupMemberships3.user_id }).from(boardGroupGrants3).innerJoin(groupMemberships3, eq11(groupMemberships3.group_id, boardGroupGrants3.group_id)).innerJoin(
6361
6940
  groups3,
6362
- and9(eq13(groups3.group_id, boardGroupGrants3.group_id), eq13(groups3.archived, false))
6941
+ and9(eq11(groups3.group_id, boardGroupGrants3.group_id), eq11(groups3.archived, false))
6363
6942
  ).innerJoin(
6364
6943
  boards3,
6365
6944
  and9(
6366
- eq13(boards3.board_id, boardGroupGrants3.board_id),
6367
- eq13(
6945
+ eq11(boards3.board_id, boardGroupGrants3.board_id),
6946
+ eq11(
6368
6947
  sql7`coalesce(${jsonExtract(this.db, boards3.data, "access_mode")}, 'shared')`,
6369
6948
  "shared"
6370
6949
  )
6371
6950
  )
6372
6951
  ).where(
6373
6952
  and9(
6374
- eq13(boardGroupGrants3.board_id, branchRow.board_id),
6953
+ eq11(boardGroupGrants3.board_id, branchRow.board_id),
6375
6954
  inArray3(boardGroupGrants3.can, VIEW_OR_BETTER_BRANCH_PERMISSIONS)
6376
6955
  )
6377
6956
  ).all() : [];
@@ -6404,14 +6983,14 @@ var BranchRepository = class {
6404
6983
  const branchRow = await select(this.db, {
6405
6984
  board_id: branches3.board_id,
6406
6985
  permission_source: branches3.permission_source
6407
- }).from(branches3).where(eq13(branches3.branch_id, branchId)).one();
6408
- const ownerRows = await select(this.db, { user_id: branchOwners3.user_id }).from(branchOwners3).where(eq13(branchOwners3.branch_id, branchId)).all();
6409
- const groupRows = await select(this.db, { user_id: groupMemberships3.user_id }).from(branchGroupGrants3).innerJoin(groupMemberships3, eq13(groupMemberships3.group_id, branchGroupGrants3.group_id)).innerJoin(
6986
+ }).from(branches3).where(eq11(branches3.branch_id, branchId)).one();
6987
+ const ownerRows = await select(this.db, { user_id: branchOwners3.user_id }).from(branchOwners3).where(eq11(branchOwners3.branch_id, branchId)).all();
6988
+ const groupRows = await select(this.db, { user_id: groupMemberships3.user_id }).from(branchGroupGrants3).innerJoin(groupMemberships3, eq11(groupMemberships3.group_id, branchGroupGrants3.group_id)).innerJoin(
6410
6989
  groups3,
6411
- and9(eq13(groups3.group_id, branchGroupGrants3.group_id), eq13(groups3.archived, false))
6990
+ and9(eq11(groups3.group_id, branchGroupGrants3.group_id), eq11(groups3.archived, false))
6412
6991
  ).where(
6413
6992
  and9(
6414
- eq13(branchGroupGrants3.branch_id, branchId),
6993
+ eq11(branchGroupGrants3.branch_id, branchId),
6415
6994
  inArray3(
6416
6995
  sql7`coalesce(${branchGroupGrants3.fs_access}, 'read')`,
6417
6996
  FS_ACCESS_BRANCH_PERMISSIONS
@@ -6419,22 +6998,22 @@ var BranchRepository = class {
6419
6998
  )
6420
6999
  ).all();
6421
7000
  const isBoardAligned = branchRow?.permission_source === "board" && branchRow.board_id;
6422
- const boardOwnerRows = isBoardAligned ? await select(this.db, { user_id: boardOwners3.user_id }).from(boardOwners3).where(eq13(boardOwners3.board_id, branchRow.board_id)).all() : [];
6423
- const boardGroupRows = isBoardAligned ? await select(this.db, { user_id: groupMemberships3.user_id }).from(boardGroupGrants3).innerJoin(groupMemberships3, eq13(groupMemberships3.group_id, boardGroupGrants3.group_id)).innerJoin(
7001
+ const boardOwnerRows = isBoardAligned ? await select(this.db, { user_id: boardOwners3.user_id }).from(boardOwners3).where(eq11(boardOwners3.board_id, branchRow.board_id)).all() : [];
7002
+ const boardGroupRows = isBoardAligned ? await select(this.db, { user_id: groupMemberships3.user_id }).from(boardGroupGrants3).innerJoin(groupMemberships3, eq11(groupMemberships3.group_id, boardGroupGrants3.group_id)).innerJoin(
6424
7003
  groups3,
6425
- and9(eq13(groups3.group_id, boardGroupGrants3.group_id), eq13(groups3.archived, false))
7004
+ and9(eq11(groups3.group_id, boardGroupGrants3.group_id), eq11(groups3.archived, false))
6426
7005
  ).innerJoin(
6427
7006
  boards3,
6428
7007
  and9(
6429
- eq13(boards3.board_id, boardGroupGrants3.board_id),
6430
- eq13(
7008
+ eq11(boards3.board_id, boardGroupGrants3.board_id),
7009
+ eq11(
6431
7010
  sql7`coalesce(${jsonExtract(this.db, boards3.data, "access_mode")}, 'shared')`,
6432
7011
  "shared"
6433
7012
  )
6434
7013
  )
6435
7014
  ).where(
6436
7015
  and9(
6437
- eq13(boardGroupGrants3.board_id, branchRow.board_id),
7016
+ eq11(boardGroupGrants3.board_id, branchRow.board_id),
6438
7017
  inArray3(
6439
7018
  sql7`coalesce(${boardGroupGrants3.fs_access}, 'read')`,
6440
7019
  FS_ACCESS_BRANCH_PERMISSIONS
@@ -6456,12 +7035,69 @@ var BranchRepository = class {
6456
7035
  }
6457
7036
  return Array.from(userIds);
6458
7037
  }
7038
+ /**
7039
+ * Find non-archived branches whose explicit filesystem access set can change
7040
+ * when membership in the given group changes.
7041
+ *
7042
+ * Keep this inverse lookup in lockstep with findExplicitFsAccessUserIds():
7043
+ * both encode which group grants materialize into branch-folder access.
7044
+ * App-only grants (`fs_access = 'none'`) are intentionally excluded because
7045
+ * membership changes for those grants do not require branch-folder mutation.
7046
+ */
7047
+ async findExplicitFsAccessBranchIdsForGroup(groupId) {
7048
+ const directRows = await select(this.db, { branch_id: branchGroupGrants3.branch_id }).from(branchGroupGrants3).innerJoin(branches3, eq11(branches3.branch_id, branchGroupGrants3.branch_id)).innerJoin(
7049
+ groups3,
7050
+ and9(eq11(groups3.group_id, branchGroupGrants3.group_id), eq11(groups3.archived, false))
7051
+ ).where(
7052
+ and9(
7053
+ eq11(branchGroupGrants3.group_id, groupId),
7054
+ eq11(branches3.archived, false),
7055
+ inArray3(
7056
+ sql7`coalesce(${branchGroupGrants3.fs_access}, 'read')`,
7057
+ FS_ACCESS_BRANCH_PERMISSIONS
7058
+ )
7059
+ )
7060
+ ).all();
7061
+ const boardRows = await select(this.db, { branch_id: branches3.branch_id }).from(boardGroupGrants3).innerJoin(
7062
+ groups3,
7063
+ and9(eq11(groups3.group_id, boardGroupGrants3.group_id), eq11(groups3.archived, false))
7064
+ ).innerJoin(
7065
+ boards3,
7066
+ and9(
7067
+ eq11(boards3.board_id, boardGroupGrants3.board_id),
7068
+ eq11(sql7`coalesce(${jsonExtract(this.db, boards3.data, "access_mode")}, 'shared')`, "shared")
7069
+ )
7070
+ ).innerJoin(
7071
+ branches3,
7072
+ and9(
7073
+ eq11(branches3.board_id, boardGroupGrants3.board_id),
7074
+ eq11(branches3.permission_source, "board"),
7075
+ eq11(branches3.archived, false)
7076
+ )
7077
+ ).where(
7078
+ and9(
7079
+ eq11(boardGroupGrants3.group_id, groupId),
7080
+ inArray3(
7081
+ sql7`coalesce(${boardGroupGrants3.fs_access}, 'read')`,
7082
+ FS_ACCESS_BRANCH_PERMISSIONS
7083
+ )
7084
+ )
7085
+ ).all();
7086
+ const branchIds = /* @__PURE__ */ new Set();
7087
+ for (const row of directRows) {
7088
+ branchIds.add(row.branch_id);
7089
+ }
7090
+ for (const row of boardRows) {
7091
+ branchIds.add(row.branch_id);
7092
+ }
7093
+ return Array.from(branchIds);
7094
+ }
6459
7095
  async findBoardAlignedBranches(boardId) {
6460
7096
  const rows = await select(this.db).from(branches3).where(
6461
7097
  and9(
6462
- eq13(branches3.board_id, boardId),
6463
- eq13(branches3.permission_source, "board"),
6464
- eq13(branches3.archived, false)
7098
+ eq11(branches3.board_id, boardId),
7099
+ eq11(branches3.permission_source, "board"),
7100
+ eq11(branches3.archived, false)
6465
7101
  )
6466
7102
  ).all();
6467
7103
  const baseUrl = await getBaseUrl();
@@ -6478,7 +7114,7 @@ var BranchRepository = class {
6478
7114
  if (!branch) {
6479
7115
  throw new EntityNotFoundError("Branch", branchId);
6480
7116
  }
6481
- const rows = await select(this.db).from(branchOwners3).where(eq13(branchOwners3.branch_id, branch.branch_id)).all();
7117
+ const rows = await select(this.db).from(branchOwners3).where(eq11(branchOwners3.branch_id, branch.branch_id)).all();
6482
7118
  return rows.map((row) => row.user_id);
6483
7119
  }
6484
7120
  /**
@@ -6518,7 +7154,7 @@ var BranchRepository = class {
6518
7154
  if (!branch) {
6519
7155
  throw new EntityNotFoundError("Branch", branchId);
6520
7156
  }
6521
- await deleteFrom(this.db, branchOwners3).where(and9(eq13(branchOwners3.branch_id, branch.branch_id), eq13(branchOwners3.user_id, userId))).run();
7157
+ await deleteFrom(this.db, branchOwners3).where(and9(eq11(branchOwners3.branch_id, branch.branch_id), eq11(branchOwners3.user_id, userId))).run();
6522
7158
  }
6523
7159
  /**
6524
7160
  * Bulk-load ownership for multiple branches
@@ -6564,13 +7200,13 @@ var BranchRepository = class {
6564
7200
  async findAccessibleBranches(userId, filter) {
6565
7201
  const conditions = [visibleBranchAccessCondition(this.db, userId)];
6566
7202
  if (filter?.archived === true) {
6567
- conditions.push(eq13(branches3.archived, true));
7203
+ conditions.push(eq11(branches3.archived, true));
6568
7204
  } else if (filter?.archived === false) {
6569
- conditions.push(eq13(branches3.archived, false));
7205
+ conditions.push(eq11(branches3.archived, false));
6570
7206
  }
6571
7207
  const rows = await select(this.db, getTableColumns2(branches3)).from(branches3).leftJoin(
6572
7208
  branchOwners3,
6573
- and9(eq13(branchOwners3.branch_id, branches3.branch_id), eq13(branchOwners3.user_id, userId))
7209
+ and9(eq11(branchOwners3.branch_id, branches3.branch_id), eq11(branchOwners3.user_id, userId))
6574
7210
  ).where(and9(...conditions)).all();
6575
7211
  const baseUrl = await getBaseUrl();
6576
7212
  const seen = /* @__PURE__ */ new Set();
@@ -6646,7 +7282,7 @@ var BranchRepository = class {
6646
7282
  zone_id: jsonExtract2(this.db, boardObjectsTable.data, "zone_id"),
6647
7283
  position: jsonExtract2(this.db, boardObjectsTable.data, "position"),
6648
7284
  board_data: boardsTable.data
6649
- }).from(boardObjectsTable).leftJoin(boardsTable, eq13(boardObjectsTable.board_id, boardsTable.board_id)).where(inArray3(boardObjectsTable.branch_id, branchIds)).all();
7285
+ }).from(boardObjectsTable).leftJoin(boardsTable, eq11(boardObjectsTable.board_id, boardsTable.board_id)).where(inArray3(boardObjectsTable.branch_id, branchIds)).all();
6650
7286
  const boardObjectInfoByBranch = /* @__PURE__ */ new Map();
6651
7287
  for (const row of rows) {
6652
7288
  const info = {
@@ -6734,7 +7370,7 @@ var BranchRepository = class {
6734
7370
  for (const sessionId of sessionIds) {
6735
7371
  const query = select(this.db, {
6736
7372
  data: messagesTable.data
6737
- }).from(messagesTable).where(and9(eq13(messagesTable.session_id, sessionId), eq13(messagesTable.role, "assistant")));
7373
+ }).from(messagesTable).where(and9(eq11(messagesTable.session_id, sessionId), eq11(messagesTable.role, "assistant")));
6738
7374
  const lastMessage = await query.orderBy(desc(messagesTable.index)).limit(1).one();
6739
7375
  if (lastMessage) {
6740
7376
  const messageData = lastMessage.data;
@@ -6806,41 +7442,59 @@ init_esm_shims();
6806
7442
  init_ids();
6807
7443
  init_database_wrapper();
6808
7444
  init_schema();
6809
- import { eq as eq15, like as like5 } from "drizzle-orm";
7445
+ import { eq as eq13, like as like5 } from "drizzle-orm";
6810
7446
 
6811
7447
  // src/db/repositories/cards.ts
6812
7448
  init_esm_shims();
6813
7449
  init_ids();
6814
7450
  init_database_wrapper();
6815
7451
  init_schema();
6816
- import { and as and11, eq as eq16, like as like6 } from "drizzle-orm";
7452
+ import { and as and11, eq as eq14, like as like6 } from "drizzle-orm";
6817
7453
 
6818
7454
  // src/db/repositories/gateway-channels.ts
6819
7455
  init_esm_shims();
6820
7456
  init_types2();
6821
7457
  init_ids();
6822
7458
  init_database_wrapper();
6823
- import { eq as eq17, like as like7 } from "drizzle-orm";
7459
+ import { eq as eq15, like as like7 } from "drizzle-orm";
6824
7460
  init_schema();
6825
7461
 
7462
+ // src/db/repositories/gateway-outbound-messages.ts
7463
+ init_esm_shims();
7464
+ init_types2();
7465
+ init_ids();
7466
+ init_database_wrapper();
7467
+ init_schema();
7468
+ import { and as and12, eq as eq16, isNull as isNull5, like as like8 } from "drizzle-orm";
7469
+
6826
7470
  // src/db/repositories/knowledge.ts
6827
7471
  init_esm_shims();
6828
7472
  init_types2();
6829
7473
  init_config_manager();
6830
7474
  init_ids();
6831
7475
  import { createHash } from "crypto";
6832
- import { and as and12, desc as desc2, eq as eq18, inArray as inArray4, like as like8, or as or5, sql as sql9 } from "drizzle-orm";
7476
+ import { and as and13, desc as desc2, eq as eq17, inArray as inArray5, like as like9, or as or6, sql as sql8 } from "drizzle-orm";
6833
7477
  init_database_wrapper();
6834
7478
  init_schema();
6835
7479
 
6836
7480
  // src/db/repositories/mcp-servers.ts
6837
7481
  init_esm_shims();
6838
7482
  init_ids();
6839
- import { and as and13, eq as eq19, like as like9 } from "drizzle-orm";
7483
+ import { and as and14, eq as eq18, like as like10 } from "drizzle-orm";
6840
7484
 
6841
7485
  // src/tools/mcp/auth-secrets.ts
6842
7486
  init_esm_shims();
6843
7487
 
7488
+ // src/mcp/template-resolver.ts
7489
+ init_esm_shims();
7490
+
7491
+ // src/templates/handlebars-helpers.ts
7492
+ init_esm_shims();
7493
+ import Handlebars from "handlebars";
7494
+
7495
+ // src/mcp/template-patterns.ts
7496
+ init_esm_shims();
7497
+
6844
7498
  // src/tools/mcp/http-headers.ts
6845
7499
  init_esm_shims();
6846
7500
 
@@ -6852,11 +7506,11 @@ init_schema();
6852
7506
  init_esm_shims();
6853
7507
  init_database_wrapper();
6854
7508
  init_schema();
6855
- import { and as and14, eq as eq20 } from "drizzle-orm";
7509
+ import { and as and15, eq as eq19, inArray as inArray6 } from "drizzle-orm";
6856
7510
 
6857
7511
  // src/db/repositories/repos.ts
6858
7512
  init_esm_shims();
6859
- import { eq as eq21, like as like10, sql as sql10 } from "drizzle-orm";
7513
+ import { eq as eq20, like as like11, sql as sql9 } from "drizzle-orm";
6860
7514
  init_ids();
6861
7515
  init_database_wrapper();
6862
7516
  init_schema();
@@ -6892,20 +7546,23 @@ var RepoRepository = class {
6892
7546
  const environment = data.environment ?? wrapV1AsV2(data.environment_config);
6893
7547
  const environment_config = data.environment_config ?? deriveV1FromV2(environment);
6894
7548
  const remote_url = typeof data.remote_url === "string" ? stripHttpUrlUserinfo(data.remote_url) : data.remote_url;
6895
- return {
6896
- repo_id: row.repo_id,
6897
- slug: row.slug,
6898
- repo_type: row.repo_type ?? "remote",
6899
- unix_group: row.unix_group ?? void 0,
6900
- created_at: new Date(row.created_at).toISOString(),
6901
- last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
6902
- ...data,
6903
- remote_url,
6904
- environment,
6905
- environment_config,
6906
- clone_status: data.clone_status,
6907
- clone_error: data.clone_error
6908
- };
7549
+ return attachHiddenTenant(
7550
+ {
7551
+ repo_id: row.repo_id,
7552
+ slug: row.slug,
7553
+ repo_type: row.repo_type ?? "remote",
7554
+ unix_group: row.unix_group ?? void 0,
7555
+ created_at: new Date(row.created_at).toISOString(),
7556
+ last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
7557
+ ...data,
7558
+ remote_url,
7559
+ environment,
7560
+ environment_config,
7561
+ clone_status: data.clone_status,
7562
+ clone_error: data.clone_error
7563
+ },
7564
+ row
7565
+ );
6909
7566
  }
6910
7567
  /**
6911
7568
  * Convert Repo to database insert format
@@ -6955,7 +7612,7 @@ var RepoRepository = class {
6955
7612
  */
6956
7613
  async resolveId(id) {
6957
7614
  return resolveByShortIdPrefix(id, "Repo", async (pattern) => {
6958
- const rows = await select(this.db).from(repos3).where(like10(repos3.repo_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
7615
+ const rows = await select(this.db).from(repos3).where(like11(repos3.repo_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
6959
7616
  return rows.map((r) => r.repo_id);
6960
7617
  });
6961
7618
  }
@@ -6966,7 +7623,7 @@ var RepoRepository = class {
6966
7623
  try {
6967
7624
  const insertData = this.repoToInsert(data);
6968
7625
  await insert(this.db, repos3).values(insertData).run();
6969
- const row = await select(this.db).from(repos3).where(eq21(repos3.repo_id, insertData.repo_id)).one();
7626
+ const row = await select(this.db).from(repos3).where(eq20(repos3.repo_id, insertData.repo_id)).one();
6970
7627
  if (!row) {
6971
7628
  throw new RepositoryError("Failed to retrieve created repo");
6972
7629
  }
@@ -6985,7 +7642,7 @@ var RepoRepository = class {
6985
7642
  async findById(id) {
6986
7643
  try {
6987
7644
  const fullId = await this.resolveId(id);
6988
- const row = await select(this.db).from(repos3).where(eq21(repos3.repo_id, fullId)).one();
7645
+ const row = await select(this.db).from(repos3).where(eq20(repos3.repo_id, fullId)).one();
6989
7646
  return row ? this.rowToRepo(row) : null;
6990
7647
  } catch (error) {
6991
7648
  if (error instanceof EntityNotFoundError) return null;
@@ -7001,7 +7658,7 @@ var RepoRepository = class {
7001
7658
  */
7002
7659
  async findBySlug(slug) {
7003
7660
  try {
7004
- const row = await select(this.db).from(repos3).where(eq21(repos3.slug, slug)).one();
7661
+ const row = await select(this.db).from(repos3).where(eq20(repos3.slug, slug)).one();
7005
7662
  return row ? this.rowToRepo(row) : null;
7006
7663
  } catch (error) {
7007
7664
  throw new RepositoryError(
@@ -7069,8 +7726,8 @@ var RepoRepository = class {
7069
7726
  let changed = 0;
7070
7727
  for (const finding of scan.findings) {
7071
7728
  await this.db.transaction(async (tx) => {
7072
- await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq21(repos3.repo_id, finding.repo_id));
7073
- const currentRow = await select(txAsDb(tx)).from(repos3).where(eq21(repos3.repo_id, finding.repo_id)).one();
7729
+ await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq20(repos3.repo_id, finding.repo_id));
7730
+ const currentRow = await select(txAsDb(tx)).from(repos3).where(eq20(repos3.repo_id, finding.repo_id)).one();
7074
7731
  if (!currentRow) return;
7075
7732
  const data = currentRow.data;
7076
7733
  if (typeof data.remote_url !== "string" || !httpUrlHasUserinfo(data.remote_url)) {
@@ -7082,7 +7739,7 @@ var RepoRepository = class {
7082
7739
  ...data,
7083
7740
  remote_url: stripHttpUrlUserinfo(data.remote_url)
7084
7741
  }
7085
- }).where(eq21(repos3.repo_id, finding.repo_id)).run();
7742
+ }).where(eq20(repos3.repo_id, finding.repo_id)).run();
7086
7743
  changed += 1;
7087
7744
  });
7088
7745
  }
@@ -7104,8 +7761,8 @@ var RepoRepository = class {
7104
7761
  try {
7105
7762
  const fullId = await this.resolveId(id);
7106
7763
  return await this.db.transaction(async (tx) => {
7107
- await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq21(repos3.repo_id, fullId));
7108
- const currentRow = await select(txAsDb(tx)).from(repos3).where(eq21(repos3.repo_id, fullId)).one();
7764
+ await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq20(repos3.repo_id, fullId));
7765
+ const currentRow = await select(txAsDb(tx)).from(repos3).where(eq20(repos3.repo_id, fullId)).one();
7109
7766
  if (!currentRow) {
7110
7767
  throw new EntityNotFoundError("Repo", id);
7111
7768
  }
@@ -7119,7 +7776,7 @@ var RepoRepository = class {
7119
7776
  repo_type: insertData.repo_type,
7120
7777
  unix_group: merged.unix_group ?? null,
7121
7778
  data: insertData.data
7122
- }).where(eq21(repos3.repo_id, fullId)).run();
7779
+ }).where(eq20(repos3.repo_id, fullId)).run();
7123
7780
  merged.clone_error = insertData.data.clone_error;
7124
7781
  merged.remote_url = insertData.data.remote_url;
7125
7782
  merged.last_updated = newUpdatedAt.toISOString();
@@ -7153,8 +7810,8 @@ var RepoRepository = class {
7153
7810
  try {
7154
7811
  const fullId = await this.resolveId(id);
7155
7812
  return await this.db.transaction(async (tx) => {
7156
- await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq21(repos3.repo_id, fullId));
7157
- const currentRow = await select(txAsDb(tx)).from(repos3).where(eq21(repos3.repo_id, fullId)).one();
7813
+ await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq20(repos3.repo_id, fullId));
7814
+ const currentRow = await select(txAsDb(tx)).from(repos3).where(eq20(repos3.repo_id, fullId)).one();
7158
7815
  if (!currentRow) {
7159
7816
  throw new EntityNotFoundError("Repo", id);
7160
7817
  }
@@ -7168,7 +7825,7 @@ var RepoRepository = class {
7168
7825
  repo_type: insertData.repo_type,
7169
7826
  unix_group: next.unix_group ?? null,
7170
7827
  data: insertData.data
7171
- }).where(eq21(repos3.repo_id, fullId)).run();
7828
+ }).where(eq20(repos3.repo_id, fullId)).run();
7172
7829
  next.environment = insertData.data.environment;
7173
7830
  next.environment_config = insertData.data.environment_config;
7174
7831
  next.remote_url = insertData.data.remote_url;
@@ -7208,7 +7865,7 @@ var RepoRepository = class {
7208
7865
  async delete(id) {
7209
7866
  try {
7210
7867
  const fullId = await this.resolveId(id);
7211
- const result = await deleteFrom(this.db, repos3).where(eq21(repos3.repo_id, fullId)).run();
7868
+ const result = await deleteFrom(this.db, repos3).where(eq20(repos3.repo_id, fullId)).run();
7212
7869
  if (result.rowsAffected === 0) {
7213
7870
  throw new EntityNotFoundError("Repo", id);
7214
7871
  }
@@ -7239,7 +7896,7 @@ var RepoRepository = class {
7239
7896
  */
7240
7897
  async count() {
7241
7898
  try {
7242
- const result = await select(this.db, { count: sql10`count(*)` }).from(repos3).one();
7899
+ const result = await select(this.db, { count: sql9`count(*)` }).from(repos3).one();
7243
7900
  return result?.count ?? 0;
7244
7901
  } catch (error) {
7245
7902
  throw new RepositoryError(
@@ -7255,27 +7912,27 @@ init_esm_shims();
7255
7912
  init_ids();
7256
7913
  init_database_wrapper();
7257
7914
  init_schema();
7258
- import { and as and15, asc as asc2, desc as desc3, eq as eq22, isNull as isNull5, like as like11, lte, or as or6, sql as sql11 } from "drizzle-orm";
7915
+ import { and as and16, asc as asc2, desc as desc3, eq as eq21, isNull as isNull6, like as like12, lte, or as or7, sql as sql10 } from "drizzle-orm";
7259
7916
 
7260
7917
  // src/db/repositories/serialized-sessions.ts
7261
7918
  init_esm_shims();
7262
7919
  init_ids();
7263
7920
  init_database_wrapper();
7264
7921
  init_schema();
7265
- import { and as and16, desc as desc4, eq as eq23, lt } from "drizzle-orm";
7922
+ import { and as and17, desc as desc4, eq as eq22, lt } from "drizzle-orm";
7266
7923
 
7267
7924
  // src/db/repositories/session-mcp-servers.ts
7268
7925
  init_esm_shims();
7269
7926
  init_database_wrapper();
7270
7927
  init_schema();
7271
- import { and as and18, eq as eq25 } from "drizzle-orm";
7928
+ import { and as and19, eq as eq24 } from "drizzle-orm";
7272
7929
 
7273
7930
  // src/db/repositories/sessions.ts
7274
7931
  init_esm_shims();
7275
7932
  init_types2();
7276
7933
  init_config_manager();
7277
7934
  init_ids();
7278
- import { and as and17, desc as desc5, eq as eq24, inArray as inArray5, like as like12, or as or7, sql as sql12 } from "drizzle-orm";
7935
+ import { and as and18, desc as desc5, eq as eq23, inArray as inArray7, like as like13, or as or8, sql as sql11 } from "drizzle-orm";
7279
7936
  init_database_wrapper();
7280
7937
  init_schema();
7281
7938
 
@@ -7284,7 +7941,7 @@ init_esm_shims();
7284
7941
  init_ids();
7285
7942
  init_database_wrapper();
7286
7943
  init_schema();
7287
- import { and as and19, eq as eq26, inArray as inArray6, or as or8 } from "drizzle-orm";
7944
+ import { and as and20, eq as eq25, inArray as inArray8, or as or9 } from "drizzle-orm";
7288
7945
 
7289
7946
  // src/db/repositories/tasks.ts
7290
7947
  init_esm_shims();
@@ -7292,7 +7949,7 @@ init_types2();
7292
7949
  init_ids();
7293
7950
  init_database_wrapper();
7294
7951
  init_schema();
7295
- import { eq as eq27, inArray as inArray7, like as like13, sql as sql13 } from "drizzle-orm";
7952
+ import { and as and21, eq as eq26, inArray as inArray9, like as like14, sql as sql12 } from "drizzle-orm";
7296
7953
 
7297
7954
  // src/db/repositories/thread-session-map.ts
7298
7955
  init_esm_shims();
@@ -7300,27 +7957,28 @@ init_types2();
7300
7957
  init_ids();
7301
7958
  init_database_wrapper();
7302
7959
  init_schema();
7303
- import { and as and20, eq as eq28, like as like14, lt as lt2 } from "drizzle-orm";
7960
+ import { and as and22, eq as eq27, like as like15, lt as lt2 } from "drizzle-orm";
7304
7961
 
7305
7962
  // src/db/repositories/user-api-keys.ts
7306
7963
  init_esm_shims();
7307
7964
  init_ids();
7308
7965
  init_database_wrapper();
7309
7966
  init_schema();
7967
+ init_tenant_context();
7310
7968
  import { randomBytes as randomBytes3 } from "crypto";
7311
- import bcrypt2 from "bcryptjs";
7312
- import { and as and21, eq as eq29 } from "drizzle-orm";
7969
+ import bcrypt from "bcryptjs";
7970
+ import { and as and23, eq as eq28 } from "drizzle-orm";
7313
7971
 
7314
7972
  // src/db/repositories/user-mcp-oauth-tokens.ts
7315
7973
  init_esm_shims();
7316
7974
  init_database_wrapper();
7317
7975
  init_schema();
7318
- import { and as and22, eq as eq30, isNull as isNull6 } from "drizzle-orm";
7976
+ import { and as and24, eq as eq29, isNull as isNull7 } from "drizzle-orm";
7319
7977
 
7320
7978
  // src/db/repositories/users.ts
7321
7979
  init_esm_shims();
7322
7980
  init_types2();
7323
- import { eq as eq31, like as like15, sql as sql14 } from "drizzle-orm";
7981
+ import { eq as eq30, like as like16, sql as sql13 } from "drizzle-orm";
7324
7982
  init_ids();
7325
7983
  init_database_wrapper();
7326
7984
  init_schema();
@@ -7345,7 +8003,12 @@ var UsersRepository = class {
7345
8003
  unix_username: row.unix_username ?? void 0,
7346
8004
  onboarding_completed: row.onboarding_completed,
7347
8005
  must_change_password: row.must_change_password,
8006
+ tokens_valid_after: row.tokens_valid_after ? new Date(row.tokens_valid_after) : void 0,
8007
+ avatar_url: row.data.avatar_url ?? row.data.avatar,
7348
8008
  avatar: row.data.avatar,
8009
+ avatar_source: row.data.avatar_source,
8010
+ avatar_source_id: row.data.avatar_source_id,
8011
+ avatar_synced_at: row.data.avatar_synced_at,
7349
8012
  preferences: row.data.preferences,
7350
8013
  // Convert encrypted per-tool credential blobs into boolean presence flags.
7351
8014
  agentic_tools: toAgenticToolsStatus(row.data.agentic_tools),
@@ -7389,8 +8052,14 @@ var UsersRepository = class {
7389
8052
  role: user.role ?? "member",
7390
8053
  unix_username: user.unix_username ?? null,
7391
8054
  onboarding_completed: user.onboarding_completed ?? false,
8055
+ must_change_password: user.must_change_password ?? false,
8056
+ tokens_valid_after: user.tokens_valid_after ? new Date(user.tokens_valid_after) : null,
7392
8057
  data: {
8058
+ avatar_url: user.avatar_url,
7393
8059
  avatar: user.avatar,
8060
+ avatar_source: user.avatar_source,
8061
+ avatar_source_id: user.avatar_source_id,
8062
+ avatar_synced_at: user.avatar_synced_at,
7394
8063
  preferences: user.preferences,
7395
8064
  // Encrypted per-tool credentials. Only forwarded when caller passes the
7396
8065
  // raw shape (internal credential mutators); regular updates leave it undefined,
@@ -7412,7 +8081,7 @@ var UsersRepository = class {
7412
8081
  */
7413
8082
  async resolveId(id) {
7414
8083
  return resolveByShortIdPrefix(id, "User", async (pattern) => {
7415
- const rows = await select(this.db).from(users3).where(like15(users3.user_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
8084
+ const rows = await select(this.db).from(users3).where(like16(users3.user_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
7416
8085
  return rows.map((r) => r.user_id);
7417
8086
  });
7418
8087
  }
@@ -7420,7 +8089,7 @@ var UsersRepository = class {
7420
8089
  * Check if unix_username is already taken by another user
7421
8090
  */
7422
8091
  async isUnixUsernameTaken(unixUsername, excludeUserId) {
7423
- const result = await select(this.db).from(users3).where(eq31(users3.unix_username, unixUsername)).one();
8092
+ const result = await select(this.db).from(users3).where(eq30(users3.unix_username, unixUsername)).one();
7424
8093
  if (!result) {
7425
8094
  return false;
7426
8095
  }
@@ -7443,7 +8112,7 @@ var UsersRepository = class {
7443
8112
  }
7444
8113
  const insertData = this.userToInsert(data);
7445
8114
  await insert(this.db, users3).values(insertData).run();
7446
- const row = await select(this.db).from(users3).where(eq31(users3.user_id, insertData.user_id)).one();
8115
+ const row = await select(this.db).from(users3).where(eq30(users3.user_id, insertData.user_id)).one();
7447
8116
  if (!row) {
7448
8117
  throw new RepositoryError("Failed to retrieve created user");
7449
8118
  }
@@ -7455,7 +8124,7 @@ var UsersRepository = class {
7455
8124
  async findById(id) {
7456
8125
  try {
7457
8126
  const fullId = await this.resolveId(id);
7458
- const result = await select(this.db).from(users3).where(eq31(users3.user_id, fullId)).one();
8127
+ const result = await select(this.db).from(users3).where(eq30(users3.user_id, fullId)).one();
7459
8128
  if (!result) {
7460
8129
  return null;
7461
8130
  }
@@ -7471,7 +8140,7 @@ var UsersRepository = class {
7471
8140
  * Find user by email
7472
8141
  */
7473
8142
  async findByEmail(email) {
7474
- const result = await select(this.db).from(users3).where(eq31(users3.email, email)).one();
8143
+ const result = await select(this.db).from(users3).where(eq30(users3.email, email)).one();
7475
8144
  if (!result) {
7476
8145
  return null;
7477
8146
  }
@@ -7492,7 +8161,7 @@ var UsersRepository = class {
7492
8161
  if (!normalizedEmail) return null;
7493
8162
  const exact = await this.findByEmail(normalizedEmail);
7494
8163
  if (exact) return exact;
7495
- const results = await select(this.db).from(users3).where(sql14`LOWER(${users3.email}) = ${normalizedEmail}`).all();
8164
+ const results = await select(this.db).from(users3).where(sql13`LOWER(${users3.email}) = ${normalizedEmail}`).all();
7496
8165
  if (results.length !== 1) {
7497
8166
  if (results.length > 1) {
7498
8167
  console.warn(
@@ -7542,8 +8211,8 @@ var UsersRepository = class {
7542
8211
  await update(this.db, users3).set({
7543
8212
  ...insertData,
7544
8213
  updated_at: /* @__PURE__ */ new Date()
7545
- }).where(eq31(users3.user_id, fullId)).run();
7546
- const row = await select(this.db).from(users3).where(eq31(users3.user_id, fullId)).one();
8214
+ }).where(eq30(users3.user_id, fullId)).run();
8215
+ const row = await select(this.db).from(users3).where(eq30(users3.user_id, fullId)).one();
7547
8216
  if (!row) {
7548
8217
  throw new RepositoryError("Failed to retrieve updated user");
7549
8218
  }
@@ -7554,7 +8223,7 @@ var UsersRepository = class {
7554
8223
  */
7555
8224
  async delete(id) {
7556
8225
  const fullId = await this.resolveId(id);
7557
- await deleteFrom(this.db, users3).where(eq31(users3.user_id, fullId)).run();
8226
+ await deleteFrom(this.db, users3).where(eq30(users3.user_id, fullId)).run();
7558
8227
  }
7559
8228
  /**
7560
8229
  * Get raw database row (internal use only - includes encrypted keys)
@@ -7562,7 +8231,7 @@ var UsersRepository = class {
7562
8231
  async getRawRow(id) {
7563
8232
  try {
7564
8233
  const fullId = await this.resolveId(id);
7565
- const result = await select(this.db).from(users3).where(eq31(users3.user_id, fullId)).one();
8234
+ const result = await select(this.db).from(users3).where(eq30(users3.user_id, fullId)).one();
7566
8235
  return result;
7567
8236
  } catch (error) {
7568
8237
  if (error instanceof EntityNotFoundError) {
@@ -7644,7 +8313,7 @@ var UsersRepository = class {
7644
8313
  await update(this.db, users3).set({
7645
8314
  data: { ...row.data, agentic_tools: next },
7646
8315
  updated_at: /* @__PURE__ */ new Date()
7647
- }).where(eq31(users3.user_id, fullId)).run();
8316
+ }).where(eq30(users3.user_id, fullId)).run();
7648
8317
  }
7649
8318
  /**
7650
8319
  * Delete a single credential field for a tool.
@@ -7670,134 +8339,15 @@ var UsersRepository = class {
7670
8339
  await update(this.db, users3).set({
7671
8340
  data: { ...row.data, agentic_tools: next },
7672
8341
  updated_at: /* @__PURE__ */ new Date()
7673
- }).where(eq31(users3.user_id, fullId)).run();
8342
+ }).where(eq30(users3.user_id, fullId)).run();
7674
8343
  }
7675
8344
  };
7676
8345
 
7677
- // src/db/index.ts
7678
- init_schema();
7679
-
7680
- // src/db/session-guard.ts
7681
- init_esm_shims();
7682
- init_ids();
7683
-
7684
- // src/db/index.ts
7685
- init_user_utils();
7686
- var compare = bcryptjs.compare;
7687
- var hash = bcryptjs.hash;
7688
-
7689
- // src/config/key-resolver.ts
7690
- init_database_wrapper();
7691
- init_schema();
7692
- init_ids();
7693
- init_config_manager();
7694
- var DEBUG_KEY_RESOLUTION = process.env.AGOR_DEBUG_KEY_RESOLUTION === "1" || process.env.DEBUG?.includes("key-resolution");
7695
-
7696
- // src/config/proxies-resolver.ts
7697
- init_esm_shims();
7698
-
7699
- // src/config/repo-list.ts
7700
- init_esm_shims();
7701
-
7702
- // src/config/repo-reference.ts
7703
- init_esm_shims();
7704
- var REPO_SLUG_PATTERN = /^[a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+$/;
7705
-
7706
- // src/config/resolved-config-slice.ts
7707
- init_esm_shims();
7708
- import { z } from "zod";
7709
- var ResolvedConfigSliceSchema = z.object({
7710
- /** From `config.execution.*` */
7711
- execution: z.object({
7712
- permission_timeout_ms: z.number().int().nonnegative().optional(),
7713
- executor_heartbeat: z.object({
7714
- enabled: z.boolean(),
7715
- interval_ms: z.number().int().positive()
7716
- }).optional()
7717
- }).optional(),
7718
- /** From `config.opencode.*` */
7719
- opencode: z.object({
7720
- serverUrl: z.string().optional()
7721
- }).optional(),
7722
- /** From `config.daemon.*` (selected fields only) */
7723
- daemon: z.object({
7724
- host_ip_address: z.string().optional()
7725
- }).optional()
7726
- });
7727
-
7728
- // src/config/resource-schemas.ts
7729
- init_esm_shims();
7730
- import { z as z2 } from "zod";
7731
- var uuidSchema = z2.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");
7732
- var repoSlugSchema = z2.string().regex(
7733
- REPO_SLUG_PATTERN,
7734
- 'Must be org/name format with alphanumeric, hyphens, underscores, or dots (e.g., "my-org/my-repo")'
7735
- );
7736
- var enforcedAgentConfigSchema = z2.object({
7737
- agentic_tool: z2.enum(["claude-code", "claude-code-cli", "codex", "gemini", "opencode", "copilot", "cursor"]).optional(),
7738
- permission_mode: z2.string().optional(),
7739
- model: z2.string().optional(),
7740
- mcp_server_ids: z2.array(z2.string()).optional()
7741
- });
7742
- var resourceRepoConfigSchema = z2.object({
7743
- repo_id: uuidSchema,
7744
- slug: repoSlugSchema,
7745
- remote_url: z2.string().optional(),
7746
- repo_type: z2.enum(["remote", "local"]).default("remote"),
7747
- default_branch: z2.string().optional(),
7748
- shallow: z2.boolean().optional()
7749
- }).refine((data) => data.repo_type !== "remote" || data.remote_url, {
7750
- message: 'remote_url is required when repo_type is "remote"',
7751
- path: ["remote_url"]
7752
- });
7753
- var resourceBranchConfigSchema = z2.object({
7754
- branch_id: uuidSchema,
7755
- name: z2.string().min(1, "Branch name is required"),
7756
- ref: z2.string().min(1, "Git ref is required"),
7757
- ref_type: z2.enum(["branch", "tag"]).optional(),
7758
- others_can: z2.enum(["none", "view", "session", "prompt", "all"]).optional(),
7759
- mcp_server_ids: z2.array(z2.string()).optional(),
7760
- repo: repoSlugSchema,
7761
- readonly: z2.boolean().optional(),
7762
- agent: enforcedAgentConfigSchema.optional()
7763
- });
7764
- var resourceUserConfigSchema = z2.object({
7765
- user_id: uuidSchema,
7766
- email: z2.string().email("Must be a valid email address"),
7767
- name: z2.string().optional(),
7768
- role: z2.enum(["superadmin", "admin", "member", "viewer"]).default("member"),
7769
- unix_username: z2.string().optional(),
7770
- password: z2.string().optional()
7771
- });
7772
- var daemonResourcesConfigSchema = z2.object({
7773
- repos: z2.array(resourceRepoConfigSchema).optional(),
7774
- branches: z2.array(resourceBranchConfigSchema).optional(),
7775
- users: z2.array(resourceUserConfigSchema).optional()
7776
- });
7777
-
7778
- // src/config/resource-sync.ts
7779
- init_esm_shims();
7780
-
7781
- // src/config/security-resolver.ts
7782
- init_esm_shims();
7783
- var DEFAULT_GIT_CONFIG_PARAMETERS = Object.freeze([
7784
- "transfer.credentialsInUrl=die",
7785
- "protocol.file.allow=user",
7786
- "protocol.ext.allow=never",
7787
- "core.protectHFS=true",
7788
- "core.protectNTFS=true"
7789
- ]);
7790
-
7791
- // src/config/index.ts
7792
- init_types();
7793
-
7794
8346
  // src/git/index.ts
8347
+ var git_exports = {};
7795
8348
  init_esm_shims();
7796
- init_config_manager();
7797
- import { existsSync } from "fs";
7798
- import { mkdir, readFile, stat, writeFile } from "fs/promises";
7799
- import { basename, dirname as dirname2, isAbsolute, join as join3, resolve } from "path";
7800
- import { simpleGit } from "simple-git";
8349
+ __reExport(git_exports, git_star);
8350
+ import * as git_star from "@agor/git";
7801
8351
 
7802
8352
  // src/unix/run-as-user.ts
7803
8353
  init_esm_shims();
@@ -8153,116 +8703,13 @@ function buildSpawnArgs(command, args = [], options) {
8153
8703
  };
8154
8704
  }
8155
8705
 
8156
- // src/git/index.ts
8157
- init_config_manager();
8158
- var cachedGitBinary;
8159
- function getGitBinary() {
8160
- if (cachedGitBinary !== void 0) return cachedGitBinary;
8161
- const commonPaths = [
8162
- "/opt/homebrew/bin/git",
8163
- // Homebrew on Apple Silicon
8164
- "/usr/local/bin/git",
8165
- // Homebrew on Intel
8166
- "/usr/bin/git"
8167
- // System git (Docker and Linux)
8168
- ];
8169
- for (const path3 of commonPaths) {
8170
- if (existsSync(path3)) {
8171
- cachedGitBinary = path3;
8172
- return path3;
8173
- }
8174
- }
8175
- cachedGitBinary = "git";
8176
- return cachedGitBinary;
8177
- }
8178
- function isLikelyGitToken(token) {
8179
- return /^[A-Za-z0-9_-]{20,255}$/.test(token);
8180
- }
8181
- var DEFAULT_AUTH_HEADER_HOST = "github.com";
8182
- function buildGitConfigEnv(entries) {
8183
- if (entries.length === 0) return {};
8184
- const out = {
8185
- GIT_CONFIG_COUNT: String(entries.length)
8186
- };
8187
- for (let i = 0; i < entries.length; i++) {
8188
- const [key, value] = entries[i];
8189
- out[`GIT_CONFIG_KEY_${i}`] = key;
8190
- out[`GIT_CONFIG_VALUE_${i}`] = value;
8191
- }
8192
- return out;
8193
- }
8194
- function buildAuthHeaderEnv(token, host = DEFAULT_AUTH_HEADER_HOST) {
8195
- if (!token) return [];
8196
- if (!isLikelyGitToken(token)) {
8197
- console.warn(
8198
- "\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."
8199
- );
8200
- return [];
8201
- }
8202
- const credential = Buffer.from(`x-access-token:${token}`, "utf8").toString("base64");
8203
- const key = `http.https://${host}/.extraheader`;
8204
- return [[key, `Authorization: Basic ${credential}`]];
8205
- }
8206
- function createGit(baseDir, env, authHost) {
8207
- const gitBinary = getGitBinary();
8208
- const config = [];
8209
- const rawToken = env?.GITHUB_TOKEN ?? env?.GH_TOKEN;
8210
- const authConfigEntries = buildAuthHeaderEnv(rawToken, authHost ?? DEFAULT_AUTH_HEADER_HOST);
8211
- let spawnEnv;
8212
- if (env || authConfigEntries.length > 0) {
8213
- spawnEnv = {
8214
- ...process.env,
8215
- ...env ?? {},
8216
- // Inheritance kill (GLOBAL only): ignore the daemon user's
8217
- // ~/.gitconfig. /etc/gitconfig is intentionally NOT killed — it is
8218
- // admin-policy territory (CA bundles, proxies). See block comment.
8219
- GIT_CONFIG_GLOBAL: "/dev/null",
8220
- // Fail fast instead of blocking on an interactive credential prompt
8221
- // (which would hang the daemon).
8222
- GIT_TERMINAL_PROMPT: "0",
8223
- // Inject http.extraheader (and any future server-constructed config)
8224
- // via the env-var protocol so it never lands on argv.
8225
- ...buildGitConfigEnv(authConfigEntries)
8226
- };
8227
- }
8228
- const git = simpleGit({
8229
- baseDir,
8230
- binary: gitBinary,
8231
- config,
8232
- unsafe: {
8233
- // simple-git's scanner blocks spawning when these env vars / config keys
8234
- // are present. We own the daemon env (in strict mode it's the user's own
8235
- // env) and inject GIT_CONFIG_* ourselves — opting in here mirrors what a
8236
- // direct `git` invocation on the same machine does.
8237
- allowUnsafeSshCommand: true,
8238
- allowUnsafeConfigPaths: true,
8239
- allowUnsafeConfigEnvCount: true,
8240
- allowUnsafeEditor: true,
8241
- allowUnsafeAskPass: true,
8242
- allowUnsafePager: true,
8243
- allowUnsafeGitProxy: true,
8244
- allowUnsafeTemplateDir: true,
8245
- allowUnsafeDiffExternal: true
8246
- }
8247
- });
8248
- if (spawnEnv) {
8249
- git.env(spawnEnv);
8250
- }
8251
- return { git };
8252
- }
8253
- async function getCurrentSha(repoPath) {
8254
- const { git } = createGit(repoPath);
8255
- const log = await git.log({ maxCount: 1 });
8256
- return log.latest?.hash || "";
8257
- }
8258
-
8259
8706
  // src/unix/user-env-file.ts
8260
8707
  init_esm_shims();
8261
8708
  import { execFileSync } from "child_process";
8262
8709
  import { randomBytes as randomBytes4 } from "crypto";
8263
8710
  import { unlinkSync } from "fs";
8264
8711
  import { tmpdir } from "os";
8265
- import { join as join4 } from "path";
8712
+ import { join } from "path";
8266
8713
 
8267
8714
  // src/unix/secret-env.ts
8268
8715
  init_esm_shims();
@@ -8305,7 +8752,7 @@ function writeUserEnvFile(asUser, env) {
8305
8752
  throw new Error(`writeUserEnvFile: invalid Unix username: ${JSON.stringify(asUser)}`);
8306
8753
  }
8307
8754
  const nonce = randomBytes4(16).toString("hex");
8308
- const envFilePath = join4(tmpdir(), `${ENV_FILE_PREFIX}${nonce}`);
8755
+ const envFilePath = join(tmpdir(), `${ENV_FILE_PREFIX}${nonce}`);
8309
8756
  const lines = [];
8310
8757
  for (const [key, value] of Object.entries(env)) {
8311
8758
  if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {
@@ -8371,7 +8818,7 @@ function prepareImpersonationEnv(options) {
8371
8818
  // src/unix/environment-command-spawn.ts
8372
8819
  async function captureBranchBuildSha(branchPath2) {
8373
8820
  try {
8374
- const sha = await getCurrentSha(branchPath2);
8821
+ const sha = await (0, git_exports.getCurrentSha)(branchPath2);
8375
8822
  return sha ? sha.slice(0, 7) : void 0;
8376
8823
  } catch {
8377
8824
  return void 0;