@capybara-hq/kernel 0.1.0-rc.1 → 0.1.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/admin.controller.d.ts +17 -17
- package/dist/admin/admin.controller.js +43 -26
- package/dist/admin/admin.module.d.ts +3 -0
- package/dist/admin/admin.module.js +22 -0
- package/dist/admin/extensions.controller.d.ts +14 -14
- package/dist/admin/extensions.controller.js +30 -17
- package/dist/admin/setup-lock.d.ts +16 -0
- package/dist/admin/setup-lock.js +47 -0
- package/dist/admin/setup.controller.d.ts +8 -8
- package/dist/admin/setup.controller.js +27 -25
- package/dist/admin/setup.service.d.ts +19 -27
- package/dist/admin/setup.service.js +61 -61
- package/dist/agents/agent-lookup.d.ts +53 -0
- package/dist/agents/agent-lookup.js +179 -0
- package/dist/agents/agents.controller.d.ts +1 -1
- package/dist/agents/agents.controller.js +14 -8
- package/dist/agents/agents.module.d.ts +7 -0
- package/dist/agents/agents.module.js +41 -0
- package/dist/agents/agents.service.d.ts +39 -58
- package/dist/agents/agents.service.js +261 -329
- package/dist/agents/definition.d.ts +8 -0
- package/dist/agents/definition.js +8 -0
- package/dist/agents/models.controller.d.ts +1 -1
- package/dist/agents/models.controller.js +2 -2
- package/dist/agents/templates.controller.d.ts +1 -1
- package/dist/agents/templates.controller.js +2 -2
- package/dist/agents/templates.d.ts +6 -8
- package/dist/agents/templates.js +20 -4
- package/dist/app.d.ts +93 -0
- package/dist/app.js +150 -0
- package/dist/catalog/admin-catalog.controller.d.ts +3 -3
- package/dist/catalog/admin-catalog.controller.js +27 -13
- package/dist/catalog/catalog-content.d.ts +185 -0
- package/dist/catalog/catalog-content.js +323 -0
- package/dist/catalog/catalog-items.d.ts +186 -0
- package/dist/catalog/catalog-items.js +410 -0
- package/dist/catalog/catalog.module.d.ts +14 -0
- package/dist/catalog/catalog.module.js +71 -0
- package/dist/catalog/catalog.service.d.ts +34 -188
- package/dist/catalog/catalog.service.js +155 -489
- package/dist/catalog/cli.d.ts +3 -2
- package/dist/catalog/cli.js +13 -31
- package/dist/catalog/job-ids.d.ts +15 -0
- package/dist/catalog/job-ids.js +15 -0
- package/dist/catalog/jobs.d.ts +27 -0
- package/dist/catalog/jobs.js +70 -0
- package/dist/catalog/locks.d.ts +24 -0
- package/dist/catalog/locks.js +63 -0
- package/dist/catalog/marketplaces.controller.d.ts +4 -4
- package/dist/catalog/marketplaces.controller.js +22 -11
- package/dist/catalog/marketplaces.service.d.ts +30 -13
- package/dist/catalog/marketplaces.service.js +330 -256
- package/dist/catalog/org-catalog.controller.d.ts +4 -3
- package/dist/catalog/org-catalog.controller.js +29 -14
- package/dist/catalog/org-catalog.service.d.ts +32 -198
- package/dist/catalog/org-catalog.service.js +159 -400
- package/dist/catalog/plugin-import.d.ts +73 -34
- package/dist/catalog/plugin-import.js +356 -217
- package/dist/catalog/plugin-install.d.ts +83 -41
- package/dist/catalog/plugin-install.js +421 -269
- package/dist/catalog/plugin-upgrade.d.ts +59 -4
- package/dist/catalog/plugin-upgrade.js +407 -282
- package/dist/catalog/requests.service.d.ts +27 -15
- package/dist/catalog/requests.service.js +201 -145
- package/dist/catalog/upgrade-targets.d.ts +4 -7
- package/dist/channels/actions.d.ts +6 -4
- package/dist/channels/actions.js +1 -1
- package/dist/channels/cards.d.ts +2 -2
- package/dist/channels/channels.module.d.ts +40 -0
- package/dist/channels/channels.module.js +128 -0
- package/dist/channels/connections.controller.d.ts +1 -1
- package/dist/channels/connections.controller.js +11 -6
- package/dist/channels/connections.service.d.ts +43 -21
- package/dist/channels/connections.service.js +236 -131
- package/dist/channels/inbound.d.ts +34 -38
- package/dist/channels/inbound.js +107 -41
- package/dist/channels/job-ids.d.ts +10 -0
- package/dist/channels/job-ids.js +10 -0
- package/dist/channels/jobs.d.ts +85 -0
- package/dist/channels/jobs.js +157 -0
- package/dist/channels/outbound.d.ts +60 -82
- package/dist/channels/outbound.js +165 -194
- package/dist/channels/supervisor.d.ts +88 -46
- package/dist/channels/supervisor.js +230 -132
- package/dist/channels/threads.d.ts +29 -8
- package/dist/channels/threads.js +71 -13
- package/dist/channels/webhook.d.ts +20 -14
- package/dist/channels/webhook.js +51 -20
- package/dist/config/load.d.ts +3 -2
- package/dist/config/load.js +3 -2
- package/dist/config/nacos-source.js +11 -2
- package/dist/config/schema.d.ts +1 -0
- package/dist/config/schema.js +10 -4
- package/dist/conversations/access.d.ts +29 -0
- package/dist/conversations/access.js +86 -0
- package/dist/conversations/artifacts.d.ts +10 -10
- package/dist/conversations/artifacts.js +35 -9
- package/dist/conversations/attachments.controller.d.ts +1 -1
- package/dist/conversations/attachments.controller.js +8 -6
- package/dist/conversations/attachments.module.d.ts +7 -0
- package/dist/conversations/attachments.module.js +25 -0
- package/dist/conversations/attachments.service.d.ts +30 -22
- package/dist/conversations/attachments.service.js +119 -46
- package/dist/conversations/conversations.controller.d.ts +8 -7
- package/dist/conversations/conversations.controller.js +59 -29
- package/dist/conversations/conversations.module.d.ts +8 -0
- package/dist/conversations/conversations.module.js +69 -0
- package/dist/conversations/conversations.service.d.ts +40 -38
- package/dist/conversations/conversations.service.js +130 -140
- package/dist/conversations/event-log.d.ts +28 -18
- package/dist/conversations/event-log.js +74 -27
- package/dist/conversations/files.d.ts +10 -10
- package/dist/conversations/files.js +37 -11
- package/dist/conversations/idem-keys.d.ts +5 -0
- package/dist/conversations/idem-keys.js +5 -0
- package/dist/conversations/job-ids.d.ts +6 -0
- package/dist/conversations/job-ids.js +6 -0
- package/dist/conversations/outputs-read.d.ts +11 -11
- package/dist/conversations/outputs-read.js +31 -7
- package/dist/conversations/queue.d.ts +48 -56
- package/dist/conversations/queue.js +13 -289
- package/dist/conversations/queue.service.d.ts +60 -0
- package/dist/conversations/queue.service.js +343 -0
- package/dist/conversations/sandbox-status.d.ts +13 -10
- package/dist/conversations/sandbox-status.js +36 -8
- package/dist/conversations/titles.d.ts +71 -24
- package/dist/conversations/titles.js +159 -63
- package/dist/ctx/bus.js +9 -3
- package/dist/ctx/create-ctx.d.ts +6 -0
- package/dist/ctx/create-ctx.js +7 -9
- package/dist/ctx/lock.d.ts +7 -3
- package/dist/ctx/lock.js +9 -20
- package/dist/ctx/secrets.d.ts +10 -2
- package/dist/ctx/secrets.js +7 -3
- package/dist/db/kernel-schema.d.ts +2 -2
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +1 -0
- package/dist/errors.d.ts +1 -0
- package/dist/errors.js +1 -0
- package/dist/evals/budget.d.ts +42 -21
- package/dist/evals/budget.js +114 -62
- package/dist/evals/evals.module.d.ts +31 -0
- package/dist/evals/evals.module.js +114 -0
- package/dist/evals/jobs.d.ts +20 -0
- package/dist/evals/jobs.js +45 -0
- package/dist/evals/run-replay.d.ts +56 -8
- package/dist/evals/run-replay.js +140 -80
- package/dist/evals/runs.controller.d.ts +1 -1
- package/dist/evals/runs.controller.js +17 -8
- package/dist/evals/runs.service.d.ts +23 -45
- package/dist/evals/runs.service.js +245 -234
- package/dist/evals/sets.controller.d.ts +1 -1
- package/dist/evals/sets.controller.js +17 -8
- package/dist/evals/sets.service.d.ts +22 -6
- package/dist/evals/sets.service.js +248 -194
- package/dist/evals/snapshot.d.ts +2 -2
- package/dist/evals/step-replay.d.ts +2 -2
- package/dist/evals/step-replay.js +1 -1
- package/dist/evals/trajectory.controller.d.ts +1 -1
- package/dist/evals/trajectory.controller.js +11 -7
- package/dist/evals/trajectory.service.d.ts +5 -4
- package/dist/evals/trajectory.service.js +30 -7
- package/dist/evals/worker.d.ts +44 -27
- package/dist/evals/worker.js +220 -121
- package/dist/extensions/admin-ops.d.ts +61 -33
- package/dist/extensions/admin-ops.js +248 -154
- package/dist/extensions/admin-view.d.ts +38 -27
- package/dist/extensions/admin-view.js +126 -55
- package/dist/extensions/approvals.d.ts +12 -8
- package/dist/extensions/approvals.js +73 -46
- package/dist/extensions/blobs.d.ts +27 -10
- package/dist/extensions/blobs.js +111 -45
- package/dist/extensions/bootstrap.d.ts +58 -31
- package/dist/extensions/bootstrap.js +175 -121
- package/dist/extensions/cli.d.ts +20 -10
- package/dist/extensions/cli.js +41 -96
- package/dist/extensions/config-issues.d.ts +7 -0
- package/dist/extensions/config-issues.js +31 -0
- package/dist/extensions/deployment-config-store.d.ts +49 -0
- package/dist/extensions/deployment-config-store.js +133 -0
- package/dist/extensions/deployment-config.d.ts +58 -67
- package/dist/extensions/deployment-config.js +202 -230
- package/dist/extensions/enabled.d.ts +5 -5
- package/dist/extensions/extensions.module.d.ts +8 -0
- package/dist/extensions/extensions.module.js +77 -0
- package/dist/extensions/hooks.d.ts +3 -2
- package/dist/extensions/hooks.js +1 -1
- package/dist/extensions/host.d.ts +72 -68
- package/dist/extensions/host.js +191 -152
- package/dist/extensions/installs.d.ts +49 -16
- package/dist/extensions/installs.js +128 -32
- package/dist/extensions/job-ids.d.ts +6 -0
- package/dist/extensions/job-ids.js +6 -0
- package/dist/extensions/lifecycle-topics.d.ts +18 -0
- package/dist/extensions/lifecycle-topics.js +18 -0
- package/dist/extensions/lifecycle.d.ts +35 -47
- package/dist/extensions/lifecycle.js +103 -39
- package/dist/extensions/locks.d.ts +33 -0
- package/dist/extensions/locks.js +86 -0
- package/dist/extensions/migrate-lock.d.ts +3 -4
- package/dist/extensions/org-config.controller.d.ts +1 -1
- package/dist/extensions/org-config.controller.js +8 -5
- package/dist/extensions/org-config.d.ts +48 -46
- package/dist/extensions/org-config.js +284 -226
- package/dist/extensions/registry.d.ts +50 -2
- package/dist/extensions/registry.js +89 -4
- package/dist/extensions/sources.d.ts +12 -8
- package/dist/extensions/sources.js +34 -13
- package/dist/files/files.module.d.ts +3 -0
- package/dist/files/files.module.js +22 -0
- package/dist/files/previewers.controller.d.ts +7 -2
- package/dist/files/previewers.controller.js +17 -9
- package/dist/files/previewers.d.ts +13 -18
- package/dist/files/previewers.js +83 -36
- package/dist/http/adapter.d.ts +3 -0
- package/dist/http/adapter.js +25 -0
- package/dist/http/api.module.d.ts +3 -110
- package/dist/http/api.module.js +47 -355
- package/dist/http/app.d.ts +11 -15
- package/dist/http/app.js +17 -62
- package/dist/http/error-filter.module.d.ts +5 -0
- package/dist/http/error-filter.module.js +18 -0
- package/dist/http/error.filter.js +2 -2
- package/dist/identity/accounts.d.ts +82 -29
- package/dist/identity/accounts.js +294 -175
- package/dist/identity/api-tokens.d.ts +11 -7
- package/dist/identity/api-tokens.js +71 -44
- package/dist/identity/audit.d.ts +7 -4
- package/dist/identity/audit.js +5 -1
- package/dist/identity/auth.controller.d.ts +11 -10
- package/dist/identity/auth.controller.js +31 -25
- package/dist/identity/auth.guard.d.ts +3 -3
- package/dist/identity/auth.guard.js +6 -4
- package/dist/identity/binding.d.ts +9 -11
- package/dist/identity/binding.js +41 -13
- package/dist/identity/enterprise-admin.d.ts +18 -12
- package/dist/identity/enterprise-admin.js +67 -13
- package/dist/identity/external-identity-lock.d.ts +17 -0
- package/dist/identity/external-identity-lock.js +39 -0
- package/dist/identity/external.d.ts +19 -15
- package/dist/identity/external.js +163 -125
- package/dist/identity/identity.module.d.ts +6 -0
- package/dist/identity/identity.module.js +56 -0
- package/dist/identity/me.controller.d.ts +16 -15
- package/dist/identity/me.controller.js +37 -31
- package/dist/identity/sessions.d.ts +12 -10
- package/dist/identity/sessions.js +74 -42
- package/dist/identity/settings.d.ts +20 -14
- package/dist/identity/settings.js +85 -57
- package/dist/identity/sso.controller.d.ts +7 -7
- package/dist/identity/sso.controller.js +13 -9
- package/dist/identity/sso.d.ts +9 -12
- package/dist/identity/sso.js +54 -24
- package/dist/inbox/inbox.module.d.ts +3 -0
- package/dist/inbox/inbox.module.js +22 -0
- package/dist/inbox/inbox.service.d.ts +7 -9
- package/dist/inbox/inbox.service.js +32 -11
- package/dist/index.d.ts +16 -11
- package/dist/index.js +9 -6
- package/dist/infra/cache/cache.module.d.ts +3 -0
- package/dist/infra/cache/cache.module.js +16 -0
- package/dist/infra/cache/cache.service.d.ts +21 -0
- package/dist/infra/cache/cache.service.js +80 -0
- package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
- package/dist/infra/cache/cacheable.decorator.js +83 -0
- package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
- package/dist/infra/cli/kernel-cli.module.js +165 -0
- package/dist/infra/close-within.d.ts +15 -0
- package/dist/infra/close-within.js +36 -0
- package/dist/infra/config/config.module.d.ts +13 -0
- package/dist/infra/config/config.module.js +39 -0
- package/dist/infra/config/kernel-config.service.d.ts +25 -0
- package/dist/infra/config/kernel-config.service.js +126 -0
- package/dist/infra/database/after-commit.d.ts +6 -0
- package/dist/infra/database/after-commit.js +9 -0
- package/dist/infra/database/database.module.d.ts +25 -0
- package/dist/infra/database/database.module.js +90 -0
- package/dist/infra/database/kernel-db.d.ts +22 -0
- package/dist/infra/database/kernel-db.js +65 -0
- package/dist/infra/database/transaction-host.d.ts +50 -0
- package/dist/infra/database/transaction-host.js +125 -0
- package/dist/infra/database/transactional.decorator.d.ts +15 -0
- package/dist/infra/database/transactional.decorator.js +27 -0
- package/dist/infra/database/xact-lock.d.ts +17 -0
- package/dist/infra/database/xact-lock.js +43 -0
- package/dist/infra/events/kernel-events.d.ts +96 -0
- package/dist/infra/events/kernel-events.js +65 -0
- package/dist/infra/health/health.controller.d.ts +26 -0
- package/dist/infra/health/health.controller.js +104 -0
- package/dist/infra/health/health.module.d.ts +9 -0
- package/dist/infra/health/health.module.js +24 -0
- package/dist/infra/health/health.options.d.ts +10 -0
- package/dist/infra/health/health.options.js +15 -0
- package/dist/infra/health/shutdown-state.d.ts +6 -0
- package/dist/infra/health/shutdown-state.js +2 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
- package/dist/infra/lifecycle/process-guards.d.ts +52 -0
- package/dist/infra/lifecycle/process-guards.js +86 -0
- package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
- package/dist/infra/lifecycle/shutdown-signals.js +48 -0
- package/dist/infra/lock/key-template.d.ts +13 -0
- package/dist/infra/lock/key-template.js +46 -0
- package/dist/infra/lock/lock.module.d.ts +3 -0
- package/dist/infra/lock/lock.module.js +16 -0
- package/dist/infra/lock/lock.service.d.ts +120 -0
- package/dist/infra/lock/lock.service.js +343 -0
- package/dist/infra/lock/shared-lease.d.ts +44 -0
- package/dist/infra/lock/shared-lease.js +121 -0
- package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
- package/dist/infra/lock/with-lock.decorator.js +49 -0
- package/dist/infra/logging/logging.module.d.ts +16 -0
- package/dist/infra/logging/logging.module.js +34 -0
- package/dist/infra/queue/configured-processor.d.ts +18 -0
- package/dist/infra/queue/configured-processor.js +23 -0
- package/dist/infra/queue/job-failure.d.ts +18 -0
- package/dist/infra/queue/job-failure.js +26 -0
- package/dist/infra/queue/queue-shutdown.d.ts +27 -0
- package/dist/infra/queue/queue-shutdown.js +81 -0
- package/dist/infra/queue/queue.module.d.ts +16 -0
- package/dist/infra/queue/queue.module.js +61 -0
- package/dist/infra/queue/redis-connection.d.ts +7 -0
- package/dist/infra/queue/redis-connection.js +18 -0
- package/dist/infra/queue/retired-schedulers.d.ts +7 -0
- package/dist/infra/queue/retired-schedulers.js +9 -0
- package/dist/infra/queue/run-job.d.ts +16 -0
- package/dist/infra/queue/run-job.js +19 -0
- package/dist/infra/redis/redis.module.d.ts +24 -0
- package/dist/infra/redis/redis.module.js +87 -0
- package/dist/infra/schedule/cron-tick.d.ts +12 -0
- package/dist/infra/schedule/cron-tick.js +25 -0
- package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
- package/dist/infra/schedule/locked-cron.decorator.js +53 -0
- package/dist/infra/schedule/locked-interval.d.ts +69 -0
- package/dist/infra/schedule/locked-interval.js +190 -0
- package/dist/infra/schedule/locked-tick.d.ts +90 -0
- package/dist/infra/schedule/locked-tick.js +137 -0
- package/dist/infra/schedule/schedule.module.d.ts +8 -0
- package/dist/infra/schedule/schedule.module.js +27 -0
- package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
- package/dist/infra/schedule/scheduled-runs.js +163 -0
- package/dist/infra/swagger/swagger.d.ts +16 -0
- package/dist/infra/swagger/swagger.js +31 -0
- package/dist/infra/throttler/credential-throttler.d.ts +35 -0
- package/dist/infra/throttler/credential-throttler.js +77 -0
- package/dist/infra/throttler/named-throttlers.d.ts +31 -0
- package/dist/infra/throttler/named-throttlers.js +119 -0
- package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
- package/dist/infra/throttler/redis-throttler-storage.js +130 -0
- package/dist/infra/throttler/throttler.guard.d.ts +23 -0
- package/dist/infra/throttler/throttler.guard.js +68 -0
- package/dist/infra/throttler/throttler.module.d.ts +15 -0
- package/dist/infra/throttler/throttler.module.js +53 -0
- package/dist/infra/tokens.d.ts +15 -0
- package/dist/infra/tokens.js +15 -0
- package/dist/infra/validation/create-zod-dto.d.ts +23 -0
- package/dist/infra/validation/create-zod-dto.js +35 -0
- package/dist/infra/validation/parse-with-zod.d.ts +7 -0
- package/dist/infra/validation/parse-with-zod.js +12 -0
- package/dist/infra/validation/validation.module.d.ts +3 -0
- package/dist/infra/validation/validation.module.js +16 -0
- package/dist/infra/validation/zod-params.d.ts +7 -0
- package/dist/infra/validation/zod-params.js +42 -0
- package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
- package/dist/infra/validation/zod-validation.pipe.js +31 -0
- package/dist/kernel.d.ts +9 -244
- package/dist/kernel.js +8 -1305
- package/dist/kernel.module.d.ts +17 -0
- package/dist/kernel.module.js +136 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
- package/dist/lifecycle/kernel-lifecycle.js +451 -0
- package/dist/lifecycle/tokens.d.ts +3 -0
- package/dist/lifecycle/tokens.js +3 -0
- package/dist/log-context.d.ts +2 -0
- package/dist/log-context.js +4 -0
- package/dist/models/models.module.d.ts +3 -0
- package/dist/models/models.module.js +24 -0
- package/dist/models/prices.d.ts +8 -2
- package/dist/models/prices.js +65 -37
- package/dist/models/purposes.controller.d.ts +1 -1
- package/dist/models/purposes.controller.js +5 -6
- package/dist/models/purposes.d.ts +35 -13
- package/dist/models/purposes.js +101 -51
- package/dist/orgs/directory-sync.controller.d.ts +1 -1
- package/dist/orgs/directory-sync.controller.js +2 -2
- package/dist/orgs/directory-sync.d.ts +61 -31
- package/dist/orgs/directory-sync.js +212 -125
- package/dist/orgs/invitations.controller.d.ts +8 -8
- package/dist/orgs/invitations.controller.js +27 -26
- package/dist/orgs/invitations.service.d.ts +12 -9
- package/dist/orgs/invitations.service.js +130 -92
- package/dist/orgs/job-ids.d.ts +8 -0
- package/dist/orgs/job-ids.js +8 -0
- package/dist/orgs/members.service.d.ts +19 -12
- package/dist/orgs/members.service.js +161 -117
- package/dist/orgs/offboarding.d.ts +54 -57
- package/dist/orgs/offboarding.js +161 -71
- package/dist/orgs/org-lock.d.ts +28 -19
- package/dist/orgs/org-lock.js +81 -35
- package/dist/orgs/org.guard.d.ts +1 -1
- package/dist/orgs/org.guard.js +2 -2
- package/dist/orgs/orgs.controller.d.ts +13 -13
- package/dist/orgs/orgs.controller.js +29 -17
- package/dist/orgs/orgs.module.d.ts +6 -0
- package/dist/orgs/orgs.module.js +68 -0
- package/dist/orgs/orgs.service.d.ts +30 -19
- package/dist/orgs/orgs.service.js +139 -86
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.controller.js +8 -6
- package/dist/orgs/settings.service.d.ts +14 -8
- package/dist/orgs/settings.service.js +75 -46
- package/dist/overrides.d.ts +56 -0
- package/dist/overrides.js +30 -0
- package/dist/roles/gateway-role.d.ts +43 -0
- package/dist/roles/gateway-role.js +98 -0
- package/dist/roles/gateway.module.d.ts +8 -0
- package/dist/roles/gateway.module.js +28 -0
- package/dist/roles/worker-role.d.ts +63 -0
- package/dist/roles/worker-role.js +144 -0
- package/dist/roles/worker.module.d.ts +14 -0
- package/dist/roles/worker.module.js +90 -0
- package/dist/runtime/abort.js +19 -2
- package/dist/runtime/checkpointer.d.ts +8 -3
- package/dist/runtime/checkpointer.js +87 -55
- package/dist/runtime/conversation-lock.d.ts +20 -11
- package/dist/runtime/conversation-lock.js +62 -72
- package/dist/runtime/hook-calls.d.ts +3 -3
- package/dist/runtime/hook-calls.js +1 -6
- package/dist/runtime/job-ids.d.ts +10 -0
- package/dist/runtime/job-ids.js +10 -0
- package/dist/runtime/langgraph-loop.js +1 -1
- package/dist/runtime/loop.d.ts +7 -0
- package/dist/runtime/loop.js +14 -0
- package/dist/runtime/maintenance-queue.d.ts +10 -0
- package/dist/runtime/maintenance-queue.js +10 -0
- package/dist/runtime/maintenance.d.ts +45 -74
- package/dist/runtime/maintenance.js +139 -137
- package/dist/runtime/model-call.d.ts +7 -4
- package/dist/runtime/model-call.js +24 -57
- package/dist/runtime/providers.d.ts +17 -6
- package/dist/runtime/providers.js +66 -25
- package/dist/runtime/quota.d.ts +17 -3
- package/dist/runtime/quota.js +27 -2
- package/dist/runtime/retired-schedulers.d.ts +7 -0
- package/dist/runtime/retired-schedulers.js +31 -0
- package/dist/runtime/run-control.d.ts +33 -0
- package/dist/runtime/run-control.js +77 -0
- package/dist/runtime/run-finish.d.ts +26 -17
- package/dist/runtime/run-finish.js +98 -51
- package/dist/runtime/run-jobs.d.ts +48 -0
- package/dist/runtime/run-jobs.js +95 -0
- package/dist/runtime/run-processors.d.ts +60 -0
- package/dist/runtime/run-processors.js +185 -0
- package/dist/runtime/run-queue.d.ts +32 -57
- package/dist/runtime/run-queue.js +291 -295
- package/dist/runtime/run-steps.d.ts +39 -0
- package/dist/runtime/run-steps.js +96 -0
- package/dist/runtime/run-worker.d.ts +121 -75
- package/dist/runtime/run-worker.js +340 -226
- package/dist/runtime/runtime.module.d.ts +10 -0
- package/dist/runtime/runtime.module.js +112 -0
- package/dist/runtime/step-log.d.ts +40 -0
- package/dist/runtime/step-log.js +94 -0
- package/dist/runtime/stream.controller.d.ts +5 -8
- package/dist/runtime/stream.controller.js +14 -12
- package/dist/runtime/stream.d.ts +24 -6
- package/dist/runtime/stream.js +78 -7
- package/dist/runtime/subagents/child.d.ts +3 -44
- package/dist/runtime/subagents/child.js +0 -79
- package/dist/runtime/subagents/definition.d.ts +4 -4
- package/dist/runtime/subagents/definition.js +2 -2
- package/dist/runtime/subagents/dispatch.d.ts +87 -6
- package/dist/runtime/subagents/dispatch.js +135 -140
- package/dist/runtime/subagents/limits.d.ts +9 -4
- package/dist/runtime/subagents/limits.js +4 -2
- package/dist/runtime/subagents/org-agents.d.ts +4 -4
- package/dist/runtime/subagents/org-agents.js +1 -1
- package/dist/runtime/subagents/progress.d.ts +2 -2
- package/dist/runtime/subagents/roster.d.ts +3 -3
- package/dist/runtime/subagents/roster.js +1 -1
- package/dist/runtime/subagents/skill-fork.d.ts +6 -7
- package/dist/runtime/subagents/skill-fork.js +16 -5
- package/dist/runtime/subagents/subagents.service.d.ts +40 -0
- package/dist/runtime/subagents/subagents.service.js +101 -0
- package/dist/runtime/usage-report.d.ts +94 -52
- package/dist/runtime/usage-report.js +200 -100
- package/dist/runtime/waits.d.ts +125 -57
- package/dist/runtime/waits.js +431 -208
- package/dist/sandbox/job-ids.d.ts +10 -0
- package/dist/sandbox/job-ids.js +10 -0
- package/dist/sandbox/jobs.d.ts +41 -0
- package/dist/sandbox/jobs.js +113 -0
- package/dist/sandbox/leases.d.ts +39 -31
- package/dist/sandbox/leases.js +117 -257
- package/dist/sandbox/providers.d.ts +19 -0
- package/dist/sandbox/providers.js +38 -0
- package/dist/sandbox/sandbox.module.d.ts +8 -0
- package/dist/sandbox/sandbox.module.js +30 -0
- package/dist/sandbox/sandbox.service.d.ts +24 -29
- package/dist/sandbox/sandbox.service.js +106 -75
- package/dist/skills/catalog.d.ts +33 -20
- package/dist/skills/catalog.js +96 -53
- package/dist/skills/changes.controller.d.ts +4 -4
- package/dist/skills/changes.controller.js +15 -9
- package/dist/skills/changes.service.d.ts +28 -18
- package/dist/skills/changes.service.js +421 -364
- package/dist/skills/invocable.controller.d.ts +1 -1
- package/dist/skills/invocable.controller.js +8 -5
- package/dist/skills/invoke.d.ts +16 -15
- package/dist/skills/invoke.js +48 -17
- package/dist/skills/skills.controller.d.ts +1 -1
- package/dist/skills/skills.controller.js +11 -6
- package/dist/skills/skills.module.d.ts +6 -0
- package/dist/skills/skills.module.js +30 -0
- package/dist/skills/skills.service.d.ts +47 -30
- package/dist/skills/skills.service.js +221 -158
- package/dist/storage/job-ids.d.ts +6 -0
- package/dist/storage/job-ids.js +6 -0
- package/dist/storage/purge.d.ts +22 -7
- package/dist/storage/purge.js +55 -3
- package/dist/storage/storage.module.d.ts +6 -0
- package/dist/storage/storage.module.js +23 -0
- package/dist/storage/storage.service.d.ts +18 -4
- package/dist/storage/storage.service.js +44 -3
- package/dist/tools/approvals.controller.d.ts +1 -1
- package/dist/tools/approvals.controller.js +12 -8
- package/dist/tools/approvals.service.d.ts +27 -25
- package/dist/tools/approvals.service.js +324 -258
- package/dist/tools/breaker.d.ts +2 -2
- package/dist/tools/breaker.js +21 -3
- package/dist/tools/builtins/ask-user.d.ts +2 -2
- package/dist/tools/builtins/ask-user.js +1 -1
- package/dist/tools/builtins/builtin-tools.d.ts +21 -0
- package/dist/tools/builtins/builtin-tools.js +80 -0
- package/dist/tools/builtins/read-tool-output.d.ts +2 -2
- package/dist/tools/builtins/read-tool-output.js +1 -1
- package/dist/tools/builtins/sandbox/bash.js +2 -2
- package/dist/tools/builtins/sandbox/common.d.ts +2 -1
- package/dist/tools/builtins/sandbox/deliver.js +2 -2
- package/dist/tools/builtins/sandbox/edit.js +1 -1
- package/dist/tools/builtins/sandbox/glob.js +2 -2
- package/dist/tools/builtins/sandbox/grep.js +2 -2
- package/dist/tools/builtins/sandbox/read.js +1 -1
- package/dist/tools/builtins/sandbox/write.js +1 -1
- package/dist/tools/builtins/skill-load.d.ts +3 -3
- package/dist/tools/builtins/skill-load.js +1 -1
- package/dist/tools/canonical-json.d.ts +6 -0
- package/dist/tools/canonical-json.js +16 -0
- package/dist/tools/connector-content.controller.d.ts +1 -1
- package/dist/tools/connector-content.controller.js +11 -6
- package/dist/tools/connector-content.d.ts +12 -15
- package/dist/tools/connector-content.js +53 -18
- package/dist/tools/connectors.controller.d.ts +1 -1
- package/dist/tools/connectors.controller.js +21 -10
- package/dist/tools/connectors.service.d.ts +31 -13
- package/dist/tools/connectors.service.js +434 -344
- package/dist/tools/credentials.d.ts +17 -20
- package/dist/tools/credentials.js +55 -34
- package/dist/tools/drift.d.ts +29 -41
- package/dist/tools/drift.js +111 -79
- package/dist/tools/info.d.ts +12 -9
- package/dist/tools/info.js +33 -7
- package/dist/tools/job-ids.d.ts +13 -0
- package/dist/tools/job-ids.js +15 -0
- package/dist/tools/jobs.d.ts +24 -0
- package/dist/tools/jobs.js +69 -0
- package/dist/tools/oauth/flow-paths.d.ts +16 -0
- package/dist/tools/oauth/flow-paths.js +38 -0
- package/dist/tools/oauth/flow.d.ts +30 -30
- package/dist/tools/oauth/flow.js +109 -81
- package/dist/tools/oauth/oauth.controller.d.ts +3 -3
- package/dist/tools/oauth/oauth.controller.js +12 -9
- package/dist/tools/oauth/tokens.d.ts +11 -3
- package/dist/tools/oauth/tokens.js +15 -14
- package/dist/tools/outputs.d.ts +13 -4
- package/dist/tools/outputs.js +47 -3
- package/dist/tools/pipeline.d.ts +62 -46
- package/dist/tools/pipeline.js +145 -64
- package/dist/tools/policy.d.ts +2 -2
- package/dist/tools/questions.controller.d.ts +1 -1
- package/dist/tools/questions.controller.js +8 -5
- package/dist/tools/questions.service.d.ts +25 -24
- package/dist/tools/questions.service.js +201 -142
- package/dist/tools/registry.d.ts +30 -20
- package/dist/tools/registry.js +73 -37
- package/dist/tools/specs.d.ts +5 -4
- package/dist/tools/specs.js +3 -1
- package/dist/tools/tools.module.d.ts +10 -0
- package/dist/tools/tools.module.js +91 -0
- package/dist/ui/call-extension.d.ts +16 -0
- package/dist/ui/call-extension.js +38 -0
- package/dist/ui/embed-token.d.ts +9 -5
- package/dist/ui/embed-token.js +34 -6
- package/dist/ui/ui-stream.d.ts +22 -17
- package/dist/ui/ui-stream.js +72 -12
- package/dist/ui/ui.module.d.ts +7 -0
- package/dist/ui/ui.module.js +28 -0
- package/dist/ui/views.controller.d.ts +14 -12
- package/dist/ui/views.controller.js +32 -25
- package/dist/ui/views.d.ts +9 -57
- package/dist/ui/views.js +43 -45
- package/package.json +9 -2
- package/dist/http/health.controller.d.ts +0 -26
- package/dist/http/health.controller.js +0 -79
- package/dist/http/tokens.d.ts +0 -131
- package/dist/http/tokens.js +0 -131
- package/dist/http/zod.pipe.d.ts +0 -8
- package/dist/http/zod.pipe.js +0 -14
- package/dist/identity/rate-limit.d.ts +0 -55
- package/dist/identity/rate-limit.js +0 -121
- package/dist/sandbox/lifecycle.d.ts +0 -21
- package/dist/sandbox/lifecycle.js +0 -68
- /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
- /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
|
@@ -10,37 +10,42 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
10
10
|
import { Body, Controller, Delete, Get, HttpCode, Inject, Param, Post, Req, Res, } from "@nestjs/common";
|
|
11
11
|
import { z } from "zod";
|
|
12
12
|
import { ApiError } from "../errors.js";
|
|
13
|
-
import { INVITATIONS, KERNEL_CONFIG, RATE_LIMITER, SESSIONS } from "../http/tokens.js";
|
|
14
|
-
import { ZodPipe } from "../http/zod.pipe.js";
|
|
15
13
|
import { clientMeta } from "../identity/auth.controller.js";
|
|
16
14
|
import { setSessionCookies } from "../identity/cookies.js";
|
|
17
15
|
import { CurrentPrincipal, Public, patTokenId, requireUser, } from "../identity/principal.js";
|
|
18
|
-
import {
|
|
16
|
+
import { SessionService } from "../identity/sessions.js";
|
|
17
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
18
|
+
import { CredentialThrottler } from "../infra/throttler/credential-throttler.js";
|
|
19
|
+
import { createZodDto } from "../infra/validation/create-zod-dto.js";
|
|
20
|
+
import { parseWithZod } from "../infra/validation/parse-with-zod.js";
|
|
21
|
+
import { ZBody } from "../infra/validation/zod-params.js";
|
|
22
|
+
import { INVITABLE_ROLES, InvitationsService, MAX_INVITATION_HOURS, } from "./invitations.service.js";
|
|
19
23
|
import { CurrentOrg, OrgAction } from "./org.guard.js";
|
|
20
|
-
const
|
|
24
|
+
const CreateSchema = z.object({
|
|
21
25
|
role: z.enum(INVITABLE_ROLES),
|
|
22
26
|
expiresInHours: z.number().int().min(1).max(MAX_INVITATION_HOURS).optional(),
|
|
23
27
|
});
|
|
28
|
+
class InvitationCreateBody extends createZodDto(CreateSchema, "InvitationCreateBody") {
|
|
29
|
+
}
|
|
30
|
+
/** Validated inside the handler, after the attempt is reserved (a signed-in principal sends none). */
|
|
24
31
|
const SignupBody = z.object({
|
|
25
32
|
login: z.string(),
|
|
26
33
|
password: z.string(),
|
|
27
34
|
displayName: z.string().min(1).max(100),
|
|
28
35
|
});
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const ACCEPT_LIMIT_PER_TOKEN = 10;
|
|
32
|
-
const ACCEPT_LIMIT_PER_IP = 20;
|
|
36
|
+
/** Accepting an invitation is throttled per token (10) and per client IP (20) every 900 s. */
|
|
37
|
+
const ACCEPT_THROTTLERS = ["invitation", "invitation-ip"];
|
|
33
38
|
/** 组织邀请:组织内管理(`/api/v1/orgs/:orgId/invitations`)与凭令牌预览 / 接受(`/api/v1/invitations/:token`,公开)。 */
|
|
34
39
|
let InvitationsController = class InvitationsController {
|
|
35
40
|
invitations;
|
|
36
41
|
sessions;
|
|
37
42
|
config;
|
|
38
|
-
|
|
39
|
-
constructor(invitations, sessions, config,
|
|
43
|
+
throttler;
|
|
44
|
+
constructor(invitations, sessions, config, throttler) {
|
|
40
45
|
this.invitations = invitations;
|
|
41
46
|
this.sessions = sessions;
|
|
42
47
|
this.config = config;
|
|
43
|
-
this.
|
|
48
|
+
this.throttler = throttler;
|
|
44
49
|
}
|
|
45
50
|
/** 令牌只在此返回一次。 */
|
|
46
51
|
async create(principal, org, body) {
|
|
@@ -69,25 +74,21 @@ let InvitationsController = class InvitationsController {
|
|
|
69
74
|
throw new ApiError("forbidden", "Service tokens cannot accept invitations");
|
|
70
75
|
}
|
|
71
76
|
const meta = clientMeta(req);
|
|
72
|
-
|
|
73
|
-
if (!rl.allowed) {
|
|
74
|
-
reply.header("retry-after", String(rl.retryAfterSeconds));
|
|
75
|
-
throw new ApiError("auth.rate_limited", "Too many invitation attempts; try again later");
|
|
76
|
-
}
|
|
77
|
+
await this.throttler.reserve(ACCEPT_THROTTLERS, req, reply);
|
|
77
78
|
let result;
|
|
78
79
|
if (principal) {
|
|
79
80
|
result = await this.invitations.accept(token, { accountId: principal.account.id });
|
|
80
|
-
await this.
|
|
81
|
+
await this.throttler.succeeded(ACCEPT_THROTTLERS, req);
|
|
81
82
|
}
|
|
82
83
|
else {
|
|
83
|
-
const signup =
|
|
84
|
+
const signup = parseWithZod(SignupBody, body);
|
|
84
85
|
// 新账号、成员关系与会话行在同一事务里写入;Cookie 在提交之后才设置
|
|
85
|
-
const { extra: session, ...rest } = await this.invitations.accept(token, { signup }, (
|
|
86
|
+
const { extra: session, ...rest } = await this.invitations.accept(token, { signup }, (account) => this.sessions.create(account.id, meta));
|
|
86
87
|
if (!session)
|
|
87
88
|
throw new Error("signup completed without a session");
|
|
88
89
|
result = rest;
|
|
89
|
-
await this.
|
|
90
|
-
setSessionCookies(reply, session, this.config());
|
|
90
|
+
await this.throttler.succeeded(ACCEPT_THROTTLERS, req);
|
|
91
|
+
setSessionCookies(reply, session, this.config.get());
|
|
91
92
|
}
|
|
92
93
|
return result;
|
|
93
94
|
}
|
|
@@ -97,7 +98,7 @@ __decorate([
|
|
|
97
98
|
OrgAction("org.invitations.manage"),
|
|
98
99
|
__param(0, CurrentPrincipal()),
|
|
99
100
|
__param(1, CurrentOrg()),
|
|
100
|
-
__param(2,
|
|
101
|
+
__param(2, ZBody(InvitationCreateBody))
|
|
101
102
|
], InvitationsController.prototype, "create", null);
|
|
102
103
|
__decorate([
|
|
103
104
|
Get("orgs/:orgId/invitations"),
|
|
@@ -129,9 +130,9 @@ __decorate([
|
|
|
129
130
|
], InvitationsController.prototype, "accept", null);
|
|
130
131
|
InvitationsController = __decorate([
|
|
131
132
|
Controller("api/v1"),
|
|
132
|
-
__param(0, Inject(
|
|
133
|
-
__param(1, Inject(
|
|
134
|
-
__param(2, Inject(
|
|
135
|
-
__param(3, Inject(
|
|
133
|
+
__param(0, Inject(InvitationsService)),
|
|
134
|
+
__param(1, Inject(SessionService)),
|
|
135
|
+
__param(2, Inject(KernelConfigService)),
|
|
136
|
+
__param(3, Inject(CredentialThrottler))
|
|
136
137
|
], InvitationsController);
|
|
137
138
|
export { InvitationsController };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
1
|
+
import { type Account, AccountsService } from "../identity/accounts.js";
|
|
2
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
3
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
4
|
+
import { MembersService } from "./members.service.js";
|
|
5
|
+
import { OrgLock } from "./org-lock.js";
|
|
5
6
|
import { type OrgRole } from "./roles.js";
|
|
6
|
-
type Trx = Transaction<KernelDatabase>;
|
|
7
7
|
/** 可邀请的角色(owner 只能经转让获得)。 */
|
|
8
8
|
export declare const INVITABLE_ROLES: readonly ["admin", "member", "guest"];
|
|
9
9
|
export type InvitableRole = (typeof INVITABLE_ROLES)[number];
|
|
@@ -32,13 +32,15 @@ export type AcceptAs = {
|
|
|
32
32
|
/**
|
|
33
33
|
* 组织邀请。令牌 `cap_inv_` + 32 字节 base64url,库里只存 SHA-256(按 hash 在 SQL 里查找)。
|
|
34
34
|
* 写操作(create / revoke)与成员服务一样先锁组织行,并在锁内实时重读发起人角色(只接收账号 id,不接收角色)。
|
|
35
|
-
* 加锁顺序统一为「组织行 → 邀请行」,accept 也先锁组织行,避免与 revoke
|
|
35
|
+
* 加锁顺序统一为「组织行 → 邀请行」,accept 也先锁组织行,避免与 revoke 死锁。
|
|
36
36
|
*/
|
|
37
37
|
export declare class InvitationsService {
|
|
38
38
|
private readonly db;
|
|
39
|
+
readonly txHost: TransactionHost;
|
|
39
40
|
private readonly accounts;
|
|
40
41
|
private readonly members;
|
|
41
|
-
|
|
42
|
+
private readonly orgLock;
|
|
43
|
+
constructor(db: KernelDb, txHost: TransactionHost, accounts: AccountsService, members: MembersService, orgLock: OrgLock);
|
|
42
44
|
create(orgId: string, input: {
|
|
43
45
|
role: InvitableRole;
|
|
44
46
|
expiresInHours?: number | undefined;
|
|
@@ -46,6 +48,7 @@ export declare class InvitationsService {
|
|
|
46
48
|
invitation: Invitation;
|
|
47
49
|
token: string;
|
|
48
50
|
}>;
|
|
51
|
+
private createIn;
|
|
49
52
|
list(orgId: string): Promise<(Invitation & {
|
|
50
53
|
status: InvitationStatus;
|
|
51
54
|
})[]>;
|
|
@@ -65,16 +68,16 @@ export declare class InvitationsService {
|
|
|
65
68
|
* signup 时先在事务外分类一次(无效令牌不白跑 scrypt),再在 BEGIN 之前算好密码哈希,
|
|
66
69
|
* 事务内只有读写,连接不会在 scrypt 期间处于 idle in transaction。
|
|
67
70
|
*/
|
|
68
|
-
accept<T = undefined>(token: string, who: AcceptAs, inTx?: (
|
|
71
|
+
accept<T = undefined>(token: string, who: AcceptAs, inTx?: (account: Account) => Promise<T>): Promise<{
|
|
69
72
|
account: Account;
|
|
70
73
|
orgId: string;
|
|
71
74
|
role: OrgRole;
|
|
72
75
|
extra: T | undefined;
|
|
73
76
|
}>;
|
|
77
|
+
private acceptIn;
|
|
74
78
|
/**
|
|
75
79
|
* 按令牌 hash 读邀请并分类:不存在、已撤销或组织已软删除 → `invitation.invalid`;
|
|
76
80
|
* 已接受 → `invitation.used`;已过期 → `invitation.expired`。过期按数据库时间判定。
|
|
77
81
|
*/
|
|
78
82
|
private classify;
|
|
79
83
|
}
|
|
80
|
-
export {};
|
|
@@ -1,9 +1,24 @@
|
|
|
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 { ApiError } from "../errors.js";
|
|
14
|
+
import { AccountsService } from "../identity/accounts.js";
|
|
4
15
|
import { audit } from "../identity/audit.js";
|
|
5
16
|
import { sha256Hex } from "../identity/hash.js";
|
|
6
|
-
import {
|
|
17
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
18
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
19
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
20
|
+
import { MembersService } from "./members.service.js";
|
|
21
|
+
import { OrgLock } from "./org-lock.js";
|
|
7
22
|
import { roleAtLeast } from "./roles.js";
|
|
8
23
|
/** 可邀请的角色(owner 只能经转让获得)。 */
|
|
9
24
|
export const INVITABLE_ROLES = ["admin", "member", "guest"];
|
|
@@ -27,16 +42,20 @@ const forbidden = () => new ApiError("forbidden", "Insufficient organization rol
|
|
|
27
42
|
/**
|
|
28
43
|
* 组织邀请。令牌 `cap_inv_` + 32 字节 base64url,库里只存 SHA-256(按 hash 在 SQL 里查找)。
|
|
29
44
|
* 写操作(create / revoke)与成员服务一样先锁组织行,并在锁内实时重读发起人角色(只接收账号 id,不接收角色)。
|
|
30
|
-
* 加锁顺序统一为「组织行 → 邀请行」,accept 也先锁组织行,避免与 revoke
|
|
45
|
+
* 加锁顺序统一为「组织行 → 邀请行」,accept 也先锁组织行,避免与 revoke 死锁。
|
|
31
46
|
*/
|
|
32
|
-
|
|
47
|
+
let InvitationsService = class InvitationsService {
|
|
33
48
|
db;
|
|
49
|
+
txHost;
|
|
34
50
|
accounts;
|
|
35
51
|
members;
|
|
36
|
-
|
|
52
|
+
orgLock;
|
|
53
|
+
constructor(db, txHost, accounts, members, orgLock) {
|
|
37
54
|
this.db = db;
|
|
55
|
+
this.txHost = txHost;
|
|
38
56
|
this.accounts = accounts;
|
|
39
57
|
this.members = members;
|
|
58
|
+
this.orgLock = orgLock;
|
|
40
59
|
}
|
|
41
60
|
async create(orgId, input, actorAccountId, actorTokenId) {
|
|
42
61
|
if (!INVITABLE_ROLES.includes(input.role)) {
|
|
@@ -47,32 +66,34 @@ export class InvitationsService {
|
|
|
47
66
|
throw new ApiError("validation_failed", `expiresInHours must be an integer between 1 and ${MAX_INVITATION_HOURS}`);
|
|
48
67
|
}
|
|
49
68
|
const token = TOKEN_PREFIX + randomBytes(32).toString("base64url");
|
|
50
|
-
return this.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
69
|
+
return this.createIn(orgId, input.role, hours, token, actorAccountId, actorTokenId);
|
|
70
|
+
}
|
|
71
|
+
async createIn(orgId, role, hours, token, actorAccountId, actorTokenId) {
|
|
72
|
+
const input = { role };
|
|
73
|
+
const { role: actorRole } = await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "org.invitations.manage");
|
|
74
|
+
if (!roleAtLeast(actorRole, input.role))
|
|
75
|
+
throw forbidden();
|
|
76
|
+
const row = await this.db
|
|
77
|
+
.insertInto("invitations")
|
|
78
|
+
.values({
|
|
79
|
+
id: randomUUID(),
|
|
80
|
+
org_id: orgId,
|
|
81
|
+
role: input.role,
|
|
82
|
+
token_hash: sha256Hex(token),
|
|
83
|
+
created_by: actorAccountId,
|
|
84
|
+
expires_at: sql `now() + make_interval(hours => ${hours})`,
|
|
85
|
+
})
|
|
86
|
+
.returningAll()
|
|
87
|
+
.executeTakeFirstOrThrow();
|
|
88
|
+
await audit(this.db.db, {
|
|
89
|
+
actorAccountId,
|
|
90
|
+
...(actorTokenId !== undefined && { actorTokenId }),
|
|
91
|
+
orgId,
|
|
92
|
+
action: "org.invitation.created",
|
|
93
|
+
target: row.id,
|
|
94
|
+
detail: { role: input.role, expiresAt: row.expires_at.toISOString() },
|
|
75
95
|
});
|
|
96
|
+
return { invitation: toInvitation(row), token };
|
|
76
97
|
}
|
|
77
98
|
async list(orgId) {
|
|
78
99
|
const rows = await this.db
|
|
@@ -96,38 +117,36 @@ export class InvitationsService {
|
|
|
96
117
|
}
|
|
97
118
|
/** 撤销;不属于该组织 → `invitation.invalid`;已接受 → `invitation.used`;已撤销则无操作。 */
|
|
98
119
|
async revoke(orgId, id, actorAccountId, actorTokenId) {
|
|
99
|
-
await this.
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
detail: { role: row.role },
|
|
126
|
-
});
|
|
120
|
+
await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "org.invitations.manage");
|
|
121
|
+
const row = await this.db
|
|
122
|
+
.selectFrom("invitations")
|
|
123
|
+
.selectAll()
|
|
124
|
+
.where("id", "=", id)
|
|
125
|
+
.where("org_id", "=", orgId)
|
|
126
|
+
.forUpdate()
|
|
127
|
+
.executeTakeFirst();
|
|
128
|
+
if (!row)
|
|
129
|
+
throw invalid();
|
|
130
|
+
if (row.accepted_at)
|
|
131
|
+
throw new ApiError("invitation.used", "Invitation was already used");
|
|
132
|
+
if (row.revoked_at)
|
|
133
|
+
return;
|
|
134
|
+
await this.db
|
|
135
|
+
.updateTable("invitations")
|
|
136
|
+
.set({ revoked_at: sql `now()` })
|
|
137
|
+
.where("id", "=", id)
|
|
138
|
+
.execute();
|
|
139
|
+
await audit(this.db.db, {
|
|
140
|
+
actorAccountId,
|
|
141
|
+
...(actorTokenId !== undefined && { actorTokenId }),
|
|
142
|
+
orgId,
|
|
143
|
+
action: "org.invitation.revoked",
|
|
144
|
+
target: id,
|
|
145
|
+
detail: { role: row.role },
|
|
127
146
|
});
|
|
128
147
|
}
|
|
129
148
|
async preview(token) {
|
|
130
|
-
const r = await this.classify(
|
|
149
|
+
const r = await this.classify(token);
|
|
131
150
|
return { org: { id: r.org_id, name: r.org_name }, role: r.role, expiresAt: r.expires_at };
|
|
132
151
|
}
|
|
133
152
|
/**
|
|
@@ -145,47 +164,48 @@ export class InvitationsService {
|
|
|
145
164
|
throw new ApiError("account.not_found", "Account not found");
|
|
146
165
|
}
|
|
147
166
|
else {
|
|
148
|
-
await this.classify(
|
|
167
|
+
await this.classify(token);
|
|
149
168
|
passwordHash = await this.accounts.hashNewPassword(who.signup.password);
|
|
150
169
|
}
|
|
151
|
-
return this.
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
const extra = inTx ? await inTx(t, account) : undefined;
|
|
180
|
-
return { account, orgId: inv.org_id, role: inv.role, extra };
|
|
170
|
+
return this.acceptIn(token, who, existing, passwordHash, inTx);
|
|
171
|
+
}
|
|
172
|
+
async acceptIn(token, who, existing, passwordHash, inTx) {
|
|
173
|
+
const inv = await this.classify(token);
|
|
174
|
+
// 先建账号再锁组织行,缩短持锁时间;失败时随事务回滚,不残留账号
|
|
175
|
+
const account = existing ?? (await this.accounts.createLocal(signupOf(who), passwordHash));
|
|
176
|
+
if (!(await this.orgLock.tryLock(inv.org_id)))
|
|
177
|
+
throw invalid();
|
|
178
|
+
const taken = await this.db
|
|
179
|
+
.updateTable("invitations")
|
|
180
|
+
.set({ accepted_at: sql `now()`, accepted_by: account.id })
|
|
181
|
+
.where("id", "=", inv.id)
|
|
182
|
+
.where("accepted_at", "is", null)
|
|
183
|
+
.where("revoked_at", "is", null)
|
|
184
|
+
.where(sql `expires_at > now()`)
|
|
185
|
+
.returning("id")
|
|
186
|
+
.executeTakeFirst();
|
|
187
|
+
if (!taken) {
|
|
188
|
+
await this.classify(token);
|
|
189
|
+
throw new ApiError("invitation.used", "Invitation was already used");
|
|
190
|
+
}
|
|
191
|
+
await this.members.add(inv.org_id, account.id, inv.role, account.id);
|
|
192
|
+
await audit(this.db.db, {
|
|
193
|
+
actorAccountId: account.id,
|
|
194
|
+
orgId: inv.org_id,
|
|
195
|
+
action: "org.invitation.accepted",
|
|
196
|
+
target: inv.id,
|
|
197
|
+
detail: { role: inv.role, signup: "signup" in who },
|
|
181
198
|
});
|
|
199
|
+
// 凭邀请注册时在同一事务里建会话:失败整体回滚,不残留没有会话的新账号
|
|
200
|
+
const extra = inTx ? await inTx(account) : undefined;
|
|
201
|
+
return { account, orgId: inv.org_id, role: inv.role, extra };
|
|
182
202
|
}
|
|
183
203
|
/**
|
|
184
204
|
* 按令牌 hash 读邀请并分类:不存在、已撤销或组织已软删除 → `invitation.invalid`;
|
|
185
205
|
* 已接受 → `invitation.used`;已过期 → `invitation.expired`。过期按数据库时间判定。
|
|
186
206
|
*/
|
|
187
|
-
async classify(
|
|
188
|
-
const r = await db
|
|
207
|
+
async classify(token) {
|
|
208
|
+
const r = await this.db
|
|
189
209
|
.selectFrom("invitations")
|
|
190
210
|
.innerJoin("orgs", "orgs.id", "invitations.org_id")
|
|
191
211
|
.select([
|
|
@@ -209,7 +229,25 @@ export class InvitationsService {
|
|
|
209
229
|
throw new ApiError("invitation.expired", "Invitation has expired");
|
|
210
230
|
return r;
|
|
211
231
|
}
|
|
212
|
-
}
|
|
232
|
+
};
|
|
233
|
+
__decorate([
|
|
234
|
+
Transactional()
|
|
235
|
+
], InvitationsService.prototype, "createIn", null);
|
|
236
|
+
__decorate([
|
|
237
|
+
Transactional()
|
|
238
|
+
], InvitationsService.prototype, "revoke", null);
|
|
239
|
+
__decorate([
|
|
240
|
+
Transactional()
|
|
241
|
+
], InvitationsService.prototype, "acceptIn", null);
|
|
242
|
+
InvitationsService = __decorate([
|
|
243
|
+
Injectable(),
|
|
244
|
+
__param(0, Inject(KernelDb)),
|
|
245
|
+
__param(1, Inject(TransactionHost)),
|
|
246
|
+
__param(2, Inject(AccountsService)),
|
|
247
|
+
__param(3, Inject(MembersService)),
|
|
248
|
+
__param(4, Inject(OrgLock))
|
|
249
|
+
], InvitationsService);
|
|
250
|
+
export { InvitationsService };
|
|
213
251
|
function signupOf(who) {
|
|
214
252
|
if (!("signup" in who))
|
|
215
253
|
throw new Error("unreachable");
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The maintenance job scheduler ids the offboarding sweep and the directory scan had before
|
|
3
|
+
* becoming `@LockedCron` jobs (retired at worker start, `RETIRED_SCHEDULER_IDS`). A leaf module.
|
|
4
|
+
*/
|
|
5
|
+
/** The offboarding sweep's old scheduler (every 10 minutes). */
|
|
6
|
+
export declare const OFFBOARD_SWEEP_SCHEDULER_ID = "offboard-sweep-every-10m";
|
|
7
|
+
/** The directory scan's old scheduler (hourly). */
|
|
8
|
+
export declare const DIRECTORY_SCAN_SCHEDULER_ID = "directory-scan-hourly";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The maintenance job scheduler ids the offboarding sweep and the directory scan had before
|
|
3
|
+
* becoming `@LockedCron` jobs (retired at worker start, `RETIRED_SCHEDULER_IDS`). A leaf module.
|
|
4
|
+
*/
|
|
5
|
+
/** The offboarding sweep's old scheduler (every 10 minutes). */
|
|
6
|
+
export const OFFBOARD_SWEEP_SCHEDULER_ID = "offboard-sweep-every-10m";
|
|
7
|
+
/** The directory scan's old scheduler (hourly). */
|
|
8
|
+
export const DIRECTORY_SCAN_SCHEDULER_ID = "directory-scan-hourly";
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { KernelDatabase, KernelDb } from "../db/kernel-schema.js";
|
|
1
|
+
import type { KernelSchemaDb } from "../db/kernel-schema.js";
|
|
3
2
|
import type { Account } from "../identity/accounts.js";
|
|
4
|
-
import
|
|
3
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
4
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
5
|
+
import { Offboarding } from "./offboarding.js";
|
|
6
|
+
import { OrgLock } from "./org-lock.js";
|
|
5
7
|
import type { OrgRole } from "./roles.js";
|
|
6
|
-
type Trx = Transaction<KernelDatabase>;
|
|
7
8
|
export interface Member {
|
|
8
9
|
account: Pick<Account, "id" | "displayName" | "email">;
|
|
9
10
|
role: OrgRole;
|
|
@@ -15,26 +16,29 @@ export interface Member {
|
|
|
15
16
|
* 账号是不是某个组织的匿名访客(`org_anonymous_accounts`)。匿名访客没有登录方式,只能以 guest 身份
|
|
16
17
|
* 代表 IM 里未绑定的人:不能被授予别的角色、成为 owner、指派为 agent 负责人、加入别的组织或被移出。
|
|
17
18
|
*/
|
|
18
|
-
export declare function isAnonymousGuest(db:
|
|
19
|
+
export declare function isAnonymousGuest(db: KernelSchemaDb, accountId: string): Promise<boolean>;
|
|
19
20
|
/** 目标是匿名访客 → `409 member.anonymous_guest`。 */
|
|
20
|
-
export declare function rejectAnonymousGuest(db:
|
|
21
|
+
export declare function rejectAnonymousGuest(db: KernelSchemaDb, accountId: string): Promise<void>;
|
|
21
22
|
/**
|
|
22
23
|
* 成员服务。发起人只传账号 id,角色由服务在组织行锁内实时读取,调用方无法传入过期角色。所有写操作在事务内先 `SELECT … FROM orgs WHERE id = $1 FOR NO KEY UPDATE`,
|
|
23
24
|
* 把同一组织的成员变更串行化(多副本下两个 owner 并发互相降级也恰好剩一个 owner)。
|
|
24
|
-
* 框架无关,由调用方注入 db。
|
|
25
25
|
*/
|
|
26
26
|
export declare class MembersService {
|
|
27
27
|
private readonly db;
|
|
28
|
+
readonly txHost: TransactionHost;
|
|
29
|
+
private readonly orgLock;
|
|
30
|
+
/** Removing and leaving go through offboarding. */
|
|
28
31
|
private readonly offboarding;
|
|
29
|
-
|
|
30
|
-
|
|
32
|
+
constructor(db: KernelDb, txHost: TransactionHost, orgLock: OrgLock,
|
|
33
|
+
/** Removing and leaving go through offboarding. */
|
|
34
|
+
offboarding: Offboarding);
|
|
31
35
|
list(orgId: string): Promise<Member[]>;
|
|
32
36
|
/**
|
|
33
37
|
* 加入成员(邀请接受等,手动加入的唯一入口);已是成员 → `member.already_exists`;匿名访客 → `member.anonymous_guest`。
|
|
34
38
|
* 同一事务删除此人在该组织的通讯录排除(Ruling A20:手动重新加入后,通讯录同步恢复照常管理此人)。
|
|
35
|
-
* `actorAccountId` 仅用于审计。
|
|
39
|
+
* `actorAccountId` 仅用于审计。In the caller's transaction when there is one.
|
|
36
40
|
*/
|
|
37
|
-
add(orgId: string, accountId: string, role: OrgRole, actorAccountId: string
|
|
41
|
+
add(orgId: string, accountId: string, role: OrgRole, actorAccountId: string): Promise<void>;
|
|
38
42
|
/**
|
|
39
43
|
* 改角色:授予或撤销 owner、或改动一个 owner,只有 owner 能做(`org.owner_required`);
|
|
40
44
|
* admin 只能在 guest / member / admin 之间调整非 owner。操作后 owner 数为 0 → `org.last_owner`。
|
|
@@ -42,22 +46,25 @@ export declare class MembersService {
|
|
|
42
46
|
* 目标是匿名访客 → `member.anonymous_guest`。
|
|
43
47
|
*/
|
|
44
48
|
changeRole(orgId: string, targetId: string, role: OrgRole, actorAccountId: string, actorTokenId?: string): Promise<void>;
|
|
49
|
+
private changeRoleIn;
|
|
45
50
|
/**
|
|
46
51
|
* 移出成员:权限规则同 changeRole(移除 owner 须发起人是 owner);移除最后一个 owner → `org.last_owner`。
|
|
47
52
|
* 走离职处理({@link Offboarding.offboard},原因 `removed`),与之同一事务;提交后写吊销标记、发布事件。
|
|
48
53
|
* 匿名访客不能移出(`member.anonymous_guest`;不再需要匿名访问时把渠道连接改回绑定策略)。
|
|
49
54
|
*/
|
|
50
55
|
remove(orgId: string, targetId: string, actorAccountId: string, actorTokenId?: string): Promise<void>;
|
|
56
|
+
private removeIn;
|
|
51
57
|
/** 主动离开:走离职处理(原因 `left`);最后一个 owner → `org.last_owner`。 */
|
|
52
58
|
leave(orgId: string, accountId: string, actorTokenId?: string): Promise<void>;
|
|
59
|
+
private leaveIn;
|
|
53
60
|
/**
|
|
54
61
|
* 转让所有权:from 必须是 owner(`org.owner_required`);to 必须是成员(`member.not_found`)且不是匿名访客
|
|
55
62
|
* (`member.anonymous_guest`);to → owner、from → admin。
|
|
56
63
|
*/
|
|
57
64
|
transferOwnership(orgId: string, fromAccountId: string, toAccountId: string, actorTokenId?: string): Promise<void>;
|
|
65
|
+
private transferIn;
|
|
58
66
|
private roleIn;
|
|
59
67
|
private requireMember;
|
|
60
68
|
private setRole;
|
|
61
69
|
private assertHasOwner;
|
|
62
70
|
}
|
|
63
|
-
export {};
|