@capybara-hq/kernel 0.1.0-rc.1 → 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/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 -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 +10 -4
- 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 -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 +2 -2
- 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/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 -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 +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 +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 +451 -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 +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 -137
- 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 -226
- 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 -100
- 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 +2 -1
- 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 +9 -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,13 @@
|
|
|
1
|
+
import { type DynamicModule } from "@nestjs/common";
|
|
2
|
+
import type { KernelConfig } from "../../config/schema.js";
|
|
3
|
+
export interface ConfigModuleOptions {
|
|
4
|
+
/** Environment overrides re-applied on reload; default `process.env`. */
|
|
5
|
+
env?: NodeJS.ProcessEnv;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Global: `KernelConfigService` for the startup config and the master `KEYRING`. Needs
|
|
9
|
+
* `LoggingModule` in the same app.
|
|
10
|
+
*/
|
|
11
|
+
export declare class ConfigModule {
|
|
12
|
+
static forRoot(config: KernelConfig, opts?: ConfigModuleOptions): DynamicModule;
|
|
13
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
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 ConfigModule_1;
|
|
8
|
+
import { Global, Module } from "@nestjs/common";
|
|
9
|
+
import { createKeyring } from "../../ctx/secrets.js";
|
|
10
|
+
import { KERNEL_CONFIG_INPUT, KEYRING } from "../tokens.js";
|
|
11
|
+
import { KernelConfigService } from "./kernel-config.service.js";
|
|
12
|
+
/**
|
|
13
|
+
* Global: `KernelConfigService` for the startup config and the master `KEYRING`. Needs
|
|
14
|
+
* `LoggingModule` in the same app.
|
|
15
|
+
*/
|
|
16
|
+
let ConfigModule = ConfigModule_1 = class ConfigModule {
|
|
17
|
+
static forRoot(config, opts = {}) {
|
|
18
|
+
return {
|
|
19
|
+
module: ConfigModule_1,
|
|
20
|
+
global: true,
|
|
21
|
+
providers: [
|
|
22
|
+
{ provide: KERNEL_CONFIG_INPUT, useValue: { config, env: opts.env } },
|
|
23
|
+
KernelConfigService,
|
|
24
|
+
{
|
|
25
|
+
// the master key is not hot: the keyring of the startup config
|
|
26
|
+
provide: KEYRING,
|
|
27
|
+
useFactory: () => createKeyring(Buffer.from(config.masterKey, "base64"), config.masterKeyPrevious.map((k) => Buffer.from(k, "base64"))),
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
exports: [KernelConfigService, KEYRING],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
ConfigModule = ConfigModule_1 = __decorate([
|
|
35
|
+
Global(),
|
|
36
|
+
Module({})
|
|
37
|
+
// biome-ignore lint/complexity/noStaticOnlyClass: a Nest dynamic module
|
|
38
|
+
], ConfigModule);
|
|
39
|
+
export { ConfigModule };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type KernelConfig } from "../../config/schema.js";
|
|
2
|
+
import type { KernelLogger } from "../../log.js";
|
|
3
|
+
export interface KernelConfigInput {
|
|
4
|
+
/** The validated startup config. */
|
|
5
|
+
config: KernelConfig;
|
|
6
|
+
/** The environment overrides re-applied on every reload (default `process.env`). */
|
|
7
|
+
env?: NodeJS.ProcessEnv;
|
|
8
|
+
}
|
|
9
|
+
export type ConfigChangeListener = (next: KernelConfig, changed: string[]) => void;
|
|
10
|
+
/** The current kernel config: `get()` always returns the latest hot-applied value. */
|
|
11
|
+
export declare class KernelConfigService {
|
|
12
|
+
private readonly log;
|
|
13
|
+
private current;
|
|
14
|
+
private readonly env;
|
|
15
|
+
private readonly listeners;
|
|
16
|
+
constructor(input: KernelConfigInput, log: KernelLogger);
|
|
17
|
+
get(): KernelConfig;
|
|
18
|
+
/** Subscribes to applied changes (hot fields only); returns the unsubscribe function. */
|
|
19
|
+
onChange(listener: ConfigChangeListener): () => void;
|
|
20
|
+
/**
|
|
21
|
+
* Hot reload: re-validates the raw config; only hot fields are applied, other changes warn and
|
|
22
|
+
* list the keys needing a restart; a validation failure keeps the current config.
|
|
23
|
+
*/
|
|
24
|
+
apply(raw: unknown): void;
|
|
25
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
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 { Inject, Injectable } from "@nestjs/common";
|
|
11
|
+
import { changedPaths, configFields, getPath, secretValues, setPath } from "../../config/fields.js";
|
|
12
|
+
import { resolveConfig } from "../../config/load.js";
|
|
13
|
+
import { KernelConfigSchema } from "../../config/schema.js";
|
|
14
|
+
import { KERNEL_CONFIG_INPUT, KERNEL_LOGGER } from "../tokens.js";
|
|
15
|
+
/**
|
|
16
|
+
* Appliers of the hot-reloadable fields: the key is a dotted path marked `hot` in the schema. A
|
|
17
|
+
* hot field without an applier here makes the service refuse to start, so "marked hot but never
|
|
18
|
+
* takes effect" cannot happen.
|
|
19
|
+
*/
|
|
20
|
+
const HOT_APPLIERS = {
|
|
21
|
+
"log.level": (k, v) => k.log.setLevel(String(v)),
|
|
22
|
+
// The runtime reads the concurrency cap through the config service on every quota request.
|
|
23
|
+
"runtime.orgConcurrency": () => { },
|
|
24
|
+
// Eval org concurrency is read the same way at every quota request.
|
|
25
|
+
"evals.orgConcurrency": () => { },
|
|
26
|
+
// Login methods and trusted identity sources are read on every request.
|
|
27
|
+
"auth.loginSources": () => { },
|
|
28
|
+
"auth.trustedIdentitySources": () => { },
|
|
29
|
+
// The hook registry reads the time limit on every run.
|
|
30
|
+
"hooks.timeoutMs": () => { },
|
|
31
|
+
// SandboxService reads the shared-lease cap at every acquisition.
|
|
32
|
+
"sandbox.maxConcurrentCommands": () => { },
|
|
33
|
+
// Sub-agent limits are read at every dispatch, child step and tool resolution.
|
|
34
|
+
"subagents.maxConcurrentPerRun": () => { },
|
|
35
|
+
"subagents.maxDispatchesPerRun": () => { },
|
|
36
|
+
"subagents.maxTokensPerRun": () => { },
|
|
37
|
+
};
|
|
38
|
+
const HOT_PATHS = configFields(KernelConfigSchema)
|
|
39
|
+
.filter((f) => f.meta?.hot)
|
|
40
|
+
.map((f) => f.path);
|
|
41
|
+
const errMsg = (e) => (e instanceof Error ? e.message : String(e));
|
|
42
|
+
/** The current kernel config: `get()` always returns the latest hot-applied value. */
|
|
43
|
+
let KernelConfigService = class KernelConfigService {
|
|
44
|
+
log;
|
|
45
|
+
current;
|
|
46
|
+
env;
|
|
47
|
+
listeners = new Set();
|
|
48
|
+
constructor(input, log) {
|
|
49
|
+
this.log = log;
|
|
50
|
+
for (const p of HOT_PATHS) {
|
|
51
|
+
if (!HOT_APPLIERS[p])
|
|
52
|
+
throw new Error(`config field ${p} is marked hot but has no applier`);
|
|
53
|
+
}
|
|
54
|
+
this.current = input.config;
|
|
55
|
+
this.env = input.env ?? process.env;
|
|
56
|
+
log.setLevel(input.config.log.level);
|
|
57
|
+
log.addSecrets(secretValues(KernelConfigSchema, input.config));
|
|
58
|
+
}
|
|
59
|
+
get() {
|
|
60
|
+
return this.current;
|
|
61
|
+
}
|
|
62
|
+
/** Subscribes to applied changes (hot fields only); returns the unsubscribe function. */
|
|
63
|
+
onChange(listener) {
|
|
64
|
+
this.listeners.add(listener);
|
|
65
|
+
return () => {
|
|
66
|
+
this.listeners.delete(listener);
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Hot reload: re-validates the raw config; only hot fields are applied, other changes warn and
|
|
71
|
+
* list the keys needing a restart; a validation failure keeps the current config.
|
|
72
|
+
*/
|
|
73
|
+
apply(raw) {
|
|
74
|
+
const log = this.log;
|
|
75
|
+
let next;
|
|
76
|
+
try {
|
|
77
|
+
next = resolveConfig(raw, this.env);
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
log.error("config reload rejected; keeping current config", { error: errMsg(e) });
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
log.addSecrets(secretValues(KernelConfigSchema, next));
|
|
84
|
+
const changed = changedPaths(KernelConfigSchema, this.current, next);
|
|
85
|
+
if (changed.length === 0)
|
|
86
|
+
return;
|
|
87
|
+
const hot = changed.filter((p) => HOT_PATHS.includes(p));
|
|
88
|
+
const restart = changed.filter((p) => !HOT_PATHS.includes(p));
|
|
89
|
+
const updated = structuredClone(this.current);
|
|
90
|
+
const applied = [];
|
|
91
|
+
for (const p of hot) {
|
|
92
|
+
try {
|
|
93
|
+
HOT_APPLIERS[p]({ log }, getPath(next, p));
|
|
94
|
+
setPath(updated, p, getPath(next, p));
|
|
95
|
+
applied.push(p);
|
|
96
|
+
}
|
|
97
|
+
catch (e) {
|
|
98
|
+
log.error("config reload: cannot apply field; keeping current value", {
|
|
99
|
+
key: p,
|
|
100
|
+
error: errMsg(e),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
this.current = updated;
|
|
105
|
+
if (applied.length > 0) {
|
|
106
|
+
log.info("config reloaded", { applied });
|
|
107
|
+
for (const l of [...this.listeners]) {
|
|
108
|
+
try {
|
|
109
|
+
l(updated, applied);
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
log.error("config change listener threw", { error: errMsg(e) });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (restart.length > 0) {
|
|
117
|
+
log.warn("config changed but requires restart to take effect", { keys: restart });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
KernelConfigService = __decorate([
|
|
122
|
+
Injectable(),
|
|
123
|
+
__param(0, Inject(KERNEL_CONFIG_INPUT)),
|
|
124
|
+
__param(1, Inject(KERNEL_LOGGER))
|
|
125
|
+
], KernelConfigService);
|
|
126
|
+
export { KernelConfigService };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs a side effect (enqueue a job, publish on the bus) only after the root transaction commits;
|
|
3
|
+
* a rollback drops it; it runs outside any transaction. Outside a transaction it runs immediately.
|
|
4
|
+
* A failing hook is logged and never fails the committed call.
|
|
5
|
+
*/
|
|
6
|
+
export declare function afterCommit(fn: () => void | Promise<void>): void;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { queueAfterCommit } from "./transaction-host.js";
|
|
2
|
+
/**
|
|
3
|
+
* Runs a side effect (enqueue a job, publish on the bus) only after the root transaction commits;
|
|
4
|
+
* a rollback drops it; it runs outside any transaction. Outside a transaction it runs immediately.
|
|
5
|
+
* A failing hook is logged and never fails the committed call.
|
|
6
|
+
*/
|
|
7
|
+
export function afterCommit(fn) {
|
|
8
|
+
queueAfterCommit(fn);
|
|
9
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type DynamicModule } from "@nestjs/common";
|
|
2
|
+
import type { Kysely } from "kysely";
|
|
3
|
+
import type { KernelLogger } from "../../log.js";
|
|
4
|
+
import { GracefulShutdown } from "../lifecycle/graceful-shutdown.service.js";
|
|
5
|
+
/**
|
|
6
|
+
* Closes the pool at the end of the shutdown (`GracefulShutdown.closeLast`: after everything that
|
|
7
|
+
* uses it has stopped, together with Redis), within what is left of the total stop budget.
|
|
8
|
+
*/
|
|
9
|
+
export declare class PoolLifecycle {
|
|
10
|
+
private readonly pool;
|
|
11
|
+
private readonly log;
|
|
12
|
+
private readonly shutdown;
|
|
13
|
+
constructor(pool: Kysely<any>, log: KernelLogger, shutdown: GracefulShutdown);
|
|
14
|
+
close(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
/** Global: the Kysely pool, `TransactionHost`, the context-aware `KernelDb` and `XactLock`. */
|
|
17
|
+
export declare class DatabaseModule {
|
|
18
|
+
/** The pool `db.*` of the config describes, closed at shutdown ({@link PoolLifecycle}). */
|
|
19
|
+
static forRoot(): DynamicModule;
|
|
20
|
+
/**
|
|
21
|
+
* The handles over a pool the caller owns and closes (`@capybara-hq/testing`'s
|
|
22
|
+
* `createLocalAccount`, which has a pool and no config): the context never closes it.
|
|
23
|
+
*/
|
|
24
|
+
static borrowing(pool: Kysely<any>): DynamicModule;
|
|
25
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
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 { Global, Inject, Injectable, Module, } from "@nestjs/common";
|
|
11
|
+
import { createDb } from "../../db/pool.js";
|
|
12
|
+
import { closeWithin } from "../close-within.js";
|
|
13
|
+
import { KernelConfigService } from "../config/kernel-config.service.js";
|
|
14
|
+
import { GracefulShutdownModule } from "../lifecycle/graceful-shutdown.module.js";
|
|
15
|
+
import { GracefulShutdown } from "../lifecycle/graceful-shutdown.service.js";
|
|
16
|
+
import { KERNEL_LOGGER, KERNEL_POOL } from "../tokens.js";
|
|
17
|
+
import { KernelDb } from "./kernel-db.js";
|
|
18
|
+
import { TransactionHost } from "./transaction-host.js";
|
|
19
|
+
import { XactLock } from "./xact-lock.js";
|
|
20
|
+
/**
|
|
21
|
+
* Closes the pool at the end of the shutdown (`GracefulShutdown.closeLast`: after everything that
|
|
22
|
+
* uses it has stopped, together with Redis), within what is left of the total stop budget.
|
|
23
|
+
*/
|
|
24
|
+
let PoolLifecycle = class PoolLifecycle {
|
|
25
|
+
pool;
|
|
26
|
+
log;
|
|
27
|
+
shutdown;
|
|
28
|
+
constructor(
|
|
29
|
+
// biome-ignore lint/suspicious/noExplicitAny: the pool carries no schema types
|
|
30
|
+
pool, log, shutdown) {
|
|
31
|
+
this.pool = pool;
|
|
32
|
+
this.log = log;
|
|
33
|
+
this.shutdown = shutdown;
|
|
34
|
+
shutdown.closeLast(() => this.close());
|
|
35
|
+
}
|
|
36
|
+
async close() {
|
|
37
|
+
await closeWithin("pg", this.pool.destroy(), this.shutdown.remainingMs(), this.log);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
PoolLifecycle = __decorate([
|
|
41
|
+
Injectable(),
|
|
42
|
+
__param(0, Inject(KERNEL_POOL)),
|
|
43
|
+
__param(1, Inject(KERNEL_LOGGER)),
|
|
44
|
+
__param(2, Inject(GracefulShutdown))
|
|
45
|
+
], PoolLifecycle);
|
|
46
|
+
export { PoolLifecycle };
|
|
47
|
+
/** The handles over the pool, the same for both pool sources. */
|
|
48
|
+
function databaseModule(pool, imports) {
|
|
49
|
+
return {
|
|
50
|
+
module: DatabaseModule,
|
|
51
|
+
global: true,
|
|
52
|
+
imports,
|
|
53
|
+
providers: [...pool, TransactionHost, KernelDb, XactLock],
|
|
54
|
+
exports: [KERNEL_POOL, TransactionHost, KernelDb, XactLock],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/** Global: the Kysely pool, `TransactionHost`, the context-aware `KernelDb` and `XactLock`. */
|
|
58
|
+
let DatabaseModule = class DatabaseModule {
|
|
59
|
+
/** The pool `db.*` of the config describes, closed at shutdown ({@link PoolLifecycle}). */
|
|
60
|
+
static forRoot() {
|
|
61
|
+
return databaseModule([
|
|
62
|
+
{
|
|
63
|
+
provide: KERNEL_POOL,
|
|
64
|
+
inject: [KernelConfigService, KERNEL_LOGGER],
|
|
65
|
+
useFactory: (config, log) => {
|
|
66
|
+
const { db } = config.get();
|
|
67
|
+
return createDb(db.url, db.poolMax, (err) => log.error("pg idle client error", { err }), {
|
|
68
|
+
connectTimeoutMs: db.connectTimeoutMs,
|
|
69
|
+
onClientError: (err) => log.warn("pg client error", { err }),
|
|
70
|
+
});
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
PoolLifecycle,
|
|
74
|
+
], [GracefulShutdownModule]);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The handles over a pool the caller owns and closes (`@capybara-hq/testing`'s
|
|
78
|
+
* `createLocalAccount`, which has a pool and no config): the context never closes it.
|
|
79
|
+
*/
|
|
80
|
+
// biome-ignore lint/suspicious/noExplicitAny: the pool carries no schema types
|
|
81
|
+
static borrowing(pool) {
|
|
82
|
+
return databaseModule([{ provide: KERNEL_POOL, useValue: pool }], []);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
DatabaseModule = __decorate([
|
|
86
|
+
Global(),
|
|
87
|
+
Module({})
|
|
88
|
+
// biome-ignore lint/complexity/noStaticOnlyClass: a Nest dynamic module
|
|
89
|
+
], DatabaseModule);
|
|
90
|
+
export { DatabaseModule };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Kysely, Transaction } from "kysely";
|
|
2
|
+
import { type KernelDatabase } from "../../db/kernel-schema.js";
|
|
3
|
+
import { TransactionHost } from "./transaction-host.js";
|
|
4
|
+
type View = Kysely<KernelDatabase>;
|
|
5
|
+
/** The Kysely query entry points services use; each resolves to the context transaction or the pool. */
|
|
6
|
+
declare const QUERY_METHODS: readonly ["selectFrom", "selectNoFrom", "insertInto", "replaceInto", "updateTable", "deleteFrom", "mergeInto", "with", "withRecursive", "executeQuery"];
|
|
7
|
+
type QueryMethod = (typeof QUERY_METHODS)[number];
|
|
8
|
+
export interface KernelDb extends Pick<View, QueryMethod | "fn"> {
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* What services inject instead of a Kysely instance: every call resolves to the transaction of
|
|
12
|
+
* the current async context (opened by `@Transactional()`), else to the pool; the `capybara`
|
|
13
|
+
* schema view applies either way. No `trx` parameters are passed around.
|
|
14
|
+
*/
|
|
15
|
+
export declare class KernelDb {
|
|
16
|
+
readonly pool: Kysely<any>;
|
|
17
|
+
private readonly txHost;
|
|
18
|
+
constructor(pool: Kysely<any>, txHost: TransactionHost);
|
|
19
|
+
/** The kernel-schema handle of the current context (transaction or pool). */
|
|
20
|
+
get db(): View | Transaction<KernelDatabase>;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
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 { Inject, Injectable } from "@nestjs/common";
|
|
11
|
+
import { kernelDb } from "../../db/kernel-schema.js";
|
|
12
|
+
import { KERNEL_POOL } from "../tokens.js";
|
|
13
|
+
import { TransactionHost } from "./transaction-host.js";
|
|
14
|
+
/** The Kysely query entry points services use; each resolves to the context transaction or the pool. */
|
|
15
|
+
const QUERY_METHODS = [
|
|
16
|
+
"selectFrom",
|
|
17
|
+
"selectNoFrom",
|
|
18
|
+
"insertInto",
|
|
19
|
+
"replaceInto",
|
|
20
|
+
"updateTable",
|
|
21
|
+
"deleteFrom",
|
|
22
|
+
"mergeInto",
|
|
23
|
+
"with",
|
|
24
|
+
"withRecursive",
|
|
25
|
+
"executeQuery",
|
|
26
|
+
];
|
|
27
|
+
/**
|
|
28
|
+
* What services inject instead of a Kysely instance: every call resolves to the transaction of
|
|
29
|
+
* the current async context (opened by `@Transactional()`), else to the pool; the `capybara`
|
|
30
|
+
* schema view applies either way. No `trx` parameters are passed around.
|
|
31
|
+
*/
|
|
32
|
+
let KernelDb = class KernelDb {
|
|
33
|
+
pool;
|
|
34
|
+
txHost;
|
|
35
|
+
constructor(
|
|
36
|
+
// biome-ignore lint/suspicious/noExplicitAny: the pool carries no schema types
|
|
37
|
+
pool, txHost) {
|
|
38
|
+
this.pool = pool;
|
|
39
|
+
this.txHost = txHost;
|
|
40
|
+
}
|
|
41
|
+
/** The kernel-schema handle of the current context (transaction or pool). */
|
|
42
|
+
get db() {
|
|
43
|
+
return kernelDb(this.txHost.current() ?? this.pool);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
KernelDb = __decorate([
|
|
47
|
+
Injectable()
|
|
48
|
+
// biome-ignore lint/suspicious/noUnsafeDeclarationMerging: types the prototype-attached query methods
|
|
49
|
+
,
|
|
50
|
+
__param(0, Inject(KERNEL_POOL)),
|
|
51
|
+
__param(1, Inject(TransactionHost))
|
|
52
|
+
], KernelDb);
|
|
53
|
+
export { KernelDb };
|
|
54
|
+
for (const name of QUERY_METHODS) {
|
|
55
|
+
Object.defineProperty(KernelDb.prototype, name, {
|
|
56
|
+
value(...args) {
|
|
57
|
+
return this.db[name](...args);
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
Object.defineProperty(KernelDb.prototype, "fn", {
|
|
62
|
+
get() {
|
|
63
|
+
return this.db.fn;
|
|
64
|
+
},
|
|
65
|
+
});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { AccessMode, IsolationLevel, Kysely, Transaction } from "kysely";
|
|
2
|
+
import type { KernelLogger } from "../../log.js";
|
|
3
|
+
type AfterCommitHook = () => void | Promise<void>;
|
|
4
|
+
interface TransactionStore {
|
|
5
|
+
pool: Kysely<any>;
|
|
6
|
+
trx: Transaction<any>;
|
|
7
|
+
/** Side effects queued by `afterCommit`, run after this root transaction commits. */
|
|
8
|
+
hooks: AfterCommitHook[];
|
|
9
|
+
/** Set once the transaction settled: continuations that outlive it must not use it. */
|
|
10
|
+
done: boolean;
|
|
11
|
+
}
|
|
12
|
+
export type Propagation = "required" | "requires_new" | "mandatory";
|
|
13
|
+
export interface TransactionOptions {
|
|
14
|
+
/**
|
|
15
|
+
* `required` (default): join the transaction in context, else open one. `requires_new`: a
|
|
16
|
+
* separate transaction on the pool, whatever the context. `mandatory`: join the transaction in
|
|
17
|
+
* context, and throw outside one (for methods whose correctness depends on a lock the caller
|
|
18
|
+
* took in its transaction).
|
|
19
|
+
*/
|
|
20
|
+
propagation?: Propagation;
|
|
21
|
+
/** Isolation level of a transaction this call opens (ignored when it joins one). */
|
|
22
|
+
isolationLevel?: IsolationLevel;
|
|
23
|
+
/** Access mode of a transaction this call opens (ignored when it joins one). */
|
|
24
|
+
accessMode?: AccessMode;
|
|
25
|
+
}
|
|
26
|
+
/** Queues `fn` on the current live root transaction; with none open, runs it at once. */
|
|
27
|
+
export declare function queueAfterCommit(fn: AfterCommitHook): void;
|
|
28
|
+
/** The transaction store in the current async context (used by `afterCommit`). */
|
|
29
|
+
export declare function currentStore(): TransactionStore | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Runs `fn` with no transaction in context, whatever the caller had open. Queue processors and
|
|
32
|
+
* scheduled jobs start from here: a job outlives the transaction that enqueued it and must never
|
|
33
|
+
* join (or write through) a transaction that may already be committed or rolled back.
|
|
34
|
+
*/
|
|
35
|
+
export declare function runOutsideTransaction<T>(fn: () => T): T;
|
|
36
|
+
export declare class TransactionHost {
|
|
37
|
+
private readonly pool;
|
|
38
|
+
private readonly log;
|
|
39
|
+
constructor(pool: Kysely<any>, log: KernelLogger);
|
|
40
|
+
/** The transaction of the current async context on this pool, if any. */
|
|
41
|
+
current(): Transaction<any> | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Runs `fn` in a transaction: a throw rolls back, a return commits. REQUIRED (default) joins the
|
|
44
|
+
* transaction in context; `requires_new` always opens its own on the pool; `mandatory` joins the
|
|
45
|
+
* one in context and throws when there is none. Hooks queued by `afterCommit` run after the
|
|
46
|
+
* root's COMMIT, outside any transaction, and are dropped on rollback.
|
|
47
|
+
*/
|
|
48
|
+
run<T>(fn: () => Promise<T>, opts?: TransactionOptions): Promise<T>;
|
|
49
|
+
}
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,125 @@
|
|
|
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
|
+
// Ported from octok-platform libs/common/src/typeorm/transaction-context.ts (owner-approved, 2026-10-28).
|
|
11
|
+
// Adapted to Kysely: the context holds a Kysely `Transaction` instead of a TypeORM QueryRunner.
|
|
12
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
13
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
14
|
+
import { KERNEL_LOGGER, KERNEL_POOL } from "../tokens.js";
|
|
15
|
+
/** One store for the process: `afterCommit` (a free function) reads it without a host instance. */
|
|
16
|
+
const storage = new AsyncLocalStorage();
|
|
17
|
+
/** Logger for hook failures outside a transaction; set by `TransactionHost`, console until then. */
|
|
18
|
+
let hookLog = {
|
|
19
|
+
error: (msg, fields) => console.error(`[afterCommit] ${msg}`, fields ?? ""),
|
|
20
|
+
};
|
|
21
|
+
const errMsg = (e) => (e instanceof Error ? e.message : String(e));
|
|
22
|
+
/** Queues `fn` on the current live root transaction; with none open, runs it at once. */
|
|
23
|
+
export function queueAfterCommit(fn) {
|
|
24
|
+
const store = liveStore();
|
|
25
|
+
if (store) {
|
|
26
|
+
store.hooks.push(fn);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const r = fn();
|
|
31
|
+
if (r instanceof Promise) {
|
|
32
|
+
r.catch((e) => hookLog.error("afterCommit hook failed", { error: errMsg(e) }));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
hookLog.error("afterCommit hook failed", { error: errMsg(e) });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** The store of the current context unless its transaction already finished. */
|
|
40
|
+
function liveStore() {
|
|
41
|
+
const store = storage.getStore();
|
|
42
|
+
return store && !store.done ? store : undefined;
|
|
43
|
+
}
|
|
44
|
+
/** The transaction store in the current async context (used by `afterCommit`). */
|
|
45
|
+
export function currentStore() {
|
|
46
|
+
return liveStore();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Runs `fn` with no transaction in context, whatever the caller had open. Queue processors and
|
|
50
|
+
* scheduled jobs start from here: a job outlives the transaction that enqueued it and must never
|
|
51
|
+
* join (or write through) a transaction that may already be committed or rolled back.
|
|
52
|
+
*/
|
|
53
|
+
export function runOutsideTransaction(fn) {
|
|
54
|
+
return storage.exit(fn);
|
|
55
|
+
}
|
|
56
|
+
let TransactionHost = class TransactionHost {
|
|
57
|
+
pool;
|
|
58
|
+
log;
|
|
59
|
+
constructor(
|
|
60
|
+
// biome-ignore lint/suspicious/noExplicitAny: the pool carries no schema types
|
|
61
|
+
pool, log) {
|
|
62
|
+
this.pool = pool;
|
|
63
|
+
this.log = log;
|
|
64
|
+
hookLog = log;
|
|
65
|
+
}
|
|
66
|
+
/** The transaction of the current async context on this pool, if any. */
|
|
67
|
+
// biome-ignore lint/suspicious/noExplicitAny: the pool carries no schema types
|
|
68
|
+
current() {
|
|
69
|
+
const store = liveStore();
|
|
70
|
+
return store?.pool === this.pool ? store.trx : undefined;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Runs `fn` in a transaction: a throw rolls back, a return commits. REQUIRED (default) joins the
|
|
74
|
+
* transaction in context; `requires_new` always opens its own on the pool; `mandatory` joins the
|
|
75
|
+
* one in context and throws when there is none. Hooks queued by `afterCommit` run after the
|
|
76
|
+
* root's COMMIT, outside any transaction, and are dropped on rollback.
|
|
77
|
+
*/
|
|
78
|
+
async run(fn, opts = {}) {
|
|
79
|
+
const propagation = opts.propagation ?? "required";
|
|
80
|
+
if (propagation === "mandatory") {
|
|
81
|
+
if (!this.current()) {
|
|
82
|
+
throw new Error('propagation "mandatory": no transaction in context (the caller must open one and ' +
|
|
83
|
+
"hold the locks this method relies on)");
|
|
84
|
+
}
|
|
85
|
+
return fn();
|
|
86
|
+
}
|
|
87
|
+
if (propagation === "required" && this.current())
|
|
88
|
+
return fn();
|
|
89
|
+
const hooks = [];
|
|
90
|
+
let store;
|
|
91
|
+
let result;
|
|
92
|
+
try {
|
|
93
|
+
let builder = this.pool.transaction();
|
|
94
|
+
if (opts.isolationLevel !== undefined)
|
|
95
|
+
builder = builder.setIsolationLevel(opts.isolationLevel);
|
|
96
|
+
if (opts.accessMode !== undefined)
|
|
97
|
+
builder = builder.setAccessMode(opts.accessMode);
|
|
98
|
+
result = await builder.execute((trx) => {
|
|
99
|
+
store = { pool: this.pool, trx, hooks, done: false };
|
|
100
|
+
return storage.run(store, fn);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
if (store)
|
|
105
|
+
store.done = true;
|
|
106
|
+
}
|
|
107
|
+
for (const hook of hooks) {
|
|
108
|
+
try {
|
|
109
|
+
// outside any transaction: a requires_new nested in an outer one must not have its side
|
|
110
|
+
// effects join (and roll back with) the outer transaction
|
|
111
|
+
await runOutsideTransaction(hook);
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
this.log.error("afterCommit hook failed", { error: errMsg(e) });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
TransactionHost = __decorate([
|
|
121
|
+
Injectable(),
|
|
122
|
+
__param(0, Inject(KERNEL_POOL)),
|
|
123
|
+
__param(1, Inject(KERNEL_LOGGER))
|
|
124
|
+
], TransactionHost);
|
|
125
|
+
export { TransactionHost };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TransactionOptions } from "./transaction-host.js";
|
|
2
|
+
/**
|
|
3
|
+
* Method decorator: runs the method in a database transaction (REQUIRED by default: join the one
|
|
4
|
+
* in context, else open it; a throw rolls back, a normal return commits). The class must inject
|
|
5
|
+
* the host as a property named `txHost`:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* constructor(@Inject(TransactionHost) readonly txHost: TransactionHost) {}
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Use `{ propagation: "requires_new" }` for a transaction independent of the caller's, and
|
|
12
|
+
* `{ propagation: "mandatory" }` for a method whose correctness depends on a lock its caller holds
|
|
13
|
+
* (it joins the caller's transaction and throws when called outside one).
|
|
14
|
+
*/
|
|
15
|
+
export declare function Transactional(opts?: TransactionOptions): (_target: object, _key: string | symbol, descriptor: PropertyDescriptor) => PropertyDescriptor;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Method decorator: runs the method in a database transaction (REQUIRED by default: join the one
|
|
3
|
+
* in context, else open it; a throw rolls back, a normal return commits). The class must inject
|
|
4
|
+
* the host as a property named `txHost`:
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* constructor(@Inject(TransactionHost) readonly txHost: TransactionHost) {}
|
|
8
|
+
* ```
|
|
9
|
+
*
|
|
10
|
+
* Use `{ propagation: "requires_new" }` for a transaction independent of the caller's, and
|
|
11
|
+
* `{ propagation: "mandatory" }` for a method whose correctness depends on a lock its caller holds
|
|
12
|
+
* (it joins the caller's transaction and throws when called outside one).
|
|
13
|
+
*/
|
|
14
|
+
export function Transactional(opts = {}) {
|
|
15
|
+
return (_target, _key, descriptor) => {
|
|
16
|
+
const original = descriptor.value;
|
|
17
|
+
descriptor.value = function (...args) {
|
|
18
|
+
const host = this.txHost;
|
|
19
|
+
if (!host) {
|
|
20
|
+
throw new Error("@Transactional() needs the class to inject `TransactionHost` as `txHost` " +
|
|
21
|
+
"(`@Inject(TransactionHost) readonly txHost: TransactionHost`).");
|
|
22
|
+
}
|
|
23
|
+
return host.run(() => original.apply(this, args), opts);
|
|
24
|
+
};
|
|
25
|
+
return descriptor;
|
|
26
|
+
};
|
|
27
|
+
}
|