@capybara-hq/kernel 0.1.0-rc.0 → 0.1.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bootstrap.json +10 -6
- package/dist/admin/admin.controller.d.ts +17 -17
- package/dist/admin/admin.controller.js +43 -26
- package/dist/admin/admin.module.d.ts +3 -0
- package/dist/admin/admin.module.js +22 -0
- package/dist/admin/extensions.controller.d.ts +14 -14
- package/dist/admin/extensions.controller.js +30 -17
- package/dist/admin/setup-lock.d.ts +16 -0
- package/dist/admin/setup-lock.js +47 -0
- package/dist/admin/setup.controller.d.ts +8 -8
- package/dist/admin/setup.controller.js +27 -25
- package/dist/admin/setup.service.d.ts +19 -27
- package/dist/admin/setup.service.js +61 -61
- package/dist/agents/agent-lookup.d.ts +53 -0
- package/dist/agents/agent-lookup.js +179 -0
- package/dist/agents/agents.controller.d.ts +1 -1
- package/dist/agents/agents.controller.js +14 -8
- package/dist/agents/agents.module.d.ts +7 -0
- package/dist/agents/agents.module.js +41 -0
- package/dist/agents/agents.service.d.ts +39 -58
- package/dist/agents/agents.service.js +261 -329
- package/dist/agents/definition.d.ts +8 -0
- package/dist/agents/definition.js +8 -0
- package/dist/agents/models.controller.d.ts +1 -1
- package/dist/agents/models.controller.js +2 -2
- package/dist/agents/templates.controller.d.ts +1 -1
- package/dist/agents/templates.controller.js +2 -2
- package/dist/agents/templates.d.ts +6 -8
- package/dist/agents/templates.js +20 -4
- package/dist/app.d.ts +93 -0
- package/dist/app.js +150 -0
- package/dist/catalog/admin-catalog.controller.d.ts +3 -3
- package/dist/catalog/admin-catalog.controller.js +27 -13
- package/dist/catalog/catalog-content.d.ts +185 -0
- package/dist/catalog/catalog-content.js +323 -0
- package/dist/catalog/catalog-items.d.ts +186 -0
- package/dist/catalog/catalog-items.js +410 -0
- package/dist/catalog/catalog.module.d.ts +14 -0
- package/dist/catalog/catalog.module.js +71 -0
- package/dist/catalog/catalog.service.d.ts +34 -188
- package/dist/catalog/catalog.service.js +155 -489
- package/dist/catalog/cli.d.ts +3 -2
- package/dist/catalog/cli.js +13 -31
- package/dist/catalog/job-ids.d.ts +15 -0
- package/dist/catalog/job-ids.js +15 -0
- package/dist/catalog/jobs.d.ts +27 -0
- package/dist/catalog/jobs.js +70 -0
- package/dist/catalog/locks.d.ts +24 -0
- package/dist/catalog/locks.js +63 -0
- package/dist/catalog/marketplaces.controller.d.ts +4 -4
- package/dist/catalog/marketplaces.controller.js +22 -11
- package/dist/catalog/marketplaces.service.d.ts +30 -13
- package/dist/catalog/marketplaces.service.js +330 -256
- package/dist/catalog/org-catalog.controller.d.ts +4 -3
- package/dist/catalog/org-catalog.controller.js +29 -14
- package/dist/catalog/org-catalog.service.d.ts +32 -198
- package/dist/catalog/org-catalog.service.js +159 -400
- package/dist/catalog/plugin-import.d.ts +73 -34
- package/dist/catalog/plugin-import.js +356 -217
- package/dist/catalog/plugin-install.d.ts +83 -41
- package/dist/catalog/plugin-install.js +421 -269
- package/dist/catalog/plugin-upgrade.d.ts +59 -4
- package/dist/catalog/plugin-upgrade.js +407 -282
- package/dist/catalog/requests.service.d.ts +27 -15
- package/dist/catalog/requests.service.js +201 -145
- package/dist/catalog/upgrade-targets.d.ts +4 -7
- package/dist/channels/actions.d.ts +6 -4
- package/dist/channels/actions.js +1 -1
- package/dist/channels/cards.d.ts +2 -2
- package/dist/channels/channels.module.d.ts +40 -0
- package/dist/channels/channels.module.js +128 -0
- package/dist/channels/connections.controller.d.ts +1 -1
- package/dist/channels/connections.controller.js +11 -6
- package/dist/channels/connections.service.d.ts +43 -21
- package/dist/channels/connections.service.js +236 -131
- package/dist/channels/inbound.d.ts +34 -38
- package/dist/channels/inbound.js +107 -41
- package/dist/channels/job-ids.d.ts +10 -0
- package/dist/channels/job-ids.js +10 -0
- package/dist/channels/jobs.d.ts +85 -0
- package/dist/channels/jobs.js +157 -0
- package/dist/channels/outbound.d.ts +60 -82
- package/dist/channels/outbound.js +165 -193
- package/dist/channels/supervisor.d.ts +88 -46
- package/dist/channels/supervisor.js +230 -132
- package/dist/channels/threads.d.ts +29 -8
- package/dist/channels/threads.js +71 -13
- package/dist/channels/webhook.d.ts +20 -14
- package/dist/channels/webhook.js +51 -20
- package/dist/config/load.d.ts +3 -2
- package/dist/config/load.js +3 -2
- package/dist/config/nacos-source.js +11 -2
- package/dist/config/schema.d.ts +16 -1
- package/dist/config/schema.js +54 -7
- package/dist/conversations/access.d.ts +29 -0
- package/dist/conversations/access.js +86 -0
- package/dist/conversations/artifacts.d.ts +10 -10
- package/dist/conversations/artifacts.js +35 -9
- package/dist/conversations/attachments.controller.d.ts +1 -1
- package/dist/conversations/attachments.controller.js +8 -6
- package/dist/conversations/attachments.module.d.ts +7 -0
- package/dist/conversations/attachments.module.js +25 -0
- package/dist/conversations/attachments.service.d.ts +30 -22
- package/dist/conversations/attachments.service.js +119 -46
- package/dist/conversations/conversations.controller.d.ts +8 -7
- package/dist/conversations/conversations.controller.js +59 -29
- package/dist/conversations/conversations.module.d.ts +8 -0
- package/dist/conversations/conversations.module.js +69 -0
- package/dist/conversations/conversations.service.d.ts +40 -38
- package/dist/conversations/conversations.service.js +130 -140
- package/dist/conversations/event-log.d.ts +28 -18
- package/dist/conversations/event-log.js +74 -27
- package/dist/conversations/files.d.ts +10 -10
- package/dist/conversations/files.js +37 -11
- package/dist/conversations/idem-keys.d.ts +5 -0
- package/dist/conversations/idem-keys.js +5 -0
- package/dist/conversations/job-ids.d.ts +6 -0
- package/dist/conversations/job-ids.js +6 -0
- package/dist/conversations/outputs-read.d.ts +11 -11
- package/dist/conversations/outputs-read.js +31 -7
- package/dist/conversations/queue.d.ts +48 -56
- package/dist/conversations/queue.js +13 -289
- package/dist/conversations/queue.service.d.ts +60 -0
- package/dist/conversations/queue.service.js +343 -0
- package/dist/conversations/sandbox-status.d.ts +13 -10
- package/dist/conversations/sandbox-status.js +36 -8
- package/dist/conversations/titles.d.ts +71 -24
- package/dist/conversations/titles.js +159 -62
- package/dist/ctx/bus.js +9 -3
- package/dist/ctx/create-ctx.d.ts +6 -0
- package/dist/ctx/create-ctx.js +7 -9
- package/dist/ctx/lock.d.ts +7 -3
- package/dist/ctx/lock.js +9 -20
- package/dist/ctx/queue.js +3 -2
- package/dist/ctx/secrets.d.ts +10 -2
- package/dist/ctx/secrets.js +7 -3
- package/dist/db/kernel-schema.d.ts +2 -2
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +1 -0
- package/dist/errors.d.ts +2 -0
- package/dist/errors.js +2 -0
- package/dist/evals/budget.d.ts +42 -21
- package/dist/evals/budget.js +114 -62
- package/dist/evals/evals.module.d.ts +31 -0
- package/dist/evals/evals.module.js +114 -0
- package/dist/evals/jobs.d.ts +20 -0
- package/dist/evals/jobs.js +45 -0
- package/dist/evals/run-replay.d.ts +56 -8
- package/dist/evals/run-replay.js +140 -80
- package/dist/evals/runs.controller.d.ts +1 -1
- package/dist/evals/runs.controller.js +17 -8
- package/dist/evals/runs.service.d.ts +23 -45
- package/dist/evals/runs.service.js +245 -234
- package/dist/evals/sets.controller.d.ts +1 -1
- package/dist/evals/sets.controller.js +17 -8
- package/dist/evals/sets.service.d.ts +22 -6
- package/dist/evals/sets.service.js +248 -194
- package/dist/evals/snapshot.d.ts +2 -2
- package/dist/evals/step-replay.d.ts +2 -2
- package/dist/evals/step-replay.js +1 -1
- package/dist/evals/trajectory.controller.d.ts +1 -1
- package/dist/evals/trajectory.controller.js +11 -7
- package/dist/evals/trajectory.service.d.ts +5 -4
- package/dist/evals/trajectory.service.js +30 -7
- package/dist/evals/worker.d.ts +44 -27
- package/dist/evals/worker.js +220 -120
- package/dist/extensions/admin-ops.d.ts +61 -33
- package/dist/extensions/admin-ops.js +248 -154
- package/dist/extensions/admin-view.d.ts +38 -27
- package/dist/extensions/admin-view.js +126 -55
- package/dist/extensions/approvals.d.ts +12 -8
- package/dist/extensions/approvals.js +73 -46
- package/dist/extensions/blobs.d.ts +27 -10
- package/dist/extensions/blobs.js +111 -45
- package/dist/extensions/bootstrap.d.ts +96 -42
- package/dist/extensions/bootstrap.js +303 -155
- package/dist/extensions/cli.d.ts +20 -10
- package/dist/extensions/cli.js +41 -96
- package/dist/extensions/config-issues.d.ts +7 -0
- package/dist/extensions/config-issues.js +31 -0
- package/dist/extensions/deployment-config-store.d.ts +49 -0
- package/dist/extensions/deployment-config-store.js +133 -0
- package/dist/extensions/deployment-config.d.ts +58 -67
- package/dist/extensions/deployment-config.js +202 -230
- package/dist/extensions/enabled.d.ts +5 -5
- package/dist/extensions/extensions.module.d.ts +8 -0
- package/dist/extensions/extensions.module.js +77 -0
- package/dist/extensions/hooks.d.ts +3 -2
- package/dist/extensions/hooks.js +1 -1
- package/dist/extensions/host.d.ts +72 -68
- package/dist/extensions/host.js +191 -152
- package/dist/extensions/installs.d.ts +49 -16
- package/dist/extensions/installs.js +128 -32
- package/dist/extensions/job-ids.d.ts +6 -0
- package/dist/extensions/job-ids.js +6 -0
- package/dist/extensions/lifecycle-topics.d.ts +18 -0
- package/dist/extensions/lifecycle-topics.js +18 -0
- package/dist/extensions/lifecycle.d.ts +35 -47
- package/dist/extensions/lifecycle.js +103 -39
- package/dist/extensions/locks.d.ts +33 -0
- package/dist/extensions/locks.js +86 -0
- package/dist/extensions/migrate-lock.d.ts +3 -4
- package/dist/extensions/org-config.controller.d.ts +1 -1
- package/dist/extensions/org-config.controller.js +8 -5
- package/dist/extensions/org-config.d.ts +48 -46
- package/dist/extensions/org-config.js +284 -226
- package/dist/extensions/registry.d.ts +50 -2
- package/dist/extensions/registry.js +89 -4
- package/dist/extensions/sources.d.ts +12 -8
- package/dist/extensions/sources.js +34 -13
- package/dist/files/files.module.d.ts +3 -0
- package/dist/files/files.module.js +22 -0
- package/dist/files/previewers.controller.d.ts +7 -2
- package/dist/files/previewers.controller.js +17 -9
- package/dist/files/previewers.d.ts +13 -18
- package/dist/files/previewers.js +83 -36
- package/dist/http/adapter.d.ts +3 -0
- package/dist/http/adapter.js +25 -0
- package/dist/http/api.module.d.ts +3 -110
- package/dist/http/api.module.js +47 -355
- package/dist/http/app.d.ts +11 -15
- package/dist/http/app.js +52 -47
- package/dist/http/error-filter.module.d.ts +5 -0
- package/dist/http/error-filter.module.js +18 -0
- package/dist/http/error.filter.js +2 -2
- package/dist/identity/accounts.d.ts +82 -29
- package/dist/identity/accounts.js +294 -175
- package/dist/identity/api-tokens.d.ts +11 -7
- package/dist/identity/api-tokens.js +71 -44
- package/dist/identity/audit.d.ts +7 -4
- package/dist/identity/audit.js +5 -1
- package/dist/identity/auth.controller.d.ts +11 -10
- package/dist/identity/auth.controller.js +31 -25
- package/dist/identity/auth.guard.d.ts +3 -3
- package/dist/identity/auth.guard.js +6 -4
- package/dist/identity/binding.d.ts +9 -11
- package/dist/identity/binding.js +41 -13
- package/dist/identity/enterprise-admin.d.ts +18 -12
- package/dist/identity/enterprise-admin.js +67 -13
- package/dist/identity/external-identity-lock.d.ts +17 -0
- package/dist/identity/external-identity-lock.js +39 -0
- package/dist/identity/external.d.ts +19 -15
- package/dist/identity/external.js +163 -125
- package/dist/identity/identity.module.d.ts +6 -0
- package/dist/identity/identity.module.js +56 -0
- package/dist/identity/me.controller.d.ts +16 -15
- package/dist/identity/me.controller.js +37 -31
- package/dist/identity/sessions.d.ts +12 -10
- package/dist/identity/sessions.js +74 -42
- package/dist/identity/settings.d.ts +20 -14
- package/dist/identity/settings.js +85 -57
- package/dist/identity/sso.controller.d.ts +7 -7
- package/dist/identity/sso.controller.js +13 -9
- package/dist/identity/sso.d.ts +9 -12
- package/dist/identity/sso.js +54 -24
- package/dist/inbox/inbox.module.d.ts +3 -0
- package/dist/inbox/inbox.module.js +22 -0
- package/dist/inbox/inbox.service.d.ts +7 -9
- package/dist/inbox/inbox.service.js +32 -11
- package/dist/index.d.ts +19 -12
- package/dist/index.js +13 -8
- package/dist/infra/cache/cache.module.d.ts +3 -0
- package/dist/infra/cache/cache.module.js +16 -0
- package/dist/infra/cache/cache.service.d.ts +21 -0
- package/dist/infra/cache/cache.service.js +80 -0
- package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
- package/dist/infra/cache/cacheable.decorator.js +83 -0
- package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
- package/dist/infra/cli/kernel-cli.module.js +165 -0
- package/dist/infra/close-within.d.ts +15 -0
- package/dist/infra/close-within.js +36 -0
- package/dist/infra/config/config.module.d.ts +13 -0
- package/dist/infra/config/config.module.js +39 -0
- package/dist/infra/config/kernel-config.service.d.ts +25 -0
- package/dist/infra/config/kernel-config.service.js +126 -0
- package/dist/infra/database/after-commit.d.ts +6 -0
- package/dist/infra/database/after-commit.js +9 -0
- package/dist/infra/database/database.module.d.ts +25 -0
- package/dist/infra/database/database.module.js +90 -0
- package/dist/infra/database/kernel-db.d.ts +22 -0
- package/dist/infra/database/kernel-db.js +65 -0
- package/dist/infra/database/transaction-host.d.ts +50 -0
- package/dist/infra/database/transaction-host.js +125 -0
- package/dist/infra/database/transactional.decorator.d.ts +15 -0
- package/dist/infra/database/transactional.decorator.js +27 -0
- package/dist/infra/database/xact-lock.d.ts +17 -0
- package/dist/infra/database/xact-lock.js +43 -0
- package/dist/infra/events/kernel-events.d.ts +96 -0
- package/dist/infra/events/kernel-events.js +65 -0
- package/dist/infra/health/health.controller.d.ts +26 -0
- package/dist/infra/health/health.controller.js +104 -0
- package/dist/infra/health/health.module.d.ts +9 -0
- package/dist/infra/health/health.module.js +24 -0
- package/dist/infra/health/health.options.d.ts +10 -0
- package/dist/infra/health/health.options.js +15 -0
- package/dist/infra/health/shutdown-state.d.ts +6 -0
- package/dist/infra/health/shutdown-state.js +2 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
- package/dist/infra/lifecycle/process-guards.d.ts +52 -0
- package/dist/infra/lifecycle/process-guards.js +86 -0
- package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
- package/dist/infra/lifecycle/shutdown-signals.js +48 -0
- package/dist/infra/lock/key-template.d.ts +13 -0
- package/dist/infra/lock/key-template.js +46 -0
- package/dist/infra/lock/lock.module.d.ts +3 -0
- package/dist/infra/lock/lock.module.js +16 -0
- package/dist/infra/lock/lock.service.d.ts +120 -0
- package/dist/infra/lock/lock.service.js +343 -0
- package/dist/infra/lock/shared-lease.d.ts +44 -0
- package/dist/infra/lock/shared-lease.js +121 -0
- package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
- package/dist/infra/lock/with-lock.decorator.js +49 -0
- package/dist/infra/logging/logging.module.d.ts +16 -0
- package/dist/infra/logging/logging.module.js +34 -0
- package/dist/infra/queue/configured-processor.d.ts +18 -0
- package/dist/infra/queue/configured-processor.js +23 -0
- package/dist/infra/queue/job-failure.d.ts +18 -0
- package/dist/infra/queue/job-failure.js +26 -0
- package/dist/infra/queue/queue-shutdown.d.ts +27 -0
- package/dist/infra/queue/queue-shutdown.js +81 -0
- package/dist/infra/queue/queue.module.d.ts +16 -0
- package/dist/infra/queue/queue.module.js +61 -0
- package/dist/infra/queue/redis-connection.d.ts +7 -0
- package/dist/infra/queue/redis-connection.js +18 -0
- package/dist/infra/queue/retired-schedulers.d.ts +7 -0
- package/dist/infra/queue/retired-schedulers.js +9 -0
- package/dist/infra/queue/run-job.d.ts +16 -0
- package/dist/infra/queue/run-job.js +19 -0
- package/dist/infra/redis/redis.module.d.ts +24 -0
- package/dist/infra/redis/redis.module.js +87 -0
- package/dist/infra/schedule/cron-tick.d.ts +12 -0
- package/dist/infra/schedule/cron-tick.js +25 -0
- package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
- package/dist/infra/schedule/locked-cron.decorator.js +53 -0
- package/dist/infra/schedule/locked-interval.d.ts +69 -0
- package/dist/infra/schedule/locked-interval.js +190 -0
- package/dist/infra/schedule/locked-tick.d.ts +90 -0
- package/dist/infra/schedule/locked-tick.js +137 -0
- package/dist/infra/schedule/schedule.module.d.ts +8 -0
- package/dist/infra/schedule/schedule.module.js +27 -0
- package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
- package/dist/infra/schedule/scheduled-runs.js +163 -0
- package/dist/infra/swagger/swagger.d.ts +16 -0
- package/dist/infra/swagger/swagger.js +31 -0
- package/dist/infra/throttler/credential-throttler.d.ts +35 -0
- package/dist/infra/throttler/credential-throttler.js +77 -0
- package/dist/infra/throttler/named-throttlers.d.ts +31 -0
- package/dist/infra/throttler/named-throttlers.js +119 -0
- package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
- package/dist/infra/throttler/redis-throttler-storage.js +130 -0
- package/dist/infra/throttler/throttler.guard.d.ts +23 -0
- package/dist/infra/throttler/throttler.guard.js +68 -0
- package/dist/infra/throttler/throttler.module.d.ts +15 -0
- package/dist/infra/throttler/throttler.module.js +53 -0
- package/dist/infra/tokens.d.ts +15 -0
- package/dist/infra/tokens.js +15 -0
- package/dist/infra/validation/create-zod-dto.d.ts +23 -0
- package/dist/infra/validation/create-zod-dto.js +35 -0
- package/dist/infra/validation/parse-with-zod.d.ts +7 -0
- package/dist/infra/validation/parse-with-zod.js +12 -0
- package/dist/infra/validation/validation.module.d.ts +3 -0
- package/dist/infra/validation/validation.module.js +16 -0
- package/dist/infra/validation/zod-params.d.ts +7 -0
- package/dist/infra/validation/zod-params.js +42 -0
- package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
- package/dist/infra/validation/zod-validation.pipe.js +31 -0
- package/dist/kernel.d.ts +9 -241
- package/dist/kernel.js +8 -1305
- package/dist/kernel.module.d.ts +17 -0
- package/dist/kernel.module.js +136 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
- package/dist/lifecycle/kernel-lifecycle.js +451 -0
- package/dist/lifecycle/tokens.d.ts +3 -0
- package/dist/lifecycle/tokens.js +3 -0
- package/dist/log-config.d.ts +9 -0
- package/dist/log-config.js +27 -0
- package/dist/log-context.d.ts +34 -0
- package/dist/log-context.js +44 -0
- package/dist/log-loki.d.ts +34 -0
- package/dist/log-loki.js +145 -0
- package/dist/log.d.ts +41 -10
- package/dist/log.js +91 -17
- package/dist/models/models.module.d.ts +3 -0
- package/dist/models/models.module.js +24 -0
- package/dist/models/prices.d.ts +8 -2
- package/dist/models/prices.js +65 -37
- package/dist/models/purposes.controller.d.ts +1 -1
- package/dist/models/purposes.controller.js +5 -6
- package/dist/models/purposes.d.ts +35 -13
- package/dist/models/purposes.js +101 -51
- package/dist/net/public-address.js +3 -2
- package/dist/orgs/directory-sync.controller.d.ts +1 -1
- package/dist/orgs/directory-sync.controller.js +2 -2
- package/dist/orgs/directory-sync.d.ts +61 -31
- package/dist/orgs/directory-sync.js +212 -125
- package/dist/orgs/invitations.controller.d.ts +8 -8
- package/dist/orgs/invitations.controller.js +27 -26
- package/dist/orgs/invitations.service.d.ts +12 -9
- package/dist/orgs/invitations.service.js +130 -92
- package/dist/orgs/job-ids.d.ts +8 -0
- package/dist/orgs/job-ids.js +8 -0
- package/dist/orgs/members.service.d.ts +19 -12
- package/dist/orgs/members.service.js +161 -117
- package/dist/orgs/offboarding.d.ts +54 -57
- package/dist/orgs/offboarding.js +161 -71
- package/dist/orgs/org-lock.d.ts +28 -19
- package/dist/orgs/org-lock.js +81 -35
- package/dist/orgs/org.guard.d.ts +1 -1
- package/dist/orgs/org.guard.js +2 -2
- package/dist/orgs/orgs.controller.d.ts +13 -13
- package/dist/orgs/orgs.controller.js +29 -17
- package/dist/orgs/orgs.module.d.ts +6 -0
- package/dist/orgs/orgs.module.js +68 -0
- package/dist/orgs/orgs.service.d.ts +30 -19
- package/dist/orgs/orgs.service.js +139 -86
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.controller.js +8 -6
- package/dist/orgs/settings.service.d.ts +14 -8
- package/dist/orgs/settings.service.js +75 -46
- package/dist/overrides.d.ts +56 -0
- package/dist/overrides.js +30 -0
- package/dist/roles/gateway-role.d.ts +43 -0
- package/dist/roles/gateway-role.js +98 -0
- package/dist/roles/gateway.module.d.ts +8 -0
- package/dist/roles/gateway.module.js +28 -0
- package/dist/roles/worker-role.d.ts +63 -0
- package/dist/roles/worker-role.js +144 -0
- package/dist/roles/worker.module.d.ts +14 -0
- package/dist/roles/worker.module.js +90 -0
- package/dist/runtime/abort.js +19 -2
- package/dist/runtime/checkpointer.d.ts +8 -3
- package/dist/runtime/checkpointer.js +87 -55
- package/dist/runtime/conversation-lock.d.ts +20 -11
- package/dist/runtime/conversation-lock.js +62 -72
- package/dist/runtime/hook-calls.d.ts +3 -3
- package/dist/runtime/hook-calls.js +1 -6
- package/dist/runtime/job-ids.d.ts +10 -0
- package/dist/runtime/job-ids.js +10 -0
- package/dist/runtime/langgraph-loop.js +1 -1
- package/dist/runtime/loop.d.ts +7 -0
- package/dist/runtime/loop.js +14 -0
- package/dist/runtime/maintenance-queue.d.ts +10 -0
- package/dist/runtime/maintenance-queue.js +10 -0
- package/dist/runtime/maintenance.d.ts +45 -74
- package/dist/runtime/maintenance.js +139 -136
- package/dist/runtime/model-call.d.ts +7 -4
- package/dist/runtime/model-call.js +24 -57
- package/dist/runtime/providers.d.ts +17 -6
- package/dist/runtime/providers.js +66 -25
- package/dist/runtime/quota.d.ts +17 -3
- package/dist/runtime/quota.js +27 -2
- package/dist/runtime/retired-schedulers.d.ts +7 -0
- package/dist/runtime/retired-schedulers.js +31 -0
- package/dist/runtime/run-control.d.ts +33 -0
- package/dist/runtime/run-control.js +77 -0
- package/dist/runtime/run-finish.d.ts +26 -17
- package/dist/runtime/run-finish.js +98 -51
- package/dist/runtime/run-jobs.d.ts +48 -0
- package/dist/runtime/run-jobs.js +95 -0
- package/dist/runtime/run-processors.d.ts +60 -0
- package/dist/runtime/run-processors.js +185 -0
- package/dist/runtime/run-queue.d.ts +32 -57
- package/dist/runtime/run-queue.js +291 -295
- package/dist/runtime/run-steps.d.ts +39 -0
- package/dist/runtime/run-steps.js +96 -0
- package/dist/runtime/run-worker.d.ts +121 -75
- package/dist/runtime/run-worker.js +340 -225
- package/dist/runtime/runtime.module.d.ts +10 -0
- package/dist/runtime/runtime.module.js +112 -0
- package/dist/runtime/step-log.d.ts +40 -0
- package/dist/runtime/step-log.js +94 -0
- package/dist/runtime/stream.controller.d.ts +5 -8
- package/dist/runtime/stream.controller.js +14 -12
- package/dist/runtime/stream.d.ts +24 -6
- package/dist/runtime/stream.js +78 -7
- package/dist/runtime/subagents/child.d.ts +3 -44
- package/dist/runtime/subagents/child.js +0 -79
- package/dist/runtime/subagents/definition.d.ts +4 -4
- package/dist/runtime/subagents/definition.js +2 -2
- package/dist/runtime/subagents/dispatch.d.ts +87 -6
- package/dist/runtime/subagents/dispatch.js +135 -140
- package/dist/runtime/subagents/limits.d.ts +9 -4
- package/dist/runtime/subagents/limits.js +4 -2
- package/dist/runtime/subagents/org-agents.d.ts +4 -4
- package/dist/runtime/subagents/org-agents.js +1 -1
- package/dist/runtime/subagents/progress.d.ts +2 -2
- package/dist/runtime/subagents/roster.d.ts +3 -3
- package/dist/runtime/subagents/roster.js +1 -1
- package/dist/runtime/subagents/skill-fork.d.ts +6 -7
- package/dist/runtime/subagents/skill-fork.js +16 -5
- package/dist/runtime/subagents/subagents.service.d.ts +40 -0
- package/dist/runtime/subagents/subagents.service.js +101 -0
- package/dist/runtime/usage-report.d.ts +94 -52
- package/dist/runtime/usage-report.js +200 -99
- package/dist/runtime/waits.d.ts +125 -57
- package/dist/runtime/waits.js +431 -208
- package/dist/sandbox/job-ids.d.ts +10 -0
- package/dist/sandbox/job-ids.js +10 -0
- package/dist/sandbox/jobs.d.ts +41 -0
- package/dist/sandbox/jobs.js +113 -0
- package/dist/sandbox/leases.d.ts +39 -31
- package/dist/sandbox/leases.js +117 -257
- package/dist/sandbox/providers.d.ts +19 -0
- package/dist/sandbox/providers.js +38 -0
- package/dist/sandbox/sandbox.module.d.ts +8 -0
- package/dist/sandbox/sandbox.module.js +30 -0
- package/dist/sandbox/sandbox.service.d.ts +24 -29
- package/dist/sandbox/sandbox.service.js +106 -75
- package/dist/skills/catalog.d.ts +33 -20
- package/dist/skills/catalog.js +96 -53
- package/dist/skills/changes.controller.d.ts +4 -4
- package/dist/skills/changes.controller.js +15 -9
- package/dist/skills/changes.service.d.ts +28 -18
- package/dist/skills/changes.service.js +421 -364
- package/dist/skills/invocable.controller.d.ts +1 -1
- package/dist/skills/invocable.controller.js +8 -5
- package/dist/skills/invoke.d.ts +16 -15
- package/dist/skills/invoke.js +48 -17
- package/dist/skills/skills.controller.d.ts +1 -1
- package/dist/skills/skills.controller.js +11 -6
- package/dist/skills/skills.module.d.ts +6 -0
- package/dist/skills/skills.module.js +30 -0
- package/dist/skills/skills.service.d.ts +47 -30
- package/dist/skills/skills.service.js +221 -158
- package/dist/storage/job-ids.d.ts +6 -0
- package/dist/storage/job-ids.js +6 -0
- package/dist/storage/purge.d.ts +22 -7
- package/dist/storage/purge.js +55 -3
- package/dist/storage/storage.module.d.ts +6 -0
- package/dist/storage/storage.module.js +23 -0
- package/dist/storage/storage.service.d.ts +18 -4
- package/dist/storage/storage.service.js +44 -3
- package/dist/tools/approvals.controller.d.ts +1 -1
- package/dist/tools/approvals.controller.js +12 -8
- package/dist/tools/approvals.service.d.ts +27 -25
- package/dist/tools/approvals.service.js +324 -258
- package/dist/tools/breaker.d.ts +2 -2
- package/dist/tools/breaker.js +21 -3
- package/dist/tools/builtins/ask-user.d.ts +2 -2
- package/dist/tools/builtins/ask-user.js +1 -1
- package/dist/tools/builtins/builtin-tools.d.ts +21 -0
- package/dist/tools/builtins/builtin-tools.js +80 -0
- package/dist/tools/builtins/read-tool-output.d.ts +2 -2
- package/dist/tools/builtins/read-tool-output.js +1 -1
- package/dist/tools/builtins/sandbox/bash.js +2 -2
- package/dist/tools/builtins/sandbox/common.d.ts +7 -4
- package/dist/tools/builtins/sandbox/common.js +5 -3
- package/dist/tools/builtins/sandbox/deliver.js +2 -2
- package/dist/tools/builtins/sandbox/edit.js +1 -1
- package/dist/tools/builtins/sandbox/glob.js +2 -2
- package/dist/tools/builtins/sandbox/grep.js +2 -2
- package/dist/tools/builtins/sandbox/read.js +1 -1
- package/dist/tools/builtins/sandbox/write.js +1 -1
- package/dist/tools/builtins/skill-load.d.ts +3 -3
- package/dist/tools/builtins/skill-load.js +1 -1
- package/dist/tools/canonical-json.d.ts +6 -0
- package/dist/tools/canonical-json.js +16 -0
- package/dist/tools/connector-content.controller.d.ts +1 -1
- package/dist/tools/connector-content.controller.js +11 -6
- package/dist/tools/connector-content.d.ts +12 -15
- package/dist/tools/connector-content.js +53 -18
- package/dist/tools/connectors.controller.d.ts +1 -1
- package/dist/tools/connectors.controller.js +21 -10
- package/dist/tools/connectors.service.d.ts +31 -13
- package/dist/tools/connectors.service.js +434 -344
- package/dist/tools/credentials.d.ts +17 -20
- package/dist/tools/credentials.js +55 -34
- package/dist/tools/drift.d.ts +29 -41
- package/dist/tools/drift.js +111 -79
- package/dist/tools/info.d.ts +12 -9
- package/dist/tools/info.js +33 -7
- package/dist/tools/job-ids.d.ts +13 -0
- package/dist/tools/job-ids.js +15 -0
- package/dist/tools/jobs.d.ts +24 -0
- package/dist/tools/jobs.js +69 -0
- package/dist/tools/oauth/flow-paths.d.ts +16 -0
- package/dist/tools/oauth/flow-paths.js +38 -0
- package/dist/tools/oauth/flow.d.ts +30 -30
- package/dist/tools/oauth/flow.js +109 -81
- package/dist/tools/oauth/oauth.controller.d.ts +3 -3
- package/dist/tools/oauth/oauth.controller.js +12 -9
- package/dist/tools/oauth/tokens.d.ts +11 -3
- package/dist/tools/oauth/tokens.js +15 -14
- package/dist/tools/outputs.d.ts +13 -4
- package/dist/tools/outputs.js +47 -3
- package/dist/tools/pipeline.d.ts +62 -46
- package/dist/tools/pipeline.js +145 -64
- package/dist/tools/policy.d.ts +2 -2
- package/dist/tools/questions.controller.d.ts +1 -1
- package/dist/tools/questions.controller.js +8 -5
- package/dist/tools/questions.service.d.ts +25 -24
- package/dist/tools/questions.service.js +201 -142
- package/dist/tools/registry.d.ts +30 -20
- package/dist/tools/registry.js +73 -37
- package/dist/tools/specs.d.ts +5 -4
- package/dist/tools/specs.js +3 -1
- package/dist/tools/tools.module.d.ts +10 -0
- package/dist/tools/tools.module.js +91 -0
- package/dist/ui/call-extension.d.ts +16 -0
- package/dist/ui/call-extension.js +38 -0
- package/dist/ui/embed-token.d.ts +9 -5
- package/dist/ui/embed-token.js +34 -6
- package/dist/ui/ui-stream.d.ts +22 -17
- package/dist/ui/ui-stream.js +72 -12
- package/dist/ui/ui.module.d.ts +7 -0
- package/dist/ui/ui.module.js +28 -0
- package/dist/ui/views.controller.d.ts +14 -12
- package/dist/ui/views.controller.js +32 -25
- package/dist/ui/views.d.ts +9 -57
- package/dist/ui/views.js +43 -45
- package/package.json +11 -2
- package/dist/http/health.controller.d.ts +0 -26
- package/dist/http/health.controller.js +0 -79
- package/dist/http/tokens.d.ts +0 -131
- package/dist/http/tokens.js +0 -131
- package/dist/http/zod.pipe.d.ts +0 -8
- package/dist/http/zod.pipe.js +0 -14
- package/dist/identity/rate-limit.d.ts +0 -55
- package/dist/identity/rate-limit.js +0 -121
- package/dist/sandbox/lifecycle.d.ts +0 -21
- package/dist/sandbox/lifecycle.js +0 -68
- /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
- /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
|
@@ -1,32 +1,35 @@
|
|
|
1
|
-
|
|
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
|
+
};
|
|
10
|
+
import { randomUUID } from "node:crypto";
|
|
2
11
|
import { isChannelSendError, } from "@capybara-hq/plugin-sdk";
|
|
3
|
-
import {
|
|
12
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
13
|
+
import { DelayedError, UnrecoverableError } from "bullmq";
|
|
4
14
|
import { sql } from "kysely";
|
|
5
|
-
import { conversationTopic, } from "../conversations/event-log.js";
|
|
15
|
+
import { conversationTopic, EventLog, } from "../conversations/event-log.js";
|
|
6
16
|
import { ApiError } from "../errors.js";
|
|
17
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
18
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
19
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
20
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
21
|
+
import { KERNEL_BUS, KERNEL_LOGGER } from "../infra/tokens.js";
|
|
7
22
|
import { readOrgSettings } from "../orgs/settings.service.js";
|
|
8
|
-
import { ConversationLock } from "../runtime/conversation-lock.js";
|
|
9
|
-
import {
|
|
23
|
+
import { ConversationLock, } from "../runtime/conversation-lock.js";
|
|
24
|
+
import { ApprovalsService } from "../tools/approvals.service.js";
|
|
25
|
+
import { QuestionsService } from "../tools/questions.service.js";
|
|
10
26
|
import { approvalCard, cardMessage, connectUrl, conversationUrl, questionCard, webBase, } from "./cards.js";
|
|
27
|
+
import { ChannelConnections } from "./connections.service.js";
|
|
28
|
+
import { ChannelInbound } from "./inbound.js";
|
|
29
|
+
import { ChannelJobs, INBOUND_JOB, idempotencyKey, } from "./jobs.js";
|
|
11
30
|
import { phrase } from "./phrases.js";
|
|
12
|
-
|
|
13
|
-
export
|
|
14
|
-
/** 投递任务名。 */
|
|
15
|
-
export const DELIVER_JOB = "deliver";
|
|
16
|
-
/** 投递任务 id(不含 `:`):同一会话、同一日志位置只排一个任务。 */
|
|
17
|
-
export const deliverJobId = (conversationId, seq) => `deliver-${conversationId}-${seq}`;
|
|
18
|
-
/**
|
|
19
|
-
* 结束后复核排的任务 id:每次唯一(带随机后缀,不含 `:`)。不能复用 `deliver-<会话>-<seq>`——同 id 的任务
|
|
20
|
-
* 可能正因锁被占而即将直接结束,BullMQ 会把新任务去重进它,于是没人投递。
|
|
21
|
-
*/
|
|
22
|
-
export const followUpJobId = (conversationId, seq) => `deliver-${conversationId}-${seq}-f${randomUUID().slice(0, 8)}`;
|
|
23
|
-
/**
|
|
24
|
-
* 发给插件的幂等键(Ruling A15):把逻辑键(如 `<会话>-<seq>`)做 sha256,取 base64url 的前 32 个字符——
|
|
25
|
-
* 稳定、只含 `[A-Za-z0-9_-]`,满足常见平台的长度限制。
|
|
26
|
-
*/
|
|
27
|
-
export function idempotencyKey(raw) {
|
|
28
|
-
return createHash("sha256").update(raw).digest("base64url").slice(0, 32);
|
|
29
|
-
}
|
|
31
|
+
// The queue, job names, ids and priorities live with the producer (jobs.ts)
|
|
32
|
+
export { CHANNEL_QUEUE_NAME, DELIVER_ATTEMPTS, DELIVER_JOB, DELIVER_PRIORITY, deliverJobId, followUpJobId, INBOUND_ATTEMPTS, INBOUND_JOB, INBOUND_PRIORITY, idempotencyKey, inboundJobId, } from "./jobs.js";
|
|
30
33
|
/**
|
|
31
34
|
* 投递锁被占时怎么办:读不到持有者(刚被释放)→ 再取一次;是自己上一次(已崩溃、被 stalled 重新投递)的尝试 →
|
|
32
35
|
* 推迟重试等它过期;别的任务 → 直接结束(它会读到新事件,结束时还会复核)。
|
|
@@ -58,8 +61,6 @@ const LOCK_BUSY_DELAY_MS = 1000;
|
|
|
58
61
|
const PLUGIN_PENDING_DELAY_MS = 5000;
|
|
59
62
|
/** 插件一直没有在任何副本上加载:任务排进队列这么久之后放弃(之后的新事件会再排任务)。 */
|
|
60
63
|
const PLUGIN_PENDING_MAX_MS = 3_600_000;
|
|
61
|
-
/** 可重试失败(限流、5xx、网络、超时)的总尝试次数。 */
|
|
62
|
-
export const DELIVER_ATTEMPTS = 8;
|
|
63
64
|
/** 同一事件不可重试地失败这么多次后跳过它(Ruling A14)。 */
|
|
64
65
|
export const POISON_FAILURES = 3;
|
|
65
66
|
/** 退避:未给出建议等待时长时 `min(上限, 基数 · 2^(n-1))`。 */
|
|
@@ -69,22 +70,6 @@ const BACKOFF_MAX_MS = 60_000;
|
|
|
69
70
|
const PAGE = 200;
|
|
70
71
|
/** `last_error` 的最大长度(同渠道选主)。 */
|
|
71
72
|
const MAX_ERROR_CHARS = 1000;
|
|
72
|
-
/** 入站任务名。 */
|
|
73
|
-
export const INBOUND_JOB = "inbound";
|
|
74
|
-
/**
|
|
75
|
-
* BullMQ 优先级(数字越小越先):入站任务先于出站投递任务——投递任务可能占着并发槽等输出,
|
|
76
|
-
* 用户发来的消息不能排在它们后面。
|
|
77
|
-
*/
|
|
78
|
-
export const INBOUND_PRIORITY = 1;
|
|
79
|
-
export const DELIVER_PRIORITY = 10;
|
|
80
|
-
/** 入站任务的总尝试次数(处理失败由 BullMQ 指数退避重试:1s、2s、4s、8s)。 */
|
|
81
|
-
export const INBOUND_ATTEMPTS = 5;
|
|
82
|
-
const INBOUND_BACKOFF_MS = 1000;
|
|
83
|
-
/**
|
|
84
|
-
* 入站消息的任务 id(不含 `:`):`inbound-<连接>-<sha256(消息 id) 的 base64url 前 22 位>`。同一条消息只排一个任务
|
|
85
|
-
* (已完成的任务保留一段时间,期间重复入队被 BullMQ 忽略)。
|
|
86
|
-
*/
|
|
87
|
-
export const inboundJobId = (connectionId, messageId) => `inbound-${connectionId}-${createHash("sha256").update(messageId).digest("base64url").slice(0, 22)}`;
|
|
88
73
|
/** 可重试的投递失败:带已打码的说明与平台建议的等待时长,供退避策略与最后一次失败时记录。 */
|
|
89
74
|
class RetryableDeliveryError extends Error {
|
|
90
75
|
connectionId;
|
|
@@ -120,9 +105,8 @@ export function deliverBackoff(attemptsMade, err) {
|
|
|
120
105
|
}
|
|
121
106
|
/**
|
|
122
107
|
* 渠道出站投递:把会话日志里 `channel_deliveries.last_seq` 之后的内容按序投到 IM。
|
|
123
|
-
* -
|
|
124
|
-
*
|
|
125
|
-
* - Worker(只在 worker 角色):每个任务先取按会话互斥的投递锁,订阅 `conv.<id>` 后补读日志;运行进入 waiting /
|
|
108
|
+
* - 生产方(任意角色):{@link ChannelJobs}(`deliver-<会话>-<当前 seq>` 任务;会话没有投递目标时什么都不做)。
|
|
109
|
+
* - Worker(只在 worker 角色,经 `@Processor`):每个任务先取按会话互斥的投递锁,订阅 `conv.<id>` 后补读日志;运行进入 waiting /
|
|
126
110
|
* 终态且日志读完,或追上后 `channels.deliveryIdleMs` 内没有新的总线消息,任务就结束(不长期占并发槽)。
|
|
127
111
|
* 锁被别的任务持有 → 本任务直接结束:持有者会读到新事件,且它结束时(释放锁之后)复核日志是否有新内容,有就再排一个任务;
|
|
128
112
|
* 锁被自己上一次(已崩溃的)尝试占着 → 推迟重试,等锁过期。
|
|
@@ -130,127 +114,82 @@ export function deliverBackoff(attemptsMade, err) {
|
|
|
130
114
|
* 并记下 IM 消息 id(草稿 id、卡片消息 id),已投递的不会重发。
|
|
131
115
|
* 审批 / 提问卡片在发送之前先记一行 `pending`(T5a),卡片一出现就被点击也能通过 Ruling A13 的核对;
|
|
132
116
|
* 推进 `last_seq` 的事务再补上消息 id、改为 `sent`。崩溃后续投的副本用同一个幂等键重发。
|
|
133
|
-
* 同一队列还承载入站任务(`inbound`,Ruling A21):由
|
|
134
|
-
*
|
|
117
|
+
* 同一队列还承载入站任务(`inbound`,Ruling A21):由 {@link ChannelJobs.enqueueInbound} 排入,worker 调用
|
|
118
|
+
* {@link ChannelInbound.handle} 处理,失败按 BullMQ 指数退避重试。
|
|
135
119
|
* 状态全部在 PG / Redis;进程内只有本任务自己的订阅、草稿节流时刻与等待定时器(本进程持有的资源)。
|
|
136
120
|
*/
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
121
|
+
let ChannelOutbound = class ChannelOutbound {
|
|
122
|
+
kdb;
|
|
123
|
+
inbound;
|
|
124
|
+
jobs;
|
|
125
|
+
config;
|
|
126
|
+
log;
|
|
127
|
+
txHost;
|
|
141
128
|
worker;
|
|
142
|
-
workerConn;
|
|
143
129
|
closed = false;
|
|
144
130
|
/** 停机:进行中的任务在下一个检查点交还队列(由其他副本续投)。 */
|
|
145
131
|
stopping = new AbortController();
|
|
146
132
|
lock;
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
}
|
|
133
|
+
d;
|
|
134
|
+
constructor(kdb, bus, eventLog,
|
|
135
|
+
/** The conversation lock provider; delivery takes it under its own key prefix. */
|
|
136
|
+
lock, connections, approvals, questions,
|
|
137
|
+
/** 入站任务的处理(worker 上执行 `ChannelInbound.handle`);失败抛错由 BullMQ 重试。 */
|
|
138
|
+
inbound, jobs, config, log, txHost) {
|
|
139
|
+
this.kdb = kdb;
|
|
140
|
+
this.inbound = inbound;
|
|
141
|
+
this.jobs = jobs;
|
|
142
|
+
this.config = config;
|
|
143
|
+
this.log = log;
|
|
144
|
+
this.txHost = txHost;
|
|
145
|
+
this.lock = lock.scoped(DELIVER_LOCK_PREFIX);
|
|
146
|
+
this.d = {
|
|
147
|
+
get db() {
|
|
148
|
+
return kdb.db;
|
|
149
|
+
},
|
|
150
|
+
bus,
|
|
151
|
+
eventLog,
|
|
152
|
+
connections,
|
|
153
|
+
approvals,
|
|
154
|
+
questions,
|
|
155
|
+
config,
|
|
156
|
+
log,
|
|
157
|
+
writes: this,
|
|
158
|
+
};
|
|
173
159
|
}
|
|
174
160
|
/**
|
|
175
|
-
*
|
|
176
|
-
*
|
|
161
|
+
* Starts consuming (worker role only): `worker` is the `@Processor` worker of the channel queue
|
|
162
|
+
* (its job lock and stalled detection follow the run queue's config).
|
|
177
163
|
*/
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
backoff: { type: "exponential", delay: INBOUND_BACKOFF_MS },
|
|
184
|
-
removeOnComplete: { age: 3600, count: 1000 },
|
|
185
|
-
removeOnFail: { age: 86_400 },
|
|
186
|
-
});
|
|
164
|
+
startWorker(worker) {
|
|
165
|
+
if (this.worker || this.closed)
|
|
166
|
+
return;
|
|
167
|
+
this.worker = worker;
|
|
168
|
+
void worker.run().catch((err) => this.onError(err));
|
|
187
169
|
}
|
|
188
|
-
/**
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
*/
|
|
192
|
-
async resumeConnection(connectionId) {
|
|
193
|
-
const rows = await this.d.db
|
|
194
|
-
.selectFrom("channel_deliveries")
|
|
195
|
-
.innerJoin("conversations", "conversations.id", "channel_deliveries.conversation_id")
|
|
196
|
-
.select("channel_deliveries.conversation_id")
|
|
197
|
-
.where("channel_deliveries.connection_id", "=", connectionId)
|
|
198
|
-
.whereRef("channel_deliveries.last_seq", "<", "conversations.last_seq")
|
|
199
|
-
.execute();
|
|
200
|
-
for (const r of rows)
|
|
201
|
-
await this.enqueue(r.conversation_id, { followUp: true });
|
|
170
|
+
/** The worker's `error` event. */
|
|
171
|
+
onError(err) {
|
|
172
|
+
this.log.error("channel outbound worker error", { err });
|
|
202
173
|
}
|
|
203
|
-
/**
|
|
204
|
-
|
|
205
|
-
if (
|
|
174
|
+
/** The worker's `failed` event (a requeue for later is not a failure). */
|
|
175
|
+
onFailed(job, err) {
|
|
176
|
+
if (err instanceof DelayedError || err.name === "DelayedError")
|
|
206
177
|
return;
|
|
207
|
-
|
|
208
|
-
this.workerConn = bullConnection(this.d.redisUrl, this.d.log);
|
|
209
|
-
this.worker = new Worker(CHANNEL_QUEUE_NAME, (job, token) => this.process(job, token), {
|
|
210
|
-
connection: this.workerConn,
|
|
211
|
-
concurrency: this.d.config().channels.deliveryConcurrency,
|
|
212
|
-
lockDuration: jobLockMs,
|
|
213
|
-
stalledInterval: stalledIntervalMs,
|
|
214
|
-
maxStalledCount: 3,
|
|
215
|
-
settings: { backoffStrategy: (n, _type, err) => deliverBackoff(n, err) },
|
|
216
|
-
});
|
|
217
|
-
this.worker.on("error", (err) => this.d.log.error("channel outbound worker error", { err }));
|
|
218
|
-
this.worker.on("failed", (job, err) => {
|
|
219
|
-
if (err instanceof DelayedError || err.name === "DelayedError")
|
|
220
|
-
return;
|
|
221
|
-
this.d.log.warn("channel delivery attempt failed", { jobId: job?.id, error: err.message });
|
|
222
|
-
});
|
|
178
|
+
this.log.warn("channel delivery attempt failed", { jobId: job?.id, error: err.message });
|
|
223
179
|
}
|
|
180
|
+
/** Stops: the jobs in flight are handed back at their next checkpoint, the worker closes. */
|
|
224
181
|
async close() {
|
|
225
182
|
this.closed = true;
|
|
226
183
|
this.stopping.abort();
|
|
227
184
|
const w = this.worker;
|
|
228
|
-
const q = this.queue;
|
|
229
185
|
this.worker = undefined;
|
|
230
|
-
this.queue = undefined;
|
|
231
186
|
await w?.close().catch(() => { });
|
|
232
|
-
await q?.close().catch(() => { });
|
|
233
|
-
for (const c of [this.workerConn, this.queueConn]) {
|
|
234
|
-
if (c)
|
|
235
|
-
await c.quit().catch(() => c.disconnect());
|
|
236
|
-
}
|
|
237
|
-
this.workerConn = undefined;
|
|
238
|
-
this.queueConn = undefined;
|
|
239
|
-
}
|
|
240
|
-
getQueue() {
|
|
241
|
-
if (this.closed)
|
|
242
|
-
throw new Error("channel outbound queue is closed");
|
|
243
|
-
if (!this.queue) {
|
|
244
|
-
this.queueConn = bullConnection(this.d.redisUrl, this.d.log);
|
|
245
|
-
this.queue = new Queue(CHANNEL_QUEUE_NAME, { connection: this.queueConn });
|
|
246
|
-
this.queue.on("error", (err) => this.d.log.error("channel outbound queue error", { err }));
|
|
247
|
-
}
|
|
248
|
-
return this.queue;
|
|
249
187
|
}
|
|
250
188
|
async requeue(job, token, delayMs) {
|
|
251
189
|
await job.moveToDelayed(Date.now() + delayMs, token);
|
|
252
190
|
throw new DelayedError();
|
|
253
191
|
}
|
|
192
|
+
/** One job of the channel queue (the `@Processor` calls it): a delivery or an inbound event. */
|
|
254
193
|
async process(job, token) {
|
|
255
194
|
if (this.stopping.signal.aborted)
|
|
256
195
|
return this.requeue(job, token, 0);
|
|
@@ -261,7 +200,7 @@ export class ChannelOutbound {
|
|
|
261
200
|
/** 本副本没有加载连接的插件:推迟重试(不消耗重试次数),排队超过上限才放弃。 */
|
|
262
201
|
async pluginPending(job, token, what) {
|
|
263
202
|
if (Date.now() - job.timestamp > PLUGIN_PENDING_MAX_MS) {
|
|
264
|
-
this.
|
|
203
|
+
this.log.warn(`channel ${what} dropped: extension not loaded on any replica in time`, {
|
|
265
204
|
jobId: job.id,
|
|
266
205
|
});
|
|
267
206
|
return;
|
|
@@ -274,10 +213,8 @@ export class ChannelOutbound {
|
|
|
274
213
|
*/
|
|
275
214
|
async processInbound(job, token) {
|
|
276
215
|
const { connectionId, event } = job.data;
|
|
277
|
-
if (!this.d.inbound)
|
|
278
|
-
throw new Error("channel inbound handler is not configured");
|
|
279
216
|
try {
|
|
280
|
-
await this.
|
|
217
|
+
await this.inbound.handle(connectionId, event);
|
|
281
218
|
}
|
|
282
219
|
catch (err) {
|
|
283
220
|
if (err instanceof ApiError && err.code === "extension.not_found") {
|
|
@@ -286,7 +223,7 @@ export class ChannelOutbound {
|
|
|
286
223
|
if (isChannelSendError(err) &&
|
|
287
224
|
!err.retryable &&
|
|
288
225
|
(err.reason === "auth" || err.reason === "target_gone")) {
|
|
289
|
-
this.
|
|
226
|
+
this.log.warn("channel inbound reply failed permanently", {
|
|
290
227
|
connectionId,
|
|
291
228
|
type: event.type,
|
|
292
229
|
reason: err.reason,
|
|
@@ -294,7 +231,7 @@ export class ChannelOutbound {
|
|
|
294
231
|
throw new UnrecoverableError(`inbound reply failed: ${err.reason}`);
|
|
295
232
|
}
|
|
296
233
|
if (job.attemptsMade + 1 >= (job.opts.attempts ?? 1)) {
|
|
297
|
-
this.
|
|
234
|
+
this.log.error("channel inbound event dropped after retries", {
|
|
298
235
|
connectionId,
|
|
299
236
|
type: event.type,
|
|
300
237
|
err,
|
|
@@ -306,7 +243,7 @@ export class ChannelOutbound {
|
|
|
306
243
|
async deliver(job, token) {
|
|
307
244
|
const { conversationId } = job.data;
|
|
308
245
|
const owner = `${job.id ?? "job"}.`;
|
|
309
|
-
const acquire = () => this.lock.acquire(conversationId, `${owner}${randomUUID()}`, this.
|
|
246
|
+
const acquire = () => this.lock.acquire(conversationId, `${owner}${randomUUID()}`, this.config.get().runtime.jobLockMs);
|
|
310
247
|
let lease = await acquire();
|
|
311
248
|
if (!lease) {
|
|
312
249
|
const action = busyLockAction(await this.lock.holder(conversationId), owner);
|
|
@@ -336,7 +273,7 @@ export class ChannelOutbound {
|
|
|
336
273
|
finally {
|
|
337
274
|
await lease
|
|
338
275
|
.release()
|
|
339
|
-
.catch((err) => this.
|
|
276
|
+
.catch((err) => this.log.warn("cannot release channel delivery lock", { conversationId, err }));
|
|
340
277
|
}
|
|
341
278
|
if (outcome.error)
|
|
342
279
|
await this.recordError(outcome.error.connectionId, outcome.error.message);
|
|
@@ -359,7 +296,7 @@ export class ChannelOutbound {
|
|
|
359
296
|
return;
|
|
360
297
|
case "changed":
|
|
361
298
|
// 连接改过(轮换凭据等):释放锁之后排新任务,用新的出站会话从 last_seq 接着投
|
|
362
|
-
await this.enqueue(conversationId, { followUp: true });
|
|
299
|
+
await this.jobs.enqueue(conversationId, { followUp: true });
|
|
363
300
|
return;
|
|
364
301
|
case "pending":
|
|
365
302
|
return this.pluginPending(job, token, "delivery");
|
|
@@ -367,7 +304,7 @@ export class ChannelOutbound {
|
|
|
367
304
|
}
|
|
368
305
|
/** 会话日志当前的最后位置(会话不存在时 undefined)。 */
|
|
369
306
|
async lastSeq(conversationId) {
|
|
370
|
-
const conv = await this.
|
|
307
|
+
const conv = await this.kdb
|
|
371
308
|
.selectFrom("conversations")
|
|
372
309
|
.select("last_seq")
|
|
373
310
|
.where("id", "=", conversationId)
|
|
@@ -378,20 +315,81 @@ export class ChannelOutbound {
|
|
|
378
315
|
async followUp(conversationId, seen) {
|
|
379
316
|
const last = await this.lastSeq(conversationId);
|
|
380
317
|
if (last !== undefined && last > seen)
|
|
381
|
-
await this.enqueue(conversationId, { followUp: true });
|
|
318
|
+
await this.jobs.enqueue(conversationId, { followUp: true });
|
|
382
319
|
}
|
|
383
320
|
/** 不可重试(或重试用尽)的发送失败:记连接 `last_error`(已打码)。 */
|
|
384
321
|
async recordError(connectionId, message) {
|
|
385
322
|
const text = `delivery failed: ${message}`.slice(0, MAX_ERROR_CHARS);
|
|
386
|
-
this.
|
|
387
|
-
await this.
|
|
323
|
+
this.log.warn("channel delivery failed", { connectionId, error: text });
|
|
324
|
+
await this.kdb
|
|
388
325
|
.updateTable("channel_connections")
|
|
389
326
|
.set({ last_error: text })
|
|
390
327
|
.where("id", "=", connectionId)
|
|
391
328
|
.execute()
|
|
392
|
-
.catch((err) => this.
|
|
329
|
+
.catch((err) => this.log.warn("cannot record channel delivery error", { err }));
|
|
393
330
|
}
|
|
394
|
-
|
|
331
|
+
/**
|
|
332
|
+
* 推进 `last_seq`(同一事务记下草稿 / 卡片消息 id,清零失败计数)。以「仍是 `persisted`」为条件:
|
|
333
|
+
* 被别人推进过(投递锁丢失后另一实例接手)返回 false,什么都不写。
|
|
334
|
+
*/
|
|
335
|
+
async advanceIn(a) {
|
|
336
|
+
const r = await this.kdb
|
|
337
|
+
.updateTable("channel_deliveries")
|
|
338
|
+
.set({
|
|
339
|
+
last_seq: String(a.seq),
|
|
340
|
+
fail_seq: null,
|
|
341
|
+
fail_count: 0,
|
|
342
|
+
...(a.draft !== undefined && { draft_message_id: a.draft }),
|
|
343
|
+
updated_at: new Date(),
|
|
344
|
+
})
|
|
345
|
+
.where("conversation_id", "=", a.conversationId)
|
|
346
|
+
.where("last_seq", "=", String(a.persisted))
|
|
347
|
+
.executeTakeFirst();
|
|
348
|
+
if (r.numUpdatedRows === 0n)
|
|
349
|
+
return false;
|
|
350
|
+
if (a.card) {
|
|
351
|
+
// The row was recorded as `pending` before the send (recordCard); fill in the message id
|
|
352
|
+
const { messageId, target } = a.card;
|
|
353
|
+
await this.kdb
|
|
354
|
+
.insertInto("channel_card_messages")
|
|
355
|
+
.values({
|
|
356
|
+
conversation_id: a.conversationId,
|
|
357
|
+
connection_id: a.card.connectionId,
|
|
358
|
+
card_kind: a.card.kind,
|
|
359
|
+
card_id: a.card.id,
|
|
360
|
+
message_id: messageId,
|
|
361
|
+
status: "sent",
|
|
362
|
+
target: JSON.stringify(target),
|
|
363
|
+
})
|
|
364
|
+
.onConflict((oc) => oc.columns(["conversation_id", "connection_id", "card_kind", "card_id"]).doUpdateSet({
|
|
365
|
+
message_id: messageId,
|
|
366
|
+
status: "sent",
|
|
367
|
+
target: JSON.stringify(target),
|
|
368
|
+
}))
|
|
369
|
+
.execute();
|
|
370
|
+
}
|
|
371
|
+
return true;
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
__decorate([
|
|
375
|
+
Transactional()
|
|
376
|
+
], ChannelOutbound.prototype, "advanceIn", null);
|
|
377
|
+
ChannelOutbound = __decorate([
|
|
378
|
+
Injectable(),
|
|
379
|
+
__param(0, Inject(KernelDb)),
|
|
380
|
+
__param(1, Inject(KERNEL_BUS)),
|
|
381
|
+
__param(2, Inject(EventLog)),
|
|
382
|
+
__param(3, Inject(ConversationLock)),
|
|
383
|
+
__param(4, Inject(ChannelConnections)),
|
|
384
|
+
__param(5, Inject(ApprovalsService)),
|
|
385
|
+
__param(6, Inject(QuestionsService)),
|
|
386
|
+
__param(7, Inject(ChannelInbound)),
|
|
387
|
+
__param(8, Inject(ChannelJobs)),
|
|
388
|
+
__param(9, Inject(KernelConfigService)),
|
|
389
|
+
__param(10, Inject(KERNEL_LOGGER)),
|
|
390
|
+
__param(11, Inject(TransactionHost))
|
|
391
|
+
], ChannelOutbound);
|
|
392
|
+
export { ChannelOutbound };
|
|
395
393
|
/** 一次投递任务(本进程持有):订阅、补读、草稿节流。 */
|
|
396
394
|
class Delivery {
|
|
397
395
|
d;
|
|
@@ -481,7 +479,7 @@ class Delivery {
|
|
|
481
479
|
this.persisted = this.seen;
|
|
482
480
|
this.draftId = row.draft_message_id;
|
|
483
481
|
this.locale = (await readOrgSettings(this.d.db, this.s.row.orgId)).locale;
|
|
484
|
-
this.base = webBase(this.d.config().http.publicUrl);
|
|
482
|
+
this.base = webBase(this.d.config.get().http.publicUrl);
|
|
485
483
|
return await this.loop();
|
|
486
484
|
}
|
|
487
485
|
catch (err) {
|
|
@@ -585,7 +583,7 @@ class Delivery {
|
|
|
585
583
|
return undefined;
|
|
586
584
|
}
|
|
587
585
|
async loop() {
|
|
588
|
-
const idleMs = this.d.config().channels.deliveryIdleMs;
|
|
586
|
+
const idleMs = this.d.config.get().channels.deliveryIdleMs;
|
|
589
587
|
let lastMessageAt = Date.now();
|
|
590
588
|
let needCatchUp = true;
|
|
591
589
|
this.checkedAt = Date.now();
|
|
@@ -689,43 +687,17 @@ class Delivery {
|
|
|
689
687
|
* 被别人推进过(投递锁丢失后另一实例接手)就停止,不再重复发送。
|
|
690
688
|
*/
|
|
691
689
|
async advance(seq, opts = {}) {
|
|
692
|
-
await this.d.
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
updated_at: new Date(),
|
|
701
|
-
})
|
|
702
|
-
.where("conversation_id", "=", this.conversationId)
|
|
703
|
-
.where("last_seq", "=", String(this.persisted))
|
|
704
|
-
.executeTakeFirst();
|
|
705
|
-
if (r.numUpdatedRows === 0n)
|
|
706
|
-
throw new DeliveryLostError();
|
|
707
|
-
if (opts.card) {
|
|
708
|
-
// The row was recorded as `pending` before the send (recordCard); fill in the message id
|
|
709
|
-
const messageId = opts.card.messageId;
|
|
710
|
-
await t
|
|
711
|
-
.insertInto("channel_card_messages")
|
|
712
|
-
.values({
|
|
713
|
-
conversation_id: this.conversationId,
|
|
714
|
-
connection_id: this.s.row.id,
|
|
715
|
-
card_kind: opts.card.kind,
|
|
716
|
-
card_id: opts.card.id,
|
|
717
|
-
message_id: messageId,
|
|
718
|
-
status: "sent",
|
|
719
|
-
target: JSON.stringify(this.target),
|
|
720
|
-
})
|
|
721
|
-
.onConflict((oc) => oc.columns(["conversation_id", "connection_id", "card_kind", "card_id"]).doUpdateSet({
|
|
722
|
-
message_id: messageId,
|
|
723
|
-
status: "sent",
|
|
724
|
-
target: JSON.stringify(this.target),
|
|
725
|
-
}))
|
|
726
|
-
.execute();
|
|
727
|
-
}
|
|
690
|
+
const advanced = await this.d.writes.advanceIn({
|
|
691
|
+
conversationId: this.conversationId,
|
|
692
|
+
persisted: this.persisted,
|
|
693
|
+
seq,
|
|
694
|
+
...(opts.draft !== undefined && { draft: opts.draft }),
|
|
695
|
+
...(opts.card && {
|
|
696
|
+
card: { ...opts.card, connectionId: this.s.row.id, target: this.target },
|
|
697
|
+
}),
|
|
728
698
|
});
|
|
699
|
+
if (!advanced)
|
|
700
|
+
throw new DeliveryLostError();
|
|
729
701
|
this.persisted = seq;
|
|
730
702
|
if (opts.draft !== undefined) {
|
|
731
703
|
this.draftId = opts.draft;
|