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
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
// src/services/gateway.ts
|
|
2
2
|
import { PublicBaseUrlNotConfiguredError, requirePublicBaseUrl } from "@agor/core/config";
|
|
3
3
|
import {
|
|
4
|
+
BranchRepository,
|
|
4
5
|
GatewayChannelRepository,
|
|
6
|
+
GatewayOutboundMessageRepository,
|
|
7
|
+
getCurrentTenantId as getCurrentTenantId2,
|
|
8
|
+
getHiddenTenantId,
|
|
5
9
|
MCPServerRepository,
|
|
6
|
-
|
|
10
|
+
runWithoutTenantDatabaseScope as runWithoutTenantDatabaseScope2,
|
|
11
|
+
runWithTenantDatabaseScope as runWithTenantDatabaseScope2,
|
|
12
|
+
SessionRepository,
|
|
13
|
+
shortId as shortId2,
|
|
7
14
|
ThreadSessionMapRepository,
|
|
8
15
|
UserMCPOAuthTokenRepository,
|
|
9
16
|
UsersRepository
|
|
@@ -19,8 +26,87 @@ import {
|
|
|
19
26
|
parseGitHubThreadId
|
|
20
27
|
} from "@agor/core/gateway";
|
|
21
28
|
import { resolveSessionDefaults } from "@agor/core/sessions";
|
|
22
|
-
import { SessionStatus } from "@agor/core/types";
|
|
29
|
+
import { hasMinimumRole as hasMinimumRole2, ROLES as ROLES2, SessionStatus } from "@agor/core/types";
|
|
23
30
|
import { getSessionUrl } from "@agor/core/utils/url";
|
|
31
|
+
|
|
32
|
+
// src/utils/branch-authorization.ts
|
|
33
|
+
import { shortId } from "@agor/core/db";
|
|
34
|
+
import { Forbidden, NotAuthenticated, NotFound } from "@agor/core/feathers";
|
|
35
|
+
import { BRANCH_PERMISSION_LEVELS, hasMinimumRole, ROLES } from "@agor/core/types";
|
|
36
|
+
function isSuperAdmin(role, allowSuperadmin = true) {
|
|
37
|
+
if (!allowSuperadmin) return false;
|
|
38
|
+
return role === ROLES.SUPERADMIN || role === "owner";
|
|
39
|
+
}
|
|
40
|
+
var PERMISSION_RANK = Object.fromEntries(
|
|
41
|
+
BRANCH_PERMISSION_LEVELS.map((level, i) => [level, i - 1])
|
|
42
|
+
);
|
|
43
|
+
function hasBranchPermission(branch, userId, isOwner, requiredLevel, userRole, allowSuperadmin = true, effectivePermission) {
|
|
44
|
+
if (isOwner) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
if (isSuperAdmin(userRole, allowSuperadmin)) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
const effectiveLevel = effectivePermission ?? branch.others_can ?? "session";
|
|
51
|
+
const effectiveRank = PERMISSION_RANK[effectiveLevel];
|
|
52
|
+
const requiredRank = PERMISSION_RANK[requiredLevel];
|
|
53
|
+
return effectiveRank >= requiredRank;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// src/utils/tenant-db-scope.ts
|
|
57
|
+
import {
|
|
58
|
+
resolveMultiTenancyConfig,
|
|
59
|
+
resolveTenantContext,
|
|
60
|
+
TenantResolutionError
|
|
61
|
+
} from "@agor/core/config";
|
|
62
|
+
import {
|
|
63
|
+
enqueueTenantDatabasePostCommitCallback,
|
|
64
|
+
getCurrentTenantId,
|
|
65
|
+
runWithoutTenantDatabaseScope,
|
|
66
|
+
runWithTenantDatabaseScope
|
|
67
|
+
} from "@agor/core/db";
|
|
68
|
+
import { NotAuthenticated as NotAuthenticated2 } from "@agor/core/feathers";
|
|
69
|
+
import jwt2 from "jsonwebtoken";
|
|
70
|
+
|
|
71
|
+
// src/auth/runtime-tokens.ts
|
|
72
|
+
import jwt from "jsonwebtoken";
|
|
73
|
+
|
|
74
|
+
// src/utils/tenant-db-scope.ts
|
|
75
|
+
function resolveTenantIdForDeferredScope(params) {
|
|
76
|
+
const scopedParams = params;
|
|
77
|
+
return scopedParams?.tenant?.tenant_id ?? getCurrentTenantId();
|
|
78
|
+
}
|
|
79
|
+
function deferWithTenantDatabaseScope(db, params, work, onError) {
|
|
80
|
+
const tenantId = resolveTenantIdForDeferredScope(params);
|
|
81
|
+
if (!tenantId) {
|
|
82
|
+
const error = new Error("Missing tenant context for deferred tenant-scoped work");
|
|
83
|
+
if (onError) {
|
|
84
|
+
onError(error);
|
|
85
|
+
} else {
|
|
86
|
+
console.error("[tenant-db-scope] Deferred tenant-scoped work skipped:", error);
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const schedule = () => {
|
|
91
|
+
runWithoutTenantDatabaseScope(() => {
|
|
92
|
+
setImmediate(() => {
|
|
93
|
+
void runWithTenantDatabaseScope(db, tenantId, work).catch((error) => {
|
|
94
|
+
if (onError) {
|
|
95
|
+
onError(error);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
console.error("[tenant-db-scope] Deferred tenant-scoped work failed:", error);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
};
|
|
103
|
+
if (enqueueTenantDatabasePostCommitCallback(async () => schedule())) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
schedule();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// src/services/gateway.ts
|
|
24
110
|
function hasListeningConfig(channel) {
|
|
25
111
|
const config = channel.config;
|
|
26
112
|
switch (channel.channel_type) {
|
|
@@ -34,9 +120,155 @@ function hasListeningConfig(channel) {
|
|
|
34
120
|
return false;
|
|
35
121
|
}
|
|
36
122
|
}
|
|
123
|
+
function tenantIdFromGatewayChannel(channel) {
|
|
124
|
+
return getHiddenTenantId(channel);
|
|
125
|
+
}
|
|
37
126
|
function isSlackThinkingPlaceholder(text) {
|
|
38
127
|
return /^thinking\s*\.{3}$/i.test(text.trim());
|
|
39
128
|
}
|
|
129
|
+
function parseSlackOutboundTarget(target) {
|
|
130
|
+
const trimmed = target.trim();
|
|
131
|
+
const channelMatch = /^channel:([^:\s]+)$/.exec(trimmed);
|
|
132
|
+
if (channelMatch) {
|
|
133
|
+
return { kind: "channel_id", channel: channelMatch[1] };
|
|
134
|
+
}
|
|
135
|
+
const channelNameMatch = /^channel_name:([^\s]+)$/.exec(trimmed);
|
|
136
|
+
if (channelNameMatch) {
|
|
137
|
+
return { kind: "channel_name", name: channelNameMatch[1].replace(/^#/, "") };
|
|
138
|
+
}
|
|
139
|
+
if (/^#[^\s]+$/.test(trimmed)) {
|
|
140
|
+
return { kind: "channel_name", name: trimmed.slice(1) };
|
|
141
|
+
}
|
|
142
|
+
const emailMatch = /^(?:email:|user_email:)?([^@\s]+@[^@\s]+\.[^@\s]+)$/.exec(trimmed);
|
|
143
|
+
if (emailMatch) {
|
|
144
|
+
return { kind: "email", email: emailMatch[1] };
|
|
145
|
+
}
|
|
146
|
+
throw new Error(
|
|
147
|
+
"Invalid Slack outbound target. Expected channel:C123, #channel-name, channel_name:channel-name, or user@example.com"
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
function redactProviderErrorMessage(error) {
|
|
151
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
152
|
+
return message.replace(/xox[baprs]-[A-Za-z0-9-]+/g, "[redacted-slack-token]").replace(/xapp-[A-Za-z0-9-]+/g, "[redacted-slack-token]");
|
|
153
|
+
}
|
|
154
|
+
function previewText(text, maxChars = 500) {
|
|
155
|
+
const normalized = text.replace(/\s+/g, " ").trim();
|
|
156
|
+
if (normalized.length <= maxChars) return normalized;
|
|
157
|
+
return `${normalized.slice(0, Math.max(0, maxChars - 1))}\u2026`;
|
|
158
|
+
}
|
|
159
|
+
function quoteForPrompt(text, maxChars = 2e3) {
|
|
160
|
+
const truncated = text.length <= maxChars ? text : `${text.slice(0, maxChars - 1)}\u2026`;
|
|
161
|
+
return truncated.split(/\r?\n/).map((line) => `> ${line}`).join("\n");
|
|
162
|
+
}
|
|
163
|
+
function getSlackMessageTs(metadata) {
|
|
164
|
+
return typeof metadata?.slack_message_ts === "string" ? metadata.slack_message_ts : void 0;
|
|
165
|
+
}
|
|
166
|
+
function compareSlackTs(a, b) {
|
|
167
|
+
if (!a && !b) return 0;
|
|
168
|
+
if (!a) return -1;
|
|
169
|
+
if (!b) return 1;
|
|
170
|
+
const na = Number(a);
|
|
171
|
+
const nb = Number(b);
|
|
172
|
+
if (Number.isFinite(na) && Number.isFinite(nb)) return na === nb ? 0 : na < nb ? -1 : 1;
|
|
173
|
+
return a.localeCompare(b);
|
|
174
|
+
}
|
|
175
|
+
function formatUtcLabel(value) {
|
|
176
|
+
if (!value) return void 0;
|
|
177
|
+
const millis = /^\d+\.\d+$/.test(value) ? Number(value.split(".")[0]) * 1e3 : Date.parse(value);
|
|
178
|
+
if (!Number.isFinite(millis)) return value;
|
|
179
|
+
return new Date(millis).toISOString().replace("T", " ").replace(/\.\d{3}Z$/, " UTC");
|
|
180
|
+
}
|
|
181
|
+
function oneLineForPrompt(text, maxChars = 900) {
|
|
182
|
+
const normalized = text.replace(/\s+/g, " ").trim() || "(no text)";
|
|
183
|
+
if (normalized.length <= maxChars) return normalized;
|
|
184
|
+
return `${normalized.slice(0, Math.max(0, maxChars - 1))}\u2026`;
|
|
185
|
+
}
|
|
186
|
+
var SLACK_GATEWAY_REPLY_NOTE = "Note: Any assistant message you send in this current Agor session is streamed back directly to the Slack conversation. Only use outbound gateway tools when you intentionally need to start a separate thread, DM, or message.";
|
|
187
|
+
function prependSlackGatewayReplyNote(prompt) {
|
|
188
|
+
if (prompt.includes(SLACK_GATEWAY_REPLY_NOTE)) return prompt;
|
|
189
|
+
return `${SLACK_GATEWAY_REPLY_NOTE}
|
|
190
|
+
|
|
191
|
+
${prompt}`;
|
|
192
|
+
}
|
|
193
|
+
function formatSlackCatchUpPrompt(args) {
|
|
194
|
+
const slackChannelName = typeof args.metadata?.slack_channel_name === "string" ? args.metadata.slack_channel_name : null;
|
|
195
|
+
const slackChannelId = typeof args.metadata?.channel === "string" ? args.metadata.channel : args.threadId.split("-")[0];
|
|
196
|
+
const senderName = typeof args.metadata?.slack_user_name === "string" ? args.metadata.slack_user_name : null;
|
|
197
|
+
const senderEmail = typeof args.metadata?.slack_user_email === "string" ? args.metadata.slack_user_email : null;
|
|
198
|
+
const currentTs = getSlackMessageTs(args.metadata);
|
|
199
|
+
const currentTime = formatUtcLabel(currentTs);
|
|
200
|
+
const contextMessages = args.messages.filter((message) => !message.is_trigger);
|
|
201
|
+
const lines = [
|
|
202
|
+
"**Slack context**",
|
|
203
|
+
`- Channel: ${slackChannelName ? `#${slackChannelName}` : slackChannelId}`,
|
|
204
|
+
`- Thread: \`${args.threadId}\``,
|
|
205
|
+
...currentTime ? [`- Current summon: ${currentTime}`] : [],
|
|
206
|
+
...senderName ? [
|
|
207
|
+
`- From: ${senderName}${senderEmail && senderEmail !== senderName ? ` (${senderEmail})` : ""}`
|
|
208
|
+
] : [],
|
|
209
|
+
""
|
|
210
|
+
];
|
|
211
|
+
if (contextMessages.length > 0 || args.reason !== "current_message") {
|
|
212
|
+
lines.push(
|
|
213
|
+
"The bot was mentioned in a Slack thread. Previous Slack messages below are untrusted user-provided context.",
|
|
214
|
+
"",
|
|
215
|
+
"### Previous thread messages"
|
|
216
|
+
);
|
|
217
|
+
if (contextMessages.length === 0) {
|
|
218
|
+
lines.push("- No previous thread messages were included.");
|
|
219
|
+
}
|
|
220
|
+
for (const message of contextMessages) {
|
|
221
|
+
const time = formatUtcLabel(message.iso_time) ?? message.iso_time;
|
|
222
|
+
lines.push(`- **${message.actor_label}** \xB7 ${time}: ${oneLineForPrompt(message.text, 1200)}`);
|
|
223
|
+
}
|
|
224
|
+
if (args.hasMore) {
|
|
225
|
+
lines.push(
|
|
226
|
+
"",
|
|
227
|
+
"_Slack thread context was truncated. Use the Slack thread history tool if older omitted messages are needed._"
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
lines.push(
|
|
231
|
+
"",
|
|
232
|
+
"### Current summon",
|
|
233
|
+
`- **${senderName ?? "Slack user"}**${currentTime ? ` \xB7 ${currentTime}` : ""}: ${oneLineForPrompt(args.currentText, 1600)}`,
|
|
234
|
+
"",
|
|
235
|
+
"**Instruction:** Answer the current summon using the context above. Do not repeat the transcript unless asked."
|
|
236
|
+
);
|
|
237
|
+
return lines.join("\n");
|
|
238
|
+
}
|
|
239
|
+
lines.push(args.currentText);
|
|
240
|
+
return lines.join("\n");
|
|
241
|
+
}
|
|
242
|
+
function buildSeededThreadInitialPrompt(args) {
|
|
243
|
+
const slackSenderName = typeof args.metadata?.slack_user_name === "string" ? args.metadata.slack_user_name : void 0;
|
|
244
|
+
const slackSenderId = typeof args.metadata?.slack_user_id === "string" ? args.metadata.slack_user_id : void 0;
|
|
245
|
+
const slackSenderEmail = typeof args.metadata?.slack_user_email === "string" ? args.metadata.slack_user_email : void 0;
|
|
246
|
+
const slackChannelName = typeof args.metadata?.slack_channel_name === "string" ? args.metadata.slack_channel_name : void 0;
|
|
247
|
+
const lines = [
|
|
248
|
+
"[Gateway context]",
|
|
249
|
+
"",
|
|
250
|
+
"This Slack thread began from a proactive Agor gateway message. Use the provenance below to understand what the human is replying to.",
|
|
251
|
+
"",
|
|
252
|
+
`Outbound seed ID: ${args.seed.id}`,
|
|
253
|
+
`Originating session: ${args.seed.emitted_by_session_id ?? "none"}`,
|
|
254
|
+
`Originating task: ${args.seed.emitted_by_task_id ?? "none"}`,
|
|
255
|
+
`Originating schedule: ${args.seed.emitted_by_schedule_id ?? "none"}`,
|
|
256
|
+
`Emitted by Agor user: ${args.seed.emitted_by_user_id}`,
|
|
257
|
+
`Gateway channel: ${args.channel.name} (${args.channel.id})`,
|
|
258
|
+
`Slack thread: ${args.seed.platform_thread_id}`,
|
|
259
|
+
`Slack channel: ${slackChannelName ?? args.seed.platform_channel_id}`,
|
|
260
|
+
`Slack sender name: ${slackSenderName ?? "unknown"}`,
|
|
261
|
+
`Slack sender ID: ${slackSenderId ?? "unknown"}`,
|
|
262
|
+
`Slack sender email: ${slackSenderEmail ?? "unknown"}`,
|
|
263
|
+
"",
|
|
264
|
+
"Original proactive Agor message:",
|
|
265
|
+
quoteForPrompt(args.seed.message_text),
|
|
266
|
+
"",
|
|
267
|
+
"Human Slack reply:",
|
|
268
|
+
quoteForPrompt(args.replyText)
|
|
269
|
+
];
|
|
270
|
+
return lines.join("\n");
|
|
271
|
+
}
|
|
40
272
|
function buildGitHubInitialPrompt(threadId, text, metadata) {
|
|
41
273
|
try {
|
|
42
274
|
const { owner, repo, number } = parseGitHubThreadId(threadId);
|
|
@@ -139,8 +371,12 @@ function buildGatewayContext(channel, data) {
|
|
|
139
371
|
}
|
|
140
372
|
}
|
|
141
373
|
var GatewayService = class _GatewayService {
|
|
374
|
+
db;
|
|
142
375
|
channelRepo;
|
|
143
376
|
threadMapRepo;
|
|
377
|
+
outboundRepo;
|
|
378
|
+
branchRepo;
|
|
379
|
+
sessionRepo;
|
|
144
380
|
usersRepo;
|
|
145
381
|
mcpServerRepo;
|
|
146
382
|
userTokenRepo;
|
|
@@ -178,8 +414,12 @@ var GatewayService = class _GatewayService {
|
|
|
178
414
|
static SLACK_STREAM_STATUS_REFRESH_MS = 300;
|
|
179
415
|
static SLACK_STREAMED_MESSAGE_CACHE_MAX = 500;
|
|
180
416
|
constructor(db, app) {
|
|
417
|
+
this.db = db;
|
|
181
418
|
this.channelRepo = new GatewayChannelRepository(db);
|
|
182
419
|
this.threadMapRepo = new ThreadSessionMapRepository(db);
|
|
420
|
+
this.outboundRepo = new GatewayOutboundMessageRepository(db);
|
|
421
|
+
this.branchRepo = new BranchRepository(db);
|
|
422
|
+
this.sessionRepo = new SessionRepository(db);
|
|
183
423
|
this.usersRepo = new UsersRepository(db);
|
|
184
424
|
this.mcpServerRepo = new MCPServerRepository(db);
|
|
185
425
|
this.userTokenRepo = new UserMCPOAuthTokenRepository(db);
|
|
@@ -228,6 +468,12 @@ var GatewayService = class _GatewayService {
|
|
|
228
468
|
if (!channelId || !messageTs) return null;
|
|
229
469
|
return `${channelId}-${messageTs}`;
|
|
230
470
|
}
|
|
471
|
+
isSlackChannelLikeThreadId(threadId) {
|
|
472
|
+
const lastHyphen = threadId.lastIndexOf("-");
|
|
473
|
+
if (lastHyphen === -1) return false;
|
|
474
|
+
const channelId = threadId.slice(0, lastHyphen);
|
|
475
|
+
return !!channelId && !channelId.startsWith("D");
|
|
476
|
+
}
|
|
231
477
|
async addSlackThreadAlias(mapping, messageTs, reason) {
|
|
232
478
|
const aliasThreadId = this.makeSlackThreadIdForMessage(mapping.thread_id, messageTs);
|
|
233
479
|
if (!aliasThreadId || aliasThreadId === mapping.thread_id) return;
|
|
@@ -435,6 +681,24 @@ var GatewayService = class _GatewayService {
|
|
|
435
681
|
}
|
|
436
682
|
}
|
|
437
683
|
}
|
|
684
|
+
/**
|
|
685
|
+
* Schedule Slack assistant progress/status updates after the current
|
|
686
|
+
* tenant-scoped database work commits, then update inside a fresh tenant
|
|
687
|
+
* scope. Presence/status updates are often emitted from hooks and streaming
|
|
688
|
+
* routes whose enclosing transaction is about to close.
|
|
689
|
+
*/
|
|
690
|
+
updateProgressAfterCommit(data, params) {
|
|
691
|
+
deferWithTenantDatabaseScope(
|
|
692
|
+
this.db,
|
|
693
|
+
params,
|
|
694
|
+
async () => {
|
|
695
|
+
await this.updateProgress(data);
|
|
696
|
+
},
|
|
697
|
+
(error) => {
|
|
698
|
+
console.warn("[gateway] Failed to update Slack progress after commit:", error);
|
|
699
|
+
}
|
|
700
|
+
);
|
|
701
|
+
}
|
|
438
702
|
wasMessageStreamedToSlack(messageId) {
|
|
439
703
|
return this.slackStreamedMessageIds.has(messageId);
|
|
440
704
|
}
|
|
@@ -566,6 +830,9 @@ var GatewayService = class _GatewayService {
|
|
|
566
830
|
try {
|
|
567
831
|
const metadata = mapping.metadata ?? {};
|
|
568
832
|
const slackThreadId = this.getActiveSlackThreadId(mapping);
|
|
833
|
+
if (this.isSlackChannelLikeThreadId(slackThreadId)) {
|
|
834
|
+
return;
|
|
835
|
+
}
|
|
569
836
|
const recipientUserId = typeof metadata.slack_user_id === "string" ? metadata.slack_user_id : void 0;
|
|
570
837
|
const recipientTeamId = typeof metadata.slack_team_id === "string" ? metadata.slack_team_id : void 0;
|
|
571
838
|
if (event === "streaming:chunk") {
|
|
@@ -648,6 +915,157 @@ ${chunk}` : chunk;
|
|
|
648
915
|
console.warn("[gateway] Failed to mirror message stream to Slack:", error);
|
|
649
916
|
}
|
|
650
917
|
}
|
|
918
|
+
/**
|
|
919
|
+
* Session-context emits are hard-bound to the session's branch, with no
|
|
920
|
+
* admin-role bypass — agent sessions run as admin users, so a role bypass
|
|
921
|
+
* would let any session impersonate another assistant's channel. The error
|
|
922
|
+
* deliberately never echoes the channel's target branch, so a denied emit
|
|
923
|
+
* cannot be used to enumerate which branch a foreign channel serves.
|
|
924
|
+
*/
|
|
925
|
+
async ensureSessionBranchBoundToChannel(channel, sessionId) {
|
|
926
|
+
const session = await this.sessionRepo.findById(sessionId);
|
|
927
|
+
if (!session) {
|
|
928
|
+
throw new Error("Gateway outbound denied: emitting session not found");
|
|
929
|
+
}
|
|
930
|
+
if (session.branch_id !== channel.target_branch_id) {
|
|
931
|
+
throw new Error(
|
|
932
|
+
`Gateway outbound denied: session ${shortId2(sessionId)} runs on branch ${shortId2(session.branch_id)}, but this channel targets a different branch. Sessions can emit only through gateway channels whose target branch matches their own. Call agor_gateway_outbound_targets_list to see usable channels.`
|
|
933
|
+
);
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
async ensureCanEmitFromChannel(channel, userId, userRole) {
|
|
937
|
+
if (hasMinimumRole2(userRole, ROLES2.ADMIN)) return;
|
|
938
|
+
const branch = await this.branchRepo.findById(channel.target_branch_id);
|
|
939
|
+
if (!branch) {
|
|
940
|
+
throw new Error(`Branch not found for gateway channel ${shortId2(channel.id)}`);
|
|
941
|
+
}
|
|
942
|
+
const isOwner = await this.branchRepo.isOwner(branch.branch_id, userId);
|
|
943
|
+
const effectivePermission = await this.branchRepo.resolveUserPermission(branch, userId);
|
|
944
|
+
const canEmit = hasBranchPermission(
|
|
945
|
+
branch,
|
|
946
|
+
userId,
|
|
947
|
+
isOwner,
|
|
948
|
+
"all",
|
|
949
|
+
userRole,
|
|
950
|
+
true,
|
|
951
|
+
effectivePermission
|
|
952
|
+
);
|
|
953
|
+
if (!canEmit) {
|
|
954
|
+
throw new Error(
|
|
955
|
+
"Insufficient branch permission: gateway outbound emits require branch all permission or admin access"
|
|
956
|
+
);
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
async emitMessage(data) {
|
|
960
|
+
const channel = await this.channelRepo.findById(data.gatewayChannelId);
|
|
961
|
+
if (!channel) throw new Error("Gateway channel not found");
|
|
962
|
+
if (!channel.enabled) throw new Error("Gateway channel is disabled");
|
|
963
|
+
if (channel.channel_type !== "slack")
|
|
964
|
+
throw new Error("Gateway outbound v0 only supports Slack channels");
|
|
965
|
+
const config = channel.config;
|
|
966
|
+
if (config.outbound_enabled !== true) {
|
|
967
|
+
throw new Error("Gateway outbound is disabled for this channel");
|
|
968
|
+
}
|
|
969
|
+
if (data.emittedBySessionId) {
|
|
970
|
+
await this.ensureSessionBranchBoundToChannel(channel, data.emittedBySessionId);
|
|
971
|
+
}
|
|
972
|
+
await this.ensureCanEmitFromChannel(channel, data.emittedByUserId, data.userRole);
|
|
973
|
+
const target = data.target ?? (typeof config.default_outbound_target === "string" ? config.default_outbound_target : void 0);
|
|
974
|
+
if (!target) throw new Error("No usable default outbound target configured");
|
|
975
|
+
const parsedTarget = parseSlackOutboundTarget(target);
|
|
976
|
+
const connector = getConnector(
|
|
977
|
+
channel.channel_type,
|
|
978
|
+
channel.config
|
|
979
|
+
);
|
|
980
|
+
if (typeof connector.sendSlackMessage !== "function") {
|
|
981
|
+
throw new Error("Slack connector does not support direct outbound sends");
|
|
982
|
+
}
|
|
983
|
+
const { text, blocks } = normalizeOutbound(
|
|
984
|
+
connector.formatMessage ? connector.formatMessage(data.message) : data.message
|
|
985
|
+
);
|
|
986
|
+
let resolvedChannel;
|
|
987
|
+
const resolvedTargetMetadata = {
|
|
988
|
+
target,
|
|
989
|
+
target_kind: parsedTarget.kind
|
|
990
|
+
};
|
|
991
|
+
if (parsedTarget.kind === "channel_id") {
|
|
992
|
+
resolvedChannel = parsedTarget.channel;
|
|
993
|
+
} else if (parsedTarget.kind === "channel_name") {
|
|
994
|
+
if (typeof connector.resolveChannelByName !== "function") {
|
|
995
|
+
throw new Error("Slack connector does not support channel-name resolution");
|
|
996
|
+
}
|
|
997
|
+
let resolved;
|
|
998
|
+
try {
|
|
999
|
+
resolved = await connector.resolveChannelByName(parsedTarget.name);
|
|
1000
|
+
} catch (error) {
|
|
1001
|
+
throw new Error(`Slack API failure: ${redactProviderErrorMessage(error)}`);
|
|
1002
|
+
}
|
|
1003
|
+
resolvedChannel = resolved.channel;
|
|
1004
|
+
resolvedTargetMetadata.resolved_channel_id = resolved.channel;
|
|
1005
|
+
resolvedTargetMetadata.resolved_channel_name = resolved.name;
|
|
1006
|
+
} else {
|
|
1007
|
+
if (typeof connector.openDmByEmail !== "function") {
|
|
1008
|
+
throw new Error("Slack connector does not support email-to-DM resolution");
|
|
1009
|
+
}
|
|
1010
|
+
let resolved;
|
|
1011
|
+
try {
|
|
1012
|
+
resolved = await connector.openDmByEmail(parsedTarget.email);
|
|
1013
|
+
} catch (error) {
|
|
1014
|
+
throw new Error(`Slack API failure: ${redactProviderErrorMessage(error)}`);
|
|
1015
|
+
}
|
|
1016
|
+
resolvedChannel = resolved.channel;
|
|
1017
|
+
resolvedTargetMetadata.resolved_channel_id = resolved.channel;
|
|
1018
|
+
resolvedTargetMetadata.resolved_user_id = resolved.user_id;
|
|
1019
|
+
}
|
|
1020
|
+
let sent;
|
|
1021
|
+
try {
|
|
1022
|
+
sent = await connector.sendSlackMessage({
|
|
1023
|
+
channel: resolvedChannel,
|
|
1024
|
+
text,
|
|
1025
|
+
blocks,
|
|
1026
|
+
metadata: {
|
|
1027
|
+
...data.purpose ? { purpose: data.purpose } : {},
|
|
1028
|
+
...resolvedTargetMetadata
|
|
1029
|
+
}
|
|
1030
|
+
});
|
|
1031
|
+
} catch (error) {
|
|
1032
|
+
throw new Error(`Slack API failure: ${redactProviderErrorMessage(error)}`);
|
|
1033
|
+
}
|
|
1034
|
+
const platformThreadId = `${sent.channel}-${sent.thread_ts || sent.ts}`;
|
|
1035
|
+
const row = await this.outboundRepo.create({
|
|
1036
|
+
gateway_channel_id: channel.id,
|
|
1037
|
+
channel_type: "slack",
|
|
1038
|
+
platform_channel_id: sent.channel,
|
|
1039
|
+
platform_message_id: sent.ts,
|
|
1040
|
+
platform_thread_id: platformThreadId,
|
|
1041
|
+
platform_permalink: sent.permalink ?? null,
|
|
1042
|
+
target_branch_id: channel.target_branch_id,
|
|
1043
|
+
emitted_by_user_id: data.emittedByUserId,
|
|
1044
|
+
emitted_by_session_id: data.emittedBySessionId ?? null,
|
|
1045
|
+
emitted_by_task_id: data.emittedByTaskId ?? null,
|
|
1046
|
+
emitted_by_schedule_id: data.emittedByScheduleId ?? null,
|
|
1047
|
+
message_text: data.message,
|
|
1048
|
+
message_preview: previewText(data.message),
|
|
1049
|
+
metadata: {
|
|
1050
|
+
target,
|
|
1051
|
+
...data.purpose ? { purpose: data.purpose } : {}
|
|
1052
|
+
}
|
|
1053
|
+
});
|
|
1054
|
+
await this.channelRepo.updateLastMessage(channel.id);
|
|
1055
|
+
console.log(
|
|
1056
|
+
`[gateway] Proactive Slack outbound ${shortId2(row.id)} sent via ${shortId2(channel.id)} to ${target}`
|
|
1057
|
+
);
|
|
1058
|
+
return {
|
|
1059
|
+
success: true,
|
|
1060
|
+
gateway_outbound_message_id: row.id,
|
|
1061
|
+
gateway_channel_id: channel.id,
|
|
1062
|
+
channel_type: "slack",
|
|
1063
|
+
platform_channel_id: sent.channel,
|
|
1064
|
+
platform_message_id: sent.ts,
|
|
1065
|
+
platform_thread_id: platformThreadId,
|
|
1066
|
+
...sent.permalink ? { platform_permalink: sent.permalink } : {}
|
|
1067
|
+
};
|
|
1068
|
+
}
|
|
651
1069
|
async fetchExistingSessionUrlForGatewayUser(sessionId, user) {
|
|
652
1070
|
try {
|
|
653
1071
|
const baseUrl = await requirePublicBaseUrl();
|
|
@@ -698,16 +1116,36 @@ ${chunk}` : chunk;
|
|
|
698
1116
|
}
|
|
699
1117
|
if (existingMapping && channel.channel_type === "slack") {
|
|
700
1118
|
console.log(
|
|
701
|
-
`[gateway] Slack inbound thread ${data.thread_id} \u2192 session ${
|
|
1119
|
+
`[gateway] Slack inbound thread ${data.thread_id} \u2192 session ${shortId2(existingMapping.session_id)} (root ${existingMapping.thread_id})`
|
|
1120
|
+
);
|
|
1121
|
+
}
|
|
1122
|
+
const outboundSeed = !existingMapping && channel.channel_type === "slack" ? await this.outboundRepo.findUnconsumedByChannelAndThread(channel.id, data.thread_id) : null;
|
|
1123
|
+
if (outboundSeed) {
|
|
1124
|
+
console.log(
|
|
1125
|
+
`[gateway] Slack inbound thread ${data.thread_id} is replying to outbound seed ${shortId2(outboundSeed.id)}`
|
|
702
1126
|
);
|
|
703
1127
|
}
|
|
704
|
-
if (!existingMapping) {
|
|
1128
|
+
if (!existingMapping && channel.channel_type !== "slack") {
|
|
705
1129
|
const exactThreadMapping = await this.threadMapRepo.findByThread(data.thread_id);
|
|
706
|
-
const
|
|
707
|
-
const otherChannelMapping = exactThreadMapping && exactThreadMapping.channel_id !== channel.id ? exactThreadMapping : aliasThreadMapping && aliasThreadMapping.channel_id !== channel.id ? aliasThreadMapping : null;
|
|
1130
|
+
const otherChannelMapping = exactThreadMapping && exactThreadMapping.channel_id !== channel.id ? exactThreadMapping : null;
|
|
708
1131
|
if (otherChannelMapping) {
|
|
709
1132
|
console.log(
|
|
710
|
-
`[gateway] IGNORED: Thread ${data.thread_id} owned by channel ${
|
|
1133
|
+
`[gateway] IGNORED: Thread ${data.thread_id} owned by channel ${shortId2(otherChannelMapping.channel_id)}, not ours (${shortId2(channel.id)}). Silently dropping.`
|
|
1134
|
+
);
|
|
1135
|
+
return {
|
|
1136
|
+
success: false,
|
|
1137
|
+
sessionId: "",
|
|
1138
|
+
created: false
|
|
1139
|
+
};
|
|
1140
|
+
}
|
|
1141
|
+
}
|
|
1142
|
+
if (channel.channel_type === "slack") {
|
|
1143
|
+
const slackConversationType = typeof data.metadata?.channel_type === "string" ? data.metadata.channel_type : void 0;
|
|
1144
|
+
const isSlackDm = slackConversationType === "im";
|
|
1145
|
+
const hasExplicitMention = data.metadata?.slack_has_mention === true;
|
|
1146
|
+
if (!isSlackDm && !hasExplicitMention) {
|
|
1147
|
+
console.debug(
|
|
1148
|
+
`[gateway] IGNORED: Slack channel-like message without explicit mention: channel=${shortId2(channel.id)}, thread=${data.thread_id}`
|
|
711
1149
|
);
|
|
712
1150
|
return {
|
|
713
1151
|
success: false,
|
|
@@ -716,9 +1154,9 @@ ${chunk}` : chunk;
|
|
|
716
1154
|
};
|
|
717
1155
|
}
|
|
718
1156
|
}
|
|
719
|
-
if (!existingMapping && data.metadata?.requires_mapping_verification) {
|
|
1157
|
+
if (!existingMapping && !outboundSeed && data.metadata?.requires_mapping_verification) {
|
|
720
1158
|
console.debug(
|
|
721
|
-
`[gateway] IGNORED: Thread reply without mention in unmapped thread: channel=${
|
|
1159
|
+
`[gateway] IGNORED: Thread reply without mention in unmapped thread: channel=${shortId2(channel.id)}, thread=${data.thread_id}`
|
|
722
1160
|
);
|
|
723
1161
|
return {
|
|
724
1162
|
success: false,
|
|
@@ -764,7 +1202,7 @@ ${chunk}` : chunk;
|
|
|
764
1202
|
const matchedUser = await this.usersRepo.findByEmailForAlignment(email);
|
|
765
1203
|
if (matchedUser) {
|
|
766
1204
|
console.log(
|
|
767
|
-
`[gateway] Slack user aligned: ${email} \u2192 Agor user ${
|
|
1205
|
+
`[gateway] Slack user aligned: ${email} \u2192 Agor user ${shortId2(matchedUser.user_id)} (${matchedUser.name || matchedUser.email})`
|
|
768
1206
|
);
|
|
769
1207
|
user = await usersService.get(matchedUser.user_id);
|
|
770
1208
|
} else {
|
|
@@ -805,7 +1243,7 @@ ${chunk}` : chunk;
|
|
|
805
1243
|
const matchedUser = await this.usersRepo.findByEmailForAlignment(mappedEmail);
|
|
806
1244
|
if (matchedUser) {
|
|
807
1245
|
console.log(
|
|
808
|
-
`[gateway] GitHub user aligned via user_map: ${githubLogin} \u2192 ${mappedEmail} \u2192 Agor user ${
|
|
1246
|
+
`[gateway] GitHub user aligned via user_map: ${githubLogin} \u2192 ${mappedEmail} \u2192 Agor user ${shortId2(matchedUser.user_id)}`
|
|
809
1247
|
);
|
|
810
1248
|
user = await usersService.get(matchedUser.user_id);
|
|
811
1249
|
resolved = true;
|
|
@@ -821,7 +1259,7 @@ ${chunk}` : chunk;
|
|
|
821
1259
|
const matchedUser = await this.usersRepo.findByEmailForAlignment(githubEmail);
|
|
822
1260
|
if (matchedUser) {
|
|
823
1261
|
console.log(
|
|
824
|
-
`[gateway] GitHub user aligned via email: ${githubLogin} (${githubEmail}) \u2192 Agor user ${
|
|
1262
|
+
`[gateway] GitHub user aligned via email: ${githubLogin} (${githubEmail}) \u2192 Agor user ${shortId2(matchedUser.user_id)}`
|
|
825
1263
|
);
|
|
826
1264
|
user = await usersService.get(matchedUser.user_id);
|
|
827
1265
|
resolved = true;
|
|
@@ -854,6 +1292,7 @@ ${chunk}` : chunk;
|
|
|
854
1292
|
let sessionId;
|
|
855
1293
|
let created = false;
|
|
856
1294
|
let mcpAuthWarning;
|
|
1295
|
+
let mappingForCursor = existingMapping ?? null;
|
|
857
1296
|
const agenticConfig = channel.agentic_config;
|
|
858
1297
|
const agenticTool = agenticConfig?.agent ?? "claude-code";
|
|
859
1298
|
const {
|
|
@@ -877,20 +1316,25 @@ ${chunk}` : chunk;
|
|
|
877
1316
|
sessionId = existingMapping.session_id;
|
|
878
1317
|
await this.threadMapRepo.updateLastMessage(existingMapping.id);
|
|
879
1318
|
const existingMetadata = existingMapping.metadata ?? {};
|
|
880
|
-
|
|
1319
|
+
const mergedMetadata = {
|
|
881
1320
|
...existingMetadata,
|
|
882
1321
|
...data.metadata?.processing_comment_id ? { processing_comment_id: data.metadata.processing_comment_id } : {},
|
|
883
1322
|
...typeof data.metadata?.slack_user_id === "string" ? { slack_user_id: data.metadata.slack_user_id } : {},
|
|
884
1323
|
...typeof data.metadata?.slack_team_id === "string" ? { slack_team_id: data.metadata.slack_team_id } : {},
|
|
1324
|
+
...typeof data.metadata?.slack_bot_user_id === "string" ? { slack_bot_user_id: data.metadata.slack_bot_user_id } : {},
|
|
1325
|
+
...typeof data.metadata?.slack_thread_ts === "string" ? { slack_root_ts: data.metadata.slack_thread_ts } : {},
|
|
1326
|
+
...typeof data.metadata?.channel === "string" ? { slack_channel_id: data.metadata.channel } : {},
|
|
885
1327
|
...channel.channel_type === "slack" ? { slack_active_thread_id: data.thread_id } : {}
|
|
886
|
-
}
|
|
1328
|
+
};
|
|
1329
|
+
await this.threadMapRepo.updateMetadata(existingMapping.id, mergedMetadata);
|
|
1330
|
+
mappingForCursor = { ...existingMapping, metadata: mergedMetadata };
|
|
887
1331
|
if (channel.channel_type === "slack") {
|
|
888
1332
|
console.log(
|
|
889
|
-
`[gateway] Slack active outbound thread for session ${
|
|
1333
|
+
`[gateway] Slack active outbound thread for session ${shortId2(sessionId)} set to ${data.thread_id}`
|
|
890
1334
|
);
|
|
891
1335
|
}
|
|
892
1336
|
const sessionUrl = await this.fetchExistingSessionUrlForGatewayUser(sessionId, user);
|
|
893
|
-
if (sessionUrl) {
|
|
1337
|
+
if (sessionUrl && channel.channel_type !== "slack") {
|
|
894
1338
|
this.sendSystemMessage(
|
|
895
1339
|
channel,
|
|
896
1340
|
data.thread_id,
|
|
@@ -911,6 +1355,28 @@ ${chunk}` : chunk;
|
|
|
911
1355
|
channel_type: channel.channel_type,
|
|
912
1356
|
thread_id: data.thread_id
|
|
913
1357
|
};
|
|
1358
|
+
if (outboundSeed) {
|
|
1359
|
+
gatewaySource.outbound_seed_id = outboundSeed.id;
|
|
1360
|
+
gatewaySource.outbound_seed_thread_id = outboundSeed.platform_thread_id;
|
|
1361
|
+
gatewaySource.proactive_seed = true;
|
|
1362
|
+
}
|
|
1363
|
+
if (channel.channel_type === "slack") {
|
|
1364
|
+
if (typeof data.metadata?.slack_team_id === "string") {
|
|
1365
|
+
gatewaySource.slack_team_id = data.metadata.slack_team_id;
|
|
1366
|
+
}
|
|
1367
|
+
if (typeof data.metadata?.channel === "string") {
|
|
1368
|
+
gatewaySource.slack_channel_id = data.metadata.channel;
|
|
1369
|
+
}
|
|
1370
|
+
if (typeof data.metadata?.slack_channel_name === "string") {
|
|
1371
|
+
gatewaySource.slack_channel_name = data.metadata.slack_channel_name;
|
|
1372
|
+
}
|
|
1373
|
+
if (typeof data.metadata?.slack_thread_ts === "string") {
|
|
1374
|
+
gatewaySource.slack_root_ts = data.metadata.slack_thread_ts;
|
|
1375
|
+
}
|
|
1376
|
+
if (typeof data.metadata?.slack_message_ts === "string") {
|
|
1377
|
+
gatewaySource.slack_trigger_ts = data.metadata.slack_message_ts;
|
|
1378
|
+
}
|
|
1379
|
+
}
|
|
914
1380
|
if (channel.channel_type === "github") {
|
|
915
1381
|
try {
|
|
916
1382
|
const parsed = parseGitHubThreadId(data.thread_id);
|
|
@@ -973,16 +1439,29 @@ ${chunk}` : chunk;
|
|
|
973
1439
|
console.log(`[gateway] MCP auth warning for: ${unauthedMcpNames.join(", ")}`);
|
|
974
1440
|
}
|
|
975
1441
|
}
|
|
976
|
-
|
|
1442
|
+
const initialMappingMetadata = channel.channel_type === "slack" ? {
|
|
1443
|
+
...data.metadata ?? {},
|
|
1444
|
+
slack_active_thread_id: data.thread_id,
|
|
1445
|
+
...typeof data.metadata?.slack_thread_ts === "string" ? { slack_root_ts: data.metadata.slack_thread_ts } : {},
|
|
1446
|
+
...typeof data.metadata?.channel === "string" ? { slack_channel_id: data.metadata.channel } : {},
|
|
1447
|
+
...outboundSeed ? { outbound_seed_id: outboundSeed.id } : {}
|
|
1448
|
+
} : data.metadata ?? null;
|
|
1449
|
+
mappingForCursor = await this.threadMapRepo.create({
|
|
977
1450
|
channel_id: channel.id,
|
|
978
1451
|
thread_id: data.thread_id,
|
|
979
1452
|
session_id: session.session_id,
|
|
980
1453
|
branch_id: channel.target_branch_id,
|
|
981
1454
|
status: "active",
|
|
982
|
-
metadata:
|
|
1455
|
+
metadata: initialMappingMetadata
|
|
983
1456
|
});
|
|
1457
|
+
if (outboundSeed) {
|
|
1458
|
+
await this.outboundRepo.markConsumed(
|
|
1459
|
+
outboundSeed.id,
|
|
1460
|
+
session.session_id
|
|
1461
|
+
);
|
|
1462
|
+
}
|
|
984
1463
|
const sessionUrl = await this.fetchExistingSessionUrlForGatewayUser(sessionId, user);
|
|
985
|
-
if (sessionUrl) {
|
|
1464
|
+
if (sessionUrl || channel.channel_type === "slack") {
|
|
986
1465
|
this.sendSystemMessage(
|
|
987
1466
|
channel,
|
|
988
1467
|
data.thread_id,
|
|
@@ -992,7 +1471,7 @@ ${chunk}` : chunk;
|
|
|
992
1471
|
if (channel.channel_type === "github" && data.metadata?.processing_comment_id) {
|
|
993
1472
|
try {
|
|
994
1473
|
const connector = getConnector(channel.channel_type, channel.config);
|
|
995
|
-
const processingText = sessionUrl ? `\u23F3 Processing... [View session](${sessionUrl})` : `\u23F3 Processing in session \`${
|
|
1474
|
+
const processingText = sessionUrl ? `\u23F3 Processing... [View session](${sessionUrl})` : `\u23F3 Processing in session \`${shortId2(sessionId)}\`...`;
|
|
996
1475
|
await connector.sendMessage({
|
|
997
1476
|
threadId: data.thread_id,
|
|
998
1477
|
text: processingText,
|
|
@@ -1007,10 +1486,56 @@ ${chunk}` : chunk;
|
|
|
1007
1486
|
try {
|
|
1008
1487
|
const promptService = this.app.service("/sessions/:id/prompt");
|
|
1009
1488
|
let promptText = data.text;
|
|
1010
|
-
|
|
1489
|
+
let slackCursorTsToWrite;
|
|
1490
|
+
if (channel.channel_type === "slack" && !outboundSeed) {
|
|
1491
|
+
const currentTs = getSlackMessageTs(data.metadata);
|
|
1492
|
+
const mappingMetadata = mappingForCursor?.metadata ?? {};
|
|
1493
|
+
const lastDeliveredTs = typeof mappingMetadata?.slack_last_delivered_ts === "string" ? mappingMetadata.slack_last_delivered_ts : void 0;
|
|
1494
|
+
const connector = this.activeListeners.get(channel.id) ?? getConnector(channel.channel_type, channel.config);
|
|
1495
|
+
const historyConnector = connector;
|
|
1496
|
+
if (currentTs && typeof historyConnector.fetchThreadHistory === "function") {
|
|
1497
|
+
try {
|
|
1498
|
+
const slackHistoryThreadId = mappingForCursor?.thread_id ?? data.thread_id;
|
|
1499
|
+
const history = await historyConnector.fetchThreadHistory({
|
|
1500
|
+
threadId: slackHistoryThreadId,
|
|
1501
|
+
...created || !lastDeliveredTs ? {} : { oldestTs: lastDeliveredTs },
|
|
1502
|
+
latestTs: currentTs,
|
|
1503
|
+
inclusive: true,
|
|
1504
|
+
limit: 200,
|
|
1505
|
+
includeBotMessages: false,
|
|
1506
|
+
triggerTs: currentTs
|
|
1507
|
+
});
|
|
1508
|
+
const filteredMessages = lastDeliveredTs ? history.messages.filter(
|
|
1509
|
+
(message) => compareSlackTs(message.ts, lastDeliveredTs) > 0
|
|
1510
|
+
) : history.messages;
|
|
1511
|
+
promptText = formatSlackCatchUpPrompt({
|
|
1512
|
+
channel,
|
|
1513
|
+
threadId: slackHistoryThreadId,
|
|
1514
|
+
currentText: data.text,
|
|
1515
|
+
metadata: data.metadata,
|
|
1516
|
+
messages: filteredMessages.length > 0 ? filteredMessages : history.messages,
|
|
1517
|
+
hasMore: history.has_more,
|
|
1518
|
+
reason: created ? "initial_thread_context" : lastDeliveredTs ? "missed_since_last_mention" : "current_message"
|
|
1519
|
+
});
|
|
1520
|
+
slackCursorTsToWrite = currentTs;
|
|
1521
|
+
} catch (error) {
|
|
1522
|
+
console.warn("[gateway] Failed to fetch Slack thread catch-up context:", error);
|
|
1523
|
+
}
|
|
1524
|
+
} else if (currentTs) {
|
|
1525
|
+
slackCursorTsToWrite = currentTs;
|
|
1526
|
+
}
|
|
1527
|
+
}
|
|
1528
|
+
if (created && outboundSeed) {
|
|
1529
|
+
promptText = buildSeededThreadInitialPrompt({
|
|
1530
|
+
seed: outboundSeed,
|
|
1531
|
+
channel,
|
|
1532
|
+
replyText: data.text,
|
|
1533
|
+
metadata: data.metadata
|
|
1534
|
+
});
|
|
1535
|
+
} else if (created && channel.channel_type === "github") {
|
|
1011
1536
|
promptText = buildGitHubInitialPrompt(data.thread_id, data.text, data.metadata);
|
|
1012
1537
|
}
|
|
1013
|
-
const skipContext = created && channel.channel_type === "github";
|
|
1538
|
+
const skipContext = channel.channel_type === "slack" || created && (channel.channel_type === "github" || !!outboundSeed);
|
|
1014
1539
|
if (!skipContext) {
|
|
1015
1540
|
const gatewayCtx = buildGatewayContext(channel, data);
|
|
1016
1541
|
const contextPrefix = formatGatewayContext(gatewayCtx);
|
|
@@ -1018,18 +1543,38 @@ ${chunk}` : chunk;
|
|
|
1018
1543
|
promptText = contextPrefix + promptText;
|
|
1019
1544
|
}
|
|
1020
1545
|
}
|
|
1546
|
+
if (channel.channel_type === "slack") {
|
|
1547
|
+
promptText = prependSlackGatewayReplyNote(promptText);
|
|
1548
|
+
}
|
|
1021
1549
|
if (created && mcpAuthWarning) {
|
|
1022
1550
|
promptText = `${mcpAuthWarning}
|
|
1023
1551
|
|
|
1024
1552
|
${promptText}`;
|
|
1025
1553
|
}
|
|
1554
|
+
const tenantId = getCurrentTenantId2();
|
|
1026
1555
|
const task = await promptService.create(
|
|
1027
1556
|
{ prompt: promptText, permissionMode, messageSource: "gateway" },
|
|
1028
|
-
{
|
|
1557
|
+
{
|
|
1558
|
+
route: { id: sessionId },
|
|
1559
|
+
user,
|
|
1560
|
+
...tenantId ? { tenant: { tenant_id: tenantId, source: "explicit" } } : {}
|
|
1561
|
+
}
|
|
1029
1562
|
);
|
|
1563
|
+
if (channel.channel_type === "slack" && slackCursorTsToWrite && mappingForCursor) {
|
|
1564
|
+
const latestMapping = await this.threadMapRepo.findById(mappingForCursor.id);
|
|
1565
|
+
const latestMetadata = latestMapping?.metadata ?? {};
|
|
1566
|
+
const previousDelivered = typeof latestMetadata.slack_last_delivered_ts === "string" ? latestMetadata.slack_last_delivered_ts : void 0;
|
|
1567
|
+
if (compareSlackTs(slackCursorTsToWrite, previousDelivered) >= 0) {
|
|
1568
|
+
await this.threadMapRepo.updateMetadata(mappingForCursor.id, {
|
|
1569
|
+
...latestMetadata,
|
|
1570
|
+
slack_last_delivered_ts: slackCursorTsToWrite,
|
|
1571
|
+
slack_last_summon_ts: slackCursorTsToWrite
|
|
1572
|
+
});
|
|
1573
|
+
}
|
|
1574
|
+
}
|
|
1030
1575
|
if (task.status === "queued") {
|
|
1031
1576
|
console.log(
|
|
1032
|
-
`[gateway] Message queued for session ${
|
|
1577
|
+
`[gateway] Message queued for session ${shortId2(sessionId)} at position ${task.queue_position}`
|
|
1033
1578
|
);
|
|
1034
1579
|
this.sendSystemMessage(
|
|
1035
1580
|
channel,
|
|
@@ -1037,7 +1582,7 @@ ${promptText}`;
|
|
|
1037
1582
|
`Session is busy, message queued at position ${task.queue_position}`,
|
|
1038
1583
|
{ suppressSlack: true }
|
|
1039
1584
|
);
|
|
1040
|
-
|
|
1585
|
+
this.updateProgressAfterCommit({
|
|
1041
1586
|
session_id: sessionId,
|
|
1042
1587
|
state: "queued",
|
|
1043
1588
|
task_id: task.task_id,
|
|
@@ -1045,9 +1590,9 @@ ${promptText}`;
|
|
|
1045
1590
|
});
|
|
1046
1591
|
} else {
|
|
1047
1592
|
console.log(
|
|
1048
|
-
`[gateway] Prompt sent to session ${
|
|
1593
|
+
`[gateway] Prompt sent to session ${shortId2(sessionId)} via /sessions/:id/prompt`
|
|
1049
1594
|
);
|
|
1050
|
-
|
|
1595
|
+
this.updateProgressAfterCommit({
|
|
1051
1596
|
session_id: sessionId,
|
|
1052
1597
|
state: "working",
|
|
1053
1598
|
task_id: task.task_id
|
|
@@ -1056,7 +1601,7 @@ ${promptText}`;
|
|
|
1056
1601
|
} catch (error) {
|
|
1057
1602
|
console.error("[gateway] Failed to send prompt to session:", error);
|
|
1058
1603
|
this.sendSystemMessage(channel, data.thread_id, `Error sending prompt: ${error}`);
|
|
1059
|
-
|
|
1604
|
+
this.updateProgressAfterCommit({
|
|
1060
1605
|
session_id: sessionId,
|
|
1061
1606
|
state: "failed",
|
|
1062
1607
|
error_message: error instanceof Error ? error.message : String(error)
|
|
@@ -1083,7 +1628,7 @@ ${promptText}`;
|
|
|
1083
1628
|
return { routed: false };
|
|
1084
1629
|
}
|
|
1085
1630
|
console.log(
|
|
1086
|
-
`[gateway] Found mapping: channel=${
|
|
1631
|
+
`[gateway] Found mapping: channel=${shortId2(mapping.channel_id)}, thread=${mapping.thread_id}`
|
|
1087
1632
|
);
|
|
1088
1633
|
const channel = await this.channelRepo.findById(mapping.channel_id);
|
|
1089
1634
|
if (!channel?.enabled) {
|
|
@@ -1098,15 +1643,19 @@ ${promptText}`;
|
|
|
1098
1643
|
if (channel.channel_type === "github") {
|
|
1099
1644
|
this.githubMessageBuffer.set(data.session_id, data.message);
|
|
1100
1645
|
console.log(
|
|
1101
|
-
`[gateway] Buffered GitHub message for session ${
|
|
1646
|
+
`[gateway] Buffered GitHub message for session ${shortId2(data.session_id)} (${data.message.length} chars)`
|
|
1102
1647
|
);
|
|
1103
1648
|
return { routed: true, channelType: "github" };
|
|
1104
1649
|
}
|
|
1105
1650
|
try {
|
|
1106
1651
|
const connector = this.activeListeners.get(channel.id) ?? getConnector(channel.channel_type, channel.config);
|
|
1107
|
-
const
|
|
1652
|
+
const systemMeta = data.metadata?.system;
|
|
1653
|
+
const systemPrefixMatch = /^\s*\[system\]\s*/i.exec(data.message);
|
|
1654
|
+
const shouldRenderAsSystem = channel.channel_type === "slack" && (systemMeta?.render_hint === "context" || !!systemPrefixMatch);
|
|
1655
|
+
const payload = shouldRenderAsSystem ? formatGatewaySystemPayload("slack", data.message.replace(/^\s*\[system\]\s*/i, "").trim()) : normalizeOutbound(
|
|
1108
1656
|
connector.formatMessage ? connector.formatMessage(data.message) : data.message
|
|
1109
1657
|
);
|
|
1658
|
+
const { text, blocks } = payload;
|
|
1110
1659
|
const threadId = channel.channel_type === "slack" ? this.getActiveSlackThreadId(mapping) : mapping.thread_id;
|
|
1111
1660
|
const sentTs = await connector.sendMessage({
|
|
1112
1661
|
threadId,
|
|
@@ -1127,6 +1676,25 @@ ${promptText}`;
|
|
|
1127
1676
|
channelType: channel.channel_type
|
|
1128
1677
|
};
|
|
1129
1678
|
}
|
|
1679
|
+
/**
|
|
1680
|
+
* Schedule outbound routing after the current tenant-scoped database work
|
|
1681
|
+
* commits, then route inside a fresh tenant scope. Message after-hooks fire
|
|
1682
|
+
* while the newly-created row may still be transactional; routing immediately
|
|
1683
|
+
* can inherit a stale transaction object or query before the session/message
|
|
1684
|
+
* graph is visible on a new scoped connection.
|
|
1685
|
+
*/
|
|
1686
|
+
routeMessageAfterCommit(data, params) {
|
|
1687
|
+
deferWithTenantDatabaseScope(
|
|
1688
|
+
this.db,
|
|
1689
|
+
params,
|
|
1690
|
+
async () => {
|
|
1691
|
+
await this.routeMessage(data);
|
|
1692
|
+
},
|
|
1693
|
+
(error) => {
|
|
1694
|
+
console.warn("[gateway] Failed to route message after commit:", error);
|
|
1695
|
+
}
|
|
1696
|
+
);
|
|
1697
|
+
}
|
|
1130
1698
|
/**
|
|
1131
1699
|
* Flush the GitHub message buffer for a session.
|
|
1132
1700
|
*
|
|
@@ -1143,7 +1711,7 @@ ${promptText}`;
|
|
|
1143
1711
|
const mapping = await this.threadMapRepo.findBySession(sessionId);
|
|
1144
1712
|
if (!mapping) {
|
|
1145
1713
|
console.warn(
|
|
1146
|
-
`[gateway] flushGitHubBuffer: no thread mapping for session ${
|
|
1714
|
+
`[gateway] flushGitHubBuffer: no thread mapping for session ${shortId2(sessionId)}`
|
|
1147
1715
|
);
|
|
1148
1716
|
return;
|
|
1149
1717
|
}
|
|
@@ -1167,12 +1735,12 @@ ${promptText}`;
|
|
|
1167
1735
|
metadata: outboundMetadata
|
|
1168
1736
|
});
|
|
1169
1737
|
console.log(
|
|
1170
|
-
`[gateway] Flushed GitHub buffer for session ${
|
|
1738
|
+
`[gateway] Flushed GitHub buffer for session ${shortId2(sessionId)} \u2192 ${mapping.thread_id} (${bufferedMessage.length} chars)`
|
|
1171
1739
|
);
|
|
1172
1740
|
} catch (error) {
|
|
1173
1741
|
this.githubMessageBuffer.set(sessionId, bufferedMessage);
|
|
1174
1742
|
console.error(
|
|
1175
|
-
`[gateway] Failed to flush GitHub buffer for session ${
|
|
1743
|
+
`[gateway] Failed to flush GitHub buffer for session ${shortId2(sessionId)} (re-queued):`,
|
|
1176
1744
|
error
|
|
1177
1745
|
);
|
|
1178
1746
|
}
|
|
@@ -1243,7 +1811,7 @@ ${promptText}`;
|
|
|
1243
1811
|
if (connector.stopListening) {
|
|
1244
1812
|
await connector.stopListening();
|
|
1245
1813
|
}
|
|
1246
|
-
console.log(`[gateway] Listener stopped for channel ${
|
|
1814
|
+
console.log(`[gateway] Listener stopped for channel ${shortId2(channelId)}`);
|
|
1247
1815
|
} catch (error) {
|
|
1248
1816
|
console.error(
|
|
1249
1817
|
`[gateway] Error stopping listener for ${channelId} (old socket may still be alive):`,
|
|
@@ -1258,31 +1826,42 @@ ${promptText}`;
|
|
|
1258
1826
|
if (this.activeListeners.has(channel.id)) {
|
|
1259
1827
|
return;
|
|
1260
1828
|
}
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1829
|
+
const listenerTenantId = tenantIdFromGatewayChannel(channel) ?? getCurrentTenantId2();
|
|
1830
|
+
return runWithoutTenantDatabaseScope2(async () => {
|
|
1831
|
+
try {
|
|
1832
|
+
const connector = getConnector(channel.channel_type, channel.config);
|
|
1833
|
+
if (!connector.startListening) {
|
|
1834
|
+
return;
|
|
1835
|
+
}
|
|
1836
|
+
const callback = (msg) => {
|
|
1837
|
+
this.handleListenerInboundMessage(channel, listenerTenantId, msg).catch((error) => {
|
|
1838
|
+
console.error(
|
|
1839
|
+
`[gateway] Failed to process inbound message for channel ${channel.name}:`,
|
|
1840
|
+
error
|
|
1841
|
+
);
|
|
1842
|
+
});
|
|
1843
|
+
};
|
|
1844
|
+
await connector.startListening(callback);
|
|
1845
|
+
this.activeListeners.set(channel.id, connector);
|
|
1846
|
+
console.log(`[gateway] Socket Mode listener started for channel "${channel.name}"`);
|
|
1847
|
+
} catch (error) {
|
|
1848
|
+
console.error(`[gateway] Failed to start listener for channel "${channel.name}":`, error);
|
|
1265
1849
|
}
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
user_name: msg.userId,
|
|
1272
|
-
metadata: msg.metadata
|
|
1273
|
-
}).catch((error) => {
|
|
1274
|
-
console.error(
|
|
1275
|
-
`[gateway] Failed to process inbound message for channel ${channel.name}:`,
|
|
1276
|
-
error
|
|
1277
|
-
);
|
|
1278
|
-
});
|
|
1279
|
-
};
|
|
1280
|
-
await connector.startListening(callback);
|
|
1281
|
-
this.activeListeners.set(channel.id, connector);
|
|
1282
|
-
console.log(`[gateway] Socket Mode listener started for channel "${channel.name}"`);
|
|
1283
|
-
} catch (error) {
|
|
1284
|
-
console.error(`[gateway] Failed to start listener for channel "${channel.name}":`, error);
|
|
1850
|
+
});
|
|
1851
|
+
}
|
|
1852
|
+
async handleListenerInboundMessage(channel, tenantId, msg) {
|
|
1853
|
+
if (!tenantId) {
|
|
1854
|
+
throw new Error(`Missing tenant context for gateway listener channel ${channel.id}`);
|
|
1285
1855
|
}
|
|
1856
|
+
await runWithTenantDatabaseScope2(this.db, tenantId, async () => {
|
|
1857
|
+
await this.create({
|
|
1858
|
+
channel_key: channel.channel_key,
|
|
1859
|
+
thread_id: msg.threadId,
|
|
1860
|
+
text: msg.text,
|
|
1861
|
+
user_name: msg.userId,
|
|
1862
|
+
metadata: msg.metadata
|
|
1863
|
+
});
|
|
1864
|
+
});
|
|
1286
1865
|
}
|
|
1287
1866
|
/**
|
|
1288
1867
|
* Stop all active listeners (called on shutdown)
|
|
@@ -1293,7 +1872,7 @@ ${promptText}`;
|
|
|
1293
1872
|
if (connector.stopListening) {
|
|
1294
1873
|
await connector.stopListening();
|
|
1295
1874
|
}
|
|
1296
|
-
console.log(`[gateway] Listener stopped for channel ${
|
|
1875
|
+
console.log(`[gateway] Listener stopped for channel ${shortId2(channelId)}`);
|
|
1297
1876
|
} catch (error) {
|
|
1298
1877
|
console.error(`[gateway] Error stopping listener for ${channelId}:`, error);
|
|
1299
1878
|
}
|
|
@@ -1306,5 +1885,6 @@ function createGatewayService(db, app) {
|
|
|
1306
1885
|
}
|
|
1307
1886
|
export {
|
|
1308
1887
|
GatewayService,
|
|
1309
|
-
createGatewayService
|
|
1888
|
+
createGatewayService,
|
|
1889
|
+
tenantIdFromGatewayChannel
|
|
1310
1890
|
};
|