@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
|
@@ -0,0 +1,451 @@
|
|
|
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 { SANDBOX_EXTENSION_POINT, } from "@capybara-hq/plugin-sdk";
|
|
11
|
+
import { Inject, Injectable, Optional, } from "@nestjs/common";
|
|
12
|
+
import { sql } from "kysely";
|
|
13
|
+
import { MarketplacesService } from "../catalog/marketplaces.service.js";
|
|
14
|
+
import { PluginImport } from "../catalog/plugin-import.js";
|
|
15
|
+
import { ChannelJobs } from "../channels/jobs.js";
|
|
16
|
+
import { ChannelOutbound } from "../channels/outbound.js";
|
|
17
|
+
import { TitleQueue } from "../conversations/titles.js";
|
|
18
|
+
import { migrate } from "../db/migrator.js";
|
|
19
|
+
import { ExtensionBlobs } from "../extensions/blobs.js";
|
|
20
|
+
import { BootstrapFailedError, BootstrapService, bootstrapManifestSha256, readBootstrapManifest, } from "../extensions/bootstrap.js";
|
|
21
|
+
import { ExtensionHost } from "../extensions/host.js";
|
|
22
|
+
import { ExtensionInstalls } from "../extensions/installs.js";
|
|
23
|
+
import { ExtensionLifecycle } from "../extensions/lifecycle.js";
|
|
24
|
+
import { ensureMigrated } from "../extensions/migrate-lock.js";
|
|
25
|
+
import { ExtensionRegistry } from "../extensions/registry.js";
|
|
26
|
+
import { ReplicaStatusStore } from "../extensions/sources.js";
|
|
27
|
+
import { syncPackage } from "../extensions/sync.js";
|
|
28
|
+
import { AccountsService } from "../identity/accounts.js";
|
|
29
|
+
import { waitWithin } from "../infra/close-within.js";
|
|
30
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
31
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
32
|
+
import { GracefulShutdown } from "../infra/lifecycle/graceful-shutdown.service.js";
|
|
33
|
+
import { KERNEL_BUS, KERNEL_LOGGER, KERNEL_POOL, REDIS } from "../infra/tokens.js";
|
|
34
|
+
import { KERNEL_MIGRATIONS_DIR, KERNEL_SCHEMA } from "../kernel.js";
|
|
35
|
+
import { GatewayRole } from "../roles/gateway-role.js";
|
|
36
|
+
import { WorkerRole } from "../roles/worker-role.js";
|
|
37
|
+
import { UsageReporter } from "../runtime/usage-report.js";
|
|
38
|
+
import { sandboxConfigWarnings } from "../sandbox/sandbox.service.js";
|
|
39
|
+
import { KERNEL_APP_OPTIONS } from "./tokens.js";
|
|
40
|
+
/**
|
|
41
|
+
* The stop phase budgets. Each phase waits `min(its budget, what is left of the total)`, where the
|
|
42
|
+
* total is `STOP_TIMEOUT_MS` (30 s, `GracefulShutdown`) counted from the moment the shutdown
|
|
43
|
+
* began, in this order: migrate 2 s (the start's in-flight kernel migration, aborted, until its
|
|
44
|
+
* session ended) → http 10 s → runs 10 s → plugins 5 s, 27 s in all. The bus subscriber, Redis and
|
|
45
|
+
* the pool are closed after the phases by the infra modules (`onApplicationShutdown`) within what
|
|
46
|
+
* is left of the same 30 s, so the whole stop never takes longer than 30 s.
|
|
47
|
+
* The http phase is one deadline: first the listen in progress finishes (closing while listening
|
|
48
|
+
* would leave the port open), then HTTP closes, both within these 10 s; whatever is still open at
|
|
49
|
+
* the deadline is disconnected.
|
|
50
|
+
* The runs phase: this process's runs get the stop signal, stop at their next step boundary and
|
|
51
|
+
* their jobs go back to the queue; runs over the budget are left to BullMQ's stalled-job handling
|
|
52
|
+
* on another worker (spec 8.5). So when an earlier phase hangs, the extension queues still get at
|
|
53
|
+
* least 5 s to drain.
|
|
54
|
+
*/
|
|
55
|
+
export const STOP_BUDGET_MS = {
|
|
56
|
+
migrate: 2_000,
|
|
57
|
+
http: 10_000,
|
|
58
|
+
runs: 10_000,
|
|
59
|
+
plugins: 5_000,
|
|
60
|
+
};
|
|
61
|
+
/** 停机时留给渠道长连接交还租约的最少时间(与 runs 阶段并行开始,runs 用尽预算时仍保底)。 */
|
|
62
|
+
const CHANNELS_STOP_MIN_MS = 2_000;
|
|
63
|
+
/** runs 阶段里留给强制关闭 worker 的余量(预算的其余部分用于等运行到达步骤边界)。 */
|
|
64
|
+
const RUNS_FORCE_CLOSE_MS = 500;
|
|
65
|
+
const errMsg = (e) => (e instanceof Error ? e.message : String(e));
|
|
66
|
+
/**
|
|
67
|
+
* The kernel's start order and stop phases on Nest's hooks (nest kernel spec §4).
|
|
68
|
+
*
|
|
69
|
+
* Start (`onApplicationBootstrap`, run by `app.init()`): Redis ready → kernel migrations → official
|
|
70
|
+
* marketplace sync → bootstrap → extension host load → role parts (workers, schedules, gateway) →
|
|
71
|
+
* mount extension routes → extension lifecycle reconcile → (second bootstrap pass) → config watch.
|
|
72
|
+
* {@link listen} runs only after that resolved, so nothing is served before the extensions are
|
|
73
|
+
* loaded. A stop requested meanwhile makes the sequence throw at its next checkpoint.
|
|
74
|
+
*
|
|
75
|
+
* Stop (`beforeApplicationShutdown`, or {@link stop} directly): readiness answers 503, the start is
|
|
76
|
+
* aborted, then today's phases with {@link STOP_BUDGET_MS} (HTTP, runs, channels, queues, the
|
|
77
|
+
* extension host). Redis and the pool are closed after this by the infra modules
|
|
78
|
+
* (`onApplicationShutdown`, global modules run last).
|
|
79
|
+
*/
|
|
80
|
+
let KernelLifecycle = class KernelLifecycle {
|
|
81
|
+
accounts;
|
|
82
|
+
configService;
|
|
83
|
+
log;
|
|
84
|
+
options;
|
|
85
|
+
pool;
|
|
86
|
+
redis;
|
|
87
|
+
kdb;
|
|
88
|
+
shutdown;
|
|
89
|
+
host;
|
|
90
|
+
registry;
|
|
91
|
+
installs;
|
|
92
|
+
blobs;
|
|
93
|
+
extensionLifecycle;
|
|
94
|
+
replicaStatus;
|
|
95
|
+
bootstrap;
|
|
96
|
+
marketplaces;
|
|
97
|
+
pluginImport;
|
|
98
|
+
bus;
|
|
99
|
+
usageReport;
|
|
100
|
+
titles;
|
|
101
|
+
channelJobs;
|
|
102
|
+
channelOutbound;
|
|
103
|
+
worker;
|
|
104
|
+
gateway;
|
|
105
|
+
/** The startup config (hot fields are read through the config service). */
|
|
106
|
+
config;
|
|
107
|
+
/** Set when the application was never set up completely: shutdown only releases connections. */
|
|
108
|
+
onlyRelease = false;
|
|
109
|
+
stopPromise;
|
|
110
|
+
/** {@link listen} was called: the start work in flight is the listen, not the start sequence. */
|
|
111
|
+
listenStarted = false;
|
|
112
|
+
listening;
|
|
113
|
+
httpApp;
|
|
114
|
+
unwatchConfig;
|
|
115
|
+
/** What the first bootstrap pass did, carried into the second one. */
|
|
116
|
+
bootstrapCarry;
|
|
117
|
+
constructor(accounts, configService, log, options,
|
|
118
|
+
// biome-ignore lint/suspicious/noExplicitAny: the pool carries no schema types
|
|
119
|
+
pool, redis, kdb, shutdown, host, registry, installs, blobs, extensionLifecycle, replicaStatus, bootstrap, marketplaces, pluginImport, bus,
|
|
120
|
+
// the producers closed on every role (their consumers are the worker role's)
|
|
121
|
+
usageReport, titles, channelJobs, channelOutbound,
|
|
122
|
+
// The role modules' parts: a role module is imported only when `roles` names it, so each is
|
|
123
|
+
// present exactly when its role is (checked at the start)
|
|
124
|
+
worker, gateway) {
|
|
125
|
+
this.accounts = accounts;
|
|
126
|
+
this.configService = configService;
|
|
127
|
+
this.log = log;
|
|
128
|
+
this.options = options;
|
|
129
|
+
this.pool = pool;
|
|
130
|
+
this.redis = redis;
|
|
131
|
+
this.kdb = kdb;
|
|
132
|
+
this.shutdown = shutdown;
|
|
133
|
+
this.host = host;
|
|
134
|
+
this.registry = registry;
|
|
135
|
+
this.installs = installs;
|
|
136
|
+
this.blobs = blobs;
|
|
137
|
+
this.extensionLifecycle = extensionLifecycle;
|
|
138
|
+
this.replicaStatus = replicaStatus;
|
|
139
|
+
this.bootstrap = bootstrap;
|
|
140
|
+
this.marketplaces = marketplaces;
|
|
141
|
+
this.pluginImport = pluginImport;
|
|
142
|
+
this.bus = bus;
|
|
143
|
+
this.usageReport = usageReport;
|
|
144
|
+
this.titles = titles;
|
|
145
|
+
this.channelJobs = channelJobs;
|
|
146
|
+
this.channelOutbound = channelOutbound;
|
|
147
|
+
this.worker = worker;
|
|
148
|
+
this.gateway = gateway;
|
|
149
|
+
this.config = configService.get();
|
|
150
|
+
}
|
|
151
|
+
/** The kernel HTTP application (set up by `buildKernelApp` before `init()`). */
|
|
152
|
+
get http() {
|
|
153
|
+
if (!this.httpApp)
|
|
154
|
+
throw new Error("kernel HTTP application is not set up");
|
|
155
|
+
return this.httpApp;
|
|
156
|
+
}
|
|
157
|
+
attachHttp(http) {
|
|
158
|
+
this.httpApp = http;
|
|
159
|
+
}
|
|
160
|
+
/** The gateway role's HTTP routes (the channel webhook), when the roles include `gateway`. */
|
|
161
|
+
gatewayRoutes() {
|
|
162
|
+
return this.gateway?.routes();
|
|
163
|
+
}
|
|
164
|
+
/** The port listened on; undefined before {@link listen} resolves and after the stop. */
|
|
165
|
+
get port() {
|
|
166
|
+
return this.listening;
|
|
167
|
+
}
|
|
168
|
+
/** The application was not set up completely: its shutdown only releases connections. */
|
|
169
|
+
releaseOnly() {
|
|
170
|
+
this.onlyRelease = true;
|
|
171
|
+
this.shutdown.begin();
|
|
172
|
+
}
|
|
173
|
+
checkpoint() {
|
|
174
|
+
if (this.shutdown.isShuttingDown())
|
|
175
|
+
throw new Error("kernel stopped during start");
|
|
176
|
+
}
|
|
177
|
+
async onApplicationBootstrap() {
|
|
178
|
+
if (this.shutdown.isShuttingDown())
|
|
179
|
+
throw new Error("kernel is stopped");
|
|
180
|
+
const { config, options: opts } = this;
|
|
181
|
+
const { worker, gateway } = this;
|
|
182
|
+
if (config.roles.includes("worker") !== (worker !== undefined)) {
|
|
183
|
+
throw new Error("the worker role's module does not match the roles");
|
|
184
|
+
}
|
|
185
|
+
if (config.roles.includes("gateway") !== (gateway !== undefined)) {
|
|
186
|
+
throw new Error("the gateway role's module does not match the roles");
|
|
187
|
+
}
|
|
188
|
+
const cfg = () => this.configService.get();
|
|
189
|
+
await this.redis.connect();
|
|
190
|
+
this.checkpoint();
|
|
191
|
+
await sql `select 1`.execute(this.pool);
|
|
192
|
+
this.checkpoint();
|
|
193
|
+
// In flight for the stop: aborted when the shutdown begins, which then waits for its session to end
|
|
194
|
+
await this.shutdown.trackInFlight(migrate(config.db.url, { schema: KERNEL_SCHEMA, dir: KERNEL_MIGRATIONS_DIR }, { connectTimeoutMs: config.db.connectTimeoutMs, signal: this.shutdown.signal }));
|
|
195
|
+
this.checkpoint();
|
|
196
|
+
// official 清单来源按配置同步(幂等;每个副本启动时都做)
|
|
197
|
+
await this.marketplaces.syncOfficialFromConfig();
|
|
198
|
+
// The bootstrap plugins (spec §7), once per manifest across replicas (the Redis lock
|
|
199
|
+
// `lock:bootstrap`); a bootstrap entry named like a config-declared extension is kept
|
|
200
|
+
if (opts.bootstrap !== undefined) {
|
|
201
|
+
this.registry.declare(await ExtensionHost.declaredNames(config.extensions, {
|
|
202
|
+
...(opts.resolveFrom !== undefined && { resolveFrom: opts.resolveFrom }),
|
|
203
|
+
}));
|
|
204
|
+
}
|
|
205
|
+
const bootstrapAgain = opts.bootstrap !== undefined && (await this.runBootstrap(opts.bootstrap.dir));
|
|
206
|
+
this.checkpoint();
|
|
207
|
+
// 配置声明 → 安装记录(C15 / C13)。安装记录的包在本副本同步到 extensionHost.dir 后导入,
|
|
208
|
+
// 与运行中的 reconcile 走同一条路径;迁移由一个副本持锁执行(ensureMigrated,C16)
|
|
209
|
+
await this.host.load({
|
|
210
|
+
config: config.extensions,
|
|
211
|
+
installs: {
|
|
212
|
+
desired: () => this.installs.desired(),
|
|
213
|
+
sync: (d) => syncPackage(cfg().extensionHost.dir, d.name, d.sha256, this.blobs, {
|
|
214
|
+
maxBytes: cfg().packages.maxBytes,
|
|
215
|
+
}),
|
|
216
|
+
migrate: async (d, dir, signal) => d.migratedSha === d.sha256
|
|
217
|
+
? "migrated"
|
|
218
|
+
: ensureMigrated({
|
|
219
|
+
db: this.kdb.db,
|
|
220
|
+
dbUrl: config.db.url,
|
|
221
|
+
connectTimeoutMs: config.db.connectTimeoutMs,
|
|
222
|
+
bus: this.bus,
|
|
223
|
+
log: this.log,
|
|
224
|
+
// 宿主关闭时中止(运行中 reconcile 的迁移);停机一开始就中止(启动加载中的迁移不等宿主关闭)
|
|
225
|
+
signal: AbortSignal.any([signal, this.shutdown.signal]),
|
|
226
|
+
timeoutMs: cfg().extensionHost.migrationTimeoutSeconds * 1000,
|
|
227
|
+
}, d.name, d.sha256, dir),
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
this.checkpoint();
|
|
231
|
+
const sandboxEntry = this.host
|
|
232
|
+
.list("sandbox")
|
|
233
|
+
.find((x) => x.capability === SANDBOX_EXTENSION_POINT);
|
|
234
|
+
if (sandboxEntry !== undefined) {
|
|
235
|
+
for (const w of sandboxConfigWarnings(cfg(), sandboxEntry.plugin, sandboxEntry.impl)) {
|
|
236
|
+
this.log[w.level](w.message);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// The role parts (nest kernel spec §4): the worker role's queue consumers and schedules (the
|
|
240
|
+
// start gate: their timers are armed at application bootstrap, but no tick runs before the
|
|
241
|
+
// worker role opens the start gate here; the runOnStart jobs run then), the gateway role's
|
|
242
|
+
// supervisor and webhook inbound
|
|
243
|
+
if (worker)
|
|
244
|
+
await worker.start(() => this.checkpoint());
|
|
245
|
+
if (gateway)
|
|
246
|
+
await gateway.start(() => this.checkpoint());
|
|
247
|
+
// Routes stay mounted and are resolved live: 503 extension.unavailable after an extension is revoked, back after it reloads (C17)
|
|
248
|
+
this.http.mountPlugins(this.host.routeTable());
|
|
249
|
+
// 订阅插件生命周期主题后补一次 reconcile(启动加载期间错过的消息,并写下第一轮心跳)
|
|
250
|
+
await this.extensionLifecycle.start();
|
|
251
|
+
this.checkpoint();
|
|
252
|
+
await this.extensionLifecycle.reconcile("startup");
|
|
253
|
+
this.checkpoint();
|
|
254
|
+
if (bootstrapAgain && opts.bootstrap !== undefined) {
|
|
255
|
+
await this.runBootstrap(opts.bootstrap.dir, true);
|
|
256
|
+
this.checkpoint();
|
|
257
|
+
}
|
|
258
|
+
if (opts.source?.watch) {
|
|
259
|
+
// 热更新:重新校验;只应用 hot 字段,其余变化 warn 并列出需重启的键;校验失败保持原配置
|
|
260
|
+
this.unwatchConfig = opts.source.watch((raw) => this.configService.apply(raw), (err) => this.log.error("config watch error", { error: err.message }));
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Listens on `port` (0.0.0.0; every role listens: worker-only serves only `/healthz` and
|
|
265
|
+
* `/readyz`) after the start sequence; returns the actual port.
|
|
266
|
+
*/
|
|
267
|
+
async listen(port) {
|
|
268
|
+
// A shutdown already past the http phase must never open the port afterwards
|
|
269
|
+
this.checkpoint();
|
|
270
|
+
this.listenStarted = true;
|
|
271
|
+
// In flight for the stop: closing HTTP while it listens would leave the port open
|
|
272
|
+
this.listening = await this.shutdown.trackInFlight(this.http.listen(port));
|
|
273
|
+
this.checkpoint();
|
|
274
|
+
this.log.info("kernel started", { roles: this.config.roles, port: this.listening });
|
|
275
|
+
await this.warnIfSetupPending();
|
|
276
|
+
return this.listening;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Runs the bootstrap step unless it is done for the manifest. A required entry that cannot be
|
|
280
|
+
* completed (or a missing / tampered package: then nothing was installed) stops the start, so the
|
|
281
|
+
* kernel never serves without a required plugin. A failed optional entry is logged and returns
|
|
282
|
+
* true: the start runs the step once more after the extensions loaded (a declarative entry's
|
|
283
|
+
* catalog files need the object store, which on a fresh deployment is itself a bootstrap plugin),
|
|
284
|
+
* and the next start tries again while it stays incomplete.
|
|
285
|
+
*/
|
|
286
|
+
async runBootstrap(dir, final = false) {
|
|
287
|
+
const manifest = this.options.bootstrapManifest ?? (await readBootstrapManifest());
|
|
288
|
+
const bootstrap = this.bootstrap;
|
|
289
|
+
if (await bootstrap.isDone(bootstrapManifestSha256(manifest)))
|
|
290
|
+
return false;
|
|
291
|
+
try {
|
|
292
|
+
// The second pass records what the first one did (not `kept` for what it installed)
|
|
293
|
+
await bootstrap.run({
|
|
294
|
+
manifest,
|
|
295
|
+
imports: this.pluginImport,
|
|
296
|
+
...(dir !== undefined && { dir }),
|
|
297
|
+
signal: this.shutdown.signal,
|
|
298
|
+
...(this.bootstrapCarry !== undefined && { carry: this.bootstrapCarry }),
|
|
299
|
+
});
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
catch (e) {
|
|
303
|
+
if (e instanceof BootstrapFailedError && !e.requiredFailed) {
|
|
304
|
+
this.bootstrapCarry = e.results;
|
|
305
|
+
if (final) {
|
|
306
|
+
this.log.error("bootstrap: optional plugins could not be installed; retried on the next start", { failures: e.failures });
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
this.log.warn("bootstrap: optional plugins could not be installed yet; retried once the extensions have loaded", { failures: e.failures });
|
|
310
|
+
}
|
|
311
|
+
return true;
|
|
312
|
+
}
|
|
313
|
+
throw e;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
/** 部署尚无活跃企业管理员时提示去初始化;查询失败只记日志,不影响启动。 */
|
|
317
|
+
async warnIfSetupPending() {
|
|
318
|
+
try {
|
|
319
|
+
if ((await this.accounts.countEnterpriseAdmins()) === 0) {
|
|
320
|
+
this.log.warn("deployment is not set up; open the setup wizard or run `capybara admin create`");
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
catch (e) {
|
|
324
|
+
this.log.warn("cannot check whether the deployment is set up", { error: errMsg(e) });
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
async beforeApplicationShutdown() {
|
|
328
|
+
await this.stop();
|
|
329
|
+
}
|
|
330
|
+
/** Logs the end of the stop phases (Redis and the pool close right after, in the infra modules). */
|
|
331
|
+
onApplicationShutdown() {
|
|
332
|
+
if (!this.onlyRelease)
|
|
333
|
+
this.log.info("kernel stopped");
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Runs the stop phases once (idempotent): the shutdown begins at once (`GracefulShutdown.begin`:
|
|
337
|
+
* readiness answers 503, the start is aborted, the SSE streams close). Closing the application
|
|
338
|
+
* calls this from `beforeApplicationShutdown`; `closeKernelApp` (the tests, the signal handlers
|
|
339
|
+
* of `startKernelApp`) calls it directly next to `app.close()`, so the shutdown
|
|
340
|
+
* begins before any module's `onModuleDestroy` runs (Nest runs those first).
|
|
341
|
+
*/
|
|
342
|
+
stop() {
|
|
343
|
+
this.shutdown.begin();
|
|
344
|
+
this.stopPromise ??= this.onlyRelease ? Promise.resolve() : this.runStopPhases();
|
|
345
|
+
return this.stopPromise;
|
|
346
|
+
}
|
|
347
|
+
async runStopPhases() {
|
|
348
|
+
const log = this.log;
|
|
349
|
+
const shutdown = this.shutdown;
|
|
350
|
+
/** Waits for p within `min(budgetMs, what is left of the total)`; a timeout warns and returns false. */
|
|
351
|
+
const within = async (label, p, budgetMs = Number.POSITIVE_INFINITY) => {
|
|
352
|
+
try {
|
|
353
|
+
const done = await waitWithin(p, Math.min(budgetMs, shutdown.remainingMs()));
|
|
354
|
+
if (!done)
|
|
355
|
+
log.warn("shutdown step timed out", { step: label });
|
|
356
|
+
return done;
|
|
357
|
+
}
|
|
358
|
+
catch (e) {
|
|
359
|
+
log.error("shutdown step failed", { step: label, err: e });
|
|
360
|
+
return false;
|
|
361
|
+
}
|
|
362
|
+
};
|
|
363
|
+
// The start is not waited for (an extension setup can be arbitrarily slow): `begin()` aborted
|
|
364
|
+
// the start's kernel migration, whose session the migrate phase waits for (the in-flight work
|
|
365
|
+
// of the start sequence); the host close aborts extension migrations and closes the ctx of a
|
|
366
|
+
// setup in progress; the other start steps exit at their checkpoints. A listen in progress is
|
|
367
|
+
// waited for in the http phase (closing while listening would leave the port open).
|
|
368
|
+
// Extension requests in progress (SSE and other long requests end on req.signal) are aborted
|
|
369
|
+
// first, otherwise they would use up the http phase
|
|
370
|
+
this.httpApp?.abortPluginRequests();
|
|
371
|
+
// Scheduled jobs (worker role): no new tick, the runs in progress get the stop signal; awaited
|
|
372
|
+
// in the runs phase (before the extension host closes: a job may call an extension)
|
|
373
|
+
const { worker, gateway } = this;
|
|
374
|
+
const scheduledStopped = worker?.stopSchedules(STOP_BUDGET_MS.http + STOP_BUDGET_MS.runs);
|
|
375
|
+
if (!this.listenStarted)
|
|
376
|
+
await shutdown.drain(STOP_BUDGET_MS.migrate);
|
|
377
|
+
this.unwatchConfig?.();
|
|
378
|
+
this.unwatchConfig = undefined;
|
|
379
|
+
gateway?.unwatch();
|
|
380
|
+
await within("webhooks-unsubscribe", (gateway?.unsubscribe() ?? Promise.resolve()).catch(() => { }), 1_000);
|
|
381
|
+
// 不再接 reconcile(进行中的那次由宿主关闭收尾)
|
|
382
|
+
await within("plugin-lifecycle", this.extensionLifecycle.stop(), 1_000);
|
|
383
|
+
// http 阶段:等 listen 与关闭 HTTP 共用一个截止时间;listen 卡满预算时关闭只剩 0ms,直接强制断开
|
|
384
|
+
const httpDeadline = Date.now() + STOP_BUDGET_MS.http;
|
|
385
|
+
if (this.listenStarted)
|
|
386
|
+
await shutdown.drain(STOP_BUDGET_MS.http);
|
|
387
|
+
const http = this.httpApp;
|
|
388
|
+
if (http && !(await within("http", http.close(), Math.max(0, httpDeadline - Date.now())))) {
|
|
389
|
+
http.closeAllConnections();
|
|
390
|
+
}
|
|
391
|
+
this.listening = undefined;
|
|
392
|
+
// runs 阶段:停止领取运行、让本进程的运行在步骤边界停下并回到队列;再关闭运行队列的生产方连接。
|
|
393
|
+
// 渠道长连接与之并行停止(中止 connect、释放租约),必须在插件关闭之前。
|
|
394
|
+
const runsDeadline = Date.now() + STOP_BUDGET_MS.runs;
|
|
395
|
+
const channelsStopped = gateway?.stopSupervisor();
|
|
396
|
+
const runsBudget = Math.min(STOP_BUDGET_MS.runs, shutdown.remainingMs()) - RUNS_FORCE_CLOSE_MS;
|
|
397
|
+
const runsDrained = worker?.drainRuns(Math.max(0, runsBudget));
|
|
398
|
+
if (runsDrained)
|
|
399
|
+
await within("runs", runsDrained, STOP_BUDGET_MS.runs);
|
|
400
|
+
const evalsDrained = worker?.drainEvals(Math.max(0, runsDeadline - Date.now() - RUNS_FORCE_CLOSE_MS));
|
|
401
|
+
if (evalsDrained) {
|
|
402
|
+
await within("evals", evalsDrained, Math.max(0, runsDeadline - Date.now()));
|
|
403
|
+
}
|
|
404
|
+
if (channelsStopped) {
|
|
405
|
+
// 至少留 2s 交还租约:否则其他副本要等租约过期(默认 30s)才能接管
|
|
406
|
+
await within("channels", channelsStopped, Math.max(CHANNELS_STOP_MIN_MS, runsDeadline - Date.now()));
|
|
407
|
+
}
|
|
408
|
+
await within("scheduled-jobs", scheduledStopped ?? Promise.resolve(), Math.max(0, runsDeadline - Date.now()));
|
|
409
|
+
await within("maintenance", worker?.closeMaintenance() ?? Promise.resolve(), Math.max(0, runsDeadline - Date.now()));
|
|
410
|
+
// titles before usage.report: a finishing title call enqueues its usage report
|
|
411
|
+
await within("titles", this.titles.stop(), Math.max(0, runsDeadline - Date.now()));
|
|
412
|
+
// usage.report: in-flight deliveries are aborted and retried by any replica; before the plugins close
|
|
413
|
+
await within("usage-report", this.usageReport.stop(), Math.max(0, runsDeadline - Date.now()));
|
|
414
|
+
// 出站投递:进行中的任务交还队列(由其他副本从 last_seq 续投),必须在插件关闭之前
|
|
415
|
+
this.channelJobs.close();
|
|
416
|
+
await within("channel-outbound", this.channelOutbound.close(), Math.max(CHANNELS_STOP_MIN_MS, runsDeadline - Date.now()));
|
|
417
|
+
await within("plugins", this.host.close(), STOP_BUDGET_MS.plugins);
|
|
418
|
+
// 删掉本副本的加载状态行(尽力而为;崩溃副本心跳过期的行由 reconcile 清理)
|
|
419
|
+
await within("plugin-status", this.replicaStatus.removeAll(), 1_000);
|
|
420
|
+
}
|
|
421
|
+
};
|
|
422
|
+
KernelLifecycle = __decorate([
|
|
423
|
+
Injectable(),
|
|
424
|
+
__param(0, Inject(AccountsService)),
|
|
425
|
+
__param(1, Inject(KernelConfigService)),
|
|
426
|
+
__param(2, Inject(KERNEL_LOGGER)),
|
|
427
|
+
__param(3, Inject(KERNEL_APP_OPTIONS)),
|
|
428
|
+
__param(4, Inject(KERNEL_POOL)),
|
|
429
|
+
__param(5, Inject(REDIS)),
|
|
430
|
+
__param(6, Inject(KernelDb)),
|
|
431
|
+
__param(7, Inject(GracefulShutdown)),
|
|
432
|
+
__param(8, Inject(ExtensionHost)),
|
|
433
|
+
__param(9, Inject(ExtensionRegistry)),
|
|
434
|
+
__param(10, Inject(ExtensionInstalls)),
|
|
435
|
+
__param(11, Inject(ExtensionBlobs)),
|
|
436
|
+
__param(12, Inject(ExtensionLifecycle)),
|
|
437
|
+
__param(13, Inject(ReplicaStatusStore)),
|
|
438
|
+
__param(14, Inject(BootstrapService)),
|
|
439
|
+
__param(15, Inject(MarketplacesService)),
|
|
440
|
+
__param(16, Inject(PluginImport)),
|
|
441
|
+
__param(17, Inject(KERNEL_BUS)),
|
|
442
|
+
__param(18, Inject(UsageReporter)),
|
|
443
|
+
__param(19, Inject(TitleQueue)),
|
|
444
|
+
__param(20, Inject(ChannelJobs)),
|
|
445
|
+
__param(21, Inject(ChannelOutbound)),
|
|
446
|
+
__param(22, Optional()),
|
|
447
|
+
__param(22, Inject(WorkerRole)),
|
|
448
|
+
__param(23, Optional()),
|
|
449
|
+
__param(23, Inject(GatewayRole))
|
|
450
|
+
], KernelLifecycle);
|
|
451
|
+
export { KernelLifecycle };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { KernelConfig } from "./config/schema.js";
|
|
2
|
+
import { type KernelLogger, type LoggerOptions } from "./log.js";
|
|
3
|
+
/**
|
|
4
|
+
* Logger options from the kernel config: the console format, `role` (the process's roles joined
|
|
5
|
+
* by `,`) on every record, and the Loki output when `log.loki.url` is set. `extra` overrides (tests).
|
|
6
|
+
*/
|
|
7
|
+
export declare function loggerOptionsFromConfig(config: KernelConfig, extra?: Partial<LoggerOptions>): LoggerOptions;
|
|
8
|
+
/** The process logger as configured by `log.*` and `roles`. */
|
|
9
|
+
export declare function createConfiguredLogger(config: KernelConfig): KernelLogger;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createLogger } from "./log.js";
|
|
2
|
+
/**
|
|
3
|
+
* Logger options from the kernel config: the console format, `role` (the process's roles joined
|
|
4
|
+
* by `,`) on every record, and the Loki output when `log.loki.url` is set. `extra` overrides (tests).
|
|
5
|
+
*/
|
|
6
|
+
export function loggerOptionsFromConfig(config, extra = {}) {
|
|
7
|
+
const role = config.roles.join(",");
|
|
8
|
+
const { url, username, password, labels } = config.log.loki;
|
|
9
|
+
return {
|
|
10
|
+
format: config.log.format,
|
|
11
|
+
base: { role },
|
|
12
|
+
...(url !== undefined && {
|
|
13
|
+
loki: {
|
|
14
|
+
url,
|
|
15
|
+
labels,
|
|
16
|
+
role,
|
|
17
|
+
...(username !== undefined && { username }),
|
|
18
|
+
...(password !== undefined && { password }),
|
|
19
|
+
},
|
|
20
|
+
}),
|
|
21
|
+
...extra,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** The process logger as configured by `log.*` and `roles`. */
|
|
25
|
+
export function createConfiguredLogger(config) {
|
|
26
|
+
return createLogger(config.log.level, loggerOptionsFromConfig(config));
|
|
27
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fields every log record written inside the current async context carries (`reqId` for an HTTP
|
|
3
|
+
* request, `queue` / `jobId` / `runId` for a queue job). Read by the logger's pino mixin; the
|
|
4
|
+
* context is per async call chain, never shared between requests.
|
|
5
|
+
*/
|
|
6
|
+
export type LogContext = Readonly<Record<string, string>>;
|
|
7
|
+
/** A source of extra per-record fields, e.g. the active trace / span ids when tracing is on. */
|
|
8
|
+
type ContextSource = () => Record<string, string> | undefined;
|
|
9
|
+
/** The fields of the current context (plus the trace source's), or undefined outside any. */
|
|
10
|
+
export declare function logContext(): LogContext | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Registers the source of trace fields (`traceId` / `spanId`); set by the tracing bootstrap only
|
|
13
|
+
* when tracing is enabled, so the kernel never imports OpenTelemetry itself.
|
|
14
|
+
*/
|
|
15
|
+
export declare function setTraceContextSource(source: ContextSource | undefined): void;
|
|
16
|
+
/** Runs `fn` with `fields` added to the current context (undefined values are skipped). */
|
|
17
|
+
export declare function withLogContext<T>(fields: Record<string, string | undefined>, fn: () => T): T;
|
|
18
|
+
/** Runs `fn` with no log context (a handler that must not carry its registrant's fields). */
|
|
19
|
+
export declare function withoutLogContext<T>(fn: () => T): T;
|
|
20
|
+
/** The part of a BullMQ job the context reads. */
|
|
21
|
+
export interface ContextJob {
|
|
22
|
+
id?: string | undefined;
|
|
23
|
+
data?: unknown;
|
|
24
|
+
}
|
|
25
|
+
/** Hooks around every queue job (the tracing bootstrap wraps jobs in a span through this). */
|
|
26
|
+
export type JobWrapper = <T>(queue: string, job: ContextJob, fn: () => Promise<T>) => Promise<T>;
|
|
27
|
+
/** Registers a wrapper run around every job processor (tracing); undefined removes it. */
|
|
28
|
+
export declare function setJobWrapper(wrapper: JobWrapper | undefined): void;
|
|
29
|
+
/**
|
|
30
|
+
* Runs a queue job's processor with `queue`, `jobId` and, when the job data has one, `runId` in the
|
|
31
|
+
* log context (and inside the registered job wrapper, if any).
|
|
32
|
+
*/
|
|
33
|
+
export declare function withJobContext<T>(queue: string, job: ContextJob, fn: () => Promise<T>): Promise<T>;
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
const storage = new AsyncLocalStorage();
|
|
3
|
+
let traceSource;
|
|
4
|
+
/** The fields of the current context (plus the trace source's), or undefined outside any. */
|
|
5
|
+
export function logContext() {
|
|
6
|
+
const own = storage.getStore();
|
|
7
|
+
const trace = traceSource?.();
|
|
8
|
+
if (!trace)
|
|
9
|
+
return own;
|
|
10
|
+
return own ? { ...own, ...trace } : trace;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Registers the source of trace fields (`traceId` / `spanId`); set by the tracing bootstrap only
|
|
14
|
+
* when tracing is enabled, so the kernel never imports OpenTelemetry itself.
|
|
15
|
+
*/
|
|
16
|
+
export function setTraceContextSource(source) {
|
|
17
|
+
traceSource = source;
|
|
18
|
+
}
|
|
19
|
+
/** Runs `fn` with `fields` added to the current context (undefined values are skipped). */
|
|
20
|
+
export function withLogContext(fields, fn) {
|
|
21
|
+
const next = { ...storage.getStore() };
|
|
22
|
+
for (const [k, v] of Object.entries(fields))
|
|
23
|
+
if (v !== undefined)
|
|
24
|
+
next[k] = v;
|
|
25
|
+
return storage.run(next, fn);
|
|
26
|
+
}
|
|
27
|
+
/** Runs `fn` with no log context (a handler that must not carry its registrant's fields). */
|
|
28
|
+
export function withoutLogContext(fn) {
|
|
29
|
+
return storage.exit(fn);
|
|
30
|
+
}
|
|
31
|
+
let jobWrapper;
|
|
32
|
+
/** Registers a wrapper run around every job processor (tracing); undefined removes it. */
|
|
33
|
+
export function setJobWrapper(wrapper) {
|
|
34
|
+
jobWrapper = wrapper;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Runs a queue job's processor with `queue`, `jobId` and, when the job data has one, `runId` in the
|
|
38
|
+
* log context (and inside the registered job wrapper, if any).
|
|
39
|
+
*/
|
|
40
|
+
export function withJobContext(queue, job, fn) {
|
|
41
|
+
const data = job.data;
|
|
42
|
+
const runId = typeof data?.runId === "string" ? data.runId : undefined;
|
|
43
|
+
return withLogContext({ queue, jobId: job.id, runId }, () => jobWrapper ? jobWrapper(queue, job, fn) : fn());
|
|
44
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Loki output of the kernel logger (`log.loki.*`). */
|
|
2
|
+
export interface LokiOptions {
|
|
3
|
+
/** Loki base URL (`http://loki:3100`) or the full push URL (`…/loki/api/v1/push`). */
|
|
4
|
+
url: string;
|
|
5
|
+
username?: string;
|
|
6
|
+
password?: string;
|
|
7
|
+
/** Extra stream labels; `role` and `level` are always the record's own. */
|
|
8
|
+
labels: Record<string, string>;
|
|
9
|
+
/** The `role` label: the process's roles joined by `,`. */
|
|
10
|
+
role: string;
|
|
11
|
+
/** Push interval in ms; default 2000. */
|
|
12
|
+
intervalMs?: number;
|
|
13
|
+
/** Records kept while Loki is slow or down; the oldest are dropped beyond it. Default 10000. */
|
|
14
|
+
maxBuffer?: number;
|
|
15
|
+
/** Where push failures are reported (at most once per minute); default stderr. */
|
|
16
|
+
onError?: (message: string) => void;
|
|
17
|
+
/** Clock for the error rate limit (tests). */
|
|
18
|
+
now?: () => number;
|
|
19
|
+
}
|
|
20
|
+
/** A pino destination that batches records and pushes them to Loki. */
|
|
21
|
+
export interface LokiStream {
|
|
22
|
+
write(line: string): void;
|
|
23
|
+
/** Pushes everything buffered (waits for a push in flight first). Never rejects. */
|
|
24
|
+
flush(): Promise<void>;
|
|
25
|
+
/** Flushes and stops the interval. */
|
|
26
|
+
close(): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Batches JSON log lines and POSTs them to Loki's push API (JSON body), one stream per level with
|
|
30
|
+
* the labels `{ job: "capybara", ...labels, role, level }`. Pushing never blocks or throws into the
|
|
31
|
+
* caller: a failed push drops its batch and is reported to `onError` at most once per minute; while
|
|
32
|
+
* Loki is down at most `maxBuffer` records are kept. The interval timer is unref'd.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createLokiStream(opts: LokiOptions): LokiStream;
|