@capybara-hq/kernel 0.1.0-rc.1 → 0.1.0-rc.3
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/admin/admin.controller.d.ts +17 -17
- package/dist/admin/admin.controller.js +43 -26
- package/dist/admin/admin.module.d.ts +3 -0
- package/dist/admin/admin.module.js +22 -0
- package/dist/admin/extensions.controller.d.ts +14 -14
- package/dist/admin/extensions.controller.js +30 -17
- package/dist/admin/setup-lock.d.ts +16 -0
- package/dist/admin/setup-lock.js +47 -0
- package/dist/admin/setup.controller.d.ts +8 -8
- package/dist/admin/setup.controller.js +27 -25
- package/dist/admin/setup.service.d.ts +19 -27
- package/dist/admin/setup.service.js +61 -61
- package/dist/agents/agent-lookup.d.ts +53 -0
- package/dist/agents/agent-lookup.js +187 -0
- package/dist/agents/agents.controller.d.ts +1 -1
- package/dist/agents/agents.controller.js +14 -8
- package/dist/agents/agents.module.d.ts +7 -0
- package/dist/agents/agents.module.js +41 -0
- package/dist/agents/agents.service.d.ts +39 -58
- package/dist/agents/agents.service.js +280 -335
- package/dist/agents/definition.d.ts +39 -8
- package/dist/agents/definition.js +201 -17
- package/dist/agents/models.controller.d.ts +1 -1
- package/dist/agents/models.controller.js +2 -2
- package/dist/agents/templates.controller.d.ts +1 -1
- package/dist/agents/templates.controller.js +2 -2
- package/dist/agents/templates.d.ts +6 -8
- package/dist/agents/templates.js +39 -8
- package/dist/app.d.ts +93 -0
- package/dist/app.js +150 -0
- package/dist/catalog/admin-catalog.controller.d.ts +3 -3
- package/dist/catalog/admin-catalog.controller.js +27 -13
- package/dist/catalog/catalog-content.d.ts +185 -0
- package/dist/catalog/catalog-content.js +326 -0
- package/dist/catalog/catalog-items.d.ts +186 -0
- package/dist/catalog/catalog-items.js +410 -0
- package/dist/catalog/catalog.module.d.ts +14 -0
- package/dist/catalog/catalog.module.js +71 -0
- package/dist/catalog/catalog.service.d.ts +34 -188
- package/dist/catalog/catalog.service.js +155 -489
- package/dist/catalog/claude/agents.js +13 -10
- package/dist/catalog/cli.d.ts +3 -2
- package/dist/catalog/cli.js +13 -31
- package/dist/catalog/job-ids.d.ts +15 -0
- package/dist/catalog/job-ids.js +15 -0
- package/dist/catalog/jobs.d.ts +27 -0
- package/dist/catalog/jobs.js +70 -0
- package/dist/catalog/locks.d.ts +24 -0
- package/dist/catalog/locks.js +63 -0
- package/dist/catalog/marketplaces.controller.d.ts +4 -4
- package/dist/catalog/marketplaces.controller.js +22 -11
- package/dist/catalog/marketplaces.service.d.ts +31 -14
- package/dist/catalog/marketplaces.service.js +330 -256
- package/dist/catalog/org-catalog.controller.d.ts +4 -3
- package/dist/catalog/org-catalog.controller.js +29 -14
- package/dist/catalog/org-catalog.service.d.ts +32 -198
- package/dist/catalog/org-catalog.service.js +159 -400
- package/dist/catalog/plugin-import.d.ts +73 -34
- package/dist/catalog/plugin-import.js +356 -217
- package/dist/catalog/plugin-install.d.ts +83 -41
- package/dist/catalog/plugin-install.js +421 -269
- package/dist/catalog/plugin-upgrade.d.ts +59 -4
- package/dist/catalog/plugin-upgrade.js +407 -282
- package/dist/catalog/requests.service.d.ts +27 -15
- package/dist/catalog/requests.service.js +201 -145
- package/dist/catalog/upgrade-targets.d.ts +4 -7
- package/dist/channels/actions.d.ts +6 -4
- package/dist/channels/actions.js +1 -1
- package/dist/channels/cards.d.ts +10 -4
- package/dist/channels/cards.js +16 -8
- package/dist/channels/channels.module.d.ts +40 -0
- package/dist/channels/channels.module.js +128 -0
- package/dist/channels/connections.controller.d.ts +1 -1
- package/dist/channels/connections.controller.js +11 -6
- package/dist/channels/connections.service.d.ts +43 -21
- package/dist/channels/connections.service.js +236 -131
- package/dist/channels/inbound.d.ts +34 -38
- package/dist/channels/inbound.js +107 -41
- package/dist/channels/job-ids.d.ts +10 -0
- package/dist/channels/job-ids.js +10 -0
- package/dist/channels/jobs.d.ts +85 -0
- package/dist/channels/jobs.js +157 -0
- package/dist/channels/outbound.d.ts +60 -82
- package/dist/channels/outbound.js +165 -194
- package/dist/channels/supervisor.d.ts +88 -46
- package/dist/channels/supervisor.js +230 -132
- package/dist/channels/threads.d.ts +29 -8
- package/dist/channels/threads.js +71 -13
- package/dist/channels/webhook.d.ts +20 -14
- package/dist/channels/webhook.js +51 -20
- package/dist/config/load.d.ts +3 -2
- package/dist/config/load.js +3 -2
- package/dist/config/nacos-source.js +11 -2
- package/dist/config/schema.d.ts +1 -0
- package/dist/config/schema.js +12 -6
- package/dist/conversations/access.d.ts +29 -0
- package/dist/conversations/access.js +86 -0
- package/dist/conversations/artifacts.d.ts +11 -11
- package/dist/conversations/artifacts.js +36 -10
- package/dist/conversations/attachments.controller.d.ts +1 -1
- package/dist/conversations/attachments.controller.js +8 -6
- package/dist/conversations/attachments.module.d.ts +7 -0
- package/dist/conversations/attachments.module.js +25 -0
- package/dist/conversations/attachments.service.d.ts +30 -22
- package/dist/conversations/attachments.service.js +119 -46
- package/dist/conversations/conversations.controller.d.ts +8 -7
- package/dist/conversations/conversations.controller.js +59 -29
- package/dist/conversations/conversations.module.d.ts +8 -0
- package/dist/conversations/conversations.module.js +69 -0
- package/dist/conversations/conversations.service.d.ts +40 -38
- package/dist/conversations/conversations.service.js +130 -140
- package/dist/conversations/event-log.d.ts +39 -18
- package/dist/conversations/event-log.js +93 -27
- package/dist/conversations/events.d.ts +23 -3
- package/dist/conversations/events.js +26 -14
- package/dist/conversations/files.d.ts +10 -10
- package/dist/conversations/files.js +37 -11
- package/dist/conversations/idem-keys.d.ts +5 -0
- package/dist/conversations/idem-keys.js +5 -0
- package/dist/conversations/job-ids.d.ts +6 -0
- package/dist/conversations/job-ids.js +6 -0
- package/dist/conversations/outputs-read.d.ts +11 -11
- package/dist/conversations/outputs-read.js +31 -7
- package/dist/conversations/queue.d.ts +48 -56
- package/dist/conversations/queue.js +13 -289
- package/dist/conversations/queue.service.d.ts +60 -0
- package/dist/conversations/queue.service.js +343 -0
- package/dist/conversations/sandbox-status.d.ts +13 -10
- package/dist/conversations/sandbox-status.js +36 -8
- package/dist/conversations/titles.d.ts +71 -24
- package/dist/conversations/titles.js +159 -63
- package/dist/ctx/bus.js +9 -3
- package/dist/ctx/create-ctx.d.ts +6 -0
- package/dist/ctx/create-ctx.js +7 -9
- package/dist/ctx/lock.d.ts +7 -3
- package/dist/ctx/lock.js +9 -20
- package/dist/ctx/secrets.d.ts +10 -2
- package/dist/ctx/secrets.js +7 -3
- package/dist/db/kernel-schema.d.ts +4 -4
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +1 -0
- package/dist/errors.d.ts +1 -0
- package/dist/errors.js +1 -0
- package/dist/evals/budget.d.ts +42 -21
- package/dist/evals/budget.js +114 -62
- package/dist/evals/evals.module.d.ts +31 -0
- package/dist/evals/evals.module.js +114 -0
- package/dist/evals/jobs.d.ts +20 -0
- package/dist/evals/jobs.js +45 -0
- package/dist/evals/recorded-tools.d.ts +27 -1
- package/dist/evals/recorded-tools.js +85 -10
- package/dist/evals/run-replay.d.ts +61 -8
- package/dist/evals/run-replay.js +159 -85
- package/dist/evals/runs.controller.d.ts +1 -1
- package/dist/evals/runs.controller.js +17 -8
- package/dist/evals/runs.service.d.ts +23 -45
- package/dist/evals/runs.service.js +245 -234
- package/dist/evals/sets.controller.d.ts +1 -1
- package/dist/evals/sets.controller.js +17 -8
- package/dist/evals/sets.service.d.ts +22 -6
- package/dist/evals/sets.service.js +248 -194
- package/dist/evals/snapshot.d.ts +2 -2
- package/dist/evals/step-replay.d.ts +2 -2
- package/dist/evals/step-replay.js +1 -1
- package/dist/evals/trajectory.controller.d.ts +1 -1
- package/dist/evals/trajectory.controller.js +11 -7
- package/dist/evals/trajectory.d.ts +2 -2
- package/dist/evals/trajectory.service.d.ts +5 -4
- package/dist/evals/trajectory.service.js +30 -7
- package/dist/evals/worker.d.ts +44 -27
- package/dist/evals/worker.js +220 -121
- package/dist/extensions/admin-ops.d.ts +61 -33
- package/dist/extensions/admin-ops.js +248 -154
- package/dist/extensions/admin-view.d.ts +38 -27
- package/dist/extensions/admin-view.js +126 -55
- package/dist/extensions/approvals.d.ts +12 -8
- package/dist/extensions/approvals.js +73 -46
- package/dist/extensions/blobs.d.ts +27 -10
- package/dist/extensions/blobs.js +111 -45
- package/dist/extensions/bootstrap.d.ts +58 -31
- package/dist/extensions/bootstrap.js +175 -121
- package/dist/extensions/cli.d.ts +20 -10
- package/dist/extensions/cli.js +41 -96
- package/dist/extensions/config-issues.d.ts +7 -0
- package/dist/extensions/config-issues.js +31 -0
- package/dist/extensions/deployment-config-store.d.ts +49 -0
- package/dist/extensions/deployment-config-store.js +133 -0
- package/dist/extensions/deployment-config.d.ts +58 -67
- package/dist/extensions/deployment-config.js +202 -230
- package/dist/extensions/enabled.d.ts +5 -5
- package/dist/extensions/extensions.module.d.ts +8 -0
- package/dist/extensions/extensions.module.js +77 -0
- package/dist/extensions/hooks.d.ts +3 -2
- package/dist/extensions/hooks.js +1 -1
- package/dist/extensions/host.d.ts +72 -68
- package/dist/extensions/host.js +191 -152
- package/dist/extensions/installs.d.ts +49 -16
- package/dist/extensions/installs.js +128 -32
- package/dist/extensions/job-ids.d.ts +6 -0
- package/dist/extensions/job-ids.js +6 -0
- package/dist/extensions/lifecycle-topics.d.ts +18 -0
- package/dist/extensions/lifecycle-topics.js +18 -0
- package/dist/extensions/lifecycle.d.ts +35 -47
- package/dist/extensions/lifecycle.js +103 -39
- package/dist/extensions/locks.d.ts +33 -0
- package/dist/extensions/locks.js +86 -0
- package/dist/extensions/migrate-lock.d.ts +3 -4
- package/dist/extensions/org-config.controller.d.ts +1 -1
- package/dist/extensions/org-config.controller.js +8 -5
- package/dist/extensions/org-config.d.ts +48 -46
- package/dist/extensions/org-config.js +284 -226
- package/dist/extensions/registry.d.ts +50 -2
- package/dist/extensions/registry.js +89 -4
- package/dist/extensions/sources.d.ts +12 -8
- package/dist/extensions/sources.js +34 -13
- package/dist/files/files.module.d.ts +3 -0
- package/dist/files/files.module.js +22 -0
- package/dist/files/previewers.controller.d.ts +7 -2
- package/dist/files/previewers.controller.js +17 -9
- package/dist/files/previewers.d.ts +13 -18
- package/dist/files/previewers.js +83 -36
- package/dist/http/adapter.d.ts +3 -0
- package/dist/http/adapter.js +25 -0
- package/dist/http/api.module.d.ts +3 -110
- package/dist/http/api.module.js +47 -355
- package/dist/http/app.d.ts +11 -15
- package/dist/http/app.js +17 -62
- package/dist/http/error-filter.module.d.ts +5 -0
- package/dist/http/error-filter.module.js +18 -0
- package/dist/http/error.filter.js +2 -2
- package/dist/identity/accounts.d.ts +82 -29
- package/dist/identity/accounts.js +294 -175
- package/dist/identity/api-tokens.d.ts +11 -7
- package/dist/identity/api-tokens.js +71 -44
- package/dist/identity/audit.d.ts +7 -4
- package/dist/identity/audit.js +5 -1
- package/dist/identity/auth.controller.d.ts +11 -10
- package/dist/identity/auth.controller.js +31 -25
- package/dist/identity/auth.guard.d.ts +3 -3
- package/dist/identity/auth.guard.js +6 -4
- package/dist/identity/binding.d.ts +9 -11
- package/dist/identity/binding.js +41 -13
- package/dist/identity/enterprise-admin.d.ts +18 -12
- package/dist/identity/enterprise-admin.js +67 -13
- package/dist/identity/external-identity-lock.d.ts +17 -0
- package/dist/identity/external-identity-lock.js +39 -0
- package/dist/identity/external.d.ts +19 -15
- package/dist/identity/external.js +163 -125
- package/dist/identity/identity.module.d.ts +6 -0
- package/dist/identity/identity.module.js +56 -0
- package/dist/identity/me.controller.d.ts +16 -15
- package/dist/identity/me.controller.js +37 -31
- package/dist/identity/sessions.d.ts +12 -10
- package/dist/identity/sessions.js +74 -42
- package/dist/identity/settings.d.ts +20 -14
- package/dist/identity/settings.js +86 -58
- package/dist/identity/sso.controller.d.ts +7 -7
- package/dist/identity/sso.controller.js +13 -9
- package/dist/identity/sso.d.ts +9 -12
- package/dist/identity/sso.js +54 -24
- package/dist/inbox/inbox.module.d.ts +3 -0
- package/dist/inbox/inbox.module.js +22 -0
- package/dist/inbox/inbox.service.d.ts +7 -9
- package/dist/inbox/inbox.service.js +32 -11
- package/dist/index.d.ts +16 -11
- package/dist/index.js +9 -6
- package/dist/infra/cache/cache.module.d.ts +3 -0
- package/dist/infra/cache/cache.module.js +16 -0
- package/dist/infra/cache/cache.service.d.ts +21 -0
- package/dist/infra/cache/cache.service.js +80 -0
- package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
- package/dist/infra/cache/cacheable.decorator.js +83 -0
- package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
- package/dist/infra/cli/kernel-cli.module.js +165 -0
- package/dist/infra/close-within.d.ts +15 -0
- package/dist/infra/close-within.js +36 -0
- package/dist/infra/config/config.module.d.ts +13 -0
- package/dist/infra/config/config.module.js +39 -0
- package/dist/infra/config/kernel-config.service.d.ts +25 -0
- package/dist/infra/config/kernel-config.service.js +126 -0
- package/dist/infra/database/after-commit.d.ts +6 -0
- package/dist/infra/database/after-commit.js +9 -0
- package/dist/infra/database/database.module.d.ts +25 -0
- package/dist/infra/database/database.module.js +90 -0
- package/dist/infra/database/kernel-db.d.ts +22 -0
- package/dist/infra/database/kernel-db.js +65 -0
- package/dist/infra/database/transaction-host.d.ts +50 -0
- package/dist/infra/database/transaction-host.js +125 -0
- package/dist/infra/database/transactional.decorator.d.ts +15 -0
- package/dist/infra/database/transactional.decorator.js +27 -0
- package/dist/infra/database/xact-lock.d.ts +17 -0
- package/dist/infra/database/xact-lock.js +43 -0
- package/dist/infra/events/kernel-events.d.ts +96 -0
- package/dist/infra/events/kernel-events.js +65 -0
- package/dist/infra/health/health.controller.d.ts +26 -0
- package/dist/infra/health/health.controller.js +104 -0
- package/dist/infra/health/health.module.d.ts +9 -0
- package/dist/infra/health/health.module.js +24 -0
- package/dist/infra/health/health.options.d.ts +10 -0
- package/dist/infra/health/health.options.js +15 -0
- package/dist/infra/health/shutdown-state.d.ts +6 -0
- package/dist/infra/health/shutdown-state.js +2 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
- package/dist/infra/lifecycle/process-guards.d.ts +52 -0
- package/dist/infra/lifecycle/process-guards.js +86 -0
- package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
- package/dist/infra/lifecycle/shutdown-signals.js +48 -0
- package/dist/infra/lock/key-template.d.ts +13 -0
- package/dist/infra/lock/key-template.js +46 -0
- package/dist/infra/lock/lock.module.d.ts +3 -0
- package/dist/infra/lock/lock.module.js +16 -0
- package/dist/infra/lock/lock.service.d.ts +120 -0
- package/dist/infra/lock/lock.service.js +343 -0
- package/dist/infra/lock/shared-lease.d.ts +44 -0
- package/dist/infra/lock/shared-lease.js +121 -0
- package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
- package/dist/infra/lock/with-lock.decorator.js +49 -0
- package/dist/infra/logging/logging.module.d.ts +16 -0
- package/dist/infra/logging/logging.module.js +34 -0
- package/dist/infra/queue/configured-processor.d.ts +18 -0
- package/dist/infra/queue/configured-processor.js +23 -0
- package/dist/infra/queue/job-failure.d.ts +18 -0
- package/dist/infra/queue/job-failure.js +26 -0
- package/dist/infra/queue/queue-shutdown.d.ts +27 -0
- package/dist/infra/queue/queue-shutdown.js +81 -0
- package/dist/infra/queue/queue.module.d.ts +16 -0
- package/dist/infra/queue/queue.module.js +61 -0
- package/dist/infra/queue/redis-connection.d.ts +7 -0
- package/dist/infra/queue/redis-connection.js +18 -0
- package/dist/infra/queue/retired-schedulers.d.ts +7 -0
- package/dist/infra/queue/retired-schedulers.js +9 -0
- package/dist/infra/queue/run-job.d.ts +16 -0
- package/dist/infra/queue/run-job.js +19 -0
- package/dist/infra/redis/redis.module.d.ts +24 -0
- package/dist/infra/redis/redis.module.js +87 -0
- package/dist/infra/schedule/cron-tick.d.ts +12 -0
- package/dist/infra/schedule/cron-tick.js +25 -0
- package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
- package/dist/infra/schedule/locked-cron.decorator.js +53 -0
- package/dist/infra/schedule/locked-interval.d.ts +69 -0
- package/dist/infra/schedule/locked-interval.js +190 -0
- package/dist/infra/schedule/locked-tick.d.ts +90 -0
- package/dist/infra/schedule/locked-tick.js +137 -0
- package/dist/infra/schedule/schedule.module.d.ts +8 -0
- package/dist/infra/schedule/schedule.module.js +27 -0
- package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
- package/dist/infra/schedule/scheduled-runs.js +163 -0
- package/dist/infra/swagger/swagger.d.ts +16 -0
- package/dist/infra/swagger/swagger.js +31 -0
- package/dist/infra/throttler/credential-throttler.d.ts +35 -0
- package/dist/infra/throttler/credential-throttler.js +77 -0
- package/dist/infra/throttler/named-throttlers.d.ts +31 -0
- package/dist/infra/throttler/named-throttlers.js +119 -0
- package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
- package/dist/infra/throttler/redis-throttler-storage.js +130 -0
- package/dist/infra/throttler/throttler.guard.d.ts +23 -0
- package/dist/infra/throttler/throttler.guard.js +68 -0
- package/dist/infra/throttler/throttler.module.d.ts +15 -0
- package/dist/infra/throttler/throttler.module.js +53 -0
- package/dist/infra/tokens.d.ts +15 -0
- package/dist/infra/tokens.js +15 -0
- package/dist/infra/validation/create-zod-dto.d.ts +23 -0
- package/dist/infra/validation/create-zod-dto.js +35 -0
- package/dist/infra/validation/parse-with-zod.d.ts +7 -0
- package/dist/infra/validation/parse-with-zod.js +12 -0
- package/dist/infra/validation/validation.module.d.ts +3 -0
- package/dist/infra/validation/validation.module.js +16 -0
- package/dist/infra/validation/zod-params.d.ts +7 -0
- package/dist/infra/validation/zod-params.js +42 -0
- package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
- package/dist/infra/validation/zod-validation.pipe.js +31 -0
- package/dist/kernel.d.ts +9 -244
- package/dist/kernel.js +8 -1305
- package/dist/kernel.module.d.ts +17 -0
- package/dist/kernel.module.js +136 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
- package/dist/lifecycle/kernel-lifecycle.js +456 -0
- package/dist/lifecycle/tokens.d.ts +3 -0
- package/dist/lifecycle/tokens.js +3 -0
- package/dist/log-context.d.ts +2 -0
- package/dist/log-context.js +4 -0
- package/dist/models/models.module.d.ts +3 -0
- package/dist/models/models.module.js +24 -0
- package/dist/models/prices.d.ts +8 -2
- package/dist/models/prices.js +65 -37
- package/dist/models/purposes.controller.d.ts +1 -1
- package/dist/models/purposes.controller.js +5 -6
- package/dist/models/purposes.d.ts +35 -13
- package/dist/models/purposes.js +101 -51
- package/dist/orgs/directory-sync.controller.d.ts +1 -1
- package/dist/orgs/directory-sync.controller.js +2 -2
- package/dist/orgs/directory-sync.d.ts +61 -31
- package/dist/orgs/directory-sync.js +212 -125
- package/dist/orgs/invitations.controller.d.ts +8 -8
- package/dist/orgs/invitations.controller.js +27 -26
- package/dist/orgs/invitations.service.d.ts +12 -9
- package/dist/orgs/invitations.service.js +130 -92
- package/dist/orgs/job-ids.d.ts +8 -0
- package/dist/orgs/job-ids.js +8 -0
- package/dist/orgs/members.service.d.ts +19 -12
- package/dist/orgs/members.service.js +161 -117
- package/dist/orgs/offboarding.d.ts +54 -57
- package/dist/orgs/offboarding.js +161 -71
- package/dist/orgs/org-lock.d.ts +28 -19
- package/dist/orgs/org-lock.js +81 -35
- package/dist/orgs/org.guard.d.ts +1 -1
- package/dist/orgs/org.guard.js +2 -2
- package/dist/orgs/orgs.controller.d.ts +13 -13
- package/dist/orgs/orgs.controller.js +29 -17
- package/dist/orgs/orgs.module.d.ts +6 -0
- package/dist/orgs/orgs.module.js +68 -0
- package/dist/orgs/orgs.service.d.ts +30 -19
- package/dist/orgs/orgs.service.js +139 -86
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.controller.js +8 -6
- package/dist/orgs/settings.service.d.ts +16 -10
- package/dist/orgs/settings.service.js +77 -48
- package/dist/overrides.d.ts +56 -0
- package/dist/overrides.js +30 -0
- package/dist/roles/gateway-role.d.ts +43 -0
- package/dist/roles/gateway-role.js +98 -0
- package/dist/roles/gateway.module.d.ts +8 -0
- package/dist/roles/gateway.module.js +28 -0
- package/dist/roles/worker-role.d.ts +63 -0
- package/dist/roles/worker-role.js +144 -0
- package/dist/roles/worker.module.d.ts +14 -0
- package/dist/roles/worker.module.js +90 -0
- package/dist/runtime/abort.js +19 -2
- package/dist/runtime/checkpointer.d.ts +8 -3
- package/dist/runtime/checkpointer.js +87 -55
- package/dist/runtime/context/build.d.ts +6 -6
- package/dist/runtime/context/build.js +18 -8
- package/dist/runtime/context/claude-tools.d.ts +2 -1
- package/dist/runtime/context/claude-tools.js +9 -10
- package/dist/runtime/context/legacy-text.d.ts +22 -0
- package/dist/runtime/context/legacy-text.js +37 -0
- package/dist/runtime/context/skills.d.ts +29 -11
- package/dist/runtime/context/skills.js +37 -30
- package/dist/runtime/conversation-lock.d.ts +20 -11
- package/dist/runtime/conversation-lock.js +62 -72
- package/dist/runtime/hook-calls.d.ts +3 -3
- package/dist/runtime/hook-calls.js +1 -6
- package/dist/runtime/job-ids.d.ts +10 -0
- package/dist/runtime/job-ids.js +10 -0
- package/dist/runtime/langgraph-loop.js +1 -1
- package/dist/runtime/loop.d.ts +8 -1
- package/dist/runtime/loop.js +14 -0
- package/dist/runtime/maintenance-queue.d.ts +10 -0
- package/dist/runtime/maintenance-queue.js +10 -0
- package/dist/runtime/maintenance.d.ts +45 -74
- package/dist/runtime/maintenance.js +139 -137
- package/dist/runtime/model-call.d.ts +7 -4
- package/dist/runtime/model-call.js +25 -58
- package/dist/runtime/providers.d.ts +17 -6
- package/dist/runtime/providers.js +66 -25
- package/dist/runtime/quota.d.ts +17 -3
- package/dist/runtime/quota.js +27 -2
- package/dist/runtime/retired-schedulers.d.ts +7 -0
- package/dist/runtime/retired-schedulers.js +31 -0
- package/dist/runtime/run-control.d.ts +33 -0
- package/dist/runtime/run-control.js +77 -0
- package/dist/runtime/run-finish.d.ts +27 -18
- package/dist/runtime/run-finish.js +98 -51
- package/dist/runtime/run-jobs.d.ts +48 -0
- package/dist/runtime/run-jobs.js +95 -0
- package/dist/runtime/run-processors.d.ts +60 -0
- package/dist/runtime/run-processors.js +185 -0
- package/dist/runtime/run-queue.d.ts +32 -57
- package/dist/runtime/run-queue.js +291 -295
- package/dist/runtime/run-steps.d.ts +39 -0
- package/dist/runtime/run-steps.js +96 -0
- package/dist/runtime/run-worker.d.ts +122 -76
- package/dist/runtime/run-worker.js +343 -229
- package/dist/runtime/runtime.module.d.ts +10 -0
- package/dist/runtime/runtime.module.js +112 -0
- package/dist/runtime/step-log.d.ts +40 -0
- package/dist/runtime/step-log.js +94 -0
- package/dist/runtime/stream.controller.d.ts +5 -8
- package/dist/runtime/stream.controller.js +14 -12
- package/dist/runtime/stream.d.ts +24 -6
- package/dist/runtime/stream.js +78 -7
- package/dist/runtime/subagents/child.d.ts +3 -44
- package/dist/runtime/subagents/child.js +0 -79
- package/dist/runtime/subagents/definition.d.ts +5 -10
- package/dist/runtime/subagents/definition.js +13 -14
- package/dist/runtime/subagents/dispatch.d.ts +89 -8
- package/dist/runtime/subagents/dispatch.js +137 -142
- package/dist/runtime/subagents/limits.d.ts +9 -4
- package/dist/runtime/subagents/limits.js +4 -2
- package/dist/runtime/subagents/org-agents.d.ts +4 -4
- package/dist/runtime/subagents/org-agents.js +3 -2
- package/dist/runtime/subagents/progress.d.ts +2 -2
- package/dist/runtime/subagents/roster.d.ts +4 -4
- package/dist/runtime/subagents/roster.js +2 -2
- package/dist/runtime/subagents/skill-fork.d.ts +8 -9
- package/dist/runtime/subagents/skill-fork.js +17 -6
- package/dist/runtime/subagents/subagents.service.d.ts +40 -0
- package/dist/runtime/subagents/subagents.service.js +101 -0
- package/dist/runtime/usage-report.d.ts +94 -52
- package/dist/runtime/usage-report.js +200 -100
- package/dist/runtime/waits.d.ts +127 -59
- package/dist/runtime/waits.js +433 -210
- package/dist/sandbox/job-ids.d.ts +10 -0
- package/dist/sandbox/job-ids.js +10 -0
- package/dist/sandbox/jobs.d.ts +41 -0
- package/dist/sandbox/jobs.js +113 -0
- package/dist/sandbox/leases.d.ts +39 -31
- package/dist/sandbox/leases.js +117 -257
- package/dist/sandbox/providers.d.ts +19 -0
- package/dist/sandbox/providers.js +38 -0
- package/dist/sandbox/sandbox.module.d.ts +8 -0
- package/dist/sandbox/sandbox.module.js +30 -0
- package/dist/sandbox/sandbox.service.d.ts +24 -29
- package/dist/sandbox/sandbox.service.js +106 -75
- package/dist/skills/catalog.d.ts +37 -24
- package/dist/skills/catalog.js +100 -57
- package/dist/skills/changes.controller.d.ts +4 -4
- package/dist/skills/changes.controller.js +15 -9
- package/dist/skills/changes.service.d.ts +30 -20
- package/dist/skills/changes.service.js +425 -367
- package/dist/skills/invocable.controller.d.ts +1 -1
- package/dist/skills/invocable.controller.js +8 -5
- package/dist/skills/invocation-keys.d.ts +1 -1
- package/dist/skills/invocation-keys.js +1 -1
- package/dist/skills/invoke.d.ts +17 -16
- package/dist/skills/invoke.js +53 -21
- package/dist/skills/skills.controller.d.ts +1 -1
- package/dist/skills/skills.controller.js +11 -6
- package/dist/skills/skills.module.d.ts +6 -0
- package/dist/skills/skills.module.js +30 -0
- package/dist/skills/skills.service.d.ts +47 -30
- package/dist/skills/skills.service.js +221 -158
- package/dist/storage/job-ids.d.ts +6 -0
- package/dist/storage/job-ids.js +6 -0
- package/dist/storage/purge.d.ts +22 -7
- package/dist/storage/purge.js +55 -3
- package/dist/storage/storage.module.d.ts +6 -0
- package/dist/storage/storage.module.js +23 -0
- package/dist/storage/storage.service.d.ts +18 -4
- package/dist/storage/storage.service.js +44 -3
- package/dist/tools/approvals.controller.d.ts +1 -1
- package/dist/tools/approvals.controller.js +12 -8
- package/dist/tools/approvals.service.d.ts +33 -25
- package/dist/tools/approvals.service.js +343 -259
- package/dist/tools/breaker.d.ts +2 -2
- package/dist/tools/breaker.js +21 -3
- package/dist/tools/builtin-names.d.ts +73 -0
- package/dist/tools/builtin-names.js +116 -0
- package/dist/tools/builtins/agent.d.ts +7 -7
- package/dist/tools/builtins/agent.js +7 -11
- package/dist/tools/builtins/ask-user.d.ts +3 -3
- package/dist/tools/builtins/ask-user.js +3 -3
- package/dist/tools/builtins/builtin-tools.d.ts +21 -0
- package/dist/tools/builtins/builtin-tools.js +80 -0
- package/dist/tools/builtins/read-tool-output.d.ts +3 -3
- package/dist/tools/builtins/read-tool-output.js +3 -3
- package/dist/tools/builtins/sandbox/bash.d.ts +5 -5
- package/dist/tools/builtins/sandbox/bash.js +33 -30
- package/dist/tools/builtins/sandbox/common.d.ts +5 -4
- package/dist/tools/builtins/sandbox/common.js +2 -2
- package/dist/tools/builtins/sandbox/deliver.d.ts +1 -1
- package/dist/tools/builtins/sandbox/deliver.js +13 -13
- package/dist/tools/builtins/sandbox/edit.d.ts +1 -1
- package/dist/tools/builtins/sandbox/edit.js +42 -31
- package/dist/tools/builtins/sandbox/file-state.d.ts +34 -0
- package/dist/tools/builtins/sandbox/file-state.js +34 -0
- package/dist/tools/builtins/sandbox/glob-match.d.ts +1 -1
- package/dist/tools/builtins/sandbox/glob-match.js +1 -1
- package/dist/tools/builtins/sandbox/glob.d.ts +1 -1
- package/dist/tools/builtins/sandbox/glob.js +6 -6
- package/dist/tools/builtins/sandbox/grep.d.ts +7 -4
- package/dist/tools/builtins/sandbox/grep.js +149 -32
- package/dist/tools/builtins/sandbox/index.d.ts +1 -1
- package/dist/tools/builtins/sandbox/index.js +1 -1
- package/dist/tools/builtins/sandbox/read.d.ts +2 -2
- package/dist/tools/builtins/sandbox/read.js +22 -15
- package/dist/tools/builtins/sandbox/write.d.ts +1 -1
- package/dist/tools/builtins/sandbox/write.js +38 -34
- package/dist/tools/builtins/skill-load.d.ts +6 -6
- package/dist/tools/builtins/skill-load.js +33 -17
- package/dist/tools/builtins/skill-write.d.ts +4 -4
- package/dist/tools/builtins/skill-write.js +10 -10
- package/dist/tools/builtins/tool-search.d.ts +13 -9
- package/dist/tools/builtins/tool-search.js +25 -14
- package/dist/tools/canonical-json.d.ts +6 -0
- package/dist/tools/canonical-json.js +16 -0
- package/dist/tools/connector-content.controller.d.ts +1 -1
- package/dist/tools/connector-content.controller.js +11 -6
- package/dist/tools/connector-content.d.ts +12 -15
- package/dist/tools/connector-content.js +53 -18
- package/dist/tools/connectors.controller.d.ts +1 -1
- package/dist/tools/connectors.controller.js +21 -10
- package/dist/tools/connectors.service.d.ts +31 -13
- package/dist/tools/connectors.service.js +438 -348
- package/dist/tools/credentials.d.ts +17 -20
- package/dist/tools/credentials.js +55 -34
- package/dist/tools/display-names.d.ts +9 -0
- package/dist/tools/display-names.js +24 -0
- package/dist/tools/drift.d.ts +29 -41
- package/dist/tools/drift.js +116 -84
- package/dist/tools/elicitation.js +1 -1
- package/dist/tools/info.d.ts +32 -13
- package/dist/tools/info.js +88 -39
- package/dist/tools/job-ids.d.ts +13 -0
- package/dist/tools/job-ids.js +15 -0
- package/dist/tools/jobs.d.ts +24 -0
- package/dist/tools/jobs.js +69 -0
- package/dist/tools/legacy-data.d.ts +34 -0
- package/dist/tools/legacy-data.js +76 -0
- package/dist/tools/legacy-keys.d.ts +51 -0
- package/dist/tools/legacy-keys.js +115 -0
- package/dist/tools/naming.d.ts +1 -5
- package/dist/tools/naming.js +1 -7
- package/dist/tools/oauth/flow-paths.d.ts +16 -0
- package/dist/tools/oauth/flow-paths.js +38 -0
- package/dist/tools/oauth/flow.d.ts +30 -30
- package/dist/tools/oauth/flow.js +109 -81
- package/dist/tools/oauth/oauth.controller.d.ts +3 -3
- package/dist/tools/oauth/oauth.controller.js +12 -9
- package/dist/tools/oauth/tokens.d.ts +11 -3
- package/dist/tools/oauth/tokens.js +15 -14
- package/dist/tools/outputs.d.ts +13 -4
- package/dist/tools/outputs.js +48 -4
- package/dist/tools/pipeline.d.ts +72 -50
- package/dist/tools/pipeline.js +239 -100
- package/dist/tools/policy.d.ts +3 -16
- package/dist/tools/policy.js +13 -19
- package/dist/tools/questions.controller.d.ts +2 -2
- package/dist/tools/questions.controller.js +9 -6
- package/dist/tools/questions.service.d.ts +26 -25
- package/dist/tools/questions.service.js +201 -142
- package/dist/tools/registry.d.ts +43 -38
- package/dist/tools/registry.js +100 -72
- package/dist/tools/resources.d.ts +1 -1
- package/dist/tools/resources.js +1 -1
- package/dist/tools/specs.d.ts +5 -4
- package/dist/tools/specs.js +3 -1
- package/dist/tools/tools.module.d.ts +10 -0
- package/dist/tools/tools.module.js +91 -0
- package/dist/ui/call-extension.d.ts +16 -0
- package/dist/ui/call-extension.js +38 -0
- package/dist/ui/embed-token.d.ts +9 -5
- package/dist/ui/embed-token.js +34 -6
- package/dist/ui/ui-stream.d.ts +22 -17
- package/dist/ui/ui-stream.js +72 -12
- package/dist/ui/ui.module.d.ts +7 -0
- package/dist/ui/ui.module.js +28 -0
- package/dist/ui/views.controller.d.ts +14 -12
- package/dist/ui/views.controller.js +32 -25
- package/dist/ui/views.d.ts +9 -57
- package/dist/ui/views.js +43 -45
- package/package.json +10 -3
- package/src/migrations/0063_tool_keys_claude_code.sql +220 -0
- package/dist/http/health.controller.d.ts +0 -26
- package/dist/http/health.controller.js +0 -79
- package/dist/http/tokens.d.ts +0 -131
- package/dist/http/tokens.js +0 -131
- package/dist/http/zod.pipe.d.ts +0 -8
- package/dist/http/zod.pipe.js +0 -14
- package/dist/identity/rate-limit.d.ts +0 -55
- package/dist/identity/rate-limit.js +0 -121
- package/dist/sandbox/lifecycle.d.ts +0 -21
- package/dist/sandbox/lifecycle.js +0 -68
- package/dist/tools/builtins/sandbox/names.d.ts +0 -7
- package/dist/tools/builtins/sandbox/names.js +0 -20
- /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
- /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
package/dist/orgs/offboarding.js
CHANGED
|
@@ -1,11 +1,34 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
10
|
+
import { DIRECTORY_EXTENSION_POINT } from "@capybara-hq/plugin-sdk";
|
|
11
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
1
12
|
import { sql } from "kysely";
|
|
13
|
+
import { EventLog } from "../conversations/event-log.js";
|
|
2
14
|
import { ApiError } from "../errors.js";
|
|
3
15
|
import { enabledExtensionsQuery } from "../extensions/enabled.js";
|
|
16
|
+
import { ExtensionRegistry } from "../extensions/registry.js";
|
|
4
17
|
import { audit } from "../identity/audit.js";
|
|
5
|
-
|
|
18
|
+
import { SessionService } from "../identity/sessions.js";
|
|
19
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
20
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
21
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
22
|
+
import { LockService } from "../infra/lock/lock.service.js";
|
|
23
|
+
import { LockedCron } from "../infra/schedule/locked-cron.decorator.js";
|
|
24
|
+
import { KERNEL_LOGGER, REDIS } from "../infra/tokens.js";
|
|
25
|
+
import { RunControl } from "../runtime/run-control.js";
|
|
26
|
+
import { SandboxJobs } from "../sandbox/jobs.js";
|
|
27
|
+
import { ApprovalsService } from "../tools/approvals.service.js";
|
|
28
|
+
import { Credentials } from "../tools/credentials.js";
|
|
29
|
+
import { QuestionsService } from "../tools/questions.service.js";
|
|
30
|
+
/** The safety-net sweep: cron job name (no `:`), every 10 minutes, and the rows per page. */
|
|
6
31
|
export const OFFBOARD_SWEEP_JOB = "offboard-sweep";
|
|
7
|
-
export const OFFBOARD_SWEEP_SCHEDULER_ID = "offboard-sweep-every-10m";
|
|
8
|
-
export const OFFBOARD_SWEEP_EVERY_MS = 600_000;
|
|
9
32
|
export const OFFBOARD_SWEEP_BATCH = 500;
|
|
10
33
|
/** 一次兜底扫描最多翻的页数(每页 {@link OFFBOARD_SWEEP_BATCH} 条),防止单次任务无限长。 */
|
|
11
34
|
export const OFFBOARD_SWEEP_MAX_PAGES = 20;
|
|
@@ -18,28 +41,47 @@ const ACTIVE = ["queued", "running", "waiting"];
|
|
|
18
41
|
const DIRECTORY_SOURCE_PREFIX = "directory:";
|
|
19
42
|
/**
|
|
20
43
|
* 成员离职(spec 3.3):管理员移出、本人离开与通讯录同步共用这一条路径,全部写入在调用方的同一个事务内,
|
|
21
|
-
* 要么都生效要么都不生效。Redis 吊销标记、事件发布与中止进行中的运行是提交后的尽力而为({@link
|
|
44
|
+
* 要么都生效要么都不生效。Redis 吊销标记、事件发布与中止进行中的运行是提交后的尽力而为({@link afterOffboard}),
|
|
22
45
|
* 漏掉的运行由兜底扫描({@link sweep}:发起人已不是该组织成员的进行中运行)中止。框架无关。
|
|
23
46
|
*
|
|
24
47
|
* 已接受的窄窗口:离职提交时正在进行的 OAuth token 刷新(`Credentials` 刷新锁内)可能在提交之后把此人的
|
|
25
48
|
* 个人凭据重新写回(upsert)。凭据只在此人以成员身份调用工具时使用,而其运行已被中止、成员关系已删除,
|
|
26
49
|
* 残留的凭据不会被使用;重新加入组织后会被新的连接覆盖。
|
|
27
50
|
*/
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
51
|
+
let Offboarding = class Offboarding {
|
|
52
|
+
db;
|
|
53
|
+
txHost;
|
|
54
|
+
sessions;
|
|
55
|
+
redis;
|
|
56
|
+
registry;
|
|
57
|
+
eventLog;
|
|
58
|
+
sandboxJobs;
|
|
59
|
+
runs;
|
|
60
|
+
credentials;
|
|
61
|
+
approvals;
|
|
62
|
+
questions;
|
|
63
|
+
log;
|
|
64
|
+
constructor(db, txHost, sessions, redis, registry, eventLog,
|
|
65
|
+
/** The departed member's sandboxes: one-off maintenance jobs, destroyed one by one by a worker. */
|
|
66
|
+
sandboxJobs,
|
|
67
|
+
/** Stops the departed member's runs (`by: null`, a system action). */
|
|
68
|
+
runs, credentials, approvals, questions, log) {
|
|
69
|
+
this.db = db;
|
|
70
|
+
this.txHost = txHost;
|
|
71
|
+
this.sessions = sessions;
|
|
72
|
+
this.redis = redis;
|
|
73
|
+
this.registry = registry;
|
|
74
|
+
this.eventLog = eventLog;
|
|
75
|
+
this.sandboxJobs = sandboxJobs;
|
|
76
|
+
this.runs = runs;
|
|
77
|
+
this.credentials = credentials;
|
|
78
|
+
this.approvals = approvals;
|
|
79
|
+
this.questions = questions;
|
|
80
|
+
this.log = log;
|
|
40
81
|
}
|
|
41
82
|
/**
|
|
42
|
-
*
|
|
83
|
+
* In the caller's transaction (`mandatory`: the caller holds the org row lock, order org row →
|
|
84
|
+
* membership, and did the "last owner" checks):
|
|
43
85
|
* 1. 删除成员关系(非成员 → `member.not_found`;删后组织没有 owner → `org.last_owner`),清空指向该组织的会话当前组织;
|
|
44
86
|
* 2. 吊销该账号**全部**会话与个人令牌(令牌与会话是账号级的,无法只吊销「该组织下」的,按保守处理);
|
|
45
87
|
* 3. 删除其在该组织所有连接器上的个人凭据;
|
|
@@ -53,8 +95,8 @@ export class Offboarding {
|
|
|
53
95
|
* 8. 审计 `org.member.offboarded`;
|
|
54
96
|
* 9. 记下此人在该组织对话里还没销毁的沙箱(提交后销毁,尽力而为)。
|
|
55
97
|
*/
|
|
56
|
-
async offboard(
|
|
57
|
-
const deleted = await
|
|
98
|
+
async offboard(orgId, accountId, reason, actor = {}) {
|
|
99
|
+
const deleted = await this.db
|
|
58
100
|
.deleteFrom("memberships")
|
|
59
101
|
.where("org_id", "=", orgId)
|
|
60
102
|
.where("account_id", "=", accountId)
|
|
@@ -70,7 +112,7 @@ export class Offboarding {
|
|
|
70
112
|
// deleted or re-keyed, so NO KEY UPDATE: it still excludes FOR SHARE and other writers, but not
|
|
71
113
|
// the foreign key checks (FOR KEY SHARE) of a transaction that writes rows referencing them,
|
|
72
114
|
// which may already hold a conversation row this transaction waits for (40P01)
|
|
73
|
-
await
|
|
115
|
+
await this.db
|
|
74
116
|
.selectFrom("agents")
|
|
75
117
|
.select("id")
|
|
76
118
|
.where("org_id", "=", orgId)
|
|
@@ -82,7 +124,7 @@ export class Offboarding {
|
|
|
82
124
|
// then the member's conversations in id order, before any of their queue rows (final review
|
|
83
125
|
// m2): queue dispatch, send-now and remove lock a conversation, then its queue rows; deleting
|
|
84
126
|
// the rows first and updating the conversations after could deadlock with them (40P01)
|
|
85
|
-
await
|
|
127
|
+
await this.db
|
|
86
128
|
.selectFrom("conversations")
|
|
87
129
|
.select("id")
|
|
88
130
|
.where("org_id", "=", orgId)
|
|
@@ -90,7 +132,7 @@ export class Offboarding {
|
|
|
90
132
|
.orderBy("id")
|
|
91
133
|
.forNoKeyUpdate()
|
|
92
134
|
.execute();
|
|
93
|
-
const owner = await
|
|
135
|
+
const owner = await this.db
|
|
94
136
|
.selectFrom("memberships")
|
|
95
137
|
.select("account_id")
|
|
96
138
|
.where("org_id", "=", orgId)
|
|
@@ -102,20 +144,20 @@ export class Offboarding {
|
|
|
102
144
|
if (!owner) {
|
|
103
145
|
throw new ApiError("org.last_owner", "An organization must keep at least one owner");
|
|
104
146
|
}
|
|
105
|
-
await
|
|
147
|
+
await this.db
|
|
106
148
|
.updateTable("sessions")
|
|
107
149
|
.set({ current_org_id: null })
|
|
108
150
|
.where("account_id", "=", accountId)
|
|
109
151
|
.where("current_org_id", "=", orgId)
|
|
110
152
|
.execute();
|
|
111
|
-
const sessions = await
|
|
153
|
+
const sessions = await this.db
|
|
112
154
|
.updateTable("sessions")
|
|
113
155
|
.set({ revoked_at: sql `now()` })
|
|
114
156
|
.where("account_id", "=", accountId)
|
|
115
157
|
.where("revoked_at", "is", null)
|
|
116
158
|
.returning("id")
|
|
117
159
|
.execute();
|
|
118
|
-
const tokens = await
|
|
160
|
+
const tokens = await this.db
|
|
119
161
|
.updateTable("api_tokens")
|
|
120
162
|
.set({ revoked_at: sql `now()` })
|
|
121
163
|
.where("kind", "=", "personal")
|
|
@@ -123,20 +165,21 @@ export class Offboarding {
|
|
|
123
165
|
.where("revoked_at", "is", null)
|
|
124
166
|
.returning("id")
|
|
125
167
|
.execute();
|
|
126
|
-
|
|
127
|
-
const
|
|
128
|
-
const
|
|
168
|
+
// in this transaction (the approvals and questions services join it: `mandatory`)
|
|
169
|
+
const credentials = await this.credentials.clearAccount(orgId, accountId);
|
|
170
|
+
const approvals = await this.approvals.cancelPendingFor(orgId, accountId);
|
|
171
|
+
const questions = await this.questions.cancelPendingFor(orgId, accountId);
|
|
129
172
|
const notify = new Map(approvals.seqs);
|
|
130
173
|
for (const [c, seq] of questions.seqs)
|
|
131
174
|
notify.set(c, Math.max(notify.get(c) ?? 0, seq));
|
|
132
|
-
const runs = await
|
|
175
|
+
const runs = await this.db
|
|
133
176
|
.selectFrom("runs")
|
|
134
177
|
.innerJoin("conversations", "conversations.id", "runs.conversation_id")
|
|
135
178
|
.select(["runs.id", "runs.conversation_id", "runs.status"])
|
|
136
179
|
.where("conversations.org_id", "=", orgId)
|
|
137
180
|
// 评测回放的隐藏对话由评测 worker 驱动(不执行工具),随评测运行停下,不在这里中止。
|
|
138
181
|
// 评测运行的创建者离开组织也不取消评测运行(Ruling S1-b):管理员发起的评测运行是组织的工作,
|
|
139
|
-
// 只有取消、删除评测集、删除组织或 agent 才会停下(见 evals/budget.ts
|
|
182
|
+
// 只有取消、删除评测集、删除组织或 agent 才会停下(见 evals/budget.ts `EvalBudget.cancelRuns`)
|
|
140
183
|
// a removed member's sub-agents run with their identity and credentials: stopped too
|
|
141
184
|
.where("conversations.kind", "in", ["chat", "subagent"])
|
|
142
185
|
.where("runs.status", "in", ACTIVE)
|
|
@@ -145,7 +188,7 @@ export class Offboarding {
|
|
|
145
188
|
eb("conversations.account_id", "=", accountId),
|
|
146
189
|
]))
|
|
147
190
|
.execute();
|
|
148
|
-
const agents = await
|
|
191
|
+
const agents = await this.db
|
|
149
192
|
.updateTable("agents")
|
|
150
193
|
.set({
|
|
151
194
|
owner_account_id: owner.account_id,
|
|
@@ -157,21 +200,21 @@ export class Offboarding {
|
|
|
157
200
|
.where("deleted_at", "is", null)
|
|
158
201
|
.returning("id")
|
|
159
202
|
.execute();
|
|
160
|
-
const threads = await
|
|
203
|
+
const threads = await this.db
|
|
161
204
|
.updateTable("channel_threads")
|
|
162
205
|
.set({ archived_at: sql `now()` })
|
|
163
206
|
.where("account_id", "=", accountId)
|
|
164
207
|
.where("archived_at", "is", null)
|
|
165
208
|
.where("connection_id", "in", (eb) => eb.selectFrom("channel_connections").select("id").where("org_id", "=", orgId))
|
|
166
209
|
.executeTakeFirst();
|
|
167
|
-
const grants = await
|
|
210
|
+
const grants = await this.db
|
|
168
211
|
.deleteFrom("tool_grants")
|
|
169
212
|
.where("org_id", "=", orgId)
|
|
170
213
|
.where("account_id", "=", accountId)
|
|
171
214
|
.executeTakeFirst();
|
|
172
|
-
const excluded = reason === "directory" ? [] : await this.exclusionPlugins(
|
|
215
|
+
const excluded = reason === "directory" ? [] : await this.exclusionPlugins(orgId, deleted.source);
|
|
173
216
|
if (excluded.length > 0) {
|
|
174
|
-
await
|
|
217
|
+
await this.db
|
|
175
218
|
.insertInto("directory_exclusions")
|
|
176
219
|
.values(excluded.map((plugin) => ({
|
|
177
220
|
org_id: orgId,
|
|
@@ -184,7 +227,7 @@ export class Offboarding {
|
|
|
184
227
|
}
|
|
185
228
|
// Queued messages never go out after their author leaves (they also hold `@` resource bodies
|
|
186
229
|
// read with the person's credentials): deleted here, so no dispatch can pick them up.
|
|
187
|
-
const queued = await
|
|
230
|
+
const queued = await this.db
|
|
188
231
|
.deleteFrom("conversation_queue")
|
|
189
232
|
.where("conversation_id", "in", (eb) => eb
|
|
190
233
|
.selectFrom("conversations")
|
|
@@ -195,13 +238,13 @@ export class Offboarding {
|
|
|
195
238
|
.execute();
|
|
196
239
|
const queueConversations = [...new Set(queued.map((r) => r.conversation_id))];
|
|
197
240
|
if (queueConversations.length > 0) {
|
|
198
|
-
await
|
|
241
|
+
await this.db
|
|
199
242
|
.updateTable("conversations")
|
|
200
243
|
.set({ queue_paused: false, queue_pause_reason: null })
|
|
201
244
|
.where("id", "in", queueConversations)
|
|
202
245
|
.execute();
|
|
203
246
|
}
|
|
204
|
-
const sandboxes = await
|
|
247
|
+
const sandboxes = await this.db
|
|
205
248
|
.selectFrom("sandboxes")
|
|
206
249
|
.innerJoin("conversations", "conversations.id", "sandboxes.conversation_id")
|
|
207
250
|
.select("sandboxes.conversation_id")
|
|
@@ -209,7 +252,7 @@ export class Offboarding {
|
|
|
209
252
|
.where("conversations.account_id", "=", accountId)
|
|
210
253
|
.where("sandboxes.status", "<>", "destroyed")
|
|
211
254
|
.execute();
|
|
212
|
-
await audit(
|
|
255
|
+
await audit(this.db.db, {
|
|
213
256
|
...(actor.actorAccountId !== undefined && { actorAccountId: actor.actorAccountId }),
|
|
214
257
|
...(actor.actorTokenId !== undefined && { actorTokenId: actor.actorTokenId }),
|
|
215
258
|
orgId,
|
|
@@ -248,15 +291,19 @@ export class Offboarding {
|
|
|
248
291
|
};
|
|
249
292
|
}
|
|
250
293
|
/** 要写排除的通讯录插件:该组织启用的已加载通讯录插件 ∪ 成员关系自身的 `directory:<插件>` 来源,去重排序。 */
|
|
251
|
-
async exclusionPlugins(
|
|
294
|
+
async exclusionPlugins(orgId, source) {
|
|
252
295
|
const out = new Set();
|
|
253
296
|
if (source?.startsWith(DIRECTORY_SOURCE_PREFIX)) {
|
|
254
297
|
out.add(source.slice(DIRECTORY_SOURCE_PREFIX.length));
|
|
255
298
|
}
|
|
256
|
-
|
|
299
|
+
// Ruling A24: every loaded directory extension enabled in the org
|
|
300
|
+
const loaded = this.registry
|
|
301
|
+
.list("directory")
|
|
302
|
+
.filter((e) => e.capability === DIRECTORY_EXTENSION_POINT)
|
|
303
|
+
.map((e) => e.plugin);
|
|
257
304
|
if (loaded.length > 0) {
|
|
258
|
-
const rows = await
|
|
259
|
-
.selectFrom(enabledExtensionsQuery(
|
|
305
|
+
const rows = await this.db
|
|
306
|
+
.selectFrom(enabledExtensionsQuery(this.db.db, orgId).as("en"))
|
|
260
307
|
.select("en.plugin")
|
|
261
308
|
.where("en.plugin", "in", loaded)
|
|
262
309
|
.execute();
|
|
@@ -266,41 +313,43 @@ export class Offboarding {
|
|
|
266
313
|
return [...out].sort();
|
|
267
314
|
}
|
|
268
315
|
/**
|
|
269
|
-
*
|
|
270
|
-
*
|
|
316
|
+
* After the commit (callers register it with the infra `afterCommit` inside their transaction):
|
|
317
|
+
* writes the session revocation markers, publishes the cancelled events, stops the person's
|
|
318
|
+
* runs in the org and schedules destroying their conversations' sandboxes. A failing step only
|
|
319
|
+
* logs a warning.
|
|
271
320
|
*/
|
|
272
|
-
async
|
|
273
|
-
const { sessions,
|
|
321
|
+
async afterOffboard(r) {
|
|
322
|
+
const { sessions, log, eventLog } = this;
|
|
274
323
|
try {
|
|
275
|
-
await sessions
|
|
324
|
+
await sessions.markRevoked(r.revokedSessionIds);
|
|
276
325
|
}
|
|
277
326
|
catch (err) {
|
|
278
|
-
log
|
|
327
|
+
log.warn("offboarding: cannot write session revocation markers", { err });
|
|
279
328
|
}
|
|
280
329
|
for (const [conversationId, seq] of r.notify) {
|
|
281
330
|
try {
|
|
282
|
-
await eventLog
|
|
331
|
+
await eventLog.notify(conversationId, seq);
|
|
283
332
|
}
|
|
284
333
|
catch (err) {
|
|
285
|
-
log
|
|
334
|
+
log.warn("offboarding: event notify failed", { conversationId, err });
|
|
286
335
|
}
|
|
287
336
|
}
|
|
288
337
|
for (const conversationId of r.queueConversations) {
|
|
289
338
|
try {
|
|
290
|
-
await eventLog
|
|
339
|
+
await eventLog.publishChanged(conversationId, "queue");
|
|
291
340
|
}
|
|
292
341
|
catch (err) {
|
|
293
|
-
log
|
|
342
|
+
log.warn("offboarding: queue change notify failed", { conversationId, err });
|
|
294
343
|
}
|
|
295
344
|
}
|
|
296
345
|
for (const run of r.runs)
|
|
297
346
|
await this.stopRun(run);
|
|
298
|
-
if (r.sandboxConversations.length > 0
|
|
347
|
+
if (r.sandboxConversations.length > 0) {
|
|
299
348
|
try {
|
|
300
|
-
await this.
|
|
349
|
+
await this.sandboxJobs.destroy(r.sandboxConversations);
|
|
301
350
|
}
|
|
302
351
|
catch (err) {
|
|
303
|
-
log
|
|
352
|
+
log.warn("offboarding: cannot schedule sandbox destruction", {
|
|
304
353
|
count: r.sandboxConversations.length,
|
|
305
354
|
err,
|
|
306
355
|
});
|
|
@@ -313,9 +362,7 @@ export class Offboarding {
|
|
|
313
362
|
* 不像会话中止那样随后起新一轮运行:离职者的待处理消息不再处理。
|
|
314
363
|
*/
|
|
315
364
|
async stopRun(run) {
|
|
316
|
-
const ctl = this.
|
|
317
|
-
if (!ctl)
|
|
318
|
-
return;
|
|
365
|
+
const ctl = this.runs;
|
|
319
366
|
try {
|
|
320
367
|
if (run.status === "waiting" &&
|
|
321
368
|
(await ctl.abortWaiting(run.conversationId, run.runId, null))) {
|
|
@@ -326,12 +373,12 @@ export class Offboarding {
|
|
|
326
373
|
await ctl.requestAbort(run.runId, null);
|
|
327
374
|
// 广播中止的运行要等所在副本到达步骤边界才真正结束:广播成功后记标记,扫描在其有效期内不再重复广播
|
|
328
375
|
// (广播失败不记,下一轮扫描重试)
|
|
329
|
-
await this.
|
|
330
|
-
|
|
331
|
-
.catch((err) => this.
|
|
376
|
+
await this.redis
|
|
377
|
+
.set(offboardAbortKey(run.runId), "1", "EX", OFFBOARD_ABORT_MARK_TTL_SECONDS)
|
|
378
|
+
.catch((err) => this.log.warn("offboarding: cannot mark abort", { err }));
|
|
332
379
|
}
|
|
333
380
|
catch (err) {
|
|
334
|
-
this.
|
|
381
|
+
this.log.warn("offboarding: cannot stop run", { runId: run.runId, err });
|
|
335
382
|
}
|
|
336
383
|
}
|
|
337
384
|
/**
|
|
@@ -342,11 +389,8 @@ export class Offboarding {
|
|
|
342
389
|
* 不每轮重复广播;标记过期仍未结束的再处理一次。返回本次处理(未跳过)的运行数。
|
|
343
390
|
* 现任成员(含匿名访客这样的 guest 成员)发起的运行不受影响。
|
|
344
391
|
*/
|
|
345
|
-
async sweep() {
|
|
346
|
-
const
|
|
347
|
-
if (!db || !this.deps.runs)
|
|
348
|
-
return 0;
|
|
349
|
-
const batch = this.deps.sweepBatch ?? OFFBOARD_SWEEP_BATCH;
|
|
392
|
+
async sweep(batch = OFFBOARD_SWEEP_BATCH) {
|
|
393
|
+
const db = this.db;
|
|
350
394
|
// 游标的时间用文本保存完整的微秒精度(JS Date 只有毫秒,会让同一行再被取到)
|
|
351
395
|
let after;
|
|
352
396
|
let total = 0;
|
|
@@ -373,7 +417,7 @@ export class Offboarding {
|
|
|
373
417
|
if (await this.recentlyAborted(r.id))
|
|
374
418
|
continue;
|
|
375
419
|
total++;
|
|
376
|
-
this.
|
|
420
|
+
this.log.warn("offboard sweep: stopping run of a former member", { runId: r.id });
|
|
377
421
|
await this.stopRun({
|
|
378
422
|
conversationId: r.conversation_id,
|
|
379
423
|
runId: r.id,
|
|
@@ -389,10 +433,56 @@ export class Offboarding {
|
|
|
389
433
|
}
|
|
390
434
|
async recentlyAborted(runId) {
|
|
391
435
|
try {
|
|
392
|
-
return (await this.
|
|
436
|
+
return (await this.redis.exists(offboardAbortKey(runId))) === 1;
|
|
393
437
|
}
|
|
394
438
|
catch {
|
|
395
439
|
return false;
|
|
396
440
|
}
|
|
397
441
|
}
|
|
398
|
-
}
|
|
442
|
+
};
|
|
443
|
+
__decorate([
|
|
444
|
+
Transactional({ propagation: "mandatory" })
|
|
445
|
+
], Offboarding.prototype, "offboard", null);
|
|
446
|
+
Offboarding = __decorate([
|
|
447
|
+
Injectable(),
|
|
448
|
+
__param(0, Inject(KernelDb)),
|
|
449
|
+
__param(1, Inject(TransactionHost)),
|
|
450
|
+
__param(2, Inject(SessionService)),
|
|
451
|
+
__param(3, Inject(REDIS)),
|
|
452
|
+
__param(4, Inject(ExtensionRegistry)),
|
|
453
|
+
__param(5, Inject(EventLog)),
|
|
454
|
+
__param(6, Inject(SandboxJobs)),
|
|
455
|
+
__param(7, Inject(RunControl)),
|
|
456
|
+
__param(8, Inject(Credentials)),
|
|
457
|
+
__param(9, Inject(ApprovalsService)),
|
|
458
|
+
__param(10, Inject(QuestionsService)),
|
|
459
|
+
__param(11, Inject(KERNEL_LOGGER))
|
|
460
|
+
], Offboarding);
|
|
461
|
+
export { Offboarding };
|
|
462
|
+
/**
|
|
463
|
+
* The offboarding safety-net sweep ({@link Offboarding.sweep}) every 10 minutes, once per tick
|
|
464
|
+
* across replicas; a worker-role job (`WorkerModule`).
|
|
465
|
+
*/
|
|
466
|
+
let OffboardSweepJob = class OffboardSweepJob {
|
|
467
|
+
offboarding;
|
|
468
|
+
lockService;
|
|
469
|
+
log;
|
|
470
|
+
constructor(offboarding, lockService, log) {
|
|
471
|
+
this.offboarding = offboarding;
|
|
472
|
+
this.lockService = lockService;
|
|
473
|
+
this.log = log;
|
|
474
|
+
}
|
|
475
|
+
async run() {
|
|
476
|
+
await this.offboarding.sweep();
|
|
477
|
+
}
|
|
478
|
+
};
|
|
479
|
+
__decorate([
|
|
480
|
+
LockedCron("*/10 * * * *", { name: OFFBOARD_SWEEP_JOB })
|
|
481
|
+
], OffboardSweepJob.prototype, "run", null);
|
|
482
|
+
OffboardSweepJob = __decorate([
|
|
483
|
+
Injectable(),
|
|
484
|
+
__param(0, Inject(Offboarding)),
|
|
485
|
+
__param(1, Inject(LockService)),
|
|
486
|
+
__param(2, Inject(KERNEL_LOGGER))
|
|
487
|
+
], OffboardSweepJob);
|
|
488
|
+
export { OffboardSweepJob };
|
package/dist/orgs/org-lock.d.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
2
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
3
3
|
import { type OrgAction, type OrgRole } from "./roles.js";
|
|
4
|
-
|
|
5
|
-
/** 被锁组织的元数据(审计记录改动前的值用)。 */
|
|
4
|
+
/** The locked org's metadata (audits record the values before a change). */
|
|
6
5
|
export interface LockedOrg {
|
|
7
6
|
slug: string;
|
|
8
7
|
name: string;
|
|
9
8
|
}
|
|
10
9
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* The org row lock that serializes an organization's member / invitation / token / config writes.
|
|
11
|
+
* Every method joins the caller's transaction (`mandatory`), which holds the row lock until it
|
|
12
|
+
* ends; called outside one it throws instead of locking nothing.
|
|
13
13
|
*
|
|
14
14
|
* NO KEY UPDATE, not UPDATE: the holders still exclude each other (and `FOR SHARE` readers), but a
|
|
15
15
|
* foreign key check against the org row (`FOR KEY SHARE`, taken by every insert of a row that
|
|
@@ -17,16 +17,25 @@ export interface LockedOrg {
|
|
|
17
17
|
* With FOR UPDATE, offboarding (org row, then the member's conversations) deadlocked with an event
|
|
18
18
|
* log append (a conversation row, then the org foreign key check).
|
|
19
19
|
*/
|
|
20
|
-
export declare
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
20
|
+
export declare class OrgLock {
|
|
21
|
+
private readonly db;
|
|
22
|
+
readonly txHost: TransactionHost;
|
|
23
|
+
constructor(db: KernelDb, txHost: TransactionHost);
|
|
24
|
+
/** Locks the org row; undefined when the org does not exist or is soft-deleted. */
|
|
25
|
+
tryLock(orgId: string): Promise<LockedOrg | undefined>;
|
|
26
|
+
/** Like {@link tryLock}; a missing or soft-deleted org → `org.not_found`. */
|
|
27
|
+
lock(orgId: string): Promise<LockedOrg>;
|
|
28
|
+
/**
|
|
29
|
+
* The run-time re-check of a role-dependent org write (spec 3.6 R5): locks the org row and
|
|
30
|
+
* re-reads the actor's role under it. A missing or soft-deleted org → `org.not_found`; the actor
|
|
31
|
+
* is not a member or the role does not allow `action` → `forbidden`. Services take only the
|
|
32
|
+
* actor's account id, never a role from the caller.
|
|
33
|
+
*/
|
|
34
|
+
lockAndAuthorize(orgId: string, actorAccountId: string, action: OrgAction): Promise<{
|
|
35
|
+
org: LockedOrg;
|
|
36
|
+
role: OrgRole;
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
/** The one {@link OrgLock}: identity (service tokens), orgs and the other domains import it. */
|
|
40
|
+
export declare class OrgLockModule {
|
|
41
|
+
}
|
package/dist/orgs/org-lock.js
CHANGED
|
@@ -1,8 +1,22 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
10
|
+
import { Inject, Injectable, Module } from "@nestjs/common";
|
|
1
11
|
import { ApiError } from "../errors.js";
|
|
12
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
13
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
14
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
2
15
|
import { can } from "./roles.js";
|
|
3
16
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
17
|
+
* The org row lock that serializes an organization's member / invitation / token / config writes.
|
|
18
|
+
* Every method joins the caller's transaction (`mandatory`), which holds the row lock until it
|
|
19
|
+
* ends; called outside one it throws instead of locking nothing.
|
|
6
20
|
*
|
|
7
21
|
* NO KEY UPDATE, not UPDATE: the holders still exclude each other (and `FOR SHARE` readers), but a
|
|
8
22
|
* foreign key check against the org row (`FOR KEY SHARE`, taken by every insert of a row that
|
|
@@ -10,37 +24,69 @@ import { can } from "./roles.js";
|
|
|
10
24
|
* With FOR UPDATE, offboarding (org row, then the member's conversations) deadlocked with an event
|
|
11
25
|
* log append (a conversation row, then the org foreign key check).
|
|
12
26
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
.
|
|
18
|
-
.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
27
|
+
let OrgLock = class OrgLock {
|
|
28
|
+
db;
|
|
29
|
+
txHost;
|
|
30
|
+
constructor(db, txHost) {
|
|
31
|
+
this.db = db;
|
|
32
|
+
this.txHost = txHost;
|
|
33
|
+
}
|
|
34
|
+
/** Locks the org row; undefined when the org does not exist or is soft-deleted. */
|
|
35
|
+
async tryLock(orgId) {
|
|
36
|
+
return this.db
|
|
37
|
+
.selectFrom("orgs")
|
|
38
|
+
.select(["slug", "name"])
|
|
39
|
+
.where("id", "=", orgId)
|
|
40
|
+
.where("deleted_at", "is", null)
|
|
41
|
+
.forNoKeyUpdate()
|
|
42
|
+
.executeTakeFirst();
|
|
43
|
+
}
|
|
44
|
+
/** Like {@link tryLock}; a missing or soft-deleted org → `org.not_found`. */
|
|
45
|
+
async lock(orgId) {
|
|
46
|
+
const org = await this.tryLock(orgId);
|
|
47
|
+
if (!org)
|
|
48
|
+
throw new ApiError("org.not_found", "Organization not found");
|
|
49
|
+
return org;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The run-time re-check of a role-dependent org write (spec 3.6 R5): locks the org row and
|
|
53
|
+
* re-reads the actor's role under it. A missing or soft-deleted org → `org.not_found`; the actor
|
|
54
|
+
* is not a member or the role does not allow `action` → `forbidden`. Services take only the
|
|
55
|
+
* actor's account id, never a role from the caller.
|
|
56
|
+
*/
|
|
57
|
+
async lockAndAuthorize(orgId, actorAccountId, action) {
|
|
58
|
+
const org = await this.lock(orgId);
|
|
59
|
+
const m = await this.db
|
|
60
|
+
.selectFrom("memberships")
|
|
61
|
+
.select("role")
|
|
62
|
+
.where("org_id", "=", orgId)
|
|
63
|
+
.where("account_id", "=", actorAccountId)
|
|
64
|
+
.executeTakeFirst();
|
|
65
|
+
if (!m || !can(m.role, action)) {
|
|
66
|
+
throw new ApiError("forbidden", "Insufficient organization role");
|
|
67
|
+
}
|
|
68
|
+
return { org, role: m.role };
|
|
44
69
|
}
|
|
45
|
-
|
|
46
|
-
|
|
70
|
+
};
|
|
71
|
+
__decorate([
|
|
72
|
+
Transactional({ propagation: "mandatory" })
|
|
73
|
+
], OrgLock.prototype, "tryLock", null);
|
|
74
|
+
__decorate([
|
|
75
|
+
Transactional({ propagation: "mandatory" })
|
|
76
|
+
], OrgLock.prototype, "lock", null);
|
|
77
|
+
__decorate([
|
|
78
|
+
Transactional({ propagation: "mandatory" })
|
|
79
|
+
], OrgLock.prototype, "lockAndAuthorize", null);
|
|
80
|
+
OrgLock = __decorate([
|
|
81
|
+
Injectable(),
|
|
82
|
+
__param(0, Inject(KernelDb)),
|
|
83
|
+
__param(1, Inject(TransactionHost))
|
|
84
|
+
], OrgLock);
|
|
85
|
+
export { OrgLock };
|
|
86
|
+
/** The one {@link OrgLock}: identity (service tokens), orgs and the other domains import it. */
|
|
87
|
+
let OrgLockModule = class OrgLockModule {
|
|
88
|
+
};
|
|
89
|
+
OrgLockModule = __decorate([
|
|
90
|
+
Module({ providers: [OrgLock], exports: [OrgLock] })
|
|
91
|
+
], OrgLockModule);
|
|
92
|
+
export { OrgLockModule };
|
package/dist/orgs/org.guard.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type CanActivate, type ExecutionContext } from "@nestjs/common";
|
|
2
2
|
import { Reflector } from "@nestjs/core";
|
|
3
|
-
import
|
|
3
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
4
4
|
import { type OrgAction as Action, type OrgRole } from "./roles.js";
|
|
5
5
|
/** OrgGuard 放在请求上的组织上下文。 */
|
|
6
6
|
export interface OrgContext {
|