@capybara-hq/kernel 0.1.0-rc.1 → 0.1.0-rc.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/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 +179 -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 +261 -329
- package/dist/agents/definition.d.ts +8 -0
- package/dist/agents/definition.js +8 -0
- 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 +20 -4
- 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 +323 -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/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 +30 -13
- 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 +2 -2
- 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 +10 -4
- package/dist/conversations/access.d.ts +29 -0
- package/dist/conversations/access.js +86 -0
- package/dist/conversations/artifacts.d.ts +10 -10
- package/dist/conversations/artifacts.js +35 -9
- 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 +28 -18
- package/dist/conversations/event-log.js +74 -27
- 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 +2 -2
- 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/run-replay.d.ts +56 -8
- package/dist/evals/run-replay.js +140 -80
- 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.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 +85 -57
- 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 +451 -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 +14 -8
- package/dist/orgs/settings.service.js +75 -46
- 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/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 +7 -0
- 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 +24 -57
- 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 +26 -17
- 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 +121 -75
- package/dist/runtime/run-worker.js +340 -226
- 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 +4 -4
- package/dist/runtime/subagents/definition.js +2 -2
- package/dist/runtime/subagents/dispatch.d.ts +87 -6
- package/dist/runtime/subagents/dispatch.js +135 -140
- 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 +1 -1
- package/dist/runtime/subagents/progress.d.ts +2 -2
- package/dist/runtime/subagents/roster.d.ts +3 -3
- package/dist/runtime/subagents/roster.js +1 -1
- package/dist/runtime/subagents/skill-fork.d.ts +6 -7
- package/dist/runtime/subagents/skill-fork.js +16 -5
- 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 +125 -57
- package/dist/runtime/waits.js +431 -208
- 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 +33 -20
- package/dist/skills/catalog.js +96 -53
- package/dist/skills/changes.controller.d.ts +4 -4
- package/dist/skills/changes.controller.js +15 -9
- package/dist/skills/changes.service.d.ts +28 -18
- package/dist/skills/changes.service.js +421 -364
- package/dist/skills/invocable.controller.d.ts +1 -1
- package/dist/skills/invocable.controller.js +8 -5
- package/dist/skills/invoke.d.ts +16 -15
- package/dist/skills/invoke.js +48 -17
- 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 +27 -25
- package/dist/tools/approvals.service.js +324 -258
- package/dist/tools/breaker.d.ts +2 -2
- package/dist/tools/breaker.js +21 -3
- package/dist/tools/builtins/ask-user.d.ts +2 -2
- package/dist/tools/builtins/ask-user.js +1 -1
- 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 +2 -2
- package/dist/tools/builtins/read-tool-output.js +1 -1
- package/dist/tools/builtins/sandbox/bash.js +2 -2
- package/dist/tools/builtins/sandbox/common.d.ts +2 -1
- package/dist/tools/builtins/sandbox/deliver.js +2 -2
- package/dist/tools/builtins/sandbox/edit.js +1 -1
- package/dist/tools/builtins/sandbox/glob.js +2 -2
- package/dist/tools/builtins/sandbox/grep.js +2 -2
- package/dist/tools/builtins/sandbox/read.js +1 -1
- package/dist/tools/builtins/sandbox/write.js +1 -1
- package/dist/tools/builtins/skill-load.d.ts +3 -3
- package/dist/tools/builtins/skill-load.js +1 -1
- 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 +434 -344
- package/dist/tools/credentials.d.ts +17 -20
- package/dist/tools/credentials.js +55 -34
- package/dist/tools/drift.d.ts +29 -41
- package/dist/tools/drift.js +111 -79
- package/dist/tools/info.d.ts +12 -9
- package/dist/tools/info.js +33 -7
- 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/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 +47 -3
- package/dist/tools/pipeline.d.ts +62 -46
- package/dist/tools/pipeline.js +145 -64
- package/dist/tools/policy.d.ts +2 -2
- package/dist/tools/questions.controller.d.ts +1 -1
- package/dist/tools/questions.controller.js +8 -5
- package/dist/tools/questions.service.d.ts +25 -24
- package/dist/tools/questions.service.js +201 -142
- package/dist/tools/registry.d.ts +30 -20
- package/dist/tools/registry.js +73 -37
- 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 +9 -2
- 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/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
- /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
|
@@ -1,21 +1,32 @@
|
|
|
1
|
-
|
|
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";
|
|
2
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";
|
|
15
|
+
import { XactLock } from "../infra/database/xact-lock.js";
|
|
3
16
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
17
|
+
* The transaction-scoped lock (`XactLock`, `pg_advisory_xact_lock`) that serializes every
|
|
18
|
+
* enterprise admin write: revoke / disable / create an admin, deployment settings, prices,
|
|
19
|
+
* purposes, the catalog and extension admin writes, the CLI's `capybara admin grant|revoke`.
|
|
7
20
|
*/
|
|
8
|
-
|
|
9
|
-
await sql `SELECT pg_advisory_xact_lock(hashtext('capybara.enterprise_admins'))`.execute(trx);
|
|
10
|
-
}
|
|
21
|
+
const ENTERPRISE_ADMINS_LOCK = "capybara.enterprise_admins";
|
|
11
22
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
23
|
+
* The run-time re-check of an enterprise admin write (spec 3.6 R5), under
|
|
24
|
+
* {@link ENTERPRISE_ADMINS_LOCK}: the actor must still be an active enterprise admin, else
|
|
25
|
+
* `forbidden`. The identity the auth guard read at the start of the request may be stale (another
|
|
26
|
+
* admin just revoked it), so it is re-read under the lock.
|
|
15
27
|
*/
|
|
16
|
-
|
|
17
|
-
await
|
|
18
|
-
const actor = await trx
|
|
28
|
+
async function assertActiveEnterpriseAdmin(db, actorAccountId) {
|
|
29
|
+
const actor = await db
|
|
19
30
|
.selectFrom("accounts")
|
|
20
31
|
.select("id")
|
|
21
32
|
.where("id", "=", actorAccountId)
|
|
@@ -25,3 +36,46 @@ export async function lockEnterpriseAdminsAndAuthorize(trx, actorAccountId) {
|
|
|
25
36
|
if (!actor)
|
|
26
37
|
throw new ApiError("forbidden", "Enterprise admin required");
|
|
27
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* The enterprise admin lock, the one implementation of "lock, then re-check the actor":
|
|
41
|
+
* both methods join the caller's transaction (`mandatory`), which holds the lock until it ends.
|
|
42
|
+
*/
|
|
43
|
+
let EnterpriseAdminLock = class EnterpriseAdminLock {
|
|
44
|
+
db;
|
|
45
|
+
xactLock;
|
|
46
|
+
txHost;
|
|
47
|
+
constructor(db, xactLock, txHost) {
|
|
48
|
+
this.db = db;
|
|
49
|
+
this.xactLock = xactLock;
|
|
50
|
+
this.txHost = txHost;
|
|
51
|
+
}
|
|
52
|
+
/** Only the lock (callers without an actor: the CLI, bootstrap). */
|
|
53
|
+
async lock() {
|
|
54
|
+
await this.xactLock.lock(ENTERPRISE_ADMINS_LOCK);
|
|
55
|
+
}
|
|
56
|
+
/** The lock, then {@link assertActiveEnterpriseAdmin} under it. */
|
|
57
|
+
async lockAndAuthorize(actorAccountId) {
|
|
58
|
+
await this.xactLock.lock(ENTERPRISE_ADMINS_LOCK);
|
|
59
|
+
await assertActiveEnterpriseAdmin(this.db.db, actorAccountId);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
__decorate([
|
|
63
|
+
Transactional({ propagation: "mandatory" })
|
|
64
|
+
], EnterpriseAdminLock.prototype, "lock", null);
|
|
65
|
+
__decorate([
|
|
66
|
+
Transactional({ propagation: "mandatory" })
|
|
67
|
+
], EnterpriseAdminLock.prototype, "lockAndAuthorize", null);
|
|
68
|
+
EnterpriseAdminLock = __decorate([
|
|
69
|
+
Injectable(),
|
|
70
|
+
__param(0, Inject(KernelDb)),
|
|
71
|
+
__param(1, Inject(XactLock)),
|
|
72
|
+
__param(2, Inject(TransactionHost))
|
|
73
|
+
], EnterpriseAdminLock);
|
|
74
|
+
export { EnterpriseAdminLock };
|
|
75
|
+
/** The one {@link EnterpriseAdminLock}: identity, models, the extensions and the catalog import it. */
|
|
76
|
+
let EnterpriseAdminLockModule = class EnterpriseAdminLockModule {
|
|
77
|
+
};
|
|
78
|
+
EnterpriseAdminLockModule = __decorate([
|
|
79
|
+
Module({ providers: [EnterpriseAdminLock], exports: [EnterpriseAdminLock] })
|
|
80
|
+
], EnterpriseAdminLockModule);
|
|
81
|
+
export { EnterpriseAdminLockModule };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
2
|
+
import { XactLock } from "../infra/database/xact-lock.js";
|
|
3
|
+
/**
|
|
4
|
+
* The lock of one external identity (one provider per transaction-scoped lock): serializes resolve
|
|
5
|
+
* / link of the same `(source, externalId)`, whose row may not exist yet, so concurrent first
|
|
6
|
+
* resolves create one account. Joins the caller's transaction (`mandatory`), which holds it until
|
|
7
|
+
* it ends.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ExternalIdentityLock {
|
|
10
|
+
private readonly xactLock;
|
|
11
|
+
readonly txHost: TransactionHost;
|
|
12
|
+
constructor(xactLock: XactLock, txHost: TransactionHost);
|
|
13
|
+
lock(id: {
|
|
14
|
+
source: string;
|
|
15
|
+
externalId: string;
|
|
16
|
+
}): Promise<void>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
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 } from "@nestjs/common";
|
|
11
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
12
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
13
|
+
import { XactLock } from "../infra/database/xact-lock.js";
|
|
14
|
+
/**
|
|
15
|
+
* The lock of one external identity (one provider per transaction-scoped lock): serializes resolve
|
|
16
|
+
* / link of the same `(source, externalId)`, whose row may not exist yet, so concurrent first
|
|
17
|
+
* resolves create one account. Joins the caller's transaction (`mandatory`), which holds it until
|
|
18
|
+
* it ends.
|
|
19
|
+
*/
|
|
20
|
+
let ExternalIdentityLock = class ExternalIdentityLock {
|
|
21
|
+
xactLock;
|
|
22
|
+
txHost;
|
|
23
|
+
constructor(xactLock, txHost) {
|
|
24
|
+
this.xactLock = xactLock;
|
|
25
|
+
this.txHost = txHost;
|
|
26
|
+
}
|
|
27
|
+
async lock(id) {
|
|
28
|
+
await this.xactLock.lock(`capybara.identity:${id.source}:${id.externalId}`);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
__decorate([
|
|
32
|
+
Transactional({ propagation: "mandatory" })
|
|
33
|
+
], ExternalIdentityLock.prototype, "lock", null);
|
|
34
|
+
ExternalIdentityLock = __decorate([
|
|
35
|
+
Injectable(),
|
|
36
|
+
__param(0, Inject(XactLock)),
|
|
37
|
+
__param(1, Inject(TransactionHost))
|
|
38
|
+
], ExternalIdentityLock);
|
|
39
|
+
export { ExternalIdentityLock };
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { ExternalIdentity } from "@capybara-hq/plugin-sdk";
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
|
|
2
|
+
import type { LinkedVia } from "../db/kernel-schema.js";
|
|
3
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
4
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
5
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
6
|
+
import { ExternalIdentityLock } from "./external-identity-lock.js";
|
|
6
7
|
export type { LinkedVia };
|
|
7
8
|
/**
|
|
8
9
|
* 第三方登录拒绝了这个身份(Ruling A18):身份行经 IM 绑定链接建立,而请求没有带着同一账号的会话。
|
|
@@ -45,16 +46,17 @@ export declare function identityPlugin(source: string): string;
|
|
|
45
46
|
/**
|
|
46
47
|
* 外部身份:按 `(source, externalId)` 映射到账号(登录、渠道入站、通讯录共用同一个键)。
|
|
47
48
|
* 首次出现时按「受信任的身份源 + 两侧邮箱均已验证」合并到既有账号,否则新建账号(不建组织)。
|
|
48
|
-
*
|
|
49
|
+
* Concurrent first resolves of one identity are serialized by {@link ExternalIdentityLock},
|
|
50
|
+
* so only one account is created.
|
|
49
51
|
*/
|
|
50
52
|
export declare class ExternalIdentities {
|
|
51
53
|
private readonly db;
|
|
54
|
+
readonly txHost: TransactionHost;
|
|
55
|
+
private readonly identityLock;
|
|
52
56
|
private readonly config;
|
|
53
|
-
constructor(db: KernelDb, config:
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
/** 该外部身份绑定的账号 id;未绑定返回 undefined。 */
|
|
57
|
-
findAccount(source: string, externalId: string, trx?: Trx): Promise<string | undefined>;
|
|
57
|
+
constructor(db: KernelDb, txHost: TransactionHost, identityLock: ExternalIdentityLock, config: Pick<KernelConfigService, "get">);
|
|
58
|
+
/** The account the external identity is linked to (in the context's transaction when there is one); undefined when unlinked. */
|
|
59
|
+
findAccount(source: string, externalId: string): Promise<string | undefined>;
|
|
58
60
|
/**
|
|
59
61
|
* 解析外部身份到账号。已绑定 → 该账号(顺带刷新身份行上的邮箱与资料);未绑定 → 合并或新建(见类说明),
|
|
60
62
|
* 新身份行记 `linked_via = opts.linkedVia`(合并也是 `sso`)。
|
|
@@ -67,14 +69,15 @@ export declare class ExternalIdentities {
|
|
|
67
69
|
* 新建账号的 `email_verified` 只在身份源受信任且身份邮箱已验证时为 true——不受信任的身份源可以声称任意邮箱
|
|
68
70
|
* 「已验证」,不能让它建出的账号成为日后受信任登录的合并目标。
|
|
69
71
|
* 合并写审计 `identity.linked`,新建写 `account.created`。不判断账号状态,由调用方决定(如登录拒绝停用账号)。
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
+
* Joins the caller's transaction when there is one; takes the same lock as `link`, and falls back
|
|
73
|
+
* to `ON CONFLICT DO NOTHING` plus a re-read, so it never throws a unique violation or aborts the
|
|
74
|
+
* caller's transaction.
|
|
72
75
|
*/
|
|
73
|
-
resolve(identity: ExternalIdentity,
|
|
76
|
+
resolve(identity: ExternalIdentity, opts: ResolveOptions): Promise<{
|
|
74
77
|
accountId: string;
|
|
75
78
|
created: boolean;
|
|
76
79
|
}>;
|
|
77
|
-
/**
|
|
80
|
+
/** Serializes resolve / link of one identity ({@link ExternalIdentityLock}). */
|
|
78
81
|
private lockIdentity;
|
|
79
82
|
/** 身份源键(`<插件名>:<租户 id>`)是否在 `auth.trustedIdentitySources` 中:按完整键比较,信任按租户(Ruling A19)。 */
|
|
80
83
|
private trusted;
|
|
@@ -95,12 +98,13 @@ export declare class ExternalIdentities {
|
|
|
95
98
|
* 已绑定他人 → `409 identity.taken`。新行记 `linked_via = bind`:这样绑定的身份只能在 IM 里代表此人,
|
|
96
99
|
* 不能直接用于第三方登录(Ruling A18)。与 `resolve` 取同一把咨询锁。新绑定写审计 `identity.linked`。
|
|
97
100
|
*/
|
|
98
|
-
link(accountId: string, identity: ExternalIdentity
|
|
101
|
+
link(accountId: string, identity: ExternalIdentity): Promise<void>;
|
|
99
102
|
/**
|
|
100
103
|
* 解除本人的一个外部身份(本地登录名不可解除);不存在或不属于本人 → `identity.not_found`;
|
|
101
104
|
* 账号没有本地密码且这是最后一个外部身份 → `409 identity.last_login_method`。审计 `identity.unlinked`。
|
|
102
105
|
*/
|
|
103
106
|
unlink(accountId: string, source: string, externalId: string): Promise<void>;
|
|
107
|
+
private unlinkIn;
|
|
104
108
|
/** 账号绑定的外部身份(不含本地登录名),按绑定时间升序。 */
|
|
105
109
|
listForAccount(accountId: string): Promise<LinkedIdentity[]>;
|
|
106
110
|
}
|
|
@@ -1,7 +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
|
+
};
|
|
1
10
|
import { randomUUID } from "node:crypto";
|
|
11
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
2
12
|
import { sql } from "kysely";
|
|
3
13
|
import { ApiError } from "../errors.js";
|
|
14
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
15
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
16
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
17
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
4
18
|
import { audit } from "./audit.js";
|
|
19
|
+
import { ExternalIdentityLock } from "./external-identity-lock.js";
|
|
5
20
|
/** `<插件名>:<租户 id>`;插件名同清单规则,租户 id 为非空、不含空白的串。 */
|
|
6
21
|
const SOURCE_RE = /^([a-z0-9][a-z0-9._-]{0,213}):(\S{1,256})$/;
|
|
7
22
|
const MAX_EXTERNAL_ID = 256;
|
|
@@ -60,18 +75,23 @@ const profileOf = (i) => JSON.stringify({
|
|
|
60
75
|
/**
|
|
61
76
|
* 外部身份:按 `(source, externalId)` 映射到账号(登录、渠道入站、通讯录共用同一个键)。
|
|
62
77
|
* 首次出现时按「受信任的身份源 + 两侧邮箱均已验证」合并到既有账号,否则新建账号(不建组织)。
|
|
63
|
-
*
|
|
78
|
+
* Concurrent first resolves of one identity are serialized by {@link ExternalIdentityLock},
|
|
79
|
+
* so only one account is created.
|
|
64
80
|
*/
|
|
65
|
-
|
|
81
|
+
let ExternalIdentities = class ExternalIdentities {
|
|
66
82
|
db;
|
|
83
|
+
txHost;
|
|
84
|
+
identityLock;
|
|
67
85
|
config;
|
|
68
|
-
constructor(db, config) {
|
|
86
|
+
constructor(db, txHost, identityLock, config) {
|
|
69
87
|
this.db = db;
|
|
88
|
+
this.txHost = txHost;
|
|
89
|
+
this.identityLock = identityLock;
|
|
70
90
|
this.config = config;
|
|
71
91
|
}
|
|
72
|
-
/**
|
|
73
|
-
async findAccount(source, externalId
|
|
74
|
-
const row = await
|
|
92
|
+
/** The account the external identity is linked to (in the context's transaction when there is one); undefined when unlinked. */
|
|
93
|
+
async findAccount(source, externalId) {
|
|
94
|
+
const row = await this.db
|
|
75
95
|
.selectFrom("identities")
|
|
76
96
|
.select("account_id")
|
|
77
97
|
.where("source", "=", source)
|
|
@@ -91,68 +111,66 @@ export class ExternalIdentities {
|
|
|
91
111
|
* 新建账号的 `email_verified` 只在身份源受信任且身份邮箱已验证时为 true——不受信任的身份源可以声称任意邮箱
|
|
92
112
|
* 「已验证」,不能让它建出的账号成为日后受信任登录的合并目标。
|
|
93
113
|
* 合并写审计 `identity.linked`,新建写 `account.created`。不判断账号状态,由调用方决定(如登录拒绝停用账号)。
|
|
94
|
-
*
|
|
95
|
-
*
|
|
114
|
+
* Joins the caller's transaction when there is one; takes the same lock as `link`, and falls back
|
|
115
|
+
* to `ON CONFLICT DO NOTHING` plus a re-read, so it never throws a unique violation or aborts the
|
|
116
|
+
* caller's transaction.
|
|
96
117
|
*/
|
|
97
|
-
async resolve(identity,
|
|
118
|
+
async resolve(identity, opts) {
|
|
98
119
|
const id = normalize(identity);
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
if (
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
120
|
+
await this.lockIdentity(id);
|
|
121
|
+
const existing = await this.findRow(id);
|
|
122
|
+
if (existing !== undefined) {
|
|
123
|
+
if (opts.login !== undefined)
|
|
124
|
+
await this.allowLogin(id, existing, opts.login);
|
|
125
|
+
await this.refreshIdentity(id);
|
|
126
|
+
return { accountId: existing.accountId, created: false };
|
|
127
|
+
}
|
|
128
|
+
const merged = opts.allowMerge === true ? await this.mergeTarget(id) : undefined;
|
|
129
|
+
if (merged !== undefined) {
|
|
130
|
+
if (!(await this.insertIdentity(merged, id, "sso"))) {
|
|
131
|
+
return { accountId: await this.mustFind(id), created: false };
|
|
107
132
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
await audit(t, {
|
|
114
|
-
actorAccountId: merged,
|
|
115
|
-
action: "identity.linked",
|
|
116
|
-
target: merged,
|
|
117
|
-
detail: { source: id.source, externalId: id.externalId, via: "verified_email" },
|
|
118
|
-
});
|
|
119
|
-
return { accountId: merged, created: false };
|
|
120
|
-
}
|
|
121
|
-
const accountId = randomUUID();
|
|
122
|
-
await t
|
|
123
|
-
.insertInto("accounts")
|
|
124
|
-
.values({
|
|
125
|
-
id: accountId,
|
|
126
|
-
display_name: id.displayName,
|
|
127
|
-
email: id.email ?? null,
|
|
128
|
-
email_verified: id.emailVerified && this.trusted(id.source),
|
|
129
|
-
})
|
|
130
|
-
.execute();
|
|
131
|
-
if (!(await this.insertIdentity(t, accountId, id, opts.linkedVia))) {
|
|
132
|
-
// 不走咨询锁的写入方抢先插入了同一身份:撤销刚建的账号,回读
|
|
133
|
-
await t.deleteFrom("accounts").where("id", "=", accountId).execute();
|
|
134
|
-
return { accountId: await this.mustFind(t, id), created: false };
|
|
135
|
-
}
|
|
136
|
-
await audit(t, {
|
|
137
|
-
actorAccountId: accountId,
|
|
138
|
-
action: "account.created",
|
|
139
|
-
target: accountId,
|
|
140
|
-
detail: { source: id.source, externalId: id.externalId },
|
|
133
|
+
await audit(this.db.db, {
|
|
134
|
+
actorAccountId: merged,
|
|
135
|
+
action: "identity.linked",
|
|
136
|
+
target: merged,
|
|
137
|
+
detail: { source: id.source, externalId: id.externalId, via: "verified_email" },
|
|
141
138
|
});
|
|
142
|
-
return { accountId, created:
|
|
143
|
-
}
|
|
144
|
-
|
|
139
|
+
return { accountId: merged, created: false };
|
|
140
|
+
}
|
|
141
|
+
const accountId = randomUUID();
|
|
142
|
+
await this.db
|
|
143
|
+
.insertInto("accounts")
|
|
144
|
+
.values({
|
|
145
|
+
id: accountId,
|
|
146
|
+
display_name: id.displayName,
|
|
147
|
+
email: id.email ?? null,
|
|
148
|
+
email_verified: id.emailVerified && this.trusted(id.source),
|
|
149
|
+
})
|
|
150
|
+
.execute();
|
|
151
|
+
if (!(await this.insertIdentity(accountId, id, opts.linkedVia))) {
|
|
152
|
+
// 不走咨询锁的写入方抢先插入了同一身份:撤销刚建的账号,回读
|
|
153
|
+
await this.db.deleteFrom("accounts").where("id", "=", accountId).execute();
|
|
154
|
+
return { accountId: await this.mustFind(id), created: false };
|
|
155
|
+
}
|
|
156
|
+
await audit(this.db.db, {
|
|
157
|
+
actorAccountId: accountId,
|
|
158
|
+
action: "account.created",
|
|
159
|
+
target: accountId,
|
|
160
|
+
detail: { source: id.source, externalId: id.externalId },
|
|
161
|
+
});
|
|
162
|
+
return { accountId, created: true };
|
|
145
163
|
}
|
|
146
|
-
/**
|
|
147
|
-
async lockIdentity(
|
|
148
|
-
await
|
|
164
|
+
/** Serializes resolve / link of one identity ({@link ExternalIdentityLock}). */
|
|
165
|
+
async lockIdentity(id) {
|
|
166
|
+
await this.identityLock.lock(id);
|
|
149
167
|
}
|
|
150
168
|
/** 身份源键(`<插件名>:<租户 id>`)是否在 `auth.trustedIdentitySources` 中:按完整键比较,信任按租户(Ruling A19)。 */
|
|
151
169
|
trusted(source) {
|
|
152
|
-
return this.config().auth.trustedIdentitySources.includes(source);
|
|
170
|
+
return this.config.get().auth.trustedIdentitySources.includes(source);
|
|
153
171
|
}
|
|
154
|
-
async findRow(
|
|
155
|
-
const row = await
|
|
172
|
+
async findRow(id) {
|
|
173
|
+
const row = await this.db
|
|
156
174
|
.selectFrom("identities")
|
|
157
175
|
.select(["account_id", "linked_via"])
|
|
158
176
|
.where("source", "=", id.source)
|
|
@@ -161,33 +179,33 @@ export class ExternalIdentities {
|
|
|
161
179
|
return row && { accountId: row.account_id, linkedVia: row.linked_via };
|
|
162
180
|
}
|
|
163
181
|
/** 第三方登录能否用这一行(见 {@link resolve}):只有 `bind` 行需要同一账号的会话,放行时把行改为 `sso`。 */
|
|
164
|
-
async allowLogin(
|
|
182
|
+
async allowLogin(id, row, login) {
|
|
165
183
|
const via = row.linkedVia ?? "sso";
|
|
166
184
|
if (via !== "bind")
|
|
167
185
|
return;
|
|
168
186
|
if (login.sessionAccountId !== row.accountId)
|
|
169
187
|
throw new IdentityNotVerified();
|
|
170
|
-
await
|
|
188
|
+
await this.db
|
|
171
189
|
.updateTable("identities")
|
|
172
190
|
.set({ linked_via: "sso" })
|
|
173
191
|
.where("source", "=", id.source)
|
|
174
192
|
.where("external_id", "=", id.externalId)
|
|
175
193
|
.execute();
|
|
176
|
-
await audit(
|
|
194
|
+
await audit(this.db.db, {
|
|
177
195
|
actorAccountId: row.accountId,
|
|
178
196
|
action: "identity.verified",
|
|
179
197
|
target: row.accountId,
|
|
180
198
|
detail: { source: id.source, externalId: id.externalId, from: via },
|
|
181
199
|
});
|
|
182
200
|
}
|
|
183
|
-
async mustFind(
|
|
184
|
-
const owner = await this.findAccount(id.source, id.externalId
|
|
201
|
+
async mustFind(id) {
|
|
202
|
+
const owner = await this.findAccount(id.source, id.externalId);
|
|
185
203
|
if (owner === undefined)
|
|
186
204
|
throw new Error("identity vanished after a conflicting insert");
|
|
187
205
|
return owner;
|
|
188
206
|
}
|
|
189
|
-
async refreshIdentity(
|
|
190
|
-
await
|
|
207
|
+
async refreshIdentity(id) {
|
|
208
|
+
await this.db
|
|
191
209
|
.updateTable("identities")
|
|
192
210
|
.set({ email: id.email ?? null, email_verified: id.emailVerified, profile: profileOf(id) })
|
|
193
211
|
.where("source", "=", id.source)
|
|
@@ -198,10 +216,10 @@ export class ExternalIdentities {
|
|
|
198
216
|
* 可合并的既有账号:身份源键在 `auth.trustedIdentitySources` 中、身份邮箱已验证,
|
|
199
217
|
* 且恰好有一个邮箱已验证、邮箱相同(不区分大小写)的账号;否则 undefined(多个候选时不猜,新建)。
|
|
200
218
|
*/
|
|
201
|
-
async mergeTarget(
|
|
219
|
+
async mergeTarget(id) {
|
|
202
220
|
if (!id.emailVerified || id.email === undefined || !this.trusted(id.source))
|
|
203
221
|
return undefined;
|
|
204
|
-
const rows = await
|
|
222
|
+
const rows = await this.db
|
|
205
223
|
.selectFrom("accounts")
|
|
206
224
|
.select("id")
|
|
207
225
|
.where("email_verified", "=", true)
|
|
@@ -211,8 +229,8 @@ export class ExternalIdentities {
|
|
|
211
229
|
return rows.length === 1 ? rows[0]?.id : undefined;
|
|
212
230
|
}
|
|
213
231
|
/** 插入身份行;已存在(主键冲突)时什么都不做并返回 false。 */
|
|
214
|
-
async insertIdentity(
|
|
215
|
-
const row = await
|
|
232
|
+
async insertIdentity(accountId, id, linkedVia) {
|
|
233
|
+
const row = await this.db
|
|
216
234
|
.insertInto("identities")
|
|
217
235
|
.values({
|
|
218
236
|
source: id.source,
|
|
@@ -233,30 +251,27 @@ export class ExternalIdentities {
|
|
|
233
251
|
* 已绑定他人 → `409 identity.taken`。新行记 `linked_via = bind`:这样绑定的身份只能在 IM 里代表此人,
|
|
234
252
|
* 不能直接用于第三方登录(Ruling A18)。与 `resolve` 取同一把咨询锁。新绑定写审计 `identity.linked`。
|
|
235
253
|
*/
|
|
236
|
-
async link(accountId, identity
|
|
254
|
+
async link(accountId, identity) {
|
|
237
255
|
const id = normalize(identity);
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
256
|
+
await this.lockIdentity(id);
|
|
257
|
+
const owner = await this.findAccount(id.source, id.externalId);
|
|
258
|
+
if (owner !== undefined && owner !== accountId)
|
|
259
|
+
throw taken();
|
|
260
|
+
if (owner === accountId) {
|
|
261
|
+
await this.refreshIdentity(id);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
if (!(await this.insertIdentity(accountId, id, "bind"))) {
|
|
265
|
+
if ((await this.mustFind(id)) !== accountId)
|
|
242
266
|
throw taken();
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
}
|
|
252
|
-
await audit(t, {
|
|
253
|
-
actorAccountId: accountId,
|
|
254
|
-
action: "identity.linked",
|
|
255
|
-
target: accountId,
|
|
256
|
-
detail: { source: id.source, externalId: id.externalId, via: "bind" },
|
|
257
|
-
});
|
|
258
|
-
};
|
|
259
|
-
return trx ? run(trx) : this.db.transaction().execute(run);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
await audit(this.db.db, {
|
|
270
|
+
actorAccountId: accountId,
|
|
271
|
+
action: "identity.linked",
|
|
272
|
+
target: accountId,
|
|
273
|
+
detail: { source: id.source, externalId: id.externalId, via: "bind" },
|
|
274
|
+
});
|
|
260
275
|
}
|
|
261
276
|
/**
|
|
262
277
|
* 解除本人的一个外部身份(本地登录名不可解除);不存在或不属于本人 → `identity.not_found`;
|
|
@@ -265,38 +280,44 @@ export class ExternalIdentities {
|
|
|
265
280
|
async unlink(accountId, source, externalId) {
|
|
266
281
|
if (source === "local")
|
|
267
282
|
throw notFound();
|
|
268
|
-
await this.
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
283
|
+
await this.unlinkIn(accountId, source, externalId);
|
|
284
|
+
}
|
|
285
|
+
async unlinkIn(accountId, source, externalId) {
|
|
286
|
+
const r = await this.db
|
|
287
|
+
.deleteFrom("identities")
|
|
288
|
+
.where("source", "=", source)
|
|
289
|
+
.where("external_id", "=", externalId)
|
|
290
|
+
.where("account_id", "=", accountId)
|
|
291
|
+
.executeTakeFirst();
|
|
292
|
+
if (r.numDeletedRows === 0n)
|
|
293
|
+
throw notFound();
|
|
294
|
+
// 没有本地密码时至少还要剩一个外部身份,否则此人再也登录不了(锁账号行,串行化并发解除)
|
|
295
|
+
await this.db
|
|
296
|
+
.selectFrom("accounts")
|
|
297
|
+
.select("id")
|
|
298
|
+
.where("id", "=", accountId)
|
|
299
|
+
.forUpdate()
|
|
300
|
+
.execute();
|
|
301
|
+
const password = await this.db
|
|
302
|
+
.selectFrom("local_passwords")
|
|
303
|
+
.select("account_id")
|
|
304
|
+
.where("account_id", "=", accountId)
|
|
305
|
+
.executeTakeFirst();
|
|
306
|
+
const others = await this.db
|
|
307
|
+
.selectFrom("identities")
|
|
308
|
+
.select("source")
|
|
309
|
+
.where("account_id", "=", accountId)
|
|
310
|
+
.where("source", "!=", "local")
|
|
311
|
+
.limit(1)
|
|
312
|
+
.execute();
|
|
313
|
+
if (!password && others.length === 0) {
|
|
314
|
+
throw new ApiError("identity.last_login_method", "Cannot unlink the last sign-in method of an account without a password");
|
|
315
|
+
}
|
|
316
|
+
await audit(this.db.db, {
|
|
317
|
+
actorAccountId: accountId,
|
|
318
|
+
action: "identity.unlinked",
|
|
319
|
+
target: accountId,
|
|
320
|
+
detail: { source, externalId },
|
|
300
321
|
});
|
|
301
322
|
}
|
|
302
323
|
/** 账号绑定的外部身份(不含本地登录名),按绑定时间升序。 */
|
|
@@ -332,6 +353,23 @@ export class ExternalIdentities {
|
|
|
332
353
|
};
|
|
333
354
|
});
|
|
334
355
|
}
|
|
335
|
-
}
|
|
356
|
+
};
|
|
357
|
+
__decorate([
|
|
358
|
+
Transactional()
|
|
359
|
+
], ExternalIdentities.prototype, "resolve", null);
|
|
360
|
+
__decorate([
|
|
361
|
+
Transactional()
|
|
362
|
+
], ExternalIdentities.prototype, "link", null);
|
|
363
|
+
__decorate([
|
|
364
|
+
Transactional()
|
|
365
|
+
], ExternalIdentities.prototype, "unlinkIn", null);
|
|
366
|
+
ExternalIdentities = __decorate([
|
|
367
|
+
Injectable(),
|
|
368
|
+
__param(0, Inject(KernelDb)),
|
|
369
|
+
__param(1, Inject(TransactionHost)),
|
|
370
|
+
__param(2, Inject(ExternalIdentityLock)),
|
|
371
|
+
__param(3, Inject(KernelConfigService))
|
|
372
|
+
], ExternalIdentities);
|
|
373
|
+
export { ExternalIdentities };
|
|
336
374
|
const taken = () => new ApiError("identity.taken", "This external identity is already linked to another account");
|
|
337
375
|
const notFound = () => new ApiError("identity.not_found", "External identity not found");
|