@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,33 +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";
|
|
7
|
-
import {
|
|
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";
|
|
8
22
|
import { readOrgSettings } from "../orgs/settings.service.js";
|
|
9
|
-
import { ConversationLock } from "../runtime/conversation-lock.js";
|
|
10
|
-
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";
|
|
11
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";
|
|
12
30
|
import { phrase } from "./phrases.js";
|
|
13
|
-
|
|
14
|
-
export
|
|
15
|
-
/** 投递任务名。 */
|
|
16
|
-
export const DELIVER_JOB = "deliver";
|
|
17
|
-
/** 投递任务 id(不含 `:`):同一会话、同一日志位置只排一个任务。 */
|
|
18
|
-
export const deliverJobId = (conversationId, seq) => `deliver-${conversationId}-${seq}`;
|
|
19
|
-
/**
|
|
20
|
-
* 结束后复核排的任务 id:每次唯一(带随机后缀,不含 `:`)。不能复用 `deliver-<会话>-<seq>`——同 id 的任务
|
|
21
|
-
* 可能正因锁被占而即将直接结束,BullMQ 会把新任务去重进它,于是没人投递。
|
|
22
|
-
*/
|
|
23
|
-
export const followUpJobId = (conversationId, seq) => `deliver-${conversationId}-${seq}-f${randomUUID().slice(0, 8)}`;
|
|
24
|
-
/**
|
|
25
|
-
* 发给插件的幂等键(Ruling A15):把逻辑键(如 `<会话>-<seq>`)做 sha256,取 base64url 的前 32 个字符——
|
|
26
|
-
* 稳定、只含 `[A-Za-z0-9_-]`,满足常见平台的长度限制。
|
|
27
|
-
*/
|
|
28
|
-
export function idempotencyKey(raw) {
|
|
29
|
-
return createHash("sha256").update(raw).digest("base64url").slice(0, 32);
|
|
30
|
-
}
|
|
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";
|
|
31
33
|
/**
|
|
32
34
|
* 投递锁被占时怎么办:读不到持有者(刚被释放)→ 再取一次;是自己上一次(已崩溃、被 stalled 重新投递)的尝试 →
|
|
33
35
|
* 推迟重试等它过期;别的任务 → 直接结束(它会读到新事件,结束时还会复核)。
|
|
@@ -59,8 +61,6 @@ const LOCK_BUSY_DELAY_MS = 1000;
|
|
|
59
61
|
const PLUGIN_PENDING_DELAY_MS = 5000;
|
|
60
62
|
/** 插件一直没有在任何副本上加载:任务排进队列这么久之后放弃(之后的新事件会再排任务)。 */
|
|
61
63
|
const PLUGIN_PENDING_MAX_MS = 3_600_000;
|
|
62
|
-
/** 可重试失败(限流、5xx、网络、超时)的总尝试次数。 */
|
|
63
|
-
export const DELIVER_ATTEMPTS = 8;
|
|
64
64
|
/** 同一事件不可重试地失败这么多次后跳过它(Ruling A14)。 */
|
|
65
65
|
export const POISON_FAILURES = 3;
|
|
66
66
|
/** 退避:未给出建议等待时长时 `min(上限, 基数 · 2^(n-1))`。 */
|
|
@@ -70,22 +70,6 @@ const BACKOFF_MAX_MS = 60_000;
|
|
|
70
70
|
const PAGE = 200;
|
|
71
71
|
/** `last_error` 的最大长度(同渠道选主)。 */
|
|
72
72
|
const MAX_ERROR_CHARS = 1000;
|
|
73
|
-
/** 入站任务名。 */
|
|
74
|
-
export const INBOUND_JOB = "inbound";
|
|
75
|
-
/**
|
|
76
|
-
* BullMQ 优先级(数字越小越先):入站任务先于出站投递任务——投递任务可能占着并发槽等输出,
|
|
77
|
-
* 用户发来的消息不能排在它们后面。
|
|
78
|
-
*/
|
|
79
|
-
export const INBOUND_PRIORITY = 1;
|
|
80
|
-
export const DELIVER_PRIORITY = 10;
|
|
81
|
-
/** 入站任务的总尝试次数(处理失败由 BullMQ 指数退避重试:1s、2s、4s、8s)。 */
|
|
82
|
-
export const INBOUND_ATTEMPTS = 5;
|
|
83
|
-
const INBOUND_BACKOFF_MS = 1000;
|
|
84
|
-
/**
|
|
85
|
-
* 入站消息的任务 id(不含 `:`):`inbound-<连接>-<sha256(消息 id) 的 base64url 前 22 位>`。同一条消息只排一个任务
|
|
86
|
-
* (已完成的任务保留一段时间,期间重复入队被 BullMQ 忽略)。
|
|
87
|
-
*/
|
|
88
|
-
export const inboundJobId = (connectionId, messageId) => `inbound-${connectionId}-${createHash("sha256").update(messageId).digest("base64url").slice(0, 22)}`;
|
|
89
73
|
/** 可重试的投递失败:带已打码的说明与平台建议的等待时长,供退避策略与最后一次失败时记录。 */
|
|
90
74
|
class RetryableDeliveryError extends Error {
|
|
91
75
|
connectionId;
|
|
@@ -121,9 +105,8 @@ export function deliverBackoff(attemptsMade, err) {
|
|
|
121
105
|
}
|
|
122
106
|
/**
|
|
123
107
|
* 渠道出站投递:把会话日志里 `channel_deliveries.last_seq` 之后的内容按序投到 IM。
|
|
124
|
-
* -
|
|
125
|
-
*
|
|
126
|
-
* - Worker(只在 worker 角色):每个任务先取按会话互斥的投递锁,订阅 `conv.<id>` 后补读日志;运行进入 waiting /
|
|
108
|
+
* - 生产方(任意角色):{@link ChannelJobs}(`deliver-<会话>-<当前 seq>` 任务;会话没有投递目标时什么都不做)。
|
|
109
|
+
* - Worker(只在 worker 角色,经 `@Processor`):每个任务先取按会话互斥的投递锁,订阅 `conv.<id>` 后补读日志;运行进入 waiting /
|
|
127
110
|
* 终态且日志读完,或追上后 `channels.deliveryIdleMs` 内没有新的总线消息,任务就结束(不长期占并发槽)。
|
|
128
111
|
* 锁被别的任务持有 → 本任务直接结束:持有者会读到新事件,且它结束时(释放锁之后)复核日志是否有新内容,有就再排一个任务;
|
|
129
112
|
* 锁被自己上一次(已崩溃的)尝试占着 → 推迟重试,等锁过期。
|
|
@@ -131,127 +114,82 @@ export function deliverBackoff(attemptsMade, err) {
|
|
|
131
114
|
* 并记下 IM 消息 id(草稿 id、卡片消息 id),已投递的不会重发。
|
|
132
115
|
* 审批 / 提问卡片在发送之前先记一行 `pending`(T5a),卡片一出现就被点击也能通过 Ruling A13 的核对;
|
|
133
116
|
* 推进 `last_seq` 的事务再补上消息 id、改为 `sent`。崩溃后续投的副本用同一个幂等键重发。
|
|
134
|
-
* 同一队列还承载入站任务(`inbound`,Ruling A21):由
|
|
135
|
-
*
|
|
117
|
+
* 同一队列还承载入站任务(`inbound`,Ruling A21):由 {@link ChannelJobs.enqueueInbound} 排入,worker 调用
|
|
118
|
+
* {@link ChannelInbound.handle} 处理,失败按 BullMQ 指数退避重试。
|
|
136
119
|
* 状态全部在 PG / Redis;进程内只有本任务自己的订阅、草稿节流时刻与等待定时器(本进程持有的资源)。
|
|
137
120
|
*/
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
121
|
+
let ChannelOutbound = class ChannelOutbound {
|
|
122
|
+
kdb;
|
|
123
|
+
inbound;
|
|
124
|
+
jobs;
|
|
125
|
+
config;
|
|
126
|
+
log;
|
|
127
|
+
txHost;
|
|
142
128
|
worker;
|
|
143
|
-
workerConn;
|
|
144
129
|
closed = false;
|
|
145
130
|
/** 停机:进行中的任务在下一个检查点交还队列(由其他副本续投)。 */
|
|
146
131
|
stopping = new AbortController();
|
|
147
132
|
lock;
|
|
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
|
-
|
|
173
|
-
}
|
|
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
|
+
};
|
|
174
159
|
}
|
|
175
160
|
/**
|
|
176
|
-
*
|
|
177
|
-
*
|
|
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).
|
|
178
163
|
*/
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
backoff: { type: "exponential", delay: INBOUND_BACKOFF_MS },
|
|
185
|
-
removeOnComplete: { age: 3600, count: 1000 },
|
|
186
|
-
removeOnFail: { age: 86_400 },
|
|
187
|
-
});
|
|
164
|
+
startWorker(worker) {
|
|
165
|
+
if (this.worker || this.closed)
|
|
166
|
+
return;
|
|
167
|
+
this.worker = worker;
|
|
168
|
+
void worker.run().catch((err) => this.onError(err));
|
|
188
169
|
}
|
|
189
|
-
/**
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
*/
|
|
193
|
-
async resumeConnection(connectionId) {
|
|
194
|
-
const rows = await this.d.db
|
|
195
|
-
.selectFrom("channel_deliveries")
|
|
196
|
-
.innerJoin("conversations", "conversations.id", "channel_deliveries.conversation_id")
|
|
197
|
-
.select("channel_deliveries.conversation_id")
|
|
198
|
-
.where("channel_deliveries.connection_id", "=", connectionId)
|
|
199
|
-
.whereRef("channel_deliveries.last_seq", "<", "conversations.last_seq")
|
|
200
|
-
.execute();
|
|
201
|
-
for (const r of rows)
|
|
202
|
-
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 });
|
|
203
173
|
}
|
|
204
|
-
/**
|
|
205
|
-
|
|
206
|
-
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")
|
|
207
177
|
return;
|
|
208
|
-
|
|
209
|
-
this.workerConn = bullConnection(this.d.redisUrl, this.d.log);
|
|
210
|
-
this.worker = new Worker(CHANNEL_QUEUE_NAME, (job, token) => withJobContext(CHANNEL_QUEUE_NAME, job, () => this.process(job, token)), {
|
|
211
|
-
connection: this.workerConn,
|
|
212
|
-
concurrency: this.d.config().channels.deliveryConcurrency,
|
|
213
|
-
lockDuration: jobLockMs,
|
|
214
|
-
stalledInterval: stalledIntervalMs,
|
|
215
|
-
maxStalledCount: 3,
|
|
216
|
-
settings: { backoffStrategy: (n, _type, err) => deliverBackoff(n, err) },
|
|
217
|
-
});
|
|
218
|
-
this.worker.on("error", (err) => this.d.log.error("channel outbound worker error", { err }));
|
|
219
|
-
this.worker.on("failed", (job, err) => {
|
|
220
|
-
if (err instanceof DelayedError || err.name === "DelayedError")
|
|
221
|
-
return;
|
|
222
|
-
this.d.log.warn("channel delivery attempt failed", { jobId: job?.id, error: err.message });
|
|
223
|
-
});
|
|
178
|
+
this.log.warn("channel delivery attempt failed", { jobId: job?.id, error: err.message });
|
|
224
179
|
}
|
|
180
|
+
/** Stops: the jobs in flight are handed back at their next checkpoint, the worker closes. */
|
|
225
181
|
async close() {
|
|
226
182
|
this.closed = true;
|
|
227
183
|
this.stopping.abort();
|
|
228
184
|
const w = this.worker;
|
|
229
|
-
const q = this.queue;
|
|
230
185
|
this.worker = undefined;
|
|
231
|
-
this.queue = undefined;
|
|
232
186
|
await w?.close().catch(() => { });
|
|
233
|
-
await q?.close().catch(() => { });
|
|
234
|
-
for (const c of [this.workerConn, this.queueConn]) {
|
|
235
|
-
if (c)
|
|
236
|
-
await c.quit().catch(() => c.disconnect());
|
|
237
|
-
}
|
|
238
|
-
this.workerConn = undefined;
|
|
239
|
-
this.queueConn = undefined;
|
|
240
|
-
}
|
|
241
|
-
getQueue() {
|
|
242
|
-
if (this.closed)
|
|
243
|
-
throw new Error("channel outbound queue is closed");
|
|
244
|
-
if (!this.queue) {
|
|
245
|
-
this.queueConn = bullConnection(this.d.redisUrl, this.d.log);
|
|
246
|
-
this.queue = new Queue(CHANNEL_QUEUE_NAME, { connection: this.queueConn });
|
|
247
|
-
this.queue.on("error", (err) => this.d.log.error("channel outbound queue error", { err }));
|
|
248
|
-
}
|
|
249
|
-
return this.queue;
|
|
250
187
|
}
|
|
251
188
|
async requeue(job, token, delayMs) {
|
|
252
189
|
await job.moveToDelayed(Date.now() + delayMs, token);
|
|
253
190
|
throw new DelayedError();
|
|
254
191
|
}
|
|
192
|
+
/** One job of the channel queue (the `@Processor` calls it): a delivery or an inbound event. */
|
|
255
193
|
async process(job, token) {
|
|
256
194
|
if (this.stopping.signal.aborted)
|
|
257
195
|
return this.requeue(job, token, 0);
|
|
@@ -262,7 +200,7 @@ export class ChannelOutbound {
|
|
|
262
200
|
/** 本副本没有加载连接的插件:推迟重试(不消耗重试次数),排队超过上限才放弃。 */
|
|
263
201
|
async pluginPending(job, token, what) {
|
|
264
202
|
if (Date.now() - job.timestamp > PLUGIN_PENDING_MAX_MS) {
|
|
265
|
-
this.
|
|
203
|
+
this.log.warn(`channel ${what} dropped: extension not loaded on any replica in time`, {
|
|
266
204
|
jobId: job.id,
|
|
267
205
|
});
|
|
268
206
|
return;
|
|
@@ -275,10 +213,8 @@ export class ChannelOutbound {
|
|
|
275
213
|
*/
|
|
276
214
|
async processInbound(job, token) {
|
|
277
215
|
const { connectionId, event } = job.data;
|
|
278
|
-
if (!this.d.inbound)
|
|
279
|
-
throw new Error("channel inbound handler is not configured");
|
|
280
216
|
try {
|
|
281
|
-
await this.
|
|
217
|
+
await this.inbound.handle(connectionId, event);
|
|
282
218
|
}
|
|
283
219
|
catch (err) {
|
|
284
220
|
if (err instanceof ApiError && err.code === "extension.not_found") {
|
|
@@ -287,7 +223,7 @@ export class ChannelOutbound {
|
|
|
287
223
|
if (isChannelSendError(err) &&
|
|
288
224
|
!err.retryable &&
|
|
289
225
|
(err.reason === "auth" || err.reason === "target_gone")) {
|
|
290
|
-
this.
|
|
226
|
+
this.log.warn("channel inbound reply failed permanently", {
|
|
291
227
|
connectionId,
|
|
292
228
|
type: event.type,
|
|
293
229
|
reason: err.reason,
|
|
@@ -295,7 +231,7 @@ export class ChannelOutbound {
|
|
|
295
231
|
throw new UnrecoverableError(`inbound reply failed: ${err.reason}`);
|
|
296
232
|
}
|
|
297
233
|
if (job.attemptsMade + 1 >= (job.opts.attempts ?? 1)) {
|
|
298
|
-
this.
|
|
234
|
+
this.log.error("channel inbound event dropped after retries", {
|
|
299
235
|
connectionId,
|
|
300
236
|
type: event.type,
|
|
301
237
|
err,
|
|
@@ -307,7 +243,7 @@ export class ChannelOutbound {
|
|
|
307
243
|
async deliver(job, token) {
|
|
308
244
|
const { conversationId } = job.data;
|
|
309
245
|
const owner = `${job.id ?? "job"}.`;
|
|
310
|
-
const acquire = () => this.lock.acquire(conversationId, `${owner}${randomUUID()}`, this.
|
|
246
|
+
const acquire = () => this.lock.acquire(conversationId, `${owner}${randomUUID()}`, this.config.get().runtime.jobLockMs);
|
|
311
247
|
let lease = await acquire();
|
|
312
248
|
if (!lease) {
|
|
313
249
|
const action = busyLockAction(await this.lock.holder(conversationId), owner);
|
|
@@ -337,7 +273,7 @@ export class ChannelOutbound {
|
|
|
337
273
|
finally {
|
|
338
274
|
await lease
|
|
339
275
|
.release()
|
|
340
|
-
.catch((err) => this.
|
|
276
|
+
.catch((err) => this.log.warn("cannot release channel delivery lock", { conversationId, err }));
|
|
341
277
|
}
|
|
342
278
|
if (outcome.error)
|
|
343
279
|
await this.recordError(outcome.error.connectionId, outcome.error.message);
|
|
@@ -360,7 +296,7 @@ export class ChannelOutbound {
|
|
|
360
296
|
return;
|
|
361
297
|
case "changed":
|
|
362
298
|
// 连接改过(轮换凭据等):释放锁之后排新任务,用新的出站会话从 last_seq 接着投
|
|
363
|
-
await this.enqueue(conversationId, { followUp: true });
|
|
299
|
+
await this.jobs.enqueue(conversationId, { followUp: true });
|
|
364
300
|
return;
|
|
365
301
|
case "pending":
|
|
366
302
|
return this.pluginPending(job, token, "delivery");
|
|
@@ -368,7 +304,7 @@ export class ChannelOutbound {
|
|
|
368
304
|
}
|
|
369
305
|
/** 会话日志当前的最后位置(会话不存在时 undefined)。 */
|
|
370
306
|
async lastSeq(conversationId) {
|
|
371
|
-
const conv = await this.
|
|
307
|
+
const conv = await this.kdb
|
|
372
308
|
.selectFrom("conversations")
|
|
373
309
|
.select("last_seq")
|
|
374
310
|
.where("id", "=", conversationId)
|
|
@@ -379,20 +315,81 @@ export class ChannelOutbound {
|
|
|
379
315
|
async followUp(conversationId, seen) {
|
|
380
316
|
const last = await this.lastSeq(conversationId);
|
|
381
317
|
if (last !== undefined && last > seen)
|
|
382
|
-
await this.enqueue(conversationId, { followUp: true });
|
|
318
|
+
await this.jobs.enqueue(conversationId, { followUp: true });
|
|
383
319
|
}
|
|
384
320
|
/** 不可重试(或重试用尽)的发送失败:记连接 `last_error`(已打码)。 */
|
|
385
321
|
async recordError(connectionId, message) {
|
|
386
322
|
const text = `delivery failed: ${message}`.slice(0, MAX_ERROR_CHARS);
|
|
387
|
-
this.
|
|
388
|
-
await this.
|
|
323
|
+
this.log.warn("channel delivery failed", { connectionId, error: text });
|
|
324
|
+
await this.kdb
|
|
389
325
|
.updateTable("channel_connections")
|
|
390
326
|
.set({ last_error: text })
|
|
391
327
|
.where("id", "=", connectionId)
|
|
392
328
|
.execute()
|
|
393
|
-
.catch((err) => this.
|
|
329
|
+
.catch((err) => this.log.warn("cannot record channel delivery error", { err }));
|
|
394
330
|
}
|
|
395
|
-
|
|
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 };
|
|
396
393
|
/** 一次投递任务(本进程持有):订阅、补读、草稿节流。 */
|
|
397
394
|
class Delivery {
|
|
398
395
|
d;
|
|
@@ -482,7 +479,7 @@ class Delivery {
|
|
|
482
479
|
this.persisted = this.seen;
|
|
483
480
|
this.draftId = row.draft_message_id;
|
|
484
481
|
this.locale = (await readOrgSettings(this.d.db, this.s.row.orgId)).locale;
|
|
485
|
-
this.base = webBase(this.d.config().http.publicUrl);
|
|
482
|
+
this.base = webBase(this.d.config.get().http.publicUrl);
|
|
486
483
|
return await this.loop();
|
|
487
484
|
}
|
|
488
485
|
catch (err) {
|
|
@@ -586,7 +583,7 @@ class Delivery {
|
|
|
586
583
|
return undefined;
|
|
587
584
|
}
|
|
588
585
|
async loop() {
|
|
589
|
-
const idleMs = this.d.config().channels.deliveryIdleMs;
|
|
586
|
+
const idleMs = this.d.config.get().channels.deliveryIdleMs;
|
|
590
587
|
let lastMessageAt = Date.now();
|
|
591
588
|
let needCatchUp = true;
|
|
592
589
|
this.checkedAt = Date.now();
|
|
@@ -690,43 +687,17 @@ class Delivery {
|
|
|
690
687
|
* 被别人推进过(投递锁丢失后另一实例接手)就停止,不再重复发送。
|
|
691
688
|
*/
|
|
692
689
|
async advance(seq, opts = {}) {
|
|
693
|
-
await this.d.
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
updated_at: new Date(),
|
|
702
|
-
})
|
|
703
|
-
.where("conversation_id", "=", this.conversationId)
|
|
704
|
-
.where("last_seq", "=", String(this.persisted))
|
|
705
|
-
.executeTakeFirst();
|
|
706
|
-
if (r.numUpdatedRows === 0n)
|
|
707
|
-
throw new DeliveryLostError();
|
|
708
|
-
if (opts.card) {
|
|
709
|
-
// The row was recorded as `pending` before the send (recordCard); fill in the message id
|
|
710
|
-
const messageId = opts.card.messageId;
|
|
711
|
-
await t
|
|
712
|
-
.insertInto("channel_card_messages")
|
|
713
|
-
.values({
|
|
714
|
-
conversation_id: this.conversationId,
|
|
715
|
-
connection_id: this.s.row.id,
|
|
716
|
-
card_kind: opts.card.kind,
|
|
717
|
-
card_id: opts.card.id,
|
|
718
|
-
message_id: messageId,
|
|
719
|
-
status: "sent",
|
|
720
|
-
target: JSON.stringify(this.target),
|
|
721
|
-
})
|
|
722
|
-
.onConflict((oc) => oc.columns(["conversation_id", "connection_id", "card_kind", "card_id"]).doUpdateSet({
|
|
723
|
-
message_id: messageId,
|
|
724
|
-
status: "sent",
|
|
725
|
-
target: JSON.stringify(this.target),
|
|
726
|
-
}))
|
|
727
|
-
.execute();
|
|
728
|
-
}
|
|
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
|
+
}),
|
|
729
698
|
});
|
|
699
|
+
if (!advanced)
|
|
700
|
+
throw new DeliveryLostError();
|
|
730
701
|
this.persisted = seq;
|
|
731
702
|
if (opts.draft !== undefined) {
|
|
732
703
|
this.draftId = opts.draft;
|