@capybara-hq/kernel 0.1.0-rc.2 → 0.1.0-rc.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bootstrap.json +85 -5
- package/dist/admin/admin-agents.controller.d.ts +28 -0
- package/dist/admin/admin-agents.controller.js +79 -0
- package/dist/admin/admin-connectors.controller.d.ts +29 -0
- package/dist/admin/admin-connectors.controller.js +79 -0
- package/dist/admin/admin-items.schemas.d.ts +42 -0
- package/dist/admin/admin-items.schemas.js +48 -0
- package/dist/admin/admin.controller.d.ts +52 -80
- package/dist/admin/admin.controller.js +112 -81
- package/dist/admin/admin.module.d.ts +4 -1
- package/dist/admin/admin.module.js +50 -4
- package/dist/admin/admin.schemas.d.ts +69 -0
- package/dist/admin/admin.schemas.js +53 -0
- package/dist/admin/audit.controller.d.ts +14 -0
- package/dist/admin/audit.controller.js +42 -0
- package/dist/admin/audit.schemas.d.ts +8 -0
- package/dist/admin/audit.schemas.js +17 -0
- package/dist/admin/extensions.controller.d.ts +34 -3
- package/dist/admin/extensions.controller.js +66 -8
- package/dist/admin/extensions.schemas.d.ts +7 -0
- package/dist/admin/extensions.schemas.js +10 -0
- package/dist/admin/health.service.d.ts +104 -0
- package/dist/admin/health.service.js +246 -0
- package/dist/admin/limit-defaults.d.ts +20 -0
- package/dist/admin/limit-defaults.js +10 -0
- package/dist/admin/overview.controller.d.ts +31 -0
- package/dist/admin/overview.controller.js +78 -0
- package/dist/admin/overview.schemas.d.ts +8 -0
- package/dist/admin/overview.schemas.js +13 -0
- package/dist/admin/overview.service.d.ts +112 -0
- package/dist/admin/overview.service.js +223 -0
- package/dist/admin/platform-audit.service.d.ts +41 -0
- package/dist/admin/platform-audit.service.js +70 -0
- package/dist/admin/setup-lock.d.ts +1 -1
- package/dist/admin/setup-lock.js +1 -1
- package/dist/admin/setup.controller.d.ts +1 -1
- package/dist/admin/setup.controller.js +1 -1
- package/dist/admin/setup.service.d.ts +4 -4
- package/dist/admin/setup.service.js +8 -8
- package/dist/admin/usage.service.d.ts +149 -0
- package/dist/admin/usage.service.js +321 -0
- package/dist/agents/admin-agents.d.ts +92 -0
- package/dist/agents/admin-agents.js +170 -0
- package/dist/agents/agent-lookup.d.ts +24 -0
- package/dist/agents/agent-lookup.js +46 -2
- package/dist/agents/agent-profile.service.d.ts +31 -0
- package/dist/agents/agent-profile.service.js +122 -0
- package/dist/agents/agents.controller.d.ts +53 -168
- package/dist/agents/agents.controller.js +163 -34
- package/dist/agents/agents.module.d.ts +6 -2
- package/dist/agents/agents.module.js +41 -7
- package/dist/agents/agents.schemas.d.ts +392 -0
- package/dist/agents/agents.schemas.js +126 -0
- package/dist/agents/agents.service.d.ts +121 -36
- package/dist/agents/agents.service.js +411 -121
- package/dist/agents/definition.d.ts +142 -21
- package/dist/agents/definition.js +389 -43
- package/dist/agents/from-template.d.ts +106 -0
- package/dist/agents/from-template.js +680 -0
- package/dist/agents/from-template.service.d.ts +72 -0
- package/dist/agents/from-template.service.js +178 -0
- package/dist/agents/instruction-files.d.ts +60 -0
- package/dist/agents/instruction-files.js +111 -0
- package/dist/agents/models.controller.d.ts +44 -6
- package/dist/agents/models.controller.js +84 -8
- package/dist/agents/org-templates.d.ts +186 -0
- package/dist/agents/org-templates.js +876 -0
- package/dist/agents/pending-connector-requests.d.ts +79 -0
- package/dist/agents/pending-connector-requests.js +215 -0
- package/dist/agents/pending-connectors.controller.d.ts +39 -0
- package/dist/agents/pending-connectors.controller.js +91 -0
- package/dist/agents/pending-connectors.service.d.ts +62 -0
- package/dist/agents/pending-connectors.service.js +282 -0
- package/dist/agents/profile.d.ts +114 -0
- package/dist/agents/profile.js +55 -0
- package/dist/agents/readiness.controller.d.ts +26 -0
- package/dist/agents/readiness.controller.js +56 -0
- package/dist/agents/templates.controller.d.ts +77 -5
- package/dist/agents/templates.controller.js +153 -7
- package/dist/agents/templates.d.ts +127 -23
- package/dist/agents/templates.js +482 -44
- package/dist/agents/templates.schemas.d.ts +20 -0
- package/dist/agents/templates.schemas.js +45 -0
- package/dist/background/background.controller.d.ts +38 -0
- package/dist/background/background.controller.js +88 -0
- package/dist/background/background.module.d.ts +10 -0
- package/dist/background/background.module.js +39 -0
- package/dist/background/background.schemas.d.ts +10 -0
- package/dist/background/background.schemas.js +16 -0
- package/dist/background/finish.d.ts +44 -0
- package/dist/background/finish.js +95 -0
- package/dist/background/launch-lock.d.ts +15 -0
- package/dist/background/launch-lock.js +40 -0
- package/dist/background/launch.d.ts +42 -0
- package/dist/background/launch.js +77 -0
- package/dist/background/poll.job.d.ts +56 -0
- package/dist/background/poll.job.js +195 -0
- package/dist/background/render.d.ts +23 -0
- package/dist/background/render.js +48 -0
- package/dist/background/session.d.ts +48 -0
- package/dist/background/session.js +80 -0
- package/dist/background/status.d.ts +35 -0
- package/dist/background/status.js +57 -0
- package/dist/background/stop.d.ts +68 -0
- package/dist/background/stop.js +244 -0
- package/dist/background/store.d.ts +167 -0
- package/dist/background/store.js +361 -0
- package/dist/background/store.module.d.ts +6 -0
- package/dist/background/store.module.js +22 -0
- package/dist/background/tasks.service.d.ts +109 -0
- package/dist/background/tasks.service.js +271 -0
- package/dist/background/wake-rules.d.ts +66 -0
- package/dist/background/wake-rules.js +113 -0
- package/dist/background/wake.d.ts +30 -0
- package/dist/background/wake.js +63 -0
- package/dist/catalog/admin-catalog.controller.d.ts +136 -52
- package/dist/catalog/admin-catalog.controller.js +275 -65
- package/dist/catalog/admin-catalog.schemas.d.ts +82 -0
- package/dist/catalog/admin-catalog.schemas.js +99 -0
- package/dist/catalog/appearance.schemas.d.ts +10 -0
- package/dist/catalog/appearance.schemas.js +20 -0
- package/dist/catalog/appearance.service.d.ts +105 -0
- package/dist/catalog/appearance.service.js +306 -0
- package/dist/catalog/catalog-content.d.ts +122 -35
- package/dist/catalog/catalog-content.js +122 -14
- package/dist/catalog/catalog-files.d.ts +42 -0
- package/dist/catalog/catalog-files.js +89 -0
- package/dist/catalog/catalog-import.module.d.ts +7 -0
- package/dist/catalog/catalog-import.module.js +63 -0
- package/dist/catalog/catalog-items.d.ts +122 -7
- package/dist/catalog/catalog-items.js +301 -13
- package/dist/catalog/catalog-scope.service.d.ts +293 -0
- package/dist/catalog/catalog-scope.service.js +1236 -0
- package/dist/catalog/catalog.module.d.ts +7 -9
- package/dist/catalog/catalog.module.js +47 -31
- package/dist/catalog/catalog.service.d.ts +122 -31
- package/dist/catalog/catalog.service.js +177 -105
- package/dist/catalog/claude/agents.js +15 -10
- package/dist/catalog/claude/translate.js +3 -0
- package/dist/catalog/cli.d.ts +11 -1
- package/dist/catalog/cli.js +29 -1
- package/dist/catalog/component-promotion.d.ts +96 -0
- package/dist/catalog/component-promotion.js +395 -0
- package/dist/catalog/component-scope.controller.d.ts +102 -0
- package/dist/catalog/component-scope.controller.js +257 -0
- package/dist/catalog/component-scope.schemas.d.ts +118 -0
- package/dist/catalog/component-scope.schemas.js +97 -0
- package/dist/catalog/component-scope.service.d.ts +394 -0
- package/dist/catalog/component-scope.service.js +1133 -0
- package/dist/catalog/component-state.d.ts +207 -0
- package/dist/catalog/component-state.js +484 -0
- package/dist/catalog/git-source.d.ts +9 -1
- package/dist/catalog/git-source.js +29 -2
- package/dist/catalog/job-ids.d.ts +30 -0
- package/dist/catalog/job-ids.js +25 -0
- package/dist/catalog/marketplace-fetch.d.ts +1 -1
- package/dist/catalog/marketplace-icons.d.ts +64 -0
- package/dist/catalog/marketplace-icons.js +131 -0
- package/dist/catalog/marketplaces.controller.d.ts +50 -41
- package/dist/catalog/marketplaces.controller.js +130 -46
- package/dist/catalog/marketplaces.schemas.d.ts +48 -0
- package/dist/catalog/marketplaces.schemas.js +53 -0
- package/dist/catalog/marketplaces.service.d.ts +110 -17
- package/dist/catalog/marketplaces.service.js +337 -29
- package/dist/catalog/org-catalog.controller.d.ts +114 -62
- package/dist/catalog/org-catalog.controller.js +191 -98
- package/dist/catalog/org-catalog.schemas.d.ts +104 -0
- package/dist/catalog/org-catalog.schemas.js +107 -0
- package/dist/catalog/org-catalog.service.d.ts +72 -33
- package/dist/catalog/org-catalog.service.js +367 -158
- package/dist/catalog/org-extension-switch.d.ts +41 -0
- package/dist/catalog/org-extension-switch.js +115 -0
- package/dist/catalog/org-extension.controller.d.ts +133 -0
- package/dist/catalog/org-extension.controller.js +313 -0
- package/dist/catalog/org-extension.schemas.d.ts +15 -0
- package/dist/catalog/org-extension.schemas.js +22 -0
- package/dist/catalog/org-plugin-uploads.controller.d.ts +77 -0
- package/dist/catalog/org-plugin-uploads.controller.js +200 -0
- package/dist/catalog/org-plugin-uploads.d.ts +71 -0
- package/dist/catalog/org-plugin-uploads.js +122 -0
- package/dist/catalog/org-plugin-uploads.schemas.d.ts +20 -0
- package/dist/catalog/org-plugin-uploads.schemas.js +32 -0
- package/dist/catalog/owned-items.d.ts +188 -0
- package/dist/catalog/owned-items.js +808 -0
- package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
- package/dist/catalog/owned-plugin-cleanup.js +194 -0
- package/dist/catalog/ownership.d.ts +172 -0
- package/dist/catalog/ownership.js +326 -0
- package/dist/catalog/platform-components.d.ts +243 -0
- package/dist/catalog/platform-components.js +872 -0
- package/dist/catalog/platform-migration.d.ts +115 -0
- package/dist/catalog/platform-migration.js +583 -0
- package/dist/catalog/plugin-import.d.ts +254 -47
- package/dist/catalog/plugin-import.js +810 -112
- package/dist/catalog/plugin-install.d.ts +205 -42
- package/dist/catalog/plugin-install.js +828 -126
- package/dist/catalog/plugin-package.d.ts +43 -4
- package/dist/catalog/plugin-package.js +194 -7
- package/dist/catalog/plugin-upgrade.d.ts +308 -225
- package/dist/catalog/plugin-upgrade.js +1325 -1131
- package/dist/catalog/request-rules.d.ts +65 -0
- package/dist/catalog/request-rules.js +217 -0
- package/dist/catalog/requests.service.d.ts +194 -118
- package/dist/catalog/requests.service.js +530 -343
- package/dist/catalog/reserved-names.d.ts +8 -0
- package/dist/catalog/reserved-names.js +42 -0
- package/dist/catalog/scope-orgs.d.ts +21 -0
- package/dist/catalog/scope-orgs.js +67 -0
- package/dist/catalog/scope-state.d.ts +35 -0
- package/dist/catalog/scope-state.js +87 -0
- package/dist/catalog/scope-sync-workers.d.ts +7 -0
- package/dist/catalog/scope-sync-workers.js +29 -0
- package/dist/catalog/scope-sync.d.ts +176 -0
- package/dist/catalog/scope-sync.js +576 -0
- package/dist/catalog/scope.d.ts +42 -0
- package/dist/catalog/scope.js +42 -0
- package/dist/catalog/unshare.d.ts +22 -0
- package/dist/catalog/unshare.js +119 -0
- package/dist/channels/actions.js +10 -3
- package/dist/channels/cards.d.ts +36 -10
- package/dist/channels/cards.js +100 -25
- package/dist/channels/channels.module.js +13 -2
- package/dist/channels/channels.schemas.d.ts +41 -0
- package/dist/channels/channels.schemas.js +40 -0
- package/dist/channels/connections.controller.d.ts +46 -37
- package/dist/channels/connections.controller.js +76 -34
- package/dist/channels/connections.service.d.ts +102 -10
- package/dist/channels/connections.service.js +271 -24
- package/dist/channels/inbound.d.ts +11 -1
- package/dist/channels/inbound.js +87 -7
- package/dist/channels/outbound.d.ts +14 -1
- package/dist/channels/outbound.js +64 -15
- package/dist/channels/phrases.d.ts +33 -2
- package/dist/channels/phrases.js +29 -1
- package/dist/channels/supervisor.d.ts +2 -0
- package/dist/channels/supervisor.js +4 -0
- package/dist/channels/threads.d.ts +5 -0
- package/dist/channels/threads.js +8 -0
- package/dist/channels/webhook.d.ts +21 -1
- package/dist/channels/webhook.js +39 -4
- package/dist/client/client-access.service.d.ts +102 -0
- package/dist/client/client-access.service.js +303 -0
- package/dist/client/client-builds.service.d.ts +109 -0
- package/dist/client/client-builds.service.js +229 -0
- package/dist/client/client-delivery.controller.d.ts +25 -0
- package/dist/client/client-delivery.controller.js +66 -0
- package/dist/client/client-files.d.ts +48 -0
- package/dist/client/client-files.js +136 -0
- package/dist/client/client-reports.cron.d.ts +13 -0
- package/dist/client/client-reports.cron.js +42 -0
- package/dist/client/client-reports.service.d.ts +30 -0
- package/dist/client/client-reports.service.js +102 -0
- package/dist/client/client-sign-in.service.d.ts +21 -0
- package/dist/client/client-sign-in.service.js +49 -0
- package/dist/client/client.controller.d.ts +49 -0
- package/dist/client/client.controller.js +129 -0
- package/dist/client/client.module.d.ts +8 -0
- package/dist/client/client.module.js +28 -0
- package/dist/client/client.schemas.d.ts +61 -0
- package/dist/client/client.schemas.js +27 -0
- package/dist/config/docs.js +5 -1
- package/dist/config/schema.d.ts +35 -2
- package/dist/config/schema.js +216 -21
- package/dist/conversations/access.d.ts +6 -4
- package/dist/conversations/access.js +29 -5
- package/dist/conversations/agent-tree.d.ts +46 -0
- package/dist/conversations/agent-tree.js +92 -0
- package/dist/conversations/artifacts.d.ts +1 -1
- package/dist/conversations/artifacts.js +1 -1
- package/dist/conversations/attachments.service.d.ts +30 -0
- package/dist/conversations/attachments.service.js +130 -5
- package/dist/conversations/conversations.controller.d.ts +79 -44
- package/dist/conversations/conversations.controller.js +133 -82
- package/dist/conversations/conversations.module.d.ts +1 -1
- package/dist/conversations/conversations.module.js +10 -7
- package/dist/conversations/conversations.schemas.d.ts +52 -0
- package/dist/conversations/conversations.schemas.js +79 -0
- package/dist/conversations/conversations.service.d.ts +161 -13
- package/dist/conversations/conversations.service.js +329 -57
- package/dist/conversations/device-status.d.ts +24 -0
- package/dist/conversations/device-status.js +71 -0
- package/dist/conversations/event-log.d.ts +45 -9
- package/dist/conversations/event-log.js +113 -6
- package/dist/conversations/events.d.ts +255 -9
- package/dist/conversations/events.js +250 -34
- package/dist/conversations/message-context.d.ts +79 -0
- package/dist/conversations/message-context.js +145 -0
- package/dist/conversations/queue.d.ts +5 -2
- package/dist/conversations/queue.js +24 -4
- package/dist/conversations/queue.service.d.ts +2 -2
- package/dist/conversations/queue.service.js +21 -3
- package/dist/conversations/titles.d.ts +12 -3
- package/dist/conversations/titles.js +40 -16
- package/dist/conversations/tree.d.ts +17 -0
- package/dist/conversations/tree.js +42 -0
- package/dist/ctx/create-ctx.d.ts +48 -5
- package/dist/ctx/create-ctx.js +174 -34
- package/dist/db/kernel-schema.d.ts +668 -27
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +3 -0
- package/dist/devices/access.d.ts +66 -0
- package/dist/devices/access.js +113 -0
- package/dist/devices/conversation-devices.d.ts +75 -0
- package/dist/devices/conversation-devices.js +230 -0
- package/dist/devices/devices.controller.d.ts +36 -0
- package/dist/devices/devices.controller.js +124 -0
- package/dist/devices/devices.module.d.ts +8 -0
- package/dist/devices/devices.module.js +34 -0
- package/dist/devices/devices.schemas.d.ts +3 -0
- package/dist/devices/devices.schemas.js +14 -0
- package/dist/devices/devices.service.d.ts +251 -0
- package/dist/devices/devices.service.js +791 -0
- package/dist/devices/dto.d.ts +25 -0
- package/dist/devices/dto.js +12 -0
- package/dist/devices/label.d.ts +11 -0
- package/dist/devices/label.js +25 -0
- package/dist/devices/legacy-cleanup.job.d.ts +34 -0
- package/dist/devices/legacy-cleanup.job.js +141 -0
- package/dist/errors.d.ts +215 -3
- package/dist/errors.js +215 -3
- package/dist/evals/evals.module.js +11 -2
- package/dist/evals/evals.schemas.d.ts +110 -0
- package/dist/evals/evals.schemas.js +107 -0
- package/dist/evals/reconstruct.d.ts +18 -9
- package/dist/evals/reconstruct.js +36 -10
- package/dist/evals/recorded-tools.d.ts +37 -1
- package/dist/evals/recorded-tools.js +120 -10
- package/dist/evals/run-replay.d.ts +20 -3
- package/dist/evals/run-replay.js +78 -14
- package/dist/evals/runs.controller.d.ts +2 -57
- package/dist/evals/runs.controller.js +1 -42
- package/dist/evals/runs.service.d.ts +8 -7
- package/dist/evals/runs.service.js +45 -30
- package/dist/evals/sets.controller.d.ts +2 -28
- package/dist/evals/sets.controller.js +1 -31
- package/dist/evals/sets.service.d.ts +7 -7
- package/dist/evals/sets.service.js +23 -17
- package/dist/evals/snapshot.d.ts +3 -2
- package/dist/evals/snapshot.js +17 -4
- package/dist/evals/step-replay.d.ts +4 -6
- package/dist/evals/step-replay.js +16 -9
- package/dist/evals/trajectory.d.ts +5 -3
- package/dist/evals/trajectory.js +4 -1
- package/dist/evals/trajectory.service.d.ts +8 -3
- package/dist/evals/trajectory.service.js +26 -14
- package/dist/evals/worker.d.ts +5 -5
- package/dist/evals/worker.js +9 -3
- package/dist/extensions/admin-ops.d.ts +81 -14
- package/dist/extensions/admin-ops.js +181 -47
- package/dist/extensions/admin-view.d.ts +57 -10
- package/dist/extensions/admin-view.js +249 -27
- package/dist/extensions/approvals.d.ts +12 -2
- package/dist/extensions/blobs.d.ts +14 -1
- package/dist/extensions/blobs.js +49 -5
- package/dist/extensions/bootstrap.d.ts +41 -5
- package/dist/extensions/bootstrap.js +121 -19
- package/dist/extensions/cli.d.ts +12 -0
- package/dist/extensions/cli.js +11 -2
- package/dist/extensions/config-hash.d.ts +10 -0
- package/dist/extensions/config-hash.js +38 -0
- package/dist/extensions/config-issues.d.ts +13 -1
- package/dist/extensions/config-issues.js +22 -5
- package/dist/extensions/config-json-schema.d.ts +43 -7
- package/dist/extensions/config-json-schema.js +124 -58
- package/dist/extensions/deployment-config-store.d.ts +6 -0
- package/dist/extensions/deployment-config.d.ts +94 -9
- package/dist/extensions/deployment-config.js +255 -34
- package/dist/extensions/display-name.d.ts +22 -0
- package/dist/extensions/display-name.js +77 -0
- package/dist/extensions/effective-config.d.ts +133 -0
- package/dist/extensions/effective-config.js +379 -0
- package/dist/extensions/extensions.module.js +31 -12
- package/dist/extensions/guide-places.d.ts +68 -0
- package/dist/extensions/guide-places.js +152 -0
- package/dist/extensions/hooks.d.ts +37 -4
- package/dist/extensions/hooks.js +82 -16
- package/dist/extensions/host.d.ts +105 -12
- package/dist/extensions/host.js +372 -87
- package/dist/extensions/installs.d.ts +30 -9
- package/dist/extensions/installs.js +57 -16
- package/dist/extensions/instance.d.ts +17 -2
- package/dist/extensions/instance.js +21 -0
- package/dist/extensions/ledger.d.ts +1 -1
- package/dist/extensions/locks.d.ts +12 -0
- package/dist/extensions/locks.js +26 -0
- package/dist/extensions/org-config.d.ts +97 -7
- package/dist/extensions/org-config.js +215 -45
- package/dist/extensions/org-levels.d.ts +37 -0
- package/dist/extensions/org-levels.js +71 -0
- package/dist/extensions/org-overrides.d.ts +151 -0
- package/dist/extensions/org-overrides.js +524 -0
- package/dist/extensions/package.d.ts +18 -4
- package/dist/extensions/package.js +56 -3
- package/dist/extensions/permission-set.d.ts +35 -5
- package/dist/extensions/permission-set.js +36 -5
- package/dist/extensions/permission-view.d.ts +106 -13
- package/dist/extensions/permission-view.js +33 -15
- package/dist/extensions/plugin-guides.d.ts +282 -0
- package/dist/extensions/plugin-guides.js +554 -0
- package/dist/extensions/plugin-icons.d.ts +54 -0
- package/dist/extensions/plugin-icons.js +125 -0
- package/dist/extensions/plugin-items.d.ts +21 -0
- package/dist/extensions/plugin-items.js +42 -0
- package/dist/extensions/point-defaults.controller.d.ts +28 -0
- package/dist/extensions/point-defaults.controller.js +69 -0
- package/dist/extensions/point-defaults.d.ts +73 -0
- package/dist/extensions/point-defaults.js +236 -0
- package/dist/extensions/point-defaults.schemas.d.ts +9 -0
- package/dist/extensions/point-defaults.schemas.js +14 -0
- package/dist/extensions/registry.d.ts +1 -1
- package/dist/extensions/registry.js +2 -0
- package/dist/extensions/resolve.d.ts +51 -1
- package/dist/extensions/resolve.js +85 -3
- package/dist/extensions/single-provider.d.ts +92 -0
- package/dist/extensions/single-provider.js +180 -0
- package/dist/extensions/sources.d.ts +13 -2
- package/dist/extensions/sources.js +2 -0
- package/dist/extensions/state.module.d.ts +9 -0
- package/dist/extensions/state.module.js +46 -0
- package/dist/extensions/unavailable.d.ts +50 -0
- package/dist/extensions/unavailable.js +115 -0
- package/dist/files/previewers.controller.js +2 -3
- package/dist/files/previewers.d.ts +10 -3
- package/dist/files/previewers.js +40 -11
- package/dist/files/previewers.schemas.d.ts +10 -0
- package/dist/files/previewers.schemas.js +9 -0
- package/dist/http/api.module.js +76 -4
- package/dist/http/app.d.ts +11 -2
- package/dist/http/app.js +31 -5
- package/dist/http/gateway-routes.d.ts +7 -3
- package/dist/http/gateway-routes.js +6 -3
- package/dist/http/nest-logger.d.ts +6 -5
- package/dist/http/nest-logger.js +24 -10
- package/dist/http/plugin-dispatch.d.ts +4 -1
- package/dist/http/plugin-dispatch.js +14 -2
- package/dist/identity/accounts.d.ts +77 -31
- package/dist/identity/accounts.js +133 -52
- package/dist/identity/audit.d.ts +2 -1
- package/dist/identity/auth.controller.js +9 -5
- package/dist/identity/auth.guard.d.ts +13 -5
- package/dist/identity/auth.guard.js +35 -9
- package/dist/identity/cookies.d.ts +26 -5
- package/dist/identity/cookies.js +58 -6
- package/dist/identity/identity.module.d.ts +1 -1
- package/dist/identity/identity.module.js +7 -4
- package/dist/identity/initial-passwords.controller.d.ts +22 -0
- package/dist/identity/initial-passwords.controller.js +49 -0
- package/dist/identity/initial-passwords.d.ts +61 -0
- package/dist/identity/initial-passwords.job.d.ts +16 -0
- package/dist/identity/initial-passwords.job.js +46 -0
- package/dist/identity/initial-passwords.js +159 -0
- package/dist/identity/me.controller.d.ts +17 -1
- package/dist/identity/me.controller.js +45 -4
- package/dist/identity/me.schemas.d.ts +24 -0
- package/dist/identity/me.schemas.js +25 -0
- package/dist/identity/principal.d.ts +11 -3
- package/dist/identity/principal.js +11 -3
- package/dist/identity/sessions.d.ts +12 -0
- package/dist/identity/sessions.js +45 -0
- package/dist/identity/settings.d.ts +99 -12
- package/dist/identity/settings.js +234 -25
- package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
- package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
- package/dist/identity/write-actor.d.ts +11 -0
- package/dist/identity/write-actor.js +7 -0
- package/dist/inbox/inbox.module.d.ts +4 -1
- package/dist/inbox/inbox.module.js +7 -3
- package/dist/inbox/inbox.schemas.d.ts +8 -0
- package/dist/inbox/inbox.schemas.js +11 -0
- package/dist/inbox/inbox.service.d.ts +64 -4
- package/dist/inbox/inbox.service.js +74 -4
- package/dist/inbox/org-notices.d.ts +63 -0
- package/dist/inbox/org-notices.js +91 -0
- package/dist/inbox/platform-inbox.controller.d.ts +23 -0
- package/dist/inbox/platform-inbox.controller.js +58 -0
- package/dist/inbox/platform-inbox.service.d.ts +157 -0
- package/dist/inbox/platform-inbox.service.js +281 -0
- package/dist/inbox/platform-notices.d.ts +19 -0
- package/dist/inbox/platform-notices.js +9 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.js +7 -1
- package/dist/infra/cli/kernel-cli.module.js +9 -1
- package/dist/infra/config/kernel-config.service.js +32 -1
- package/dist/infra/database/database.module.js +1 -0
- package/dist/infra/database/xact-lock.d.ts +1 -1
- package/dist/infra/database/xact-lock.js +1 -1
- package/dist/infra/events/kernel-events.d.ts +31 -3
- package/dist/infra/lifecycle/process-guards.js +4 -0
- package/dist/infra/lock/lock.service.d.ts +8 -0
- package/dist/infra/lock/lock.service.js +27 -0
- package/dist/infra/logging/logging.module.d.ts +4 -2
- package/dist/infra/logging/logging.module.js +24 -6
- package/dist/infra/presence/presence.module.d.ts +6 -0
- package/dist/infra/presence/presence.module.js +22 -0
- package/dist/infra/presence/replica-presence.d.ts +87 -0
- package/dist/infra/presence/replica-presence.js +189 -0
- package/dist/infra/queue/add-job-once.d.ts +14 -0
- package/dist/infra/queue/add-job-once.js +16 -0
- package/dist/infra/queue/redis-connection.d.ts +6 -0
- package/dist/infra/queue/redis-connection.js +7 -0
- package/dist/infra/redis/redis.module.js +6 -2
- package/dist/infra/throttler/named-throttlers.d.ts +12 -0
- package/dist/infra/throttler/named-throttlers.js +67 -0
- package/dist/infra/throttler/throttler.guard.js +1 -1
- package/dist/infra/tokens.d.ts +6 -1
- package/dist/infra/tokens.js +6 -1
- package/dist/kernel.module.js +15 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +4 -2
- package/dist/lifecycle/kernel-lifecycle.js +35 -7
- package/dist/local-devices/device-auth.controller.d.ts +42 -0
- package/dist/local-devices/device-auth.controller.js +116 -0
- package/dist/local-devices/device-auth.d.ts +119 -0
- package/dist/local-devices/device-auth.js +401 -0
- package/dist/local-devices/device-auth.module.d.ts +7 -0
- package/dist/local-devices/device-auth.module.js +25 -0
- package/dist/local-devices/device-routes.d.ts +36 -0
- package/dist/local-devices/device-routes.js +90 -0
- package/dist/local-devices/dto.d.ts +66 -0
- package/dist/local-devices/dto.js +44 -0
- package/dist/local-devices/keys.d.ts +25 -0
- package/dist/local-devices/keys.js +25 -0
- package/dist/local-devices/local-device-gateway.d.ts +134 -0
- package/dist/local-devices/local-device-gateway.js +542 -0
- package/dist/local-devices/local-device-provider.d.ts +89 -0
- package/dist/local-devices/local-device-provider.js +151 -0
- package/dist/local-devices/local-devices.module.d.ts +16 -0
- package/dist/local-devices/local-devices.module.js +44 -0
- package/dist/local-devices/machines.d.ts +118 -0
- package/dist/local-devices/machines.js +366 -0
- package/dist/local-devices/relay.d.ts +100 -0
- package/dist/local-devices/relay.js +373 -0
- package/dist/local-devices/targets.d.ts +28 -0
- package/dist/local-devices/targets.js +73 -0
- package/dist/log.d.ts +13 -1
- package/dist/log.js +93 -17
- package/dist/models/embeddings.d.ts +82 -0
- package/dist/models/embeddings.js +326 -0
- package/dist/models/enablement.controller.d.ts +40 -0
- package/dist/models/enablement.controller.js +74 -0
- package/dist/models/enablement.d.ts +101 -0
- package/dist/models/enablement.js +264 -0
- package/dist/models/models.module.d.ts +5 -1
- package/dist/models/models.module.js +16 -4
- package/dist/models/org-models.schemas.d.ts +8 -0
- package/dist/models/org-models.schemas.js +22 -0
- package/dist/models/prices.d.ts +8 -6
- package/dist/models/prices.js +11 -9
- package/dist/models/purposes.controller.d.ts +6 -4
- package/dist/models/purposes.controller.js +13 -7
- package/dist/models/purposes.d.ts +72 -14
- package/dist/models/purposes.js +115 -34
- package/dist/orgs/directory-sync.d.ts +14 -5
- package/dist/orgs/directory-sync.js +41 -17
- package/dist/orgs/offboarding.d.ts +12 -8
- package/dist/orgs/offboarding.js +54 -33
- package/dist/orgs/org-lock.d.ts +5 -0
- package/dist/orgs/org-lock.js +13 -0
- package/dist/orgs/org.guard.d.ts +10 -0
- package/dist/orgs/org.guard.js +43 -32
- package/dist/orgs/orgs.controller.d.ts +2 -5
- package/dist/orgs/orgs.controller.js +3 -6
- package/dist/orgs/orgs.module.js +3 -0
- package/dist/orgs/orgs.schemas.d.ts +8 -0
- package/dist/orgs/orgs.schemas.js +16 -0
- package/dist/orgs/orgs.service.d.ts +23 -8
- package/dist/orgs/orgs.service.js +38 -16
- package/dist/orgs/roles.d.ts +1 -1
- package/dist/orgs/roles.js +5 -1
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.service.d.ts +66 -6
- package/dist/orgs/settings.service.js +89 -10
- package/dist/overrides.d.ts +16 -1
- package/dist/overrides.js +10 -0
- package/dist/platform/actor.d.ts +48 -0
- package/dist/platform/actor.js +100 -0
- package/dist/platform/agent-docs.d.ts +18 -0
- package/dist/platform/agent-docs.js +59 -0
- package/dist/platform/availability.d.ts +14 -0
- package/dist/platform/availability.js +43 -0
- package/dist/platform/errors.d.ts +28 -0
- package/dist/platform/errors.js +65 -0
- package/dist/platform/exclusions.d.ts +11 -0
- package/dist/platform/exclusions.js +774 -0
- package/dist/platform/method.d.ts +6 -0
- package/dist/platform/method.js +15 -0
- package/dist/platform/operation.d.ts +169 -0
- package/dist/platform/operation.js +102 -0
- package/dist/platform/ops/accounts.ops.d.ts +32 -0
- package/dist/platform/ops/accounts.ops.js +291 -0
- package/dist/platform/ops/admin-items.ops.d.ts +37 -0
- package/dist/platform/ops/admin-items.ops.js +278 -0
- package/dist/platform/ops/admin.ops.d.ts +38 -0
- package/dist/platform/ops/admin.ops.js +497 -0
- package/dist/platform/ops/agent-skills.ops.d.ts +50 -0
- package/dist/platform/ops/agent-skills.ops.js +509 -0
- package/dist/platform/ops/agent-templates.ops.d.ts +17 -0
- package/dist/platform/ops/agent-templates.ops.js +272 -0
- package/dist/platform/ops/agents.ops.d.ts +37 -0
- package/dist/platform/ops/agents.ops.js +730 -0
- package/dist/platform/ops/approvals.ops.d.ts +30 -0
- package/dist/platform/ops/approvals.ops.js +116 -0
- package/dist/platform/ops/background.ops.d.ts +14 -0
- package/dist/platform/ops/background.ops.js +134 -0
- package/dist/platform/ops/catalog-admin.ops.d.ts +92 -0
- package/dist/platform/ops/catalog-admin.ops.js +682 -0
- package/dist/platform/ops/channels.ops.d.ts +16 -0
- package/dist/platform/ops/channels.ops.js +195 -0
- package/dist/platform/ops/components.ops.d.ts +46 -0
- package/dist/platform/ops/components.ops.js +854 -0
- package/dist/platform/ops/connectors.ops.d.ts +17 -0
- package/dist/platform/ops/connectors.ops.js +190 -0
- package/dist/platform/ops/conversations.ops.d.ts +30 -0
- package/dist/platform/ops/conversations.ops.js +470 -0
- package/dist/platform/ops/devices.ops.d.ts +26 -0
- package/dist/platform/ops/devices.ops.js +311 -0
- package/dist/platform/ops/errors.d.ts +16 -0
- package/dist/platform/ops/errors.js +30 -0
- package/dist/platform/ops/evals.ops.d.ts +28 -0
- package/dist/platform/ops/evals.ops.js +783 -0
- package/dist/platform/ops/extensions-admin.ops.d.ts +25 -0
- package/dist/platform/ops/extensions-admin.ops.js +372 -0
- package/dist/platform/ops/extensions.ops.d.ts +25 -0
- package/dist/platform/ops/extensions.ops.js +347 -0
- package/dist/platform/ops/inbox.ops.d.ts +25 -0
- package/dist/platform/ops/inbox.ops.js +381 -0
- package/dist/platform/ops/marketplaces.ops.d.ts +22 -0
- package/dist/platform/ops/marketplaces.ops.js +466 -0
- package/dist/platform/ops/models.ops.d.ts +25 -0
- package/dist/platform/ops/models.ops.js +232 -0
- package/dist/platform/ops/org-plugins.ops.d.ts +35 -0
- package/dist/platform/ops/org-plugins.ops.js +388 -0
- package/dist/platform/ops/org-settings.ops.d.ts +18 -0
- package/dist/platform/ops/org-settings.ops.js +127 -0
- package/dist/platform/ops/orgs.ops.d.ts +28 -0
- package/dist/platform/ops/orgs.ops.js +298 -0
- package/dist/platform/ops/other-orgs.d.ts +20 -0
- package/dist/platform/ops/other-orgs.js +72 -0
- package/dist/platform/ops/paging.d.ts +14 -0
- package/dist/platform/ops/paging.js +20 -0
- package/dist/platform/ops/platform.ops.d.ts +30 -0
- package/dist/platform/ops/platform.ops.js +231 -0
- package/dist/platform/ops/plugins.ops.d.ts +35 -0
- package/dist/platform/ops/plugins.ops.js +476 -0
- package/dist/platform/ops/previewers.ops.d.ts +14 -0
- package/dist/platform/ops/previewers.ops.js +109 -0
- package/dist/platform/ops/requests.ops.d.ts +14 -0
- package/dist/platform/ops/requests.ops.js +191 -0
- package/dist/platform/ops/role.d.ts +4 -0
- package/dist/platform/ops/role.js +10 -0
- package/dist/platform/ops/setup.ops.d.ts +24 -0
- package/dist/platform/ops/setup.ops.js +212 -0
- package/dist/platform/ops/skills.ops.d.ts +17 -0
- package/dist/platform/ops/skills.ops.js +160 -0
- package/dist/platform/ops/summary.d.ts +10 -0
- package/dist/platform/ops/summary.js +18 -0
- package/dist/platform/ops/themes.ops.d.ts +14 -0
- package/dist/platform/ops/themes.ops.js +47 -0
- package/dist/platform/ops/ui.ops.d.ts +8 -0
- package/dist/platform/ops/ui.ops.js +41 -0
- package/dist/platform/ops/unavailable.d.ts +23 -0
- package/dist/platform/ops/unavailable.js +118 -0
- package/dist/platform/parity.d.ts +33 -0
- package/dist/platform/parity.js +272 -0
- package/dist/platform/platform-ops.module.d.ts +43 -0
- package/dist/platform/platform-ops.module.js +142 -0
- package/dist/platform/platform.module.d.ts +8 -0
- package/dist/platform/platform.module.js +25 -0
- package/dist/platform/registry.d.ts +30 -0
- package/dist/platform/registry.js +111 -0
- package/dist/platform/route-schemas.d.ts +18 -0
- package/dist/platform/route-schemas.js +85 -0
- package/dist/roles/gateway-role.d.ts +18 -3
- package/dist/roles/gateway-role.js +33 -5
- package/dist/roles/gateway.module.d.ts +2 -1
- package/dist/roles/gateway.module.js +6 -3
- package/dist/roles/worker-role.d.ts +6 -4
- package/dist/roles/worker-role.js +14 -7
- package/dist/roles/worker.module.d.ts +1 -1
- package/dist/roles/worker.module.js +21 -1
- package/dist/runtime/context/build.d.ts +21 -13
- package/dist/runtime/context/build.js +106 -29
- package/dist/runtime/context/claude-tools.d.ts +4 -1
- package/dist/runtime/context/claude-tools.js +13 -12
- package/dist/runtime/context/compaction.js +24 -1
- package/dist/runtime/context/device-paths.d.ts +40 -0
- package/dist/runtime/context/device-paths.js +48 -0
- package/dist/runtime/context/legacy-text.d.ts +22 -0
- package/dist/runtime/context/legacy-text.js +37 -0
- package/dist/runtime/context/reminders.d.ts +2 -0
- package/dist/runtime/context/reminders.js +2 -0
- package/dist/runtime/context/run-context.d.ts +65 -0
- package/dist/runtime/context/run-context.js +215 -0
- package/dist/runtime/context/skills.d.ts +29 -11
- package/dist/runtime/context/skills.js +46 -32
- package/dist/runtime/context/tool-changes.d.ts +27 -0
- package/dist/runtime/context/tool-changes.js +60 -0
- package/dist/runtime/hook-calls.d.ts +8 -1
- package/dist/runtime/hook-calls.js +40 -7
- package/dist/runtime/langgraph-loop.d.ts +3 -1
- package/dist/runtime/langgraph-loop.js +36 -17
- package/dist/runtime/loop.d.ts +35 -6
- package/dist/runtime/maintenance.d.ts +9 -4
- package/dist/runtime/maintenance.js +35 -8
- package/dist/runtime/model-call.d.ts +54 -11
- package/dist/runtime/model-call.js +105 -28
- package/dist/runtime/providers.d.ts +149 -29
- package/dist/runtime/providers.js +332 -63
- package/dist/runtime/run-context.service.d.ts +65 -0
- package/dist/runtime/run-context.service.js +236 -0
- package/dist/runtime/run-control.d.ts +11 -1
- package/dist/runtime/run-control.js +12 -0
- package/dist/runtime/run-drafts.d.ts +85 -0
- package/dist/runtime/run-drafts.js +230 -0
- package/dist/runtime/run-finish.d.ts +1 -1
- package/dist/runtime/run-jobs.d.ts +3 -5
- package/dist/runtime/run-jobs.js +7 -9
- package/dist/runtime/run-queue.d.ts +62 -5
- package/dist/runtime/run-queue.js +313 -40
- package/dist/runtime/run-worker.d.ts +19 -8
- package/dist/runtime/run-worker.js +105 -44
- package/dist/runtime/runtime.module.js +13 -3
- package/dist/runtime/step-log.d.ts +15 -4
- package/dist/runtime/step-log.js +24 -7
- package/dist/runtime/stream.controller.d.ts +23 -1
- package/dist/runtime/stream.controller.js +60 -3
- package/dist/runtime/stream.d.ts +4 -1
- package/dist/runtime/stream.js +27 -3
- package/dist/runtime/subagents/child.d.ts +55 -7
- package/dist/runtime/subagents/child.js +105 -7
- package/dist/runtime/subagents/definition.d.ts +31 -26
- package/dist/runtime/subagents/definition.js +89 -142
- package/dist/runtime/subagents/deliveries.d.ts +71 -0
- package/dist/runtime/subagents/deliveries.js +228 -0
- package/dist/runtime/subagents/dispatch.d.ts +116 -27
- package/dist/runtime/subagents/dispatch.js +213 -142
- package/dist/runtime/subagents/limits.d.ts +24 -5
- package/dist/runtime/subagents/limits.js +40 -6
- package/dist/runtime/subagents/messages.d.ts +95 -0
- package/dist/runtime/subagents/messages.js +328 -0
- package/dist/runtime/subagents/org-agents.js +2 -1
- package/dist/runtime/subagents/preamble.d.ts +4 -4
- package/dist/runtime/subagents/preamble.js +9 -7
- package/dist/runtime/subagents/progress.d.ts +8 -6
- package/dist/runtime/subagents/progress.js +11 -6
- package/dist/runtime/subagents/render.d.ts +30 -0
- package/dist/runtime/subagents/render.js +53 -0
- package/dist/runtime/subagents/roster.d.ts +25 -8
- package/dist/runtime/subagents/roster.js +48 -12
- package/dist/runtime/subagents/skill-fork.d.ts +4 -3
- package/dist/runtime/subagents/skill-fork.js +9 -5
- package/dist/runtime/subagents/status.d.ts +14 -0
- package/dist/runtime/subagents/status.js +23 -0
- package/dist/runtime/subagents/subagents.service.d.ts +9 -6
- package/dist/runtime/subagents/subagents.service.js +13 -8
- package/dist/runtime/usage-report-jobs.d.ts +88 -0
- package/dist/runtime/usage-report-jobs.js +158 -0
- package/dist/runtime/usage-report.d.ts +35 -39
- package/dist/runtime/usage-report.js +171 -97
- package/dist/runtime/waits.d.ts +148 -39
- package/dist/runtime/waits.js +426 -112
- package/dist/sandbox/jobs.d.ts +40 -13
- package/dist/sandbox/jobs.js +57 -20
- package/dist/sandbox/leases.d.ts +37 -54
- package/dist/sandbox/leases.js +71 -115
- package/dist/sandbox/providers.d.ts +34 -7
- package/dist/sandbox/providers.js +54 -9
- package/dist/sandbox/sandbox-file-reader.d.ts +35 -0
- package/dist/sandbox/sandbox-file-reader.js +98 -0
- package/dist/sandbox/sandbox.module.d.ts +3 -2
- package/dist/sandbox/sandbox.module.js +10 -4
- package/dist/sandbox/sandbox.service.d.ts +345 -132
- package/dist/sandbox/sandbox.service.js +883 -399
- package/dist/sandbox/unreachable.d.ts +30 -0
- package/dist/sandbox/unreachable.js +108 -0
- package/dist/setup/kernel-checks.d.ts +91 -0
- package/dist/setup/kernel-checks.js +295 -0
- package/dist/setup/oauth-token-probe.d.ts +47 -0
- package/dist/setup/oauth-token-probe.js +108 -0
- package/dist/setup/redact-check.d.ts +18 -0
- package/dist/setup/redact-check.js +46 -0
- package/dist/setup/setup-check-registry.d.ts +86 -0
- package/dist/setup/setup-check-registry.js +75 -0
- package/dist/setup/setup-checks.controller.d.ts +28 -0
- package/dist/setup/setup-checks.controller.js +78 -0
- package/dist/setup/setup-checks.schemas.d.ts +38 -0
- package/dist/setup/setup-checks.schemas.js +43 -0
- package/dist/setup/setup-checks.service.d.ts +144 -0
- package/dist/setup/setup-checks.service.js +683 -0
- package/dist/setup/setup-guides.controller.d.ts +18 -0
- package/dist/setup/setup-guides.controller.js +48 -0
- package/dist/setup/setup-guides.schemas.d.ts +10 -0
- package/dist/setup/setup-guides.schemas.js +6 -0
- package/dist/setup/setup-guides.service.d.ts +126 -0
- package/dist/setup/setup-guides.service.js +315 -0
- package/dist/setup/setup.module.d.ts +8 -0
- package/dist/setup/setup.module.js +31 -0
- package/dist/skills/agent-skills.controller.d.ts +48 -0
- package/dist/skills/agent-skills.controller.js +131 -0
- package/dist/skills/agent-skills.service.d.ts +262 -0
- package/dist/skills/agent-skills.service.js +996 -0
- package/dist/skills/catalog.d.ts +14 -11
- package/dist/skills/catalog.js +32 -50
- package/dist/skills/changes.controller.d.ts +12 -22
- package/dist/skills/changes.controller.js +27 -56
- package/dist/skills/changes.service.d.ts +69 -115
- package/dist/skills/changes.service.js +249 -598
- package/dist/skills/conversation-catalog.d.ts +53 -0
- package/dist/skills/conversation-catalog.js +149 -0
- package/dist/skills/invocable.controller.d.ts +1 -1
- package/dist/skills/invocable.controller.js +2 -2
- package/dist/skills/invocation-keys.d.ts +1 -1
- package/dist/skills/invocation-keys.js +1 -1
- package/dist/skills/invoke.d.ts +3 -3
- package/dist/skills/invoke.js +21 -8
- package/dist/skills/package.d.ts +15 -1
- package/dist/skills/package.js +14 -1
- package/dist/skills/skills.controller.d.ts +32 -6
- package/dist/skills/skills.controller.js +64 -11
- package/dist/skills/skills.module.js +25 -3
- package/dist/skills/skills.schemas.d.ts +44 -0
- package/dist/skills/skills.schemas.js +68 -0
- package/dist/skills/skills.service.d.ts +123 -26
- package/dist/skills/skills.service.js +493 -76
- package/dist/skills/usable.d.ts +82 -0
- package/dist/skills/usable.js +388 -0
- package/dist/themes/render-css.d.ts +13 -0
- package/dist/themes/render-css.js +135 -0
- package/dist/themes/theme-delivery.service.d.ts +36 -0
- package/dist/themes/theme-delivery.service.js +116 -0
- package/dist/themes/theme-state.d.ts +116 -0
- package/dist/themes/theme-state.js +221 -0
- package/dist/themes/theme-usage.d.ts +61 -0
- package/dist/themes/theme-usage.js +98 -0
- package/dist/themes/themes-public.controller.d.ts +33 -0
- package/dist/themes/themes-public.controller.js +98 -0
- package/dist/themes/themes.controller.d.ts +13 -0
- package/dist/themes/themes.controller.js +38 -0
- package/dist/themes/themes.module.d.ts +3 -0
- package/dist/themes/themes.module.js +21 -0
- package/dist/themes/themes.schemas.d.ts +3 -0
- package/dist/themes/themes.schemas.js +2 -0
- package/dist/themes/themes.service.d.ts +50 -0
- package/dist/themes/themes.service.js +99 -0
- package/dist/time-zone.d.ts +5 -0
- package/dist/time-zone.js +19 -0
- package/dist/tools/admin-connectors.d.ts +69 -0
- package/dist/tools/admin-connectors.js +135 -0
- package/dist/tools/approvals.controller.js +2 -3
- package/dist/tools/approvals.schemas.d.ts +21 -0
- package/dist/tools/approvals.schemas.js +15 -0
- package/dist/tools/approvals.service.d.ts +26 -2
- package/dist/tools/approvals.service.js +44 -5
- package/dist/tools/builtin-names.d.ts +104 -0
- package/dist/tools/builtin-names.js +164 -0
- package/dist/tools/builtins/agent.d.ts +27 -25
- package/dist/tools/builtins/agent.js +66 -63
- package/dist/tools/builtins/ask-user.d.ts +1 -1
- package/dist/tools/builtins/ask-user.js +5 -4
- package/dist/tools/builtins/builtin-tools.d.ts +23 -4
- package/dist/tools/builtins/builtin-tools.js +78 -12
- package/dist/tools/builtins/current-time.d.ts +26 -0
- package/dist/tools/builtins/current-time.js +99 -0
- package/dist/tools/builtins/handback.d.ts +28 -0
- package/dist/tools/builtins/handback.js +53 -0
- package/dist/tools/builtins/platform.d.ts +51 -0
- package/dist/tools/builtins/platform.js +451 -0
- package/dist/tools/builtins/read-tool-output.d.ts +1 -1
- package/dist/tools/builtins/read-tool-output.js +2 -2
- package/dist/tools/builtins/sandbox/bash.d.ts +5 -5
- package/dist/tools/builtins/sandbox/bash.js +291 -39
- package/dist/tools/builtins/sandbox/common.d.ts +135 -36
- package/dist/tools/builtins/sandbox/common.js +222 -62
- package/dist/tools/builtins/sandbox/deliver.d.ts +1 -1
- package/dist/tools/builtins/sandbox/deliver.js +19 -16
- package/dist/tools/builtins/sandbox/edit.d.ts +1 -1
- package/dist/tools/builtins/sandbox/edit.js +64 -50
- 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 +17 -12
- package/dist/tools/builtins/sandbox/grep.d.ts +7 -4
- package/dist/tools/builtins/sandbox/grep.js +153 -34
- package/dist/tools/builtins/sandbox/index.d.ts +9 -5
- package/dist/tools/builtins/sandbox/index.js +13 -5
- package/dist/tools/builtins/sandbox/read.d.ts +2 -2
- package/dist/tools/builtins/sandbox/read.js +29 -19
- package/dist/tools/builtins/sandbox/task-output.d.ts +79 -0
- package/dist/tools/builtins/sandbox/task-output.js +334 -0
- package/dist/tools/builtins/sandbox/task-stop.d.ts +10 -0
- package/dist/tools/builtins/sandbox/task-stop.js +113 -0
- package/dist/tools/builtins/sandbox/write.d.ts +1 -1
- package/dist/tools/builtins/sandbox/write.js +51 -44
- package/dist/tools/builtins/send-message.d.ts +56 -0
- package/dist/tools/builtins/send-message.js +100 -0
- package/dist/tools/builtins/skill-load.d.ts +29 -18
- package/dist/tools/builtins/skill-load.js +125 -73
- package/dist/tools/builtins/tool-search.d.ts +13 -9
- package/dist/tools/builtins/tool-search.js +25 -14
- package/dist/tools/builtins/web/errors.d.ts +8 -0
- package/dist/tools/builtins/web/errors.js +53 -0
- package/dist/tools/builtins/web/extract.d.ts +62 -0
- package/dist/tools/builtins/web/extract.js +271 -0
- package/dist/tools/builtins/web/fetch.d.ts +55 -0
- package/dist/tools/builtins/web/fetch.js +175 -0
- package/dist/tools/builtins/web/index.d.ts +13 -0
- package/dist/tools/builtins/web/index.js +12 -0
- package/dist/tools/builtins/web/page-cache.d.ts +25 -0
- package/dist/tools/builtins/web/page-cache.js +77 -0
- package/dist/tools/builtins/web/search.d.ts +25 -0
- package/dist/tools/builtins/web/search.js +210 -0
- package/dist/tools/builtins/web/url.d.ts +17 -0
- package/dist/tools/builtins/web/url.js +43 -0
- package/dist/tools/connector-account-policies.d.ts +51 -0
- package/dist/tools/connector-account-policies.js +165 -0
- package/dist/tools/connectors.controller.d.ts +74 -9
- package/dist/tools/connectors.controller.js +133 -16
- package/dist/tools/connectors.schemas.d.ts +27 -0
- package/dist/tools/connectors.schemas.js +34 -0
- package/dist/tools/connectors.service.d.ts +101 -8
- package/dist/tools/connectors.service.js +266 -28
- package/dist/tools/credentials.d.ts +23 -0
- package/dist/tools/credentials.js +90 -1
- package/dist/tools/display-names.d.ts +9 -0
- package/dist/tools/display-names.js +24 -0
- package/dist/tools/drift.js +5 -5
- package/dist/tools/elicitation.js +1 -1
- package/dist/tools/extension-tools.controller.d.ts +14 -0
- package/dist/tools/extension-tools.controller.js +37 -0
- package/dist/tools/info.d.ts +61 -4
- package/dist/tools/info.js +119 -33
- 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 +114 -0
- package/dist/tools/naming.d.ts +1 -5
- package/dist/tools/naming.js +1 -7
- package/dist/tools/oauth/flow-paths.d.ts +1 -1
- package/dist/tools/oauth/flow-paths.js +1 -1
- package/dist/tools/oauth/flow.js +1 -1
- package/dist/tools/oauth/tokens.d.ts +54 -7
- package/dist/tools/oauth/tokens.js +87 -17
- package/dist/tools/org-tool-switches.d.ts +89 -0
- package/dist/tools/org-tool-switches.js +201 -0
- package/dist/tools/outputs.js +1 -1
- package/dist/tools/pipeline.d.ts +67 -47
- package/dist/tools/pipeline.js +319 -380
- package/dist/tools/policy.d.ts +30 -23
- package/dist/tools/policy.js +142 -64
- package/dist/tools/questions.controller.d.ts +1 -1
- package/dist/tools/questions.controller.js +1 -1
- package/dist/tools/questions.service.d.ts +23 -2
- package/dist/tools/questions.service.js +104 -2
- package/dist/tools/registry.d.ts +189 -68
- package/dist/tools/registry.js +318 -236
- package/dist/tools/resources.d.ts +1 -1
- package/dist/tools/resources.js +1 -1
- package/dist/tools/tools.module.js +31 -3
- package/dist/tools/validate.js +1 -1
- package/dist/ui/admin-ui.controller.d.ts +56 -0
- package/dist/ui/admin-ui.controller.js +192 -0
- package/dist/ui/arrangement.d.ts +65 -0
- package/dist/ui/arrangement.js +171 -0
- package/dist/ui/embed-token.d.ts +2 -2
- package/dist/ui/embed-token.js +30 -5
- package/dist/ui/registry.d.ts +42 -17
- package/dist/ui/registry.js +46 -14
- package/dist/ui/slots.controller.d.ts +11 -0
- package/dist/ui/slots.controller.js +25 -0
- package/dist/ui/ui-stream.d.ts +20 -3
- package/dist/ui/ui-stream.js +25 -7
- package/dist/ui/ui.schemas.d.ts +70 -0
- package/dist/ui/ui.schemas.js +65 -0
- package/dist/ui/views.controller.d.ts +35 -49
- package/dist/ui/views.controller.js +48 -70
- package/dist/ui/views.d.ts +112 -18
- package/dist/ui/views.js +254 -47
- package/package.json +6 -3
- package/src/migrations/0063_tool_keys_claude_code.sql +220 -0
- package/src/migrations/0064_account_last_org.sql +7 -0
- package/src/migrations/0065_conversation_archive.sql +8 -0
- package/src/migrations/0066_extension_display_name.sql +4 -0
- package/src/migrations/0067_agent_profiles.sql +20 -0
- package/src/migrations/0068_agent_avatar_uploads.sql +7 -0
- package/src/migrations/0069_attachments_agent_idx.sql +3 -0
- package/src/migrations/0070_background_tasks.sql +37 -0
- package/src/migrations/0071_background_tasks_reserve.sql +6 -0
- package/src/migrations/0072_background_tasks_stopping.sql +5 -0
- package/src/migrations/0073_org_extension_point_defaults.sql +11 -0
- package/src/migrations/0074_subagent_tree.sql +50 -0
- package/src/migrations/0075_plugin_scope.sql +61 -0
- package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
- package/src/migrations/0077_scope_requests.sql +52 -0
- package/src/migrations/0078_scope_grant_switches.sql +18 -0
- package/src/migrations/0079_scope_live_install_switches.sql +19 -0
- package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
- package/src/migrations/0081_platform_components.sql +129 -0
- package/src/migrations/0082_platform_migration.sql +33 -0
- package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
- package/src/migrations/0084_org_owned_items.sql +85 -0
- package/src/migrations/0085_agent_templates_phase4.sql +45 -0
- package/src/migrations/0086_org_layering.sql +30 -0
- package/src/migrations/0087_approval_summary.sql +6 -0
- package/src/migrations/0088_environments.sql +80 -0
- package/src/migrations/0089_model_kinds_usage.sql +38 -0
- package/src/migrations/0090_initial_passwords.sql +27 -0
- package/src/migrations/0091_account_time_zone.sql +4 -0
- package/src/migrations/0092_tools_default_on.sql +27 -0
- package/src/migrations/0093_connected_environments.sql +37 -0
- package/src/migrations/0094_environment_paths_idx.sql +7 -0
- package/src/migrations/0095_environment_files_resets.sql +5 -0
- package/src/migrations/0096_environment_demoted_default.sql +18 -0
- package/src/migrations/0097_extension_installs_enabled_at.sql +16 -0
- package/src/migrations/0098_single_provider_running_first.sql +41 -0
- package/src/migrations/0099_channel_connection_guide_ack.sql +6 -0
- package/src/migrations/0100_catalog_files.sql +13 -0
- package/src/migrations/0101_marketplace_icons.sql +32 -0
- package/src/migrations/0102_themes.sql +64 -0
- package/src/migrations/0103_ui_theme_setting.sql +7 -0
- package/src/migrations/0104_connector_tool_account_policies.sql +16 -0
- package/src/migrations/0105_devices_rename.sql +136 -0
- package/src/migrations/0106_setup_guides_v2.sql +10 -0
- package/src/migrations/0107_extension_client_builds.sql +50 -0
- package/src/migrations/0108_question_skipped.sql +6 -0
- package/src/migrations/0109_audit_platform_idx.sql +5 -0
- package/src/migrations/0110_usage_time_idx.sql +8 -0
- package/src/migrations/0111_agent_skill_sharing.sql +22 -0
- package/src/migrations/0112_skill_share_requests.sql +4 -0
- package/dist/catalog/upgrade-targets.d.ts +0 -56
- package/dist/catalog/upgrade-targets.js +0 -90
- package/dist/conversations/sandbox-status.d.ts +0 -24
- package/dist/conversations/sandbox-status.js +0 -52
- package/dist/extensions/org-config.controller.d.ts +0 -24
- package/dist/extensions/org-config.controller.js +0 -62
- package/dist/tools/builtins/sandbox/names.d.ts +0 -7
- package/dist/tools/builtins/sandbox/names.js +0 -20
- package/dist/tools/builtins/skill-write.d.ts +0 -59
- package/dist/tools/builtins/skill-write.js +0 -244
|
@@ -7,12 +7,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
8
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
9
|
};
|
|
10
|
-
import { randomUUID } from "node:crypto";
|
|
11
|
-
import { EXTENSION_POINTS, parseExtensionPoint, parseSkillMd, SKILL_ENTRY_FILE, } from "@capybara-hq/plugin-sdk";
|
|
10
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
11
|
+
import { EXTENSION_POINTS, marketplaceEntryDeprecation, parseExtensionPoint, parseSkillMd, SKILL_ENTRY_FILE, } from "@capybara-hq/plugin-sdk";
|
|
12
12
|
import { Inject, Injectable } from "@nestjs/common";
|
|
13
13
|
import { sql } from "kysely";
|
|
14
|
-
import
|
|
15
|
-
import {
|
|
14
|
+
import semver from "semver";
|
|
15
|
+
import { revertTemplateVersionIn, softDeleteTemplateIn } from "../agents/templates.js";
|
|
16
16
|
import { ApiError } from "../errors.js";
|
|
17
17
|
import { isExtensionEnabled } from "../extensions/enabled.js";
|
|
18
18
|
import { OrgExtensionConfigs, } from "../extensions/org-config.js";
|
|
@@ -28,11 +28,50 @@ import { OrgLock } from "../orgs/org-lock.js";
|
|
|
28
28
|
import { packagePath } from "../packages/tgz.js";
|
|
29
29
|
import { SkillsService, skillConflictError, skillConflicts, } from "../skills/skills.service.js";
|
|
30
30
|
import { StorageService } from "../storage/storage.service.js";
|
|
31
|
+
import { assertNotPlatformDefault, themesPreview, } from "../themes/theme-usage.js";
|
|
31
32
|
import { ConnectorsService } from "../tools/connectors.service.js";
|
|
32
|
-
import { findConnectorIn, lockOrgForActions, readCatalogAgentTemplates, readCatalogFiles, readCatalogTemplates, requiredActions,
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
33
|
+
import { findConnectorIn, lockOrgForActions, readCatalogAgentTemplates, readCatalogFiles, readCatalogTemplates, requiredActions, templateConnectorInput, templatePluginProblem, } from "./catalog-content.js";
|
|
34
|
+
import { versionUsable } from "./catalog-items.js";
|
|
35
|
+
import { agentDefinitionRefs, componentOn, connectorTemplateState, connectorTemplatesOn, listedIn, loadComponents, loadScopeState, pluginFactsOf, referenceIds, switchOf, themeIdClashes, } from "./component-state.js";
|
|
36
|
+
import { assertItemInstallable, disabledPluginItems, pluginItemDisabled, resolveRequestsByInstall, } from "./request-rules.js";
|
|
37
|
+
import { visibleTo } from "./scope.js";
|
|
38
|
+
import { ScopeNoLongerWanted, ScopeStillWanted, wantedByScope } from "./scope-state.js";
|
|
35
39
|
import { maxSatisfying, satisfiesRange } from "./versions.js";
|
|
40
|
+
/** The confirm hash of an uninstall preview: sha256 over its sorted JSON (the scheme of `diffHash`). */
|
|
41
|
+
export function uninstallPreviewHash(p) {
|
|
42
|
+
const by = (xs) => [...xs].sort((a, b) => `${a.kind}:${a.ref}`.localeCompare(`${b.kind}:${b.ref}`));
|
|
43
|
+
return createHash("sha256")
|
|
44
|
+
.update(JSON.stringify({
|
|
45
|
+
...p,
|
|
46
|
+
components: by(p.components),
|
|
47
|
+
kept: by(p.kept),
|
|
48
|
+
agents: [...p.agents]
|
|
49
|
+
.sort((a, b) => a.id.localeCompare(b.id))
|
|
50
|
+
.map((a) => ({ ...a, uses: by(a.uses) })),
|
|
51
|
+
}))
|
|
52
|
+
.digest("hex");
|
|
53
|
+
}
|
|
54
|
+
/** Upserts the org's switch row of an item in the caller's transaction (the org lock is held). */
|
|
55
|
+
export async function upsertOrgSwitch(db, orgId, itemId, enabled, actor) {
|
|
56
|
+
await db
|
|
57
|
+
.insertInto("catalog_item_org_switches")
|
|
58
|
+
.values({ item_id: itemId, org_id: orgId, enabled, updated_by: actor })
|
|
59
|
+
.onConflict((oc) => oc.columns(["item_id", "org_id"]).doUpdateSet({
|
|
60
|
+
enabled,
|
|
61
|
+
updated_by: actor,
|
|
62
|
+
updated_at: sql `now()`,
|
|
63
|
+
}))
|
|
64
|
+
.execute();
|
|
65
|
+
}
|
|
66
|
+
/** The kernel (actor null, the scope sync) never installs what needs the org's input. */
|
|
67
|
+
export class NeedsOrgInput extends ApiError {
|
|
68
|
+
plugin;
|
|
69
|
+
constructor(plugin) {
|
|
70
|
+
super("internal", `Plugin ${plugin} needs the organization's input (connector templates); only a person can install it`);
|
|
71
|
+
this.plugin = plugin;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const systemNeedsInput = (name) => new NeedsOrgInput(name);
|
|
36
75
|
/** How deep plugin dependencies may nest (the root plugin's dependencies are level 1). */
|
|
37
76
|
export const DEPENDENCY_DEPTH_LIMIT = 10;
|
|
38
77
|
/** A failed install step, carried up through the dependency installs to the root install. */
|
|
@@ -65,33 +104,66 @@ const installNotFound = () => new ApiError("plugin.install_not_found", "Plugin i
|
|
|
65
104
|
const fail = (path, message) => new ApiError("validation_failed", "Request validation failed", [{ path, message }]);
|
|
66
105
|
const isUniqueViolation = (e) => typeof e === "object" && e !== null && e.code === "23505";
|
|
67
106
|
const unresolved = (name, range, why) => new ApiError("catalog.dependency_unresolved", `Dependency ${name}@${range} cannot be resolved: ${why}`, [{ dependency: name, range }]);
|
|
68
|
-
const dependencyDisabled = (name) => new ApiError("catalog.dependency_disabled", `Dependency ${name} is disabled by the
|
|
107
|
+
const dependencyDisabled = (name) => new ApiError("catalog.dependency_disabled", `Dependency ${name} is disabled by the super admin, so this plugin cannot be installed`, [{ dependency: name }]);
|
|
69
108
|
/**
|
|
70
|
-
* The dependency `d` resolved against the catalog
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
109
|
+
* The dependency `d` resolved against the catalog (ruling P2-17, one version per deployment): the
|
|
110
|
+
* dependency's platform version (`platform_synced_version`), which must satisfy its range; only
|
|
111
|
+
* while it has none yet (its first sync failed), the highest imported version satisfying the range
|
|
112
|
+
* that its marketplace does not deprecate, a stable one before a prerelease (the marketplace
|
|
113
|
+
* folding rule). No such item or version -> `catalog.dependency_unresolved`; the item disabled ->
|
|
114
|
+
* `catalog.dependency_disabled` (the super admin's ban is not bypassed, spec §10).
|
|
74
115
|
*/
|
|
75
116
|
async function resolveOne(db, d) {
|
|
76
117
|
const item = await db
|
|
77
118
|
.selectFrom("catalog_items")
|
|
78
|
-
.select([
|
|
119
|
+
.select([
|
|
120
|
+
"id",
|
|
121
|
+
"disabled",
|
|
122
|
+
"platform_synced_version",
|
|
123
|
+
"marketplace_id",
|
|
124
|
+
"awaiting_confirmation",
|
|
125
|
+
"owner_org_id",
|
|
126
|
+
"latest_version",
|
|
127
|
+
])
|
|
79
128
|
.where("name", "=", d.name)
|
|
80
129
|
.where("deleted_at", "is", null)
|
|
81
130
|
.executeTakeFirst();
|
|
82
131
|
if (!item) {
|
|
83
|
-
throw unresolved(d.name, d.version, "it is not in the
|
|
132
|
+
throw unresolved(d.name, d.version, "it is not in the platform catalog; ask the super admin to import it");
|
|
84
133
|
}
|
|
85
|
-
if (item.
|
|
134
|
+
if (item.disabled)
|
|
86
135
|
throw dependencyDisabled(d.name);
|
|
136
|
+
// An org upload waiting for the super admin is no dependency target (ruling P3-9)
|
|
137
|
+
if (item.awaiting_confirmation) {
|
|
138
|
+
throw unresolved(d.name, d.version, "it waits for a super admin to confirm its extension");
|
|
139
|
+
}
|
|
87
140
|
const versions = await db
|
|
88
141
|
.selectFrom("catalog_item_versions")
|
|
89
|
-
.select(["version", "manifest", "imported_at"])
|
|
142
|
+
.select(["version", "manifest", "imported_at", "applied_at", "rejected_at"])
|
|
90
143
|
.where("item_id", "=", item.id)
|
|
91
144
|
.execute();
|
|
92
|
-
|
|
145
|
+
let v;
|
|
146
|
+
if (item.platform_synced_version !== null) {
|
|
147
|
+
v = versions.find((x) => x.version === item.platform_synced_version);
|
|
148
|
+
if (!v || !satisfiesRange(v.version, d.version)) {
|
|
149
|
+
throw unresolved(d.name, d.version, `its platform version ${item.platform_synced_version} does not satisfy the range; ask ` +
|
|
150
|
+
"the super admin to update it");
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
const deprecated = await deprecatedVersions(db, d.name, item.marketplace_id);
|
|
155
|
+
// An org's plugin offers only its applied version: never one pending or rejected (P3-34),
|
|
156
|
+
// also once transferred to the platform (P3-52)
|
|
157
|
+
const candidates = versions
|
|
158
|
+
.filter((x) => versionUsable(x))
|
|
159
|
+
.filter((x) => item.owner_org_id === null || x.version === item.latest_version)
|
|
160
|
+
.filter((x) => !deprecated.has(x.version))
|
|
161
|
+
.map((x) => ({ ...x, importedAt: x.imported_at }));
|
|
162
|
+
v =
|
|
163
|
+
maxSatisfying(candidates.filter((x) => semver.prerelease(x.version) === null), d.version) ?? maxSatisfying(candidates, d.version);
|
|
164
|
+
}
|
|
93
165
|
if (!v) {
|
|
94
|
-
throw unresolved(d.name, d.version, "no imported version satisfies the range; ask the
|
|
166
|
+
throw unresolved(d.name, d.version, "no imported version satisfies the range; ask the super admin to import one");
|
|
95
167
|
}
|
|
96
168
|
return {
|
|
97
169
|
name: d.name,
|
|
@@ -101,10 +173,24 @@ async function resolveOne(db, d) {
|
|
|
101
173
|
manifest: v.manifest,
|
|
102
174
|
};
|
|
103
175
|
}
|
|
176
|
+
/** The versions of plugin `name` its marketplace (`marketplaceId`) marks deprecated. */
|
|
177
|
+
async function deprecatedVersions(db, name, marketplaceId) {
|
|
178
|
+
if (marketplaceId === null)
|
|
179
|
+
return new Set();
|
|
180
|
+
const rows = await db
|
|
181
|
+
.selectFrom("marketplace_entries")
|
|
182
|
+
.select(["version", "entry"])
|
|
183
|
+
.where("source_id", "=", marketplaceId)
|
|
184
|
+
.where("name", "=", name)
|
|
185
|
+
.execute();
|
|
186
|
+
return new Set(rows
|
|
187
|
+
.filter((r) => marketplaceEntryDeprecation(r.entry) !== null)
|
|
188
|
+
.map((r) => r.version));
|
|
189
|
+
}
|
|
104
190
|
/**
|
|
105
|
-
* Resolves a plugin's dependencies against the catalog: for each one the
|
|
106
|
-
*
|
|
107
|
-
* dependency nothing satisfies -> `catalog.dependency_unresolved`; a disabled one ->
|
|
191
|
+
* Resolves a plugin's dependencies against the catalog: for each one the platform version of the
|
|
192
|
+
* live item with that name, which must satisfy its range (see `resolveOne`). The whole dependency
|
|
193
|
+
* tree is checked: a dependency nothing satisfies -> `catalog.dependency_unresolved`; a disabled one ->
|
|
108
194
|
* `catalog.dependency_disabled`; a cycle (`a` -> `b` -> `a`, by name) or nesting deeper than
|
|
109
195
|
* {@link DEPENDENCY_DEPTH_LIMIT} -> `catalog.dependency_cycle`. Returns the direct dependencies.
|
|
110
196
|
*/
|
|
@@ -189,9 +275,11 @@ export function under(e, at) {
|
|
|
189
275
|
* not run it; already enabled is recorded created=false);
|
|
190
276
|
* 3. connectors from the templates (credentials / clients go to secrets, default policies are
|
|
191
277
|
* recorded `policy_source 'template'`);
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
*
|
|
278
|
+
* The plugin's skills and agent templates are platform components (plugin scope phase 2): stored
|
|
279
|
+
* once for the deployment and on in the org while the plugin is, so an install writes no org rows
|
|
280
|
+
* for them; a skill name the org already uses (its own skill, another plugin's) refuses the install
|
|
281
|
+
* while planning with `plugin.skill_conflict` (spec §9.2, rule 10). Uninstall leaves the org copies
|
|
282
|
+
* earlier installs wrote (linked to the platform components by the migration).
|
|
195
283
|
* Approval follows the installed plugin's policy only (spec §10): dependency components are
|
|
196
284
|
* re-checked against the root item's policy and their own item's disabled state. Each component is
|
|
197
285
|
* recorded in `plugin_install_components` as soon as it exists; if any step fails, the components
|
|
@@ -199,9 +287,10 @@ export function under(e, at) {
|
|
|
199
287
|
* install is marked failed (error holds only the step and the error code) and 502
|
|
200
288
|
* `plugin.install_failed` is thrown. Uninstall removes only components with created=true that
|
|
201
289
|
* nothing else uses, and reports what it kept and why. No in-process state; the org row lock
|
|
202
|
-
* serializes writes within one org.
|
|
203
|
-
* (plugin-upgrade.ts
|
|
204
|
-
* `
|
|
290
|
+
* serializes writes within one org. There is no per-org upgrade: a platform plugin is updated
|
|
291
|
+
* once for the deployment (`PlatformPluginUpdater`, plugin-upgrade.ts, ruling F2); an install left
|
|
292
|
+
* `upgrading` by an earlier per-org upgrade is undone from its journal by the next uninstall. The
|
|
293
|
+
* methods without `private` are internal to the catalog, not an API.
|
|
205
294
|
*/
|
|
206
295
|
let PluginInstaller = class PluginInstaller {
|
|
207
296
|
kdb;
|
|
@@ -210,7 +299,6 @@ let PluginInstaller = class PluginInstaller {
|
|
|
210
299
|
registry;
|
|
211
300
|
skills;
|
|
212
301
|
orgConfigs;
|
|
213
|
-
requests;
|
|
214
302
|
config;
|
|
215
303
|
connectors;
|
|
216
304
|
log;
|
|
@@ -219,7 +307,7 @@ let PluginInstaller = class PluginInstaller {
|
|
|
219
307
|
/** The org row lock (orgs/org-lock.ts): joins the caller's transaction. */
|
|
220
308
|
orgLock, storage,
|
|
221
309
|
/** The loaded extensions and connectors of this replica (the extension registry). */
|
|
222
|
-
registry, skills, orgConfigs,
|
|
310
|
+
registry, skills, orgConfigs, config,
|
|
223
311
|
/** Org connectors: installs create, upgrade and remove them. */
|
|
224
312
|
connectors, log, txHost) {
|
|
225
313
|
this.kdb = kdb;
|
|
@@ -228,7 +316,6 @@ let PluginInstaller = class PluginInstaller {
|
|
|
228
316
|
this.registry = registry;
|
|
229
317
|
this.skills = skills;
|
|
230
318
|
this.orgConfigs = orgConfigs;
|
|
231
|
-
this.requests = requests;
|
|
232
319
|
this.config = config;
|
|
233
320
|
this.connectors = connectors;
|
|
234
321
|
this.log = log;
|
|
@@ -250,15 +337,20 @@ let PluginInstaller = class PluginInstaller {
|
|
|
250
337
|
async preflight(orgId, actor, itemId, version) {
|
|
251
338
|
const plan = await this.plan(orgId, actor, itemId, version, null, "", undefined);
|
|
252
339
|
await this.assertNoSkillConflicts(orgId, plan);
|
|
340
|
+
await this.assertNoThemeClashes(orgId, itemId);
|
|
253
341
|
return { actions: planActions(plan) };
|
|
254
342
|
}
|
|
255
343
|
async install(orgId, actor, itemId, version, input, opts = {}) {
|
|
344
|
+
const { switchOn, via, ...actorOpts } = opts;
|
|
256
345
|
const plan = await this.plan(orgId, actor, itemId, version, input, "", undefined);
|
|
257
346
|
await this.assertNoSkillConflicts(orgId, plan);
|
|
347
|
+
await this.assertNoThemeClashes(orgId, itemId);
|
|
258
348
|
let installId;
|
|
259
349
|
try {
|
|
260
|
-
installId = await this.execute(orgId, actor, plan,
|
|
350
|
+
installId = await this.execute(orgId, actor, plan, actorOpts, {
|
|
261
351
|
actions: planActions(plan),
|
|
352
|
+
...(switchOn === true && { switchOn }),
|
|
353
|
+
...(via !== undefined && { via }),
|
|
262
354
|
});
|
|
263
355
|
}
|
|
264
356
|
catch (e) {
|
|
@@ -297,6 +389,39 @@ let PluginInstaller = class PluginInstaller {
|
|
|
297
389
|
if (conflicts.length > 0)
|
|
298
390
|
throw skillConflictError(conflicts);
|
|
299
391
|
}
|
|
392
|
+
/**
|
|
393
|
+
* Refuses installing a plugin whose themes would come on in the org (they follow it) while
|
|
394
|
+
* another theme with the same id is on there (themes spec §6, rule 10): 409 `theme.id_taken`,
|
|
395
|
+
* details `[{ theme, orgId, themes, plugins }]`, before anything is written.
|
|
396
|
+
*/
|
|
397
|
+
async assertNoThemeClashes(orgId, itemId) {
|
|
398
|
+
const themes = await loadComponents(this.db, "theme", { itemId });
|
|
399
|
+
if (themes.length === 0)
|
|
400
|
+
return;
|
|
401
|
+
const st = await loadScopeState(this.db, "theme", themes);
|
|
402
|
+
const conflicts = [];
|
|
403
|
+
for (const c of themes) {
|
|
404
|
+
const p = pluginFactsOf(st, c.itemId, orgId);
|
|
405
|
+
const listed = listedIn(st, c.id, orgId);
|
|
406
|
+
const sw = switchOf(st, c.id, orgId);
|
|
407
|
+
if (componentOn(c, p, listed, sw) ||
|
|
408
|
+
!componentOn(c, p && { ...p, installed: true }, listed, sw)) {
|
|
409
|
+
continue;
|
|
410
|
+
}
|
|
411
|
+
const clash = await themeIdClashes(this.db, orgId, c, c.name);
|
|
412
|
+
if (clash.length > 0) {
|
|
413
|
+
conflicts.push({
|
|
414
|
+
theme: c.name,
|
|
415
|
+
orgId,
|
|
416
|
+
themes: clash.map((x) => x.id),
|
|
417
|
+
plugins: clash.map((x) => x.plugin ?? "platform"),
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
if (conflicts.length > 0) {
|
|
422
|
+
throw new ApiError("theme.id_taken", `The plugin's themes would come on next to themes with the same id already on in this organization (${conflicts.map((c) => c.theme).join(", ")}); switch those themes off first`, conflicts);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
300
425
|
/** The connector checks of templates against what this replica loads right now. */
|
|
301
426
|
templateDeps() {
|
|
302
427
|
const versions = new Map(this.registry.manifests().map((m) => [m.name, m.version]));
|
|
@@ -332,9 +457,17 @@ let PluginInstaller = class PluginInstaller {
|
|
|
332
457
|
if (!v)
|
|
333
458
|
throw new ApiError("catalog.item_not_found", "Plugin version not found");
|
|
334
459
|
const manifest = v.manifest;
|
|
335
|
-
const
|
|
460
|
+
const declared = await resolveDependencies(this.db, manifest);
|
|
336
461
|
const extension = await this.planExtension(orgId, manifest);
|
|
337
|
-
const
|
|
462
|
+
const allTemplates = await readCatalogTemplates(this.storage, v);
|
|
463
|
+
// Only the connector templates on in the org make connectors (ruling P2-6): one switched off
|
|
464
|
+
// there, outside its own scope or disabled is skipped (input given for it is ignored)
|
|
465
|
+
const on = await connectorTemplatesOn(this.db, orgId, itemId, allTemplates.map((t) => t.id));
|
|
466
|
+
const templates = allTemplates.filter((t) => on.has(t.id));
|
|
467
|
+
const deps = [
|
|
468
|
+
...declared,
|
|
469
|
+
...(await this.impliedProviders(orgId, manifest, templates, declared)),
|
|
470
|
+
];
|
|
338
471
|
const skillNames = await catalogSkillNames(this.storage, v, manifest);
|
|
339
472
|
const agentTemplates = await readCatalogAgentTemplates(this.storage, v);
|
|
340
473
|
const connectors = new Map();
|
|
@@ -346,8 +479,11 @@ let PluginInstaller = class PluginInstaller {
|
|
|
346
479
|
}
|
|
347
480
|
}
|
|
348
481
|
else {
|
|
349
|
-
this.checkInput(manifest,
|
|
482
|
+
this.checkInput(manifest, allTemplates, input, at);
|
|
350
483
|
for (const ct of templates) {
|
|
484
|
+
// The kernel installs only what needs no org input (the scope sync's `needs_config` rule)
|
|
485
|
+
if (actor === null)
|
|
486
|
+
throw systemNeedsInput(manifest.name);
|
|
351
487
|
connectors.set(ct.id, this.planConnector(actor, { itemId, version, name: manifest.name }, ct, input, at, approvedBy));
|
|
352
488
|
}
|
|
353
489
|
}
|
|
@@ -378,6 +514,64 @@ let PluginInstaller = class PluginInstaller {
|
|
|
378
514
|
dependencies,
|
|
379
515
|
};
|
|
380
516
|
}
|
|
517
|
+
/**
|
|
518
|
+
* The providers of the templates' connector kinds as implied dependencies: a template whose
|
|
519
|
+
* `plugin` is neither this plugin, a declared dependency nor already enabled in the org makes that
|
|
520
|
+
* plugin a dependency (installed first, recorded like a declared one, so an uninstall hands it
|
|
521
|
+
* back). No such plugin offered by the catalog -> `connector.kind_unavailable` naming it, before
|
|
522
|
+
* anything is written.
|
|
523
|
+
*/
|
|
524
|
+
async impliedProviders(orgId, manifest, templates, declared) {
|
|
525
|
+
const out = [];
|
|
526
|
+
const seen = new Set([manifest.name, ...declared.map((d) => d.name)]);
|
|
527
|
+
for (const ct of templates) {
|
|
528
|
+
const provider = ct.file.template.plugin;
|
|
529
|
+
if (seen.has(provider))
|
|
530
|
+
continue;
|
|
531
|
+
seen.add(provider);
|
|
532
|
+
// Not deployed: the not_deployed refusal of the plan's own checks says it
|
|
533
|
+
if (templatePluginProblem(this.templateDeps(), ct.file.template) !== undefined)
|
|
534
|
+
continue;
|
|
535
|
+
if (await isExtensionEnabled(this.db, orgId, provider))
|
|
536
|
+
continue;
|
|
537
|
+
const refuse = (why) => new ApiError("connector.kind_unavailable", `Connector template ${ct.id} needs the plugin ${provider}, which is not enabled in this organization: ${why}`);
|
|
538
|
+
let dep;
|
|
539
|
+
try {
|
|
540
|
+
const { manifest: _m, ...resolved } = await resolveOne(this.db, {
|
|
541
|
+
name: provider,
|
|
542
|
+
version: ct.file.template.pluginVersion ?? "*",
|
|
543
|
+
});
|
|
544
|
+
dep = resolved;
|
|
545
|
+
}
|
|
546
|
+
catch (e) {
|
|
547
|
+
if (!(e instanceof ApiError))
|
|
548
|
+
throw e;
|
|
549
|
+
throw refuse(e.code === "catalog.dependency_unresolved"
|
|
550
|
+
? `${provider} is deployed but switched off here and the catalog has no entry to switch it on; ask the super admin to enable it`
|
|
551
|
+
: `${provider} is not offered to this organization`);
|
|
552
|
+
}
|
|
553
|
+
// Scope: only a plugin offered to this org may be switched on for it (nothing more is said)
|
|
554
|
+
const item = await this.db
|
|
555
|
+
.selectFrom("catalog_items")
|
|
556
|
+
.select(["scope", "builtin"])
|
|
557
|
+
.where("id", "=", dep.itemId)
|
|
558
|
+
.executeTakeFirstOrThrow();
|
|
559
|
+
const listed = await this.db
|
|
560
|
+
.selectFrom("catalog_item_scope_orgs")
|
|
561
|
+
.select("item_id")
|
|
562
|
+
.where("item_id", "=", dep.itemId)
|
|
563
|
+
.where("org_id", "=", orgId)
|
|
564
|
+
.executeTakeFirst();
|
|
565
|
+
if (!visibleTo({ scope: item.builtin ? "all" : item.scope }, listed !== undefined)) {
|
|
566
|
+
throw refuse(`${provider} is not offered to this organization`);
|
|
567
|
+
}
|
|
568
|
+
if (await this.findLiveDependency(this.db, orgId, dep, false)) {
|
|
569
|
+
throw refuse(`${provider} is installed but switched off in this organization`);
|
|
570
|
+
}
|
|
571
|
+
out.push(dep);
|
|
572
|
+
}
|
|
573
|
+
return out;
|
|
574
|
+
}
|
|
381
575
|
/**
|
|
382
576
|
* The connector input of one template from the org's input (C30), checked without a connection:
|
|
383
577
|
* the template's connector extension deployed, the input valid, the credential / OAuth client it
|
|
@@ -481,7 +675,7 @@ let PluginInstaller = class PluginInstaller {
|
|
|
481
675
|
* as they are. Returns the install id.
|
|
482
676
|
*/
|
|
483
677
|
async execute(orgId, actor, plan, opts, ctx) {
|
|
484
|
-
const { itemId,
|
|
678
|
+
const { itemId, manifest } = plan;
|
|
485
679
|
// The install row (role and item policy re-checked under the lock; one live install per org
|
|
486
680
|
// and item)
|
|
487
681
|
const installId = randomUUID();
|
|
@@ -523,6 +717,7 @@ let PluginInstaller = class PluginInstaller {
|
|
|
523
717
|
actions: requiredActions(depPlan.manifest),
|
|
524
718
|
approvedBy,
|
|
525
719
|
parent: installId,
|
|
720
|
+
...(ctx.via !== undefined && { via: ctx.via }),
|
|
526
721
|
});
|
|
527
722
|
}
|
|
528
723
|
catch (e) {
|
|
@@ -551,6 +746,8 @@ let PluginInstaller = class PluginInstaller {
|
|
|
551
746
|
const ci = plan.connectors.get(ct.id);
|
|
552
747
|
if (!ci)
|
|
553
748
|
throw new ApiError("internal", `Connector template ${ct.id} was not planned`);
|
|
749
|
+
if (actor === null)
|
|
750
|
+
throw systemNeedsInput(manifest.name);
|
|
554
751
|
const r = await this.connectors.create(orgId, actor, ci, opts.actorTokenId);
|
|
555
752
|
await record({
|
|
556
753
|
kind: "connector",
|
|
@@ -560,30 +757,8 @@ let PluginInstaller = class PluginInstaller {
|
|
|
560
757
|
templateId: ct.id,
|
|
561
758
|
});
|
|
562
759
|
}
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
await this.installAgentTemplate(orgId, plan, a.template, record);
|
|
566
|
-
}
|
|
567
|
-
step = "skills";
|
|
568
|
-
for (const s of manifest.skills ?? []) {
|
|
569
|
-
const files = await readCatalogFiles(this.storage, plan.row.object_prefix, plan.row.files, packagePath(s.path));
|
|
570
|
-
const r = await this.skills.createVersionFromFiles(orgId, actor, { ...skillOf(files), files }, {
|
|
571
|
-
catalog: {
|
|
572
|
-
itemId,
|
|
573
|
-
version,
|
|
574
|
-
...(nested && { approvedBy }),
|
|
575
|
-
format: plan.sourceFormat,
|
|
576
|
-
suggestPinned: s.pinned === true,
|
|
577
|
-
},
|
|
578
|
-
...opts,
|
|
579
|
-
});
|
|
580
|
-
await record({
|
|
581
|
-
kind: "skill",
|
|
582
|
-
ref: r.skill.id,
|
|
583
|
-
created: r.created,
|
|
584
|
-
skillVersion: r.created ? null : r.version,
|
|
585
|
-
});
|
|
586
|
-
}
|
|
760
|
+
// Skills and agent templates are platform components (plugin scope phase 2): stored once for
|
|
761
|
+
// the deployment and on in the org while the plugin is, so the install writes no org rows
|
|
587
762
|
await this.markInstalled(orgId, actor, installId, plan, done, ctx, opts);
|
|
588
763
|
return installId;
|
|
589
764
|
}
|
|
@@ -620,18 +795,25 @@ let PluginInstaller = class PluginInstaller {
|
|
|
620
795
|
const { itemId, version } = plan;
|
|
621
796
|
const t = this.db;
|
|
622
797
|
await lockOrgForActions(this.orgLock, orgId, actor, ctx.actions);
|
|
798
|
+
// The scope sync decided outside this lock: a person's switch-off or a scope change committed
|
|
799
|
+
// since then wins (nothing written, converged)
|
|
800
|
+
if (ctx.via === "scope" &&
|
|
801
|
+
ctx.approvedBy === undefined &&
|
|
802
|
+
!(await wantedByScope(t, orgId, itemId))) {
|
|
803
|
+
throw new ScopeNoLongerWanted(orgId, itemId);
|
|
804
|
+
}
|
|
623
805
|
if (ctx.approvedBy !== undefined) {
|
|
624
806
|
// A dependency disabled (or removed) since it was planned
|
|
625
807
|
const own = await t
|
|
626
808
|
.selectFrom("catalog_items")
|
|
627
|
-
.select(["
|
|
809
|
+
.select(["disabled", "deleted_at"])
|
|
628
810
|
.where("id", "=", itemId)
|
|
629
811
|
.forShare()
|
|
630
812
|
.executeTakeFirst();
|
|
631
813
|
if (!own || own.deleted_at !== null) {
|
|
632
|
-
throw unresolved(plan.name, plan.version, "it was removed from the
|
|
814
|
+
throw unresolved(plan.name, plan.version, "it was removed from the platform catalog");
|
|
633
815
|
}
|
|
634
|
-
if (own.
|
|
816
|
+
if (own.disabled)
|
|
635
817
|
throw dependencyDisabled(plan.name);
|
|
636
818
|
}
|
|
637
819
|
await assertItemInstallable(t, orgId, itemId, ctx.approvedBy ?? itemId);
|
|
@@ -663,34 +845,22 @@ let PluginInstaller = class PluginInstaller {
|
|
|
663
845
|
throw e;
|
|
664
846
|
}
|
|
665
847
|
}
|
|
666
|
-
/**
|
|
667
|
-
* An agent template step: created (or a new version of the org's live template of this plugin and
|
|
668
|
-
* name) and recorded in one transaction of its own, under the org row lock.
|
|
669
|
-
*/
|
|
670
|
-
async installAgentTemplate(orgId, plan, template, record) {
|
|
671
|
-
await this.orgLock.lock(orgId);
|
|
672
|
-
const r = await putTemplateVersionIn(this.db, {
|
|
673
|
-
orgId,
|
|
674
|
-
plugin: plan.name,
|
|
675
|
-
catalogItemId: plan.itemId,
|
|
676
|
-
catalogVersion: plan.version,
|
|
677
|
-
sourceFormat: plan.sourceFormat,
|
|
678
|
-
}, template);
|
|
679
|
-
await record({
|
|
680
|
-
kind: "agent_template",
|
|
681
|
-
ref: r.id,
|
|
682
|
-
created: r.created,
|
|
683
|
-
skillVersion: !r.created && r.changed ? r.version : null,
|
|
684
|
-
});
|
|
685
|
-
}
|
|
686
848
|
/** The install `installed` and its `plugin.org_installed` audit, under the org row lock (its own transaction). */
|
|
687
849
|
async markInstalled(orgId, actor, installId, plan, done, ctx, opts) {
|
|
688
850
|
const { itemId, version } = plan;
|
|
689
851
|
const t = this.db;
|
|
690
852
|
await this.orgLock.lock(orgId);
|
|
853
|
+
// The platform version current at commit (one per deployment): a platform update that
|
|
854
|
+
// committed while this install ran moved the row already, or did not see it yet
|
|
691
855
|
const updated = await t
|
|
692
856
|
.updateTable("plugin_installs")
|
|
693
|
-
.set(
|
|
857
|
+
.set((eb) => ({
|
|
858
|
+
status: "installed",
|
|
859
|
+
version: eb.fn.coalesce(eb
|
|
860
|
+
.selectFrom("catalog_items as i")
|
|
861
|
+
.select("i.platform_synced_version")
|
|
862
|
+
.where("i.id", "=", itemId), eb.ref("plugin_installs.version")),
|
|
863
|
+
}))
|
|
694
864
|
.where("id", "=", installId)
|
|
695
865
|
.where("status", "=", "installing")
|
|
696
866
|
.executeTakeFirst();
|
|
@@ -699,7 +869,11 @@ let PluginInstaller = class PluginInstaller {
|
|
|
699
869
|
if (updated.numUpdatedRows === 0n) {
|
|
700
870
|
throw new ApiError("plugin.install_not_found", "The install record was cleaned up as stale while the install was running");
|
|
701
871
|
}
|
|
702
|
-
await
|
|
872
|
+
await resolveRequestsByInstall(t, orgId, itemId, actor, opts);
|
|
873
|
+
// The org switch is written with the install, in one transaction under the org lock
|
|
874
|
+
if (ctx.switchOn === true && ctx.parent === undefined) {
|
|
875
|
+
await upsertOrgSwitch(t, orgId, itemId, true, actor);
|
|
876
|
+
}
|
|
703
877
|
await audit(t, {
|
|
704
878
|
actorAccountId: actor,
|
|
705
879
|
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
@@ -712,6 +886,8 @@ let PluginInstaller = class PluginInstaller {
|
|
|
712
886
|
version,
|
|
713
887
|
components: done,
|
|
714
888
|
...(ctx.parent !== undefined && { dependencyOf: ctx.parent }),
|
|
889
|
+
...(ctx.via !== undefined && { via: ctx.via }),
|
|
890
|
+
...opts.auditDetail,
|
|
715
891
|
},
|
|
716
892
|
});
|
|
717
893
|
}
|
|
@@ -740,6 +916,8 @@ let PluginInstaller = class PluginInstaller {
|
|
|
740
916
|
rolledBack: done,
|
|
741
917
|
rollbackErrors,
|
|
742
918
|
...(ctx.parent !== undefined && { dependencyOf: ctx.parent }),
|
|
919
|
+
...(ctx.via !== undefined && { via: ctx.via }),
|
|
920
|
+
...opts.auditDetail,
|
|
743
921
|
},
|
|
744
922
|
});
|
|
745
923
|
}
|
|
@@ -754,7 +932,7 @@ let PluginInstaller = class PluginInstaller {
|
|
|
754
932
|
return null;
|
|
755
933
|
const name = manifest.name;
|
|
756
934
|
if (!this.registry.manifests().some((m) => m.name === name)) {
|
|
757
|
-
throw new ApiError("catalog.not_deployed", `The extension of plugin ${name} is not
|
|
935
|
+
throw new ApiError("catalog.not_deployed", `The extension of plugin ${name} is not running on the platform (not installed, waiting for its deployment config or permission approval, disabled, or failed to load); the org cannot switch it on until it runs`);
|
|
758
936
|
}
|
|
759
937
|
const enabled = await isExtensionEnabled(this.db, orgId, name);
|
|
760
938
|
if (!enabled && (await disabledPluginItems(this.db, [name])).length > 0) {
|
|
@@ -864,6 +1042,13 @@ let PluginInstaller = class PluginInstaller {
|
|
|
864
1042
|
}
|
|
865
1043
|
if (c.kind === "plugin")
|
|
866
1044
|
return false;
|
|
1045
|
+
// A row the org promoted is the org's own shared item (ruling P3-47): an install never
|
|
1046
|
+
// removes or reverts it (P3-46 keeps plugin content from being promoted; this guards rows
|
|
1047
|
+
// recorded before that or by a legacy install)
|
|
1048
|
+
if ((c.kind === "agent_template" || c.kind === "skill") &&
|
|
1049
|
+
(await promotedOrgRow(t, orgId, c.kind, c.ref))) {
|
|
1050
|
+
return false;
|
|
1051
|
+
}
|
|
867
1052
|
if (c.kind === "agent_template") {
|
|
868
1053
|
if (c.created)
|
|
869
1054
|
return softDeleteTemplateIn(t, orgId, c.ref);
|
|
@@ -901,25 +1086,83 @@ let PluginInstaller = class PluginInstaller {
|
|
|
901
1086
|
* (a replica crashed midway) - the last two are cleaned up as a rollback (versions added to
|
|
902
1087
|
* existing skills are reverted too). Still installing -> `plugin.install_in_progress`.
|
|
903
1088
|
*/
|
|
904
|
-
async uninstall(orgId, actor, installId, opts = {}) {
|
|
1089
|
+
async uninstall(orgId, actor, installId, opts = {}, sw) {
|
|
905
1090
|
if (!UUID_RE.test(installId))
|
|
906
1091
|
throw installNotFound();
|
|
907
|
-
return this.writeUninstall(orgId, actor, installId, opts);
|
|
1092
|
+
return this.writeUninstall(orgId, actor, installId, opts, sw);
|
|
908
1093
|
}
|
|
909
|
-
/**
|
|
910
|
-
|
|
1094
|
+
/**
|
|
1095
|
+
* The uninstall's one transaction; the extensions it disabled are notified once it commits. A
|
|
1096
|
+
* scope sync uninstall (`via: "scope"`) re-checks under the org row lock that the item is still
|
|
1097
|
+
* not wanted in the org and that no other live install depends on it ({@link ScopeStillWanted},
|
|
1098
|
+
* nothing written), and keeps the connectors it created as the org's own (`org_owned`).
|
|
1099
|
+
*/
|
|
1100
|
+
async writeUninstall(orgId, actor, installId, opts, sw) {
|
|
1101
|
+
const { via, ...actorOpts } = opts;
|
|
911
1102
|
const report = { removed: [], kept: [] };
|
|
1103
|
+
let itemId;
|
|
1104
|
+
if (via === "scope") {
|
|
1105
|
+
// A person's switch-on (or a scope change) committed after the sync's decision wins
|
|
1106
|
+
await this.orgLock.lock(orgId);
|
|
1107
|
+
const row = await this.db
|
|
1108
|
+
.selectFrom("plugin_installs")
|
|
1109
|
+
.select("item_id")
|
|
1110
|
+
.where("id", "=", installId)
|
|
1111
|
+
.where("org_id", "=", orgId)
|
|
1112
|
+
.executeTakeFirst();
|
|
1113
|
+
if (row !== undefined &&
|
|
1114
|
+
((await wantedByScope(this.db, orgId, row.item_id)) ||
|
|
1115
|
+
(await this.heir(orgId, new Set([installId]), "plugin", installId)) !== undefined)) {
|
|
1116
|
+
throw new ScopeStillWanted(orgId, row.item_id);
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
if (sw !== undefined) {
|
|
1120
|
+
// Switching off: the org lock first, then the preview is re-checked and the switch row is
|
|
1121
|
+
// written in this same transaction
|
|
1122
|
+
await this.orgLock.lock(orgId);
|
|
1123
|
+
const row = await this.db
|
|
1124
|
+
.selectFrom("plugin_installs")
|
|
1125
|
+
.select("item_id")
|
|
1126
|
+
.where("id", "=", installId)
|
|
1127
|
+
.where("org_id", "=", orgId)
|
|
1128
|
+
.executeTakeFirst();
|
|
1129
|
+
itemId = row?.item_id;
|
|
1130
|
+
// The item row FOR SHARE, as a switch without an uninstall takes it: an owner's delete or
|
|
1131
|
+
// transfer (FOR UPDATE) decides on who uses it
|
|
1132
|
+
if (itemId !== undefined) {
|
|
1133
|
+
await this.db
|
|
1134
|
+
.selectFrom("catalog_items")
|
|
1135
|
+
.select("id")
|
|
1136
|
+
.where("id", "=", itemId)
|
|
1137
|
+
.forShare()
|
|
1138
|
+
.executeTakeFirst();
|
|
1139
|
+
}
|
|
1140
|
+
if (sw.expectHash !== undefined && row !== undefined) {
|
|
1141
|
+
const now = uninstallPreviewHash(await this.previewUninstall(orgId, installId));
|
|
1142
|
+
if (now !== sw.expectHash) {
|
|
1143
|
+
throw new ApiError("plugin.switch_stale", "The uninstall preview changed; review it and confirm again");
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
}
|
|
1147
|
+
// An org's own uninstall never takes the platform default theme away from it (themes spec §7;
|
|
1148
|
+
// a scope sync uninstall follows a scope change or disable that was guarded already)
|
|
1149
|
+
if (via !== "scope")
|
|
1150
|
+
await this.assertKeepsPlatformDefault(orgId, installId);
|
|
912
1151
|
const outcome = await this.uninstallIn(orgId, actor, installId, {
|
|
913
1152
|
report,
|
|
914
1153
|
removing: new Set(),
|
|
915
1154
|
authorize: true,
|
|
916
|
-
opts,
|
|
1155
|
+
opts: actorOpts,
|
|
1156
|
+
...(via !== undefined && { via }),
|
|
917
1157
|
});
|
|
918
1158
|
if (outcome === "missing")
|
|
919
1159
|
throw installNotFound();
|
|
920
1160
|
if (outcome === "kept") {
|
|
921
1161
|
report.kept.push({ kind: "plugin", ref: installId, reason: "used_by_other_install" });
|
|
922
1162
|
}
|
|
1163
|
+
if (itemId !== undefined && outcome === "removed") {
|
|
1164
|
+
await upsertOrgSwitch(this.db, orgId, itemId, false, actor);
|
|
1165
|
+
}
|
|
923
1166
|
afterCommit(async () => {
|
|
924
1167
|
for (const r of report.removed) {
|
|
925
1168
|
if (r.kind === "extension")
|
|
@@ -928,6 +1171,24 @@ let PluginInstaller = class PluginInstaller {
|
|
|
928
1171
|
});
|
|
929
1172
|
return report;
|
|
930
1173
|
}
|
|
1174
|
+
/**
|
|
1175
|
+
* 409 `theme.platform_default` when uninstalling `installId` would switch the platform default
|
|
1176
|
+
* theme off in the org (one of the plugin's `follow` themes on there through it, themes spec §7),
|
|
1177
|
+
* in the caller's transaction before anything is written. A missing install passes (the
|
|
1178
|
+
* uninstall reports it).
|
|
1179
|
+
*/
|
|
1180
|
+
async assertKeepsPlatformDefault(orgId, installId) {
|
|
1181
|
+
const found = await this.db
|
|
1182
|
+
.selectFrom("plugin_installs")
|
|
1183
|
+
.select("id")
|
|
1184
|
+
.where("id", "=", installId)
|
|
1185
|
+
.where("org_id", "=", orgId)
|
|
1186
|
+
.executeTakeFirst();
|
|
1187
|
+
if (!found)
|
|
1188
|
+
return;
|
|
1189
|
+
const p = await this.previewUninstall(orgId, installId);
|
|
1190
|
+
await assertNotPlatformDefault(this.db, (p.themes ?? []).map((t) => t.id), () => "narrower");
|
|
1191
|
+
}
|
|
931
1192
|
/**
|
|
932
1193
|
* The oldest other live install (not in `removing`) that has component `kind` / `ref`, or
|
|
933
1194
|
* undefined.
|
|
@@ -1007,6 +1268,11 @@ let PluginInstaller = class PluginInstaller {
|
|
|
1007
1268
|
.executeTakeFirst();
|
|
1008
1269
|
if (!row)
|
|
1009
1270
|
return "missing";
|
|
1271
|
+
// A dependency its own scope still wants on in the org stays as a standalone install (the
|
|
1272
|
+
// dependent's component row goes with the dependent's install row)
|
|
1273
|
+
if (ctx.from !== undefined && (await wantedByScope(t, orgId, row.item_id))) {
|
|
1274
|
+
return "wanted_by_scope";
|
|
1275
|
+
}
|
|
1010
1276
|
// Another install outside this uninstall depends on it: kept (a dependency uninstall hands
|
|
1011
1277
|
// ownership over)
|
|
1012
1278
|
const user = await this.heir(orgId, new Set([...removing, installId]), "plugin", installId);
|
|
@@ -1072,6 +1338,10 @@ let PluginInstaller = class PluginInstaller {
|
|
|
1072
1338
|
created = now.created;
|
|
1073
1339
|
}
|
|
1074
1340
|
const comp = { kind: c.kind, ref: c.ref, created, skillVersion: c.skill_version };
|
|
1341
|
+
// Skills and agent templates of earlier installs (org copies, now linked to the platform
|
|
1342
|
+
// components, phase 2) stay: the plugin's components go off in the org with the install
|
|
1343
|
+
if ((c.kind === "skill" || c.kind === "agent_template") && !rollbackMode)
|
|
1344
|
+
continue;
|
|
1075
1345
|
if (!created) {
|
|
1076
1346
|
// Rollback cleanup: a version this install added to an existing skill is reverted; other
|
|
1077
1347
|
// pre-existing components are kept
|
|
@@ -1091,6 +1361,14 @@ let PluginInstaller = class PluginInstaller {
|
|
|
1091
1361
|
addRemoved({ kind: "plugin", ref: c.ref });
|
|
1092
1362
|
else if (outcome === "kept")
|
|
1093
1363
|
keep("used_by_other_install");
|
|
1364
|
+
else if (outcome === "wanted_by_scope")
|
|
1365
|
+
keep("wanted_by_scope");
|
|
1366
|
+
continue;
|
|
1367
|
+
}
|
|
1368
|
+
// A scope sync uninstall leaves the connectors to the org (spec §5 rule 8): the component row
|
|
1369
|
+
// goes with the install row, so nothing removes them later
|
|
1370
|
+
if (c.kind === "connector" && ctx.via === "scope" && !rollbackMode) {
|
|
1371
|
+
keep("org_owned");
|
|
1094
1372
|
continue;
|
|
1095
1373
|
}
|
|
1096
1374
|
const reason = rollbackMode ? "plugin_install_cleanup" : (ctx.reason ?? "plugin_uninstall");
|
|
@@ -1115,6 +1393,8 @@ let PluginInstaller = class PluginInstaller {
|
|
|
1115
1393
|
removed: mine.removed,
|
|
1116
1394
|
kept: mine.kept,
|
|
1117
1395
|
...(ctx.from !== undefined && { dependencyOf: ctx.from }),
|
|
1396
|
+
...(ctx.via !== undefined && { via: ctx.via }),
|
|
1397
|
+
...ctx.opts.auditDetail,
|
|
1118
1398
|
},
|
|
1119
1399
|
});
|
|
1120
1400
|
return "removed";
|
|
@@ -1189,7 +1469,6 @@ let PluginInstaller = class PluginInstaller {
|
|
|
1189
1469
|
const rows = await q.orderBy("a.installed_at", "desc").orderBy("a.id").execute();
|
|
1190
1470
|
if (rows.length === 0)
|
|
1191
1471
|
return [];
|
|
1192
|
-
const info = await upgradeInfo(this.db, this.registry, rows.map((r) => ({ itemId: r.item_id, name: r.name, version: r.version })));
|
|
1193
1472
|
const comps = await this.db
|
|
1194
1473
|
.selectFrom("plugin_install_components")
|
|
1195
1474
|
.select(["install_id", "kind", "ref", "created", "skill_version", "dropped"])
|
|
@@ -1213,8 +1492,8 @@ let PluginInstaller = class PluginInstaller {
|
|
|
1213
1492
|
skillVersion: c.skill_version,
|
|
1214
1493
|
dropped: c.dropped,
|
|
1215
1494
|
})),
|
|
1216
|
-
upgradeAvailable:
|
|
1217
|
-
deploymentPending:
|
|
1495
|
+
upgradeAvailable: null,
|
|
1496
|
+
deploymentPending: false,
|
|
1218
1497
|
}));
|
|
1219
1498
|
}
|
|
1220
1499
|
/**
|
|
@@ -1276,6 +1555,288 @@ let PluginInstaller = class PluginInstaller {
|
|
|
1276
1555
|
}
|
|
1277
1556
|
return removed;
|
|
1278
1557
|
}
|
|
1558
|
+
/**
|
|
1559
|
+
* Installs the dependencies an installed plugin's version declares and the org lacks (rule 9),
|
|
1560
|
+
* as the kernel (actor null): a platform update can add one. Each is recorded on the install
|
|
1561
|
+
* as a `plugin` component (created when this installed it, so an uninstall takes it along). One
|
|
1562
|
+
* that needs the org's input (connector templates) is left out and its name returned. A
|
|
1563
|
+
* dependency already installed in the org is recorded as it is (created false).
|
|
1564
|
+
*/
|
|
1565
|
+
async addMissingDependencies(orgId, installId) {
|
|
1566
|
+
const row = await this.db
|
|
1567
|
+
.selectFrom("plugin_installs as a")
|
|
1568
|
+
.innerJoin("catalog_item_versions as v", (j) => j.onRef("v.item_id", "=", "a.item_id").onRef("v.version", "=", "a.version"))
|
|
1569
|
+
.select(["a.item_id", "a.status", "v.manifest"])
|
|
1570
|
+
.where("a.id", "=", installId)
|
|
1571
|
+
.where("a.org_id", "=", orgId)
|
|
1572
|
+
.executeTakeFirst();
|
|
1573
|
+
if (row?.status !== "installed")
|
|
1574
|
+
return [];
|
|
1575
|
+
const record = async (c) => {
|
|
1576
|
+
await this.db
|
|
1577
|
+
.insertInto("plugin_install_components")
|
|
1578
|
+
.values({
|
|
1579
|
+
install_id: installId,
|
|
1580
|
+
kind: c.kind,
|
|
1581
|
+
ref: c.ref,
|
|
1582
|
+
created: c.created,
|
|
1583
|
+
skill_version: null,
|
|
1584
|
+
})
|
|
1585
|
+
.onConflict((oc) => oc.columns(["install_id", "kind", "ref"]).doNothing())
|
|
1586
|
+
.execute();
|
|
1587
|
+
};
|
|
1588
|
+
const needsInput = [];
|
|
1589
|
+
for (const dep of await resolveDependencies(this.db, row.manifest)) {
|
|
1590
|
+
if ((await this.recordDependency(orgId, dep, record)) !== undefined)
|
|
1591
|
+
continue;
|
|
1592
|
+
let plan;
|
|
1593
|
+
try {
|
|
1594
|
+
plan = await this.plan(orgId, null, dep.itemId, dep.version, {}, "", row.item_id);
|
|
1595
|
+
}
|
|
1596
|
+
catch (e) {
|
|
1597
|
+
if (e instanceof NeedsOrgInput) {
|
|
1598
|
+
needsInput.push(dep.name);
|
|
1599
|
+
continue;
|
|
1600
|
+
}
|
|
1601
|
+
throw e;
|
|
1602
|
+
}
|
|
1603
|
+
const child = await this.execute(orgId, null, plan, {}, {
|
|
1604
|
+
actions: requiredActions(plan.manifest),
|
|
1605
|
+
approvedBy: row.item_id,
|
|
1606
|
+
parent: installId,
|
|
1607
|
+
via: "scope",
|
|
1608
|
+
});
|
|
1609
|
+
await this.recordDependency(orgId, dep, record, child);
|
|
1610
|
+
}
|
|
1611
|
+
return needsInput;
|
|
1612
|
+
}
|
|
1613
|
+
/**
|
|
1614
|
+
* The connector templates of an installed plugin that are on in the org (ruling P2-6) and have
|
|
1615
|
+
* no live connector there: made from the platform template (`platform_template_id`) or recorded
|
|
1616
|
+
* on the install (`template_id`). The org's plugin is `needs_config` while any is missing (ruling
|
|
1617
|
+
* P2-10). Empty for a plugin not installed.
|
|
1618
|
+
*/
|
|
1619
|
+
async missingConnectors(orgId, itemId) {
|
|
1620
|
+
const a = await this.db
|
|
1621
|
+
.selectFrom("plugin_installs as a")
|
|
1622
|
+
.innerJoin("catalog_item_versions as v", (j) => j.onRef("v.item_id", "=", "a.item_id").onRef("v.version", "=", "a.version"))
|
|
1623
|
+
.select(["a.id", "a.version", "v.manifest", "v.object_prefix", "v.files"])
|
|
1624
|
+
.where("a.org_id", "=", orgId)
|
|
1625
|
+
.where("a.item_id", "=", itemId)
|
|
1626
|
+
.where("a.status", "=", "installed")
|
|
1627
|
+
.executeTakeFirst();
|
|
1628
|
+
if (!a)
|
|
1629
|
+
return undefined;
|
|
1630
|
+
if ((a.manifest.connectorTemplates ?? []).length === 0) {
|
|
1631
|
+
return { installId: a.id, version: a.version, templates: [] };
|
|
1632
|
+
}
|
|
1633
|
+
const all = await readCatalogTemplates(this.storage, a);
|
|
1634
|
+
const on = await connectorTemplatesOn(this.db, orgId, itemId, all.map((t) => t.id));
|
|
1635
|
+
const made = new Set((await this.db
|
|
1636
|
+
.selectFrom("connectors as c")
|
|
1637
|
+
.innerJoin("platform_connector_templates as p", "p.id", "c.platform_template_id")
|
|
1638
|
+
.select("p.template_id")
|
|
1639
|
+
.where("c.org_id", "=", orgId)
|
|
1640
|
+
.where("c.deleted_at", "is", null)
|
|
1641
|
+
.where("p.catalog_item_id", "=", itemId)
|
|
1642
|
+
.execute()).map((r) => r.template_id));
|
|
1643
|
+
const recorded = await this.db
|
|
1644
|
+
.selectFrom("plugin_install_components as l")
|
|
1645
|
+
.innerJoin("connectors as c", (j) => j.on(sql `c.id::text`, "=", sql `l.ref`))
|
|
1646
|
+
.select("l.template_id")
|
|
1647
|
+
.where("l.install_id", "=", a.id)
|
|
1648
|
+
.where("l.kind", "=", "connector")
|
|
1649
|
+
.where("c.deleted_at", "is", null)
|
|
1650
|
+
.execute();
|
|
1651
|
+
for (const r of recorded)
|
|
1652
|
+
if (r.template_id !== null)
|
|
1653
|
+
made.add(r.template_id);
|
|
1654
|
+
return {
|
|
1655
|
+
installId: a.id,
|
|
1656
|
+
version: a.version,
|
|
1657
|
+
templates: all.filter((t) => on.has(t.id) && !made.has(t.id)),
|
|
1658
|
+
};
|
|
1659
|
+
}
|
|
1660
|
+
/**
|
|
1661
|
+
* Creates the connectors an installed plugin is missing (ruling P2-10, `POST …/catalog/:itemId/
|
|
1662
|
+
* connectors`): `input.connectors` names some of {@link missingConnectors}' templates with the
|
|
1663
|
+
* same input as an install (endpoint, credential or OAuth client); each is created as at install
|
|
1664
|
+
* and recorded on the install. Returns the created connectors by template.
|
|
1665
|
+
*/
|
|
1666
|
+
async configureConnectors(orgId, actor, itemId, input, opts = {}) {
|
|
1667
|
+
if (!UUID_RE.test(itemId))
|
|
1668
|
+
throw installNotFound();
|
|
1669
|
+
const missing = await this.missingConnectors(orgId, itemId);
|
|
1670
|
+
if (!missing)
|
|
1671
|
+
throw installNotFound();
|
|
1672
|
+
const keys = Object.keys(input.connectors ?? {});
|
|
1673
|
+
if (keys.length === 0) {
|
|
1674
|
+
throw new ApiError("validation_failed", "Request validation failed", [
|
|
1675
|
+
{ path: "connectors", message: "Give the input of at least one missing connector" },
|
|
1676
|
+
]);
|
|
1677
|
+
}
|
|
1678
|
+
for (const k of keys) {
|
|
1679
|
+
if (!missing.templates.some((t) => t.id === k)) {
|
|
1680
|
+
throw new ApiError("validation_failed", "Request validation failed", [
|
|
1681
|
+
{
|
|
1682
|
+
path: `connectors.${k}`,
|
|
1683
|
+
message: "No connector of this template is missing in this organization",
|
|
1684
|
+
},
|
|
1685
|
+
]);
|
|
1686
|
+
}
|
|
1687
|
+
}
|
|
1688
|
+
const item = await this.db
|
|
1689
|
+
.selectFrom("catalog_items")
|
|
1690
|
+
.select("name")
|
|
1691
|
+
.where("id", "=", itemId)
|
|
1692
|
+
.executeTakeFirstOrThrow();
|
|
1693
|
+
const plans = missing.templates
|
|
1694
|
+
.filter((t) => keys.includes(t.id))
|
|
1695
|
+
.map((t) => ({
|
|
1696
|
+
id: t.id,
|
|
1697
|
+
ci: this.planConnector(actor, { itemId, version: missing.version, name: item.name }, t, input, "", undefined),
|
|
1698
|
+
}));
|
|
1699
|
+
const out = [];
|
|
1700
|
+
for (const p of plans) {
|
|
1701
|
+
const r = await this.connectors.create(orgId, actor, p.ci, opts.actorTokenId);
|
|
1702
|
+
await this.recordConnector(missing.installId, r.connector.id, p.id);
|
|
1703
|
+
out.push({ templateId: p.id, connectorId: r.connector.id });
|
|
1704
|
+
}
|
|
1705
|
+
return out;
|
|
1706
|
+
}
|
|
1707
|
+
/** A configured connector's ledger row (its own transaction). */
|
|
1708
|
+
async recordConnector(installId, ref, templateId) {
|
|
1709
|
+
await this.db
|
|
1710
|
+
.insertInto("plugin_install_components")
|
|
1711
|
+
.values({
|
|
1712
|
+
install_id: installId,
|
|
1713
|
+
kind: "connector",
|
|
1714
|
+
ref,
|
|
1715
|
+
created: true,
|
|
1716
|
+
skill_version: null,
|
|
1717
|
+
template_id: templateId,
|
|
1718
|
+
})
|
|
1719
|
+
.onConflict((oc) => oc.columns(["install_id", "kind", "ref"]).doNothing())
|
|
1720
|
+
.execute();
|
|
1721
|
+
}
|
|
1722
|
+
/**
|
|
1723
|
+
* One more connector from a platform connector template on in the org (rulings P4-7, P4-T6-8;
|
|
1724
|
+
* `POST …/connector-templates/:templateId/connectors`): `templateId` is the platform connector
|
|
1725
|
+
* template's id; `config` is an install's connector input (endpoint, credential or OAuth client,
|
|
1726
|
+
* slug) and `name` its name. Without a slug the name and slug default to the first free ones,
|
|
1727
|
+
* chosen by the create under the org lock after its outbound calls
|
|
1728
|
+
* (`CreateConnectorInput.slugDefault`); only a given slug answers 409 `connector.slug_taken`. Created as at install ({@link planConnector}, then
|
|
1729
|
+
* `ConnectorsService.create`, which checks the slug before any outbound call and re-checks it,
|
|
1730
|
+
* `connectors.manage`, the item and the template being on under the org lock), linked to the
|
|
1731
|
+
* template, and recorded on the plugin's live install in the org when there is one. A template
|
|
1732
|
+
* that is missing, deleted or not offered to the org -> 404 `component.not_found`; offered but
|
|
1733
|
+
* off there (its plugin not installed, or switched off) -> 409 `component.off`; input errors ->
|
|
1734
|
+
* 400 `validation_failed` at `config.<field>`.
|
|
1735
|
+
*/
|
|
1736
|
+
async addTemplateConnector(orgId, actor, templateId, input, opts = {}) {
|
|
1737
|
+
const notFound = () => new ApiError("component.not_found", "The connector template does not exist or is not available in this organization");
|
|
1738
|
+
if (!UUID_RE.test(templateId))
|
|
1739
|
+
throw notFound();
|
|
1740
|
+
// read here to fail early, and again under the org lock by the create (`mustBeOn`)
|
|
1741
|
+
const state = await connectorTemplateState(this.db, orgId, templateId);
|
|
1742
|
+
if (state === "absent")
|
|
1743
|
+
throw notFound();
|
|
1744
|
+
if (state === "off") {
|
|
1745
|
+
throw new ApiError("component.off", "This connector template is off in this organization; switch it (or its plugin) on first");
|
|
1746
|
+
}
|
|
1747
|
+
const row = await this.db
|
|
1748
|
+
.selectFrom("platform_connector_templates as t")
|
|
1749
|
+
.innerJoin("catalog_items as i", "i.id", "t.catalog_item_id")
|
|
1750
|
+
.leftJoin("plugin_installs as a", (j) => j
|
|
1751
|
+
.onRef("a.item_id", "=", "t.catalog_item_id")
|
|
1752
|
+
.on("a.org_id", "=", orgId)
|
|
1753
|
+
.on("a.status", "=", "installed"))
|
|
1754
|
+
.select([
|
|
1755
|
+
"t.template_id",
|
|
1756
|
+
"t.catalog_item_id",
|
|
1757
|
+
"t.file",
|
|
1758
|
+
"i.name",
|
|
1759
|
+
"i.latest_version",
|
|
1760
|
+
"a.version",
|
|
1761
|
+
])
|
|
1762
|
+
.where("t.id", "=", templateId)
|
|
1763
|
+
.executeTakeFirstOrThrow();
|
|
1764
|
+
const ct = { id: row.template_id, file: row.file };
|
|
1765
|
+
const at = `connectors.${ct.id}`;
|
|
1766
|
+
// the paths of an install's input and of the create, under `config` here (`name` stays)
|
|
1767
|
+
const rebase = (e) => {
|
|
1768
|
+
if (!(e instanceof ApiError) || e.code !== "validation_failed" || !e.details)
|
|
1769
|
+
return e;
|
|
1770
|
+
return new ApiError(e.code, e.message, e.details.map((d) => {
|
|
1771
|
+
const path = d.path;
|
|
1772
|
+
if (typeof path !== "string")
|
|
1773
|
+
return d;
|
|
1774
|
+
const rest = path === at || path.startsWith(`${at}.`) ? path.slice(at.length + 1) : path;
|
|
1775
|
+
if (!/^(slug|credential|endpoint|client)(\.|$)/.test(rest)) {
|
|
1776
|
+
return rest === path ? d : { ...d, path: rest };
|
|
1777
|
+
}
|
|
1778
|
+
return { ...d, path: `config.${rest}` };
|
|
1779
|
+
}));
|
|
1780
|
+
};
|
|
1781
|
+
const display = ct.file.displayName?.en ?? ct.id;
|
|
1782
|
+
// a slug given by the caller is theirs (409 when taken); otherwise the create picks the first
|
|
1783
|
+
// free default under the org lock, after its outbound calls (no retry repeats them)
|
|
1784
|
+
const defaulted = input.config.slug === undefined;
|
|
1785
|
+
let ci;
|
|
1786
|
+
try {
|
|
1787
|
+
ci = this.planConnector(actor, { itemId: row.catalog_item_id, version: row.version ?? row.latest_version, name: row.name }, ct, {
|
|
1788
|
+
connectors: {
|
|
1789
|
+
[ct.id]: { ...input.config, ...(input.name !== undefined && { name: input.name }) },
|
|
1790
|
+
},
|
|
1791
|
+
}, "", undefined);
|
|
1792
|
+
}
|
|
1793
|
+
catch (e) {
|
|
1794
|
+
throw rebase(e);
|
|
1795
|
+
}
|
|
1796
|
+
ci = {
|
|
1797
|
+
...ci,
|
|
1798
|
+
template: ci.template && { ...ci.template, mustBeOn: true },
|
|
1799
|
+
...(defaulted && {
|
|
1800
|
+
slugDefault: { display, ...(input.name !== undefined && { name: input.name }) },
|
|
1801
|
+
}),
|
|
1802
|
+
};
|
|
1803
|
+
try {
|
|
1804
|
+
const r = await this.connectors.create(orgId, actor, ci, opts.actorTokenId);
|
|
1805
|
+
await this.recordOnLiveInstall(orgId, row.catalog_item_id, r.connector.id, ct.id);
|
|
1806
|
+
return r;
|
|
1807
|
+
}
|
|
1808
|
+
catch (e) {
|
|
1809
|
+
throw rebase(e);
|
|
1810
|
+
}
|
|
1811
|
+
}
|
|
1812
|
+
/**
|
|
1813
|
+
* Records a connector made from a plugin's template on the org's live install of that plugin,
|
|
1814
|
+
* when there is one, under the org lock (so an uninstall in between is seen).
|
|
1815
|
+
*/
|
|
1816
|
+
async recordOnLiveInstall(orgId, itemId, connectorId, templateId) {
|
|
1817
|
+
await this.orgLock.lock(orgId);
|
|
1818
|
+
const install = await this.db
|
|
1819
|
+
.selectFrom("plugin_installs")
|
|
1820
|
+
.select("id")
|
|
1821
|
+
.where("org_id", "=", orgId)
|
|
1822
|
+
.where("item_id", "=", itemId)
|
|
1823
|
+
.where("status", "=", "installed")
|
|
1824
|
+
.executeTakeFirst();
|
|
1825
|
+
if (!install)
|
|
1826
|
+
return;
|
|
1827
|
+
await this.db
|
|
1828
|
+
.insertInto("plugin_install_components")
|
|
1829
|
+
.values({
|
|
1830
|
+
install_id: install.id,
|
|
1831
|
+
kind: "connector",
|
|
1832
|
+
ref: connectorId,
|
|
1833
|
+
created: true,
|
|
1834
|
+
skill_version: null,
|
|
1835
|
+
template_id: templateId,
|
|
1836
|
+
})
|
|
1837
|
+
.onConflict((oc) => oc.columns(["install_id", "kind", "ref"]).doNothing())
|
|
1838
|
+
.execute();
|
|
1839
|
+
}
|
|
1279
1840
|
/** The connector kinds an extension provides (the `connector@1` implementations loaded on this replica). */
|
|
1280
1841
|
connectorKindsOf(plugin) {
|
|
1281
1842
|
return this.registry
|
|
@@ -1285,36 +1846,142 @@ let PluginInstaller = class PluginInstaller {
|
|
|
1285
1846
|
.filter((k) => typeof k === "string");
|
|
1286
1847
|
}
|
|
1287
1848
|
/**
|
|
1288
|
-
* The
|
|
1289
|
-
*
|
|
1849
|
+
* The uninstall preview of an install (see {@link UninstallPreview}); the real uninstall may keep
|
|
1850
|
+
* more (another install using a component, a connector still using an extension). The plugin's
|
|
1851
|
+
* skills and agent templates are platform components (phase 2): the ones on in the org through
|
|
1852
|
+
* the plugin (`follow`) go off with it, so the agents using them (by the platform id or an
|
|
1853
|
+
* unpinned org copy linked to it) are listed, also for the dependency installs it created that
|
|
1854
|
+
* go with it; ledger rows of earlier installs' org copies are not removed and not listed (an
|
|
1855
|
+
* uninstall keeps legacy copies, like the platform update keeps copies of removed components).
|
|
1290
1856
|
*/
|
|
1291
|
-
async
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1857
|
+
async previewUninstall(orgId, installId) {
|
|
1858
|
+
if (!UUID_RE.test(installId))
|
|
1859
|
+
throw installNotFound();
|
|
1860
|
+
const t = this.db;
|
|
1861
|
+
const row = await t
|
|
1862
|
+
.selectFrom("plugin_installs as a")
|
|
1863
|
+
.innerJoin("catalog_items as i", "i.id", "a.item_id")
|
|
1864
|
+
.select(["a.id", "a.item_id", "a.version", "i.name"])
|
|
1865
|
+
.where("a.id", "=", installId)
|
|
1296
1866
|
.where("a.org_id", "=", orgId)
|
|
1297
|
-
.
|
|
1867
|
+
.executeTakeFirst();
|
|
1868
|
+
if (!row)
|
|
1869
|
+
throw installNotFound();
|
|
1870
|
+
const ledger = (id) => t
|
|
1871
|
+
.selectFrom("plugin_install_components")
|
|
1872
|
+
.select(["kind", "ref", "created"])
|
|
1873
|
+
.where("install_id", "=", id)
|
|
1874
|
+
.orderBy("kind")
|
|
1875
|
+
.orderBy("ref")
|
|
1298
1876
|
.execute();
|
|
1299
|
-
const
|
|
1300
|
-
const
|
|
1301
|
-
const
|
|
1302
|
-
|
|
1303
|
-
const
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1877
|
+
const comps = (await ledger(installId)).filter((c) => c.kind !== "skill" && c.kind !== "agent_template");
|
|
1878
|
+
const agents = await agentDefinitionRefs(t, orgId);
|
|
1879
|
+
const used = new Map();
|
|
1880
|
+
const use = (a, kind, ref) => {
|
|
1881
|
+
const e = used.get(a.id) ?? { id: a.id, name: a.name, uses: [] };
|
|
1882
|
+
if (!e.uses.some((u) => u.kind === kind && u.ref === ref))
|
|
1883
|
+
e.uses.push({ kind, ref });
|
|
1884
|
+
used.set(a.id, e);
|
|
1885
|
+
};
|
|
1886
|
+
const kept = [];
|
|
1887
|
+
/**
|
|
1888
|
+
* The agents using what goes with an install: connectors it created (they stay, kept for the
|
|
1889
|
+
* agents) and the plugin's platform skills and agent templates on in the org through it
|
|
1890
|
+
* (`follow`; by the platform id or an unpinned org copy linked to it). Dependency installs it
|
|
1891
|
+
* created go with it unless their own scope wants them (Task 7: their components count too).
|
|
1892
|
+
*/
|
|
1893
|
+
const visit = async (itemId, rows, top, seen) => {
|
|
1894
|
+
for (const c of rows) {
|
|
1895
|
+
if (!c.created) {
|
|
1896
|
+
if (top)
|
|
1897
|
+
kept.push({ kind: c.kind, ref: c.ref, reason: "pre_existing" });
|
|
1898
|
+
continue;
|
|
1899
|
+
}
|
|
1900
|
+
if (c.kind === "plugin") {
|
|
1901
|
+
const dep = await t
|
|
1902
|
+
.selectFrom("plugin_installs")
|
|
1903
|
+
.select("item_id")
|
|
1904
|
+
.where("id", "=", c.ref)
|
|
1905
|
+
.where("org_id", "=", orgId)
|
|
1906
|
+
.executeTakeFirst();
|
|
1907
|
+
if (!dep)
|
|
1908
|
+
continue;
|
|
1909
|
+
if (await wantedByScope(t, orgId, dep.item_id)) {
|
|
1910
|
+
if (top)
|
|
1911
|
+
kept.push({ kind: c.kind, ref: c.ref, reason: "wanted_by_scope" });
|
|
1912
|
+
continue;
|
|
1913
|
+
}
|
|
1914
|
+
if (seen.has(c.ref))
|
|
1915
|
+
continue;
|
|
1916
|
+
seen.add(c.ref);
|
|
1917
|
+
const sub = (await ledger(c.ref)).filter((x) => x.kind !== "skill" && x.kind !== "agent_template");
|
|
1918
|
+
await visit(dep.item_id, sub, false, seen);
|
|
1919
|
+
continue;
|
|
1920
|
+
}
|
|
1921
|
+
if (c.kind !== "connector")
|
|
1922
|
+
continue;
|
|
1923
|
+
const users = agents.filter((a) => a.connectors.has(c.ref));
|
|
1924
|
+
if (users.length === 0)
|
|
1925
|
+
continue;
|
|
1926
|
+
if (top)
|
|
1927
|
+
kept.push({ kind: c.kind, ref: c.ref, reason: "used_by_agents" });
|
|
1928
|
+
for (const a of users)
|
|
1929
|
+
use(a, c.kind, c.ref);
|
|
1930
|
+
}
|
|
1931
|
+
for (const kind of ["skill", "agent_template"]) {
|
|
1932
|
+
const platform = await loadComponents(t, kind, { itemId });
|
|
1933
|
+
const st = await loadScopeState(t, kind, platform);
|
|
1934
|
+
const off = platform.filter((c) => c.scopeMode === "follow" &&
|
|
1935
|
+
componentOn(c, pluginFactsOf(st, c.itemId, orgId), listedIn(st, c.id, orgId), switchOf(st, c.id, orgId)));
|
|
1936
|
+
const refs = await referenceIds(t, orgId, kind, off.map((c) => c.id));
|
|
1937
|
+
for (const a of agents) {
|
|
1938
|
+
for (const ref of kind === "skill" ? a.skills : a.templates) {
|
|
1939
|
+
if (refs.has(ref))
|
|
1940
|
+
use(a, kind, ref);
|
|
1941
|
+
}
|
|
1942
|
+
}
|
|
1943
|
+
}
|
|
1944
|
+
const themes = await loadComponents(t, "theme", { itemId });
|
|
1945
|
+
const tst = await loadScopeState(t, "theme", themes);
|
|
1946
|
+
for (const c of themes) {
|
|
1947
|
+
if (c.scopeMode === "follow" &&
|
|
1948
|
+
componentOn(c, pluginFactsOf(tst, c.itemId, orgId), listedIn(tst, c.id, orgId), switchOf(tst, c.id, orgId))) {
|
|
1949
|
+
lostThemes.set(c.id, new Set([orgId]));
|
|
1308
1950
|
}
|
|
1309
1951
|
}
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1952
|
+
};
|
|
1953
|
+
/** The themes that go off in the org with the install (and the dependencies it removes). */
|
|
1954
|
+
const lostThemes = new Map();
|
|
1955
|
+
await visit(row.item_id, comps, true, new Set([installId]));
|
|
1956
|
+
const themes = await themesPreview(t, lostThemes);
|
|
1957
|
+
return {
|
|
1958
|
+
installId,
|
|
1959
|
+
name: row.name,
|
|
1960
|
+
version: row.version,
|
|
1961
|
+
components: comps.map((c) => ({ kind: c.kind, ref: c.ref, created: c.created })),
|
|
1962
|
+
kept,
|
|
1963
|
+
agents: [...used.values()]
|
|
1964
|
+
.map((a) => ({ ...a, uses: a.uses.sort((x, y) => x.ref.localeCompare(y.ref)) }))
|
|
1965
|
+
.sort((x, y) => x.id.localeCompare(y.id)),
|
|
1966
|
+
...(themes !== undefined && { themes }),
|
|
1967
|
+
};
|
|
1968
|
+
}
|
|
1969
|
+
/**
|
|
1970
|
+
* The connectors, skills (selected, pinned, or in an inline sub-agent template) and agent
|
|
1971
|
+
* templates (`subagents.templates`) referenced by the current definitions of the org's live
|
|
1972
|
+
* agents.
|
|
1973
|
+
*/
|
|
1974
|
+
async agentRefs(orgId) {
|
|
1975
|
+
const out = { connectors: new Set(), skills: new Set(), templates: new Set() };
|
|
1976
|
+
for (const a of await agentDefinitionRefs(this.db, orgId)) {
|
|
1977
|
+
for (const x of a.connectors)
|
|
1978
|
+
out.connectors.add(x);
|
|
1979
|
+
for (const x of a.skills)
|
|
1980
|
+
out.skills.add(x);
|
|
1981
|
+
for (const x of a.templates)
|
|
1982
|
+
out.templates.add(x);
|
|
1983
|
+
}
|
|
1984
|
+
return out;
|
|
1318
1985
|
}
|
|
1319
1986
|
};
|
|
1320
1987
|
__decorate([
|
|
@@ -1326,9 +1993,6 @@ __decorate([
|
|
|
1326
1993
|
__decorate([
|
|
1327
1994
|
Transactional({ propagation: "requires_new" })
|
|
1328
1995
|
], PluginInstaller.prototype, "createInstallRow", null);
|
|
1329
|
-
__decorate([
|
|
1330
|
-
Transactional({ propagation: "requires_new" })
|
|
1331
|
-
], PluginInstaller.prototype, "installAgentTemplate", null);
|
|
1332
1996
|
__decorate([
|
|
1333
1997
|
Transactional({ propagation: "requires_new" })
|
|
1334
1998
|
], PluginInstaller.prototype, "markInstalled", null);
|
|
@@ -1359,6 +2023,12 @@ __decorate([
|
|
|
1359
2023
|
__decorate([
|
|
1360
2024
|
Transactional({ propagation: "mandatory" })
|
|
1361
2025
|
], PluginInstaller.prototype, "undoUpgradeIn", null);
|
|
2026
|
+
__decorate([
|
|
2027
|
+
Transactional({ propagation: "requires_new" })
|
|
2028
|
+
], PluginInstaller.prototype, "recordConnector", null);
|
|
2029
|
+
__decorate([
|
|
2030
|
+
Transactional()
|
|
2031
|
+
], PluginInstaller.prototype, "recordOnLiveInstall", null);
|
|
1362
2032
|
PluginInstaller = __decorate([
|
|
1363
2033
|
Injectable(),
|
|
1364
2034
|
__param(0, Inject(KernelDb)),
|
|
@@ -1367,11 +2037,10 @@ PluginInstaller = __decorate([
|
|
|
1367
2037
|
__param(3, Inject(ExtensionRegistry)),
|
|
1368
2038
|
__param(4, Inject(SkillsService)),
|
|
1369
2039
|
__param(5, Inject(OrgExtensionConfigs)),
|
|
1370
|
-
__param(6, Inject(
|
|
1371
|
-
__param(7, Inject(
|
|
1372
|
-
__param(8, Inject(
|
|
1373
|
-
__param(9, Inject(
|
|
1374
|
-
__param(10, Inject(TransactionHost))
|
|
2040
|
+
__param(6, Inject(KernelConfigService)),
|
|
2041
|
+
__param(7, Inject(ConnectorsService)),
|
|
2042
|
+
__param(8, Inject(KERNEL_LOGGER)),
|
|
2043
|
+
__param(9, Inject(TransactionHost))
|
|
1375
2044
|
], PluginInstaller);
|
|
1376
2045
|
export { PluginInstaller };
|
|
1377
2046
|
/**
|
|
@@ -1483,3 +2152,36 @@ function orderByRequires(set) {
|
|
|
1483
2152
|
}
|
|
1484
2153
|
return placed;
|
|
1485
2154
|
}
|
|
2155
|
+
/**
|
|
2156
|
+
* Whether org row `id` (a skill or an agent template of the org) is linked without a pin to a live
|
|
2157
|
+
* platform row the org promoted when sharing it (ruling P3-3): owned by the org and from no plugin
|
|
2158
|
+
* (`catalog_item_id` null). A component of the org's own uploaded plugin is a plugin's, so its
|
|
2159
|
+
* install copies are removed and reverted as any plugin's.
|
|
2160
|
+
*/
|
|
2161
|
+
async function promotedOrgRow(db, orgId, kind, id) {
|
|
2162
|
+
const row = kind === "skill"
|
|
2163
|
+
? await db
|
|
2164
|
+
.selectFrom("skills as s")
|
|
2165
|
+
.innerJoin("platform_skills as p", "p.id", "s.platform_skill_id")
|
|
2166
|
+
.select("s.id")
|
|
2167
|
+
.where("s.id", "=", id)
|
|
2168
|
+
.where("s.org_id", "=", orgId)
|
|
2169
|
+
.where("s.pinned_version", "is", null)
|
|
2170
|
+
.where("p.owner_org_id", "=", orgId)
|
|
2171
|
+
// promoted, not an org plugin's component (which has its plugin, P3-2)
|
|
2172
|
+
.where("p.catalog_item_id", "is", null)
|
|
2173
|
+
.where("p.deleted_at", "is", null)
|
|
2174
|
+
.executeTakeFirst()
|
|
2175
|
+
: await db
|
|
2176
|
+
.selectFrom("agent_templates as a")
|
|
2177
|
+
.innerJoin("platform_agent_templates as p", "p.id", "a.platform_template_id")
|
|
2178
|
+
.select("a.id")
|
|
2179
|
+
.where("a.id", "=", id)
|
|
2180
|
+
.where("a.org_id", "=", orgId)
|
|
2181
|
+
.where("a.pinned_version", "is", null)
|
|
2182
|
+
.where("p.owner_org_id", "=", orgId)
|
|
2183
|
+
.where("p.catalog_item_id", "is", null)
|
|
2184
|
+
.where("p.deleted_at", "is", null)
|
|
2185
|
+
.executeTakeFirst();
|
|
2186
|
+
return row !== undefined;
|
|
2187
|
+
}
|