@capybara-hq/kernel 0.1.0-rc.1 → 0.1.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/admin.controller.d.ts +17 -17
- package/dist/admin/admin.controller.js +43 -26
- package/dist/admin/admin.module.d.ts +3 -0
- package/dist/admin/admin.module.js +22 -0
- package/dist/admin/extensions.controller.d.ts +14 -14
- package/dist/admin/extensions.controller.js +30 -17
- package/dist/admin/setup-lock.d.ts +16 -0
- package/dist/admin/setup-lock.js +47 -0
- package/dist/admin/setup.controller.d.ts +8 -8
- package/dist/admin/setup.controller.js +27 -25
- package/dist/admin/setup.service.d.ts +19 -27
- package/dist/admin/setup.service.js +61 -61
- package/dist/agents/agent-lookup.d.ts +53 -0
- package/dist/agents/agent-lookup.js +187 -0
- package/dist/agents/agents.controller.d.ts +1 -1
- package/dist/agents/agents.controller.js +14 -8
- package/dist/agents/agents.module.d.ts +7 -0
- package/dist/agents/agents.module.js +41 -0
- package/dist/agents/agents.service.d.ts +39 -58
- package/dist/agents/agents.service.js +280 -335
- package/dist/agents/definition.d.ts +39 -8
- package/dist/agents/definition.js +201 -17
- package/dist/agents/models.controller.d.ts +1 -1
- package/dist/agents/models.controller.js +2 -2
- package/dist/agents/templates.controller.d.ts +1 -1
- package/dist/agents/templates.controller.js +2 -2
- package/dist/agents/templates.d.ts +6 -8
- package/dist/agents/templates.js +39 -8
- package/dist/app.d.ts +93 -0
- package/dist/app.js +150 -0
- package/dist/catalog/admin-catalog.controller.d.ts +3 -3
- package/dist/catalog/admin-catalog.controller.js +27 -13
- package/dist/catalog/catalog-content.d.ts +185 -0
- package/dist/catalog/catalog-content.js +326 -0
- package/dist/catalog/catalog-items.d.ts +186 -0
- package/dist/catalog/catalog-items.js +410 -0
- package/dist/catalog/catalog.module.d.ts +14 -0
- package/dist/catalog/catalog.module.js +71 -0
- package/dist/catalog/catalog.service.d.ts +34 -188
- package/dist/catalog/catalog.service.js +155 -489
- package/dist/catalog/claude/agents.js +13 -10
- package/dist/catalog/cli.d.ts +3 -2
- package/dist/catalog/cli.js +13 -31
- package/dist/catalog/job-ids.d.ts +15 -0
- package/dist/catalog/job-ids.js +15 -0
- package/dist/catalog/jobs.d.ts +27 -0
- package/dist/catalog/jobs.js +70 -0
- package/dist/catalog/locks.d.ts +24 -0
- package/dist/catalog/locks.js +63 -0
- package/dist/catalog/marketplaces.controller.d.ts +4 -4
- package/dist/catalog/marketplaces.controller.js +22 -11
- package/dist/catalog/marketplaces.service.d.ts +31 -14
- package/dist/catalog/marketplaces.service.js +330 -256
- package/dist/catalog/org-catalog.controller.d.ts +4 -3
- package/dist/catalog/org-catalog.controller.js +29 -14
- package/dist/catalog/org-catalog.service.d.ts +32 -198
- package/dist/catalog/org-catalog.service.js +159 -400
- package/dist/catalog/plugin-import.d.ts +73 -34
- package/dist/catalog/plugin-import.js +356 -217
- package/dist/catalog/plugin-install.d.ts +83 -41
- package/dist/catalog/plugin-install.js +421 -269
- package/dist/catalog/plugin-upgrade.d.ts +59 -4
- package/dist/catalog/plugin-upgrade.js +407 -282
- package/dist/catalog/requests.service.d.ts +27 -15
- package/dist/catalog/requests.service.js +201 -145
- package/dist/catalog/upgrade-targets.d.ts +4 -7
- package/dist/channels/actions.d.ts +6 -4
- package/dist/channels/actions.js +1 -1
- package/dist/channels/cards.d.ts +10 -4
- package/dist/channels/cards.js +16 -8
- package/dist/channels/channels.module.d.ts +40 -0
- package/dist/channels/channels.module.js +128 -0
- package/dist/channels/connections.controller.d.ts +1 -1
- package/dist/channels/connections.controller.js +11 -6
- package/dist/channels/connections.service.d.ts +43 -21
- package/dist/channels/connections.service.js +236 -131
- package/dist/channels/inbound.d.ts +34 -38
- package/dist/channels/inbound.js +107 -41
- package/dist/channels/job-ids.d.ts +10 -0
- package/dist/channels/job-ids.js +10 -0
- package/dist/channels/jobs.d.ts +85 -0
- package/dist/channels/jobs.js +157 -0
- package/dist/channels/outbound.d.ts +60 -82
- package/dist/channels/outbound.js +165 -194
- package/dist/channels/supervisor.d.ts +88 -46
- package/dist/channels/supervisor.js +230 -132
- package/dist/channels/threads.d.ts +29 -8
- package/dist/channels/threads.js +71 -13
- package/dist/channels/webhook.d.ts +20 -14
- package/dist/channels/webhook.js +51 -20
- package/dist/config/load.d.ts +3 -2
- package/dist/config/load.js +3 -2
- package/dist/config/nacos-source.js +11 -2
- package/dist/config/schema.d.ts +1 -0
- package/dist/config/schema.js +12 -6
- package/dist/conversations/access.d.ts +29 -0
- package/dist/conversations/access.js +86 -0
- package/dist/conversations/artifacts.d.ts +11 -11
- package/dist/conversations/artifacts.js +36 -10
- package/dist/conversations/attachments.controller.d.ts +1 -1
- package/dist/conversations/attachments.controller.js +8 -6
- package/dist/conversations/attachments.module.d.ts +7 -0
- package/dist/conversations/attachments.module.js +25 -0
- package/dist/conversations/attachments.service.d.ts +30 -22
- package/dist/conversations/attachments.service.js +119 -46
- package/dist/conversations/conversations.controller.d.ts +8 -7
- package/dist/conversations/conversations.controller.js +59 -29
- package/dist/conversations/conversations.module.d.ts +8 -0
- package/dist/conversations/conversations.module.js +69 -0
- package/dist/conversations/conversations.service.d.ts +40 -38
- package/dist/conversations/conversations.service.js +130 -140
- package/dist/conversations/event-log.d.ts +39 -18
- package/dist/conversations/event-log.js +93 -27
- package/dist/conversations/events.d.ts +23 -3
- package/dist/conversations/events.js +26 -14
- package/dist/conversations/files.d.ts +10 -10
- package/dist/conversations/files.js +37 -11
- package/dist/conversations/idem-keys.d.ts +5 -0
- package/dist/conversations/idem-keys.js +5 -0
- package/dist/conversations/job-ids.d.ts +6 -0
- package/dist/conversations/job-ids.js +6 -0
- package/dist/conversations/outputs-read.d.ts +11 -11
- package/dist/conversations/outputs-read.js +31 -7
- package/dist/conversations/queue.d.ts +48 -56
- package/dist/conversations/queue.js +13 -289
- package/dist/conversations/queue.service.d.ts +60 -0
- package/dist/conversations/queue.service.js +343 -0
- package/dist/conversations/sandbox-status.d.ts +13 -10
- package/dist/conversations/sandbox-status.js +36 -8
- package/dist/conversations/titles.d.ts +71 -24
- package/dist/conversations/titles.js +159 -63
- package/dist/ctx/bus.js +9 -3
- package/dist/ctx/create-ctx.d.ts +6 -0
- package/dist/ctx/create-ctx.js +7 -9
- package/dist/ctx/lock.d.ts +7 -3
- package/dist/ctx/lock.js +9 -20
- package/dist/ctx/secrets.d.ts +10 -2
- package/dist/ctx/secrets.js +7 -3
- package/dist/db/kernel-schema.d.ts +4 -4
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +1 -0
- package/dist/errors.d.ts +1 -0
- package/dist/errors.js +1 -0
- package/dist/evals/budget.d.ts +42 -21
- package/dist/evals/budget.js +114 -62
- package/dist/evals/evals.module.d.ts +31 -0
- package/dist/evals/evals.module.js +114 -0
- package/dist/evals/jobs.d.ts +20 -0
- package/dist/evals/jobs.js +45 -0
- package/dist/evals/recorded-tools.d.ts +27 -1
- package/dist/evals/recorded-tools.js +85 -10
- package/dist/evals/run-replay.d.ts +61 -8
- package/dist/evals/run-replay.js +159 -85
- package/dist/evals/runs.controller.d.ts +1 -1
- package/dist/evals/runs.controller.js +17 -8
- package/dist/evals/runs.service.d.ts +23 -45
- package/dist/evals/runs.service.js +245 -234
- package/dist/evals/sets.controller.d.ts +1 -1
- package/dist/evals/sets.controller.js +17 -8
- package/dist/evals/sets.service.d.ts +22 -6
- package/dist/evals/sets.service.js +248 -194
- package/dist/evals/snapshot.d.ts +2 -2
- package/dist/evals/step-replay.d.ts +2 -2
- package/dist/evals/step-replay.js +1 -1
- package/dist/evals/trajectory.controller.d.ts +1 -1
- package/dist/evals/trajectory.controller.js +11 -7
- package/dist/evals/trajectory.d.ts +2 -2
- package/dist/evals/trajectory.service.d.ts +5 -4
- package/dist/evals/trajectory.service.js +30 -7
- package/dist/evals/worker.d.ts +44 -27
- package/dist/evals/worker.js +220 -121
- package/dist/extensions/admin-ops.d.ts +61 -33
- package/dist/extensions/admin-ops.js +248 -154
- package/dist/extensions/admin-view.d.ts +38 -27
- package/dist/extensions/admin-view.js +126 -55
- package/dist/extensions/approvals.d.ts +12 -8
- package/dist/extensions/approvals.js +73 -46
- package/dist/extensions/blobs.d.ts +27 -10
- package/dist/extensions/blobs.js +111 -45
- package/dist/extensions/bootstrap.d.ts +58 -31
- package/dist/extensions/bootstrap.js +175 -121
- package/dist/extensions/cli.d.ts +20 -10
- package/dist/extensions/cli.js +41 -96
- package/dist/extensions/config-issues.d.ts +7 -0
- package/dist/extensions/config-issues.js +31 -0
- package/dist/extensions/deployment-config-store.d.ts +49 -0
- package/dist/extensions/deployment-config-store.js +133 -0
- package/dist/extensions/deployment-config.d.ts +58 -67
- package/dist/extensions/deployment-config.js +202 -230
- package/dist/extensions/enabled.d.ts +5 -5
- package/dist/extensions/extensions.module.d.ts +8 -0
- package/dist/extensions/extensions.module.js +77 -0
- package/dist/extensions/hooks.d.ts +3 -2
- package/dist/extensions/hooks.js +1 -1
- package/dist/extensions/host.d.ts +72 -68
- package/dist/extensions/host.js +191 -152
- package/dist/extensions/installs.d.ts +49 -16
- package/dist/extensions/installs.js +128 -32
- package/dist/extensions/job-ids.d.ts +6 -0
- package/dist/extensions/job-ids.js +6 -0
- package/dist/extensions/lifecycle-topics.d.ts +18 -0
- package/dist/extensions/lifecycle-topics.js +18 -0
- package/dist/extensions/lifecycle.d.ts +35 -47
- package/dist/extensions/lifecycle.js +103 -39
- package/dist/extensions/locks.d.ts +33 -0
- package/dist/extensions/locks.js +86 -0
- package/dist/extensions/migrate-lock.d.ts +3 -4
- package/dist/extensions/org-config.controller.d.ts +1 -1
- package/dist/extensions/org-config.controller.js +8 -5
- package/dist/extensions/org-config.d.ts +48 -46
- package/dist/extensions/org-config.js +284 -226
- package/dist/extensions/registry.d.ts +50 -2
- package/dist/extensions/registry.js +89 -4
- package/dist/extensions/sources.d.ts +12 -8
- package/dist/extensions/sources.js +34 -13
- package/dist/files/files.module.d.ts +3 -0
- package/dist/files/files.module.js +22 -0
- package/dist/files/previewers.controller.d.ts +7 -2
- package/dist/files/previewers.controller.js +17 -9
- package/dist/files/previewers.d.ts +13 -18
- package/dist/files/previewers.js +83 -36
- package/dist/http/adapter.d.ts +3 -0
- package/dist/http/adapter.js +25 -0
- package/dist/http/api.module.d.ts +3 -110
- package/dist/http/api.module.js +47 -355
- package/dist/http/app.d.ts +11 -15
- package/dist/http/app.js +17 -62
- package/dist/http/error-filter.module.d.ts +5 -0
- package/dist/http/error-filter.module.js +18 -0
- package/dist/http/error.filter.js +2 -2
- package/dist/identity/accounts.d.ts +82 -29
- package/dist/identity/accounts.js +294 -175
- package/dist/identity/api-tokens.d.ts +11 -7
- package/dist/identity/api-tokens.js +71 -44
- package/dist/identity/audit.d.ts +7 -4
- package/dist/identity/audit.js +5 -1
- package/dist/identity/auth.controller.d.ts +11 -10
- package/dist/identity/auth.controller.js +31 -25
- package/dist/identity/auth.guard.d.ts +3 -3
- package/dist/identity/auth.guard.js +6 -4
- package/dist/identity/binding.d.ts +9 -11
- package/dist/identity/binding.js +41 -13
- package/dist/identity/enterprise-admin.d.ts +18 -12
- package/dist/identity/enterprise-admin.js +67 -13
- package/dist/identity/external-identity-lock.d.ts +17 -0
- package/dist/identity/external-identity-lock.js +39 -0
- package/dist/identity/external.d.ts +19 -15
- package/dist/identity/external.js +163 -125
- package/dist/identity/identity.module.d.ts +6 -0
- package/dist/identity/identity.module.js +56 -0
- package/dist/identity/me.controller.d.ts +16 -15
- package/dist/identity/me.controller.js +37 -31
- package/dist/identity/sessions.d.ts +12 -10
- package/dist/identity/sessions.js +74 -42
- package/dist/identity/settings.d.ts +20 -14
- package/dist/identity/settings.js +86 -58
- package/dist/identity/sso.controller.d.ts +7 -7
- package/dist/identity/sso.controller.js +13 -9
- package/dist/identity/sso.d.ts +9 -12
- package/dist/identity/sso.js +54 -24
- package/dist/inbox/inbox.module.d.ts +3 -0
- package/dist/inbox/inbox.module.js +22 -0
- package/dist/inbox/inbox.service.d.ts +7 -9
- package/dist/inbox/inbox.service.js +32 -11
- package/dist/index.d.ts +16 -11
- package/dist/index.js +9 -6
- package/dist/infra/cache/cache.module.d.ts +3 -0
- package/dist/infra/cache/cache.module.js +16 -0
- package/dist/infra/cache/cache.service.d.ts +21 -0
- package/dist/infra/cache/cache.service.js +80 -0
- package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
- package/dist/infra/cache/cacheable.decorator.js +83 -0
- package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
- package/dist/infra/cli/kernel-cli.module.js +165 -0
- package/dist/infra/close-within.d.ts +15 -0
- package/dist/infra/close-within.js +36 -0
- package/dist/infra/config/config.module.d.ts +13 -0
- package/dist/infra/config/config.module.js +39 -0
- package/dist/infra/config/kernel-config.service.d.ts +25 -0
- package/dist/infra/config/kernel-config.service.js +126 -0
- package/dist/infra/database/after-commit.d.ts +6 -0
- package/dist/infra/database/after-commit.js +9 -0
- package/dist/infra/database/database.module.d.ts +25 -0
- package/dist/infra/database/database.module.js +90 -0
- package/dist/infra/database/kernel-db.d.ts +22 -0
- package/dist/infra/database/kernel-db.js +65 -0
- package/dist/infra/database/transaction-host.d.ts +50 -0
- package/dist/infra/database/transaction-host.js +125 -0
- package/dist/infra/database/transactional.decorator.d.ts +15 -0
- package/dist/infra/database/transactional.decorator.js +27 -0
- package/dist/infra/database/xact-lock.d.ts +17 -0
- package/dist/infra/database/xact-lock.js +43 -0
- package/dist/infra/events/kernel-events.d.ts +96 -0
- package/dist/infra/events/kernel-events.js +65 -0
- package/dist/infra/health/health.controller.d.ts +26 -0
- package/dist/infra/health/health.controller.js +104 -0
- package/dist/infra/health/health.module.d.ts +9 -0
- package/dist/infra/health/health.module.js +24 -0
- package/dist/infra/health/health.options.d.ts +10 -0
- package/dist/infra/health/health.options.js +15 -0
- package/dist/infra/health/shutdown-state.d.ts +6 -0
- package/dist/infra/health/shutdown-state.js +2 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
- package/dist/infra/lifecycle/process-guards.d.ts +52 -0
- package/dist/infra/lifecycle/process-guards.js +86 -0
- package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
- package/dist/infra/lifecycle/shutdown-signals.js +48 -0
- package/dist/infra/lock/key-template.d.ts +13 -0
- package/dist/infra/lock/key-template.js +46 -0
- package/dist/infra/lock/lock.module.d.ts +3 -0
- package/dist/infra/lock/lock.module.js +16 -0
- package/dist/infra/lock/lock.service.d.ts +120 -0
- package/dist/infra/lock/lock.service.js +343 -0
- package/dist/infra/lock/shared-lease.d.ts +44 -0
- package/dist/infra/lock/shared-lease.js +121 -0
- package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
- package/dist/infra/lock/with-lock.decorator.js +49 -0
- package/dist/infra/logging/logging.module.d.ts +16 -0
- package/dist/infra/logging/logging.module.js +34 -0
- package/dist/infra/queue/configured-processor.d.ts +18 -0
- package/dist/infra/queue/configured-processor.js +23 -0
- package/dist/infra/queue/job-failure.d.ts +18 -0
- package/dist/infra/queue/job-failure.js +26 -0
- package/dist/infra/queue/queue-shutdown.d.ts +27 -0
- package/dist/infra/queue/queue-shutdown.js +81 -0
- package/dist/infra/queue/queue.module.d.ts +16 -0
- package/dist/infra/queue/queue.module.js +61 -0
- package/dist/infra/queue/redis-connection.d.ts +7 -0
- package/dist/infra/queue/redis-connection.js +18 -0
- package/dist/infra/queue/retired-schedulers.d.ts +7 -0
- package/dist/infra/queue/retired-schedulers.js +9 -0
- package/dist/infra/queue/run-job.d.ts +16 -0
- package/dist/infra/queue/run-job.js +19 -0
- package/dist/infra/redis/redis.module.d.ts +24 -0
- package/dist/infra/redis/redis.module.js +87 -0
- package/dist/infra/schedule/cron-tick.d.ts +12 -0
- package/dist/infra/schedule/cron-tick.js +25 -0
- package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
- package/dist/infra/schedule/locked-cron.decorator.js +53 -0
- package/dist/infra/schedule/locked-interval.d.ts +69 -0
- package/dist/infra/schedule/locked-interval.js +190 -0
- package/dist/infra/schedule/locked-tick.d.ts +90 -0
- package/dist/infra/schedule/locked-tick.js +137 -0
- package/dist/infra/schedule/schedule.module.d.ts +8 -0
- package/dist/infra/schedule/schedule.module.js +27 -0
- package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
- package/dist/infra/schedule/scheduled-runs.js +163 -0
- package/dist/infra/swagger/swagger.d.ts +16 -0
- package/dist/infra/swagger/swagger.js +31 -0
- package/dist/infra/throttler/credential-throttler.d.ts +35 -0
- package/dist/infra/throttler/credential-throttler.js +77 -0
- package/dist/infra/throttler/named-throttlers.d.ts +31 -0
- package/dist/infra/throttler/named-throttlers.js +119 -0
- package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
- package/dist/infra/throttler/redis-throttler-storage.js +130 -0
- package/dist/infra/throttler/throttler.guard.d.ts +23 -0
- package/dist/infra/throttler/throttler.guard.js +68 -0
- package/dist/infra/throttler/throttler.module.d.ts +15 -0
- package/dist/infra/throttler/throttler.module.js +53 -0
- package/dist/infra/tokens.d.ts +15 -0
- package/dist/infra/tokens.js +15 -0
- package/dist/infra/validation/create-zod-dto.d.ts +23 -0
- package/dist/infra/validation/create-zod-dto.js +35 -0
- package/dist/infra/validation/parse-with-zod.d.ts +7 -0
- package/dist/infra/validation/parse-with-zod.js +12 -0
- package/dist/infra/validation/validation.module.d.ts +3 -0
- package/dist/infra/validation/validation.module.js +16 -0
- package/dist/infra/validation/zod-params.d.ts +7 -0
- package/dist/infra/validation/zod-params.js +42 -0
- package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
- package/dist/infra/validation/zod-validation.pipe.js +31 -0
- package/dist/kernel.d.ts +9 -244
- package/dist/kernel.js +8 -1305
- package/dist/kernel.module.d.ts +17 -0
- package/dist/kernel.module.js +136 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
- package/dist/lifecycle/kernel-lifecycle.js +456 -0
- package/dist/lifecycle/tokens.d.ts +3 -0
- package/dist/lifecycle/tokens.js +3 -0
- package/dist/log-context.d.ts +2 -0
- package/dist/log-context.js +4 -0
- package/dist/models/models.module.d.ts +3 -0
- package/dist/models/models.module.js +24 -0
- package/dist/models/prices.d.ts +8 -2
- package/dist/models/prices.js +65 -37
- package/dist/models/purposes.controller.d.ts +1 -1
- package/dist/models/purposes.controller.js +5 -6
- package/dist/models/purposes.d.ts +35 -13
- package/dist/models/purposes.js +101 -51
- package/dist/orgs/directory-sync.controller.d.ts +1 -1
- package/dist/orgs/directory-sync.controller.js +2 -2
- package/dist/orgs/directory-sync.d.ts +61 -31
- package/dist/orgs/directory-sync.js +212 -125
- package/dist/orgs/invitations.controller.d.ts +8 -8
- package/dist/orgs/invitations.controller.js +27 -26
- package/dist/orgs/invitations.service.d.ts +12 -9
- package/dist/orgs/invitations.service.js +130 -92
- package/dist/orgs/job-ids.d.ts +8 -0
- package/dist/orgs/job-ids.js +8 -0
- package/dist/orgs/members.service.d.ts +19 -12
- package/dist/orgs/members.service.js +161 -117
- package/dist/orgs/offboarding.d.ts +54 -57
- package/dist/orgs/offboarding.js +161 -71
- package/dist/orgs/org-lock.d.ts +28 -19
- package/dist/orgs/org-lock.js +81 -35
- package/dist/orgs/org.guard.d.ts +1 -1
- package/dist/orgs/org.guard.js +2 -2
- package/dist/orgs/orgs.controller.d.ts +13 -13
- package/dist/orgs/orgs.controller.js +29 -17
- package/dist/orgs/orgs.module.d.ts +6 -0
- package/dist/orgs/orgs.module.js +68 -0
- package/dist/orgs/orgs.service.d.ts +30 -19
- package/dist/orgs/orgs.service.js +139 -86
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.controller.js +8 -6
- package/dist/orgs/settings.service.d.ts +16 -10
- package/dist/orgs/settings.service.js +77 -48
- package/dist/overrides.d.ts +56 -0
- package/dist/overrides.js +30 -0
- package/dist/roles/gateway-role.d.ts +43 -0
- package/dist/roles/gateway-role.js +98 -0
- package/dist/roles/gateway.module.d.ts +8 -0
- package/dist/roles/gateway.module.js +28 -0
- package/dist/roles/worker-role.d.ts +63 -0
- package/dist/roles/worker-role.js +144 -0
- package/dist/roles/worker.module.d.ts +14 -0
- package/dist/roles/worker.module.js +90 -0
- package/dist/runtime/abort.js +19 -2
- package/dist/runtime/checkpointer.d.ts +8 -3
- package/dist/runtime/checkpointer.js +87 -55
- package/dist/runtime/context/build.d.ts +6 -6
- package/dist/runtime/context/build.js +18 -8
- package/dist/runtime/context/claude-tools.d.ts +2 -1
- package/dist/runtime/context/claude-tools.js +9 -10
- package/dist/runtime/context/legacy-text.d.ts +22 -0
- package/dist/runtime/context/legacy-text.js +37 -0
- package/dist/runtime/context/skills.d.ts +29 -11
- package/dist/runtime/context/skills.js +37 -30
- package/dist/runtime/conversation-lock.d.ts +20 -11
- package/dist/runtime/conversation-lock.js +62 -72
- package/dist/runtime/hook-calls.d.ts +3 -3
- package/dist/runtime/hook-calls.js +1 -6
- package/dist/runtime/job-ids.d.ts +10 -0
- package/dist/runtime/job-ids.js +10 -0
- package/dist/runtime/langgraph-loop.js +1 -1
- package/dist/runtime/loop.d.ts +8 -1
- package/dist/runtime/loop.js +14 -0
- package/dist/runtime/maintenance-queue.d.ts +10 -0
- package/dist/runtime/maintenance-queue.js +10 -0
- package/dist/runtime/maintenance.d.ts +45 -74
- package/dist/runtime/maintenance.js +139 -137
- package/dist/runtime/model-call.d.ts +7 -4
- package/dist/runtime/model-call.js +25 -58
- package/dist/runtime/providers.d.ts +17 -6
- package/dist/runtime/providers.js +66 -25
- package/dist/runtime/quota.d.ts +17 -3
- package/dist/runtime/quota.js +27 -2
- package/dist/runtime/retired-schedulers.d.ts +7 -0
- package/dist/runtime/retired-schedulers.js +31 -0
- package/dist/runtime/run-control.d.ts +33 -0
- package/dist/runtime/run-control.js +77 -0
- package/dist/runtime/run-finish.d.ts +27 -18
- package/dist/runtime/run-finish.js +98 -51
- package/dist/runtime/run-jobs.d.ts +48 -0
- package/dist/runtime/run-jobs.js +95 -0
- package/dist/runtime/run-processors.d.ts +60 -0
- package/dist/runtime/run-processors.js +185 -0
- package/dist/runtime/run-queue.d.ts +32 -57
- package/dist/runtime/run-queue.js +291 -295
- package/dist/runtime/run-steps.d.ts +39 -0
- package/dist/runtime/run-steps.js +96 -0
- package/dist/runtime/run-worker.d.ts +122 -76
- package/dist/runtime/run-worker.js +343 -229
- package/dist/runtime/runtime.module.d.ts +10 -0
- package/dist/runtime/runtime.module.js +112 -0
- package/dist/runtime/step-log.d.ts +40 -0
- package/dist/runtime/step-log.js +94 -0
- package/dist/runtime/stream.controller.d.ts +5 -8
- package/dist/runtime/stream.controller.js +14 -12
- package/dist/runtime/stream.d.ts +24 -6
- package/dist/runtime/stream.js +78 -7
- package/dist/runtime/subagents/child.d.ts +3 -44
- package/dist/runtime/subagents/child.js +0 -79
- package/dist/runtime/subagents/definition.d.ts +5 -10
- package/dist/runtime/subagents/definition.js +13 -14
- package/dist/runtime/subagents/dispatch.d.ts +89 -8
- package/dist/runtime/subagents/dispatch.js +137 -142
- package/dist/runtime/subagents/limits.d.ts +9 -4
- package/dist/runtime/subagents/limits.js +4 -2
- package/dist/runtime/subagents/org-agents.d.ts +4 -4
- package/dist/runtime/subagents/org-agents.js +3 -2
- package/dist/runtime/subagents/progress.d.ts +2 -2
- package/dist/runtime/subagents/roster.d.ts +4 -4
- package/dist/runtime/subagents/roster.js +2 -2
- package/dist/runtime/subagents/skill-fork.d.ts +8 -9
- package/dist/runtime/subagents/skill-fork.js +17 -6
- package/dist/runtime/subagents/subagents.service.d.ts +40 -0
- package/dist/runtime/subagents/subagents.service.js +101 -0
- package/dist/runtime/usage-report.d.ts +94 -52
- package/dist/runtime/usage-report.js +200 -100
- package/dist/runtime/waits.d.ts +127 -59
- package/dist/runtime/waits.js +433 -210
- package/dist/sandbox/job-ids.d.ts +10 -0
- package/dist/sandbox/job-ids.js +10 -0
- package/dist/sandbox/jobs.d.ts +41 -0
- package/dist/sandbox/jobs.js +113 -0
- package/dist/sandbox/leases.d.ts +39 -31
- package/dist/sandbox/leases.js +117 -257
- package/dist/sandbox/providers.d.ts +19 -0
- package/dist/sandbox/providers.js +38 -0
- package/dist/sandbox/sandbox.module.d.ts +8 -0
- package/dist/sandbox/sandbox.module.js +30 -0
- package/dist/sandbox/sandbox.service.d.ts +24 -29
- package/dist/sandbox/sandbox.service.js +106 -75
- package/dist/skills/catalog.d.ts +37 -24
- package/dist/skills/catalog.js +100 -57
- package/dist/skills/changes.controller.d.ts +4 -4
- package/dist/skills/changes.controller.js +15 -9
- package/dist/skills/changes.service.d.ts +30 -20
- package/dist/skills/changes.service.js +425 -367
- package/dist/skills/invocable.controller.d.ts +1 -1
- package/dist/skills/invocable.controller.js +8 -5
- package/dist/skills/invocation-keys.d.ts +1 -1
- package/dist/skills/invocation-keys.js +1 -1
- package/dist/skills/invoke.d.ts +17 -16
- package/dist/skills/invoke.js +53 -21
- package/dist/skills/skills.controller.d.ts +1 -1
- package/dist/skills/skills.controller.js +11 -6
- package/dist/skills/skills.module.d.ts +6 -0
- package/dist/skills/skills.module.js +30 -0
- package/dist/skills/skills.service.d.ts +47 -30
- package/dist/skills/skills.service.js +221 -158
- package/dist/storage/job-ids.d.ts +6 -0
- package/dist/storage/job-ids.js +6 -0
- package/dist/storage/purge.d.ts +22 -7
- package/dist/storage/purge.js +55 -3
- package/dist/storage/storage.module.d.ts +6 -0
- package/dist/storage/storage.module.js +23 -0
- package/dist/storage/storage.service.d.ts +18 -4
- package/dist/storage/storage.service.js +44 -3
- package/dist/tools/approvals.controller.d.ts +1 -1
- package/dist/tools/approvals.controller.js +12 -8
- package/dist/tools/approvals.service.d.ts +33 -25
- package/dist/tools/approvals.service.js +343 -259
- package/dist/tools/breaker.d.ts +2 -2
- package/dist/tools/breaker.js +21 -3
- package/dist/tools/builtin-names.d.ts +73 -0
- package/dist/tools/builtin-names.js +116 -0
- package/dist/tools/builtins/agent.d.ts +7 -7
- package/dist/tools/builtins/agent.js +7 -11
- package/dist/tools/builtins/ask-user.d.ts +3 -3
- package/dist/tools/builtins/ask-user.js +3 -3
- package/dist/tools/builtins/builtin-tools.d.ts +21 -0
- package/dist/tools/builtins/builtin-tools.js +80 -0
- package/dist/tools/builtins/read-tool-output.d.ts +3 -3
- package/dist/tools/builtins/read-tool-output.js +3 -3
- package/dist/tools/builtins/sandbox/bash.d.ts +5 -5
- package/dist/tools/builtins/sandbox/bash.js +33 -30
- package/dist/tools/builtins/sandbox/common.d.ts +5 -4
- package/dist/tools/builtins/sandbox/common.js +2 -2
- package/dist/tools/builtins/sandbox/deliver.d.ts +1 -1
- package/dist/tools/builtins/sandbox/deliver.js +13 -13
- package/dist/tools/builtins/sandbox/edit.d.ts +1 -1
- package/dist/tools/builtins/sandbox/edit.js +42 -31
- package/dist/tools/builtins/sandbox/file-state.d.ts +34 -0
- package/dist/tools/builtins/sandbox/file-state.js +34 -0
- package/dist/tools/builtins/sandbox/glob-match.d.ts +1 -1
- package/dist/tools/builtins/sandbox/glob-match.js +1 -1
- package/dist/tools/builtins/sandbox/glob.d.ts +1 -1
- package/dist/tools/builtins/sandbox/glob.js +6 -6
- package/dist/tools/builtins/sandbox/grep.d.ts +7 -4
- package/dist/tools/builtins/sandbox/grep.js +149 -32
- package/dist/tools/builtins/sandbox/index.d.ts +1 -1
- package/dist/tools/builtins/sandbox/index.js +1 -1
- package/dist/tools/builtins/sandbox/read.d.ts +2 -2
- package/dist/tools/builtins/sandbox/read.js +22 -15
- package/dist/tools/builtins/sandbox/write.d.ts +1 -1
- package/dist/tools/builtins/sandbox/write.js +38 -34
- package/dist/tools/builtins/skill-load.d.ts +6 -6
- package/dist/tools/builtins/skill-load.js +33 -17
- package/dist/tools/builtins/skill-write.d.ts +4 -4
- package/dist/tools/builtins/skill-write.js +10 -10
- package/dist/tools/builtins/tool-search.d.ts +13 -9
- package/dist/tools/builtins/tool-search.js +25 -14
- package/dist/tools/canonical-json.d.ts +6 -0
- package/dist/tools/canonical-json.js +16 -0
- package/dist/tools/connector-content.controller.d.ts +1 -1
- package/dist/tools/connector-content.controller.js +11 -6
- package/dist/tools/connector-content.d.ts +12 -15
- package/dist/tools/connector-content.js +53 -18
- package/dist/tools/connectors.controller.d.ts +1 -1
- package/dist/tools/connectors.controller.js +21 -10
- package/dist/tools/connectors.service.d.ts +31 -13
- package/dist/tools/connectors.service.js +438 -348
- package/dist/tools/credentials.d.ts +17 -20
- package/dist/tools/credentials.js +55 -34
- package/dist/tools/display-names.d.ts +9 -0
- package/dist/tools/display-names.js +24 -0
- package/dist/tools/drift.d.ts +29 -41
- package/dist/tools/drift.js +116 -84
- package/dist/tools/elicitation.js +1 -1
- package/dist/tools/info.d.ts +32 -13
- package/dist/tools/info.js +88 -39
- package/dist/tools/job-ids.d.ts +13 -0
- package/dist/tools/job-ids.js +15 -0
- package/dist/tools/jobs.d.ts +24 -0
- package/dist/tools/jobs.js +69 -0
- package/dist/tools/legacy-data.d.ts +34 -0
- package/dist/tools/legacy-data.js +76 -0
- package/dist/tools/legacy-keys.d.ts +51 -0
- package/dist/tools/legacy-keys.js +115 -0
- package/dist/tools/naming.d.ts +1 -5
- package/dist/tools/naming.js +1 -7
- package/dist/tools/oauth/flow-paths.d.ts +16 -0
- package/dist/tools/oauth/flow-paths.js +38 -0
- package/dist/tools/oauth/flow.d.ts +30 -30
- package/dist/tools/oauth/flow.js +109 -81
- package/dist/tools/oauth/oauth.controller.d.ts +3 -3
- package/dist/tools/oauth/oauth.controller.js +12 -9
- package/dist/tools/oauth/tokens.d.ts +11 -3
- package/dist/tools/oauth/tokens.js +15 -14
- package/dist/tools/outputs.d.ts +13 -4
- package/dist/tools/outputs.js +48 -4
- package/dist/tools/pipeline.d.ts +72 -50
- package/dist/tools/pipeline.js +239 -100
- package/dist/tools/policy.d.ts +3 -16
- package/dist/tools/policy.js +13 -19
- package/dist/tools/questions.controller.d.ts +2 -2
- package/dist/tools/questions.controller.js +9 -6
- package/dist/tools/questions.service.d.ts +26 -25
- package/dist/tools/questions.service.js +201 -142
- package/dist/tools/registry.d.ts +43 -38
- package/dist/tools/registry.js +100 -72
- package/dist/tools/resources.d.ts +1 -1
- package/dist/tools/resources.js +1 -1
- package/dist/tools/specs.d.ts +5 -4
- package/dist/tools/specs.js +3 -1
- package/dist/tools/tools.module.d.ts +10 -0
- package/dist/tools/tools.module.js +91 -0
- package/dist/ui/call-extension.d.ts +16 -0
- package/dist/ui/call-extension.js +38 -0
- package/dist/ui/embed-token.d.ts +9 -5
- package/dist/ui/embed-token.js +34 -6
- package/dist/ui/ui-stream.d.ts +22 -17
- package/dist/ui/ui-stream.js +72 -12
- package/dist/ui/ui.module.d.ts +7 -0
- package/dist/ui/ui.module.js +28 -0
- package/dist/ui/views.controller.d.ts +14 -12
- package/dist/ui/views.controller.js +32 -25
- package/dist/ui/views.d.ts +9 -57
- package/dist/ui/views.js +43 -45
- package/package.json +10 -3
- package/src/migrations/0063_tool_keys_claude_code.sql +220 -0
- package/dist/http/health.controller.d.ts +0 -26
- package/dist/http/health.controller.js +0 -79
- package/dist/http/tokens.d.ts +0 -131
- package/dist/http/tokens.js +0 -131
- package/dist/http/zod.pipe.d.ts +0 -8
- package/dist/http/zod.pipe.js +0 -14
- package/dist/identity/rate-limit.d.ts +0 -55
- package/dist/identity/rate-limit.js +0 -121
- package/dist/sandbox/lifecycle.d.ts +0 -21
- package/dist/sandbox/lifecycle.js +0 -68
- package/dist/tools/builtins/sandbox/names.d.ts +0 -7
- package/dist/tools/builtins/sandbox/names.js +0 -20
- /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
- /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
|
@@ -1,16 +1,34 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
1
10
|
import { createHash, randomUUID } from "node:crypto";
|
|
11
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
2
12
|
import { sql } from "kysely";
|
|
3
13
|
import { putTemplateVersionIn } from "../agents/templates.js";
|
|
4
14
|
import { ApiError } from "../errors.js";
|
|
5
15
|
import { isExtensionEnabled } from "../extensions/enabled.js";
|
|
16
|
+
import { OrgExtensionConfigs } from "../extensions/org-config.js";
|
|
17
|
+
import { ExtensionRegistry } from "../extensions/registry.js";
|
|
6
18
|
import { audit } from "../identity/audit.js";
|
|
7
|
-
import {
|
|
19
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
20
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
21
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
22
|
+
import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
23
|
+
import { OrgLock } from "../orgs/org-lock.js";
|
|
8
24
|
import { packagePath } from "../packages/tgz.js";
|
|
9
|
-
import { skillConflictError } from "../skills/skills.service.js";
|
|
25
|
+
import { SkillsService, skillConflictError } from "../skills/skills.service.js";
|
|
26
|
+
import { StorageService } from "../storage/storage.service.js";
|
|
27
|
+
import { ConnectorsService } from "../tools/connectors.service.js";
|
|
10
28
|
import { canonicalJson } from "../tools/registry.js";
|
|
11
|
-
import { getPath, lockOrgForActions, orgTemplateView, readCatalogAgentTemplates, readCatalogFiles, readCatalogTemplates, requiredActions, setPath, skillOf, templatePluginProblem, } from "./
|
|
12
|
-
import { catalogSkillNames, InstallFailure, journalEntries, missingTemplateInput, planActions, planSkillConflicts, resolveDependencies, under, } from "./plugin-install.js";
|
|
13
|
-
import { assertItemInstallable } from "./requests.service.js";
|
|
29
|
+
import { getPath, lockOrgForActions, orgTemplateView, readCatalogAgentTemplates, readCatalogFiles, readCatalogTemplates, requiredActions, setPath, skillOf, templatePluginProblem, } from "./catalog-content.js";
|
|
30
|
+
import { catalogSkillNames, InstallFailure, journalEntries, missingTemplateInput, PluginInstaller, planActions, planSkillConflicts, resolveDependencies, under, } from "./plugin-install.js";
|
|
31
|
+
import { assertItemInstallable, CatalogRequestsService } from "./requests.service.js";
|
|
14
32
|
import { deployedExtension, deploymentTarget } from "./upgrade-targets.js";
|
|
15
33
|
import { satisfiesRange } from "./versions.js";
|
|
16
34
|
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
@@ -78,18 +96,46 @@ function dirDigest(row, dir) {
|
|
|
78
96
|
* Approval follows the item's policy (the org catalog service creates the request). No in-process
|
|
79
97
|
* state.
|
|
80
98
|
*/
|
|
81
|
-
|
|
99
|
+
let PluginUpgrader = class PluginUpgrader {
|
|
82
100
|
installer;
|
|
83
|
-
|
|
84
|
-
|
|
101
|
+
kdb;
|
|
102
|
+
orgLock;
|
|
103
|
+
storage;
|
|
104
|
+
registry;
|
|
105
|
+
skills;
|
|
106
|
+
orgConfigs;
|
|
107
|
+
requests;
|
|
108
|
+
connectors;
|
|
109
|
+
log;
|
|
110
|
+
txHost;
|
|
111
|
+
constructor(
|
|
112
|
+
/** Planning, installs, the ledger and the uninstall rules are the installer's. */
|
|
113
|
+
installer, kdb,
|
|
114
|
+
/** The org row lock (orgs/org-lock.ts): joins the caller's transaction. */
|
|
115
|
+
orgLock, storage, registry, skills, orgConfigs, requests,
|
|
116
|
+
/** Org connectors: installs create, upgrade and remove them. */
|
|
117
|
+
connectors, log, txHost) {
|
|
85
118
|
this.installer = installer;
|
|
86
|
-
this.
|
|
119
|
+
this.kdb = kdb;
|
|
120
|
+
this.orgLock = orgLock;
|
|
121
|
+
this.storage = storage;
|
|
122
|
+
this.registry = registry;
|
|
123
|
+
this.skills = skills;
|
|
124
|
+
this.orgConfigs = orgConfigs;
|
|
125
|
+
this.requests = requests;
|
|
126
|
+
this.connectors = connectors;
|
|
127
|
+
this.log = log;
|
|
128
|
+
this.txHost = txHost;
|
|
129
|
+
}
|
|
130
|
+
/** The kernel-schema handle of the current context (the transaction, else the pool). */
|
|
131
|
+
get db() {
|
|
132
|
+
return this.kdb.db;
|
|
87
133
|
}
|
|
88
134
|
/** The upgrade preview (see the class comment). */
|
|
89
135
|
async preview(orgId, actor, installId, version) {
|
|
90
136
|
await this.recoverInterrupted(orgId, actor, installId);
|
|
91
137
|
const diff = await this.diff(orgId, actor, installId, version, null);
|
|
92
|
-
await this.
|
|
138
|
+
await this.authorizeActions(orgId, actor, diff.actions);
|
|
93
139
|
return {
|
|
94
140
|
from: diff.from.version,
|
|
95
141
|
to: diff.to.version,
|
|
@@ -102,6 +148,10 @@ export class PluginUpgrader {
|
|
|
102
148
|
: []),
|
|
103
149
|
};
|
|
104
150
|
}
|
|
151
|
+
/** Re-checks the actor's org actions under the org row lock (a transaction of its own). */
|
|
152
|
+
async authorizeActions(orgId, actor, actions) {
|
|
153
|
+
await lockOrgForActions(this.orgLock, orgId, actor, actions);
|
|
154
|
+
}
|
|
105
155
|
/**
|
|
106
156
|
* The checks of {@link upgrade} before an approval request (the org catalog service creates one
|
|
107
157
|
* for a needs_approval item without a grant): the diff with the input, the `diffHash`. Returns
|
|
@@ -136,41 +186,16 @@ export class PluginUpgrader {
|
|
|
136
186
|
const { itemId } = diff;
|
|
137
187
|
const upgradeId = randomUUID();
|
|
138
188
|
// Start: the install `upgrading`, under the org lock (one upgrade or uninstall at a time)
|
|
139
|
-
await this.
|
|
140
|
-
await lockOrgForActions(t, orgId, actor, diff.actions);
|
|
141
|
-
const row = await t
|
|
142
|
-
.selectFrom("plugin_installs")
|
|
143
|
-
.select(["status", "version"])
|
|
144
|
-
.where("id", "=", installId)
|
|
145
|
-
.where("org_id", "=", orgId)
|
|
146
|
-
.forUpdate()
|
|
147
|
-
.executeTakeFirst();
|
|
148
|
-
if (!row || row.status === "failed")
|
|
149
|
-
throw installNotFound();
|
|
150
|
-
if (row.status !== "installed")
|
|
151
|
-
throw inProgress();
|
|
152
|
-
if (row.version !== diff.from.version ||
|
|
153
|
-
ledgerHash(await ledgerOf(t, installId)) !== diff.ledgerHash) {
|
|
154
|
-
throw stale();
|
|
155
|
-
}
|
|
156
|
-
await assertItemInstallable(t, orgId, itemId);
|
|
157
|
-
await t
|
|
158
|
-
.updateTable("plugin_installs")
|
|
159
|
-
.set({
|
|
160
|
-
status: "upgrading",
|
|
161
|
-
upgrade: sql `jsonb_build_object('id', ${upgradeId}::text, 'from', ${diff.from.version}::text, 'to', ${diff.to.version}::text, 'startedAt', now(), 'done', '[]'::jsonb)`,
|
|
162
|
-
})
|
|
163
|
-
.where("id", "=", installId)
|
|
164
|
-
.execute();
|
|
165
|
-
});
|
|
189
|
+
await this.start(orgId, actor, installId, diff, upgradeId);
|
|
166
190
|
const done = [];
|
|
167
191
|
/** The step whose journal write found the journal gone (cleaned up as interrupted meanwhile). */
|
|
168
192
|
let unjournaled;
|
|
169
|
-
// Appends a step to the journal
|
|
170
|
-
|
|
193
|
+
// Appends a step to the journal in the transaction of the context (the journal gone: the
|
|
194
|
+
// upgrade was cleaned up as interrupted)
|
|
195
|
+
const journal = async (s) => {
|
|
171
196
|
done.push(s);
|
|
172
197
|
unjournaled = s;
|
|
173
|
-
const r = await
|
|
198
|
+
const r = await this.db
|
|
174
199
|
.updateTable("plugin_installs")
|
|
175
200
|
.set({
|
|
176
201
|
upgrade: sql `jsonb_set(upgrade, '{done}', (upgrade->'done') || ${JSON.stringify([s])}::jsonb)`,
|
|
@@ -182,32 +207,14 @@ export class PluginUpgrader {
|
|
|
182
207
|
throw cleanedUp();
|
|
183
208
|
unjournaled = undefined;
|
|
184
209
|
};
|
|
185
|
-
// Records a component in the ledger and the journal, in the
|
|
186
|
-
const record =
|
|
187
|
-
const inserted = await t
|
|
188
|
-
.insertInto("plugin_install_components")
|
|
189
|
-
.values({
|
|
190
|
-
install_id: installId,
|
|
191
|
-
kind: c.kind,
|
|
192
|
-
ref: c.ref,
|
|
193
|
-
created: c.created,
|
|
194
|
-
skill_version: c.skillVersion,
|
|
195
|
-
template_id: c.templateId ?? null,
|
|
196
|
-
})
|
|
197
|
-
.onConflict((oc) => oc.columns(["install_id", "kind", "ref"]).doNothing())
|
|
198
|
-
.returning("ref")
|
|
199
|
-
.executeTakeFirst();
|
|
200
|
-
if (c.created)
|
|
201
|
-
await journal({ op: "created", kind: c.kind, ref: c.ref }, t);
|
|
202
|
-
else if (inserted)
|
|
203
|
-
await journal({ op: "recorded", kind: c.kind, ref: c.ref }, t);
|
|
204
|
-
};
|
|
210
|
+
// Records a component in the ledger and the journal, in the transaction of the context
|
|
211
|
+
const record = (c) => this.recordIn(installId, journal, c);
|
|
205
212
|
let step = "dependencies";
|
|
206
213
|
const disabled = [];
|
|
207
214
|
try {
|
|
208
215
|
for (const dep of diff.dependencies.filter((x) => x.change === "added")) {
|
|
209
216
|
const resolved = dep.resolved;
|
|
210
|
-
const rec = (c
|
|
217
|
+
const rec = (c) => record(c);
|
|
211
218
|
if ((await this.installer.recordDependency(orgId, resolved, rec)) !== undefined)
|
|
212
219
|
continue;
|
|
213
220
|
if (!dep.plan) {
|
|
@@ -236,22 +243,17 @@ export class PluginUpgrader {
|
|
|
236
243
|
}
|
|
237
244
|
step = "extension";
|
|
238
245
|
if (diff.extension?.change === "added") {
|
|
239
|
-
|
|
240
|
-
await this.d.orgConfigs.put(orgId, name, {
|
|
246
|
+
await this.installer.enableExtension(orgId, diff.extension.name, {
|
|
241
247
|
enabled: true,
|
|
242
248
|
...(input.extensionConfig !== undefined && { config: input.extensionConfig }),
|
|
243
|
-
}, actor, opts.actorTokenId, {
|
|
244
|
-
viaItem: itemId,
|
|
245
|
-
ifDisabled: { skipped: false },
|
|
246
|
-
inTransaction: (t, skipped) => record({ kind: "extension", ref: name, created: !skipped, skillVersion: null }, t),
|
|
247
|
-
});
|
|
249
|
+
}, actor, opts.actorTokenId, { viaItem: itemId }, record);
|
|
248
250
|
}
|
|
249
251
|
step = "skills";
|
|
250
252
|
for (const s of diff.skills) {
|
|
251
253
|
if (s.change !== "added" && s.change !== "changed")
|
|
252
254
|
continue;
|
|
253
|
-
const files = await readCatalogFiles(this.
|
|
254
|
-
const r = await this.
|
|
255
|
+
const files = await readCatalogFiles(this.storage, diff.to.object_prefix, diff.to.files, s.dir);
|
|
256
|
+
const r = await this.skills.createVersionFromFiles(orgId, actor, { ...skillOf(files), files }, {
|
|
255
257
|
catalog: {
|
|
256
258
|
itemId,
|
|
257
259
|
version: diff.to.version,
|
|
@@ -260,52 +262,24 @@ export class PluginUpgrader {
|
|
|
260
262
|
},
|
|
261
263
|
...opts,
|
|
262
264
|
});
|
|
263
|
-
await this.
|
|
264
|
-
if (r.created) {
|
|
265
|
-
await record({ kind: "skill", ref: r.skill.id, created: true, skillVersion: null }, t);
|
|
266
|
-
return;
|
|
267
|
-
}
|
|
268
|
-
await journal({ op: "skill_version", ref: r.skill.id, version: r.version }, t);
|
|
269
|
-
await record({ kind: "skill", ref: r.skill.id, created: false, skillVersion: r.version }, t);
|
|
270
|
-
});
|
|
265
|
+
await this.journalSkill(r, record, journal);
|
|
271
266
|
}
|
|
272
267
|
step = "agent_templates";
|
|
273
268
|
for (const a of diff.agentTemplates) {
|
|
274
269
|
if (a.change !== "added" && a.change !== "changed")
|
|
275
270
|
continue;
|
|
276
|
-
await this.
|
|
277
|
-
await lockOrg(t, orgId);
|
|
278
|
-
const r = await putTemplateVersionIn(t, {
|
|
279
|
-
orgId,
|
|
280
|
-
plugin: diff.name,
|
|
281
|
-
catalogItemId: itemId,
|
|
282
|
-
catalogVersion: diff.to.version,
|
|
283
|
-
sourceFormat: diff.to.source_format,
|
|
284
|
-
}, a.template);
|
|
285
|
-
if (r.created) {
|
|
286
|
-
await record({ kind: "agent_template", ref: r.id, created: true, skillVersion: null }, t);
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
if (r.changed)
|
|
290
|
-
await journal({ op: "template_version", ref: r.id, version: r.version }, t);
|
|
291
|
-
await record({
|
|
292
|
-
kind: "agent_template",
|
|
293
|
-
ref: r.id,
|
|
294
|
-
created: false,
|
|
295
|
-
skillVersion: r.changed ? r.version : null,
|
|
296
|
-
}, t);
|
|
297
|
-
});
|
|
271
|
+
await this.upgradeAgentTemplate(orgId, diff, a.template, record, journal);
|
|
298
272
|
}
|
|
299
273
|
step = "connectors";
|
|
300
274
|
for (const [templateId, ci] of diff.creates) {
|
|
301
|
-
const r = await this.
|
|
302
|
-
await this.
|
|
275
|
+
const r = await this.connectors.create(orgId, actor, ci, opts.actorTokenId);
|
|
276
|
+
await this.recordStep(installId, journal, {
|
|
303
277
|
kind: "connector",
|
|
304
278
|
ref: r.connector.id,
|
|
305
279
|
created: true,
|
|
306
280
|
skillVersion: null,
|
|
307
281
|
templateId,
|
|
308
|
-
}
|
|
282
|
+
});
|
|
309
283
|
}
|
|
310
284
|
const prepared = [];
|
|
311
285
|
for (const tpl of diff.templates) {
|
|
@@ -315,7 +289,7 @@ export class PluginUpgrader {
|
|
|
315
289
|
try {
|
|
316
290
|
prepared.push({
|
|
317
291
|
connectorId: tpl.connector.id,
|
|
318
|
-
p: await this.
|
|
292
|
+
p: await this.connectors.prepareTemplateUpdate(actor, tpl.connector.connector, update),
|
|
319
293
|
});
|
|
320
294
|
}
|
|
321
295
|
catch (e) {
|
|
@@ -323,81 +297,15 @@ export class PluginUpgrader {
|
|
|
323
297
|
}
|
|
324
298
|
}
|
|
325
299
|
// Finish, in one transaction: changed connectors, removals, the version switch
|
|
326
|
-
await this.
|
|
327
|
-
await lockOrgForActions(t, orgId, actor, diff.actions);
|
|
328
|
-
const row = await t
|
|
329
|
-
.selectFrom("plugin_installs")
|
|
330
|
-
.select(["status", sql `upgrade->>'id'`.as("upgradeId")])
|
|
331
|
-
.where("id", "=", installId)
|
|
332
|
-
.forUpdate()
|
|
333
|
-
.executeTakeFirst();
|
|
334
|
-
if (row?.status !== "upgrading" || row.upgradeId !== upgradeId)
|
|
335
|
-
throw cleanedUp();
|
|
336
|
-
await assertItemInstallable(t, orgId, itemId);
|
|
337
|
-
for (const c of prepared) {
|
|
338
|
-
await this.d.connectors.applyTemplateIn(t, orgId, c.connectorId, actor, c.p, opts.actorTokenId);
|
|
339
|
-
}
|
|
300
|
+
await this.finish(orgId, actor, installId, upgradeId, diff, prepared, disabled, opts, () => {
|
|
340
301
|
step = "finish";
|
|
341
|
-
for (const dep of diff.dependencies) {
|
|
342
|
-
if (dep.change !== "changed" || !dep.child)
|
|
343
|
-
continue;
|
|
344
|
-
const live = await t
|
|
345
|
-
.selectFrom("plugin_installs")
|
|
346
|
-
.select("version")
|
|
347
|
-
.where("id", "=", dep.child.installId)
|
|
348
|
-
.forShare()
|
|
349
|
-
.executeTakeFirst();
|
|
350
|
-
if (!live || !satisfiesRange(live.version, dep.range)) {
|
|
351
|
-
throw new ApiError("catalog.dependency_unresolved", `Dependency ${dep.name}@${dep.range} cannot be resolved: its install in this organization changed meanwhile; preview the upgrade again`, [{ dependency: dep.name, range: dep.range }]);
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
const report = await this.removeIn(t, orgId, actor, diff, disabled);
|
|
355
|
-
// An unchanged skill gets no new version, so the target's pinned suggestion goes onto its
|
|
356
|
-
// current version (when that version is this plugin's) here, with the version switch.
|
|
357
|
-
for (const sk of diff.skills) {
|
|
358
|
-
if (sk.change !== "unchanged" || !sk.ledger)
|
|
359
|
-
continue;
|
|
360
|
-
await t
|
|
361
|
-
.updateTable("skill_versions as v")
|
|
362
|
-
.set({ suggest_pinned: sk.suggestPinned === true })
|
|
363
|
-
.from("skills as s")
|
|
364
|
-
.whereRef("s.id", "=", "v.skill_id")
|
|
365
|
-
.whereRef("s.current_version", "=", "v.version")
|
|
366
|
-
.where("s.id", "=", sk.ledger.ref)
|
|
367
|
-
.where("s.org_id", "=", orgId)
|
|
368
|
-
.where("v.catalog_item_id", "=", itemId)
|
|
369
|
-
.where("v.suggest_pinned", "<>", sk.suggestPinned === true)
|
|
370
|
-
.execute();
|
|
371
|
-
}
|
|
372
|
-
await t
|
|
373
|
-
.updateTable("plugin_installs")
|
|
374
|
-
.set({ version: diff.to.version, status: "installed", upgrade: null, error: null })
|
|
375
|
-
.where("id", "=", installId)
|
|
376
|
-
.execute();
|
|
377
|
-
await this.d.requests.resolveByInstall(t, orgId, itemId, actor, opts);
|
|
378
|
-
await audit(t, {
|
|
379
|
-
actorAccountId: actor,
|
|
380
|
-
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
381
|
-
orgId,
|
|
382
|
-
action: "plugin.org_upgraded",
|
|
383
|
-
target: installId,
|
|
384
|
-
detail: {
|
|
385
|
-
itemId,
|
|
386
|
-
name: diff.name,
|
|
387
|
-
from: diff.from.version,
|
|
388
|
-
to: diff.to.version,
|
|
389
|
-
components: diff.components,
|
|
390
|
-
removed: report.removed,
|
|
391
|
-
kept: report.kept,
|
|
392
|
-
},
|
|
393
|
-
});
|
|
394
302
|
});
|
|
395
303
|
}
|
|
396
304
|
catch (e) {
|
|
397
305
|
throw await this.failed(orgId, actor, installId, upgradeId, diff, { done, unjournaled }, step, e, opts);
|
|
398
306
|
}
|
|
399
307
|
for (const p of disabled)
|
|
400
|
-
await this.
|
|
308
|
+
await this.orgConfigs.afterDisable(orgId, p);
|
|
401
309
|
const [view] = await this.installer.list(orgId, installId);
|
|
402
310
|
if (!view)
|
|
403
311
|
throw installNotFound();
|
|
@@ -418,55 +326,16 @@ export class PluginUpgrader {
|
|
|
418
326
|
const at = failure ? failure.step : step;
|
|
419
327
|
let rolledBack = failure?.rolledBack ?? true;
|
|
420
328
|
try {
|
|
421
|
-
const removed = await this.
|
|
422
|
-
await lockOrg(t, orgId);
|
|
423
|
-
const row = await t
|
|
424
|
-
.selectFrom("plugin_installs")
|
|
425
|
-
.select(sql `upgrade->>'id'`.as("upgradeId"))
|
|
426
|
-
.where("id", "=", installId)
|
|
427
|
-
.forUpdate()
|
|
428
|
-
.executeTakeFirst();
|
|
429
|
-
const ours = row?.upgradeId === upgradeId;
|
|
430
|
-
// Cleaned up meanwhile: only the step whose journal write found the journal gone is ours to
|
|
431
|
-
// undo. When that step ran in the same transaction as its journal write (the extension
|
|
432
|
-
// enable, the ledger rows), the transaction rolled back with the failed write, so undoing
|
|
433
|
-
// it is a no-op (a never-enabled extension, a never-inserted row); undoing is still safe.
|
|
434
|
-
const undo = ours ? steps.done : steps.unjournaled ? [steps.unjournaled] : [];
|
|
435
|
-
const out = await this.installer.undoUpgradeIn(t, orgId, actor, installId, undo, "plugin_upgrade_rollback");
|
|
436
|
-
await t
|
|
437
|
-
.updateTable("plugin_installs")
|
|
438
|
-
.set({ status: "installed", upgrade: null, error: JSON.stringify({ step: at, code }) })
|
|
439
|
-
.where("id", "=", installId)
|
|
440
|
-
.where(sql `upgrade->>'id'`, "=", upgradeId)
|
|
441
|
-
.execute();
|
|
442
|
-
await audit(t, {
|
|
443
|
-
actorAccountId: actor,
|
|
444
|
-
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
445
|
-
orgId,
|
|
446
|
-
action: "plugin.org_upgrade_failed",
|
|
447
|
-
target: installId,
|
|
448
|
-
detail: {
|
|
449
|
-
itemId: diff.itemId,
|
|
450
|
-
name: diff.name,
|
|
451
|
-
from: diff.from.version,
|
|
452
|
-
to: diff.to.version,
|
|
453
|
-
step: at,
|
|
454
|
-
code,
|
|
455
|
-
rolledBack: undo,
|
|
456
|
-
...(!ours && { cleanedUpMeanwhile: true }),
|
|
457
|
-
},
|
|
458
|
-
});
|
|
459
|
-
return out;
|
|
460
|
-
});
|
|
329
|
+
const removed = await this.undoFailed(orgId, actor, installId, upgradeId, diff, steps, { at, code }, opts);
|
|
461
330
|
for (const r of removed) {
|
|
462
331
|
if (r.kind === "extension")
|
|
463
|
-
await this.
|
|
332
|
+
await this.orgConfigs.afterDisable(orgId, r.ref);
|
|
464
333
|
}
|
|
465
334
|
}
|
|
466
335
|
catch (u) {
|
|
467
336
|
// Left `upgrading` with its journal: undone once it is older than catalog.staleInstallMinutes
|
|
468
337
|
rolledBack = false;
|
|
469
|
-
this.
|
|
338
|
+
this.log.warn("plugin upgrade rollback failed", {
|
|
470
339
|
orgId,
|
|
471
340
|
installId,
|
|
472
341
|
error: u instanceof Error ? u.message : String(u),
|
|
@@ -499,66 +368,279 @@ export class PluginUpgrader {
|
|
|
499
368
|
async recoverInterrupted(orgId, actor, installId) {
|
|
500
369
|
if (!UUID_RE.test(installId))
|
|
501
370
|
throw installNotFound();
|
|
502
|
-
const
|
|
503
|
-
const
|
|
504
|
-
|
|
371
|
+
const removed = await this.undoInterrupted(orgId, actor, installId);
|
|
372
|
+
for (const r of removed) {
|
|
373
|
+
if (r.kind === "extension")
|
|
374
|
+
await this.orgConfigs.afterDisable(orgId, r.ref);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
/** The upgrade's start: the install `upgrading` with an empty journal (a transaction of its own). */
|
|
378
|
+
async start(orgId, actor, installId, diff, upgradeId) {
|
|
379
|
+
const { itemId } = diff;
|
|
380
|
+
const t = this.db;
|
|
381
|
+
await lockOrgForActions(this.orgLock, orgId, actor, diff.actions);
|
|
382
|
+
const row = await t
|
|
383
|
+
.selectFrom("plugin_installs")
|
|
384
|
+
.select(["status", "version"])
|
|
385
|
+
.where("id", "=", installId)
|
|
386
|
+
.where("org_id", "=", orgId)
|
|
387
|
+
.forUpdate()
|
|
388
|
+
.executeTakeFirst();
|
|
389
|
+
if (!row || row.status === "failed")
|
|
390
|
+
throw installNotFound();
|
|
391
|
+
if (row.status !== "installed")
|
|
392
|
+
throw inProgress();
|
|
393
|
+
if (row.version !== diff.from.version ||
|
|
394
|
+
ledgerHash(await ledgerOf(t, installId)) !== diff.ledgerHash) {
|
|
395
|
+
throw stale();
|
|
396
|
+
}
|
|
397
|
+
await assertItemInstallable(t, orgId, itemId);
|
|
398
|
+
await t
|
|
399
|
+
.updateTable("plugin_installs")
|
|
400
|
+
.set({
|
|
401
|
+
status: "upgrading",
|
|
402
|
+
upgrade: sql `jsonb_build_object('id', ${upgradeId}::text, 'from', ${diff.from.version}::text, 'to', ${diff.to.version}::text, 'startedAt', now(), 'done', '[]'::jsonb)`,
|
|
403
|
+
})
|
|
404
|
+
.where("id", "=", installId)
|
|
405
|
+
.execute();
|
|
406
|
+
}
|
|
407
|
+
/** A skill step's ledger and journal rows, in a transaction of their own. */
|
|
408
|
+
async journalSkill(r, record, journal) {
|
|
409
|
+
if (r.created) {
|
|
410
|
+
await record({ kind: "skill", ref: r.skill.id, created: true, skillVersion: null });
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
await journal({ op: "skill_version", ref: r.skill.id, version: r.version });
|
|
414
|
+
await record({ kind: "skill", ref: r.skill.id, created: false, skillVersion: r.version });
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* An agent template step: the new version (or template) and its ledger and journal rows, under
|
|
418
|
+
* the org row lock, in a transaction of their own.
|
|
419
|
+
*/
|
|
420
|
+
async upgradeAgentTemplate(orgId, diff, template, record, journal) {
|
|
421
|
+
const { itemId } = diff;
|
|
422
|
+
const t = this.db;
|
|
423
|
+
await this.orgLock.lock(orgId);
|
|
424
|
+
const r = await putTemplateVersionIn(t, {
|
|
425
|
+
orgId,
|
|
426
|
+
plugin: diff.name,
|
|
427
|
+
catalogItemId: itemId,
|
|
428
|
+
catalogVersion: diff.to.version,
|
|
429
|
+
sourceFormat: diff.to.source_format,
|
|
430
|
+
}, template);
|
|
431
|
+
if (r.created) {
|
|
432
|
+
await record({ kind: "agent_template", ref: r.id, created: true, skillVersion: null });
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
if (r.changed)
|
|
436
|
+
await journal({ op: "template_version", ref: r.id, version: r.version });
|
|
437
|
+
await record({
|
|
438
|
+
kind: "agent_template",
|
|
439
|
+
ref: r.id,
|
|
440
|
+
created: false,
|
|
441
|
+
skillVersion: r.changed ? r.version : null,
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
/** One ledger record (and its journal row) in a transaction of its own. */
|
|
445
|
+
async recordStep(installId, journal, c) {
|
|
446
|
+
await this.recordIn(installId, journal, c);
|
|
447
|
+
}
|
|
448
|
+
/** A component's ledger row and its journal step, in the transaction of the context. */
|
|
449
|
+
async recordIn(installId, journal, c) {
|
|
450
|
+
const inserted = await this.db
|
|
451
|
+
.insertInto("plugin_install_components")
|
|
452
|
+
.values({
|
|
453
|
+
install_id: installId,
|
|
454
|
+
kind: c.kind,
|
|
455
|
+
ref: c.ref,
|
|
456
|
+
created: c.created,
|
|
457
|
+
skill_version: c.skillVersion,
|
|
458
|
+
template_id: c.templateId ?? null,
|
|
459
|
+
})
|
|
460
|
+
.onConflict((oc) => oc.columns(["install_id", "kind", "ref"]).doNothing())
|
|
461
|
+
.returning("ref")
|
|
462
|
+
.executeTakeFirst();
|
|
463
|
+
if (c.created)
|
|
464
|
+
await journal({ op: "created", kind: c.kind, ref: c.ref });
|
|
465
|
+
else if (inserted)
|
|
466
|
+
await journal({ op: "recorded", kind: c.kind, ref: c.ref });
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* The upgrade's last transaction (under the org row lock): the changed connectors, the removals,
|
|
470
|
+
* the pinned suggestions and the version switch, `plugin.org_upgraded`. `onFinish` marks the step
|
|
471
|
+
* once the connectors are applied.
|
|
472
|
+
*/
|
|
473
|
+
async finish(orgId, actor, installId, upgradeId, diff, prepared, disabled, opts, onFinish) {
|
|
474
|
+
const { itemId } = diff;
|
|
475
|
+
const t = this.db;
|
|
476
|
+
await lockOrgForActions(this.orgLock, orgId, actor, diff.actions);
|
|
477
|
+
const row = await t
|
|
478
|
+
.selectFrom("plugin_installs")
|
|
479
|
+
.select(["status", sql `upgrade->>'id'`.as("upgradeId")])
|
|
480
|
+
.where("id", "=", installId)
|
|
481
|
+
.forUpdate()
|
|
482
|
+
.executeTakeFirst();
|
|
483
|
+
if (row?.status !== "upgrading" || row.upgradeId !== upgradeId)
|
|
484
|
+
throw cleanedUp();
|
|
485
|
+
await assertItemInstallable(t, orgId, itemId);
|
|
486
|
+
for (const c of prepared) {
|
|
487
|
+
await this.connectors.applyTemplateIn(orgId, c.connectorId, actor, c.p, opts.actorTokenId);
|
|
488
|
+
}
|
|
489
|
+
onFinish();
|
|
490
|
+
for (const dep of diff.dependencies) {
|
|
491
|
+
if (dep.change !== "changed" || !dep.child)
|
|
492
|
+
continue;
|
|
493
|
+
const live = await t
|
|
505
494
|
.selectFrom("plugin_installs")
|
|
506
|
-
.select("
|
|
507
|
-
.where("id", "=", installId)
|
|
508
|
-
.
|
|
495
|
+
.select("version")
|
|
496
|
+
.where("id", "=", dep.child.installId)
|
|
497
|
+
.forShare()
|
|
509
498
|
.executeTakeFirst();
|
|
510
|
-
if (
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
"i.name",
|
|
521
|
-
sql `coalesce((a.upgrade->>'startedAt')::timestamptz < now() - make_interval(mins => ${staleMinutes}), false)`.as("stale"),
|
|
522
|
-
])
|
|
523
|
-
.where("a.id", "=", installId)
|
|
524
|
-
.where("a.org_id", "=", orgId)
|
|
525
|
-
.forUpdate("a")
|
|
526
|
-
.executeTakeFirst();
|
|
527
|
-
if (row?.status !== "upgrading" || !row.stale)
|
|
528
|
-
return [];
|
|
529
|
-
const steps = journalEntries(row.upgrade);
|
|
530
|
-
const out = await this.installer.undoUpgradeIn(t, orgId, actor, installId, steps, "plugin_upgrade_cleanup");
|
|
499
|
+
if (!live || !satisfiesRange(live.version, dep.range)) {
|
|
500
|
+
throw new ApiError("catalog.dependency_unresolved", `Dependency ${dep.name}@${dep.range} cannot be resolved: its install in this organization changed meanwhile; preview the upgrade again`, [{ dependency: dep.name, range: dep.range }]);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
const report = await this.removeIn(orgId, actor, diff, disabled);
|
|
504
|
+
// An unchanged skill gets no new version, so the target's pinned suggestion goes onto its
|
|
505
|
+
// current version (when that version is this plugin's) here, with the version switch.
|
|
506
|
+
for (const sk of diff.skills) {
|
|
507
|
+
if (sk.change !== "unchanged" || !sk.ledger)
|
|
508
|
+
continue;
|
|
531
509
|
await t
|
|
532
|
-
.updateTable("
|
|
533
|
-
.set({
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
.where("
|
|
510
|
+
.updateTable("skill_versions as v")
|
|
511
|
+
.set({ suggest_pinned: sk.suggestPinned === true })
|
|
512
|
+
.from("skills as s")
|
|
513
|
+
.whereRef("s.id", "=", "v.skill_id")
|
|
514
|
+
.whereRef("s.current_version", "=", "v.version")
|
|
515
|
+
.where("s.id", "=", sk.ledger.ref)
|
|
516
|
+
.where("s.org_id", "=", orgId)
|
|
517
|
+
.where("v.catalog_item_id", "=", itemId)
|
|
518
|
+
.where("v.suggest_pinned", "<>", sk.suggestPinned === true)
|
|
539
519
|
.execute();
|
|
540
|
-
const j = row.upgrade;
|
|
541
|
-
await audit(t, {
|
|
542
|
-
actorAccountId: actor,
|
|
543
|
-
orgId,
|
|
544
|
-
action: "plugin.org_upgrade_failed",
|
|
545
|
-
target: installId,
|
|
546
|
-
detail: {
|
|
547
|
-
itemId: row.item_id,
|
|
548
|
-
name: row.name,
|
|
549
|
-
from: j?.from ?? null,
|
|
550
|
-
to: j?.to ?? null,
|
|
551
|
-
step: "interrupted",
|
|
552
|
-
code: "internal",
|
|
553
|
-
rolledBack: steps,
|
|
554
|
-
},
|
|
555
|
-
});
|
|
556
|
-
return out;
|
|
557
|
-
});
|
|
558
|
-
for (const r of removed) {
|
|
559
|
-
if (r.kind === "extension")
|
|
560
|
-
await this.d.orgConfigs.afterDisable(orgId, r.ref);
|
|
561
520
|
}
|
|
521
|
+
await t
|
|
522
|
+
.updateTable("plugin_installs")
|
|
523
|
+
.set({ version: diff.to.version, status: "installed", upgrade: null, error: null })
|
|
524
|
+
.where("id", "=", installId)
|
|
525
|
+
.execute();
|
|
526
|
+
await this.requests.resolveByInstall(orgId, itemId, actor, opts);
|
|
527
|
+
await audit(t, {
|
|
528
|
+
actorAccountId: actor,
|
|
529
|
+
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
530
|
+
orgId,
|
|
531
|
+
action: "plugin.org_upgraded",
|
|
532
|
+
target: installId,
|
|
533
|
+
detail: {
|
|
534
|
+
itemId,
|
|
535
|
+
name: diff.name,
|
|
536
|
+
from: diff.from.version,
|
|
537
|
+
to: diff.to.version,
|
|
538
|
+
components: diff.components,
|
|
539
|
+
removed: report.removed,
|
|
540
|
+
kept: report.kept,
|
|
541
|
+
},
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
/** Undoes a failed upgrade's journal (see {@link failed}) in a transaction of its own. */
|
|
545
|
+
async undoFailed(orgId, actor, installId, upgradeId, diff, steps, f, opts) {
|
|
546
|
+
const { at, code } = f;
|
|
547
|
+
const t = this.db;
|
|
548
|
+
await this.orgLock.lock(orgId);
|
|
549
|
+
const row = await t
|
|
550
|
+
.selectFrom("plugin_installs")
|
|
551
|
+
.select(sql `upgrade->>'id'`.as("upgradeId"))
|
|
552
|
+
.where("id", "=", installId)
|
|
553
|
+
.forUpdate()
|
|
554
|
+
.executeTakeFirst();
|
|
555
|
+
const ours = row?.upgradeId === upgradeId;
|
|
556
|
+
// Cleaned up meanwhile: only the step whose journal write found the journal gone is ours to
|
|
557
|
+
// undo. When that step ran in the same transaction as its journal write (the extension
|
|
558
|
+
// enable, the ledger rows), the transaction rolled back with the failed write, so undoing
|
|
559
|
+
// it is a no-op (a never-enabled extension, a never-inserted row); undoing is still safe.
|
|
560
|
+
const undo = ours ? steps.done : steps.unjournaled ? [steps.unjournaled] : [];
|
|
561
|
+
const out = await this.installer.undoUpgradeIn(orgId, actor, installId, undo, "plugin_upgrade_rollback");
|
|
562
|
+
await t
|
|
563
|
+
.updateTable("plugin_installs")
|
|
564
|
+
.set({ status: "installed", upgrade: null, error: JSON.stringify({ step: at, code }) })
|
|
565
|
+
.where("id", "=", installId)
|
|
566
|
+
.where(sql `upgrade->>'id'`, "=", upgradeId)
|
|
567
|
+
.execute();
|
|
568
|
+
await audit(t, {
|
|
569
|
+
actorAccountId: actor,
|
|
570
|
+
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
571
|
+
orgId,
|
|
572
|
+
action: "plugin.org_upgrade_failed",
|
|
573
|
+
target: installId,
|
|
574
|
+
detail: {
|
|
575
|
+
itemId: diff.itemId,
|
|
576
|
+
name: diff.name,
|
|
577
|
+
from: diff.from.version,
|
|
578
|
+
to: diff.to.version,
|
|
579
|
+
step: at,
|
|
580
|
+
code,
|
|
581
|
+
rolledBack: undo,
|
|
582
|
+
...(!ours && { cleanedUpMeanwhile: true }),
|
|
583
|
+
},
|
|
584
|
+
});
|
|
585
|
+
return out;
|
|
586
|
+
}
|
|
587
|
+
/** Undoes an interrupted upgrade (see {@link recoverInterrupted}) in a transaction of its own. */
|
|
588
|
+
async undoInterrupted(orgId, actor, installId) {
|
|
589
|
+
const staleMinutes = this.installer.staleInstallMinutes();
|
|
590
|
+
const t = this.db;
|
|
591
|
+
const peek = await t
|
|
592
|
+
.selectFrom("plugin_installs")
|
|
593
|
+
.select("status")
|
|
594
|
+
.where("id", "=", installId)
|
|
595
|
+
.where("org_id", "=", orgId)
|
|
596
|
+
.executeTakeFirst();
|
|
597
|
+
if (peek?.status !== "upgrading")
|
|
598
|
+
return [];
|
|
599
|
+
await this.orgLock.lock(orgId);
|
|
600
|
+
const row = await t
|
|
601
|
+
.selectFrom("plugin_installs as a")
|
|
602
|
+
.innerJoin("catalog_items as i", "i.id", "a.item_id")
|
|
603
|
+
.select([
|
|
604
|
+
"a.status",
|
|
605
|
+
"a.upgrade",
|
|
606
|
+
"a.item_id",
|
|
607
|
+
"i.name",
|
|
608
|
+
sql `coalesce((a.upgrade->>'startedAt')::timestamptz < now() - make_interval(mins => ${staleMinutes}), false)`.as("stale"),
|
|
609
|
+
])
|
|
610
|
+
.where("a.id", "=", installId)
|
|
611
|
+
.where("a.org_id", "=", orgId)
|
|
612
|
+
.forUpdate("a")
|
|
613
|
+
.executeTakeFirst();
|
|
614
|
+
if (row?.status !== "upgrading" || !row.stale)
|
|
615
|
+
return [];
|
|
616
|
+
const steps = journalEntries(row.upgrade);
|
|
617
|
+
const out = await this.installer.undoUpgradeIn(orgId, actor, installId, steps, "plugin_upgrade_cleanup");
|
|
618
|
+
await t
|
|
619
|
+
.updateTable("plugin_installs")
|
|
620
|
+
.set({
|
|
621
|
+
status: "installed",
|
|
622
|
+
upgrade: null,
|
|
623
|
+
error: JSON.stringify({ step: "interrupted", code: "internal" }),
|
|
624
|
+
})
|
|
625
|
+
.where("id", "=", installId)
|
|
626
|
+
.execute();
|
|
627
|
+
const j = row.upgrade;
|
|
628
|
+
await audit(t, {
|
|
629
|
+
actorAccountId: actor,
|
|
630
|
+
orgId,
|
|
631
|
+
action: "plugin.org_upgrade_failed",
|
|
632
|
+
target: installId,
|
|
633
|
+
detail: {
|
|
634
|
+
itemId: row.item_id,
|
|
635
|
+
name: row.name,
|
|
636
|
+
from: j?.from ?? null,
|
|
637
|
+
to: j?.to ?? null,
|
|
638
|
+
step: "interrupted",
|
|
639
|
+
code: "internal",
|
|
640
|
+
rolledBack: steps,
|
|
641
|
+
},
|
|
642
|
+
});
|
|
643
|
+
return out;
|
|
562
644
|
}
|
|
563
645
|
/**
|
|
564
646
|
* The removals of an upgrade, in the final transaction, by the uninstall rules
|
|
@@ -569,9 +651,10 @@ export class PluginUpgrader {
|
|
|
569
651
|
* install is uninstalled by the same rules (another install using it takes it over). Skills ->
|
|
570
652
|
* connectors -> extension -> dependencies.
|
|
571
653
|
*/
|
|
572
|
-
async removeIn(
|
|
654
|
+
async removeIn(orgId, actor, diff, disabled) {
|
|
573
655
|
const report = { removed: [], kept: [] };
|
|
574
656
|
const reason = "plugin_upgrade";
|
|
657
|
+
const t = this.db;
|
|
575
658
|
const keep = (kind, ref, why) => report.kept.push({ kind, ref, reason: why });
|
|
576
659
|
const row = (kind, ref) => t
|
|
577
660
|
.updateTable("plugin_install_components")
|
|
@@ -592,7 +675,7 @@ export class PluginUpgrader {
|
|
|
592
675
|
? diff.ledger.filter((l) => l.kind === "extension" && l.ref === diff.extension?.name)
|
|
593
676
|
: []),
|
|
594
677
|
];
|
|
595
|
-
const agentRefs = await this.installer.agentRefs(
|
|
678
|
+
const agentRefs = await this.installer.agentRefs(orgId);
|
|
596
679
|
const self = new Set([diff.installId]);
|
|
597
680
|
for (const l of removed) {
|
|
598
681
|
if (!l.created) {
|
|
@@ -600,7 +683,7 @@ export class PluginUpgrader {
|
|
|
600
683
|
keep(l.kind, l.ref, "pre_existing");
|
|
601
684
|
continue;
|
|
602
685
|
}
|
|
603
|
-
const outcome = await this.installer.decideRemovalIn(
|
|
686
|
+
const outcome = await this.installer.decideRemovalIn(orgId, actor, { kind: l.kind, ref: l.ref, created: true, skillVersion: null }, self, agentRefs, reason);
|
|
604
687
|
if (outcome === "used_by_agents" ||
|
|
605
688
|
outcome === "used_by_connectors" ||
|
|
606
689
|
outcome === "used_by_plugins") {
|
|
@@ -648,7 +731,7 @@ export class PluginUpgrader {
|
|
|
648
731
|
continue;
|
|
649
732
|
}
|
|
650
733
|
const sub = { removed: [], kept: [] };
|
|
651
|
-
const outcome = await this.installer.uninstallIn(
|
|
734
|
+
const outcome = await this.installer.uninstallIn(orgId, actor, ref, {
|
|
652
735
|
report: sub,
|
|
653
736
|
removing: new Set(),
|
|
654
737
|
from: diff.installId,
|
|
@@ -671,7 +754,7 @@ export class PluginUpgrader {
|
|
|
671
754
|
* otherwise the connector inputs are built and checked as at install.
|
|
672
755
|
*/
|
|
673
756
|
async diff(orgId, actor, installId, version, input) {
|
|
674
|
-
const db = this.
|
|
757
|
+
const db = this.db;
|
|
675
758
|
if (!UUID_RE.test(installId))
|
|
676
759
|
throw installNotFound();
|
|
677
760
|
const install = await db
|
|
@@ -725,7 +808,7 @@ export class PluginUpgrader {
|
|
|
725
808
|
}
|
|
726
809
|
// Target rules (Decision 10)
|
|
727
810
|
if (to.manifest.extension) {
|
|
728
|
-
const deployed = await deployedExtension(db, this.
|
|
811
|
+
const deployed = await deployedExtension(db, this.registry, name);
|
|
729
812
|
const allowed = deploymentTarget(versions, deployed);
|
|
730
813
|
if (allowed?.version !== to.version) {
|
|
731
814
|
throw targetInvalid(deployed === undefined
|
|
@@ -856,8 +939,8 @@ export class PluginUpgrader {
|
|
|
856
939
|
});
|
|
857
940
|
}
|
|
858
941
|
// Skills (by name)
|
|
859
|
-
const fromNames = await catalogSkillNames(this.
|
|
860
|
-
const toNames = await catalogSkillNames(this.
|
|
942
|
+
const fromNames = await catalogSkillNames(this.storage, from, from.manifest);
|
|
943
|
+
const toNames = await catalogSkillNames(this.storage, to, to.manifest);
|
|
861
944
|
const dirOf = (m, i) => packagePath((m.skills ?? [])[i]?.path);
|
|
862
945
|
const fromSkills = new Map(fromNames.map((n, i) => [n, dirOf(from.manifest, i)]));
|
|
863
946
|
const toSkills = new Map(toNames.map((n, i) => [n, dirOf(to.manifest, i)]));
|
|
@@ -914,8 +997,8 @@ export class PluginUpgrader {
|
|
|
914
997
|
if (conflicts.length > 0)
|
|
915
998
|
throw skillConflictError(conflicts);
|
|
916
999
|
// Agent templates (by name; phase C)
|
|
917
|
-
const fromAgents = await readCatalogAgentTemplates(this.
|
|
918
|
-
const toAgents = await readCatalogAgentTemplates(this.
|
|
1000
|
+
const fromAgents = await readCatalogAgentTemplates(this.storage, from);
|
|
1001
|
+
const toAgents = await readCatalogAgentTemplates(this.storage, to);
|
|
919
1002
|
const templateRefs = ledger.filter((l) => l.kind === "agent_template").map((l) => l.ref);
|
|
920
1003
|
const liveTemplates = templateRefs.length === 0
|
|
921
1004
|
? []
|
|
@@ -953,8 +1036,8 @@ export class PluginUpgrader {
|
|
|
953
1036
|
components.push({ kind: "agent_template", ref: a.name, change: a.change });
|
|
954
1037
|
}
|
|
955
1038
|
// Connector templates (by id)
|
|
956
|
-
const fromTemplates = await readCatalogTemplates(this.
|
|
957
|
-
const toTemplates = await readCatalogTemplates(this.
|
|
1039
|
+
const fromTemplates = await readCatalogTemplates(this.storage, from);
|
|
1040
|
+
const toTemplates = await readCatalogTemplates(this.storage, to);
|
|
958
1041
|
// The install's connectors by template; a dropped one (kept only for the agents using it) counts
|
|
959
1042
|
// only while its connector is live, so a template the target brings back maps onto it
|
|
960
1043
|
const connectorRows = ledger.filter((l) => l.kind === "connector" && l.template_id !== null);
|
|
@@ -1198,7 +1281,49 @@ export class PluginUpgrader {
|
|
|
1198
1281
|
...(c.credentialsChanged && credential !== undefined && { credential }),
|
|
1199
1282
|
};
|
|
1200
1283
|
}
|
|
1201
|
-
}
|
|
1284
|
+
};
|
|
1285
|
+
__decorate([
|
|
1286
|
+
Transactional()
|
|
1287
|
+
], PluginUpgrader.prototype, "authorizeActions", null);
|
|
1288
|
+
__decorate([
|
|
1289
|
+
Transactional({ propagation: "requires_new" })
|
|
1290
|
+
], PluginUpgrader.prototype, "start", null);
|
|
1291
|
+
__decorate([
|
|
1292
|
+
Transactional({ propagation: "requires_new" })
|
|
1293
|
+
], PluginUpgrader.prototype, "journalSkill", null);
|
|
1294
|
+
__decorate([
|
|
1295
|
+
Transactional({ propagation: "requires_new" })
|
|
1296
|
+
], PluginUpgrader.prototype, "upgradeAgentTemplate", null);
|
|
1297
|
+
__decorate([
|
|
1298
|
+
Transactional({ propagation: "requires_new" })
|
|
1299
|
+
], PluginUpgrader.prototype, "recordStep", null);
|
|
1300
|
+
__decorate([
|
|
1301
|
+
Transactional({ propagation: "requires_new" })
|
|
1302
|
+
], PluginUpgrader.prototype, "finish", null);
|
|
1303
|
+
__decorate([
|
|
1304
|
+
Transactional({ propagation: "requires_new" })
|
|
1305
|
+
], PluginUpgrader.prototype, "undoFailed", null);
|
|
1306
|
+
__decorate([
|
|
1307
|
+
Transactional({ propagation: "requires_new" })
|
|
1308
|
+
], PluginUpgrader.prototype, "undoInterrupted", null);
|
|
1309
|
+
__decorate([
|
|
1310
|
+
Transactional({ propagation: "mandatory" })
|
|
1311
|
+
], PluginUpgrader.prototype, "removeIn", null);
|
|
1312
|
+
PluginUpgrader = __decorate([
|
|
1313
|
+
Injectable(),
|
|
1314
|
+
__param(0, Inject(PluginInstaller)),
|
|
1315
|
+
__param(1, Inject(KernelDb)),
|
|
1316
|
+
__param(2, Inject(OrgLock)),
|
|
1317
|
+
__param(3, Inject(StorageService)),
|
|
1318
|
+
__param(4, Inject(ExtensionRegistry)),
|
|
1319
|
+
__param(5, Inject(SkillsService)),
|
|
1320
|
+
__param(6, Inject(OrgExtensionConfigs)),
|
|
1321
|
+
__param(7, Inject(CatalogRequestsService)),
|
|
1322
|
+
__param(8, Inject(ConnectorsService)),
|
|
1323
|
+
__param(9, Inject(KERNEL_LOGGER)),
|
|
1324
|
+
__param(10, Inject(TransactionHost))
|
|
1325
|
+
], PluginUpgrader);
|
|
1326
|
+
export { PluginUpgrader };
|
|
1202
1327
|
const cleanedUp = () => new ApiError("plugin.install_not_found", "The upgrade was cleaned up as interrupted while it was running");
|
|
1203
1328
|
/** The install's ledger rows. */
|
|
1204
1329
|
function ledgerOf(db, installId) {
|