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.
- package/dist/cli/commands/admin/add-to-branch-group.d.ts +2 -13
- package/dist/cli/commands/admin/add-to-branch-group.d.ts.map +1 -1
- package/dist/cli/commands/admin/add-to-branch-group.js +133 -33
- package/dist/cli/commands/admin/create-branch-group.d.ts +2 -13
- package/dist/cli/commands/admin/create-branch-group.d.ts.map +1 -1
- package/dist/cli/commands/admin/create-branch-group.js +132 -38
- package/dist/cli/commands/admin/create-symlink.d.ts +2 -14
- package/dist/cli/commands/admin/create-symlink.d.ts.map +1 -1
- package/dist/cli/commands/admin/create-symlink.js +138 -61
- package/dist/cli/commands/admin/delete-branch-group.d.ts +2 -13
- package/dist/cli/commands/admin/delete-branch-group.d.ts.map +1 -1
- package/dist/cli/commands/admin/delete-branch-group.js +132 -28
- package/dist/cli/commands/admin/delete-user.d.ts +2 -13
- package/dist/cli/commands/admin/delete-user.d.ts.map +1 -1
- package/dist/cli/commands/admin/delete-user.js +132 -38
- package/dist/cli/commands/admin/ensure-user.d.ts +2 -14
- package/dist/cli/commands/admin/ensure-user.d.ts.map +1 -1
- package/dist/cli/commands/admin/ensure-user.js +131 -46
- package/dist/cli/commands/admin/remove-from-branch-group.d.ts +2 -13
- package/dist/cli/commands/admin/remove-from-branch-group.d.ts.map +1 -1
- package/dist/cli/commands/admin/remove-from-branch-group.js +133 -33
- package/dist/cli/commands/admin/remove-symlink.d.ts +2 -14
- package/dist/cli/commands/admin/remove-symlink.d.ts.map +1 -1
- package/dist/cli/commands/admin/remove-symlink.js +136 -49
- package/dist/cli/commands/admin/scrub-git-remotes.d.ts +2 -2
- package/dist/cli/commands/admin/scrub-git-remotes.d.ts.map +1 -1
- package/dist/cli/commands/admin/scrub-git-remotes.js +128 -86
- package/dist/cli/commands/admin/sync-user-symlinks.d.ts +2 -14
- package/dist/cli/commands/admin/sync-user-symlinks.d.ts.map +1 -1
- package/dist/cli/commands/admin/sync-user-symlinks.js +132 -43
- package/dist/cli/commands/auth/whoami.d.ts.map +1 -1
- package/dist/cli/commands/auth/whoami.js +2 -1
- package/dist/cli/commands/branch/env/request.test.d.ts +2 -0
- package/dist/cli/commands/branch/env/request.test.d.ts.map +1 -0
- package/dist/cli/commands/branch/env/request.test.js +17723 -0
- package/dist/cli/commands/branch/env/restart.d.ts.map +1 -1
- package/dist/cli/commands/branch/env/restart.js +7 -1
- package/dist/cli/commands/branch/env/start.d.ts.map +1 -1
- package/dist/cli/commands/branch/env/start.js +7 -1
- package/dist/cli/commands/branch/env/stop.d.ts.map +1 -1
- package/dist/cli/commands/branch/env/stop.js +7 -1
- package/dist/cli/commands/daemon/status.d.ts.map +1 -1
- package/dist/cli/commands/daemon/status.js +2 -1
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +140 -2
- package/dist/cli/commands/local/add-to-branch-group.d.ts +13 -0
- package/dist/cli/commands/local/add-to-branch-group.d.ts.map +1 -0
- package/dist/cli/commands/local/add-to-branch-group.js +37 -0
- package/dist/cli/commands/local/create-branch-group.d.ts +12 -0
- package/dist/cli/commands/local/create-branch-group.d.ts.map +1 -0
- package/dist/cli/commands/local/create-branch-group.js +35 -0
- package/dist/cli/commands/local/create-symlink.d.ts +14 -0
- package/dist/cli/commands/local/create-symlink.d.ts.map +1 -0
- package/dist/cli/commands/local/create-symlink.js +45 -0
- package/dist/cli/commands/{daemon → local/daemon}/sync.d.ts +1 -1
- package/dist/cli/commands/local/daemon/sync.d.ts.map +1 -0
- package/dist/cli/commands/{daemon → local/daemon}/sync.js +7 -6
- package/dist/cli/commands/local/delete-branch-group.d.ts +12 -0
- package/dist/cli/commands/local/delete-branch-group.d.ts.map +1 -0
- package/dist/cli/commands/local/delete-branch-group.js +35 -0
- package/dist/cli/commands/local/delete-user.d.ts +12 -0
- package/dist/cli/commands/local/delete-user.d.ts.map +1 -0
- package/dist/cli/commands/local/delete-user.js +36 -0
- package/dist/cli/commands/local/ensure-user.d.ts +12 -0
- package/dist/cli/commands/local/ensure-user.d.ts.map +1 -0
- package/dist/cli/commands/local/ensure-user.js +41 -0
- package/dist/cli/commands/local/remove-from-branch-group.d.ts +13 -0
- package/dist/cli/commands/local/remove-from-branch-group.d.ts.map +1 -0
- package/dist/cli/commands/local/remove-from-branch-group.js +37 -0
- package/dist/cli/commands/local/remove-symlink.d.ts +13 -0
- package/dist/cli/commands/local/remove-symlink.d.ts.map +1 -0
- package/dist/cli/commands/local/remove-symlink.js +39 -0
- package/dist/cli/commands/local/scrub-git-remotes.d.ts +9 -0
- package/dist/cli/commands/local/scrub-git-remotes.d.ts.map +1 -0
- package/dist/cli/commands/local/scrub-git-remotes.js +23 -0
- package/dist/cli/commands/{admin → local}/sync-unix.d.ts.map +1 -1
- package/dist/cli/commands/{admin → local}/sync-unix.js +3 -3
- package/dist/cli/commands/local/sync-user-symlinks.d.ts +12 -0
- package/dist/cli/commands/local/sync-user-symlinks.d.ts.map +1 -0
- package/dist/cli/commands/local/sync-user-symlinks.js +37 -0
- package/dist/cli/commands/telemetry/index.d.ts +7 -0
- package/dist/cli/commands/telemetry/index.d.ts.map +1 -0
- package/dist/cli/commands/telemetry/index.js +40 -0
- package/dist/cli/commands/telemetry/off.d.ts +6 -0
- package/dist/cli/commands/telemetry/off.d.ts.map +1 -0
- package/dist/cli/commands/telemetry/off.js +35 -0
- package/dist/cli/commands/telemetry/on.d.ts +6 -0
- package/dist/cli/commands/telemetry/on.d.ts.map +1 -0
- package/dist/cli/commands/telemetry/on.js +37 -0
- package/dist/cli/commands/telemetry/test.d.ts +6 -0
- package/dist/cli/commands/telemetry/test.d.ts.map +1 -0
- package/dist/cli/commands/telemetry/test.js +56 -0
- package/dist/cli/commands/user/create-admin.d.ts.map +1 -1
- package/dist/cli/commands/user/create-admin.js +81 -72
- package/dist/cli/commands/user/list.d.ts.map +1 -1
- package/dist/cli/commands/user/list.js +1 -0
- package/dist/cli/commands/whoami.js +2 -1
- package/dist/cli/lib/branch-environment-action.d.ts +21 -0
- package/dist/cli/lib/branch-environment-action.d.ts.map +1 -0
- package/dist/cli/lib/branch-environment-action.js +8 -0
- package/dist/core/api/index.cjs +7 -2
- package/dist/core/api/index.d.ts +13 -4
- package/dist/core/api/index.d.ts.map +1 -1
- package/dist/core/api/index.js +7 -2
- package/dist/core/claude/index.cjs +518 -89
- package/dist/core/claude/index.js +515 -88
- package/dist/core/claude-cli/index.cjs +24 -0
- package/dist/core/claude-cli/index.js +24 -0
- package/dist/core/claude-cli/pricing.d.ts.map +1 -1
- package/dist/core/client/index.cjs +52 -7
- package/dist/core/client/index.js +48 -7
- package/dist/core/config/browser.cjs +3 -5
- package/dist/core/config/browser.js +3 -5
- package/dist/core/config/config-manager.d.ts +33 -13
- package/dist/core/config/config-manager.d.ts.map +1 -1
- package/dist/core/config/index.cjs +4259 -4527
- package/dist/core/config/index.d.ts +1 -0
- package/dist/core/config/index.d.ts.map +1 -1
- package/dist/core/config/index.js +4295 -4583
- package/dist/core/config/key-resolver.d.ts.map +1 -1
- package/dist/core/config/multitenancy.d.ts +33 -0
- package/dist/core/config/multitenancy.d.ts.map +1 -0
- package/dist/core/config/security-resolver.d.ts +1 -0
- package/dist/core/config/security-resolver.d.ts.map +1 -1
- package/dist/core/config/types.d.ts +67 -4
- package/dist/core/config/types.d.ts.map +1 -1
- package/dist/core/db/client.d.ts +34 -2
- package/dist/core/db/client.d.ts.map +1 -1
- package/dist/core/db/database-wrapper.d.ts.map +1 -1
- package/dist/core/db/first-run-bootstrap.d.ts.map +1 -1
- package/dist/core/db/index.cjs +2767 -1232
- package/dist/core/db/index.d.ts +2 -1
- package/dist/core/db/index.d.ts.map +1 -1
- package/dist/core/db/index.js +2601 -1094
- package/dist/core/db/migrate.d.ts.map +1 -1
- package/dist/core/db/repositories/artifacts.d.ts +27 -2
- package/dist/core/db/repositories/artifacts.d.ts.map +1 -1
- package/dist/core/db/repositories/base.d.ts +18 -0
- package/dist/core/db/repositories/base.d.ts.map +1 -1
- package/dist/core/db/repositories/board-comments.d.ts +17 -1
- package/dist/core/db/repositories/board-comments.d.ts.map +1 -1
- package/dist/core/db/repositories/board-objects.d.ts.map +1 -1
- package/dist/core/db/repositories/boards.d.ts +54 -3
- package/dist/core/db/repositories/boards.d.ts.map +1 -1
- package/dist/core/db/repositories/branch-access.d.ts +32 -0
- package/dist/core/db/repositories/branch-access.d.ts.map +1 -1
- package/dist/core/db/repositories/branches.d.ts +52 -2
- package/dist/core/db/repositories/branches.d.ts.map +1 -1
- package/dist/core/db/repositories/cards.d.ts +15 -1
- package/dist/core/db/repositories/cards.d.ts.map +1 -1
- package/dist/core/db/repositories/gateway-channels.d.ts +9 -0
- package/dist/core/db/repositories/gateway-channels.d.ts.map +1 -1
- package/dist/core/db/repositories/gateway-outbound-messages.d.ts +19 -0
- package/dist/core/db/repositories/gateway-outbound-messages.d.ts.map +1 -0
- package/dist/core/db/repositories/index.d.ts +2 -0
- package/dist/core/db/repositories/index.d.ts.map +1 -1
- package/dist/core/db/repositories/messages.d.ts +9 -2
- package/dist/core/db/repositories/messages.d.ts.map +1 -1
- package/dist/core/db/repositories/repos.d.ts.map +1 -1
- package/dist/core/db/repositories/schedules.d.ts +12 -1
- package/dist/core/db/repositories/schedules.d.ts.map +1 -1
- package/dist/core/db/repositories/sessions.d.ts +56 -5
- package/dist/core/db/repositories/sessions.d.ts.map +1 -1
- package/dist/core/db/repositories/tasks.d.ts +7 -2
- package/dist/core/db/repositories/tasks.d.ts.map +1 -1
- package/dist/core/db/repositories/user-api-keys.d.ts +10 -1
- package/dist/core/db/repositories/user-api-keys.d.ts.map +1 -1
- package/dist/core/db/repositories/users.d.ts +8 -8
- package/dist/core/db/repositories/users.d.ts.map +1 -1
- package/dist/core/db/schema.d.ts +1460 -38
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.postgres.d.ts +1082 -37
- package/dist/core/db/schema.postgres.d.ts.map +1 -1
- package/dist/core/db/schema.sqlite.d.ts +397 -1
- package/dist/core/db/schema.sqlite.d.ts.map +1 -1
- package/dist/core/db/tenant-context.d.ts +26 -0
- package/dist/core/db/tenant-context.d.ts.map +1 -0
- package/dist/core/db/tenant-scope.d.ts +31 -0
- package/dist/core/db/tenant-scope.d.ts.map +1 -0
- package/dist/core/db/user-utils.d.ts +2 -2
- package/dist/core/db/user-utils.d.ts.map +1 -1
- package/dist/core/drizzle/postgres/0052_gateway_outbound_messages.sql +45 -0
- package/dist/core/drizzle/postgres/0053_user_token_invalidation.sql +1 -0
- package/dist/core/drizzle/postgres/0054_app_level_multitenancy.sql +219 -0
- package/dist/core/drizzle/postgres/0055_app_level_multitenancy_rls.sql +411 -0
- package/dist/core/drizzle/postgres/0056_composite_indexes.sql +15 -0
- package/dist/core/drizzle/postgres/0057_message_timestamp_indexes.sql +3 -0
- package/dist/core/drizzle/postgres/meta/_journal.json +42 -0
- package/dist/core/drizzle/sqlite/0061_gateway_outbound_messages.sql +38 -0
- package/dist/core/drizzle/sqlite/0062_user_token_invalidation.sql +1 -0
- package/dist/core/drizzle/sqlite/0063_composite_indexes.sql +10 -0
- package/dist/core/drizzle/sqlite/0064_message_timestamp_indexes.sql +2 -0
- package/dist/core/drizzle/sqlite/meta/_journal.json +28 -0
- package/dist/core/environment/render-snapshot.cjs +7 -6
- package/dist/core/environment/render-snapshot.d.ts +2 -0
- package/dist/core/environment/render-snapshot.d.ts.map +1 -1
- package/dist/core/environment/render-snapshot.js +7 -6
- package/dist/core/environment/variable-resolver.cjs +3 -1
- package/dist/core/environment/variable-resolver.js +3 -1
- package/dist/core/environment/webhook.cjs +1 -4
- package/dist/core/environment/webhook.js +1 -4
- package/dist/core/gateway/connector.d.ts +10 -1
- package/dist/core/gateway/connector.d.ts.map +1 -1
- package/dist/core/gateway/connectors/slack-manifest.cjs +108 -0
- package/dist/core/gateway/connectors/slack-manifest.d.ts +85 -0
- package/dist/core/gateway/connectors/slack-manifest.d.ts.map +1 -0
- package/dist/core/gateway/connectors/slack-manifest.js +81 -0
- package/dist/core/gateway/connectors/slack.d.ts +101 -4
- package/dist/core/gateway/connectors/slack.d.ts.map +1 -1
- package/dist/core/gateway/index.cjs +495 -29
- package/dist/core/gateway/index.d.ts +4 -1
- package/dist/core/gateway/index.d.ts.map +1 -1
- package/dist/core/gateway/index.js +490 -28
- package/dist/core/gateway/system-message.d.ts.map +1 -1
- package/dist/core/git/exec.cjs +24 -0
- package/dist/core/git/exec.d.ts +6 -4
- package/dist/core/git/exec.d.ts.map +1 -1
- package/dist/core/git/exec.js +2 -0
- package/dist/core/git/index.cjs +3 -1363
- package/dist/core/git/index.d.ts +4 -614
- package/dist/core/git/index.d.ts.map +1 -1
- package/dist/core/git/index.js +1 -1304
- package/dist/core/git/pure.cjs +24 -0
- package/dist/core/git/pure.d.ts +2 -27
- package/dist/core/git/pure.d.ts.map +1 -1
- package/dist/core/git/pure.js +2 -0
- package/dist/core/index.cjs +11563 -10832
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +12203 -10962
- package/dist/core/lib/feathers-validation.cjs +9 -1
- package/dist/core/lib/feathers-validation.d.ts +2 -0
- package/dist/core/lib/feathers-validation.d.ts.map +1 -1
- package/dist/core/lib/feathers-validation.js +9 -1
- package/dist/core/local-actions/git-remotes.d.ts +7 -0
- package/dist/core/local-actions/git-remotes.d.ts.map +1 -0
- package/dist/core/local-actions/index.cjs +8008 -0
- package/dist/core/local-actions/index.d.ts +6 -0
- package/dist/core/local-actions/index.d.ts.map +1 -0
- package/dist/core/local-actions/index.js +8010 -0
- package/dist/core/local-actions/symlinks.d.ts +20 -0
- package/dist/core/local-actions/symlinks.d.ts.map +1 -0
- package/dist/core/local-actions/types.d.ts +14 -0
- package/dist/core/local-actions/types.d.ts.map +1 -0
- package/dist/core/local-actions/unix-groups.d.ts +16 -0
- package/dist/core/local-actions/unix-groups.d.ts.map +1 -0
- package/dist/core/local-actions/unix-users.d.ts +12 -0
- package/dist/core/local-actions/unix-users.d.ts.map +1 -0
- package/dist/core/mcp/index.cjs +373 -28
- package/dist/core/mcp/index.d.ts +1 -1
- package/dist/core/mcp/index.d.ts.map +1 -1
- package/dist/core/mcp/index.js +369 -27
- package/dist/core/mcp/template-patterns.d.ts +15 -0
- package/dist/core/mcp/template-patterns.d.ts.map +1 -0
- package/dist/core/mcp/template-resolver.d.ts +13 -0
- package/dist/core/mcp/template-resolver.d.ts.map +1 -1
- package/dist/core/models/browser.cjs +154 -25
- package/dist/core/models/browser.js +150 -25
- package/dist/core/models/claude.d.ts +2 -2
- package/dist/core/models/claude.d.ts.map +1 -1
- package/dist/core/models/codex.d.ts +205 -21
- package/dist/core/models/codex.d.ts.map +1 -1
- package/dist/core/models/index.cjs +154 -25
- package/dist/core/models/index.js +150 -25
- package/dist/core/package.json +24 -0
- package/dist/core/seed/demo-fixtures.d.ts +87 -0
- package/dist/core/seed/demo-fixtures.d.ts.map +1 -0
- package/dist/core/seed/dev-fixtures.d.ts.map +1 -1
- package/dist/core/seed/index.cjs +8569 -5519
- package/dist/core/seed/index.d.ts +1 -0
- package/dist/core/seed/index.d.ts.map +1 -1
- package/dist/core/seed/index.js +8580 -5535
- package/dist/core/sessions/index.cjs +110 -24
- package/dist/core/sessions/index.js +110 -24
- package/dist/core/telemetry/index.cjs +361 -0
- package/dist/core/telemetry/index.d.ts +5 -0
- package/dist/core/telemetry/index.d.ts.map +1 -0
- package/dist/core/telemetry/index.js +315 -0
- package/dist/core/telemetry/logger.d.ts +44 -0
- package/dist/core/telemetry/logger.d.ts.map +1 -0
- package/dist/core/telemetry/model-normalization.d.ts +3 -0
- package/dist/core/telemetry/model-normalization.d.ts.map +1 -0
- package/dist/core/telemetry/types.d.ts +47 -0
- package/dist/core/telemetry/types.d.ts.map +1 -0
- package/dist/core/telemetry/version.d.ts +9 -0
- package/dist/core/telemetry/version.d.ts.map +1 -0
- package/dist/core/templates/agor-system-prompt.md +1 -0
- package/dist/core/templates/handlebars-helpers.cjs +3 -1
- package/dist/core/templates/handlebars-helpers.d.ts +5 -0
- package/dist/core/templates/handlebars-helpers.d.ts.map +1 -1
- package/dist/core/templates/handlebars-helpers.js +3 -1
- package/dist/core/tools/mcp/auth-secrets.cjs +3460 -3
- package/dist/core/tools/mcp/auth-secrets.d.ts.map +1 -1
- package/dist/core/tools/mcp/auth-secrets.js +3477 -3
- package/dist/core/tools/mcp/http-headers.cjs +17 -1
- package/dist/core/tools/mcp/http-headers.d.ts.map +1 -1
- package/dist/core/tools/mcp/http-headers.js +15 -1
- package/dist/core/tools/mcp/oauth-refresh.cjs +568 -114
- package/dist/core/tools/mcp/oauth-refresh.js +566 -115
- package/dist/core/types/board.d.ts +14 -0
- package/dist/core/types/board.d.ts.map +1 -1
- package/dist/core/types/branch.d.ts +13 -0
- package/dist/core/types/branch.d.ts.map +1 -1
- package/dist/core/types/config-services.d.ts.map +1 -1
- package/dist/core/types/feathers.d.ts +6 -0
- package/dist/core/types/feathers.d.ts.map +1 -1
- package/dist/core/types/gateway.d.ts +90 -1
- package/dist/core/types/gateway.d.ts.map +1 -1
- package/dist/core/types/index.cjs +42 -0
- package/dist/core/types/index.d.ts +1 -0
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/index.js +38 -0
- package/dist/core/types/schedule.d.ts +4 -3
- package/dist/core/types/schedule.d.ts.map +1 -1
- package/dist/core/types/session.d.ts +7 -1
- package/dist/core/types/session.d.ts.map +1 -1
- package/dist/core/types/tenant.d.ts +15 -0
- package/dist/core/types/tenant.d.ts.map +1 -0
- package/dist/core/types/user.d.ts +61 -0
- package/dist/core/types/user.d.ts.map +1 -1
- package/dist/core/unix/index.cjs +1123 -674
- package/dist/core/unix/index.js +1071 -624
- package/dist/core/utils/emoji-shortcodes.d.ts +13 -0
- package/dist/core/utils/emoji-shortcodes.d.ts.map +1 -0
- package/dist/core/yaml/index.cjs +8 -8
- package/dist/core/yaml/index.d.ts +1 -1
- package/dist/core/yaml/index.d.ts.map +1 -1
- package/dist/core/yaml/index.js +7 -7
- package/dist/daemon/adapters/drizzle.d.ts +26 -4
- package/dist/daemon/adapters/drizzle.d.ts.map +1 -1
- package/dist/daemon/adapters/drizzle.js +68 -7
- package/dist/daemon/auth/api-key-strategy.js +1 -1
- package/dist/daemon/auth/executor-runtime-scope.d.ts.map +1 -1
- package/dist/daemon/auth/executor-runtime-scope.js +34 -6
- package/dist/daemon/auth/executor-session-token.d.ts +15 -0
- package/dist/daemon/auth/executor-session-token.d.ts.map +1 -0
- package/dist/daemon/auth/executor-session-token.js +17 -0
- package/dist/daemon/auth/issue-browser-tokens-hook.d.ts +24 -0
- package/dist/daemon/auth/issue-browser-tokens-hook.d.ts.map +1 -0
- package/dist/daemon/auth/issue-browser-tokens-hook.js +95 -0
- package/dist/daemon/auth/launch-auth.d.ts +5 -4
- package/dist/daemon/auth/launch-auth.d.ts.map +1 -1
- package/dist/daemon/auth/launch-auth.js +123 -39
- package/dist/daemon/auth/refresh-token-service.d.ts +22 -0
- package/dist/daemon/auth/refresh-token-service.d.ts.map +1 -0
- package/dist/daemon/auth/refresh-token-service.js +133 -0
- package/dist/daemon/auth/runtime-tokens.d.ts +3 -1
- package/dist/daemon/auth/runtime-tokens.d.ts.map +1 -1
- package/dist/daemon/auth/runtime-tokens.js +17 -4
- package/dist/daemon/auth/service-jwt-strategy.d.ts +2 -1
- package/dist/daemon/auth/service-jwt-strategy.d.ts.map +1 -1
- package/dist/daemon/auth/service-jwt-strategy.js +141 -3
- package/dist/daemon/auth/token-invalidation.d.ts +11 -0
- package/dist/daemon/auth/token-invalidation.d.ts.map +1 -0
- package/dist/daemon/auth/token-invalidation.js +38 -0
- package/dist/daemon/auth/user-redaction.d.ts +12 -0
- package/dist/daemon/auth/user-redaction.d.ts.map +1 -0
- package/dist/daemon/auth/user-redaction.js +13 -0
- package/dist/daemon/declarations.d.ts +5 -4
- package/dist/daemon/declarations.d.ts.map +1 -1
- package/dist/daemon/hooks/gateway-route.d.ts.map +1 -1
- package/dist/daemon/hooks/gateway-route.js +23 -13
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +8271 -2956
- package/dist/daemon/knowledge/pgvector.d.ts +3 -3
- package/dist/daemon/knowledge/pgvector.d.ts.map +1 -1
- package/dist/daemon/knowledge/pgvector.js +24 -0
- package/dist/daemon/knowledge/units.d.ts +2 -2
- package/dist/daemon/knowledge/units.d.ts.map +1 -1
- package/dist/daemon/main.js +8271 -2956
- package/dist/daemon/mcp/server.d.ts +3 -3
- package/dist/daemon/mcp/server.d.ts.map +1 -1
- package/dist/daemon/mcp/server.js +1740 -81
- package/dist/daemon/mcp/tokens.d.ts +2 -2
- package/dist/daemon/mcp/tokens.d.ts.map +1 -1
- package/dist/daemon/mcp/tokens.js +5 -1
- package/dist/daemon/mcp/tool-registry.d.ts.map +1 -1
- package/dist/daemon/mcp/tool-registry.js +1 -0
- package/dist/daemon/mcp/tools/analytics.d.ts.map +1 -1
- package/dist/daemon/mcp/tools/analytics.js +598 -24
- package/dist/daemon/mcp/tools/artifacts.js +560 -20
- package/dist/daemon/mcp/tools/boards.d.ts.map +1 -1
- package/dist/daemon/mcp/tools/boards.js +567 -21
- package/dist/daemon/mcp/tools/branches.d.ts.map +1 -1
- package/dist/daemon/mcp/tools/branches.js +624 -50
- package/dist/daemon/mcp/tools/card-types.js +558 -18
- package/dist/daemon/mcp/tools/cards.js +558 -18
- package/dist/daemon/mcp/tools/environment.js +566 -18
- package/dist/daemon/mcp/tools/gateway-channels.d.ts +4 -0
- package/dist/daemon/mcp/tools/gateway-channels.d.ts.map +1 -0
- package/dist/daemon/mcp/tools/gateway-channels.js +16187 -0
- package/dist/daemon/mcp/tools/knowledge.js +558 -18
- package/dist/daemon/mcp/tools/mcp-servers.d.ts.map +1 -1
- package/dist/daemon/mcp/tools/mcp-servers.js +893 -18
- package/dist/daemon/mcp/tools/messages.d.ts.map +1 -1
- package/dist/daemon/mcp/tools/messages.js +618 -32
- package/dist/daemon/mcp/tools/proxies.js +568 -20
- package/dist/daemon/mcp/tools/repos.js +558 -18
- package/dist/daemon/mcp/tools/schedules.d.ts.map +1 -1
- package/dist/daemon/mcp/tools/schedules.js +561 -19
- package/dist/daemon/mcp/tools/search.js +558 -18
- package/dist/daemon/mcp/tools/sessions.d.ts.map +1 -1
- package/dist/daemon/mcp/tools/sessions.js +571 -24
- package/dist/daemon/mcp/tools/tasks.js +558 -18
- package/dist/daemon/mcp/tools/users.d.ts.map +1 -1
- package/dist/daemon/mcp/tools/users.js +577 -23
- package/dist/daemon/mcp/tools/widgets.d.ts.map +1 -1
- package/dist/daemon/mcp/tools/widgets.js +759 -83
- package/dist/daemon/oauth-auth-helpers.d.ts +35 -0
- package/dist/daemon/oauth-auth-helpers.d.ts.map +1 -0
- package/dist/daemon/oauth-auth-helpers.js +14 -0
- package/dist/daemon/register-hooks.d.ts +4 -2
- package/dist/daemon/register-hooks.d.ts.map +1 -1
- package/dist/daemon/register-hooks.js +1158 -595
- package/dist/daemon/register-routes.d.ts +3 -2
- package/dist/daemon/register-routes.d.ts.map +1 -1
- package/dist/daemon/register-routes.js +3161 -812
- package/dist/daemon/register-services.d.ts +2 -2
- package/dist/daemon/register-services.d.ts.map +1 -1
- package/dist/daemon/register-services.js +2782 -739
- package/dist/daemon/services/artifacts.d.ts +34 -6
- package/dist/daemon/services/artifacts.d.ts.map +1 -1
- package/dist/daemon/services/artifacts.js +109 -8
- package/dist/daemon/services/assistant-knowledge.d.ts +2 -2
- package/dist/daemon/services/assistant-knowledge.d.ts.map +1 -1
- package/dist/daemon/services/board-comments.d.ts +8 -5
- package/dist/daemon/services/board-comments.d.ts.map +1 -1
- package/dist/daemon/services/board-comments.js +78 -13
- package/dist/daemon/services/board-objects.d.ts +8 -5
- package/dist/daemon/services/board-objects.d.ts.map +1 -1
- package/dist/daemon/services/board-objects.js +14 -4
- package/dist/daemon/services/boards.d.ts +39 -5
- package/dist/daemon/services/boards.d.ts.map +1 -1
- package/dist/daemon/services/boards.js +123 -8
- package/dist/daemon/services/branch-owners.d.ts +3 -1
- package/dist/daemon/services/branch-owners.d.ts.map +1 -1
- package/dist/daemon/services/branch-owners.js +31 -4
- package/dist/daemon/services/branches.d.ts +31 -8
- package/dist/daemon/services/branches.d.ts.map +1 -1
- package/dist/daemon/services/branches.js +272 -36
- package/dist/daemon/services/card-types.d.ts +3 -3
- package/dist/daemon/services/card-types.d.ts.map +1 -1
- package/dist/daemon/services/card-types.js +68 -7
- package/dist/daemon/services/cards.d.ts +19 -4
- package/dist/daemon/services/cards.d.ts.map +1 -1
- package/dist/daemon/services/cards.js +92 -8
- package/dist/daemon/services/check-auth.d.ts +2 -2
- package/dist/daemon/services/check-auth.d.ts.map +1 -1
- package/dist/daemon/services/claude-cli-integration.d.ts +4 -1
- package/dist/daemon/services/claude-cli-integration.d.ts.map +1 -1
- package/dist/daemon/services/claude-cli-integration.js +117 -65
- package/dist/daemon/services/claude-models.d.ts +3 -3
- package/dist/daemon/services/claude-models.d.ts.map +1 -1
- package/dist/daemon/services/claude-models.js +387 -273
- package/dist/daemon/services/config.d.ts +12 -4
- package/dist/daemon/services/config.d.ts.map +1 -1
- package/dist/daemon/services/config.js +39 -3
- package/dist/daemon/services/copilot-models.d.ts +3 -3
- package/dist/daemon/services/copilot-models.d.ts.map +1 -1
- package/dist/daemon/services/cursor-models.d.ts +3 -3
- package/dist/daemon/services/cursor-models.d.ts.map +1 -1
- package/dist/daemon/services/files.d.ts +3 -3
- package/dist/daemon/services/files.d.ts.map +1 -1
- package/dist/daemon/services/files.js +24 -5
- package/dist/daemon/services/gateway-channels-test.d.ts +24 -0
- package/dist/daemon/services/gateway-channels-test.d.ts.map +1 -0
- package/dist/daemon/services/gateway-channels-test.js +66 -0
- package/dist/daemon/services/gateway-channels.d.ts +3 -3
- package/dist/daemon/services/gateway-channels.d.ts.map +1 -1
- package/dist/daemon/services/gateway-channels.js +68 -7
- package/dist/daemon/services/gateway.d.ts +63 -3
- package/dist/daemon/services/gateway.d.ts.map +1 -1
- package/dist/daemon/services/gateway.js +640 -60
- package/dist/daemon/services/github-app-setup.d.ts +3 -3
- package/dist/daemon/services/github-app-setup.d.ts.map +1 -1
- package/dist/daemon/services/groups.d.ts +5 -5
- package/dist/daemon/services/groups.d.ts.map +1 -1
- package/dist/daemon/services/health-monitor.d.ts +34 -2
- package/dist/daemon/services/health-monitor.d.ts.map +1 -1
- package/dist/daemon/services/health-monitor.js +155 -30
- package/dist/daemon/services/knowledge-document-edits.d.ts +3 -3
- package/dist/daemon/services/knowledge-document-edits.d.ts.map +1 -1
- package/dist/daemon/services/knowledge-documents.d.ts +3 -3
- package/dist/daemon/services/knowledge-documents.d.ts.map +1 -1
- package/dist/daemon/services/knowledge-documents.js +92 -7
- package/dist/daemon/services/knowledge-embedding-indexer.d.ts +7 -2
- package/dist/daemon/services/knowledge-embedding-indexer.d.ts.map +1 -1
- package/dist/daemon/services/knowledge-embedding-indexer.js +37 -3
- package/dist/daemon/services/knowledge-graph.d.ts +3 -3
- package/dist/daemon/services/knowledge-graph.d.ts.map +1 -1
- package/dist/daemon/services/knowledge-indexing.d.ts +3 -3
- package/dist/daemon/services/knowledge-indexing.d.ts.map +1 -1
- package/dist/daemon/services/knowledge-namespaces.d.ts +3 -3
- package/dist/daemon/services/knowledge-namespaces.d.ts.map +1 -1
- package/dist/daemon/services/knowledge-namespaces.js +72 -8
- package/dist/daemon/services/knowledge-reindex.d.ts +3 -3
- package/dist/daemon/services/knowledge-reindex.d.ts.map +1 -1
- package/dist/daemon/services/knowledge-reindex.js +28 -1
- package/dist/daemon/services/knowledge-search.d.ts +3 -3
- package/dist/daemon/services/knowledge-search.d.ts.map +1 -1
- package/dist/daemon/services/knowledge-settings.d.ts +3 -3
- package/dist/daemon/services/knowledge-settings.d.ts.map +1 -1
- package/dist/daemon/services/knowledge-settings.js +24 -0
- package/dist/daemon/services/knowledge-versions.d.ts +3 -3
- package/dist/daemon/services/knowledge-versions.d.ts.map +1 -1
- package/dist/daemon/services/knowledge-versions.js +68 -7
- package/dist/daemon/services/leaderboard.d.ts +14 -6
- package/dist/daemon/services/leaderboard.d.ts.map +1 -1
- package/dist/daemon/services/leaderboard.js +74 -15
- package/dist/daemon/services/local-actions.d.ts +13 -0
- package/dist/daemon/services/local-actions.d.ts.map +1 -0
- package/dist/daemon/services/local-actions.js +120 -0
- package/dist/daemon/services/mcp-servers.d.ts +3 -3
- package/dist/daemon/services/mcp-servers.d.ts.map +1 -1
- package/dist/daemon/services/mcp-servers.js +68 -7
- package/dist/daemon/services/messages.d.ts +10 -6
- package/dist/daemon/services/messages.d.ts.map +1 -1
- package/dist/daemon/services/messages.js +87 -7
- package/dist/daemon/services/repos.d.ts +6 -6
- package/dist/daemon/services/repos.d.ts.map +1 -1
- package/dist/daemon/services/repos.js +131 -32
- package/dist/daemon/services/scheduler.d.ts +23 -27
- package/dist/daemon/services/scheduler.d.ts.map +1 -1
- package/dist/daemon/services/scheduler.js +55 -28
- package/dist/daemon/services/schedules.d.ts +3 -3
- package/dist/daemon/services/schedules.d.ts.map +1 -1
- package/dist/daemon/services/schedules.js +68 -7
- package/dist/daemon/services/session-env-selections.d.ts +3 -3
- package/dist/daemon/services/session-env-selections.d.ts.map +1 -1
- package/dist/daemon/services/session-mcp-servers.d.ts +3 -3
- package/dist/daemon/services/session-mcp-servers.d.ts.map +1 -1
- package/dist/daemon/services/session-streams.d.ts +29 -0
- package/dist/daemon/services/session-streams.d.ts.map +1 -0
- package/dist/daemon/services/session-streams.js +84 -0
- package/dist/daemon/services/session-token-service.d.ts.map +1 -1
- package/dist/daemon/services/session-token-service.js +11 -4
- package/dist/daemon/services/sessions.d.ts +9 -5
- package/dist/daemon/services/sessions.d.ts.map +1 -1
- package/dist/daemon/services/sessions.js +143 -10
- package/dist/daemon/services/tasks.d.ts +11 -5
- package/dist/daemon/services/tasks.d.ts.map +1 -1
- package/dist/daemon/services/tasks.js +199 -39
- package/dist/daemon/services/terminals.d.ts +21 -3
- package/dist/daemon/services/terminals.d.ts.map +1 -1
- package/dist/daemon/services/terminals.js +81 -25
- package/dist/daemon/services/thread-session-map.d.ts +3 -3
- package/dist/daemon/services/thread-session-map.d.ts.map +1 -1
- package/dist/daemon/services/thread-session-map.js +68 -7
- package/dist/daemon/services/user-avatar-sync.d.ts +21 -0
- package/dist/daemon/services/user-avatar-sync.d.ts.map +1 -0
- package/dist/daemon/services/user-avatar-sync.js +267 -0
- package/dist/daemon/services/users.d.ts +29 -9
- package/dist/daemon/services/users.d.ts.map +1 -1
- package/dist/daemon/services/users.js +383 -30
- package/dist/daemon/services/zone-trigger.d.ts.map +1 -1
- package/dist/daemon/services/zone-trigger.js +17 -4
- package/dist/daemon/setup/build-info.d.ts +1 -1
- package/dist/daemon/setup/build-info.d.ts.map +1 -1
- package/dist/daemon/setup/build-info.js +5 -1
- package/dist/daemon/setup/database.d.ts +8 -3
- package/dist/daemon/setup/database.d.ts.map +1 -1
- package/dist/daemon/setup/database.js +26 -6
- package/dist/daemon/setup/first-run-admin.d.ts +2 -2
- package/dist/daemon/setup/first-run-admin.d.ts.map +1 -1
- package/dist/daemon/setup/index.js +137 -25
- package/dist/daemon/setup/socketio.d.ts +10 -1
- package/dist/daemon/setup/socketio.d.ts.map +1 -1
- package/dist/daemon/setup/socketio.js +108 -18
- package/dist/daemon/startup.d.ts +13 -2
- package/dist/daemon/startup.d.ts.map +1 -1
- package/dist/daemon/startup.js +377 -94
- package/dist/daemon/utils/append-system-message.d.ts +2 -2
- package/dist/daemon/utils/append-system-message.d.ts.map +1 -1
- package/dist/daemon/utils/apply-session-config-defaults.d.ts.map +1 -1
- package/dist/daemon/utils/apply-session-config-defaults.js +12 -1
- package/dist/daemon/utils/authorization.d.ts +3 -1
- package/dist/daemon/utils/authorization.d.ts.map +1 -1
- package/dist/daemon/utils/authorization.js +36 -7
- package/dist/daemon/utils/branch-authorization.d.ts +30 -0
- package/dist/daemon/utils/branch-authorization.d.ts.map +1 -1
- package/dist/daemon/utils/branch-authorization.js +63 -5
- package/dist/daemon/utils/branch-inspect.d.ts +1 -0
- package/dist/daemon/utils/branch-inspect.d.ts.map +1 -1
- package/dist/daemon/utils/branch-inspect.js +11 -3
- package/dist/daemon/utils/emit-service-event.d.ts +56 -0
- package/dist/daemon/utils/emit-service-event.d.ts.map +1 -0
- package/dist/daemon/utils/emit-service-event.js +23 -0
- package/dist/daemon/utils/executor-read-impersonation.d.ts +2 -2
- package/dist/daemon/utils/executor-read-impersonation.d.ts.map +1 -1
- package/dist/daemon/utils/git-impersonation.d.ts +10 -10
- package/dist/daemon/utils/git-impersonation.d.ts.map +1 -1
- package/dist/daemon/utils/git-remote-credential-scan.d.ts +3 -3
- package/dist/daemon/utils/git-remote-credential-scan.d.ts.map +1 -1
- package/dist/daemon/utils/git-remote-credential-scan.js +6 -2
- package/dist/daemon/utils/mcp-header-secrets.d.ts +3 -5
- package/dist/daemon/utils/mcp-header-secrets.d.ts.map +1 -1
- package/dist/daemon/utils/mcp-header-secrets.js +31 -2
- package/dist/daemon/utils/mcp-token-authorization.d.ts +18 -13
- package/dist/daemon/utils/mcp-token-authorization.d.ts.map +1 -1
- package/dist/daemon/utils/mcp-token-authorization.js +11 -5
- package/dist/daemon/utils/open-source-telemetry-config.d.ts +6 -0
- package/dist/daemon/utils/open-source-telemetry-config.d.ts.map +1 -0
- package/dist/daemon/utils/open-source-telemetry-config.js +21 -0
- package/dist/daemon/utils/open-source-telemetry-heartbeat.d.ts +7 -0
- package/dist/daemon/utils/open-source-telemetry-heartbeat.d.ts.map +1 -0
- package/dist/daemon/utils/open-source-telemetry-heartbeat.js +15 -0
- package/dist/daemon/utils/open-source-telemetry-usage.d.ts +9 -0
- package/dist/daemon/utils/open-source-telemetry-usage.d.ts.map +1 -0
- package/dist/daemon/utils/open-source-telemetry-usage.js +121 -0
- package/dist/daemon/utils/realign-repo-origin.d.ts +3 -3
- package/dist/daemon/utils/realign-repo-origin.d.ts.map +1 -1
- package/dist/daemon/utils/realign-repo-origin.js +47 -16
- package/dist/daemon/utils/realtime-access-cache.d.ts +9 -0
- package/dist/daemon/utils/realtime-access-cache.d.ts.map +1 -1
- package/dist/daemon/utils/realtime-access-cache.js +24 -0
- package/dist/daemon/utils/realtime-publish.d.ts +26 -0
- package/dist/daemon/utils/realtime-publish.d.ts.map +1 -1
- package/dist/daemon/utils/realtime-publish.js +171 -12
- package/dist/daemon/utils/session-queue-tenant-scope.d.ts +24 -0
- package/dist/daemon/utils/session-queue-tenant-scope.d.ts.map +1 -0
- package/dist/daemon/utils/session-queue-tenant-scope.js +133 -0
- package/dist/daemon/utils/session-state-hooks.d.ts +3 -3
- package/dist/daemon/utils/session-state-hooks.d.ts.map +1 -1
- package/dist/daemon/utils/session-turn-lock.d.ts +8 -1
- package/dist/daemon/utils/session-turn-lock.d.ts.map +1 -1
- package/dist/daemon/utils/session-turn-lock.js +25 -2
- package/dist/daemon/utils/spawn-executor.d.ts +23 -1
- package/dist/daemon/utils/spawn-executor.d.ts.map +1 -1
- package/dist/daemon/utils/spawn-executor.js +34 -4
- package/dist/daemon/utils/tenant-db-scope.d.ts +20 -0
- package/dist/daemon/utils/tenant-db-scope.d.ts.map +1 -0
- package/dist/daemon/utils/tenant-db-scope.js +114 -0
- package/dist/daemon/utils/unix-group-init.d.ts +3 -3
- package/dist/daemon/utils/unix-group-init.d.ts.map +1 -1
- package/dist/daemon/utils/upload.d.ts +6 -9
- package/dist/daemon/utils/upload.d.ts.map +1 -1
- package/dist/daemon/utils/upload.js +30 -37
- package/dist/daemon/widgets/env-vars/index.d.ts +26 -1
- package/dist/daemon/widgets/env-vars/index.d.ts.map +1 -1
- package/dist/daemon/widgets/env-vars/index.js +145 -21
- package/dist/daemon/widgets/gateway-token/index.d.ts +114 -0
- package/dist/daemon/widgets/gateway-token/index.d.ts.map +1 -0
- package/dist/daemon/widgets/gateway-token/index.js +14711 -0
- package/dist/daemon/widgets/index.d.ts.map +1 -1
- package/dist/daemon/widgets/index.js +327 -37
- package/dist/daemon/widgets/registry.d.ts +7 -0
- package/dist/daemon/widgets/registry.d.ts.map +1 -1
- package/dist/daemon/widgets/submissions.js +12 -9
- package/dist/executor/commands/environment.d.ts.map +1 -1
- package/dist/executor/commands/environment.js +9 -5
- package/dist/executor/commands/git.d.ts.map +1 -1
- package/dist/executor/commands/git.js +3 -1
- package/dist/executor/db/feathers-repositories.d.ts +19 -1
- package/dist/executor/db/feathers-repositories.d.ts.map +1 -1
- package/dist/executor/db/feathers-repositories.js +31 -1
- package/dist/executor/git/index.d.ts +8 -0
- package/dist/executor/git/index.d.ts.map +1 -0
- package/dist/executor/git/index.js +7 -0
- package/dist/executor/handlers/sdk/base-executor.d.ts.map +1 -1
- package/dist/executor/handlers/sdk/base-executor.js +4 -1
- package/dist/executor/handlers/sdk/claude.d.ts.map +1 -1
- package/dist/executor/handlers/sdk/claude.js +1 -1
- package/dist/executor/handlers/sdk/codex.d.ts.map +1 -1
- package/dist/executor/handlers/sdk/codex.js +1 -1
- package/dist/executor/handlers/sdk/copilot.d.ts.map +1 -1
- package/dist/executor/handlers/sdk/copilot.js +1 -1
- package/dist/executor/handlers/sdk/cursor.d.ts.map +1 -1
- package/dist/executor/handlers/sdk/cursor.js +1 -0
- package/dist/executor/handlers/sdk/gemini.d.ts.map +1 -1
- package/dist/executor/handlers/sdk/gemini.js +1 -1
- package/dist/executor/handlers/sdk/git-safe-directory.d.ts.map +1 -1
- package/dist/executor/handlers/sdk/git-safe-directory.js +1 -1
- package/dist/executor/handlers/sdk/opencode.d.ts.map +1 -1
- package/dist/executor/handlers/sdk/opencode.js +1 -1
- package/dist/executor/payload-types.d.ts +5 -5
- package/dist/executor/sdk-handlers/base/diff-enrichment.js +1 -1
- package/dist/executor/sdk-handlers/base/mcp-scoping.d.ts +8 -1
- package/dist/executor/sdk-handlers/base/mcp-scoping.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/base/mcp-scoping.js +58 -6
- package/dist/executor/sdk-handlers/claude/claude-tool.d.ts +2 -2
- package/dist/executor/sdk-handlers/claude/claude-tool.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/claude/claude-tool.js +2 -2
- package/dist/executor/sdk-handlers/claude/prompt-service.d.ts +13 -3
- package/dist/executor/sdk-handlers/claude/prompt-service.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/claude/prompt-service.js +16 -3
- package/dist/executor/sdk-handlers/claude/query-builder.d.ts +2 -1
- package/dist/executor/sdk-handlers/claude/query-builder.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/claude/query-builder.js +2 -1
- package/dist/executor/sdk-handlers/codex/codex-tool.d.ts +8 -12
- package/dist/executor/sdk-handlers/codex/codex-tool.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/codex/codex-tool.js +14 -17
- package/dist/executor/sdk-handlers/codex/normalizer.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/codex/normalizer.js +11 -1
- package/dist/executor/sdk-handlers/codex/pricing/litellm-openai-model-prices.json +3663 -0
- package/dist/executor/sdk-handlers/codex/pricing/litellm-pricing.d.ts +31 -0
- package/dist/executor/sdk-handlers/codex/pricing/litellm-pricing.d.ts.map +1 -0
- package/dist/executor/sdk-handlers/codex/pricing/litellm-pricing.js +46 -0
- package/dist/executor/sdk-handlers/codex/prompt-service.d.ts +3 -2
- package/dist/executor/sdk-handlers/codex/prompt-service.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/codex/prompt-service.js +131 -12
- package/dist/executor/sdk-handlers/codex/usage.d.ts +14 -23
- package/dist/executor/sdk-handlers/codex/usage.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/codex/usage.js +18 -33
- package/dist/executor/sdk-handlers/copilot/copilot-tool.d.ts +2 -2
- package/dist/executor/sdk-handlers/copilot/copilot-tool.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/copilot/copilot-tool.js +2 -2
- package/dist/executor/sdk-handlers/copilot/prompt-service.d.ts +3 -2
- package/dist/executor/sdk-handlers/copilot/prompt-service.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/copilot/prompt-service.js +4 -1
- package/dist/executor/sdk-handlers/gemini/gemini-tool.d.ts +2 -2
- package/dist/executor/sdk-handlers/gemini/gemini-tool.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/gemini/gemini-tool.js +2 -2
- package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts +3 -2
- package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/gemini/prompt-service.js +4 -1
- package/dist/executor/sdk-handlers/opencode/opencode-tool.d.ts +3 -2
- package/dist/executor/sdk-handlers/opencode/opencode-tool.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/opencode/opencode-tool.js +4 -1
- package/dist/executor/services/feathers-client.d.ts.map +1 -1
- package/dist/executor/services/feathers-client.js +124 -25
- package/dist/git/index.cjs +1101 -0
- package/dist/git/index.d.ts +533 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +1022 -0
- package/dist/git/package.json +21 -0
- package/dist/git/pure.cjs +185 -0
- package/dist/git/pure.d.ts +39 -0
- package/dist/git/pure.d.ts.map +1 -0
- package/dist/git/pure.js +139 -0
- package/dist/ui/assets/AgorEmojiPickerInner-leeNywMc.js +1 -0
- package/dist/ui/assets/App-Dpl4Cc0U.js +4 -0
- package/dist/ui/assets/App-Dpl4Cc0U.js.gz +0 -0
- package/dist/ui/assets/AppNode-wN3UZlFK.js +1 -0
- package/dist/ui/assets/AppNode-wN3UZlFK.js.gz +0 -0
- package/dist/ui/assets/ArtifactConsentModal-DjzXcP_L.js +1 -0
- package/dist/ui/assets/ArtifactConsentModal-DjzXcP_L.js.gz +0 -0
- package/dist/ui/assets/ArtifactFullscreenPage-B3b_EZ0F.js +9 -0
- package/dist/ui/assets/ArtifactFullscreenPage-B3b_EZ0F.js.gz +0 -0
- package/dist/ui/assets/ArtifactNode-DISy2T-6.js +9 -0
- package/dist/ui/assets/ArtifactNode-DISy2T-6.js.gz +0 -0
- package/dist/ui/assets/AutocompleteTextarea-DUpsoEGr.js +19 -0
- package/dist/ui/assets/AutocompleteTextarea-DUpsoEGr.js.gz +0 -0
- package/dist/ui/assets/BoardObjectNodes-BakeGpIX.js +34 -0
- package/dist/ui/assets/BoardObjectNodes-BakeGpIX.js.gz +0 -0
- package/dist/ui/assets/CodeEditor.inner-HmSdTLW5.js +7 -0
- package/dist/ui/assets/CodeEditor.inner-HmSdTLW5.js.gz +0 -0
- package/dist/ui/assets/ConversationView-mWaA-B1f.js +1 -0
- package/dist/ui/assets/ConversationView-mWaA-B1f.js.gz +0 -0
- package/dist/ui/assets/EmbeddedTerminal-NNoyPA81.js +2 -0
- package/dist/ui/assets/EmbeddedTerminal-NNoyPA81.js.gz +0 -0
- package/dist/ui/assets/KnowledgePage-CkxVnRvz.js +24 -0
- package/dist/ui/assets/KnowledgePage-CkxVnRvz.js.gz +0 -0
- package/dist/ui/assets/{MarketingScreenshotPage-zv5RUCuV.js → MarketingScreenshotPage-B86Gs8jx.js} +2 -2
- package/dist/ui/assets/MarketingScreenshotPage-B86Gs8jx.js.gz +0 -0
- package/dist/ui/assets/MobileApp-BPs-SXvz.js +1 -0
- package/dist/ui/assets/MobileApp-BPs-SXvz.js.gz +0 -0
- package/dist/ui/assets/{SessionCanvas-mEmYGZhC.css → SessionCanvas-Bh7Yg5dZ.css} +1 -1
- package/dist/ui/assets/SessionCanvas-Bh7Yg5dZ.css.gz +0 -0
- package/dist/ui/assets/SessionCanvas-xVfDoEtz.js +13 -0
- package/dist/ui/assets/SessionCanvas-xVfDoEtz.js.gz +0 -0
- package/dist/ui/assets/{StreamdownDemoPage-wzWaqWwr.js → StreamdownDemoPage-CvWLzVsv.js} +2 -2
- package/dist/ui/assets/StreamdownDemoPage-CvWLzVsv.js.gz +0 -0
- package/dist/ui/assets/TerminalModal-ExOgsuOP.js +2 -0
- package/dist/ui/assets/TerminalModal-ExOgsuOP.js.gz +0 -0
- package/dist/ui/assets/ThemeSwitcher-Cgyp5ruu.js +1 -0
- package/dist/ui/assets/ThemeSwitcher-Cgyp5ruu.js.gz +0 -0
- package/dist/ui/assets/ThemedSyntaxHighlighter.inner-rpCN9S6K.js +1 -0
- package/dist/ui/assets/{antd-CfbbHJOz.js → antd-BCqimh1J.js} +5 -5
- package/dist/ui/assets/{antd-CfbbHJOz.js.gz → antd-BCqimh1J.js.gz} +0 -0
- package/dist/ui/assets/architecture-U656AL7Q-BxSQIjrE.js +1 -0
- package/dist/ui/assets/architectureDiagram-VXUJARFQ-pDpGHSqT.js +36 -0
- package/dist/ui/assets/architectureDiagram-VXUJARFQ-pDpGHSqT.js.gz +0 -0
- package/dist/ui/assets/{blockDiagram-VD42YOAC-BhZaEN19.js → blockDiagram-VD42YOAC-uP8JTJpK.js} +4 -4
- package/dist/ui/assets/blockDiagram-VD42YOAC-uP8JTJpK.js.gz +0 -0
- package/dist/ui/assets/{c4Diagram-YG6GDRKO-Dk_UH-sY.js → c4Diagram-YG6GDRKO-qQe72Mm7.js} +2 -2
- package/dist/ui/assets/c4Diagram-YG6GDRKO-qQe72Mm7.js.gz +0 -0
- package/dist/ui/assets/channel-CoUBs6Zn.js +1 -0
- package/dist/ui/assets/{chunk-4BX2VUAB-XprbG2TG.js → chunk-4BX2VUAB-sz-YE8Nt.js} +1 -1
- package/dist/ui/assets/chunk-4ZMWKKQ3-3oKtfWXp.js +3 -0
- package/dist/ui/assets/chunk-4ZMWKKQ3-3oKtfWXp.js.gz +0 -0
- package/dist/ui/assets/chunk-55IACEB6-BS04dgKF.js +1 -0
- package/dist/ui/assets/{chunk-ABZYJK2D-BJcrryHK.js → chunk-ABZYJK2D-t3Gkphds.js} +3 -3
- package/dist/ui/assets/chunk-ABZYJK2D-t3Gkphds.js.gz +0 -0
- package/dist/ui/assets/{chunk-AGHRB4JF-DvxmfbM0.js → chunk-AGHRB4JF-D_QmWxbY.js} +1 -1
- package/dist/ui/assets/chunk-AGHRB4JF-D_QmWxbY.js.gz +0 -0
- package/dist/ui/assets/{chunk-ATLVNIR6-DbeJ0OrR.js → chunk-ATLVNIR6-Bmg7-Ufz.js} +1 -1
- package/dist/ui/assets/chunk-ATLVNIR6-Bmg7-Ufz.js.gz +0 -0
- package/dist/ui/assets/{chunk-B4BG7PRW-C53q2ggf.js → chunk-B4BG7PRW-dnSEE1u-.js} +3 -3
- package/dist/ui/assets/chunk-B4BG7PRW-dnSEE1u-.js.gz +0 -0
- package/dist/ui/assets/{chunk-CVBHYZKI-B3EBSlb3.js → chunk-CVBHYZKI-BStaYnF0.js} +1 -1
- package/dist/ui/assets/{chunk-DI55MBZ5-vIyNEQN-.js → chunk-DI55MBZ5-28dvx6o3.js} +1 -1
- package/dist/ui/assets/chunk-DI55MBZ5-28dvx6o3.js.gz +0 -0
- package/dist/ui/assets/chunk-EXTU4WIE-X-FURkEh.js +1 -0
- package/dist/ui/assets/{chunk-FMBD7UC4-rddmfK-Z.js → chunk-FMBD7UC4-C_63gC9S.js} +1 -1
- package/dist/ui/assets/{chunk-HN2XXSSU-Dttqcg3b.js → chunk-HN2XXSSU-UFD374KI.js} +1 -1
- package/dist/ui/assets/chunk-HN2XXSSU-UFD374KI.js.gz +0 -0
- package/dist/ui/assets/chunk-JA3XYJ7Z-B60hLNeR.js +11 -0
- package/dist/ui/assets/chunk-JA3XYJ7Z-B60hLNeR.js.gz +0 -0
- package/dist/ui/assets/{chunk-JZLCHNYA-EUmx2y4H.js → chunk-JZLCHNYA-ButC6pwN.js} +5 -5
- package/dist/ui/assets/chunk-JZLCHNYA-ButC6pwN.js.gz +0 -0
- package/dist/ui/assets/{chunk-MI3HLSF2-65n9Mkyc.js → chunk-MI3HLSF2-BivYzoSV.js} +1 -1
- package/dist/ui/assets/chunk-MI3HLSF2-BivYzoSV.js.gz +0 -0
- package/dist/ui/assets/chunk-N4CR4FBY-mVWzo5wJ.js +2 -0
- package/dist/ui/assets/chunk-N4CR4FBY-mVWzo5wJ.js.gz +0 -0
- package/dist/ui/assets/{chunk-QN33PNHL-DsRKK6NR.js → chunk-QN33PNHL-tXtHZpaG.js} +1 -1
- package/dist/ui/assets/{chunk-QXUST7PY-BCYnMiS3.js → chunk-QXUST7PY-DATib_Vv.js} +2 -2
- package/dist/ui/assets/chunk-QXUST7PY-DATib_Vv.js.gz +0 -0
- package/dist/ui/assets/chunk-QZHKN3VN-y6l249e5.js +1 -0
- package/dist/ui/assets/chunk-S3R3BYOJ-BEtfmflI.js +2 -0
- package/dist/ui/assets/chunk-S3R3BYOJ-BEtfmflI.js.gz +0 -0
- package/dist/ui/assets/{chunk-TZMSLE5B-BuQUQcTr.js → chunk-TZMSLE5B-BY1ZtogK.js} +1 -1
- package/dist/ui/assets/chunk-TZMSLE5B-BY1ZtogK.js.gz +0 -0
- package/dist/ui/assets/classDiagram-2ON5EDUG-BYvq-uPY.js +1 -0
- package/dist/ui/assets/classDiagram-v2-WZHVMYZB-BYvq-uPY.js +1 -0
- package/dist/ui/assets/constants-CYzQKfD1.js +1 -0
- package/dist/ui/assets/{cose-bilkent-S5V4N54A-CnPB3ARO.js → cose-bilkent-S5V4N54A-DPvYrqGG.js} +1 -1
- package/dist/ui/assets/cose-bilkent-S5V4N54A-DPvYrqGG.js.gz +0 -0
- package/dist/ui/assets/{dagre-6UL2VRFP-DhS-k_Se.js → dagre-6UL2VRFP-D800J6qb.js} +1 -1
- package/dist/ui/assets/dagre-6UL2VRFP-D800J6qb.js.gz +0 -0
- package/dist/ui/assets/{dagre-KgLoHEuy.js → dagre-TNc4wezg.js} +1 -1
- package/dist/ui/assets/dagre-TNc4wezg.js.gz +0 -0
- package/dist/ui/assets/diagram-PSM6KHXK-CGdP9F-X.js +24 -0
- package/dist/ui/assets/diagram-PSM6KHXK-CGdP9F-X.js.gz +0 -0
- package/dist/ui/assets/{diagram-QEK2KX5R-BPCitvbo.js → diagram-QEK2KX5R-BD5lOCe5.js} +1 -1
- package/dist/ui/assets/diagram-QEK2KX5R-BD5lOCe5.js.gz +0 -0
- package/dist/ui/assets/{diagram-S2PKOQOG-NW4uK6sx.js → diagram-S2PKOQOG-cp3l22vN.js} +1 -1
- package/dist/ui/assets/diagram-S2PKOQOG-cp3l22vN.js.gz +0 -0
- package/dist/ui/assets/editor-Cr0W5BQI.js +39 -0
- package/dist/ui/assets/editor-Cr0W5BQI.js.gz +0 -0
- package/dist/ui/assets/emoji-Bv3m24sO.js +3 -0
- package/dist/ui/assets/emoji-Bv3m24sO.js.gz +0 -0
- package/dist/ui/assets/{erDiagram-Q2GNP2WA-me1fboaf.js → erDiagram-Q2GNP2WA-CQSXRgqr.js} +2 -2
- package/dist/ui/assets/erDiagram-Q2GNP2WA-CQSXRgqr.js.gz +0 -0
- package/dist/ui/assets/flowDiagram-NV44I4VS-CKcKpkph.js +162 -0
- package/dist/ui/assets/flowDiagram-NV44I4VS-CKcKpkph.js.gz +0 -0
- package/dist/ui/assets/ganttDiagram-LVOFAZNH-DlAHzXO5.js +267 -0
- package/dist/ui/assets/ganttDiagram-LVOFAZNH-DlAHzXO5.js.gz +0 -0
- package/dist/ui/assets/{gitGraph-F6HP7TQM-CfFE_uAC.js → gitGraph-F6HP7TQM-DeuXy4B1.js} +1 -1
- package/dist/ui/assets/gitGraphDiagram-NY62KEGX-aB-AI4Vq.js +65 -0
- package/dist/ui/assets/gitGraphDiagram-NY62KEGX-aB-AI4Vq.js.gz +0 -0
- package/dist/ui/assets/index-B-qHc0o5.js +63 -0
- package/dist/ui/assets/index-B-qHc0o5.js.gz +0 -0
- package/dist/ui/assets/{index-DxuPq13l.css → index-qkT7Qqm2.css} +1 -1
- package/dist/ui/assets/index-qkT7Qqm2.css.gz +0 -0
- package/dist/ui/assets/{info-NVLQJR56-i_xHYg3f.js → info-NVLQJR56-B9PG7xsc.js} +1 -1
- package/dist/ui/assets/{infoDiagram-ER5ION4S-2NL93b78.js → infoDiagram-ER5ION4S-C5Wpoqim.js} +1 -1
- package/dist/ui/assets/{journeyDiagram-XKPGCS4Q-CZF-2DHU.js → journeyDiagram-XKPGCS4Q-CHLziqfS.js} +3 -3
- package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CHLziqfS.js.gz +0 -0
- package/dist/ui/assets/{kanban-definition-3W4ZIXB7-CfvJIOny.js → kanban-definition-3W4ZIXB7-Dq7GzQE_.js} +1 -1
- package/dist/ui/assets/kanban-definition-3W4ZIXB7-Dq7GzQE_.js.gz +0 -0
- package/dist/ui/assets/{line-DDv8kOJk.js → line-DHKNg83I.js} +1 -1
- package/dist/ui/assets/{linear-Daef-l29.js → linear-BvUfn0I8.js} +1 -1
- package/dist/ui/assets/linear-BvUfn0I8.js.gz +0 -0
- package/dist/ui/assets/{mermaid-parser.core-CdK9QgYV.js → mermaid-parser.core-C6d9tKoo.js} +2 -2
- package/dist/ui/assets/mermaid-parser.core-C6d9tKoo.js.gz +0 -0
- package/dist/ui/assets/mermaid.core-CxE5KezR.js +11 -0
- package/dist/ui/assets/mermaid.core-CxE5KezR.js.gz +0 -0
- package/dist/ui/assets/{mindmap-definition-VGOIOE7T-Cb3QMflX.js → mindmap-definition-VGOIOE7T-DmPoQ48w.js} +1 -1
- package/dist/ui/assets/mindmap-definition-VGOIOE7T-DmPoQ48w.js.gz +0 -0
- package/dist/ui/assets/{packet-BFZMPI3H-Bm2uwz4i.js → packet-BFZMPI3H-JZEkVZxU.js} +1 -1
- package/dist/ui/assets/{particles-DsJFOarW.js → particles-CxMmUw86.js} +1 -1
- package/dist/ui/assets/particles-CxMmUw86.js.gz +0 -0
- package/dist/ui/assets/{pie-7BOR55EZ-5i17tVnF.js → pie-7BOR55EZ-_1II5pYQ.js} +1 -1
- package/dist/ui/assets/{pieDiagram-ADFJNKIX-BxIwQWvw.js → pieDiagram-ADFJNKIX-DrNkH33i.js} +1 -1
- package/dist/ui/assets/pieDiagram-ADFJNKIX-DrNkH33i.js.gz +0 -0
- package/dist/ui/assets/{quadrantDiagram-AYHSOK5B-B5HPe4ga.js → quadrantDiagram-AYHSOK5B-DOpC-HEF.js} +3 -3
- package/dist/ui/assets/quadrantDiagram-AYHSOK5B-DOpC-HEF.js.gz +0 -0
- package/dist/ui/assets/{radar-NHE76QYJ-BTn-tq0k.js → radar-NHE76QYJ-DDmqhzEZ.js} +1 -1
- package/dist/ui/assets/reactflow-D98uPOMq.js +2 -0
- package/dist/ui/assets/reactflow-D98uPOMq.js.gz +0 -0
- package/dist/ui/assets/{requirementDiagram-UZGBJVZJ-YfI6llkX.js → requirementDiagram-UZGBJVZJ-Bzx0iEPP.js} +1 -1
- package/dist/ui/assets/requirementDiagram-UZGBJVZJ-Bzx0iEPP.js.gz +0 -0
- package/dist/ui/assets/{sandpack-D7koO5op.js → sandpack-059Z4UWP.js} +38 -38
- package/dist/ui/assets/sandpack-059Z4UWP.js.gz +0 -0
- package/dist/ui/assets/sandpackDefaults-CPMNDsw7.js +1 -0
- package/dist/ui/assets/sandpackDefaults-CPMNDsw7.js.gz +0 -0
- package/dist/ui/assets/sankeyDiagram-TZEHDZUN-Do9pvfDv.js +10 -0
- package/dist/ui/assets/sankeyDiagram-TZEHDZUN-Do9pvfDv.js.gz +0 -0
- package/dist/ui/assets/{sequenceDiagram-WL72ISMW-DAe4Um17.js → sequenceDiagram-WL72ISMW-CN8neUTA.js} +6 -6
- package/dist/ui/assets/sequenceDiagram-WL72ISMW-CN8neUTA.js.gz +0 -0
- package/dist/ui/assets/src-DEbsv3pp.js +34 -0
- package/dist/ui/assets/src-DEbsv3pp.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-FKZM4ZOC-BluWJi8n.js +1 -0
- package/dist/ui/assets/stateDiagram-FKZM4ZOC-BluWJi8n.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-DeyqBMDR.js +1 -0
- package/dist/ui/assets/streamdown-BT1twtFc.js +521 -0
- package/dist/ui/assets/streamdown-BT1twtFc.js.gz +0 -0
- package/dist/ui/assets/syntax-CBu6nLfm.js +9 -0
- package/dist/ui/assets/syntax-CBu6nLfm.js.gz +0 -0
- package/dist/ui/assets/{timeline-definition-IT6M3QCI-D6P5txjT.js → timeline-definition-IT6M3QCI-WdUNkiRj.js} +16 -16
- package/dist/ui/assets/timeline-definition-IT6M3QCI-WdUNkiRj.js.gz +0 -0
- package/dist/ui/assets/{treemap-KMMF4GRG-Bitm3gy4.js → treemap-KMMF4GRG-CoriU4Jl.js} +1 -1
- package/dist/ui/assets/{useUserLocalStorage-Ckb8HsIw.js → useUserLocalStorage-GidNiOPC.js} +1 -1
- package/dist/ui/assets/useUserLocalStorage-GidNiOPC.js.gz +0 -0
- package/dist/ui/assets/{xychartDiagram-PRI3JC2R-CsybjUbd.js → xychartDiagram-PRI3JC2R-CgBAKNt2.js} +1 -1
- package/dist/ui/assets/xychartDiagram-PRI3JC2R-CgBAKNt2.js.gz +0 -0
- package/dist/ui/index.html +11 -11
- package/dist/ui/index.html.gz +0 -0
- package/package.json +6 -5
- package/scripts/postinstall.js +27 -19
- package/dist/cli/commands/daemon/sync.d.ts.map +0 -1
- package/dist/ui/assets/App-DcEY8Ota.js +0 -3
- package/dist/ui/assets/App-DcEY8Ota.js.gz +0 -0
- package/dist/ui/assets/ArtifactConsentModal-CiCbK9iv.js +0 -1
- package/dist/ui/assets/ArtifactConsentModal-CiCbK9iv.js.gz +0 -0
- package/dist/ui/assets/ArtifactFullscreenPage-CfsTEGKd.js +0 -9
- package/dist/ui/assets/ArtifactFullscreenPage-CfsTEGKd.js.gz +0 -0
- package/dist/ui/assets/AutocompleteTextarea-BAFFH_5e.js +0 -18
- package/dist/ui/assets/AutocompleteTextarea-BAFFH_5e.js.gz +0 -0
- package/dist/ui/assets/BoardObjectNodes-D-O6bZIG.js +0 -34
- package/dist/ui/assets/BoardObjectNodes-D-O6bZIG.js.gz +0 -0
- package/dist/ui/assets/CodeEditor.inner-DBgsP4tn.js +0 -8
- package/dist/ui/assets/CodeEditor.inner-DBgsP4tn.js.gz +0 -0
- package/dist/ui/assets/ConversationView-CUWR0gR6.js +0 -1
- package/dist/ui/assets/ConversationView-CUWR0gR6.js.gz +0 -0
- package/dist/ui/assets/KnowledgePage-B2bzlXfn.js +0 -24
- package/dist/ui/assets/KnowledgePage-B2bzlXfn.js.gz +0 -0
- package/dist/ui/assets/MarketingScreenshotPage-zv5RUCuV.js.gz +0 -0
- package/dist/ui/assets/MobileApp-VgVnsnsN.js +0 -1
- package/dist/ui/assets/MobileApp-VgVnsnsN.js.gz +0 -0
- package/dist/ui/assets/SessionCanvas-f1-1Gbcw.js +0 -20
- package/dist/ui/assets/SessionCanvas-f1-1Gbcw.js.gz +0 -0
- package/dist/ui/assets/SessionCanvas-mEmYGZhC.css.gz +0 -0
- package/dist/ui/assets/StreamdownDemoPage-wzWaqWwr.js.gz +0 -0
- package/dist/ui/assets/ThemeSwitcher-Dly2y9pi.js +0 -1
- package/dist/ui/assets/ThemeSwitcher-Dly2y9pi.js.gz +0 -0
- package/dist/ui/assets/architecture-U656AL7Q-CykGFbQU.js +0 -1
- package/dist/ui/assets/architectureDiagram-VXUJARFQ-C8HXAenz.js +0 -36
- package/dist/ui/assets/architectureDiagram-VXUJARFQ-C8HXAenz.js.gz +0 -0
- package/dist/ui/assets/blockDiagram-VD42YOAC-BhZaEN19.js.gz +0 -0
- package/dist/ui/assets/c4Diagram-YG6GDRKO-Dk_UH-sY.js.gz +0 -0
- package/dist/ui/assets/channel-D6_nUWlW.js +0 -1
- package/dist/ui/assets/chunk-55IACEB6-ByzqIgSb.js +0 -1
- package/dist/ui/assets/chunk-ABZYJK2D-BJcrryHK.js.gz +0 -0
- package/dist/ui/assets/chunk-AGHRB4JF-DvxmfbM0.js.gz +0 -0
- package/dist/ui/assets/chunk-ATLVNIR6-DbeJ0OrR.js.gz +0 -0
- package/dist/ui/assets/chunk-B4BG7PRW-C53q2ggf.js.gz +0 -0
- package/dist/ui/assets/chunk-DI55MBZ5-vIyNEQN-.js.gz +0 -0
- package/dist/ui/assets/chunk-EXTU4WIE-B3ObkuOm.js +0 -1
- package/dist/ui/assets/chunk-HN2XXSSU-Dttqcg3b.js.gz +0 -0
- package/dist/ui/assets/chunk-JA3XYJ7Z-DbNDev3D.js +0 -11
- package/dist/ui/assets/chunk-JA3XYJ7Z-DbNDev3D.js.gz +0 -0
- package/dist/ui/assets/chunk-JZLCHNYA-EUmx2y4H.js.gz +0 -0
- package/dist/ui/assets/chunk-MI3HLSF2-65n9Mkyc.js.gz +0 -0
- package/dist/ui/assets/chunk-N4CR4FBY-mv5koXqW.js +0 -2
- package/dist/ui/assets/chunk-N4CR4FBY-mv5koXqW.js.gz +0 -0
- package/dist/ui/assets/chunk-QXUST7PY-BCYnMiS3.js.gz +0 -0
- package/dist/ui/assets/chunk-QZHKN3VN-HucAw4xW.js +0 -1
- package/dist/ui/assets/chunk-S3R3BYOJ-CWMEa9Dc.js +0 -2
- package/dist/ui/assets/chunk-S3R3BYOJ-CWMEa9Dc.js.gz +0 -0
- package/dist/ui/assets/chunk-TZMSLE5B-BuQUQcTr.js.gz +0 -0
- package/dist/ui/assets/classDiagram-2ON5EDUG-CUT3rPTB.js +0 -1
- package/dist/ui/assets/classDiagram-v2-WZHVMYZB-CUT3rPTB.js +0 -1
- package/dist/ui/assets/cose-bilkent-S5V4N54A-CnPB3ARO.js.gz +0 -0
- package/dist/ui/assets/dagre-6UL2VRFP-DhS-k_Se.js.gz +0 -0
- package/dist/ui/assets/dagre-KgLoHEuy.js.gz +0 -0
- package/dist/ui/assets/diagram-PSM6KHXK-BZg3MJmb.js +0 -24
- package/dist/ui/assets/diagram-PSM6KHXK-BZg3MJmb.js.gz +0 -0
- package/dist/ui/assets/diagram-QEK2KX5R-BPCitvbo.js.gz +0 -0
- package/dist/ui/assets/diagram-S2PKOQOG-NW4uK6sx.js.gz +0 -0
- package/dist/ui/assets/editor-CzFWIUw2.js +0 -39
- package/dist/ui/assets/editor-CzFWIUw2.js.gz +0 -0
- package/dist/ui/assets/emoji-Dkz4Zzv_.js +0 -3
- package/dist/ui/assets/emoji-Dkz4Zzv_.js.gz +0 -0
- package/dist/ui/assets/erDiagram-Q2GNP2WA-me1fboaf.js.gz +0 -0
- package/dist/ui/assets/flowDiagram-NV44I4VS-DzE8dGsh.js +0 -162
- package/dist/ui/assets/flowDiagram-NV44I4VS-DzE8dGsh.js.gz +0 -0
- package/dist/ui/assets/ganttDiagram-LVOFAZNH-CFQD09Mi.js +0 -267
- package/dist/ui/assets/ganttDiagram-LVOFAZNH-CFQD09Mi.js.gz +0 -0
- package/dist/ui/assets/gitGraphDiagram-NY62KEGX-CaVoxU4C.js +0 -65
- package/dist/ui/assets/gitGraphDiagram-NY62KEGX-CaVoxU4C.js.gz +0 -0
- package/dist/ui/assets/index-BN5_Qq7R.js +0 -324
- package/dist/ui/assets/index-BN5_Qq7R.js.gz +0 -0
- package/dist/ui/assets/index-DxuPq13l.css.gz +0 -0
- package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CZF-2DHU.js.gz +0 -0
- package/dist/ui/assets/kanban-definition-3W4ZIXB7-CfvJIOny.js.gz +0 -0
- package/dist/ui/assets/katex-CamJ39w1.js +0 -257
- package/dist/ui/assets/katex-CamJ39w1.js.gz +0 -0
- package/dist/ui/assets/linear-Daef-l29.js.gz +0 -0
- package/dist/ui/assets/mermaid-parser.core-CdK9QgYV.js.gz +0 -0
- package/dist/ui/assets/mermaid.core-D6GS9mU-.js +0 -11
- package/dist/ui/assets/mermaid.core-D6GS9mU-.js.gz +0 -0
- package/dist/ui/assets/message-SqLqNYcv.js +0 -36
- package/dist/ui/assets/message-SqLqNYcv.js.gz +0 -0
- package/dist/ui/assets/mindmap-definition-VGOIOE7T-Cb3QMflX.js.gz +0 -0
- package/dist/ui/assets/particles-DsJFOarW.js.gz +0 -0
- package/dist/ui/assets/pieDiagram-ADFJNKIX-BxIwQWvw.js.gz +0 -0
- package/dist/ui/assets/quadrantDiagram-AYHSOK5B-B5HPe4ga.js.gz +0 -0
- package/dist/ui/assets/reactflow-Bf74ngoo.js +0 -2
- package/dist/ui/assets/reactflow-Bf74ngoo.js.gz +0 -0
- package/dist/ui/assets/requirementDiagram-UZGBJVZJ-YfI6llkX.js.gz +0 -0
- package/dist/ui/assets/sandpack-D7koO5op.js.gz +0 -0
- package/dist/ui/assets/sankeyDiagram-TZEHDZUN-DOk_B10B.js +0 -10
- package/dist/ui/assets/sankeyDiagram-TZEHDZUN-DOk_B10B.js.gz +0 -0
- package/dist/ui/assets/sequenceDiagram-WL72ISMW-DAe4Um17.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-FKZM4ZOC-CCesDu_C.js +0 -1
- package/dist/ui/assets/stateDiagram-FKZM4ZOC-CCesDu_C.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-CMlIrsoO.js +0 -1
- package/dist/ui/assets/syntax-C-M-8jOU.js +0 -10
- package/dist/ui/assets/syntax-C-M-8jOU.js.gz +0 -0
- package/dist/ui/assets/theme-BQZdiqwv.js +0 -1
- package/dist/ui/assets/timeline-definition-IT6M3QCI-D6P5txjT.js.gz +0 -0
- package/dist/ui/assets/useUserLocalStorage-Ckb8HsIw.js.gz +0 -0
- package/dist/ui/assets/xychartDiagram-PRI3JC2R-CsybjUbd.js.gz +0 -0
- /package/dist/cli/commands/{admin → local}/sync-unix.d.ts +0 -0
package/dist/core/unix/index.js
CHANGED
|
@@ -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
|
|
198
|
-
return { mtimeMs:
|
|
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.
|
|
661
|
+
const unixIsolationEnabled = resolveExecutionSecurityMode(config).requiresDaemonUnixUser;
|
|
575
662
|
if (unixIsolationEnabled) {
|
|
576
663
|
throw new Error(
|
|
577
|
-
"Unix isolation is enabled (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
900
|
+
let hash = FNV_OFFSET;
|
|
788
901
|
for (let i = 0; i < uuid.length; i++) {
|
|
789
|
-
|
|
790
|
-
|
|
902
|
+
hash ^= BigInt(uuid.charCodeAt(i));
|
|
903
|
+
hash = hash * FNV_PRIME & MASK_64;
|
|
791
904
|
}
|
|
792
|
-
return
|
|
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
|
|
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(
|
|
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
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
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")
|
|
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()
|
|
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
|
-
|
|
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").
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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()
|
|
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
|
-
|
|
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
|
-
|
|
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("
|
|
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
|
-
|
|
2398
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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("
|
|
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((
|
|
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
|
-
|
|
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
|
-
|
|
5325
|
-
|
|
5729
|
+
init_database_wrapper();
|
|
5730
|
+
import { eq as eq3 } from "drizzle-orm";
|
|
5731
|
+
init_schema();
|
|
5326
5732
|
init_ids();
|
|
5327
|
-
|
|
5328
|
-
|
|
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/
|
|
5343
|
-
|
|
5736
|
+
// src/config/index.ts
|
|
5737
|
+
init_multitenancy();
|
|
5344
5738
|
|
|
5345
|
-
// src/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
5771
|
+
// src/config/resource-schemas.ts
|
|
5382
5772
|
init_esm_shims();
|
|
5383
|
-
|
|
5384
|
-
|
|
5385
|
-
|
|
5386
|
-
|
|
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/
|
|
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/
|
|
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/
|
|
5452
|
-
|
|
5453
|
-
|
|
5454
|
-
|
|
5455
|
-
|
|
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/
|
|
5899
|
+
// src/db/repositories/artifact-trust.ts
|
|
5463
5900
|
init_esm_shims();
|
|
5464
5901
|
init_ids();
|
|
5465
|
-
|
|
5902
|
+
init_database_wrapper();
|
|
5903
|
+
init_schema();
|
|
5904
|
+
import { and as and3, eq as eq5, isNull } from "drizzle-orm";
|
|
5466
5905
|
|
|
5467
|
-
// src/
|
|
5906
|
+
// src/db/repositories/artifacts.ts
|
|
5468
5907
|
init_esm_shims();
|
|
5469
|
-
|
|
5470
|
-
|
|
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
|
|
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({ _:
|
|
5926
|
+
db.select({ _: sql4`1` }).from(branchGroupGrants3).innerJoin(
|
|
5487
5927
|
groupMemberships3,
|
|
5488
|
-
|
|
5489
|
-
|
|
5490
|
-
|
|
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
|
-
|
|
5934
|
+
and4(eq6(groups3.group_id, branchGroupGrants3.group_id), eq6(groups3.archived, false))
|
|
5495
5935
|
).where(
|
|
5496
|
-
|
|
5497
|
-
|
|
5498
|
-
|
|
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({ _:
|
|
5946
|
+
db.select({ _: sql4`1` }).from(boardGroupGrants3).innerJoin(
|
|
5507
5947
|
groupMemberships3,
|
|
5508
|
-
|
|
5509
|
-
|
|
5510
|
-
|
|
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
|
-
|
|
5954
|
+
and4(eq6(groups3.group_id, boardGroupGrants3.group_id), eq6(groups3.archived, false))
|
|
5515
5955
|
).innerJoin(
|
|
5516
5956
|
boards3,
|
|
5517
|
-
|
|
5518
|
-
|
|
5519
|
-
|
|
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
|
-
|
|
5523
|
-
|
|
5524
|
-
|
|
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({ _:
|
|
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({ _:
|
|
5539
|
-
|
|
5540
|
-
|
|
5541
|
-
|
|
5542
|
-
|
|
5543
|
-
|
|
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
|
|
5991
|
+
return or(
|
|
5552
5992
|
isNotNull(branchOwners3.user_id),
|
|
5553
5993
|
activeGroupGrantAccessExists(db, userId),
|
|
5554
|
-
|
|
5555
|
-
|
|
5556
|
-
|
|
5557
|
-
|
|
5558
|
-
|
|
5559
|
-
|
|
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
|
-
) ??
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
5707
|
-
if (filter?.user_id) conditions.push(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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,
|
|
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
|
-
|
|
5745
|
-
|
|
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
|
-
|
|
5752
|
-
|
|
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(
|
|
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,
|
|
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
|
-
|
|
5783
|
-
|
|
5784
|
-
|
|
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,
|
|
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
|
-
|
|
5802
|
-
|
|
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
|
-
|
|
5809
|
-
|
|
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(
|
|
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,
|
|
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
|
-
|
|
5838
|
-
|
|
5839
|
-
|
|
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
|
-
|
|
5918
|
-
|
|
5919
|
-
|
|
5920
|
-
|
|
5921
|
-
|
|
5922
|
-
|
|
5923
|
-
|
|
5924
|
-
|
|
5925
|
-
|
|
5926
|
-
|
|
5927
|
-
|
|
5928
|
-
|
|
5929
|
-
|
|
5930
|
-
|
|
5931
|
-
|
|
5932
|
-
|
|
5933
|
-
|
|
5934
|
-
|
|
5935
|
-
|
|
5936
|
-
|
|
5937
|
-
|
|
5938
|
-
|
|
5939
|
-
|
|
5940
|
-
|
|
5941
|
-
|
|
5942
|
-
|
|
5943
|
-
|
|
5944
|
-
|
|
5945
|
-
|
|
5946
|
-
|
|
5947
|
-
|
|
5948
|
-
|
|
5949
|
-
|
|
5950
|
-
|
|
5951
|
-
|
|
5952
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
*
|
|
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(
|
|
6624
|
+
conditions.push(eq11(branches3.repo_id, filter.repo_id));
|
|
6119
6625
|
}
|
|
6120
|
-
if (
|
|
6121
|
-
conditions.push(
|
|
6626
|
+
if (filter?.board_id) {
|
|
6627
|
+
conditions.push(eq11(branches3.board_id, filter.board_id));
|
|
6122
6628
|
}
|
|
6123
|
-
|
|
6124
|
-
|
|
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
|
-
|
|
6724
|
+
eq11(branches3.branch_id, existing.branch_id)
|
|
6146
6725
|
);
|
|
6147
|
-
const currentRow = await select(txAsDb(tx)).from(branches3).where(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
6237
|
-
|
|
6815
|
+
eq11(groupMemberships3.group_id, branchGroupGrants3.group_id),
|
|
6816
|
+
eq11(groupMemberships3.user_id, userId)
|
|
6238
6817
|
)
|
|
6239
6818
|
).innerJoin(
|
|
6240
6819
|
groups3,
|
|
6241
|
-
and9(
|
|
6820
|
+
and9(eq11(groups3.group_id, branchGroupGrants3.group_id), eq11(groups3.archived, false))
|
|
6242
6821
|
).where(
|
|
6243
6822
|
and9(
|
|
6244
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
6349
|
-
const ownerRows = await select(this.db, { user_id: branchOwners3.user_id }).from(branchOwners3).where(
|
|
6350
|
-
const groupRows = await select(this.db, { user_id: groupMemberships3.user_id }).from(branchGroupGrants3).innerJoin(groupMemberships3,
|
|
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(
|
|
6931
|
+
and9(eq11(groups3.group_id, branchGroupGrants3.group_id), eq11(groups3.archived, false))
|
|
6353
6932
|
).where(
|
|
6354
6933
|
and9(
|
|
6355
|
-
|
|
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(
|
|
6360
|
-
const boardGroupRows = branchRow?.permission_source === "board" && branchRow.board_id ? await select(this.db, { user_id: groupMemberships3.user_id }).from(boardGroupGrants3).innerJoin(groupMemberships3,
|
|
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(
|
|
6941
|
+
and9(eq11(groups3.group_id, boardGroupGrants3.group_id), eq11(groups3.archived, false))
|
|
6363
6942
|
).innerJoin(
|
|
6364
6943
|
boards3,
|
|
6365
6944
|
and9(
|
|
6366
|
-
|
|
6367
|
-
|
|
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
|
-
|
|
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(
|
|
6408
|
-
const ownerRows = await select(this.db, { user_id: branchOwners3.user_id }).from(branchOwners3).where(
|
|
6409
|
-
const groupRows = await select(this.db, { user_id: groupMemberships3.user_id }).from(branchGroupGrants3).innerJoin(groupMemberships3,
|
|
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(
|
|
6990
|
+
and9(eq11(groups3.group_id, branchGroupGrants3.group_id), eq11(groups3.archived, false))
|
|
6412
6991
|
).where(
|
|
6413
6992
|
and9(
|
|
6414
|
-
|
|
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(
|
|
6423
|
-
const boardGroupRows = isBoardAligned ? await select(this.db, { user_id: groupMemberships3.user_id }).from(boardGroupGrants3).innerJoin(groupMemberships3,
|
|
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(
|
|
7004
|
+
and9(eq11(groups3.group_id, boardGroupGrants3.group_id), eq11(groups3.archived, false))
|
|
6426
7005
|
).innerJoin(
|
|
6427
7006
|
boards3,
|
|
6428
7007
|
and9(
|
|
6429
|
-
|
|
6430
|
-
|
|
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
|
-
|
|
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
|
-
|
|
6463
|
-
|
|
6464
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
7203
|
+
conditions.push(eq11(branches3.archived, true));
|
|
6568
7204
|
} else if (filter?.archived === false) {
|
|
6569
|
-
conditions.push(
|
|
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(
|
|
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,
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
6897
|
-
|
|
6898
|
-
|
|
6899
|
-
|
|
6900
|
-
|
|
6901
|
-
|
|
6902
|
-
|
|
6903
|
-
|
|
6904
|
-
|
|
6905
|
-
|
|
6906
|
-
|
|
6907
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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,
|
|
7073
|
-
const currentRow = await select(txAsDb(tx)).from(repos3).where(
|
|
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(
|
|
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,
|
|
7108
|
-
const currentRow = await select(txAsDb(tx)).from(repos3).where(
|
|
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(
|
|
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,
|
|
7157
|
-
const currentRow = await select(txAsDb(tx)).from(repos3).where(
|
|
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(
|
|
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(
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
7312
|
-
import { and as
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
7546
|
-
const row = await select(this.db).from(users3).where(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
7797
|
-
import
|
|
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
|
|
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 =
|
|
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;
|