@capybara-hq/kernel 0.1.0-rc.1 → 0.1.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/admin.controller.d.ts +17 -17
- package/dist/admin/admin.controller.js +43 -26
- package/dist/admin/admin.module.d.ts +3 -0
- package/dist/admin/admin.module.js +22 -0
- package/dist/admin/extensions.controller.d.ts +14 -14
- package/dist/admin/extensions.controller.js +30 -17
- package/dist/admin/setup-lock.d.ts +16 -0
- package/dist/admin/setup-lock.js +47 -0
- package/dist/admin/setup.controller.d.ts +8 -8
- package/dist/admin/setup.controller.js +27 -25
- package/dist/admin/setup.service.d.ts +19 -27
- package/dist/admin/setup.service.js +61 -61
- package/dist/agents/agent-lookup.d.ts +53 -0
- package/dist/agents/agent-lookup.js +187 -0
- package/dist/agents/agents.controller.d.ts +1 -1
- package/dist/agents/agents.controller.js +14 -8
- package/dist/agents/agents.module.d.ts +7 -0
- package/dist/agents/agents.module.js +41 -0
- package/dist/agents/agents.service.d.ts +39 -58
- package/dist/agents/agents.service.js +280 -335
- package/dist/agents/definition.d.ts +39 -8
- package/dist/agents/definition.js +201 -17
- package/dist/agents/models.controller.d.ts +1 -1
- package/dist/agents/models.controller.js +2 -2
- package/dist/agents/templates.controller.d.ts +1 -1
- package/dist/agents/templates.controller.js +2 -2
- package/dist/agents/templates.d.ts +6 -8
- package/dist/agents/templates.js +39 -8
- package/dist/app.d.ts +93 -0
- package/dist/app.js +150 -0
- package/dist/catalog/admin-catalog.controller.d.ts +3 -3
- package/dist/catalog/admin-catalog.controller.js +27 -13
- package/dist/catalog/catalog-content.d.ts +185 -0
- package/dist/catalog/catalog-content.js +326 -0
- package/dist/catalog/catalog-items.d.ts +186 -0
- package/dist/catalog/catalog-items.js +410 -0
- package/dist/catalog/catalog.module.d.ts +14 -0
- package/dist/catalog/catalog.module.js +71 -0
- package/dist/catalog/catalog.service.d.ts +34 -188
- package/dist/catalog/catalog.service.js +155 -489
- package/dist/catalog/claude/agents.js +13 -10
- package/dist/catalog/cli.d.ts +3 -2
- package/dist/catalog/cli.js +13 -31
- package/dist/catalog/job-ids.d.ts +15 -0
- package/dist/catalog/job-ids.js +15 -0
- package/dist/catalog/jobs.d.ts +27 -0
- package/dist/catalog/jobs.js +70 -0
- package/dist/catalog/locks.d.ts +24 -0
- package/dist/catalog/locks.js +63 -0
- package/dist/catalog/marketplaces.controller.d.ts +4 -4
- package/dist/catalog/marketplaces.controller.js +22 -11
- package/dist/catalog/marketplaces.service.d.ts +31 -14
- package/dist/catalog/marketplaces.service.js +330 -256
- package/dist/catalog/org-catalog.controller.d.ts +4 -3
- package/dist/catalog/org-catalog.controller.js +29 -14
- package/dist/catalog/org-catalog.service.d.ts +32 -198
- package/dist/catalog/org-catalog.service.js +159 -400
- package/dist/catalog/plugin-import.d.ts +73 -34
- package/dist/catalog/plugin-import.js +356 -217
- package/dist/catalog/plugin-install.d.ts +83 -41
- package/dist/catalog/plugin-install.js +421 -269
- package/dist/catalog/plugin-upgrade.d.ts +59 -4
- package/dist/catalog/plugin-upgrade.js +407 -282
- package/dist/catalog/requests.service.d.ts +27 -15
- package/dist/catalog/requests.service.js +201 -145
- package/dist/catalog/upgrade-targets.d.ts +4 -7
- package/dist/channels/actions.d.ts +6 -4
- package/dist/channels/actions.js +1 -1
- package/dist/channels/cards.d.ts +10 -4
- package/dist/channels/cards.js +16 -8
- package/dist/channels/channels.module.d.ts +40 -0
- package/dist/channels/channels.module.js +128 -0
- package/dist/channels/connections.controller.d.ts +1 -1
- package/dist/channels/connections.controller.js +11 -6
- package/dist/channels/connections.service.d.ts +43 -21
- package/dist/channels/connections.service.js +236 -131
- package/dist/channels/inbound.d.ts +34 -38
- package/dist/channels/inbound.js +107 -41
- package/dist/channels/job-ids.d.ts +10 -0
- package/dist/channels/job-ids.js +10 -0
- package/dist/channels/jobs.d.ts +85 -0
- package/dist/channels/jobs.js +157 -0
- package/dist/channels/outbound.d.ts +60 -82
- package/dist/channels/outbound.js +165 -194
- package/dist/channels/supervisor.d.ts +88 -46
- package/dist/channels/supervisor.js +230 -132
- package/dist/channels/threads.d.ts +29 -8
- package/dist/channels/threads.js +71 -13
- package/dist/channels/webhook.d.ts +20 -14
- package/dist/channels/webhook.js +51 -20
- package/dist/config/load.d.ts +3 -2
- package/dist/config/load.js +3 -2
- package/dist/config/nacos-source.js +11 -2
- package/dist/config/schema.d.ts +1 -0
- package/dist/config/schema.js +12 -6
- package/dist/conversations/access.d.ts +29 -0
- package/dist/conversations/access.js +86 -0
- package/dist/conversations/artifacts.d.ts +11 -11
- package/dist/conversations/artifacts.js +36 -10
- package/dist/conversations/attachments.controller.d.ts +1 -1
- package/dist/conversations/attachments.controller.js +8 -6
- package/dist/conversations/attachments.module.d.ts +7 -0
- package/dist/conversations/attachments.module.js +25 -0
- package/dist/conversations/attachments.service.d.ts +30 -22
- package/dist/conversations/attachments.service.js +119 -46
- package/dist/conversations/conversations.controller.d.ts +8 -7
- package/dist/conversations/conversations.controller.js +59 -29
- package/dist/conversations/conversations.module.d.ts +8 -0
- package/dist/conversations/conversations.module.js +69 -0
- package/dist/conversations/conversations.service.d.ts +40 -38
- package/dist/conversations/conversations.service.js +130 -140
- package/dist/conversations/event-log.d.ts +39 -18
- package/dist/conversations/event-log.js +93 -27
- package/dist/conversations/events.d.ts +23 -3
- package/dist/conversations/events.js +26 -14
- package/dist/conversations/files.d.ts +10 -10
- package/dist/conversations/files.js +37 -11
- package/dist/conversations/idem-keys.d.ts +5 -0
- package/dist/conversations/idem-keys.js +5 -0
- package/dist/conversations/job-ids.d.ts +6 -0
- package/dist/conversations/job-ids.js +6 -0
- package/dist/conversations/outputs-read.d.ts +11 -11
- package/dist/conversations/outputs-read.js +31 -7
- package/dist/conversations/queue.d.ts +48 -56
- package/dist/conversations/queue.js +13 -289
- package/dist/conversations/queue.service.d.ts +60 -0
- package/dist/conversations/queue.service.js +343 -0
- package/dist/conversations/sandbox-status.d.ts +13 -10
- package/dist/conversations/sandbox-status.js +36 -8
- package/dist/conversations/titles.d.ts +71 -24
- package/dist/conversations/titles.js +159 -63
- package/dist/ctx/bus.js +9 -3
- package/dist/ctx/create-ctx.d.ts +6 -0
- package/dist/ctx/create-ctx.js +7 -9
- package/dist/ctx/lock.d.ts +7 -3
- package/dist/ctx/lock.js +9 -20
- package/dist/ctx/secrets.d.ts +10 -2
- package/dist/ctx/secrets.js +7 -3
- package/dist/db/kernel-schema.d.ts +4 -4
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +1 -0
- package/dist/errors.d.ts +1 -0
- package/dist/errors.js +1 -0
- package/dist/evals/budget.d.ts +42 -21
- package/dist/evals/budget.js +114 -62
- package/dist/evals/evals.module.d.ts +31 -0
- package/dist/evals/evals.module.js +114 -0
- package/dist/evals/jobs.d.ts +20 -0
- package/dist/evals/jobs.js +45 -0
- package/dist/evals/recorded-tools.d.ts +27 -1
- package/dist/evals/recorded-tools.js +85 -10
- package/dist/evals/run-replay.d.ts +61 -8
- package/dist/evals/run-replay.js +159 -85
- package/dist/evals/runs.controller.d.ts +1 -1
- package/dist/evals/runs.controller.js +17 -8
- package/dist/evals/runs.service.d.ts +23 -45
- package/dist/evals/runs.service.js +245 -234
- package/dist/evals/sets.controller.d.ts +1 -1
- package/dist/evals/sets.controller.js +17 -8
- package/dist/evals/sets.service.d.ts +22 -6
- package/dist/evals/sets.service.js +248 -194
- package/dist/evals/snapshot.d.ts +2 -2
- package/dist/evals/step-replay.d.ts +2 -2
- package/dist/evals/step-replay.js +1 -1
- package/dist/evals/trajectory.controller.d.ts +1 -1
- package/dist/evals/trajectory.controller.js +11 -7
- package/dist/evals/trajectory.d.ts +2 -2
- package/dist/evals/trajectory.service.d.ts +5 -4
- package/dist/evals/trajectory.service.js +30 -7
- package/dist/evals/worker.d.ts +44 -27
- package/dist/evals/worker.js +220 -121
- package/dist/extensions/admin-ops.d.ts +61 -33
- package/dist/extensions/admin-ops.js +248 -154
- package/dist/extensions/admin-view.d.ts +38 -27
- package/dist/extensions/admin-view.js +126 -55
- package/dist/extensions/approvals.d.ts +12 -8
- package/dist/extensions/approvals.js +73 -46
- package/dist/extensions/blobs.d.ts +27 -10
- package/dist/extensions/blobs.js +111 -45
- package/dist/extensions/bootstrap.d.ts +58 -31
- package/dist/extensions/bootstrap.js +175 -121
- package/dist/extensions/cli.d.ts +20 -10
- package/dist/extensions/cli.js +41 -96
- package/dist/extensions/config-issues.d.ts +7 -0
- package/dist/extensions/config-issues.js +31 -0
- package/dist/extensions/deployment-config-store.d.ts +49 -0
- package/dist/extensions/deployment-config-store.js +133 -0
- package/dist/extensions/deployment-config.d.ts +58 -67
- package/dist/extensions/deployment-config.js +202 -230
- package/dist/extensions/enabled.d.ts +5 -5
- package/dist/extensions/extensions.module.d.ts +8 -0
- package/dist/extensions/extensions.module.js +77 -0
- package/dist/extensions/hooks.d.ts +3 -2
- package/dist/extensions/hooks.js +1 -1
- package/dist/extensions/host.d.ts +72 -68
- package/dist/extensions/host.js +191 -152
- package/dist/extensions/installs.d.ts +49 -16
- package/dist/extensions/installs.js +128 -32
- package/dist/extensions/job-ids.d.ts +6 -0
- package/dist/extensions/job-ids.js +6 -0
- package/dist/extensions/lifecycle-topics.d.ts +18 -0
- package/dist/extensions/lifecycle-topics.js +18 -0
- package/dist/extensions/lifecycle.d.ts +35 -47
- package/dist/extensions/lifecycle.js +103 -39
- package/dist/extensions/locks.d.ts +33 -0
- package/dist/extensions/locks.js +86 -0
- package/dist/extensions/migrate-lock.d.ts +3 -4
- package/dist/extensions/org-config.controller.d.ts +1 -1
- package/dist/extensions/org-config.controller.js +8 -5
- package/dist/extensions/org-config.d.ts +48 -46
- package/dist/extensions/org-config.js +284 -226
- package/dist/extensions/registry.d.ts +50 -2
- package/dist/extensions/registry.js +89 -4
- package/dist/extensions/sources.d.ts +12 -8
- package/dist/extensions/sources.js +34 -13
- package/dist/files/files.module.d.ts +3 -0
- package/dist/files/files.module.js +22 -0
- package/dist/files/previewers.controller.d.ts +7 -2
- package/dist/files/previewers.controller.js +17 -9
- package/dist/files/previewers.d.ts +13 -18
- package/dist/files/previewers.js +83 -36
- package/dist/http/adapter.d.ts +3 -0
- package/dist/http/adapter.js +25 -0
- package/dist/http/api.module.d.ts +3 -110
- package/dist/http/api.module.js +47 -355
- package/dist/http/app.d.ts +11 -15
- package/dist/http/app.js +17 -62
- package/dist/http/error-filter.module.d.ts +5 -0
- package/dist/http/error-filter.module.js +18 -0
- package/dist/http/error.filter.js +2 -2
- package/dist/identity/accounts.d.ts +82 -29
- package/dist/identity/accounts.js +294 -175
- package/dist/identity/api-tokens.d.ts +11 -7
- package/dist/identity/api-tokens.js +71 -44
- package/dist/identity/audit.d.ts +7 -4
- package/dist/identity/audit.js +5 -1
- package/dist/identity/auth.controller.d.ts +11 -10
- package/dist/identity/auth.controller.js +31 -25
- package/dist/identity/auth.guard.d.ts +3 -3
- package/dist/identity/auth.guard.js +6 -4
- package/dist/identity/binding.d.ts +9 -11
- package/dist/identity/binding.js +41 -13
- package/dist/identity/enterprise-admin.d.ts +18 -12
- package/dist/identity/enterprise-admin.js +67 -13
- package/dist/identity/external-identity-lock.d.ts +17 -0
- package/dist/identity/external-identity-lock.js +39 -0
- package/dist/identity/external.d.ts +19 -15
- package/dist/identity/external.js +163 -125
- package/dist/identity/identity.module.d.ts +6 -0
- package/dist/identity/identity.module.js +56 -0
- package/dist/identity/me.controller.d.ts +16 -15
- package/dist/identity/me.controller.js +37 -31
- package/dist/identity/sessions.d.ts +12 -10
- package/dist/identity/sessions.js +74 -42
- package/dist/identity/settings.d.ts +20 -14
- package/dist/identity/settings.js +86 -58
- package/dist/identity/sso.controller.d.ts +7 -7
- package/dist/identity/sso.controller.js +13 -9
- package/dist/identity/sso.d.ts +9 -12
- package/dist/identity/sso.js +54 -24
- package/dist/inbox/inbox.module.d.ts +3 -0
- package/dist/inbox/inbox.module.js +22 -0
- package/dist/inbox/inbox.service.d.ts +7 -9
- package/dist/inbox/inbox.service.js +32 -11
- package/dist/index.d.ts +16 -11
- package/dist/index.js +9 -6
- package/dist/infra/cache/cache.module.d.ts +3 -0
- package/dist/infra/cache/cache.module.js +16 -0
- package/dist/infra/cache/cache.service.d.ts +21 -0
- package/dist/infra/cache/cache.service.js +80 -0
- package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
- package/dist/infra/cache/cacheable.decorator.js +83 -0
- package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
- package/dist/infra/cli/kernel-cli.module.js +165 -0
- package/dist/infra/close-within.d.ts +15 -0
- package/dist/infra/close-within.js +36 -0
- package/dist/infra/config/config.module.d.ts +13 -0
- package/dist/infra/config/config.module.js +39 -0
- package/dist/infra/config/kernel-config.service.d.ts +25 -0
- package/dist/infra/config/kernel-config.service.js +126 -0
- package/dist/infra/database/after-commit.d.ts +6 -0
- package/dist/infra/database/after-commit.js +9 -0
- package/dist/infra/database/database.module.d.ts +25 -0
- package/dist/infra/database/database.module.js +90 -0
- package/dist/infra/database/kernel-db.d.ts +22 -0
- package/dist/infra/database/kernel-db.js +65 -0
- package/dist/infra/database/transaction-host.d.ts +50 -0
- package/dist/infra/database/transaction-host.js +125 -0
- package/dist/infra/database/transactional.decorator.d.ts +15 -0
- package/dist/infra/database/transactional.decorator.js +27 -0
- package/dist/infra/database/xact-lock.d.ts +17 -0
- package/dist/infra/database/xact-lock.js +43 -0
- package/dist/infra/events/kernel-events.d.ts +96 -0
- package/dist/infra/events/kernel-events.js +65 -0
- package/dist/infra/health/health.controller.d.ts +26 -0
- package/dist/infra/health/health.controller.js +104 -0
- package/dist/infra/health/health.module.d.ts +9 -0
- package/dist/infra/health/health.module.js +24 -0
- package/dist/infra/health/health.options.d.ts +10 -0
- package/dist/infra/health/health.options.js +15 -0
- package/dist/infra/health/shutdown-state.d.ts +6 -0
- package/dist/infra/health/shutdown-state.js +2 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
- package/dist/infra/lifecycle/process-guards.d.ts +52 -0
- package/dist/infra/lifecycle/process-guards.js +86 -0
- package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
- package/dist/infra/lifecycle/shutdown-signals.js +48 -0
- package/dist/infra/lock/key-template.d.ts +13 -0
- package/dist/infra/lock/key-template.js +46 -0
- package/dist/infra/lock/lock.module.d.ts +3 -0
- package/dist/infra/lock/lock.module.js +16 -0
- package/dist/infra/lock/lock.service.d.ts +120 -0
- package/dist/infra/lock/lock.service.js +343 -0
- package/dist/infra/lock/shared-lease.d.ts +44 -0
- package/dist/infra/lock/shared-lease.js +121 -0
- package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
- package/dist/infra/lock/with-lock.decorator.js +49 -0
- package/dist/infra/logging/logging.module.d.ts +16 -0
- package/dist/infra/logging/logging.module.js +34 -0
- package/dist/infra/queue/configured-processor.d.ts +18 -0
- package/dist/infra/queue/configured-processor.js +23 -0
- package/dist/infra/queue/job-failure.d.ts +18 -0
- package/dist/infra/queue/job-failure.js +26 -0
- package/dist/infra/queue/queue-shutdown.d.ts +27 -0
- package/dist/infra/queue/queue-shutdown.js +81 -0
- package/dist/infra/queue/queue.module.d.ts +16 -0
- package/dist/infra/queue/queue.module.js +61 -0
- package/dist/infra/queue/redis-connection.d.ts +7 -0
- package/dist/infra/queue/redis-connection.js +18 -0
- package/dist/infra/queue/retired-schedulers.d.ts +7 -0
- package/dist/infra/queue/retired-schedulers.js +9 -0
- package/dist/infra/queue/run-job.d.ts +16 -0
- package/dist/infra/queue/run-job.js +19 -0
- package/dist/infra/redis/redis.module.d.ts +24 -0
- package/dist/infra/redis/redis.module.js +87 -0
- package/dist/infra/schedule/cron-tick.d.ts +12 -0
- package/dist/infra/schedule/cron-tick.js +25 -0
- package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
- package/dist/infra/schedule/locked-cron.decorator.js +53 -0
- package/dist/infra/schedule/locked-interval.d.ts +69 -0
- package/dist/infra/schedule/locked-interval.js +190 -0
- package/dist/infra/schedule/locked-tick.d.ts +90 -0
- package/dist/infra/schedule/locked-tick.js +137 -0
- package/dist/infra/schedule/schedule.module.d.ts +8 -0
- package/dist/infra/schedule/schedule.module.js +27 -0
- package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
- package/dist/infra/schedule/scheduled-runs.js +163 -0
- package/dist/infra/swagger/swagger.d.ts +16 -0
- package/dist/infra/swagger/swagger.js +31 -0
- package/dist/infra/throttler/credential-throttler.d.ts +35 -0
- package/dist/infra/throttler/credential-throttler.js +77 -0
- package/dist/infra/throttler/named-throttlers.d.ts +31 -0
- package/dist/infra/throttler/named-throttlers.js +119 -0
- package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
- package/dist/infra/throttler/redis-throttler-storage.js +130 -0
- package/dist/infra/throttler/throttler.guard.d.ts +23 -0
- package/dist/infra/throttler/throttler.guard.js +68 -0
- package/dist/infra/throttler/throttler.module.d.ts +15 -0
- package/dist/infra/throttler/throttler.module.js +53 -0
- package/dist/infra/tokens.d.ts +15 -0
- package/dist/infra/tokens.js +15 -0
- package/dist/infra/validation/create-zod-dto.d.ts +23 -0
- package/dist/infra/validation/create-zod-dto.js +35 -0
- package/dist/infra/validation/parse-with-zod.d.ts +7 -0
- package/dist/infra/validation/parse-with-zod.js +12 -0
- package/dist/infra/validation/validation.module.d.ts +3 -0
- package/dist/infra/validation/validation.module.js +16 -0
- package/dist/infra/validation/zod-params.d.ts +7 -0
- package/dist/infra/validation/zod-params.js +42 -0
- package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
- package/dist/infra/validation/zod-validation.pipe.js +31 -0
- package/dist/kernel.d.ts +9 -244
- package/dist/kernel.js +8 -1305
- package/dist/kernel.module.d.ts +17 -0
- package/dist/kernel.module.js +136 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
- package/dist/lifecycle/kernel-lifecycle.js +456 -0
- package/dist/lifecycle/tokens.d.ts +3 -0
- package/dist/lifecycle/tokens.js +3 -0
- package/dist/log-context.d.ts +2 -0
- package/dist/log-context.js +4 -0
- package/dist/models/models.module.d.ts +3 -0
- package/dist/models/models.module.js +24 -0
- package/dist/models/prices.d.ts +8 -2
- package/dist/models/prices.js +65 -37
- package/dist/models/purposes.controller.d.ts +1 -1
- package/dist/models/purposes.controller.js +5 -6
- package/dist/models/purposes.d.ts +35 -13
- package/dist/models/purposes.js +101 -51
- package/dist/orgs/directory-sync.controller.d.ts +1 -1
- package/dist/orgs/directory-sync.controller.js +2 -2
- package/dist/orgs/directory-sync.d.ts +61 -31
- package/dist/orgs/directory-sync.js +212 -125
- package/dist/orgs/invitations.controller.d.ts +8 -8
- package/dist/orgs/invitations.controller.js +27 -26
- package/dist/orgs/invitations.service.d.ts +12 -9
- package/dist/orgs/invitations.service.js +130 -92
- package/dist/orgs/job-ids.d.ts +8 -0
- package/dist/orgs/job-ids.js +8 -0
- package/dist/orgs/members.service.d.ts +19 -12
- package/dist/orgs/members.service.js +161 -117
- package/dist/orgs/offboarding.d.ts +54 -57
- package/dist/orgs/offboarding.js +161 -71
- package/dist/orgs/org-lock.d.ts +28 -19
- package/dist/orgs/org-lock.js +81 -35
- package/dist/orgs/org.guard.d.ts +1 -1
- package/dist/orgs/org.guard.js +2 -2
- package/dist/orgs/orgs.controller.d.ts +13 -13
- package/dist/orgs/orgs.controller.js +29 -17
- package/dist/orgs/orgs.module.d.ts +6 -0
- package/dist/orgs/orgs.module.js +68 -0
- package/dist/orgs/orgs.service.d.ts +30 -19
- package/dist/orgs/orgs.service.js +139 -86
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.controller.js +8 -6
- package/dist/orgs/settings.service.d.ts +16 -10
- package/dist/orgs/settings.service.js +77 -48
- package/dist/overrides.d.ts +56 -0
- package/dist/overrides.js +30 -0
- package/dist/roles/gateway-role.d.ts +43 -0
- package/dist/roles/gateway-role.js +98 -0
- package/dist/roles/gateway.module.d.ts +8 -0
- package/dist/roles/gateway.module.js +28 -0
- package/dist/roles/worker-role.d.ts +63 -0
- package/dist/roles/worker-role.js +144 -0
- package/dist/roles/worker.module.d.ts +14 -0
- package/dist/roles/worker.module.js +90 -0
- package/dist/runtime/abort.js +19 -2
- package/dist/runtime/checkpointer.d.ts +8 -3
- package/dist/runtime/checkpointer.js +87 -55
- package/dist/runtime/context/build.d.ts +6 -6
- package/dist/runtime/context/build.js +18 -8
- package/dist/runtime/context/claude-tools.d.ts +2 -1
- package/dist/runtime/context/claude-tools.js +9 -10
- package/dist/runtime/context/legacy-text.d.ts +22 -0
- package/dist/runtime/context/legacy-text.js +37 -0
- package/dist/runtime/context/skills.d.ts +29 -11
- package/dist/runtime/context/skills.js +37 -30
- package/dist/runtime/conversation-lock.d.ts +20 -11
- package/dist/runtime/conversation-lock.js +62 -72
- package/dist/runtime/hook-calls.d.ts +3 -3
- package/dist/runtime/hook-calls.js +1 -6
- package/dist/runtime/job-ids.d.ts +10 -0
- package/dist/runtime/job-ids.js +10 -0
- package/dist/runtime/langgraph-loop.js +1 -1
- package/dist/runtime/loop.d.ts +8 -1
- package/dist/runtime/loop.js +14 -0
- package/dist/runtime/maintenance-queue.d.ts +10 -0
- package/dist/runtime/maintenance-queue.js +10 -0
- package/dist/runtime/maintenance.d.ts +45 -74
- package/dist/runtime/maintenance.js +139 -137
- package/dist/runtime/model-call.d.ts +7 -4
- package/dist/runtime/model-call.js +25 -58
- package/dist/runtime/providers.d.ts +17 -6
- package/dist/runtime/providers.js +66 -25
- package/dist/runtime/quota.d.ts +17 -3
- package/dist/runtime/quota.js +27 -2
- package/dist/runtime/retired-schedulers.d.ts +7 -0
- package/dist/runtime/retired-schedulers.js +31 -0
- package/dist/runtime/run-control.d.ts +33 -0
- package/dist/runtime/run-control.js +77 -0
- package/dist/runtime/run-finish.d.ts +27 -18
- package/dist/runtime/run-finish.js +98 -51
- package/dist/runtime/run-jobs.d.ts +48 -0
- package/dist/runtime/run-jobs.js +95 -0
- package/dist/runtime/run-processors.d.ts +60 -0
- package/dist/runtime/run-processors.js +185 -0
- package/dist/runtime/run-queue.d.ts +32 -57
- package/dist/runtime/run-queue.js +291 -295
- package/dist/runtime/run-steps.d.ts +39 -0
- package/dist/runtime/run-steps.js +96 -0
- package/dist/runtime/run-worker.d.ts +122 -76
- package/dist/runtime/run-worker.js +343 -229
- package/dist/runtime/runtime.module.d.ts +10 -0
- package/dist/runtime/runtime.module.js +112 -0
- package/dist/runtime/step-log.d.ts +40 -0
- package/dist/runtime/step-log.js +94 -0
- package/dist/runtime/stream.controller.d.ts +5 -8
- package/dist/runtime/stream.controller.js +14 -12
- package/dist/runtime/stream.d.ts +24 -6
- package/dist/runtime/stream.js +78 -7
- package/dist/runtime/subagents/child.d.ts +3 -44
- package/dist/runtime/subagents/child.js +0 -79
- package/dist/runtime/subagents/definition.d.ts +5 -10
- package/dist/runtime/subagents/definition.js +13 -14
- package/dist/runtime/subagents/dispatch.d.ts +89 -8
- package/dist/runtime/subagents/dispatch.js +137 -142
- package/dist/runtime/subagents/limits.d.ts +9 -4
- package/dist/runtime/subagents/limits.js +4 -2
- package/dist/runtime/subagents/org-agents.d.ts +4 -4
- package/dist/runtime/subagents/org-agents.js +3 -2
- package/dist/runtime/subagents/progress.d.ts +2 -2
- package/dist/runtime/subagents/roster.d.ts +4 -4
- package/dist/runtime/subagents/roster.js +2 -2
- package/dist/runtime/subagents/skill-fork.d.ts +8 -9
- package/dist/runtime/subagents/skill-fork.js +17 -6
- package/dist/runtime/subagents/subagents.service.d.ts +40 -0
- package/dist/runtime/subagents/subagents.service.js +101 -0
- package/dist/runtime/usage-report.d.ts +94 -52
- package/dist/runtime/usage-report.js +200 -100
- package/dist/runtime/waits.d.ts +127 -59
- package/dist/runtime/waits.js +433 -210
- package/dist/sandbox/job-ids.d.ts +10 -0
- package/dist/sandbox/job-ids.js +10 -0
- package/dist/sandbox/jobs.d.ts +41 -0
- package/dist/sandbox/jobs.js +113 -0
- package/dist/sandbox/leases.d.ts +39 -31
- package/dist/sandbox/leases.js +117 -257
- package/dist/sandbox/providers.d.ts +19 -0
- package/dist/sandbox/providers.js +38 -0
- package/dist/sandbox/sandbox.module.d.ts +8 -0
- package/dist/sandbox/sandbox.module.js +30 -0
- package/dist/sandbox/sandbox.service.d.ts +24 -29
- package/dist/sandbox/sandbox.service.js +106 -75
- package/dist/skills/catalog.d.ts +37 -24
- package/dist/skills/catalog.js +100 -57
- package/dist/skills/changes.controller.d.ts +4 -4
- package/dist/skills/changes.controller.js +15 -9
- package/dist/skills/changes.service.d.ts +30 -20
- package/dist/skills/changes.service.js +425 -367
- package/dist/skills/invocable.controller.d.ts +1 -1
- package/dist/skills/invocable.controller.js +8 -5
- package/dist/skills/invocation-keys.d.ts +1 -1
- package/dist/skills/invocation-keys.js +1 -1
- package/dist/skills/invoke.d.ts +17 -16
- package/dist/skills/invoke.js +53 -21
- package/dist/skills/skills.controller.d.ts +1 -1
- package/dist/skills/skills.controller.js +11 -6
- package/dist/skills/skills.module.d.ts +6 -0
- package/dist/skills/skills.module.js +30 -0
- package/dist/skills/skills.service.d.ts +47 -30
- package/dist/skills/skills.service.js +221 -158
- package/dist/storage/job-ids.d.ts +6 -0
- package/dist/storage/job-ids.js +6 -0
- package/dist/storage/purge.d.ts +22 -7
- package/dist/storage/purge.js +55 -3
- package/dist/storage/storage.module.d.ts +6 -0
- package/dist/storage/storage.module.js +23 -0
- package/dist/storage/storage.service.d.ts +18 -4
- package/dist/storage/storage.service.js +44 -3
- package/dist/tools/approvals.controller.d.ts +1 -1
- package/dist/tools/approvals.controller.js +12 -8
- package/dist/tools/approvals.service.d.ts +33 -25
- package/dist/tools/approvals.service.js +343 -259
- package/dist/tools/breaker.d.ts +2 -2
- package/dist/tools/breaker.js +21 -3
- package/dist/tools/builtin-names.d.ts +73 -0
- package/dist/tools/builtin-names.js +116 -0
- package/dist/tools/builtins/agent.d.ts +7 -7
- package/dist/tools/builtins/agent.js +7 -11
- package/dist/tools/builtins/ask-user.d.ts +3 -3
- package/dist/tools/builtins/ask-user.js +3 -3
- package/dist/tools/builtins/builtin-tools.d.ts +21 -0
- package/dist/tools/builtins/builtin-tools.js +80 -0
- package/dist/tools/builtins/read-tool-output.d.ts +3 -3
- package/dist/tools/builtins/read-tool-output.js +3 -3
- package/dist/tools/builtins/sandbox/bash.d.ts +5 -5
- package/dist/tools/builtins/sandbox/bash.js +33 -30
- package/dist/tools/builtins/sandbox/common.d.ts +5 -4
- package/dist/tools/builtins/sandbox/common.js +2 -2
- package/dist/tools/builtins/sandbox/deliver.d.ts +1 -1
- package/dist/tools/builtins/sandbox/deliver.js +13 -13
- package/dist/tools/builtins/sandbox/edit.d.ts +1 -1
- package/dist/tools/builtins/sandbox/edit.js +42 -31
- package/dist/tools/builtins/sandbox/file-state.d.ts +34 -0
- package/dist/tools/builtins/sandbox/file-state.js +34 -0
- package/dist/tools/builtins/sandbox/glob-match.d.ts +1 -1
- package/dist/tools/builtins/sandbox/glob-match.js +1 -1
- package/dist/tools/builtins/sandbox/glob.d.ts +1 -1
- package/dist/tools/builtins/sandbox/glob.js +6 -6
- package/dist/tools/builtins/sandbox/grep.d.ts +7 -4
- package/dist/tools/builtins/sandbox/grep.js +149 -32
- package/dist/tools/builtins/sandbox/index.d.ts +1 -1
- package/dist/tools/builtins/sandbox/index.js +1 -1
- package/dist/tools/builtins/sandbox/read.d.ts +2 -2
- package/dist/tools/builtins/sandbox/read.js +22 -15
- package/dist/tools/builtins/sandbox/write.d.ts +1 -1
- package/dist/tools/builtins/sandbox/write.js +38 -34
- package/dist/tools/builtins/skill-load.d.ts +6 -6
- package/dist/tools/builtins/skill-load.js +33 -17
- package/dist/tools/builtins/skill-write.d.ts +4 -4
- package/dist/tools/builtins/skill-write.js +10 -10
- package/dist/tools/builtins/tool-search.d.ts +13 -9
- package/dist/tools/builtins/tool-search.js +25 -14
- package/dist/tools/canonical-json.d.ts +6 -0
- package/dist/tools/canonical-json.js +16 -0
- package/dist/tools/connector-content.controller.d.ts +1 -1
- package/dist/tools/connector-content.controller.js +11 -6
- package/dist/tools/connector-content.d.ts +12 -15
- package/dist/tools/connector-content.js +53 -18
- package/dist/tools/connectors.controller.d.ts +1 -1
- package/dist/tools/connectors.controller.js +21 -10
- package/dist/tools/connectors.service.d.ts +31 -13
- package/dist/tools/connectors.service.js +438 -348
- package/dist/tools/credentials.d.ts +17 -20
- package/dist/tools/credentials.js +55 -34
- package/dist/tools/display-names.d.ts +9 -0
- package/dist/tools/display-names.js +24 -0
- package/dist/tools/drift.d.ts +29 -41
- package/dist/tools/drift.js +116 -84
- package/dist/tools/elicitation.js +1 -1
- package/dist/tools/info.d.ts +32 -13
- package/dist/tools/info.js +88 -39
- package/dist/tools/job-ids.d.ts +13 -0
- package/dist/tools/job-ids.js +15 -0
- package/dist/tools/jobs.d.ts +24 -0
- package/dist/tools/jobs.js +69 -0
- package/dist/tools/legacy-data.d.ts +34 -0
- package/dist/tools/legacy-data.js +76 -0
- package/dist/tools/legacy-keys.d.ts +51 -0
- package/dist/tools/legacy-keys.js +115 -0
- package/dist/tools/naming.d.ts +1 -5
- package/dist/tools/naming.js +1 -7
- package/dist/tools/oauth/flow-paths.d.ts +16 -0
- package/dist/tools/oauth/flow-paths.js +38 -0
- package/dist/tools/oauth/flow.d.ts +30 -30
- package/dist/tools/oauth/flow.js +109 -81
- package/dist/tools/oauth/oauth.controller.d.ts +3 -3
- package/dist/tools/oauth/oauth.controller.js +12 -9
- package/dist/tools/oauth/tokens.d.ts +11 -3
- package/dist/tools/oauth/tokens.js +15 -14
- package/dist/tools/outputs.d.ts +13 -4
- package/dist/tools/outputs.js +48 -4
- package/dist/tools/pipeline.d.ts +72 -50
- package/dist/tools/pipeline.js +239 -100
- package/dist/tools/policy.d.ts +3 -16
- package/dist/tools/policy.js +13 -19
- package/dist/tools/questions.controller.d.ts +2 -2
- package/dist/tools/questions.controller.js +9 -6
- package/dist/tools/questions.service.d.ts +26 -25
- package/dist/tools/questions.service.js +201 -142
- package/dist/tools/registry.d.ts +43 -38
- package/dist/tools/registry.js +100 -72
- package/dist/tools/resources.d.ts +1 -1
- package/dist/tools/resources.js +1 -1
- package/dist/tools/specs.d.ts +5 -4
- package/dist/tools/specs.js +3 -1
- package/dist/tools/tools.module.d.ts +10 -0
- package/dist/tools/tools.module.js +91 -0
- package/dist/ui/call-extension.d.ts +16 -0
- package/dist/ui/call-extension.js +38 -0
- package/dist/ui/embed-token.d.ts +9 -5
- package/dist/ui/embed-token.js +34 -6
- package/dist/ui/ui-stream.d.ts +22 -17
- package/dist/ui/ui-stream.js +72 -12
- package/dist/ui/ui.module.d.ts +7 -0
- package/dist/ui/ui.module.js +28 -0
- package/dist/ui/views.controller.d.ts +14 -12
- package/dist/ui/views.controller.js +32 -25
- package/dist/ui/views.d.ts +9 -57
- package/dist/ui/views.js +43 -45
- package/package.json +10 -3
- package/src/migrations/0063_tool_keys_claude_code.sql +220 -0
- package/dist/http/health.controller.d.ts +0 -26
- package/dist/http/health.controller.js +0 -79
- package/dist/http/tokens.d.ts +0 -131
- package/dist/http/tokens.js +0 -131
- package/dist/http/zod.pipe.d.ts +0 -8
- package/dist/http/zod.pipe.js +0 -14
- package/dist/identity/rate-limit.d.ts +0 -55
- package/dist/identity/rate-limit.js +0 -121
- package/dist/sandbox/lifecycle.d.ts +0 -21
- package/dist/sandbox/lifecycle.js +0 -68
- package/dist/tools/builtins/sandbox/names.d.ts +0 -7
- package/dist/tools/builtins/sandbox/names.js +0 -20
- /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
- /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
|
@@ -1,18 +1,40 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
1
10
|
import { randomUUID } from "node:crypto";
|
|
2
11
|
import { DIRECTORY_EXTENSION_POINT, } from "@capybara-hq/plugin-sdk";
|
|
12
|
+
import { getQueueToken } from "@nestjs/bullmq";
|
|
13
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
3
14
|
import { ApiError } from "../errors.js";
|
|
4
15
|
import { enabledExtensionsByOrg } from "../extensions/enabled.js";
|
|
16
|
+
import { OrgExtensionConfigs } from "../extensions/org-config.js";
|
|
17
|
+
import { ExtensionRegistry } from "../extensions/registry.js";
|
|
5
18
|
import { audit } from "../identity/audit.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
19
|
+
import { ExternalIdentities } from "../identity/external.js";
|
|
20
|
+
import { afterCommit } from "../infra/database/after-commit.js";
|
|
21
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
22
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
23
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
24
|
+
import { LockService } from "../infra/lock/lock.service.js";
|
|
25
|
+
import { LockedCron } from "../infra/schedule/locked-cron.decorator.js";
|
|
26
|
+
import { KERNEL_LOGGER, REDIS } from "../infra/tokens.js";
|
|
27
|
+
import { MAINTENANCE_QUEUE_NAME } from "../runtime/maintenance-queue.js";
|
|
28
|
+
import { Offboarding } from "./offboarding.js";
|
|
29
|
+
import { OrgLock } from "./org-lock.js";
|
|
30
|
+
/** The hourly scan: cron job name (no `:`). */
|
|
9
31
|
export const DIRECTORY_SCAN_JOB = "directory-scan";
|
|
10
|
-
|
|
11
|
-
export const DIRECTORY_SCAN_EVERY_MS = 3_600_000;
|
|
12
|
-
/** 一次 (组织, 插件) 同步的维护任务名。 */
|
|
32
|
+
/** The job name of one (org, extension) sync on the maintenance queue. */
|
|
13
33
|
export const DIRECTORY_SYNC_JOB = "directory-sync";
|
|
14
|
-
/**
|
|
15
|
-
export const
|
|
34
|
+
/** The run lock's TTL (renewed while held); a crashed holder's lock expires within it. */
|
|
35
|
+
export const DIRECTORY_SYNC_LOCK_TTL_MS = 30_000;
|
|
36
|
+
/** The `LockService` key of one (org, extension) sync: one sync at a time. */
|
|
37
|
+
export const directorySyncLockKey = (orgId, plugin) => `directory-sync:${orgId}:${plugin}`;
|
|
16
38
|
/** 脏标记的保留时长(秒):锁被占时记下,持有者跑完后取走并补一轮。 */
|
|
17
39
|
export const DIRECTORY_SYNC_DIRTY_TTL_SECONDS = 3_600;
|
|
18
40
|
/** 脏标记(Redis 键):同步进行中又有同步请求被锁挡掉。 */
|
|
@@ -66,10 +88,14 @@ class OrgGone extends Error {
|
|
|
66
88
|
*
|
|
67
89
|
* - 维护队列每小时 `directory-scan`:给每个「插件提供 `directory@1`、在该组织启用、组织级配置满足 schema」的
|
|
68
90
|
* (组织, 插件) 投递一次同步(job id 按小时桶去重,多副本重复扫描只跑一次);手动与 `directory_changed` 也投递同步。
|
|
69
|
-
* -
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
91
|
+
* - One sync at a time per (org, extension): the `LockService` lock
|
|
92
|
+
* `lock:directory-sync:<org>:<plugin>`, renewed while held. A sync that finds the lock taken sets
|
|
93
|
+
* the dirty flag `capk:directory-sync-dirty:<org>:<plugin>` (1 hour) and ends; after releasing
|
|
94
|
+
* the lock the holder takes the flag with GETDEL and, if it was set, enqueues one `changed` sync
|
|
95
|
+
* (the running round may have read pages from before the change). Ruling A32: before the removal
|
|
96
|
+
* phase the holder GETs the flag (without taking it); if it is set, the round counts as
|
|
97
|
+
* incomplete and removes nobody (audit `partialReason = changed_during_sync`), leaving removals
|
|
98
|
+
* to the follow-up sync.
|
|
73
99
|
* After writing the flag, a blocked sync tries the lock once more: when the holder finished in
|
|
74
100
|
* between (and its GETDEL found no flag), this sync clears the flag and runs itself.
|
|
75
101
|
* - Ruling A17:非手动触发的一轮,计划移除数超过 `max(5, 20% × 现有通讯录成员数)`,或列表里没有在职成员而已有
|
|
@@ -86,42 +112,50 @@ class OrgGone extends Error {
|
|
|
86
112
|
* 能力)时,扫描、`directory_changed` 与执行时的复核都静默跳过(不投递、不审计、不记警告),手动触发 409
|
|
87
113
|
* `directory.not_configured`。
|
|
88
114
|
* - 审计 `org.directory.synced`(计数、是否不完整)。任务执行时再核对插件与配置:已停用的插件的陈旧任务什么都不做。
|
|
115
|
+
*
|
|
116
|
+
* The hourly scan is {@link DirectoryScanJob} (a `@LockedCron`); one-off syncs are jobs on the maintenance queue (same name and
|
|
117
|
+
* job ids as before), consumed by `MaintenanceProcessor`.
|
|
89
118
|
*/
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
+
let DirectorySync = class DirectorySync {
|
|
120
|
+
db;
|
|
121
|
+
txHost;
|
|
122
|
+
redis;
|
|
123
|
+
registry;
|
|
124
|
+
orgConfigs;
|
|
125
|
+
external;
|
|
126
|
+
offboarding;
|
|
127
|
+
orgLock;
|
|
128
|
+
queue;
|
|
129
|
+
lockService;
|
|
130
|
+
log;
|
|
131
|
+
constructor(db, txHost, redis, registry, orgConfigs, external, offboarding, orgLock, queue, lockService, log) {
|
|
132
|
+
this.db = db;
|
|
133
|
+
this.txHost = txHost;
|
|
134
|
+
this.redis = redis;
|
|
135
|
+
this.registry = registry;
|
|
136
|
+
this.orgConfigs = orgConfigs;
|
|
137
|
+
this.external = external;
|
|
138
|
+
this.offboarding = offboarding;
|
|
139
|
+
this.orgLock = orgLock;
|
|
140
|
+
this.queue = queue;
|
|
141
|
+
this.lockService = lockService;
|
|
142
|
+
this.log = log;
|
|
143
|
+
}
|
|
144
|
+
/** A `directory-sync` job (dispatched by `MaintenanceProcessor`). */
|
|
145
|
+
async runSyncJob(data) {
|
|
146
|
+
const r = await this.sync(data.orgId, data.plugin, data);
|
|
147
|
+
// 通讯录未配置(Ruling A28)静默跳过
|
|
148
|
+
if (r.status === "skipped" && r.reason !== "not_configured") {
|
|
149
|
+
this.log.info("directory sync skipped", {
|
|
150
|
+
orgId: data.orgId,
|
|
151
|
+
plugin: data.plugin,
|
|
152
|
+
reason: r.reason,
|
|
119
153
|
});
|
|
120
154
|
}
|
|
121
155
|
}
|
|
122
156
|
/** 插件提供的 `directory@1`;未加载或不提供时 undefined。 */
|
|
123
157
|
provider(plugin) {
|
|
124
|
-
return this.
|
|
158
|
+
return this.registry
|
|
125
159
|
.list("directory")
|
|
126
160
|
.find((e) => e.plugin === plugin && e.capability === DIRECTORY_EXTENSION_POINT)?.impl;
|
|
127
161
|
}
|
|
@@ -130,7 +164,7 @@ export class DirectorySync {
|
|
|
130
164
|
const directory = this.provider(plugin);
|
|
131
165
|
if (!directory)
|
|
132
166
|
return { ok: false, reason: "plugin_unavailable" };
|
|
133
|
-
const org = await this.
|
|
167
|
+
const org = await this.db
|
|
134
168
|
.selectFrom("orgs")
|
|
135
169
|
.select("id")
|
|
136
170
|
.where("id", "=", orgId)
|
|
@@ -140,10 +174,10 @@ export class DirectorySync {
|
|
|
140
174
|
return { ok: false, reason: "org_not_found" };
|
|
141
175
|
let cfg;
|
|
142
176
|
try {
|
|
143
|
-
cfg = await this.
|
|
177
|
+
cfg = await this.orgConfigs.get(orgId, plugin);
|
|
144
178
|
}
|
|
145
179
|
catch (err) {
|
|
146
|
-
this.
|
|
180
|
+
this.log.warn("directory sync: stored organization config is invalid", {
|
|
147
181
|
orgId,
|
|
148
182
|
plugin,
|
|
149
183
|
err,
|
|
@@ -168,7 +202,7 @@ export class DirectorySync {
|
|
|
168
202
|
}
|
|
169
203
|
/**
|
|
170
204
|
* 投递一次 `directory_changed` 同步(按分钟桶去重);返回 job id。入站 `directory_changed` 经
|
|
171
|
-
*
|
|
205
|
+
* `ChannelInbound`(`directory_changed`)调用这里。通讯录未配置(`Directory.configured` 返回 false,Ruling A28)时
|
|
172
206
|
* 静默不投递,返回 undefined;其他不可同步的情况照常投递,由任务执行时跳过。
|
|
173
207
|
*/
|
|
174
208
|
async enqueue(orgId, plugin, now = new Date()) {
|
|
@@ -178,9 +212,6 @@ export class DirectorySync {
|
|
|
178
212
|
return this.addJob(orgId, plugin, "changed", directorySyncJobId(orgId, plugin, "changed", now));
|
|
179
213
|
}
|
|
180
214
|
async addJob(orgId, plugin, trigger, jobId, requestedBy) {
|
|
181
|
-
const m = this.d.maintenance;
|
|
182
|
-
if (!m)
|
|
183
|
-
throw new Error("directory sync: maintenance queue is not available");
|
|
184
215
|
if (jobId.includes(":"))
|
|
185
216
|
throw new Error("directory sync: job id must not contain ':'");
|
|
186
217
|
const data = {
|
|
@@ -190,8 +221,10 @@ export class DirectorySync {
|
|
|
190
221
|
...(requestedBy !== undefined && { requestedBy: requestedBy.accountId }),
|
|
191
222
|
...(requestedBy?.tokenId !== undefined && { requestedByToken: requestedBy.tokenId }),
|
|
192
223
|
};
|
|
193
|
-
await
|
|
224
|
+
await this.queue.add(DIRECTORY_SYNC_JOB, data, {
|
|
194
225
|
jobId,
|
|
226
|
+
// the maintenance queue's jobs run once (no retry), as before
|
|
227
|
+
attempts: 1,
|
|
195
228
|
removeOnComplete: { age: KEEP_COMPLETED_SECONDS[trigger] },
|
|
196
229
|
removeOnFail: KEEP_FAILED,
|
|
197
230
|
});
|
|
@@ -205,9 +238,7 @@ export class DirectorySync {
|
|
|
205
238
|
* job with a unique id.
|
|
206
239
|
*/
|
|
207
240
|
async request(orgId, plugin, actorAccountId, actorTokenId) {
|
|
208
|
-
await this.
|
|
209
|
-
.transaction()
|
|
210
|
-
.execute((t) => lockOrgAndAuthorize(t, orgId, actorAccountId, "org.members.manage"));
|
|
241
|
+
await this.authorize(orgId, actorAccountId);
|
|
211
242
|
const e = await this.eligible(orgId, plugin);
|
|
212
243
|
if (!e.ok) {
|
|
213
244
|
switch (e.reason) {
|
|
@@ -226,19 +257,22 @@ export class DirectorySync {
|
|
|
226
257
|
const jobId = await this.addJob(orgId, plugin, "manual", directorySyncJobId(orgId, plugin, "manual"), { accountId: actorAccountId, tokenId: actorTokenId });
|
|
227
258
|
return { jobId };
|
|
228
259
|
}
|
|
260
|
+
async authorize(orgId, actorAccountId) {
|
|
261
|
+
await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "org.members.manage");
|
|
262
|
+
}
|
|
229
263
|
/**
|
|
230
264
|
* 每小时扫描:给每个可同步的 (组织, 插件) 投递一次同步(job id 按小时桶),返回投递的目标。
|
|
231
265
|
* 已存配置不再满足 schema 的跳过(记 warn);单个投递失败记 warn、继续其他目标。
|
|
232
266
|
*/
|
|
233
267
|
async scan(now = new Date()) {
|
|
234
|
-
const plugins = this.
|
|
268
|
+
const plugins = this.registry
|
|
235
269
|
.list("directory")
|
|
236
270
|
.filter((e) => e.capability === DIRECTORY_EXTENSION_POINT)
|
|
237
271
|
.map((e) => e.plugin);
|
|
238
272
|
if (plugins.length === 0)
|
|
239
273
|
return [];
|
|
240
|
-
const rows = await this.
|
|
241
|
-
.selectFrom(enabledExtensionsByOrg(this.
|
|
274
|
+
const rows = await this.db
|
|
275
|
+
.selectFrom(enabledExtensionsByOrg(this.db.db).as("en"))
|
|
242
276
|
.innerJoin("orgs", "orgs.id", "en.org_id")
|
|
243
277
|
.select(["en.org_id", "en.plugin"])
|
|
244
278
|
.where("orgs.deleted_at", "is", null)
|
|
@@ -256,7 +290,7 @@ export class DirectorySync {
|
|
|
256
290
|
out.push({ orgId: r.org_id, plugin: r.plugin, jobId });
|
|
257
291
|
}
|
|
258
292
|
catch (err) {
|
|
259
|
-
this.
|
|
293
|
+
this.log.warn("cannot enqueue directory sync", {
|
|
260
294
|
orgId: r.org_id,
|
|
261
295
|
plugin: r.plugin,
|
|
262
296
|
err,
|
|
@@ -271,26 +305,26 @@ export class DirectorySync {
|
|
|
271
305
|
if (!e.ok)
|
|
272
306
|
return { status: "skipped", reason: e.reason };
|
|
273
307
|
const dirtyKey = directorySyncDirtyKey(orgId, plugin);
|
|
274
|
-
const lockKey =
|
|
275
|
-
|
|
308
|
+
const lockKey = directorySyncLockKey(orgId, plugin);
|
|
309
|
+
const lockOpts = { ttlMs: DIRECTORY_SYNC_LOCK_TTL_MS };
|
|
310
|
+
let lease = await this.lockService.acquire(lockKey, lockOpts);
|
|
276
311
|
if (!lease) {
|
|
277
312
|
// 在跑的那一轮可能已经读过变化之前的页:记下脏标记,由持有者跑完后补一轮
|
|
278
|
-
await this.
|
|
313
|
+
await this.redis.set(dirtyKey, "1", "EX", DIRECTORY_SYNC_DIRTY_TTL_SECONDS);
|
|
279
314
|
// The holder may have released the lock and taken the flag (GETDEL) between the failed
|
|
280
315
|
// attempt and the write above: the flag would then wait an hour with nobody to rerun, and
|
|
281
316
|
// the next sync would skip its removals. Try the lock once more after the write: if it is
|
|
282
317
|
// still held, its holder takes the flag after releasing; if not, run this sync now.
|
|
283
|
-
lease = await this.
|
|
318
|
+
lease = await this.lockService.acquire(lockKey, lockOpts);
|
|
284
319
|
if (!lease)
|
|
285
320
|
return { status: "skipped", reason: "locked" };
|
|
286
321
|
// No page has been read yet, so this run covers every change flagged so far.
|
|
287
|
-
await this.
|
|
322
|
+
await this.redis.del(dirtyKey);
|
|
288
323
|
}
|
|
289
|
-
const abort = new AbortController();
|
|
290
324
|
// 锁丢了(续租失败、过期后被他人取得):停止本轮,不再移除任何人
|
|
291
|
-
|
|
325
|
+
const signal = lease.lost;
|
|
292
326
|
try {
|
|
293
|
-
return await this.run(orgId, plugin, e.directory, e.orgConfig,
|
|
327
|
+
return await this.run(orgId, plugin, e.directory, e.orgConfig, signal, opts);
|
|
294
328
|
}
|
|
295
329
|
finally {
|
|
296
330
|
await lease.release().catch(() => { });
|
|
@@ -303,13 +337,13 @@ export class DirectorySync {
|
|
|
303
337
|
*/
|
|
304
338
|
async rerunIfDirty(orgId, plugin, dirtyKey) {
|
|
305
339
|
try {
|
|
306
|
-
if ((await this.
|
|
340
|
+
if ((await this.redis.getdel(dirtyKey)) === null)
|
|
307
341
|
return;
|
|
308
342
|
const jobId = `directory-sync-${orgId}-${plugin}-rerun-${randomUUID()}`;
|
|
309
343
|
await this.addJob(orgId, plugin, "changed", jobId);
|
|
310
344
|
}
|
|
311
345
|
catch (err) {
|
|
312
|
-
this.
|
|
346
|
+
this.log.warn("directory sync: cannot enqueue follow-up sync", { orgId, plugin, err });
|
|
313
347
|
}
|
|
314
348
|
}
|
|
315
349
|
async run(orgId, plugin, directory, orgConfig, signal, opts) {
|
|
@@ -351,7 +385,7 @@ export class DirectorySync {
|
|
|
351
385
|
if (err instanceof OrgGone)
|
|
352
386
|
throw err;
|
|
353
387
|
counts.failed++;
|
|
354
|
-
this.
|
|
388
|
+
this.log.warn("directory sync: cannot add member", { orgId, plugin, err });
|
|
355
389
|
}
|
|
356
390
|
}
|
|
357
391
|
const next = r.next;
|
|
@@ -364,7 +398,7 @@ export class DirectorySync {
|
|
|
364
398
|
listed = true;
|
|
365
399
|
}
|
|
366
400
|
catch (err) {
|
|
367
|
-
this.
|
|
401
|
+
this.log.warn("directory sync stopped before listing all members", { orgId, plugin, err });
|
|
368
402
|
}
|
|
369
403
|
const trigger = opts.trigger ?? "manual";
|
|
370
404
|
let partial = !listed || counts.failed > 0;
|
|
@@ -376,7 +410,7 @@ export class DirectorySync {
|
|
|
376
410
|
partial = true;
|
|
377
411
|
// 途中通讯录配置被清空(Ruling A28):照样不移除,但不记警告
|
|
378
412
|
if (still.reason !== "not_configured") {
|
|
379
|
-
this.
|
|
413
|
+
this.log.warn("directory sync: plugin no longer eligible before removals", {
|
|
380
414
|
orgId,
|
|
381
415
|
plugin,
|
|
382
416
|
reason: still.reason,
|
|
@@ -390,10 +424,10 @@ export class DirectorySync {
|
|
|
390
424
|
if (!partial) {
|
|
391
425
|
let dirty;
|
|
392
426
|
try {
|
|
393
|
-
dirty = await this.
|
|
427
|
+
dirty = await this.redis.get(directorySyncDirtyKey(orgId, plugin));
|
|
394
428
|
}
|
|
395
429
|
catch (err) {
|
|
396
|
-
this.
|
|
430
|
+
this.log.warn("directory sync: cannot read the dirty flag; skipping removals", {
|
|
397
431
|
orgId,
|
|
398
432
|
plugin,
|
|
399
433
|
err,
|
|
@@ -406,7 +440,7 @@ export class DirectorySync {
|
|
|
406
440
|
}
|
|
407
441
|
}
|
|
408
442
|
if (!partial) {
|
|
409
|
-
const existing = await this.
|
|
443
|
+
const existing = await this.db
|
|
410
444
|
.selectFrom("memberships")
|
|
411
445
|
.select("account_id")
|
|
412
446
|
.where("org_id", "=", orgId)
|
|
@@ -420,13 +454,13 @@ export class DirectorySync {
|
|
|
420
454
|
(planned.length > threshold || (active === 0 && existing.length > 0))) {
|
|
421
455
|
partial = true;
|
|
422
456
|
removalBlocked = true;
|
|
423
|
-
this.
|
|
457
|
+
this.log.warn("directory sync: mass removal blocked", {
|
|
424
458
|
orgId,
|
|
425
459
|
plugin,
|
|
426
460
|
planned: planned.length,
|
|
427
461
|
existing: existing.length,
|
|
428
462
|
});
|
|
429
|
-
await audit(this.
|
|
463
|
+
await audit(this.db.db, {
|
|
430
464
|
orgId,
|
|
431
465
|
action: "org.directory.removal_blocked",
|
|
432
466
|
target: plugin,
|
|
@@ -454,7 +488,7 @@ export class DirectorySync {
|
|
|
454
488
|
counts.failed++;
|
|
455
489
|
}
|
|
456
490
|
}
|
|
457
|
-
await audit(this.
|
|
491
|
+
await audit(this.db.db, {
|
|
458
492
|
...(opts.requestedBy !== undefined && { actorAccountId: opts.requestedBy }),
|
|
459
493
|
...(opts.requestedByToken !== undefined && { actorTokenId: opts.requestedByToken }),
|
|
460
494
|
orgId,
|
|
@@ -492,35 +526,37 @@ export class DirectorySync {
|
|
|
492
526
|
emailVerified: m.emailVerified === true,
|
|
493
527
|
displayName: m.displayName,
|
|
494
528
|
};
|
|
495
|
-
return this.
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
529
|
+
return this.addMemberIn(orgId, plugin, source, identity);
|
|
530
|
+
}
|
|
531
|
+
/** One short transaction per member, under the org row lock. */
|
|
532
|
+
async addMemberIn(orgId, plugin, source, identity) {
|
|
533
|
+
if (!(await this.orgLock.tryLock(orgId)))
|
|
534
|
+
throw new OrgGone("organization deleted during sync");
|
|
535
|
+
const { accountId } = await this.external.resolve(identity, { linkedVia: "directory" });
|
|
536
|
+
const excluded = await this.db
|
|
537
|
+
.selectFrom("directory_exclusions")
|
|
538
|
+
.select("account_id")
|
|
539
|
+
.where("org_id", "=", orgId)
|
|
540
|
+
.where("account_id", "=", accountId)
|
|
541
|
+
.where("plugin", "=", plugin)
|
|
542
|
+
.executeTakeFirst();
|
|
543
|
+
if (excluded)
|
|
544
|
+
return { accountId, added: false };
|
|
545
|
+
const inserted = await this.db
|
|
546
|
+
.insertInto("memberships")
|
|
547
|
+
.values({ org_id: orgId, account_id: accountId, role: "member", source })
|
|
548
|
+
.onConflict((oc) => oc.columns(["org_id", "account_id"]).doNothing())
|
|
549
|
+
.returning("account_id")
|
|
550
|
+
.executeTakeFirst();
|
|
551
|
+
if (inserted) {
|
|
552
|
+
await audit(this.db.db, {
|
|
553
|
+
orgId,
|
|
554
|
+
action: "org.member.added",
|
|
555
|
+
target: accountId,
|
|
556
|
+
detail: { role: "member", source },
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
return { accountId, added: inserted !== undefined };
|
|
524
560
|
}
|
|
525
561
|
/**
|
|
526
562
|
* 一个离职者:独立事务内先锁组织行、再锁其成员关系行(与 `switchCurrentOrg` / 移出成员同一顺序),
|
|
@@ -529,30 +565,81 @@ export class DirectorySync {
|
|
|
529
565
|
*/
|
|
530
566
|
async offboardOne(orgId, plugin, source, accountId) {
|
|
531
567
|
try {
|
|
532
|
-
const result = await this.
|
|
533
|
-
|
|
534
|
-
return undefined;
|
|
535
|
-
const row = await t
|
|
536
|
-
.selectFrom("memberships")
|
|
537
|
-
.select("source")
|
|
538
|
-
.where("org_id", "=", orgId)
|
|
539
|
-
.where("account_id", "=", accountId)
|
|
540
|
-
.forUpdate()
|
|
541
|
-
.executeTakeFirst();
|
|
542
|
-
if (row?.source !== source)
|
|
543
|
-
return undefined;
|
|
544
|
-
return this.d.offboarding.offboard(t, orgId, accountId, "directory");
|
|
545
|
-
});
|
|
546
|
-
if (!result)
|
|
547
|
-
return "gone";
|
|
548
|
-
await this.d.offboarding.afterCommit(result);
|
|
549
|
-
return "removed";
|
|
568
|
+
const result = await this.offboardIn(orgId, source, accountId);
|
|
569
|
+
return result ? "removed" : "gone";
|
|
550
570
|
}
|
|
551
571
|
catch (err) {
|
|
552
572
|
if (err instanceof ApiError && err.code === "org.last_owner")
|
|
553
573
|
return "last_owner";
|
|
554
|
-
this.
|
|
574
|
+
this.log.warn("directory sync: cannot offboard member", { orgId, plugin, accountId, err });
|
|
555
575
|
return "failed";
|
|
556
576
|
}
|
|
557
577
|
}
|
|
558
|
-
|
|
578
|
+
async offboardIn(orgId, source, accountId) {
|
|
579
|
+
if (!(await this.orgLock.tryLock(orgId)))
|
|
580
|
+
return undefined;
|
|
581
|
+
const row = await this.db
|
|
582
|
+
.selectFrom("memberships")
|
|
583
|
+
.select("source")
|
|
584
|
+
.where("org_id", "=", orgId)
|
|
585
|
+
.where("account_id", "=", accountId)
|
|
586
|
+
.forUpdate()
|
|
587
|
+
.executeTakeFirst();
|
|
588
|
+
if (row?.source !== source)
|
|
589
|
+
return undefined;
|
|
590
|
+
const result = await this.offboarding.offboard(orgId, accountId, "directory");
|
|
591
|
+
// the markers, events and run stops follow the root commit (none after a rollback)
|
|
592
|
+
afterCommit(() => this.offboarding.afterOffboard(result));
|
|
593
|
+
return result;
|
|
594
|
+
}
|
|
595
|
+
};
|
|
596
|
+
__decorate([
|
|
597
|
+
Transactional()
|
|
598
|
+
], DirectorySync.prototype, "authorize", null);
|
|
599
|
+
__decorate([
|
|
600
|
+
Transactional()
|
|
601
|
+
], DirectorySync.prototype, "addMemberIn", null);
|
|
602
|
+
__decorate([
|
|
603
|
+
Transactional()
|
|
604
|
+
], DirectorySync.prototype, "offboardIn", null);
|
|
605
|
+
DirectorySync = __decorate([
|
|
606
|
+
Injectable(),
|
|
607
|
+
__param(0, Inject(KernelDb)),
|
|
608
|
+
__param(1, Inject(TransactionHost)),
|
|
609
|
+
__param(2, Inject(REDIS)),
|
|
610
|
+
__param(3, Inject(ExtensionRegistry)),
|
|
611
|
+
__param(4, Inject(OrgExtensionConfigs)),
|
|
612
|
+
__param(5, Inject(ExternalIdentities)),
|
|
613
|
+
__param(6, Inject(Offboarding)),
|
|
614
|
+
__param(7, Inject(OrgLock)),
|
|
615
|
+
__param(8, Inject(getQueueToken(MAINTENANCE_QUEUE_NAME))),
|
|
616
|
+
__param(9, Inject(LockService)),
|
|
617
|
+
__param(10, Inject(KERNEL_LOGGER))
|
|
618
|
+
], DirectorySync);
|
|
619
|
+
export { DirectorySync };
|
|
620
|
+
/** The hourly directory scan ({@link DirectorySync.scan}), once per tick across replicas; a worker-role job (`WorkerModule`). */
|
|
621
|
+
let DirectoryScanJob = class DirectoryScanJob {
|
|
622
|
+
directory;
|
|
623
|
+
lockService;
|
|
624
|
+
log;
|
|
625
|
+
constructor(directory, lockService, log) {
|
|
626
|
+
this.directory = directory;
|
|
627
|
+
this.lockService = lockService;
|
|
628
|
+
this.log = log;
|
|
629
|
+
}
|
|
630
|
+
async run() {
|
|
631
|
+
const targets = await this.directory.scan();
|
|
632
|
+
if (targets.length > 0)
|
|
633
|
+
this.log.info("directory syncs enqueued", { count: targets.length });
|
|
634
|
+
}
|
|
635
|
+
};
|
|
636
|
+
__decorate([
|
|
637
|
+
LockedCron("0 * * * *", { name: DIRECTORY_SCAN_JOB })
|
|
638
|
+
], DirectoryScanJob.prototype, "run", null);
|
|
639
|
+
DirectoryScanJob = __decorate([
|
|
640
|
+
Injectable(),
|
|
641
|
+
__param(0, Inject(DirectorySync)),
|
|
642
|
+
__param(1, Inject(LockService)),
|
|
643
|
+
__param(2, Inject(KERNEL_LOGGER))
|
|
644
|
+
], DirectoryScanJob);
|
|
645
|
+
export { DirectoryScanJob };
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import type { FastifyReply, FastifyRequest } from "fastify";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import type { KernelConfig } from "../config/schema.js";
|
|
4
3
|
import type { Account } from "../identity/accounts.js";
|
|
5
4
|
import { type Principal } from "../identity/principal.js";
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
5
|
+
import { SessionService } from "../identity/sessions.js";
|
|
6
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
7
|
+
import { CredentialThrottler } from "../infra/throttler/credential-throttler.js";
|
|
8
|
+
import { type InvitableRole, type Invitation, type InvitationStatus, InvitationsService } from "./invitations.service.js";
|
|
9
9
|
import { type OrgContext } from "./org.guard.js";
|
|
10
10
|
import type { OrgRole } from "./roles.js";
|
|
11
|
-
declare const
|
|
11
|
+
declare const CreateSchema: z.ZodObject<{
|
|
12
12
|
role: z.ZodEnum<{
|
|
13
13
|
admin: "admin";
|
|
14
14
|
guest: "guest";
|
|
@@ -21,10 +21,10 @@ export declare class InvitationsController {
|
|
|
21
21
|
private readonly invitations;
|
|
22
22
|
private readonly sessions;
|
|
23
23
|
private readonly config;
|
|
24
|
-
private readonly
|
|
25
|
-
constructor(invitations: InvitationsService, sessions: SessionService, config:
|
|
24
|
+
private readonly throttler;
|
|
25
|
+
constructor(invitations: InvitationsService, sessions: SessionService, config: KernelConfigService, throttler: CredentialThrottler);
|
|
26
26
|
/** 令牌只在此返回一次。 */
|
|
27
|
-
create(principal: Principal, org: OrgContext, body: z.infer<typeof
|
|
27
|
+
create(principal: Principal, org: OrgContext, body: z.infer<typeof CreateSchema>): Promise<{
|
|
28
28
|
invitation: Invitation;
|
|
29
29
|
token: string;
|
|
30
30
|
}>;
|