@capybara-hq/kernel 0.1.0-rc.0 → 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/bootstrap.json +10 -6
- 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 -193
- 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 +16 -1
- package/dist/config/schema.js +54 -7
- 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 -62
- 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/queue.js +3 -2
- 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 +2 -0
- package/dist/errors.js +2 -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 -120
- 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 +96 -42
- package/dist/extensions/bootstrap.js +303 -155
- 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 +52 -47
- 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 +19 -12
- package/dist/index.js +13 -8
- 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 -241
- 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-config.d.ts +9 -0
- package/dist/log-config.js +27 -0
- package/dist/log-context.d.ts +34 -0
- package/dist/log-context.js +44 -0
- package/dist/log-loki.d.ts +34 -0
- package/dist/log-loki.js +145 -0
- package/dist/log.d.ts +41 -10
- package/dist/log.js +91 -17
- 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/net/public-address.js +3 -2
- 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 -136
- 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 -225
- 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 -99
- 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 +7 -4
- package/dist/tools/builtins/sandbox/common.js +5 -3
- 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 +11 -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,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
|
+
};
|
|
1
10
|
import { randomUUID } from "node:crypto";
|
|
11
|
+
import { Inject, Injectable, Module } from "@nestjs/common";
|
|
2
12
|
import { sql } from "kysely";
|
|
13
|
+
import { SetupLock, SetupLockModule } from "../admin/setup-lock.js";
|
|
3
14
|
import { ApiError } from "../errors.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";
|
|
5
|
-
import {
|
|
19
|
+
import { EnterpriseAdminLock, EnterpriseAdminLockModule } from "./enterprise-admin.js";
|
|
6
20
|
import { MAX_PASSWORD_LENGTH, normalizeLogin, validatePassword } from "./login.js";
|
|
7
21
|
import { DUMMY_PASSWORD_HASH, hashPassword, verifyPassword } from "./passwords.js";
|
|
8
22
|
/** 构造 `Account` 所需的 accounts 列(供跨表查询 select 使用)。 */
|
|
@@ -38,97 +52,93 @@ async function prepareLocal(input, passwordHash) {
|
|
|
38
52
|
validatePassword(input.password);
|
|
39
53
|
return { input, login, passwordHash: passwordHash ?? (await hashPassword(input.password)) };
|
|
40
54
|
}
|
|
41
|
-
/**
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
.values({
|
|
48
|
-
id,
|
|
49
|
-
display_name: input.displayName,
|
|
50
|
-
email: input.email ?? null,
|
|
51
|
-
is_enterprise_admin: input.enterpriseAdmin ?? false,
|
|
52
|
-
})
|
|
53
|
-
.returningAll()
|
|
54
|
-
.executeTakeFirstOrThrow();
|
|
55
|
-
try {
|
|
56
|
-
await t
|
|
57
|
-
.insertInto("identities")
|
|
58
|
-
.values({
|
|
59
|
-
source: "local",
|
|
60
|
-
external_id: login,
|
|
61
|
-
account_id: id,
|
|
62
|
-
email: input.email ?? null,
|
|
63
|
-
linked_via: "local",
|
|
64
|
-
})
|
|
65
|
-
.execute();
|
|
66
|
-
}
|
|
67
|
-
catch (e) {
|
|
68
|
-
if (isLoginTaken(e)) {
|
|
69
|
-
throw new ApiError("account.login_taken", "Login is already taken");
|
|
70
|
-
}
|
|
71
|
-
throw e;
|
|
72
|
-
}
|
|
73
|
-
await t
|
|
74
|
-
.insertInto("local_passwords")
|
|
75
|
-
.values({ account_id: id, password_hash: passwordHash })
|
|
76
|
-
.execute();
|
|
77
|
-
return toAccount(row);
|
|
78
|
-
}
|
|
79
|
-
/** 在事务内写入(或覆盖)本地密码哈希;账号不存在 → `account.not_found`。 */
|
|
80
|
-
async function writePassword(t, accountId, passwordHash) {
|
|
81
|
-
const exists = await t
|
|
82
|
-
.selectFrom("accounts")
|
|
83
|
-
.select("id")
|
|
84
|
-
.where("id", "=", accountId)
|
|
85
|
-
.executeTakeFirst();
|
|
86
|
-
if (!exists)
|
|
87
|
-
throw new ApiError("account.not_found", "Account not found");
|
|
88
|
-
await t
|
|
89
|
-
.insertInto("local_passwords")
|
|
90
|
-
.values({ account_id: accountId, password_hash: passwordHash })
|
|
91
|
-
.onConflict((oc) => oc.column("account_id").doUpdateSet({ password_hash: passwordHash, updated_at: new Date() }))
|
|
92
|
-
.execute();
|
|
93
|
-
}
|
|
94
|
-
/** 账号服务:本地账号的创建、认证与管理。框架无关,由调用方注入 db。 */
|
|
95
|
-
export class AccountsService {
|
|
55
|
+
/**
|
|
56
|
+
* Accounts: local account creation, authentication and administration. Every write is
|
|
57
|
+
* `@Transactional` (joining the caller's transaction when there is one); scrypt runs before any
|
|
58
|
+
* transaction opens.
|
|
59
|
+
*/
|
|
60
|
+
let AccountsService = class AccountsService {
|
|
96
61
|
db;
|
|
97
|
-
|
|
62
|
+
txHost;
|
|
63
|
+
adminLock;
|
|
64
|
+
setupLock;
|
|
65
|
+
constructor(db, txHost, adminLock, setupLock) {
|
|
98
66
|
this.db = db;
|
|
67
|
+
this.txHost = txHost;
|
|
68
|
+
this.adminLock = adminLock;
|
|
69
|
+
this.setupLock = setupLock;
|
|
99
70
|
}
|
|
100
|
-
/**
|
|
71
|
+
/** Checks the password length and hashes it (scrypt, slow): for callers that hash before their transaction opens. */
|
|
101
72
|
async hashNewPassword(password) {
|
|
102
73
|
validatePassword(password);
|
|
103
74
|
return hashPassword(password);
|
|
104
75
|
}
|
|
105
76
|
/**
|
|
106
|
-
*
|
|
107
|
-
*
|
|
77
|
+
* Creates a local account, in the caller's transaction when there is one. A caller inside a
|
|
78
|
+
* transaction hashes first with {@link hashNewPassword} and passes `passwordHash`, so the
|
|
79
|
+
* connection is never idle in transaction during scrypt.
|
|
108
80
|
*/
|
|
109
|
-
async createLocal(input,
|
|
110
|
-
|
|
111
|
-
const run = (t) => insertLocal(t, prepared);
|
|
112
|
-
return trx ? run(trx) : this.db.transaction().execute(run);
|
|
81
|
+
async createLocal(input, passwordHash) {
|
|
82
|
+
return this.insertLocal(await prepareLocal(input, passwordHash));
|
|
113
83
|
}
|
|
114
84
|
/**
|
|
115
|
-
*
|
|
116
|
-
*
|
|
85
|
+
* An enterprise admin creates a local account (optionally an enterprise admin): under the
|
|
86
|
+
* enterprise admin lock, re-checks that the actor is still an active enterprise admin (else
|
|
87
|
+
* `forbidden`), creates the account and audits `account.created`. The hash is computed before
|
|
88
|
+
* the lock.
|
|
117
89
|
*/
|
|
118
90
|
async createByAdmin(input, actorAccountId, actorTokenId) {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
130
|
-
return a;
|
|
91
|
+
return this.createByAdminIn(await prepareLocal(input), actorAccountId, actorTokenId);
|
|
92
|
+
}
|
|
93
|
+
async createByAdminIn(prepared, actorAccountId, actorTokenId) {
|
|
94
|
+
await this.adminLock.lockAndAuthorize(actorAccountId);
|
|
95
|
+
const a = await this.insertLocal(prepared);
|
|
96
|
+
await audit(this.db.db, {
|
|
97
|
+
actorAccountId,
|
|
98
|
+
...(actorTokenId !== undefined && { actorTokenId }),
|
|
99
|
+
action: "account.created",
|
|
100
|
+
target: a.id,
|
|
101
|
+
detail: { enterpriseAdmin: a.isEnterpriseAdmin },
|
|
131
102
|
});
|
|
103
|
+
return a;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* CLI: creates an enterprise admin without checking whether the deployment is set up; a taken
|
|
107
|
+
* login → `account.login_taken`.
|
|
108
|
+
*/
|
|
109
|
+
async createEnterpriseAdmin(input) {
|
|
110
|
+
return this.insertEnterpriseAdmin(input, await this.hashNewPassword(input.password));
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* CLI `admin create --if-none`: creates an enterprise admin only when no active one exists. The
|
|
114
|
+
* check and the insert run in one transaction under {@link SetupLock}, the lock the web setup
|
|
115
|
+
* takes, so concurrent runs (and a concurrent web setup) create exactly one. Returns undefined
|
|
116
|
+
* when an active enterprise admin already exists; a taken login still throws
|
|
117
|
+
* `account.login_taken`.
|
|
118
|
+
*/
|
|
119
|
+
async createEnterpriseAdminIfNone(input) {
|
|
120
|
+
return this.createEnterpriseAdminIfNoneIn(input, await this.hashNewPassword(input.password));
|
|
121
|
+
}
|
|
122
|
+
async createEnterpriseAdminIfNoneIn(input, passwordHash) {
|
|
123
|
+
await this.setupLock.lock();
|
|
124
|
+
if ((await this.countEnterpriseAdmins()) > 0)
|
|
125
|
+
return undefined;
|
|
126
|
+
return this.insertEnterpriseAdmin(input, passwordHash);
|
|
127
|
+
}
|
|
128
|
+
async insertEnterpriseAdmin(input, passwordHash) {
|
|
129
|
+
const account = await this.createLocal({
|
|
130
|
+
login: input.login,
|
|
131
|
+
password: input.password,
|
|
132
|
+
displayName: input.displayName,
|
|
133
|
+
enterpriseAdmin: true,
|
|
134
|
+
...(input.email !== undefined && { email: input.email }),
|
|
135
|
+
}, passwordHash);
|
|
136
|
+
await audit(this.db.db, {
|
|
137
|
+
action: "account.created",
|
|
138
|
+
target: account.id,
|
|
139
|
+
detail: { enterpriseAdmin: true, via: "cli" },
|
|
140
|
+
});
|
|
141
|
+
return account;
|
|
132
142
|
}
|
|
133
143
|
async authenticateLocal(login, password) {
|
|
134
144
|
// 超长密码不可能正确(validatePassword 上限 256),不跑 scrypt 也不查库,免得被超长输入拖慢;
|
|
@@ -200,70 +210,71 @@ export class AccountsService {
|
|
|
200
210
|
}
|
|
201
211
|
async setPassword(accountId, password) {
|
|
202
212
|
validatePassword(password);
|
|
203
|
-
|
|
204
|
-
await this.db.transaction().execute((trx) => writePassword(trx, accountId, passwordHash));
|
|
213
|
+
await this.writePassword(accountId, await hashPassword(password));
|
|
205
214
|
}
|
|
206
215
|
/**
|
|
207
|
-
*
|
|
208
|
-
*
|
|
209
|
-
*
|
|
210
|
-
*
|
|
216
|
+
* A person changes their password (R24): one PG transaction writes the new password and revokes
|
|
217
|
+
* the account's sessions except `exceptSessionId` (`sessions.revoked_at`) and all its personal
|
|
218
|
+
* access tokens; all or nothing. scrypt runs before BEGIN. Returns the revoked session ids; the
|
|
219
|
+
* caller then writes the Redis revocation markers (the fast path: auth reads PG `revoked_at`,
|
|
220
|
+
* so a failed marker never keeps a session usable).
|
|
211
221
|
*/
|
|
212
222
|
async changePassword(accountId, password, exceptSessionId) {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
223
|
+
return this.changePasswordIn(accountId, await this.hashNewPassword(password), exceptSessionId);
|
|
224
|
+
}
|
|
225
|
+
async changePasswordIn(accountId, passwordHash, exceptSessionId) {
|
|
226
|
+
await this.writePassword(accountId, passwordHash);
|
|
227
|
+
const sessions = await this.db
|
|
228
|
+
.updateTable("sessions")
|
|
229
|
+
.set({ revoked_at: sql `now()` })
|
|
230
|
+
.where("account_id", "=", accountId)
|
|
231
|
+
.where("revoked_at", "is", null)
|
|
232
|
+
.where("id", "!=", exceptSessionId)
|
|
233
|
+
.returning("id")
|
|
234
|
+
.execute();
|
|
235
|
+
await this.db
|
|
236
|
+
.updateTable("api_tokens")
|
|
237
|
+
.set({ revoked_at: sql `now()` })
|
|
238
|
+
.where("kind", "=", "personal")
|
|
239
|
+
.where("account_id", "=", accountId)
|
|
240
|
+
.where("revoked_at", "is", null)
|
|
241
|
+
.execute();
|
|
242
|
+
return sessions.map((r) => r.id);
|
|
233
243
|
}
|
|
234
244
|
async update(id, patch, actorAccountId, actorTokenId) {
|
|
235
245
|
return (await this.updateAccount(id, patch, actorAccountId, actorTokenId)).account;
|
|
236
246
|
}
|
|
237
247
|
/**
|
|
238
|
-
*
|
|
239
|
-
*
|
|
240
|
-
*
|
|
248
|
+
* An enterprise admin changes an account. Disabling (`status: "disabled"`) revokes the
|
|
249
|
+
* account's sessions (`sessions.revoked_at`) and personal tokens in **the same PG transaction**,
|
|
250
|
+
* all or nothing; returns the revoked session ids, whose Redis markers the caller writes after
|
|
251
|
+
* the commit (the fast path; a failure is only a warning: auth reads PG).
|
|
241
252
|
*/
|
|
242
253
|
async updateAccount(id, patch, actorAccountId, actorTokenId) {
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
});
|
|
254
|
+
// Every enterprise admin write is serialized by one lock and re-checks the actor under it: two
|
|
255
|
+
// admins revoking each other concurrently cannot leave none, and a just-revoked admin's
|
|
256
|
+
// request in flight fails
|
|
257
|
+
await this.adminLock.lockAndAuthorize(actorAccountId);
|
|
258
|
+
const before = await this.db
|
|
259
|
+
.selectFrom("accounts")
|
|
260
|
+
.selectAll()
|
|
261
|
+
.where("id", "=", id)
|
|
262
|
+
.executeTakeFirst();
|
|
263
|
+
if (!before)
|
|
264
|
+
throw new ApiError("account.not_found", "Account not found");
|
|
265
|
+
return this.applyUpdate(before, patch, {
|
|
266
|
+
actorAccountId,
|
|
267
|
+
...(actorTokenId !== undefined && { actorTokenId }),
|
|
268
|
+
detail: patch,
|
|
259
269
|
});
|
|
260
270
|
}
|
|
261
271
|
/**
|
|
262
|
-
* CLI
|
|
263
|
-
*
|
|
264
|
-
*
|
|
265
|
-
*
|
|
266
|
-
*
|
|
272
|
+
* The CLI's `capybara admin grant|revoke <login>` (no actor account): changes the enterprise
|
|
273
|
+
* admin flag by local login under the enterprise admin lock; revoking keeps the
|
|
274
|
+
* {@link updateAccount} "last active enterprise admin" check (`account.last_enterprise_admin`),
|
|
275
|
+
* decided under the lock, so it cannot race a web revoke into none. Audit `account.updated`
|
|
276
|
+
* without an actor, `detail.via = "cli"`. Already in the target state → no change and no audit
|
|
277
|
+
* (`changed: false`). Unknown login → `account.not_found`.
|
|
267
278
|
*/
|
|
268
279
|
async setEnterpriseAdminByLogin(login, isEnterpriseAdmin) {
|
|
269
280
|
let external;
|
|
@@ -273,32 +284,107 @@ export class AccountsService {
|
|
|
273
284
|
catch {
|
|
274
285
|
throw new ApiError("account.not_found", "Account not found");
|
|
275
286
|
}
|
|
276
|
-
return this.
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
287
|
+
return this.setEnterpriseAdminIn(external, isEnterpriseAdmin);
|
|
288
|
+
}
|
|
289
|
+
async setEnterpriseAdminIn(external, isEnterpriseAdmin) {
|
|
290
|
+
await this.adminLock.lock();
|
|
291
|
+
const before = await this.db
|
|
292
|
+
.selectFrom("identities")
|
|
293
|
+
.innerJoin("accounts", "accounts.id", "identities.account_id")
|
|
294
|
+
.selectAll("accounts")
|
|
295
|
+
.where("identities.source", "=", "local")
|
|
296
|
+
.where("identities.external_id", "=", external)
|
|
297
|
+
.executeTakeFirst();
|
|
298
|
+
if (!before)
|
|
299
|
+
throw new ApiError("account.not_found", "Account not found");
|
|
300
|
+
if (before.is_enterprise_admin === isEnterpriseAdmin) {
|
|
301
|
+
return { account: toAccount(before), changed: false };
|
|
302
|
+
}
|
|
303
|
+
const patch = { isEnterpriseAdmin };
|
|
304
|
+
const { account } = await this.applyUpdate(before, patch, {
|
|
305
|
+
detail: { ...patch, via: "cli" },
|
|
295
306
|
});
|
|
307
|
+
return { account, changed: true };
|
|
308
|
+
}
|
|
309
|
+
/** 全部账号数(含停用的;后台概览)。 */
|
|
310
|
+
async count() {
|
|
311
|
+
const r = await this.db
|
|
312
|
+
.selectFrom("accounts")
|
|
313
|
+
.select((eb) => eb.fn.countAll().as("n"))
|
|
314
|
+
.executeTakeFirstOrThrow();
|
|
315
|
+
return Number(r.n);
|
|
316
|
+
}
|
|
317
|
+
/** Active (status = active) enterprise admins, in the context's transaction when there is one. */
|
|
318
|
+
async countEnterpriseAdmins() {
|
|
319
|
+
const r = await this.db
|
|
320
|
+
.selectFrom("accounts")
|
|
321
|
+
.select((eb) => eb.fn.countAll().as("n"))
|
|
322
|
+
.where("is_enterprise_admin", "=", true)
|
|
323
|
+
.where("status", "=", "active")
|
|
324
|
+
.executeTakeFirstOrThrow();
|
|
325
|
+
return Number(r.n);
|
|
326
|
+
}
|
|
327
|
+
/** Inserts the account, its local identity and password; a taken login → `account.login_taken`. */
|
|
328
|
+
async insertLocal(p) {
|
|
329
|
+
const { input, login, passwordHash } = p;
|
|
330
|
+
const id = randomUUID();
|
|
331
|
+
const row = await this.db
|
|
332
|
+
.insertInto("accounts")
|
|
333
|
+
.values({
|
|
334
|
+
id,
|
|
335
|
+
display_name: input.displayName,
|
|
336
|
+
email: input.email ?? null,
|
|
337
|
+
is_enterprise_admin: input.enterpriseAdmin ?? false,
|
|
338
|
+
})
|
|
339
|
+
.returningAll()
|
|
340
|
+
.executeTakeFirstOrThrow();
|
|
341
|
+
try {
|
|
342
|
+
await this.db
|
|
343
|
+
.insertInto("identities")
|
|
344
|
+
.values({
|
|
345
|
+
source: "local",
|
|
346
|
+
external_id: login,
|
|
347
|
+
account_id: id,
|
|
348
|
+
email: input.email ?? null,
|
|
349
|
+
linked_via: "local",
|
|
350
|
+
})
|
|
351
|
+
.execute();
|
|
352
|
+
}
|
|
353
|
+
catch (e) {
|
|
354
|
+
if (isLoginTaken(e)) {
|
|
355
|
+
throw new ApiError("account.login_taken", "Login is already taken");
|
|
356
|
+
}
|
|
357
|
+
throw e;
|
|
358
|
+
}
|
|
359
|
+
await this.db
|
|
360
|
+
.insertInto("local_passwords")
|
|
361
|
+
.values({ account_id: id, password_hash: passwordHash })
|
|
362
|
+
.execute();
|
|
363
|
+
return toAccount(row);
|
|
364
|
+
}
|
|
365
|
+
/** Writes (or replaces) the local password hash; a missing account → `account.not_found`. */
|
|
366
|
+
async writePassword(accountId, passwordHash) {
|
|
367
|
+
const exists = await this.db
|
|
368
|
+
.selectFrom("accounts")
|
|
369
|
+
.select("id")
|
|
370
|
+
.where("id", "=", accountId)
|
|
371
|
+
.executeTakeFirst();
|
|
372
|
+
if (!exists)
|
|
373
|
+
throw new ApiError("account.not_found", "Account not found");
|
|
374
|
+
await this.db
|
|
375
|
+
.insertInto("local_passwords")
|
|
376
|
+
.values({ account_id: accountId, password_hash: passwordHash })
|
|
377
|
+
.onConflict((oc) => oc
|
|
378
|
+
.column("account_id")
|
|
379
|
+
.doUpdateSet({ password_hash: passwordHash, updated_at: new Date() }))
|
|
380
|
+
.execute();
|
|
296
381
|
}
|
|
297
382
|
/**
|
|
298
|
-
*
|
|
299
|
-
*
|
|
383
|
+
* Changes the account under the enterprise admin lock the caller holds: updates the row,
|
|
384
|
+
* re-checks "the last active enterprise admin", audits `account.updated`; disabling revokes the
|
|
385
|
+
* account's sessions and personal tokens.
|
|
300
386
|
*/
|
|
301
|
-
async applyUpdate(
|
|
387
|
+
async applyUpdate(before, patch, auditAs) {
|
|
302
388
|
const id = before.id;
|
|
303
389
|
const values = { updated_at: new Date() };
|
|
304
390
|
if (patch.displayName !== undefined)
|
|
@@ -307,7 +393,7 @@ export class AccountsService {
|
|
|
307
393
|
values.status = patch.status;
|
|
308
394
|
if (patch.isEnterpriseAdmin !== undefined)
|
|
309
395
|
values.is_enterprise_admin = patch.isEnterpriseAdmin;
|
|
310
|
-
const row = await
|
|
396
|
+
const row = await this.db
|
|
311
397
|
.updateTable("accounts")
|
|
312
398
|
.set(values)
|
|
313
399
|
.where("id", "=", id)
|
|
@@ -315,10 +401,10 @@ export class AccountsService {
|
|
|
315
401
|
.executeTakeFirstOrThrow();
|
|
316
402
|
const wasActiveAdmin = before.is_enterprise_admin && before.status === "active";
|
|
317
403
|
const isActiveAdmin = row.is_enterprise_admin && row.status === "active";
|
|
318
|
-
if (wasActiveAdmin && !isActiveAdmin && (await this.countEnterpriseAdmins(
|
|
404
|
+
if (wasActiveAdmin && !isActiveAdmin && (await this.countEnterpriseAdmins()) === 0) {
|
|
319
405
|
throw new ApiError("account.last_enterprise_admin", "Cannot remove the last active enterprise admin");
|
|
320
406
|
}
|
|
321
|
-
await audit(
|
|
407
|
+
await audit(this.db.db, {
|
|
322
408
|
...(auditAs.actorAccountId !== undefined && { actorAccountId: auditAs.actorAccountId }),
|
|
323
409
|
...(auditAs.actorTokenId !== undefined && { actorTokenId: auditAs.actorTokenId }),
|
|
324
410
|
action: "account.updated",
|
|
@@ -327,15 +413,16 @@ export class AccountsService {
|
|
|
327
413
|
});
|
|
328
414
|
let revokedSessionIds = [];
|
|
329
415
|
if (patch.status === "disabled") {
|
|
330
|
-
//
|
|
331
|
-
|
|
416
|
+
// Auth reads the account status on every request, so disabling is effective at once; the
|
|
417
|
+
// credentials are revoked too, so re-enabling does not bring old ones back
|
|
418
|
+
const sessions = await this.db
|
|
332
419
|
.updateTable("sessions")
|
|
333
420
|
.set({ revoked_at: sql `now()` })
|
|
334
421
|
.where("account_id", "=", id)
|
|
335
422
|
.where("revoked_at", "is", null)
|
|
336
423
|
.returning("id")
|
|
337
424
|
.execute();
|
|
338
|
-
await
|
|
425
|
+
await this.db
|
|
339
426
|
.updateTable("api_tokens")
|
|
340
427
|
.set({ revoked_at: sql `now()` })
|
|
341
428
|
.where("kind", "=", "personal")
|
|
@@ -346,22 +433,54 @@ export class AccountsService {
|
|
|
346
433
|
}
|
|
347
434
|
return { account: toAccount(row), revokedSessionIds };
|
|
348
435
|
}
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
436
|
+
};
|
|
437
|
+
__decorate([
|
|
438
|
+
Transactional()
|
|
439
|
+
], AccountsService.prototype, "createByAdminIn", null);
|
|
440
|
+
__decorate([
|
|
441
|
+
Transactional()
|
|
442
|
+
], AccountsService.prototype, "createEnterpriseAdminIfNoneIn", null);
|
|
443
|
+
__decorate([
|
|
444
|
+
Transactional()
|
|
445
|
+
], AccountsService.prototype, "insertEnterpriseAdmin", null);
|
|
446
|
+
__decorate([
|
|
447
|
+
Transactional()
|
|
448
|
+
], AccountsService.prototype, "changePasswordIn", null);
|
|
449
|
+
__decorate([
|
|
450
|
+
Transactional()
|
|
451
|
+
], AccountsService.prototype, "updateAccount", null);
|
|
452
|
+
__decorate([
|
|
453
|
+
Transactional()
|
|
454
|
+
], AccountsService.prototype, "setEnterpriseAdminIn", null);
|
|
455
|
+
__decorate([
|
|
456
|
+
Transactional()
|
|
457
|
+
], AccountsService.prototype, "insertLocal", null);
|
|
458
|
+
__decorate([
|
|
459
|
+
Transactional()
|
|
460
|
+
], AccountsService.prototype, "writePassword", null);
|
|
461
|
+
__decorate([
|
|
462
|
+
Transactional({ propagation: "mandatory" })
|
|
463
|
+
], AccountsService.prototype, "applyUpdate", null);
|
|
464
|
+
AccountsService = __decorate([
|
|
465
|
+
Injectable(),
|
|
466
|
+
__param(0, Inject(KernelDb)),
|
|
467
|
+
__param(1, Inject(TransactionHost)),
|
|
468
|
+
__param(2, Inject(EnterpriseAdminLock)),
|
|
469
|
+
__param(3, Inject(SetupLock))
|
|
470
|
+
], AccountsService);
|
|
471
|
+
export { AccountsService };
|
|
472
|
+
/**
|
|
473
|
+
* {@link AccountsService} with the locks it takes; needs only the database. Part of
|
|
474
|
+
* `IdentityModule`; the CLI's `admin create` / `admin grant` contexts and `@capybara-hq/testing`'s
|
|
475
|
+
* `createLocalAccount` import it alone.
|
|
476
|
+
*/
|
|
477
|
+
let AccountsModule = class AccountsModule {
|
|
478
|
+
};
|
|
479
|
+
AccountsModule = __decorate([
|
|
480
|
+
Module({
|
|
481
|
+
imports: [SetupLockModule, EnterpriseAdminLockModule],
|
|
482
|
+
providers: [AccountsService],
|
|
483
|
+
exports: [AccountsService],
|
|
484
|
+
})
|
|
485
|
+
], AccountsModule);
|
|
486
|
+
export { AccountsModule };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { type Transaction } from "kysely";
|
|
2
1
|
import { z } from "zod";
|
|
3
|
-
import
|
|
2
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
3
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
4
|
+
import { OrgLock } from "../orgs/org-lock.js";
|
|
4
5
|
export interface ApiTokenRecord {
|
|
5
6
|
id: string;
|
|
6
7
|
kind: "personal" | "service";
|
|
@@ -21,11 +22,13 @@ type Scope = {
|
|
|
21
22
|
};
|
|
22
23
|
/**
|
|
23
24
|
* API 令牌服务:个人令牌(`cap_pat_`,代表账号本人)与服务令牌(`cap_svc_`,属于组织、带角色)。
|
|
24
|
-
* 库里只存 sha256
|
|
25
|
+
* 库里只存 sha256;明文只在创建时返回一次。
|
|
25
26
|
*/
|
|
26
27
|
export declare class ApiTokenService {
|
|
27
28
|
private readonly db;
|
|
28
|
-
|
|
29
|
+
readonly txHost: TransactionHost;
|
|
30
|
+
private readonly orgLock;
|
|
31
|
+
constructor(db: KernelDb, txHost: TransactionHost, orgLock: OrgLock);
|
|
29
32
|
createPersonal(accountId: string, input: {
|
|
30
33
|
name: string;
|
|
31
34
|
expiresAt?: Date | undefined;
|
|
@@ -63,9 +66,10 @@ export declare class ApiTokenService {
|
|
|
63
66
|
authenticate(token: string): Promise<ApiTokenRecord | null>;
|
|
64
67
|
/** 列出该 scope 下未吊销的令牌(含已过期),按创建时间升序。 */
|
|
65
68
|
list(scope: Scope): Promise<ApiTokenRecord[]>;
|
|
66
|
-
/**
|
|
67
|
-
revoke(id: string, scope: Scope
|
|
68
|
-
|
|
69
|
+
/** Revokes a token (in the context's transaction when there is one); missing, revoked or out of scope → `token.not_found`. */
|
|
70
|
+
revoke(id: string, scope: Scope): Promise<void>;
|
|
71
|
+
/** Revokes the org's service tokens (in the context's transaction when there is one). */
|
|
72
|
+
revokeAllForOrg(orgId: string): Promise<void>;
|
|
69
73
|
revokeAllPersonal(accountId: string): Promise<void>;
|
|
70
74
|
private scoped;
|
|
71
75
|
private insertToken;
|