@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,21 @@
|
|
|
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 { randomBytes, randomUUID } from "node:crypto";
|
|
11
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
2
12
|
import { sql } from "kysely";
|
|
3
13
|
import { z } from "zod";
|
|
4
14
|
import { ApiError } from "../errors.js";
|
|
5
|
-
import {
|
|
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";
|
|
18
|
+
import { OrgLock } from "../orgs/org-lock.js";
|
|
6
19
|
import { roleAtLeast } from "../orgs/roles.js";
|
|
7
20
|
import { audit } from "./audit.js";
|
|
8
21
|
import { sha256Hex } from "./hash.js";
|
|
@@ -35,16 +48,20 @@ function validate(input) {
|
|
|
35
48
|
}
|
|
36
49
|
/**
|
|
37
50
|
* API 令牌服务:个人令牌(`cap_pat_`,代表账号本人)与服务令牌(`cap_svc_`,属于组织、带角色)。
|
|
38
|
-
* 库里只存 sha256
|
|
51
|
+
* 库里只存 sha256;明文只在创建时返回一次。
|
|
39
52
|
*/
|
|
40
|
-
|
|
53
|
+
let ApiTokenService = class ApiTokenService {
|
|
41
54
|
db;
|
|
42
|
-
|
|
55
|
+
txHost;
|
|
56
|
+
orgLock;
|
|
57
|
+
constructor(db, txHost, orgLock) {
|
|
43
58
|
this.db = db;
|
|
59
|
+
this.txHost = txHost;
|
|
60
|
+
this.orgLock = orgLock;
|
|
44
61
|
}
|
|
45
62
|
async createPersonal(accountId, input) {
|
|
46
63
|
validate(input);
|
|
47
|
-
return this.insertToken(
|
|
64
|
+
return this.insertToken("personal", {
|
|
48
65
|
account_id: accountId,
|
|
49
66
|
org_id: null,
|
|
50
67
|
role: null,
|
|
@@ -55,7 +72,7 @@ export class ApiTokenService {
|
|
|
55
72
|
}
|
|
56
73
|
async createService(orgId, input) {
|
|
57
74
|
validate(input);
|
|
58
|
-
return this.insertToken(
|
|
75
|
+
return this.insertToken("service", {
|
|
59
76
|
account_id: null,
|
|
60
77
|
org_id: orgId,
|
|
61
78
|
role: input.role,
|
|
@@ -70,43 +87,39 @@ export class ApiTokenService {
|
|
|
70
87
|
*/
|
|
71
88
|
async createServiceAs(orgId, actorAccountId, input) {
|
|
72
89
|
validate(input);
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
expires_at: input.expiresAt ?? null,
|
|
85
|
-
});
|
|
86
|
-
await audit(t, {
|
|
87
|
-
actorAccountId,
|
|
88
|
-
orgId,
|
|
89
|
-
action: "org.service_token.created",
|
|
90
|
-
target: created.record.id,
|
|
91
|
-
detail: { name: input.name, role: input.role },
|
|
92
|
-
});
|
|
93
|
-
return created;
|
|
90
|
+
const { role } = await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "org.tokens.manage");
|
|
91
|
+
if (!roleAtLeast(role, input.role)) {
|
|
92
|
+
throw new ApiError("forbidden", "Insufficient organization role");
|
|
93
|
+
}
|
|
94
|
+
const created = await this.insertToken("service", {
|
|
95
|
+
account_id: null,
|
|
96
|
+
org_id: orgId,
|
|
97
|
+
role: input.role,
|
|
98
|
+
name: input.name,
|
|
99
|
+
created_by: actorAccountId,
|
|
100
|
+
expires_at: input.expiresAt ?? null,
|
|
94
101
|
});
|
|
102
|
+
await audit(this.db.db, {
|
|
103
|
+
actorAccountId,
|
|
104
|
+
orgId,
|
|
105
|
+
action: "org.service_token.created",
|
|
106
|
+
target: created.record.id,
|
|
107
|
+
detail: { name: input.name, role: input.role },
|
|
108
|
+
});
|
|
109
|
+
return created;
|
|
95
110
|
}
|
|
96
111
|
/**
|
|
97
112
|
* 以账号身份吊销组织服务令牌并写审计(同一事务):同 createServiceAs 在组织行锁内实时复核发起人角色
|
|
98
113
|
* (组织不存在 / 已删除 → `org.not_found`,无 `org.tokens.manage` → `forbidden`);不在该组织内 → `token.not_found`。
|
|
99
114
|
*/
|
|
100
115
|
async revokeServiceAs(orgId, tokenId, actorAccountId) {
|
|
101
|
-
await this.
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
target: tokenId,
|
|
109
|
-
});
|
|
116
|
+
await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "org.tokens.manage");
|
|
117
|
+
await this.revoke(tokenId, { orgId });
|
|
118
|
+
await audit(this.db.db, {
|
|
119
|
+
actorAccountId,
|
|
120
|
+
orgId,
|
|
121
|
+
action: "org.service_token.revoked",
|
|
122
|
+
target: tokenId,
|
|
110
123
|
});
|
|
111
124
|
}
|
|
112
125
|
/** 校验令牌明文;未知、已吊销、已过期或前缀不对一律返回 null。 */
|
|
@@ -153,17 +166,18 @@ export class ApiTokenService {
|
|
|
153
166
|
.execute();
|
|
154
167
|
return rows.map(toRecord);
|
|
155
168
|
}
|
|
156
|
-
/**
|
|
157
|
-
async revoke(id, scope
|
|
158
|
-
const r = await this.scoped(
|
|
169
|
+
/** Revokes a token (in the context's transaction when there is one); missing, revoked or out of scope → `token.not_found`. */
|
|
170
|
+
async revoke(id, scope) {
|
|
171
|
+
const r = await this.scoped(this.db.updateTable("api_tokens").set({ revoked_at: sql `now()` }), scope)
|
|
159
172
|
.where("id", "=", id)
|
|
160
173
|
.where("revoked_at", "is", null)
|
|
161
174
|
.executeTakeFirst();
|
|
162
175
|
if (r.numUpdatedRows === 0n)
|
|
163
176
|
throw new ApiError("token.not_found", "Token not found");
|
|
164
177
|
}
|
|
165
|
-
|
|
166
|
-
|
|
178
|
+
/** Revokes the org's service tokens (in the context's transaction when there is one). */
|
|
179
|
+
async revokeAllForOrg(orgId) {
|
|
180
|
+
await this.db
|
|
167
181
|
.updateTable("api_tokens")
|
|
168
182
|
.set({ revoked_at: sql `now()` })
|
|
169
183
|
.where("kind", "=", "service")
|
|
@@ -185,13 +199,26 @@ export class ApiTokenService {
|
|
|
185
199
|
? q.where("kind", "=", "personal").where("account_id", "=", scope.accountId)
|
|
186
200
|
: q.where("kind", "=", "service").where("org_id", "=", scope.orgId);
|
|
187
201
|
}
|
|
188
|
-
async insertToken(
|
|
202
|
+
async insertToken(kind, values) {
|
|
189
203
|
const token = PREFIX[kind] + randomBytes(32).toString("base64url");
|
|
190
|
-
const row = await db
|
|
204
|
+
const row = await this.db
|
|
191
205
|
.insertInto("api_tokens")
|
|
192
206
|
.values({ id: randomUUID(), kind, token_hash: sha256Hex(token), ...values })
|
|
193
207
|
.returningAll()
|
|
194
208
|
.executeTakeFirstOrThrow();
|
|
195
209
|
return { token, record: toRecord(row) };
|
|
196
210
|
}
|
|
197
|
-
}
|
|
211
|
+
};
|
|
212
|
+
__decorate([
|
|
213
|
+
Transactional()
|
|
214
|
+
], ApiTokenService.prototype, "createServiceAs", null);
|
|
215
|
+
__decorate([
|
|
216
|
+
Transactional()
|
|
217
|
+
], ApiTokenService.prototype, "revokeServiceAs", null);
|
|
218
|
+
ApiTokenService = __decorate([
|
|
219
|
+
Injectable(),
|
|
220
|
+
__param(0, Inject(KernelDb)),
|
|
221
|
+
__param(1, Inject(TransactionHost)),
|
|
222
|
+
__param(2, Inject(OrgLock))
|
|
223
|
+
], ApiTokenService);
|
|
224
|
+
export { ApiTokenService };
|
package/dist/identity/audit.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import type { KernelSchemaDb } from "../db/kernel-schema.js";
|
|
2
|
+
/**
|
|
3
|
+
* Writes one audit event (`action` is dotted lower-case English, e.g. `org.member.role_changed`)
|
|
4
|
+
* through `db`: a service passes `this.db.db` (`KernelDb`: the context's transaction or the pool),
|
|
5
|
+
* so the event commits or rolls back with the write it records.
|
|
6
|
+
*/
|
|
7
|
+
export declare function audit(db: KernelSchemaDb, e: {
|
|
5
8
|
actorAccountId?: string;
|
|
6
9
|
actorTokenId?: string;
|
|
7
10
|
orgId?: string;
|
package/dist/identity/audit.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Writes one audit event (`action` is dotted lower-case English, e.g. `org.member.role_changed`)
|
|
3
|
+
* through `db`: a service passes `this.db.db` (`KernelDb`: the context's transaction or the pool),
|
|
4
|
+
* so the event commits or rolls back with the write it records.
|
|
5
|
+
*/
|
|
2
6
|
export async function audit(db, e) {
|
|
3
7
|
await db
|
|
4
8
|
.insertInto("audit_events")
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { FastifyReply, FastifyRequest } from "fastify";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import type
|
|
6
|
-
import
|
|
7
|
-
declare const
|
|
3
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
4
|
+
import { CredentialThrottler } from "../infra/throttler/credential-throttler.js";
|
|
5
|
+
import { type Account, AccountsService } from "./accounts.js";
|
|
6
|
+
import { SessionService } from "./sessions.js";
|
|
7
|
+
declare const LoginBodySchema: z.ZodObject<{
|
|
8
8
|
login: z.ZodString;
|
|
9
9
|
password: z.ZodString;
|
|
10
10
|
}, z.core.$strip>;
|
|
@@ -17,14 +17,15 @@ export declare function clientMeta(req: FastifyRequest): {
|
|
|
17
17
|
export declare class AuthController {
|
|
18
18
|
private readonly accounts;
|
|
19
19
|
private readonly sessions;
|
|
20
|
-
private readonly
|
|
20
|
+
private readonly throttler;
|
|
21
21
|
private readonly config;
|
|
22
|
-
constructor(accounts: AccountsService, sessions: SessionService,
|
|
22
|
+
constructor(accounts: AccountsService, sessions: SessionService, throttler: CredentialThrottler, config: KernelConfigService);
|
|
23
23
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
24
|
+
* An unknown login and a wrong password answer the same error. Every attempt first reserves one
|
|
25
|
+
* attempt on the (login, IP), IP and login counters atomically; success clears the login
|
|
26
|
+
* counters and gives the IP attempt back (`CredentialThrottler`).
|
|
26
27
|
*/
|
|
27
|
-
login(body: z.infer<typeof
|
|
28
|
+
login(body: z.infer<typeof LoginBodySchema>, req: FastifyRequest, reply: FastifyReply): Promise<{
|
|
28
29
|
account: Account;
|
|
29
30
|
}>;
|
|
30
31
|
/**
|
|
@@ -7,14 +7,22 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
8
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
9
|
};
|
|
10
|
-
import {
|
|
10
|
+
import { Controller, HttpCode, Inject, Post, Req, Res } from "@nestjs/common";
|
|
11
11
|
import { z } from "zod";
|
|
12
12
|
import { ApiError } from "../errors.js";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
13
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
14
|
+
import { CredentialThrottler } from "../infra/throttler/credential-throttler.js";
|
|
15
|
+
import { createZodDto } from "../infra/validation/create-zod-dto.js";
|
|
16
|
+
import { ZBody } from "../infra/validation/zod-params.js";
|
|
17
|
+
import { AccountsService } from "./accounts.js";
|
|
15
18
|
import { ACCESS_COOKIE, clearSessionCookies, REFRESH_COOKIE, setSessionCookies, } from "./cookies.js";
|
|
16
19
|
import { Public } from "./principal.js";
|
|
17
|
-
|
|
20
|
+
import { SessionService } from "./sessions.js";
|
|
21
|
+
const LoginBodySchema = z.object({ login: z.string().max(256), password: z.string() });
|
|
22
|
+
class LoginBody extends createZodDto(LoginBodySchema, "LoginBody") {
|
|
23
|
+
}
|
|
24
|
+
/** The credential throttlers of a login attempt (R25: per (login, IP), per IP, per login). */
|
|
25
|
+
const LOGIN_THROTTLERS = ["login", "login-ip", "login-account"];
|
|
18
26
|
/** 会话的客户端信息(记入 sessions 表)。`req.ip` 在 `http.trustProxy` 时取自 X-Forwarded-For。 */
|
|
19
27
|
export function clientMeta(req) {
|
|
20
28
|
const ua = req.headers["user-agent"];
|
|
@@ -24,42 +32,40 @@ export function clientMeta(req) {
|
|
|
24
32
|
let AuthController = class AuthController {
|
|
25
33
|
accounts;
|
|
26
34
|
sessions;
|
|
27
|
-
|
|
35
|
+
throttler;
|
|
28
36
|
config;
|
|
29
|
-
constructor(accounts, sessions,
|
|
37
|
+
constructor(accounts, sessions, throttler, config) {
|
|
30
38
|
this.accounts = accounts;
|
|
31
39
|
this.sessions = sessions;
|
|
32
|
-
this.
|
|
40
|
+
this.throttler = throttler;
|
|
33
41
|
this.config = config;
|
|
34
42
|
}
|
|
35
43
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
44
|
+
* An unknown login and a wrong password answer the same error. Every attempt first reserves one
|
|
45
|
+
* attempt on the (login, IP), IP and login counters atomically; success clears the login
|
|
46
|
+
* counters and gives the IP attempt back (`CredentialThrottler`).
|
|
38
47
|
*/
|
|
39
48
|
async login(body, req, reply) {
|
|
40
49
|
const meta = clientMeta(req);
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
if (!rl.allowed) {
|
|
44
|
-
reply.header("retry-after", String(rl.retryAfterSeconds));
|
|
45
|
-
throw new ApiError("auth.rate_limited", "Too many failed login attempts; try again later");
|
|
46
|
-
}
|
|
50
|
+
// reserve before checking the password, atomically: concurrent requests cannot pass the limit
|
|
51
|
+
await this.throttler.reserve(LOGIN_THROTTLERS, req, reply);
|
|
47
52
|
let account;
|
|
48
53
|
try {
|
|
49
54
|
account = await this.accounts.authenticateLocal(body.login, body.password);
|
|
50
55
|
}
|
|
51
56
|
catch (e) {
|
|
52
|
-
//
|
|
57
|
+
// a disabled account's password is right (authenticateLocal checks it before the status):
|
|
58
|
+
// not a failed attempt, the reservation is given back
|
|
53
59
|
if (e instanceof ApiError && e.code === "auth.account_disabled") {
|
|
54
|
-
await this.
|
|
60
|
+
await this.throttler.succeeded(LOGIN_THROTTLERS, req);
|
|
55
61
|
}
|
|
56
62
|
throw e;
|
|
57
63
|
}
|
|
58
64
|
if (!account)
|
|
59
65
|
throw new ApiError("auth.invalid_credentials", "Invalid login or password");
|
|
60
|
-
await this.
|
|
66
|
+
await this.throttler.succeeded(LOGIN_THROTTLERS, req);
|
|
61
67
|
const session = await this.sessions.create(account.id, meta);
|
|
62
|
-
setSessionCookies(reply, session, this.config());
|
|
68
|
+
setSessionCookies(reply, session, this.config.get());
|
|
63
69
|
return { account };
|
|
64
70
|
}
|
|
65
71
|
/**
|
|
@@ -75,7 +81,7 @@ let AuthController = class AuthController {
|
|
|
75
81
|
const account = await this.accounts.get(session.accountId);
|
|
76
82
|
if (!account)
|
|
77
83
|
throw new ApiError("auth.refresh_invalid", "Refresh token is invalid");
|
|
78
|
-
setSessionCookies(reply, session, this.config());
|
|
84
|
+
setSessionCookies(reply, session, this.config.get());
|
|
79
85
|
return { account };
|
|
80
86
|
}
|
|
81
87
|
catch (e) {
|
|
@@ -102,7 +108,7 @@ __decorate([
|
|
|
102
108
|
Post("login"),
|
|
103
109
|
Public(),
|
|
104
110
|
HttpCode(200),
|
|
105
|
-
__param(0,
|
|
111
|
+
__param(0, ZBody(LoginBody)),
|
|
106
112
|
__param(1, Req()),
|
|
107
113
|
__param(2, Res({ passthrough: true }))
|
|
108
114
|
], AuthController.prototype, "login", null);
|
|
@@ -122,9 +128,9 @@ __decorate([
|
|
|
122
128
|
], AuthController.prototype, "logout", null);
|
|
123
129
|
AuthController = __decorate([
|
|
124
130
|
Controller("api/v1/auth"),
|
|
125
|
-
__param(0, Inject(
|
|
126
|
-
__param(1, Inject(
|
|
127
|
-
__param(2, Inject(
|
|
128
|
-
__param(3, Inject(
|
|
131
|
+
__param(0, Inject(AccountsService)),
|
|
132
|
+
__param(1, Inject(SessionService)),
|
|
133
|
+
__param(2, Inject(CredentialThrottler)),
|
|
134
|
+
__param(3, Inject(KernelConfigService))
|
|
129
135
|
], AuthController);
|
|
130
136
|
export { AuthController };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { type CanActivate, type ExecutionContext } from "@nestjs/common";
|
|
2
2
|
import { Reflector } from "@nestjs/core";
|
|
3
3
|
import type { FastifyRequest } from "fastify";
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
4
|
+
import { AccountsService } from "./accounts.js";
|
|
5
|
+
import { ApiTokenService } from "./api-tokens.js";
|
|
6
|
+
import { SessionService } from "./sessions.js";
|
|
7
7
|
/** CSRF 头:Cookie 认证的非安全请求(及所有公开路由的非安全请求)必须带 `X-Capybara-Csrf: 1`。 */
|
|
8
8
|
export declare const CSRF_HEADER = "x-capybara-csrf";
|
|
9
9
|
/** 解析凭据要用的服务({@link AuthGuard} 与 {@link authorizeEnterpriseAdmin} 共用)。 */
|
|
@@ -10,9 +10,11 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
10
10
|
import { Inject, Injectable } from "@nestjs/common";
|
|
11
11
|
import { Reflector } from "@nestjs/core";
|
|
12
12
|
import { ApiError } from "../errors.js";
|
|
13
|
-
import {
|
|
13
|
+
import { AccountsService } from "./accounts.js";
|
|
14
|
+
import { ApiTokenService } from "./api-tokens.js";
|
|
14
15
|
import { ACCESS_COOKIE } from "./cookies.js";
|
|
15
16
|
import { ALLOW_SERVICE_KEY, ENTERPRISE_ADMIN_KEY, PUBLIC_KEY, SESSION_ONLY_KEY, } from "./principal.js";
|
|
17
|
+
import { SessionService } from "./sessions.js";
|
|
16
18
|
/** CSRF 头:Cookie 认证的非安全请求(及所有公开路由的非安全请求)必须带 `X-Capybara-Csrf: 1`。 */
|
|
17
19
|
export const CSRF_HEADER = "x-capybara-csrf";
|
|
18
20
|
const SAFE_METHODS = new Set(["GET", "HEAD", "OPTIONS"]);
|
|
@@ -149,9 +151,9 @@ let AuthGuard = class AuthGuard {
|
|
|
149
151
|
AuthGuard = __decorate([
|
|
150
152
|
Injectable(),
|
|
151
153
|
__param(0, Inject(Reflector)),
|
|
152
|
-
__param(1, Inject(
|
|
153
|
-
__param(2, Inject(
|
|
154
|
-
__param(3, Inject(
|
|
154
|
+
__param(1, Inject(AccountsService)),
|
|
155
|
+
__param(2, Inject(SessionService)),
|
|
156
|
+
__param(3, Inject(ApiTokenService))
|
|
155
157
|
], AuthGuard);
|
|
156
158
|
export { AuthGuard };
|
|
157
159
|
function requireActive(account) {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { ExternalIdentity } from "@capybara-hq/plugin-sdk";
|
|
2
2
|
import type { Redis } from "ioredis";
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
3
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
4
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
5
|
+
import { ExternalIdentities } from "./external.js";
|
|
6
6
|
/** 绑定令牌的有效期(秒)。 */
|
|
7
7
|
export declare const BIND_TOKEN_TTL_SECONDS = 900;
|
|
8
8
|
/** 绑定确认页(网页)路径前缀:`<http.publicUrl>/bind/<token>`。 */
|
|
@@ -19,16 +19,14 @@ export interface PendingBinding {
|
|
|
19
19
|
/**
|
|
20
20
|
* IM 里识别不出的人:内核发一个一次性绑定链接,本人登录网页后确认,把该 IM 身份绑到当前账号。
|
|
21
21
|
* 令牌 `cap_bind_<32 字节>`,Redis `capk:bind:<sha256>` 15 分钟、单次有效(确认时 GETDEL)。
|
|
22
|
-
* 查看与确认时都复核发出链接的渠道连接仍可用(存在、未删除、其插件仍在该组织启用),否则 `bind.invalid
|
|
22
|
+
* 查看与确认时都复核发出链接的渠道连接仍可用(存在、未删除、其插件仍在该组织启用),否则 `bind.invalid`。
|
|
23
23
|
*/
|
|
24
24
|
export declare class IdentityBinding {
|
|
25
|
-
private readonly
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
external: ExternalIdentities;
|
|
31
|
-
});
|
|
25
|
+
private readonly db;
|
|
26
|
+
private readonly redis;
|
|
27
|
+
private readonly config;
|
|
28
|
+
private readonly external;
|
|
29
|
+
constructor(db: KernelDb, redis: Redis, config: Pick<KernelConfigService, "get">, external: ExternalIdentities);
|
|
32
30
|
/** 生成绑定链接(渠道运行时在回绑定卡片时调用);需要 `http.publicUrl`。 */
|
|
33
31
|
createBindToken(args: {
|
|
34
32
|
connectionId: string;
|
package/dist/identity/binding.js
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
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 { createHash, randomBytes } from "node:crypto";
|
|
11
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
2
12
|
import { ApiError } from "../errors.js";
|
|
3
13
|
import { enabledExtensionsByOrg } from "../extensions/enabled.js";
|
|
14
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
15
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
16
|
+
import { REDIS } from "../infra/tokens.js";
|
|
17
|
+
import { ExternalIdentities } from "./external.js";
|
|
4
18
|
/** 绑定令牌的有效期(秒)。 */
|
|
5
19
|
export const BIND_TOKEN_TTL_SECONDS = 900;
|
|
6
20
|
/** 绑定确认页(网页)路径前缀:`<http.publicUrl>/bind/<token>`。 */
|
|
@@ -22,28 +36,34 @@ const view = (r) => ({
|
|
|
22
36
|
/**
|
|
23
37
|
* IM 里识别不出的人:内核发一个一次性绑定链接,本人登录网页后确认,把该 IM 身份绑到当前账号。
|
|
24
38
|
* 令牌 `cap_bind_<32 字节>`,Redis `capk:bind:<sha256>` 15 分钟、单次有效(确认时 GETDEL)。
|
|
25
|
-
* 查看与确认时都复核发出链接的渠道连接仍可用(存在、未删除、其插件仍在该组织启用),否则 `bind.invalid
|
|
39
|
+
* 查看与确认时都复核发出链接的渠道连接仍可用(存在、未删除、其插件仍在该组织启用),否则 `bind.invalid`。
|
|
26
40
|
*/
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
41
|
+
let IdentityBinding = class IdentityBinding {
|
|
42
|
+
db;
|
|
43
|
+
redis;
|
|
44
|
+
config;
|
|
45
|
+
external;
|
|
46
|
+
constructor(db, redis, config, external) {
|
|
47
|
+
this.db = db;
|
|
48
|
+
this.redis = redis;
|
|
49
|
+
this.config = config;
|
|
50
|
+
this.external = external;
|
|
31
51
|
}
|
|
32
52
|
/** 生成绑定链接(渠道运行时在回绑定卡片时调用);需要 `http.publicUrl`。 */
|
|
33
53
|
async createBindToken(args) {
|
|
34
|
-
const publicUrl = this.
|
|
54
|
+
const publicUrl = this.config.get().http.publicUrl;
|
|
35
55
|
if (!publicUrl)
|
|
36
56
|
throw new Error("binding links require http.publicUrl to be configured");
|
|
37
57
|
const token = TOKEN_PREFIX + randomBytes(32).toString("base64url");
|
|
38
58
|
const rec = { connectionId: args.connectionId, identity: args.identity };
|
|
39
|
-
await this.
|
|
59
|
+
await this.redis.set(tokenKey(token), JSON.stringify(rec), "EX", BIND_TOKEN_TTL_SECONDS);
|
|
40
60
|
return `${publicUrl.replace(/\/+$/, "")}${BIND_PAGE_PATH}${token}`;
|
|
41
61
|
}
|
|
42
62
|
/** 查看待绑定的身份(不消耗令牌);无效 / 过期 / 已用 → `bind.invalid`。 */
|
|
43
63
|
async peek(token) {
|
|
44
64
|
if (!TOKEN_RE.test(token))
|
|
45
65
|
throw invalid();
|
|
46
|
-
const raw = await this.
|
|
66
|
+
const raw = await this.redis.get(tokenKey(token));
|
|
47
67
|
if (raw === null)
|
|
48
68
|
throw invalid();
|
|
49
69
|
const rec = JSON.parse(raw);
|
|
@@ -59,20 +79,20 @@ export class IdentityBinding {
|
|
|
59
79
|
async bind(token, accountId) {
|
|
60
80
|
if (!TOKEN_RE.test(token))
|
|
61
81
|
throw invalid();
|
|
62
|
-
const raw = await this.
|
|
82
|
+
const raw = await this.redis.getdel(tokenKey(token));
|
|
63
83
|
if (raw === null)
|
|
64
84
|
throw invalid();
|
|
65
85
|
const rec = JSON.parse(raw);
|
|
66
86
|
if (!(await this.connectionUsable(rec.connectionId)))
|
|
67
87
|
throw invalid();
|
|
68
|
-
await this.
|
|
88
|
+
await this.external.link(accountId, rec.identity);
|
|
69
89
|
return view(rec);
|
|
70
90
|
}
|
|
71
91
|
/** 渠道连接存在、未软删除,且其插件在连接所属组织启用。 */
|
|
72
92
|
async connectionUsable(connectionId) {
|
|
73
|
-
const row = await this.
|
|
93
|
+
const row = await this.db
|
|
74
94
|
.selectFrom("channel_connections")
|
|
75
|
-
.innerJoin(enabledExtensionsByOrg(this.
|
|
95
|
+
.innerJoin(enabledExtensionsByOrg(this.db.db).as("en"), (j) => j
|
|
76
96
|
.onRef("en.org_id", "=", "channel_connections.org_id")
|
|
77
97
|
.onRef("en.plugin", "=", "channel_connections.plugin"))
|
|
78
98
|
.select("channel_connections.id")
|
|
@@ -81,4 +101,12 @@ export class IdentityBinding {
|
|
|
81
101
|
.executeTakeFirst();
|
|
82
102
|
return row !== undefined;
|
|
83
103
|
}
|
|
84
|
-
}
|
|
104
|
+
};
|
|
105
|
+
IdentityBinding = __decorate([
|
|
106
|
+
Injectable(),
|
|
107
|
+
__param(0, Inject(KernelDb)),
|
|
108
|
+
__param(1, Inject(REDIS)),
|
|
109
|
+
__param(2, Inject(KernelConfigService)),
|
|
110
|
+
__param(3, Inject(ExternalIdentities))
|
|
111
|
+
], IdentityBinding);
|
|
112
|
+
export { IdentityBinding };
|
|
@@ -1,14 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
1
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
2
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
3
|
+
import { XactLock } from "../infra/database/xact-lock.js";
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* 没有发起账号的调用方(CLI)用它;有发起账号的用 {@link lockEnterpriseAdminsAndAuthorize}。
|
|
5
|
+
* The enterprise admin lock, the one implementation of "lock, then re-check the actor":
|
|
6
|
+
* both methods join the caller's transaction (`mandatory`), which holds the lock until it ends.
|
|
7
7
|
*/
|
|
8
|
-
export declare
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
*/
|
|
14
|
-
|
|
8
|
+
export declare class EnterpriseAdminLock {
|
|
9
|
+
private readonly db;
|
|
10
|
+
private readonly xactLock;
|
|
11
|
+
readonly txHost: TransactionHost;
|
|
12
|
+
constructor(db: KernelDb, xactLock: XactLock, txHost: TransactionHost);
|
|
13
|
+
/** Only the lock (callers without an actor: the CLI, bootstrap). */
|
|
14
|
+
lock(): Promise<void>;
|
|
15
|
+
/** The lock, then {@link assertActiveEnterpriseAdmin} under it. */
|
|
16
|
+
lockAndAuthorize(actorAccountId: string): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
/** The one {@link EnterpriseAdminLock}: identity, models, the extensions and the catalog import it. */
|
|
19
|
+
export declare class EnterpriseAdminLockModule {
|
|
20
|
+
}
|