@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
|
@@ -1,320 +1,32 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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";
|
|
3
11
|
import { ApiError } from "../errors.js";
|
|
4
|
-
import {
|
|
12
|
+
import { ExtensionRegistry } from "../extensions/registry.js";
|
|
13
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
14
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
15
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
16
|
+
import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
17
|
+
import { OrgLock } from "../orgs/org-lock.js";
|
|
5
18
|
import { can, roleAtLeast } from "../orgs/roles.js";
|
|
6
19
|
import { packagePath } from "../packages/tgz.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
20
|
+
import { StorageService } from "../storage/storage.service.js";
|
|
21
|
+
import { catalogHasIcon, findConnectorIn, lockOrgForActions, orgTemplateView, readCatalogIcon, readCatalogTemplates, templatePluginProblem, } from "./catalog-content.js";
|
|
22
|
+
import { itemView } from "./catalog-items.js";
|
|
23
|
+
import { PluginInstaller } from "./plugin-install.js";
|
|
24
|
+
import { PluginUpgrader } from "./plugin-upgrade.js";
|
|
25
|
+
import { CatalogRequestsService } from "./requests.service.js";
|
|
10
26
|
import { upgradeInfo } from "./upgrade-targets.js";
|
|
11
|
-
import { satisfiesRange } from "./versions.js";
|
|
12
|
-
/**
|
|
13
|
-
* A connector template as an org sees it (the install wizard and the upgrade preview's inputs):
|
|
14
|
-
* presets and editable paths, no credentials.
|
|
15
|
-
*/
|
|
16
|
-
export function orgTemplateView(id, file) {
|
|
17
|
-
const t = file.template;
|
|
18
|
-
return {
|
|
19
|
-
id,
|
|
20
|
-
displayName: file.displayName,
|
|
21
|
-
description: file.description ?? "",
|
|
22
|
-
plugin: t.plugin,
|
|
23
|
-
connector: t.connector,
|
|
24
|
-
endpoint: t.endpoint,
|
|
25
|
-
editableEndpoint: t.editableEndpoint ?? [],
|
|
26
|
-
auth: t.auth,
|
|
27
|
-
ownership: t.ownership ??
|
|
28
|
-
(typeof t.auth.ownership === "string" ? t.auth.ownership : null),
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
const iconNotFound = () => new ApiError("catalog.icon_not_found", "This catalog item has no icon");
|
|
32
|
-
/**
|
|
33
|
-
* The item's latest version row; item missing, deleted or (when `includeDisabled` is false)
|
|
34
|
-
* disabled -> `catalog.item_not_found`.
|
|
35
|
-
*/
|
|
36
|
-
async function latestVersionRow(db, itemId, includeDisabled) {
|
|
37
|
-
if (!UUID_RE.test(itemId))
|
|
38
|
-
throw itemNotFound();
|
|
39
|
-
const item = await db
|
|
40
|
-
.selectFrom("catalog_items")
|
|
41
|
-
.select(["latest_version", "policy"])
|
|
42
|
-
.where("id", "=", itemId)
|
|
43
|
-
.where("deleted_at", "is", null)
|
|
44
|
-
.executeTakeFirst();
|
|
45
|
-
// An item the caller cannot see is "not found" before any version / storage is read, so "no icon"
|
|
46
|
-
// never reveals that it exists
|
|
47
|
-
if (!item || (!includeDisabled && item.policy === "disabled"))
|
|
48
|
-
throw itemNotFound();
|
|
49
|
-
const v = await db
|
|
50
|
-
.selectFrom("catalog_item_versions")
|
|
51
|
-
.select(["manifest", "object_prefix", "files"])
|
|
52
|
-
.where("item_id", "=", itemId)
|
|
53
|
-
.where("version", "=", item.latest_version)
|
|
54
|
-
.executeTakeFirst();
|
|
55
|
-
if (!v)
|
|
56
|
-
throw itemNotFound();
|
|
57
|
-
return { item, v };
|
|
58
|
-
}
|
|
59
|
-
/** The icon's path in the version's files (undefined without an icon). */
|
|
60
|
-
const iconPath = (v) => {
|
|
61
|
-
const icon = v.manifest.icon;
|
|
62
|
-
return icon === undefined ? undefined : packagePath(icon);
|
|
63
|
-
};
|
|
64
|
-
/** Whether the item's latest version has an icon; unreadable counts as none. */
|
|
65
|
-
export async function catalogHasIcon(db, itemId) {
|
|
66
|
-
try {
|
|
67
|
-
const { v } = await latestVersionRow(db, itemId, true);
|
|
68
|
-
const path = iconPath(v);
|
|
69
|
-
return path !== undefined && v.files.some((f) => f.path === path);
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
return false;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Reads the icon of the item's latest version (served only through kernel routes, with nosniff and
|
|
77
|
-
* a CSP sandbox in the response headers; the web only shows it with `<img>`). Item missing, deleted
|
|
78
|
-
* or (when `includeDisabled` is false) disabled -> `catalog.item_not_found` (decided before reading
|
|
79
|
-
* storage); no icon -> `catalog.icon_not_found`; stored content that is not a valid svg / png
|
|
80
|
-
* (checked at import, this guards against tampered storage) -> `internal`.
|
|
81
|
-
*/
|
|
82
|
-
export async function readCatalogIcon(db, storage, itemId, includeDisabled) {
|
|
83
|
-
const { item, v } = await latestVersionRow(db, itemId, includeDisabled);
|
|
84
|
-
const path = iconPath(v);
|
|
85
|
-
const f = path === undefined ? undefined : v.files.find((x) => x.path === path);
|
|
86
|
-
if (path === undefined || !f)
|
|
87
|
-
throw iconNotFound();
|
|
88
|
-
const [file] = await readCatalogFiles(storage, v.object_prefix, [f]);
|
|
89
|
-
if (!file)
|
|
90
|
-
throw iconNotFound();
|
|
91
|
-
const problem = iconProblem(path, file.data);
|
|
92
|
-
if (problem !== undefined)
|
|
93
|
-
throw new ApiError("internal", `Stored icon is invalid: ${problem}`);
|
|
94
|
-
return {
|
|
95
|
-
data: file.data,
|
|
96
|
-
contentType: /\.svg$/i.test(path) ? "image/svg+xml" : "image/png",
|
|
97
|
-
policy: item.policy,
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
27
|
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
101
28
|
const itemNotFound = () => new ApiError("catalog.item_not_found", "Catalog item not found");
|
|
102
29
|
const itemDisabled = () => new ApiError("catalog.item_disabled", "This catalog item is disabled by the enterprise admin and cannot be newly installed");
|
|
103
|
-
const fail = (path, message) => new ApiError("validation_failed", "Request validation failed", [{ path, message }]);
|
|
104
|
-
/**
|
|
105
|
-
* The org actions installing / uninstalling a plugin needs: the union over its components (an
|
|
106
|
-
* extension -> `org.extensions.manage`, skills -> `skills.manage`, connector templates ->
|
|
107
|
-
* `connectors.manage`, agent templates -> `agents.manage`), re-checked inside the org row lock.
|
|
108
|
-
*/
|
|
109
|
-
export function requiredActions(m) {
|
|
110
|
-
const out = [];
|
|
111
|
-
if (m.extension)
|
|
112
|
-
out.push("org.extensions.manage");
|
|
113
|
-
if ((m.connectorTemplates ?? []).length > 0)
|
|
114
|
-
out.push("connectors.manage");
|
|
115
|
-
if ((m.skills ?? []).length > 0)
|
|
116
|
-
out.push("skills.manage");
|
|
117
|
-
if ((m.agents ?? []).length > 0)
|
|
118
|
-
out.push("agents.manage");
|
|
119
|
-
return out.length > 0 ? out : ["org.extensions.manage"];
|
|
120
|
-
}
|
|
121
|
-
/** Locks the org row in the caller's transaction and re-checks the actor can do every action (else `forbidden`). */
|
|
122
|
-
export async function lockOrgForActions(t, orgId, actor, actions) {
|
|
123
|
-
const [first, ...rest] = actions;
|
|
124
|
-
const { role } = await lockOrgAndAuthorize(t, orgId, actor, first);
|
|
125
|
-
for (const a of rest) {
|
|
126
|
-
if (!can(role, a))
|
|
127
|
-
throw new ApiError("forbidden", "Insufficient organization role");
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
131
|
-
const UNSAFE_KEYS = new Set(["__proto__", "prototype", "constructor"]);
|
|
132
|
-
/** 对象的全部叶子点路径(数组与非对象值算叶子)。 */
|
|
133
|
-
function leafPaths(v, base = "") {
|
|
134
|
-
const out = [];
|
|
135
|
-
for (const [k, x] of Object.entries(v)) {
|
|
136
|
-
const p = base ? `${base}.${k}` : k;
|
|
137
|
-
if (isObj(x) && Object.keys(x).length > 0)
|
|
138
|
-
out.push(...leafPaths(x, p));
|
|
139
|
-
else
|
|
140
|
-
out.push(p);
|
|
141
|
-
}
|
|
142
|
-
return out;
|
|
143
|
-
}
|
|
144
|
-
/** The value at a dot path of `v` (own keys only), undefined when absent. */
|
|
145
|
-
export function getPath(v, path) {
|
|
146
|
-
let node = v;
|
|
147
|
-
for (const seg of path.split(".")) {
|
|
148
|
-
if (!isObj(node) || !Object.hasOwn(node, seg))
|
|
149
|
-
return undefined;
|
|
150
|
-
node = node[seg];
|
|
151
|
-
}
|
|
152
|
-
return node;
|
|
153
|
-
}
|
|
154
|
-
/** Sets the value at a dot path of `obj`, creating the objects on the way. */
|
|
155
|
-
export function setPath(obj, path, value) {
|
|
156
|
-
const segs = path.split(".");
|
|
157
|
-
let node = obj;
|
|
158
|
-
for (const seg of segs.slice(0, -1)) {
|
|
159
|
-
if (!isObj(node[seg]))
|
|
160
|
-
node[seg] = {};
|
|
161
|
-
node = node[seg];
|
|
162
|
-
}
|
|
163
|
-
node[segs[segs.length - 1]] = value;
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* 模板的连接器插件此刻是否可用:插件加载且提供该 kind,并满足 `pluginVersion`(若写了);不可用返回原因
|
|
167
|
-
* (模型不可见,给管理员看的英文)。
|
|
168
|
-
*/
|
|
169
|
-
export function templatePluginProblem(d, template) {
|
|
170
|
-
if (!d.findConnector(template.plugin, template.connector)) {
|
|
171
|
-
return `Connector extension ${template.plugin} providing "${template.connector}" is not deployed; ask the enterprise admin to install and enable it`;
|
|
172
|
-
}
|
|
173
|
-
const range = template.pluginVersion;
|
|
174
|
-
const version = d.pluginVersion(template.plugin);
|
|
175
|
-
if (range !== undefined && version !== undefined && !satisfiesRange(version, range)) {
|
|
176
|
-
return `Connector extension ${template.plugin} is deployed at version ${version}, but the template needs ${range}; ask the enterprise admin to upgrade it`;
|
|
177
|
-
}
|
|
178
|
-
return undefined;
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Builds the connector install input from a connector template plus what the org filled in (C30):
|
|
182
|
-
* the endpoint comes from the template, only paths listed in `editableEndpoint` (or fields under
|
|
183
|
-
* them) may be changed by the org, changing another path -> `validation_failed`; the auth method
|
|
184
|
-
* comes from the template, the org only gives credentials (static credentials via `credential`,
|
|
185
|
-
* OAuth via `client`). Re-checks the template's plugin, kind and `pluginVersion` against the
|
|
186
|
-
* connectors loaded on this replica right now (unmet -> `catalog.not_deployed`); the endpoint
|
|
187
|
-
* (merged as a whole) schema check, credential pattern check and OAuth URL policy are re-checked by
|
|
188
|
-
* `ConnectorsService.create`.
|
|
189
|
-
*/
|
|
190
|
-
export function templateConnectorInput(deps, template, ref, input, defaultName, at = "connector") {
|
|
191
|
-
const problem = templatePluginProblem(deps, template);
|
|
192
|
-
if (problem !== undefined)
|
|
193
|
-
throw new ApiError("catalog.not_deployed", problem);
|
|
194
|
-
const given = input ?? {};
|
|
195
|
-
const editable = template.editableEndpoint ?? [];
|
|
196
|
-
const endpoint = structuredClone(template.endpoint);
|
|
197
|
-
if (given.endpoint !== undefined) {
|
|
198
|
-
if (!isObj(given.endpoint))
|
|
199
|
-
throw fail(`${at}.endpoint`, "Expected an object");
|
|
200
|
-
for (const p of leafPaths(given.endpoint)) {
|
|
201
|
-
const segs = p.split(".");
|
|
202
|
-
if (segs.some((s) => UNSAFE_KEYS.has(s))) {
|
|
203
|
-
throw fail(`${at}.endpoint.${p}`, "Invalid key");
|
|
204
|
-
}
|
|
205
|
-
const allowed = editable.some((e) => p === e || p.startsWith(`${e}.`));
|
|
206
|
-
if (!allowed) {
|
|
207
|
-
throw fail(`${at}.endpoint.${p}`, "This endpoint field is set by the template and cannot be changed");
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
for (const e of editable) {
|
|
211
|
-
const v = getPath(given.endpoint, e);
|
|
212
|
-
if (v !== undefined)
|
|
213
|
-
setPath(endpoint, e, v);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
const auth = template.auth;
|
|
217
|
-
const oauth = auth.type === "oauth_code" || auth.type === "oauth_client";
|
|
218
|
-
if (oauth && given.credential !== undefined) {
|
|
219
|
-
throw fail(`${at}.credential`, "This connector uses OAuth; provide client instead");
|
|
220
|
-
}
|
|
221
|
-
if (!oauth && given.client !== undefined) {
|
|
222
|
-
throw fail(`${at}.client`, "This connector does not use OAuth; provide credential instead");
|
|
223
|
-
}
|
|
224
|
-
const credential = oauth ? given.client : given.credential;
|
|
225
|
-
return {
|
|
226
|
-
name: given.name ?? defaultName,
|
|
227
|
-
...(given.slug !== undefined && { slug: given.slug }),
|
|
228
|
-
connector: template.connector,
|
|
229
|
-
endpoint,
|
|
230
|
-
auth,
|
|
231
|
-
...(credential !== undefined && { credential }),
|
|
232
|
-
template: {
|
|
233
|
-
...ref,
|
|
234
|
-
...(template.defaultToolPolicies !== undefined && {
|
|
235
|
-
defaultToolPolicies: template.defaultToolPolicies,
|
|
236
|
-
}),
|
|
237
|
-
},
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
/** 从部署存储读目录版本里的文件(按版本行的 sha256 校验);`under` 给出时只读该目录下的文件,路径去掉该前缀。 */
|
|
241
|
-
export async function readCatalogFiles(storage, objectPrefix, files, under) {
|
|
242
|
-
storage.assertAvailable();
|
|
243
|
-
if (objectPrefix === null)
|
|
244
|
-
return [];
|
|
245
|
-
const store = storage.deployment();
|
|
246
|
-
const dir = under === undefined ? "" : `${under}/`;
|
|
247
|
-
const out = [];
|
|
248
|
-
for (const f of files) {
|
|
249
|
-
if (!f.path.startsWith(dir))
|
|
250
|
-
continue;
|
|
251
|
-
const got = await store.get(`${objectPrefix}${f.path}`);
|
|
252
|
-
if (!got) {
|
|
253
|
-
throw new ApiError("storage.unavailable", `Catalog file ${f.path} is missing from object storage`);
|
|
254
|
-
}
|
|
255
|
-
const data = new Uint8Array(await new Response(got.body).arrayBuffer());
|
|
256
|
-
if (createHash("sha256").update(data).digest("hex") !== f.sha256) {
|
|
257
|
-
throw new ApiError("internal", `Catalog file ${f.path} does not match its recorded hash`);
|
|
258
|
-
}
|
|
259
|
-
out.push({ path: f.path.slice(dir.length), size: data.byteLength, sha256: f.sha256, data });
|
|
260
|
-
}
|
|
261
|
-
return out;
|
|
262
|
-
}
|
|
263
|
-
/** 校验技能文件并取名字与描述(导入时已校验过;这里防存储被改)。 */
|
|
264
|
-
export function skillOf(files) {
|
|
265
|
-
try {
|
|
266
|
-
// Stored files: a version imported before phase D keeps installing (its invocation keys are
|
|
267
|
-
// read leniently; `skillInvocation` ignores values of the wrong type)
|
|
268
|
-
return checkSkillFiles(files, { invocationKeys: false });
|
|
269
|
-
}
|
|
270
|
-
catch (e) {
|
|
271
|
-
if (e instanceof SkillArchiveError) {
|
|
272
|
-
throw new ApiError("internal", `Stored skill is invalid: ${e.problems.join("; ")}`);
|
|
273
|
-
}
|
|
274
|
-
throw e;
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
/** The connector templates of a catalog version, read from storage (id = the file's base name). */
|
|
278
|
-
export async function readCatalogTemplates(storage, v) {
|
|
279
|
-
const refs = v.manifest.connectorTemplates ?? [];
|
|
280
|
-
if (refs.length === 0)
|
|
281
|
-
return [];
|
|
282
|
-
const paths = refs.map((r) => packagePath(r.path));
|
|
283
|
-
const files = await readCatalogFiles(storage, v.object_prefix, v.files.filter((f) => paths.includes(f.path)));
|
|
284
|
-
return paths.map((path) => {
|
|
285
|
-
const f = files.find((x) => x.path === path);
|
|
286
|
-
let parsed;
|
|
287
|
-
try {
|
|
288
|
-
parsed = f && parseConnectorTemplateFile(JSON.parse(new TextDecoder().decode(f.data)));
|
|
289
|
-
}
|
|
290
|
-
catch {
|
|
291
|
-
parsed = undefined;
|
|
292
|
-
}
|
|
293
|
-
if (!parsed || "errors" in parsed) {
|
|
294
|
-
throw new ApiError("internal", `Stored connector template ${path} is missing or invalid`);
|
|
295
|
-
}
|
|
296
|
-
return { id: path.split("/").pop().replace(/\.json$/, ""), file: parsed };
|
|
297
|
-
});
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* The agent templates of a catalog version (`manifest.agents`, listed explicitly since import),
|
|
301
|
-
* parsed from storage (checked at import; parsed again in case storage was changed).
|
|
302
|
-
*/
|
|
303
|
-
export async function readCatalogAgentTemplates(storage, v) {
|
|
304
|
-
const refs = v.manifest.agents ?? [];
|
|
305
|
-
if (refs.length === 0)
|
|
306
|
-
return [];
|
|
307
|
-
const paths = refs.map((r) => packagePath(r.path));
|
|
308
|
-
const files = await readCatalogFiles(storage, v.object_prefix, v.files.filter((f) => paths.includes(f.path)));
|
|
309
|
-
return paths.map((path) => {
|
|
310
|
-
const f = files.find((x) => x.path === path);
|
|
311
|
-
const parsed = f && parseAgentTemplate(new TextDecoder().decode(f.data));
|
|
312
|
-
if (!parsed || "errors" in parsed) {
|
|
313
|
-
throw new ApiError("internal", `Stored agent template ${path} is missing or invalid`);
|
|
314
|
-
}
|
|
315
|
-
return { path, template: parsed.template };
|
|
316
|
-
});
|
|
317
|
-
}
|
|
318
30
|
/**
|
|
319
31
|
* Organizations browse and install from the enterprise catalog (C22): members browse (without
|
|
320
32
|
* disabled items) and request, org admins install. Every item is a plugin, installed with its
|
|
@@ -325,21 +37,43 @@ export async function readCatalogAgentTemplates(storage, v) {
|
|
|
325
37
|
* `catalog.not_deployed`; needs_approval without a grant -> a stage deployment request (HTTP 202;
|
|
326
38
|
* dependencies are not approved separately, spec §10). No in-process state.
|
|
327
39
|
*/
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
40
|
+
let OrgCatalogService = class OrgCatalogService {
|
|
41
|
+
kdb;
|
|
42
|
+
orgLock;
|
|
43
|
+
storage;
|
|
44
|
+
registry;
|
|
45
|
+
requests;
|
|
46
|
+
pluginInstaller;
|
|
47
|
+
pluginUpgrader;
|
|
48
|
+
log;
|
|
49
|
+
txHost;
|
|
50
|
+
constructor(kdb,
|
|
51
|
+
/** The org row lock (orgs/org-lock.ts): joins the caller's transaction. */
|
|
52
|
+
orgLock, storage, registry, requests, pluginInstaller, pluginUpgrader, log, txHost) {
|
|
53
|
+
this.kdb = kdb;
|
|
54
|
+
this.orgLock = orgLock;
|
|
55
|
+
this.storage = storage;
|
|
56
|
+
this.registry = registry;
|
|
57
|
+
this.requests = requests;
|
|
58
|
+
this.pluginInstaller = pluginInstaller;
|
|
59
|
+
this.pluginUpgrader = pluginUpgrader;
|
|
60
|
+
this.log = log;
|
|
61
|
+
this.txHost = txHost;
|
|
62
|
+
}
|
|
63
|
+
/** The kernel-schema handle of the current context (the transaction, else the pool). */
|
|
64
|
+
get db() {
|
|
65
|
+
return this.kdb.db;
|
|
332
66
|
}
|
|
333
67
|
/** The org's view of the items; members (not admins) don't see disabled items. */
|
|
334
68
|
async list(orgId, accountId, itemId) {
|
|
335
|
-
const m = await this.
|
|
69
|
+
const m = await this.db
|
|
336
70
|
.selectFrom("memberships")
|
|
337
71
|
.select("role")
|
|
338
72
|
.where("org_id", "=", orgId)
|
|
339
73
|
.where("account_id", "=", accountId)
|
|
340
74
|
.executeTakeFirst();
|
|
341
75
|
const isAdmin = m !== undefined && roleAtLeast(m.role, "admin");
|
|
342
|
-
let q = this.
|
|
76
|
+
let q = this.db
|
|
343
77
|
.selectFrom("catalog_items")
|
|
344
78
|
.selectAll()
|
|
345
79
|
.where("deleted_at", "is", null)
|
|
@@ -354,25 +88,25 @@ export class OrgCatalogService {
|
|
|
354
88
|
return [];
|
|
355
89
|
const ids = items.map((i) => i.id);
|
|
356
90
|
const [versions, grants, requests, pluginInstalls] = await Promise.all([
|
|
357
|
-
this.
|
|
91
|
+
this.db
|
|
358
92
|
.selectFrom("catalog_item_versions")
|
|
359
93
|
.select(["item_id", "version", "source", "manifest", "object_prefix", "files"])
|
|
360
94
|
.where("item_id", "in", ids)
|
|
361
95
|
.execute(),
|
|
362
|
-
this.
|
|
96
|
+
this.db
|
|
363
97
|
.selectFrom("catalog_org_grants")
|
|
364
98
|
.select("item_id")
|
|
365
99
|
.where("org_id", "=", orgId)
|
|
366
100
|
.execute(),
|
|
367
|
-
this.
|
|
368
|
-
this.
|
|
101
|
+
this.requests.latestByItem(orgId),
|
|
102
|
+
this.db
|
|
369
103
|
.selectFrom("plugin_installs")
|
|
370
104
|
.select(["id", "item_id", "version"])
|
|
371
105
|
.where("org_id", "=", orgId)
|
|
372
106
|
.where("status", "in", ["installing", "installed", "upgrading"])
|
|
373
107
|
.execute(),
|
|
374
108
|
]);
|
|
375
|
-
const upgrades = await upgradeInfo(this.
|
|
109
|
+
const upgrades = await upgradeInfo(this.db, this.registry, pluginInstalls.flatMap((a) => {
|
|
376
110
|
const item = items.find((i) => i.id === a.item_id);
|
|
377
111
|
return item ? [{ itemId: a.item_id, name: item.name, version: a.version }] : [];
|
|
378
112
|
}));
|
|
@@ -425,7 +159,7 @@ export class OrgCatalogService {
|
|
|
425
159
|
const [item] = await this.list(orgId, accountId, itemId);
|
|
426
160
|
if (!item)
|
|
427
161
|
throw itemNotFound();
|
|
428
|
-
const v = await this.
|
|
162
|
+
const v = await this.db
|
|
429
163
|
.selectFrom("catalog_item_versions")
|
|
430
164
|
.select(["manifest", "object_prefix", "files"])
|
|
431
165
|
.where("item_id", "=", itemId)
|
|
@@ -438,7 +172,7 @@ export class OrgCatalogService {
|
|
|
438
172
|
item,
|
|
439
173
|
hasIcon: m.icon !== undefined,
|
|
440
174
|
extension: m.extension ? m.name : null,
|
|
441
|
-
templates: (await readCatalogTemplates(this.
|
|
175
|
+
templates: (await readCatalogTemplates(this.storage, v)).map((t) => orgTemplateView(t.id, t.file)),
|
|
442
176
|
dependencies: (m.dependencies ?? []).map((d) => ({ name: d.name, range: d.version })),
|
|
443
177
|
skills: (m.skills ?? []).map((s) => packagePath(s.path)),
|
|
444
178
|
agents: (m.agents ?? []).map((a) => packagePath(a.path)),
|
|
@@ -449,11 +183,11 @@ export class OrgCatalogService {
|
|
|
449
183
|
* reading storage).
|
|
450
184
|
*/
|
|
451
185
|
icon(itemId, isAdmin) {
|
|
452
|
-
return readCatalogIcon(this.
|
|
186
|
+
return readCatalogIcon(this.db, this.storage, itemId, isAdmin);
|
|
453
187
|
}
|
|
454
188
|
/** For the admin item detail: whether the latest version has an icon. */
|
|
455
189
|
hasIcon(itemId) {
|
|
456
|
-
return catalogHasIcon(this.
|
|
190
|
+
return catalogHasIcon(this.db, itemId);
|
|
457
191
|
}
|
|
458
192
|
/**
|
|
459
193
|
* The items (latest versions) this replica cannot install now: the plugin's extension is not
|
|
@@ -462,9 +196,9 @@ export class OrgCatalogService {
|
|
|
462
196
|
* deployed here (the install reads it again).
|
|
463
197
|
*/
|
|
464
198
|
async undeployed(versions) {
|
|
465
|
-
const loaded = new Map(this.
|
|
199
|
+
const loaded = new Map(this.registry.manifests().map((m) => [m.name, m.version]));
|
|
466
200
|
const deps = {
|
|
467
|
-
findConnector: this.
|
|
201
|
+
findConnector: (plugin, kind) => findConnectorIn(this.registry, plugin, kind),
|
|
468
202
|
pluginVersion: (n) => loaded.get(n),
|
|
469
203
|
};
|
|
470
204
|
const out = new Set();
|
|
@@ -477,14 +211,14 @@ export class OrgCatalogService {
|
|
|
477
211
|
if ((m.connectorTemplates ?? []).length === 0)
|
|
478
212
|
return;
|
|
479
213
|
try {
|
|
480
|
-
const templates = await readCatalogTemplates(this.
|
|
214
|
+
const templates = await readCatalogTemplates(this.storage, v);
|
|
481
215
|
if (templates.some((t) => templatePluginProblem(deps, t.file.template) !== undefined)) {
|
|
482
216
|
out.add(v.item_id);
|
|
483
217
|
}
|
|
484
218
|
}
|
|
485
219
|
catch (e) {
|
|
486
220
|
// Unreadable here: counted as deployed, the install reports it
|
|
487
|
-
this.
|
|
221
|
+
this.log.warn("catalog template read failed in the org list", {
|
|
488
222
|
itemId: v.item_id,
|
|
489
223
|
error: e instanceof Error ? e.message : String(e),
|
|
490
224
|
});
|
|
@@ -498,13 +232,8 @@ export class OrgCatalogService {
|
|
|
498
232
|
throw itemNotFound();
|
|
499
233
|
// The role first (forbidden when it can install nothing), then item errors: a member cannot
|
|
500
234
|
// probe the existence or versions of a disabled item through error codes
|
|
501
|
-
await this.
|
|
502
|
-
|
|
503
|
-
const canAny = ["org.extensions.manage", "connectors.manage", "skills.manage"].some((a) => can(role, a));
|
|
504
|
-
if (!canAny)
|
|
505
|
-
throw new ApiError("forbidden", "Insufficient organization role");
|
|
506
|
-
});
|
|
507
|
-
const item = await this.d.db
|
|
235
|
+
await this.assertCanInstall(orgId, actor);
|
|
236
|
+
const item = await this.db
|
|
508
237
|
.selectFrom("catalog_items")
|
|
509
238
|
.selectAll()
|
|
510
239
|
.where("id", "=", itemId)
|
|
@@ -513,7 +242,7 @@ export class OrgCatalogService {
|
|
|
513
242
|
if (!item)
|
|
514
243
|
throw itemNotFound();
|
|
515
244
|
const version = body.version ?? item.latest_version;
|
|
516
|
-
const v = await this.
|
|
245
|
+
const v = await this.db
|
|
517
246
|
.selectFrom("catalog_item_versions")
|
|
518
247
|
.select("version")
|
|
519
248
|
.where("item_id", "=", itemId)
|
|
@@ -526,50 +255,57 @@ export class OrgCatalogService {
|
|
|
526
255
|
throw itemDisabled();
|
|
527
256
|
// Dependencies resolved, extensions deployed, template connectors available: before a request
|
|
528
257
|
// is created. The actions are the union over the plugins the install brings in
|
|
529
|
-
const { actions } = await this.
|
|
258
|
+
const { actions } = await this.pluginInstaller.preflight(orgId, actor, itemId, version);
|
|
530
259
|
// 1. Role and policy under the lock; needs_approval without a grant -> a request (202). Approval
|
|
531
260
|
// follows this plugin's policy only, not its dependencies' (spec §10)
|
|
532
|
-
const pending = await this.
|
|
533
|
-
await lockOrgForActions(t, orgId, actor, actions);
|
|
534
|
-
const locked = await t
|
|
535
|
-
.selectFrom("catalog_items")
|
|
536
|
-
.select(["policy", "deleted_at"])
|
|
537
|
-
.where("id", "=", itemId)
|
|
538
|
-
.forShare()
|
|
539
|
-
.executeTakeFirst();
|
|
540
|
-
if (!locked || locked.deleted_at !== null)
|
|
541
|
-
throw itemNotFound();
|
|
542
|
-
if (locked.policy === "disabled")
|
|
543
|
-
throw itemDisabled();
|
|
544
|
-
if (locked.policy === "needs_approval") {
|
|
545
|
-
const grant = await t
|
|
546
|
-
.selectFrom("catalog_org_grants")
|
|
547
|
-
.select("item_id")
|
|
548
|
-
.where("item_id", "=", itemId)
|
|
549
|
-
.where("org_id", "=", orgId)
|
|
550
|
-
.executeTakeFirst();
|
|
551
|
-
if (!grant) {
|
|
552
|
-
return this.d.requests.requestDeployment(t, orgId, actor, item, version, opts);
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
return undefined;
|
|
556
|
-
});
|
|
261
|
+
const pending = await this.requestIfNeeded(orgId, actor, item, version, actions, opts);
|
|
557
262
|
if (pending !== undefined) {
|
|
558
|
-
return { status: 202, request: await this.
|
|
263
|
+
return { status: 202, request: await this.requests.view(pending) };
|
|
559
264
|
}
|
|
560
265
|
// 2. Install (each step re-checks the item policy in its own transaction)
|
|
561
266
|
const { version: _version, ...input } = body;
|
|
562
|
-
const view = await this.
|
|
267
|
+
const view = await this.pluginInstaller.install(orgId, actor, itemId, version, input, opts);
|
|
563
268
|
return {
|
|
564
269
|
status: 201,
|
|
565
270
|
installed: { itemId, version, pluginInstallId: view.id },
|
|
566
271
|
install: view,
|
|
567
272
|
};
|
|
568
273
|
}
|
|
274
|
+
/**
|
|
275
|
+
* Role and policy under the org row lock; needs_approval without a grant -> a stage deployment
|
|
276
|
+
* request (its id). Approval follows this plugin's policy only, not its dependencies' (spec §10).
|
|
277
|
+
*/
|
|
278
|
+
async requestIfNeeded(orgId, actor, item, version, actions, opts) {
|
|
279
|
+
const itemId = item.id;
|
|
280
|
+
const t = this.db;
|
|
281
|
+
await lockOrgForActions(this.orgLock, orgId, actor, actions);
|
|
282
|
+
const locked = await t
|
|
283
|
+
.selectFrom("catalog_items")
|
|
284
|
+
.select(["policy", "deleted_at"])
|
|
285
|
+
.where("id", "=", itemId)
|
|
286
|
+
.forShare()
|
|
287
|
+
.executeTakeFirst();
|
|
288
|
+
if (!locked || locked.deleted_at !== null)
|
|
289
|
+
throw itemNotFound();
|
|
290
|
+
if (locked.policy === "disabled")
|
|
291
|
+
throw itemDisabled();
|
|
292
|
+
if (locked.policy === "needs_approval") {
|
|
293
|
+
const grant = await t
|
|
294
|
+
.selectFrom("catalog_org_grants")
|
|
295
|
+
.select("item_id")
|
|
296
|
+
.where("item_id", "=", itemId)
|
|
297
|
+
.where("org_id", "=", orgId)
|
|
298
|
+
.executeTakeFirst();
|
|
299
|
+
if (!grant) {
|
|
300
|
+
return this.requests.requestDeployment(orgId, actor, item, version, opts);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return undefined;
|
|
304
|
+
}
|
|
569
305
|
/** The upgrade preview of an org install (spec §10, see `PluginUpgrader`). */
|
|
570
306
|
async upgradePreview(orgId, actor, installId, version) {
|
|
571
307
|
await this.assertCanInstall(orgId, actor);
|
|
572
|
-
return this.
|
|
308
|
+
return this.pluginUpgrader.preview(orgId, actor, installId, version);
|
|
573
309
|
}
|
|
574
310
|
/**
|
|
575
311
|
* Upgrades an org install in place (spec §10, Decision 11): the preview's `diffHash` is checked
|
|
@@ -580,46 +316,69 @@ export class OrgCatalogService {
|
|
|
580
316
|
async upgrade(orgId, actor, installId, body, actorTokenId) {
|
|
581
317
|
await this.assertCanInstall(orgId, actor);
|
|
582
318
|
const opts = actorTokenId !== undefined ? { actorTokenId } : {};
|
|
583
|
-
const { itemId, actions, diff } = await this.
|
|
584
|
-
const pending = await this.
|
|
585
|
-
await lockOrgForActions(t, orgId, actor, actions);
|
|
586
|
-
const locked = await t
|
|
587
|
-
.selectFrom("catalog_items")
|
|
588
|
-
.select(["id", "name", "policy", "deleted_at"])
|
|
589
|
-
.where("id", "=", itemId)
|
|
590
|
-
.forShare()
|
|
591
|
-
.executeTakeFirst();
|
|
592
|
-
if (!locked || locked.deleted_at !== null)
|
|
593
|
-
throw itemNotFound();
|
|
594
|
-
if (locked.policy === "disabled")
|
|
595
|
-
throw itemDisabled();
|
|
596
|
-
if (locked.policy !== "needs_approval")
|
|
597
|
-
return undefined;
|
|
598
|
-
const grant = await t
|
|
599
|
-
.selectFrom("catalog_org_grants")
|
|
600
|
-
.select("item_id")
|
|
601
|
-
.where("item_id", "=", itemId)
|
|
602
|
-
.where("org_id", "=", orgId)
|
|
603
|
-
.executeTakeFirst();
|
|
604
|
-
if (grant)
|
|
605
|
-
return undefined;
|
|
606
|
-
return this.d.requests.requestDeployment(t, orgId, actor, locked, body.version, opts);
|
|
607
|
-
});
|
|
319
|
+
const { itemId, actions, diff } = await this.pluginUpgrader.check(orgId, actor, installId, body);
|
|
320
|
+
const pending = await this.upgradeRequestIfNeeded(orgId, actor, itemId, body, actions, opts);
|
|
608
321
|
if (pending !== undefined) {
|
|
609
|
-
return { status: 202, request: await this.
|
|
322
|
+
return { status: 202, request: await this.requests.view(pending) };
|
|
610
323
|
}
|
|
611
324
|
return {
|
|
612
325
|
status: 200,
|
|
613
|
-
install: await this.
|
|
326
|
+
install: await this.pluginUpgrader.upgrade(orgId, actor, installId, body, opts, diff),
|
|
614
327
|
};
|
|
615
328
|
}
|
|
329
|
+
/** Like {@link requestIfNeeded}, for an upgrade's target version. */
|
|
330
|
+
async upgradeRequestIfNeeded(orgId, actor, itemId, body, actions, opts) {
|
|
331
|
+
const t = this.db;
|
|
332
|
+
await lockOrgForActions(this.orgLock, orgId, actor, actions);
|
|
333
|
+
const locked = await t
|
|
334
|
+
.selectFrom("catalog_items")
|
|
335
|
+
.select(["id", "name", "policy", "deleted_at"])
|
|
336
|
+
.where("id", "=", itemId)
|
|
337
|
+
.forShare()
|
|
338
|
+
.executeTakeFirst();
|
|
339
|
+
if (!locked || locked.deleted_at !== null)
|
|
340
|
+
throw itemNotFound();
|
|
341
|
+
if (locked.policy === "disabled")
|
|
342
|
+
throw itemDisabled();
|
|
343
|
+
if (locked.policy !== "needs_approval")
|
|
344
|
+
return undefined;
|
|
345
|
+
const grant = await t
|
|
346
|
+
.selectFrom("catalog_org_grants")
|
|
347
|
+
.select("item_id")
|
|
348
|
+
.where("item_id", "=", itemId)
|
|
349
|
+
.where("org_id", "=", orgId)
|
|
350
|
+
.executeTakeFirst();
|
|
351
|
+
if (grant)
|
|
352
|
+
return undefined;
|
|
353
|
+
return this.requests.requestDeployment(orgId, actor, locked, body.version, opts);
|
|
354
|
+
}
|
|
616
355
|
/** The actor can install something in the org (forbidden otherwise), checked before item errors. */
|
|
617
356
|
async assertCanInstall(orgId, actor) {
|
|
618
|
-
await this.
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
throw new ApiError("forbidden", "Insufficient organization role");
|
|
623
|
-
});
|
|
357
|
+
const { role } = await this.orgLock.lockAndAuthorize(orgId, actor, "catalog.read");
|
|
358
|
+
const canAny = ["org.extensions.manage", "connectors.manage", "skills.manage"].some((a) => can(role, a));
|
|
359
|
+
if (!canAny)
|
|
360
|
+
throw new ApiError("forbidden", "Insufficient organization role");
|
|
624
361
|
}
|
|
625
|
-
}
|
|
362
|
+
};
|
|
363
|
+
__decorate([
|
|
364
|
+
Transactional()
|
|
365
|
+
], OrgCatalogService.prototype, "requestIfNeeded", null);
|
|
366
|
+
__decorate([
|
|
367
|
+
Transactional()
|
|
368
|
+
], OrgCatalogService.prototype, "upgradeRequestIfNeeded", null);
|
|
369
|
+
__decorate([
|
|
370
|
+
Transactional()
|
|
371
|
+
], OrgCatalogService.prototype, "assertCanInstall", null);
|
|
372
|
+
OrgCatalogService = __decorate([
|
|
373
|
+
Injectable(),
|
|
374
|
+
__param(0, Inject(KernelDb)),
|
|
375
|
+
__param(1, Inject(OrgLock)),
|
|
376
|
+
__param(2, Inject(StorageService)),
|
|
377
|
+
__param(3, Inject(ExtensionRegistry)),
|
|
378
|
+
__param(4, Inject(CatalogRequestsService)),
|
|
379
|
+
__param(5, Inject(PluginInstaller)),
|
|
380
|
+
__param(6, Inject(PluginUpgrader)),
|
|
381
|
+
__param(7, Inject(KERNEL_LOGGER)),
|
|
382
|
+
__param(8, Inject(TransactionHost))
|
|
383
|
+
], OrgCatalogService);
|
|
384
|
+
export { OrgCatalogService };
|