@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,36 @@
|
|
|
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 { CHANNEL_EXTENSION_POINT, } from "@capybara-hq/plugin-sdk";
|
|
12
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
3
13
|
import { sql } from "kysely";
|
|
4
14
|
import { configFields, getPath, secretValues } from "../config/fields.js";
|
|
5
15
|
import { queryEnabledPlugins } from "../ctx/create-ctx.js";
|
|
6
16
|
import { createSecrets } from "../ctx/secrets.js";
|
|
7
17
|
import { ApiError } from "../errors.js";
|
|
18
|
+
import { toIssues } from "../extensions/config-issues.js";
|
|
8
19
|
import { configToJsonSchema } from "../extensions/config-json-schema.js";
|
|
9
20
|
import { enabledExtensionsByOrg } from "../extensions/enabled.js";
|
|
10
|
-
import {
|
|
21
|
+
import { ExtensionRegistry } from "../extensions/registry.js";
|
|
11
22
|
import { audit } from "../identity/audit.js";
|
|
23
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
24
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
25
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
26
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
27
|
+
import { KernelEvents } from "../infra/events/kernel-events.js";
|
|
28
|
+
import { KERNEL_BUS, KERNEL_LOGGER, KEYRING, REDIS } from "../infra/tokens.js";
|
|
12
29
|
import { createRedactor } from "../log.js";
|
|
13
|
-
import {
|
|
30
|
+
import { OrgLock } from "../orgs/org-lock.js";
|
|
14
31
|
import { readOrgSettings } from "../orgs/settings.service.js";
|
|
15
32
|
import { adaptToFeatures } from "./features.js";
|
|
33
|
+
import { ChannelJobs } from "./jobs.js";
|
|
16
34
|
import { webhookBase, webhookUrlOf } from "./webhook-url.js";
|
|
17
35
|
/** 内核 secrets 命名空间(插件名不能取 `kernel`)。 */
|
|
18
36
|
const SECRETS_NAMESPACE = "kernel";
|
|
@@ -91,17 +109,56 @@ const COLUMNS = [
|
|
|
91
109
|
* (命名空间 `kernel`,键 `channels:<id>:config`)。写操作在组织行锁内实时复核 `channels.manage`,写审计;
|
|
92
110
|
* 改动提交后经内核 bus 广播 `channel.changed`,持有该连接的副本据此断开(下一轮扫描按新配置重连)。
|
|
93
111
|
*/
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
112
|
+
let ChannelConnections = class ChannelConnections {
|
|
113
|
+
db;
|
|
114
|
+
orgLock;
|
|
115
|
+
keyring;
|
|
116
|
+
registry;
|
|
117
|
+
bus;
|
|
118
|
+
redis;
|
|
119
|
+
jobs;
|
|
120
|
+
config;
|
|
121
|
+
log;
|
|
122
|
+
txHost;
|
|
123
|
+
unsubscribe;
|
|
124
|
+
constructor(db,
|
|
125
|
+
/** The org row lock (orgs/org-lock.ts): joins the transaction of the write. */
|
|
126
|
+
orgLock, keyring, registry, bus, redis,
|
|
127
|
+
/** A connection that can deliver again catches up its conversations (`resumeConnection`). */
|
|
128
|
+
jobs,
|
|
129
|
+
/** `channels.webhookBaseUrl`: without it webhook mode is unavailable. */
|
|
130
|
+
config, events,
|
|
131
|
+
/** Secret values handled here (written or decrypted) are redacted from the logs (`addOrgSecrets`). */
|
|
132
|
+
log, txHost) {
|
|
133
|
+
this.db = db;
|
|
134
|
+
this.orgLock = orgLock;
|
|
135
|
+
this.keyring = keyring;
|
|
136
|
+
this.registry = registry;
|
|
137
|
+
this.bus = bus;
|
|
138
|
+
this.redis = redis;
|
|
139
|
+
this.jobs = jobs;
|
|
140
|
+
this.config = config;
|
|
141
|
+
this.log = log;
|
|
142
|
+
this.txHost = txHost;
|
|
143
|
+
this.unsubscribe = [
|
|
144
|
+
// a deleted org's channel connections drop their long connections at once
|
|
145
|
+
events.on("org.deleted", ({ orgId }) => this.notifyOrgChanged(orgId)),
|
|
146
|
+
// an org disabling an extension drops that extension's channel connections at once (the
|
|
147
|
+
// supervisor's periodic re-check is the fallback)
|
|
148
|
+
events.on("extension.org-disabled", ({ orgId, plugin }) => this.notifyOrgChanged(orgId, plugin)),
|
|
149
|
+
];
|
|
150
|
+
}
|
|
151
|
+
/** Unsubscribes after the stop phases: events emitted while they drain are still handled. */
|
|
152
|
+
onApplicationShutdown() {
|
|
153
|
+
for (const off of this.unsubscribe)
|
|
154
|
+
off();
|
|
98
155
|
}
|
|
99
156
|
/** The extension's `channel@1`; not loaded or not provided -> `extension.not_found`. */
|
|
100
157
|
channel(plugin) {
|
|
101
158
|
return this.channelEntry(plugin).impl;
|
|
102
159
|
}
|
|
103
160
|
channelEntry(plugin) {
|
|
104
|
-
const e = this.
|
|
161
|
+
const e = this.registry
|
|
105
162
|
.list("channel")
|
|
106
163
|
.find((x) => x.plugin === plugin && x.capability === CHANNEL_EXTENSION_POINT);
|
|
107
164
|
if (!e)
|
|
@@ -110,7 +167,7 @@ export class ChannelConnections {
|
|
|
110
167
|
}
|
|
111
168
|
/** The extension is not enabled in this organization -> `extension.not_enabled`. */
|
|
112
169
|
async assertEnabled(orgId, plugin) {
|
|
113
|
-
if (!(await queryEnabledPlugins(this.
|
|
170
|
+
if (!(await queryEnabledPlugins(this.db.db, orgId)).has(plugin)) {
|
|
114
171
|
throw new ApiError("extension.not_enabled", `Extension ${plugin} is not enabled for this organization`);
|
|
115
172
|
}
|
|
116
173
|
}
|
|
@@ -141,10 +198,10 @@ export class ChannelConnections {
|
|
|
141
198
|
reportSecrets(schema, config) {
|
|
142
199
|
const values = secretValues(schema, config);
|
|
143
200
|
if (values.length > 0)
|
|
144
|
-
this.
|
|
201
|
+
this.log.addOrgSecrets(values);
|
|
145
202
|
}
|
|
146
|
-
async assertAgent(
|
|
147
|
-
const a = await
|
|
203
|
+
async assertAgent(orgId, agentId) {
|
|
204
|
+
const a = await this.db
|
|
148
205
|
.selectFrom("agents")
|
|
149
206
|
.select("id")
|
|
150
207
|
.where("id", "=", agentId)
|
|
@@ -155,7 +212,7 @@ export class ChannelConnections {
|
|
|
155
212
|
throw new ApiError("agent.not_found", "Agent not found");
|
|
156
213
|
}
|
|
157
214
|
async readSecrets(orgId, id) {
|
|
158
|
-
const raw = await createSecrets(this.
|
|
215
|
+
const raw = await createSecrets(this.db.db, this.keyring, SECRETS_NAMESPACE).get(orgId, connectionSecretKey(id));
|
|
159
216
|
return raw === null ? {} : JSON.parse(raw);
|
|
160
217
|
}
|
|
161
218
|
view(r, setPaths) {
|
|
@@ -193,8 +250,7 @@ export class ChannelConnections {
|
|
|
193
250
|
};
|
|
194
251
|
}
|
|
195
252
|
webhookBase() {
|
|
196
|
-
|
|
197
|
-
return config === undefined ? undefined : webhookBase(config);
|
|
253
|
+
return webhookBase(this.config.get());
|
|
198
254
|
}
|
|
199
255
|
/**
|
|
200
256
|
* Switching to webhook mode needs a plugin that implements `Channel.webhook` and a configured
|
|
@@ -212,7 +268,7 @@ export class ChannelConnections {
|
|
|
212
268
|
return this.view(row, new Set(Object.keys(await this.readSecrets(row.org_id, row.id))));
|
|
213
269
|
}
|
|
214
270
|
live(orgId) {
|
|
215
|
-
return this.
|
|
271
|
+
return this.db
|
|
216
272
|
.selectFrom("channel_connections")
|
|
217
273
|
.select(COLUMNS)
|
|
218
274
|
.where("org_id", "=", orgId)
|
|
@@ -234,46 +290,58 @@ export class ChannelConnections {
|
|
|
234
290
|
await this.assertEnabled(orgId, input.plugin);
|
|
235
291
|
const schema = channel.connectionSchema;
|
|
236
292
|
const full = this.parse(input.plugin, schema, input.config);
|
|
237
|
-
await this.assertAgent(
|
|
293
|
+
await this.assertAgent(orgId, input.agentId);
|
|
238
294
|
const verified = await this.verify(channel, full);
|
|
239
295
|
const id = randomUUID();
|
|
240
296
|
const { plain, secrets } = split(schema, full);
|
|
241
|
-
const row = await this.
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
id,
|
|
251
|
-
org_id: orgId,
|
|
252
|
-
plugin: input.plugin,
|
|
253
|
-
name: input.name,
|
|
254
|
-
agent_id: input.agentId,
|
|
255
|
-
config: JSON.stringify(plain),
|
|
256
|
-
unbound_policy: input.unboundPolicy ?? "bind",
|
|
257
|
-
bot_user_id: verified.botUserId,
|
|
258
|
-
tenant_id: verified.tenantId,
|
|
259
|
-
created_by: actorAccountId,
|
|
260
|
-
})
|
|
261
|
-
.returning(COLUMNS)
|
|
262
|
-
.executeTakeFirstOrThrow();
|
|
263
|
-
await audit(t, {
|
|
264
|
-
actorAccountId,
|
|
265
|
-
...(actorTokenId !== undefined && { actorTokenId }),
|
|
266
|
-
orgId,
|
|
267
|
-
action: "channel.created",
|
|
268
|
-
target: id,
|
|
269
|
-
detail: { plugin: input.plugin, agentId: input.agentId },
|
|
270
|
-
});
|
|
271
|
-
return inserted;
|
|
297
|
+
const row = await this.insertIn({
|
|
298
|
+
orgId,
|
|
299
|
+
id,
|
|
300
|
+
input,
|
|
301
|
+
plain,
|
|
302
|
+
secrets,
|
|
303
|
+
verified,
|
|
304
|
+
actorAccountId,
|
|
305
|
+
actorTokenId,
|
|
272
306
|
});
|
|
273
307
|
this.reportSecrets(schema, full);
|
|
274
308
|
await this.changed(id, false);
|
|
275
309
|
return this.view(row, new Set(Object.keys(secrets)));
|
|
276
310
|
}
|
|
311
|
+
/** The rows of {@link create}, in their own transaction (the caller publishes after the commit). */
|
|
312
|
+
async insertIn(a) {
|
|
313
|
+
const { orgId, id, input, actorAccountId, actorTokenId } = a;
|
|
314
|
+
await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "channels.manage");
|
|
315
|
+
await this.assertAgent(orgId, input.agentId);
|
|
316
|
+
if (Object.keys(a.secrets).length > 0) {
|
|
317
|
+
await createSecrets(this.db.db, this.keyring, SECRETS_NAMESPACE).set(orgId, connectionSecretKey(id), JSON.stringify(a.secrets));
|
|
318
|
+
}
|
|
319
|
+
const inserted = await this.db
|
|
320
|
+
.insertInto("channel_connections")
|
|
321
|
+
.values({
|
|
322
|
+
id,
|
|
323
|
+
org_id: orgId,
|
|
324
|
+
plugin: input.plugin,
|
|
325
|
+
name: input.name,
|
|
326
|
+
agent_id: input.agentId,
|
|
327
|
+
config: JSON.stringify(a.plain),
|
|
328
|
+
unbound_policy: input.unboundPolicy ?? "bind",
|
|
329
|
+
bot_user_id: a.verified.botUserId,
|
|
330
|
+
tenant_id: a.verified.tenantId,
|
|
331
|
+
created_by: actorAccountId,
|
|
332
|
+
})
|
|
333
|
+
.returning(COLUMNS)
|
|
334
|
+
.executeTakeFirstOrThrow();
|
|
335
|
+
await audit(this.db.db, {
|
|
336
|
+
actorAccountId,
|
|
337
|
+
...(actorTokenId !== undefined && { actorTokenId }),
|
|
338
|
+
orgId,
|
|
339
|
+
action: "channel.created",
|
|
340
|
+
target: id,
|
|
341
|
+
detail: { plugin: input.plugin, agentId: input.agentId },
|
|
342
|
+
});
|
|
343
|
+
return inserted;
|
|
344
|
+
}
|
|
277
345
|
/**
|
|
278
346
|
* 修改名称、agent、未绑定策略、启停,或轮换凭据(新配置同样先 `verify`,失败什么都不改)。
|
|
279
347
|
* 插件在该组织停用时仍可轮换凭据,此时不 verify,返回 `verifySkipped: true`。
|
|
@@ -288,7 +356,7 @@ export class ChannelConnections {
|
|
|
288
356
|
if (patch.config !== undefined) {
|
|
289
357
|
const channel = this.channel(current.plugin);
|
|
290
358
|
// 插件在该组织停用时也允许轮换(泄露的密钥要能立刻换掉),但不调用插件 verify:重新启用后长连接按新凭据连接
|
|
291
|
-
const enabled = (await queryEnabledPlugins(this.
|
|
359
|
+
const enabled = (await queryEnabledPlugins(this.db.db, orgId)).has(current.plugin);
|
|
292
360
|
const schema = channel.connectionSchema;
|
|
293
361
|
const before = await this.readSecrets(orgId, id);
|
|
294
362
|
const next = structuredClone(patch.config);
|
|
@@ -310,55 +378,15 @@ export class ChannelConnections {
|
|
|
310
378
|
if (modeChanged && patch.inboundMode === "webhook")
|
|
311
379
|
this.assertWebhookAvailable(current.plugin);
|
|
312
380
|
if (patch.agentId !== undefined)
|
|
313
|
-
await this.assertAgent(
|
|
314
|
-
const row = await this.
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
}
|
|
323
|
-
else {
|
|
324
|
-
await secrets.delete(orgId, connectionSecretKey(id));
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
const updated = await t
|
|
328
|
-
.updateTable("channel_connections")
|
|
329
|
-
.set({
|
|
330
|
-
...(patch.name !== undefined && { name: patch.name }),
|
|
331
|
-
...(patch.agentId !== undefined && { agent_id: patch.agentId }),
|
|
332
|
-
...(patch.unboundPolicy !== undefined && { unbound_policy: patch.unboundPolicy }),
|
|
333
|
-
...(patch.status !== undefined && { status: patch.status }),
|
|
334
|
-
...(patch.inboundMode !== undefined && { inbound_mode: patch.inboundMode }),
|
|
335
|
-
...(rotated && { config: JSON.stringify(rotated.plain) }),
|
|
336
|
-
// 跳过了 verify:机器人 id 与租户保留原值(重新启用后插件按新凭据连接,入站以连接行的租户判断外部人员)
|
|
337
|
-
...(verified && { bot_user_id: verified.botUserId, tenant_id: verified.tenantId }),
|
|
338
|
-
...((rotated || patch.status === "active") && { last_error: null }),
|
|
339
|
-
updated_at: sql `now()`,
|
|
340
|
-
})
|
|
341
|
-
.where("id", "=", id)
|
|
342
|
-
.where("org_id", "=", orgId)
|
|
343
|
-
.where("deleted_at", "is", null)
|
|
344
|
-
.returning(COLUMNS)
|
|
345
|
-
.executeTakeFirst();
|
|
346
|
-
if (!updated)
|
|
347
|
-
throw notFound();
|
|
348
|
-
await audit(t, {
|
|
349
|
-
actorAccountId,
|
|
350
|
-
...(actorTokenId !== undefined && { actorTokenId }),
|
|
351
|
-
orgId,
|
|
352
|
-
action: "channel.updated",
|
|
353
|
-
target: id,
|
|
354
|
-
detail: {
|
|
355
|
-
changed: [
|
|
356
|
-
...Object.keys(patch).filter((k) => k !== "config" && patch[k] !== undefined),
|
|
357
|
-
...(rotated ? ["config"] : []),
|
|
358
|
-
],
|
|
359
|
-
},
|
|
360
|
-
});
|
|
361
|
-
return updated;
|
|
381
|
+
await this.assertAgent(orgId, patch.agentId);
|
|
382
|
+
const row = await this.updateIn({
|
|
383
|
+
orgId,
|
|
384
|
+
id,
|
|
385
|
+
patch,
|
|
386
|
+
rotated,
|
|
387
|
+
verified,
|
|
388
|
+
actorAccountId,
|
|
389
|
+
actorTokenId,
|
|
362
390
|
});
|
|
363
391
|
if (rotated)
|
|
364
392
|
this.reportSecrets(rotated.schema, rotated.full);
|
|
@@ -366,50 +394,103 @@ export class ChannelConnections {
|
|
|
366
394
|
if (rotated ||
|
|
367
395
|
patch.status === "active" ||
|
|
368
396
|
(modeChanged && patch.inboundMode === "long_connection")) {
|
|
369
|
-
await this.
|
|
397
|
+
await this.redis
|
|
370
398
|
.del(channelBackoffKey(id), channelFailsKey(id))
|
|
371
|
-
.catch((err) => this.
|
|
399
|
+
.catch((err) => this.log.warn("cannot clear channel backoff", { err }));
|
|
372
400
|
}
|
|
373
401
|
// A mode switch also reconnects: the holder drops the long connection when going to webhook (F9)
|
|
374
402
|
await this.changed(id, rotated !== undefined || patch.status !== undefined || modeChanged);
|
|
375
403
|
if ((rotated || patch.status === "active") && row.status === "active") {
|
|
376
|
-
await this.
|
|
377
|
-
.
|
|
378
|
-
.catch((err) => this.
|
|
404
|
+
await this.jobs
|
|
405
|
+
.resumeConnection(id)
|
|
406
|
+
.catch((err) => this.log.warn("cannot resume channel deliveries", { err }));
|
|
379
407
|
}
|
|
380
408
|
return { channel: await this.viewOf(row), verifySkipped };
|
|
381
409
|
}
|
|
410
|
+
/** The rows of {@link update}, in their own transaction (the caller publishes after the commit). */
|
|
411
|
+
async updateIn(a) {
|
|
412
|
+
const { orgId, id, patch, rotated, verified, actorAccountId, actorTokenId } = a;
|
|
413
|
+
await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "channels.manage");
|
|
414
|
+
if (patch.agentId !== undefined)
|
|
415
|
+
await this.assertAgent(orgId, patch.agentId);
|
|
416
|
+
if (rotated) {
|
|
417
|
+
const secrets = createSecrets(this.db.db, this.keyring, SECRETS_NAMESPACE);
|
|
418
|
+
if (Object.keys(rotated.secrets).length > 0) {
|
|
419
|
+
await secrets.set(orgId, connectionSecretKey(id), JSON.stringify(rotated.secrets));
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
await secrets.delete(orgId, connectionSecretKey(id));
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
const updated = await this.db
|
|
426
|
+
.updateTable("channel_connections")
|
|
427
|
+
.set({
|
|
428
|
+
...(patch.name !== undefined && { name: patch.name }),
|
|
429
|
+
...(patch.agentId !== undefined && { agent_id: patch.agentId }),
|
|
430
|
+
...(patch.unboundPolicy !== undefined && { unbound_policy: patch.unboundPolicy }),
|
|
431
|
+
...(patch.status !== undefined && { status: patch.status }),
|
|
432
|
+
...(patch.inboundMode !== undefined && { inbound_mode: patch.inboundMode }),
|
|
433
|
+
...(rotated && { config: JSON.stringify(rotated.plain) }),
|
|
434
|
+
// 跳过了 verify:机器人 id 与租户保留原值(重新启用后插件按新凭据连接,入站以连接行的租户判断外部人员)
|
|
435
|
+
...(verified && { bot_user_id: verified.botUserId, tenant_id: verified.tenantId }),
|
|
436
|
+
...((rotated || patch.status === "active") && { last_error: null }),
|
|
437
|
+
updated_at: sql `now()`,
|
|
438
|
+
})
|
|
439
|
+
.where("id", "=", id)
|
|
440
|
+
.where("org_id", "=", orgId)
|
|
441
|
+
.where("deleted_at", "is", null)
|
|
442
|
+
.returning(COLUMNS)
|
|
443
|
+
.executeTakeFirst();
|
|
444
|
+
if (!updated)
|
|
445
|
+
throw notFound();
|
|
446
|
+
await audit(this.db.db, {
|
|
447
|
+
actorAccountId,
|
|
448
|
+
...(actorTokenId !== undefined && { actorTokenId }),
|
|
449
|
+
orgId,
|
|
450
|
+
action: "channel.updated",
|
|
451
|
+
target: id,
|
|
452
|
+
detail: {
|
|
453
|
+
changed: [
|
|
454
|
+
...Object.keys(patch).filter((k) => k !== "config" && patch[k] !== undefined),
|
|
455
|
+
...(rotated ? ["config"] : []),
|
|
456
|
+
],
|
|
457
|
+
},
|
|
458
|
+
});
|
|
459
|
+
return updated;
|
|
460
|
+
}
|
|
382
461
|
/** 删除(软删除,同一事务删掉密钥);持有长连接的副本收到广播后断开。 */
|
|
383
462
|
async remove(orgId, id, actorAccountId, actorTokenId) {
|
|
384
|
-
await this.
|
|
385
|
-
await lockOrgAndAuthorize(t, orgId, actorAccountId, "channels.manage");
|
|
386
|
-
const r = await t
|
|
387
|
-
.updateTable("channel_connections")
|
|
388
|
-
.set({ deleted_at: sql `now()`, updated_at: sql `now()` })
|
|
389
|
-
.where("id", "=", id)
|
|
390
|
-
.where("org_id", "=", orgId)
|
|
391
|
-
.where("deleted_at", "is", null)
|
|
392
|
-
.executeTakeFirst();
|
|
393
|
-
if (r.numUpdatedRows === 0n)
|
|
394
|
-
throw notFound();
|
|
395
|
-
await createSecrets(t, this.deps.keyring, SECRETS_NAMESPACE).delete(orgId, connectionSecretKey(id));
|
|
396
|
-
await audit(t, {
|
|
397
|
-
actorAccountId,
|
|
398
|
-
...(actorTokenId !== undefined && { actorTokenId }),
|
|
399
|
-
orgId,
|
|
400
|
-
action: "channel.deleted",
|
|
401
|
-
target: id,
|
|
402
|
-
});
|
|
403
|
-
});
|
|
463
|
+
await this.removeIn(orgId, id, actorAccountId, actorTokenId);
|
|
404
464
|
await this.changed(id, true);
|
|
405
465
|
}
|
|
466
|
+
/** The rows of {@link remove}, in their own transaction (the caller publishes after the commit). */
|
|
467
|
+
async removeIn(orgId, id, actorAccountId, actorTokenId) {
|
|
468
|
+
await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "channels.manage");
|
|
469
|
+
const r = await this.db
|
|
470
|
+
.updateTable("channel_connections")
|
|
471
|
+
.set({ deleted_at: sql `now()`, updated_at: sql `now()` })
|
|
472
|
+
.where("id", "=", id)
|
|
473
|
+
.where("org_id", "=", orgId)
|
|
474
|
+
.where("deleted_at", "is", null)
|
|
475
|
+
.executeTakeFirst();
|
|
476
|
+
if (r.numUpdatedRows === 0n)
|
|
477
|
+
throw notFound();
|
|
478
|
+
await createSecrets(this.db.db, this.keyring, SECRETS_NAMESPACE).delete(orgId, connectionSecretKey(id));
|
|
479
|
+
await audit(this.db.db, {
|
|
480
|
+
actorAccountId,
|
|
481
|
+
...(actorTokenId !== undefined && { actorTokenId }),
|
|
482
|
+
orgId,
|
|
483
|
+
action: "channel.deleted",
|
|
484
|
+
target: id,
|
|
485
|
+
});
|
|
486
|
+
}
|
|
406
487
|
/** 提交后广播;失败只记日志(持有方每轮续租时也会复核连接状态)。 */
|
|
407
488
|
async changed(connectionId, reconnect) {
|
|
408
489
|
try {
|
|
409
|
-
await this.
|
|
490
|
+
await this.bus.publish(CHANNEL_CHANGED_TOPIC, { connectionId, reconnect });
|
|
410
491
|
}
|
|
411
492
|
catch (err) {
|
|
412
|
-
this.
|
|
493
|
+
this.log.warn("channel.changed publish failed", { connectionId, err });
|
|
413
494
|
}
|
|
414
495
|
}
|
|
415
496
|
/**
|
|
@@ -417,10 +498,10 @@ export class ChannelConnections {
|
|
|
417
498
|
* `pluginEnabled` 为插件此刻是否在该组织启用(入站与卡片操作每次都实时复核)。
|
|
418
499
|
*/
|
|
419
500
|
async row(id) {
|
|
420
|
-
const r = await this.
|
|
501
|
+
const r = await this.db
|
|
421
502
|
.selectFrom("channel_connections as c")
|
|
422
503
|
.innerJoin("orgs", "orgs.id", "c.org_id")
|
|
423
|
-
.leftJoin(enabledExtensionsByOrg(this.
|
|
504
|
+
.leftJoin(enabledExtensionsByOrg(this.db.db).as("p"), (j) => j.onRef("p.plugin", "=", "c.plugin").onRef("p.org_id", "=", "c.org_id"))
|
|
424
505
|
.select([
|
|
425
506
|
"c.id",
|
|
426
507
|
"c.org_id",
|
|
@@ -453,7 +534,7 @@ export class ChannelConnections {
|
|
|
453
534
|
* 持有长连接的副本立即断开(扫描复核只是兜底)。只广播,失败只记日志。
|
|
454
535
|
*/
|
|
455
536
|
async notifyOrgChanged(orgId, plugin) {
|
|
456
|
-
let q = this.
|
|
537
|
+
let q = this.db.db
|
|
457
538
|
.selectFrom("channel_connections")
|
|
458
539
|
.select("id")
|
|
459
540
|
.where("org_id", "=", orgId)
|
|
@@ -465,7 +546,7 @@ export class ChannelConnections {
|
|
|
465
546
|
rows = await q.execute();
|
|
466
547
|
}
|
|
467
548
|
catch (err) {
|
|
468
|
-
this.
|
|
549
|
+
this.log.warn("cannot list channel connections to notify", { orgId, err });
|
|
469
550
|
return;
|
|
470
551
|
}
|
|
471
552
|
for (const r of rows)
|
|
@@ -485,7 +566,7 @@ export class ChannelConnections {
|
|
|
485
566
|
const entry = this.channelEntry(row.plugin);
|
|
486
567
|
const channel = entry.impl;
|
|
487
568
|
await this.assertEnabled(row.orgId, row.plugin);
|
|
488
|
-
const stored = await this.
|
|
569
|
+
const stored = await this.db
|
|
489
570
|
.selectFrom("channel_connections")
|
|
490
571
|
.select("config")
|
|
491
572
|
.where("id", "=", id)
|
|
@@ -505,7 +586,7 @@ export class ChannelConnections {
|
|
|
505
586
|
async outbound(connectionId) {
|
|
506
587
|
const { row, channel, config } = await this.runtime(connectionId);
|
|
507
588
|
// 组织语言随每次发送 / 更新交给插件(Ruling A22);本次会话内不变
|
|
508
|
-
const { locale } = await readOrgSettings(this.
|
|
589
|
+
const { locale } = await readOrgSettings(this.db.db, row.orgId);
|
|
509
590
|
return {
|
|
510
591
|
row,
|
|
511
592
|
features: channel.features,
|
|
@@ -531,4 +612,28 @@ export class ChannelConnections {
|
|
|
531
612
|
async send(connectionId, target, message, idempotencyKey) {
|
|
532
613
|
return (await this.outbound(connectionId)).send(target, message, idempotencyKey);
|
|
533
614
|
}
|
|
534
|
-
}
|
|
615
|
+
};
|
|
616
|
+
__decorate([
|
|
617
|
+
Transactional({ propagation: "requires_new" })
|
|
618
|
+
], ChannelConnections.prototype, "insertIn", null);
|
|
619
|
+
__decorate([
|
|
620
|
+
Transactional({ propagation: "requires_new" })
|
|
621
|
+
], ChannelConnections.prototype, "updateIn", null);
|
|
622
|
+
__decorate([
|
|
623
|
+
Transactional({ propagation: "requires_new" })
|
|
624
|
+
], ChannelConnections.prototype, "removeIn", null);
|
|
625
|
+
ChannelConnections = __decorate([
|
|
626
|
+
Injectable(),
|
|
627
|
+
__param(0, Inject(KernelDb)),
|
|
628
|
+
__param(1, Inject(OrgLock)),
|
|
629
|
+
__param(2, Inject(KEYRING)),
|
|
630
|
+
__param(3, Inject(ExtensionRegistry)),
|
|
631
|
+
__param(4, Inject(KERNEL_BUS)),
|
|
632
|
+
__param(5, Inject(REDIS)),
|
|
633
|
+
__param(6, Inject(ChannelJobs)),
|
|
634
|
+
__param(7, Inject(KernelConfigService)),
|
|
635
|
+
__param(8, Inject(KernelEvents)),
|
|
636
|
+
__param(9, Inject(KERNEL_LOGGER)),
|
|
637
|
+
__param(10, Inject(TransactionHost))
|
|
638
|
+
], ChannelConnections);
|
|
639
|
+
export { ChannelConnections };
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import type { ChannelCard, InboundEvent, InboundSender, Logger } from "@capybara-hq/plugin-sdk";
|
|
2
2
|
import type { Redis } from "ioredis";
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
3
|
+
import { ConversationsService } from "../conversations/conversations.service.js";
|
|
4
|
+
import { IdentityBinding } from "../identity/binding.js";
|
|
5
|
+
import { ExternalIdentities } from "../identity/external.js";
|
|
6
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
7
|
+
import { LockService } from "../infra/lock/lock.service.js";
|
|
8
|
+
import { DirectorySync } from "../orgs/directory-sync.js";
|
|
9
|
+
import { ApprovalsService } from "../tools/approvals.service.js";
|
|
10
|
+
import { QuestionsService } from "../tools/questions.service.js";
|
|
11
|
+
import { type ChannelConnectionRow, ChannelConnections } from "./connections.service.js";
|
|
12
|
+
import { ChannelJobs } from "./jobs.js";
|
|
10
13
|
import { type ChannelLocale, type ChannelPhrase } from "./phrases.js";
|
|
14
|
+
import { AnonymousGuests } from "./threads.js";
|
|
11
15
|
/** 入站消息去重键的保留时长(秒):平台在这段时间内重投同一条消息只处理一次。 */
|
|
12
16
|
export declare const MESSAGE_DEDUPE_TTL_SECONDS = 86400;
|
|
13
17
|
/** Dedupe key states: the enqueue is running (`pending`) or has succeeded (`done`). */
|
|
@@ -19,35 +23,6 @@ export declare const DEDUPE_PENDING_TTL_SECONDS = 60;
|
|
|
19
23
|
export declare const messageDedupeKey: (connectionId: string, messageId: string) => string;
|
|
20
24
|
/** 带平台事件 id 的卡片点击的去重键(Ruling A26,Redis 键,可以含 `:`)。 */
|
|
21
25
|
export declare const actionDedupeKey: (connectionId: string, eventId: string) => string;
|
|
22
|
-
/** 通讯录同步的投递接口(实现见 orgs/directory-sync.ts:按 (组织, 插件) 每分钟去重的维护队列任务)。 */
|
|
23
|
-
export interface DirectorySyncScheduler {
|
|
24
|
-
/** 返回值(如 job id)不使用。 */
|
|
25
|
-
enqueue(orgId: string, plugin: string): Promise<unknown>;
|
|
26
|
-
}
|
|
27
|
-
/** 出站投递的投递接口(实现见 outbound.ts:把会话的新事件按 `channel_deliveries.last_seq` 续投到 IM)。 */
|
|
28
|
-
export interface ChannelOutboundScheduler {
|
|
29
|
-
enqueue(conversationId: string): Promise<void>;
|
|
30
|
-
}
|
|
31
|
-
/** 入站任务的投递接口(实现见 outbound.ts:同一队列 `cap-kernel-channels` 的 `inbound` 任务)。 */
|
|
32
|
-
export interface ChannelInboundQueue {
|
|
33
|
-
enqueueInbound(connectionId: string, event: InboundEvent, jobId: string): Promise<void>;
|
|
34
|
-
}
|
|
35
|
-
export interface ChannelInboundDeps {
|
|
36
|
-
db: KernelDb;
|
|
37
|
-
redis: Redis;
|
|
38
|
-
connections: Pick<ChannelConnections, "row" | "send">;
|
|
39
|
-
conversations: Pick<ConversationsService, "create" | "postUserMessage">;
|
|
40
|
-
external: Pick<ExternalIdentities, "findAccount">;
|
|
41
|
-
binding: Pick<IdentityBinding, "createBindToken">;
|
|
42
|
-
directorySync: DirectorySyncScheduler;
|
|
43
|
-
outbound: ChannelOutboundScheduler;
|
|
44
|
-
/** 入站任务队列(`onEvent` 只去重并入队,处理在 worker 上执行 {@link ChannelInbound.handle})。 */
|
|
45
|
-
queue: ChannelInboundQueue;
|
|
46
|
-
/** 卡片操作:审批决定与提问回答(授权由这两个服务按点击者映射到的账号判定)。 */
|
|
47
|
-
approvals: Pick<ApprovalsService, "decide">;
|
|
48
|
-
questions: Pick<QuestionsService, "answer">;
|
|
49
|
-
log: Pick<Logger, "warn" | "info">;
|
|
50
|
-
}
|
|
51
26
|
/**
|
|
52
27
|
* 渠道入站(Ruling A21:持久化处理)。
|
|
53
28
|
* - `onEvent`(插件 `connect` 的回调,必须快):消息按 `capk:channel-msg:<连接>:<消息>` `SET NX` 24 小时去重,
|
|
@@ -74,9 +49,30 @@ export interface ChannelInboundDeps {
|
|
|
74
49
|
* 处理在写入用户消息之后失败而重试时,固定话术 / 卡片回复可能再发一次。
|
|
75
50
|
*/
|
|
76
51
|
export declare class ChannelInbound {
|
|
77
|
-
private readonly
|
|
52
|
+
private readonly kdb;
|
|
53
|
+
private readonly redis;
|
|
54
|
+
/** The two-state dedupe markers (`lease` / `holderOf` / `releaseIf`; keys unchanged). */
|
|
55
|
+
private readonly locks;
|
|
56
|
+
private readonly connections;
|
|
57
|
+
private readonly conversations;
|
|
58
|
+
private readonly external;
|
|
59
|
+
private readonly binding;
|
|
60
|
+
/** 通讯录同步的投递(按 (组织, 插件) 每分钟去重的维护队列任务)。 */
|
|
61
|
+
private readonly directorySync;
|
|
62
|
+
/** The channel queue: inbound jobs (`onEvent` only dedupes and enqueues) and deliveries. */
|
|
63
|
+
private readonly jobs;
|
|
64
|
+
private readonly guests;
|
|
65
|
+
private readonly log;
|
|
78
66
|
private readonly actions;
|
|
79
|
-
constructor(
|
|
67
|
+
constructor(kdb: KernelDb, redis: Pick<Redis, "set">,
|
|
68
|
+
/** The two-state dedupe markers (`lease` / `holderOf` / `releaseIf`; keys unchanged). */
|
|
69
|
+
locks: Pick<LockService, "lease" | "holderOf" | "releaseIf">, connections: Pick<ChannelConnections, "row" | "send">, conversations: Pick<ConversationsService, "create" | "postUserMessage">, external: Pick<ExternalIdentities, "findAccount">, binding: Pick<IdentityBinding, "createBindToken">,
|
|
70
|
+
/** 通讯录同步的投递(按 (组织, 插件) 每分钟去重的维护队列任务)。 */
|
|
71
|
+
directorySync: Pick<DirectorySync, "enqueue">,
|
|
72
|
+
/** The channel queue: inbound jobs (`onEvent` only dedupes and enqueues) and deliveries. */
|
|
73
|
+
jobs: Pick<ChannelJobs, "enqueue" | "enqueueInbound">,
|
|
74
|
+
/** 卡片操作:审批决定与提问回答(授权由这两个服务按点击者映射到的账号判定)。 */
|
|
75
|
+
approvals: Pick<ApprovalsService, "decide">, questions: Pick<QuestionsService, "answer">, guests: Pick<AnonymousGuests, "ensure">, log: Pick<Logger, "warn" | "info">);
|
|
80
76
|
/**
|
|
81
77
|
* 插件 `onEvent`:去重并入队后返回(见类注释)。返回后插件才向平台确认;抛错时插件不确认。
|
|
82
78
|
*/
|