@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
|
@@ -12,385 +12,432 @@ import { Inject, Injectable } from "@nestjs/common";
|
|
|
12
12
|
import { sql } from "kysely";
|
|
13
13
|
import { ApiError } from "../errors.js";
|
|
14
14
|
import { audit } from "../identity/audit.js";
|
|
15
|
-
import {
|
|
15
|
+
import { readOrgMarketplaceBrowse } from "../identity/settings.js";
|
|
16
|
+
import { SuperAdminLock } from "../identity/super-admin.js";
|
|
17
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
16
18
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
17
19
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
18
20
|
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
21
|
+
import { LockService } from "../infra/lock/lock.service.js";
|
|
22
|
+
import { WithLock } from "../infra/lock/with-lock.decorator.js";
|
|
19
23
|
import { OrgLock } from "../orgs/org-lock.js";
|
|
20
24
|
import { roleAtLeast } from "../orgs/roles.js";
|
|
25
|
+
import { CatalogService } from "./catalog.service.js";
|
|
26
|
+
import { CatalogScopeService } from "./catalog-scope.service.js";
|
|
27
|
+
import { assertEntryNotDeprecated, loadMarketplaceEntry } from "./marketplaces.service.js";
|
|
28
|
+
import { OrgCatalogService } from "./org-catalog.service.js";
|
|
29
|
+
import { PluginImport } from "./plugin-import.js";
|
|
30
|
+
import { itemsSeenBy } from "./scope-state.js";
|
|
21
31
|
/** 申请列表一次最多返回的条数。 */
|
|
22
32
|
export const CATALOG_REQUESTS_LIST_MAX = 200;
|
|
23
33
|
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
24
34
|
const requestNotFound = () => new ApiError("catalog.request_not_found", "Catalog request not found");
|
|
25
35
|
const itemNotFound = () => new ApiError("catalog.item_not_found", "Catalog item not found");
|
|
26
|
-
const itemDisabled = () => new ApiError("catalog.item_disabled", "This catalog item is disabled by the
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
.forShare()
|
|
36
|
-
.executeTakeFirst();
|
|
37
|
-
}
|
|
38
|
-
async function hasGrant(db, orgId, itemId) {
|
|
39
|
-
const g = await db
|
|
40
|
-
.selectFrom("catalog_org_grants")
|
|
41
|
-
.select("item_id")
|
|
42
|
-
.where("item_id", "=", itemId)
|
|
43
|
-
.where("org_id", "=", orgId)
|
|
44
|
-
.executeTakeFirst();
|
|
45
|
-
return g !== undefined;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Before an org creates a component from the catalog (enabling an extension, creating a connector
|
|
49
|
-
* from a template, importing a skill), re-checks the item policy in the caller's transaction (C22):
|
|
50
|
-
* deleted or disabled -> `catalog.item_disabled`; needs_approval without an enterprise admin grant
|
|
51
|
-
* for this org -> `catalog.approval_required`; allow or granted -> passes. A dependency's
|
|
52
|
-
* components pass `approvedBy`, the item the org is installing (spec §10: approval follows the
|
|
53
|
-
* installed plugin only): the dependency's own item must still be live and not disabled, and the
|
|
54
|
-
* approval is judged by `approvedBy`.
|
|
55
|
-
*/
|
|
56
|
-
export async function assertItemInstallable(t, orgId, itemId, approvedBy = itemId) {
|
|
57
|
-
if (approvedBy !== itemId) {
|
|
58
|
-
const own = await lockItem(t, itemId);
|
|
59
|
-
if (!own || own.deleted_at !== null || own.policy === "disabled")
|
|
60
|
-
throw itemDisabled();
|
|
61
|
-
}
|
|
62
|
-
const item = await lockItem(t, approvedBy);
|
|
63
|
-
if (!item || item.deleted_at !== null || item.policy === "disabled")
|
|
64
|
-
throw itemDisabled();
|
|
65
|
-
if (item.policy === "needs_approval" && !(await hasGrant(t, orgId, approvedBy))) {
|
|
66
|
-
throw new ApiError("catalog.approval_required", "This catalog item needs enterprise admin approval before this organization can install it");
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* The extensions among `plugins` whose own catalog item (the non-deleted item with the same name) is
|
|
71
|
-
* disabled (FOR SHARE: exclusive with policy changes). A disabled item is a master switch: no path
|
|
72
|
-
* (direct enabling, its item, another plugin) can newly enable its extension (Ruling M-5).
|
|
73
|
-
*/
|
|
74
|
-
export async function disabledPluginItems(db, plugins) {
|
|
75
|
-
if (plugins.length === 0)
|
|
76
|
-
return [];
|
|
77
|
-
const rows = await db
|
|
78
|
-
.selectFrom("catalog_items")
|
|
79
|
-
.select("name")
|
|
80
|
-
.where("name", "in", [...plugins])
|
|
81
|
-
.where("policy", "=", "disabled")
|
|
82
|
-
.where("deleted_at", "is", null)
|
|
83
|
-
.orderBy("name")
|
|
84
|
-
.forShare()
|
|
85
|
-
.execute();
|
|
86
|
-
return [...new Set(rows.map((r) => r.name))];
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Throws `catalog.item_disabled` when a plugin's own catalog item is disabled (the message names
|
|
90
|
-
* the plugin).
|
|
91
|
-
*/
|
|
92
|
-
export function pluginItemDisabled(names) {
|
|
93
|
-
return new ApiError("catalog.item_disabled", `The enterprise admin disabled the catalog item of extension ${names.join(", ")}; it cannot be newly enabled, not even through a plugin that bundles it`);
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* When an org enables an extension directly (not by installing from an item, e.g.
|
|
97
|
-
* `PUT /orgs/:orgId/extensions/:extension`), it is judged by every catalog item that brought it into the
|
|
98
|
-
* deployment (`extension_catalog_sources`), and **the strictest wins**: any source disabled ->
|
|
99
|
-
* `catalog.item_disabled`; otherwise any source needs_approval without a grant of that item to the
|
|
100
|
-
* org -> `catalog.approval_required`; all allow / granted -> passes. Deleted items no longer count
|
|
101
|
-
* as sources (an enterprise admin deleting an item withdraws its constraint). No source (not
|
|
102
|
-
* installed through the catalog) -> not bound by catalog policy.
|
|
103
|
-
*/
|
|
104
|
-
export async function assertPluginSourcesInstallable(t, orgId, plugin) {
|
|
105
|
-
const rows = await t
|
|
106
|
-
.selectFrom("extension_catalog_sources as s")
|
|
107
|
-
.innerJoin("catalog_items as i", "i.id", "s.item_id")
|
|
108
|
-
.select(["i.id", "i.policy"])
|
|
109
|
-
.where("s.plugin", "=", plugin)
|
|
110
|
-
.where("i.deleted_at", "is", null)
|
|
111
|
-
.orderBy("i.id")
|
|
112
|
-
.forShare("i")
|
|
113
|
-
.execute();
|
|
114
|
-
if (rows.some((r) => r.policy === "disabled"))
|
|
115
|
-
throw itemDisabled();
|
|
116
|
-
for (const r of rows) {
|
|
117
|
-
if (r.policy === "needs_approval" && !(await hasGrant(t, orgId, r.id))) {
|
|
118
|
-
throw new ApiError("catalog.approval_required", "A catalog item that brought this extension in needs enterprise admin approval before this organization can enable it");
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Cancels catalog requests still pending in the caller's transaction (`db` is its handle; when the
|
|
124
|
-
* item or the org is deleted), status `cancelled` (the decider is the actor). Each one audits
|
|
125
|
-
* `catalog.request_cancelled` (with the reason). Returns how many were cancelled.
|
|
126
|
-
*/
|
|
127
|
-
export async function cancelPendingRequests(db, where, actor, reason, opts = {}) {
|
|
128
|
-
let q = db
|
|
129
|
-
.updateTable("catalog_requests")
|
|
130
|
-
.set({ status: "cancelled", decided_by: actor, decided_at: sql `now()` })
|
|
131
|
-
.where("status", "=", "pending");
|
|
132
|
-
q =
|
|
133
|
-
"itemId" in where ? q.where("item_id", "=", where.itemId) : q.where("org_id", "=", where.orgId);
|
|
134
|
-
const rows = await q.returning(["id", "org_id", "item_id", "stage"]).execute();
|
|
135
|
-
for (const r of rows) {
|
|
136
|
-
await audit(db, {
|
|
137
|
-
actorAccountId: actor,
|
|
138
|
-
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
139
|
-
orgId: r.org_id,
|
|
140
|
-
action: "catalog.request_cancelled",
|
|
141
|
-
target: r.id,
|
|
142
|
-
detail: { itemId: r.item_id, stage: r.stage, reason },
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
return rows.length;
|
|
146
|
-
}
|
|
36
|
+
const itemDisabled = () => new ApiError("catalog.item_disabled", "This catalog item is disabled by the super admin and cannot be requested");
|
|
37
|
+
const alreadyDecided = () => new ApiError("catalog.request_decided", "This request has already been decided");
|
|
38
|
+
const pendingExists = () => new ApiError("catalog.request_pending", "This organization already has a pending request of this kind for it");
|
|
39
|
+
/** A unique violation (the partial index of pending requests). */
|
|
40
|
+
const isUniqueViolation = (e) => typeof e === "object" && e !== null && e.code === "23505";
|
|
41
|
+
/** The deployment-level kinds (decided by the super admin). */
|
|
42
|
+
const DEPLOYMENT_KINDS = ["access", "import"];
|
|
43
|
+
/** The org-level kinds (decided by the org admins). */
|
|
44
|
+
const ORG_KINDS = ["enable", "connector_setup"];
|
|
147
45
|
/**
|
|
148
|
-
* Catalog requests
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
* - an org admin
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
46
|
+
* Catalog requests under plugin scope (spec §5.1). Three kinds, one pending request per (org,
|
|
47
|
+
* kind, item or entry) (partial unique indexes; org-side writes run inside the org row lock):
|
|
48
|
+
* - `enable`: a member asks the org admins to switch on an item that is off in the org (an
|
|
49
|
+
* `optional` item); an org admin approving it switches the item on, as that admin;
|
|
50
|
+
* - `access`: an org admin asks the super admin for a `named` item shown to orgs outside its
|
|
51
|
+
* list; approving adds the org to the list (`CatalogScopeService.addOrg`), the scope sync then
|
|
52
|
+
* installs it;
|
|
53
|
+
* - `import`: an org admin asks for a marketplace entry not in the catalog (deployment setting
|
|
54
|
+
* `orgMarketplaceBrowse`); approving prepares the import and returns its staging, the request
|
|
55
|
+
* resolves when the super admin confirms it (scope default `named` = the requesting org);
|
|
56
|
+
* - `connector_setup` (ruling P4-7): one per agent (`agent_id`, `pending_keys`), asking the org
|
|
57
|
+
* admins to set up an agent's pending connectors; written by the agents module
|
|
58
|
+
* (`PendingConnectorRequests`), closed by binding (`approved`) or the agent's deletion
|
|
59
|
+
* (`cancelled`); here it is listed and rejected.
|
|
60
|
+
* A rejection stores an optional reason. Decided requests show in the requester's inbox until
|
|
61
|
+
* dismissed. No in-process state.
|
|
158
62
|
*/
|
|
159
63
|
let CatalogRequestsService = class CatalogRequestsService {
|
|
160
64
|
kdb;
|
|
161
65
|
orgLock;
|
|
162
66
|
adminLock;
|
|
67
|
+
orgCatalog;
|
|
68
|
+
scope;
|
|
69
|
+
catalog;
|
|
70
|
+
config;
|
|
71
|
+
pluginImport;
|
|
163
72
|
txHost;
|
|
73
|
+
lockService;
|
|
164
74
|
constructor(kdb,
|
|
165
|
-
/** The org row and
|
|
166
|
-
orgLock, adminLock, txHost
|
|
75
|
+
/** The org row and super admin locks: both join the caller's transaction. */
|
|
76
|
+
orgLock, adminLock, orgCatalog, scope, catalog, config, pluginImport, txHost,
|
|
77
|
+
/** Serializes the approvals of one `import` request (`@WithLock`). */
|
|
78
|
+
lockService) {
|
|
167
79
|
this.kdb = kdb;
|
|
168
80
|
this.orgLock = orgLock;
|
|
169
81
|
this.adminLock = adminLock;
|
|
82
|
+
this.orgCatalog = orgCatalog;
|
|
83
|
+
this.scope = scope;
|
|
84
|
+
this.catalog = catalog;
|
|
85
|
+
this.config = config;
|
|
86
|
+
this.pluginImport = pluginImport;
|
|
170
87
|
this.txHost = txHost;
|
|
88
|
+
this.lockService = lockService;
|
|
171
89
|
}
|
|
172
90
|
/** The kernel-schema handle of the current context (the transaction, else the pool). */
|
|
173
91
|
get db() {
|
|
174
92
|
return this.kdb.db;
|
|
175
93
|
}
|
|
176
94
|
/**
|
|
177
|
-
* A
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
*
|
|
95
|
+
* A request for a catalog item (`POST /orgs/:orgId/catalog/:itemId/requests`): `enable`
|
|
96
|
+
* (`catalog.request`, members and up) or `access` (`catalog.decide`, org admins), checked first.
|
|
97
|
+
* The item as the org sees it: absent (missing, deleted, hidden, disabled for a member) ->
|
|
98
|
+
* `catalog.item_not_found`; disabled -> `catalog.item_disabled` for an org admin; its extension
|
|
99
|
+
* unable to run on the platform -> `catalog.request_invalid`; `access` needs
|
|
100
|
+
* `not_offered`, `enable` needs `off` (else `catalog.request_invalid`); a pending request of the
|
|
101
|
+
* kind -> `catalog.request_pending`. Audits `catalog.requested`.
|
|
181
102
|
*/
|
|
182
|
-
async
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
const
|
|
188
|
-
|
|
189
|
-
const item = await lockItem(t, itemId);
|
|
190
|
-
if (!item || item.deleted_at !== null)
|
|
103
|
+
async requestItem(orgId, actor, itemId, input, opts = {}) {
|
|
104
|
+
const action = input.kind === "access" ? "catalog.decide" : "catalog.request";
|
|
105
|
+
await this.authorize(orgId, actor, action);
|
|
106
|
+
if (!UUID_RE.test(itemId))
|
|
107
|
+
throw itemNotFound();
|
|
108
|
+
const [item] = await this.orgCatalog.list(orgId, actor, itemId);
|
|
109
|
+
if (!item)
|
|
191
110
|
throw itemNotFound();
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
111
|
+
if (item.state === "unavailable" && item.reason === "plugin_disabled")
|
|
112
|
+
throw itemDisabled();
|
|
113
|
+
if (item.state === "unavailable") {
|
|
114
|
+
throw new ApiError("catalog.request_invalid", `This plugin's extension cannot run on the platform now (${item.reason ?? "unavailable"}); only the super admin can fix that`);
|
|
115
|
+
}
|
|
116
|
+
const want = input.kind === "access" ? "not_offered" : "off";
|
|
117
|
+
if (item.state !== want) {
|
|
118
|
+
throw new ApiError("catalog.request_invalid", input.kind === "access"
|
|
119
|
+
? "This plugin is already offered to this organization"
|
|
120
|
+
: "This plugin is not off in this organization (or not one an org admin switches on)");
|
|
195
121
|
}
|
|
196
|
-
const
|
|
122
|
+
const id = await this.writeItemRequest(orgId, actor, item.name, itemId, input, opts);
|
|
123
|
+
return this.view(id);
|
|
124
|
+
}
|
|
125
|
+
/** The role check alone, before any item error (a member cannot probe items by error codes). */
|
|
126
|
+
async authorize(orgId, actor, action) {
|
|
127
|
+
await this.orgLock.lockAndAuthorize(orgId, actor, action);
|
|
128
|
+
}
|
|
129
|
+
async writeItemRequest(orgId, actor, name, itemId, input, opts) {
|
|
130
|
+
const t = this.db;
|
|
131
|
+
await this.orgLock.lockAndAuthorize(orgId, actor, input.kind === "access" ? "catalog.decide" : "catalog.request");
|
|
132
|
+
const existing = await t
|
|
133
|
+
.selectFrom("catalog_requests")
|
|
134
|
+
.select("id")
|
|
135
|
+
.where("org_id", "=", orgId)
|
|
136
|
+
.where("item_id", "=", itemId)
|
|
137
|
+
.where("kind", "=", input.kind)
|
|
138
|
+
.where("status", "=", "pending")
|
|
139
|
+
.executeTakeFirst();
|
|
197
140
|
if (existing)
|
|
198
|
-
|
|
141
|
+
throw pendingExists();
|
|
199
142
|
const id = randomUUID();
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
143
|
+
try {
|
|
144
|
+
await t
|
|
145
|
+
.insertInto("catalog_requests")
|
|
146
|
+
.values({
|
|
147
|
+
id,
|
|
148
|
+
org_id: orgId,
|
|
149
|
+
item_id: itemId,
|
|
150
|
+
kind: input.kind,
|
|
151
|
+
// still written for the old NOT NULL / CHECK, never read
|
|
152
|
+
stage: input.kind === "enable" ? "org" : "deployment",
|
|
153
|
+
requested_by: actor,
|
|
154
|
+
note: input.note ?? "",
|
|
155
|
+
})
|
|
156
|
+
.execute();
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
if (isUniqueViolation(e))
|
|
160
|
+
throw pendingExists();
|
|
161
|
+
throw e;
|
|
162
|
+
}
|
|
212
163
|
await audit(t, {
|
|
213
164
|
actorAccountId: actor,
|
|
214
165
|
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
215
166
|
orgId,
|
|
216
167
|
action: "catalog.requested",
|
|
217
168
|
target: id,
|
|
218
|
-
detail: { itemId, name:
|
|
169
|
+
detail: { itemId, name, kind: input.kind, ...opts.auditDetail },
|
|
219
170
|
});
|
|
220
|
-
return
|
|
221
|
-
}
|
|
222
|
-
pendingRow(orgId, itemId) {
|
|
223
|
-
return this.db
|
|
224
|
-
.selectFrom("catalog_requests")
|
|
225
|
-
.select(["id", "stage"])
|
|
226
|
-
.where("org_id", "=", orgId)
|
|
227
|
-
.where("item_id", "=", itemId)
|
|
228
|
-
.where("status", "=", "pending")
|
|
229
|
-
.executeTakeFirst();
|
|
171
|
+
return id;
|
|
230
172
|
}
|
|
231
173
|
/**
|
|
232
|
-
* An org admin
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
*
|
|
174
|
+
* An org admin asks for a marketplace entry to be imported (`POST /orgs/:orgId/
|
|
175
|
+
* marketplace-requests`, `catalog.decide`). The deployment setting `orgMarketplaceBrowse` off ->
|
|
176
|
+
* `catalog.marketplace_browse_disabled`; the marketplace or the entry / version missing ->
|
|
177
|
+
* `marketplace.not_found` / `marketplace.entry_not_found`; a deprecated version ->
|
|
178
|
+
* `marketplace.entry_deprecated`; a live item of that name ->
|
|
179
|
+
* `catalog.request_invalid` (ask for access instead) when the org can see or request that item
|
|
180
|
+
* (a hidden one is not revealed: the request is accepted); a pending request for the entry ->
|
|
181
|
+
* `catalog.request_pending`. Audits `catalog.requested`.
|
|
236
182
|
*/
|
|
237
|
-
async
|
|
183
|
+
async requestImport(orgId, actor, input, opts = {}) {
|
|
184
|
+
const id = await this.writeImportRequest(orgId, actor, input, opts);
|
|
185
|
+
return this.view(id);
|
|
186
|
+
}
|
|
187
|
+
async writeImportRequest(orgId, actor, input, opts) {
|
|
238
188
|
const t = this.db;
|
|
239
|
-
|
|
240
|
-
if (
|
|
241
|
-
|
|
242
|
-
await t
|
|
243
|
-
.updateTable("catalog_requests")
|
|
244
|
-
.set({ stage: "deployment", org_decided_by: actor, org_decided_at: sql `now()` })
|
|
245
|
-
.where("id", "=", existing.id)
|
|
246
|
-
.execute();
|
|
247
|
-
await audit(t, {
|
|
248
|
-
actorAccountId: actor,
|
|
249
|
-
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
250
|
-
orgId,
|
|
251
|
-
action: "catalog.request_decided",
|
|
252
|
-
target: existing.id,
|
|
253
|
-
detail: { itemId: item.id, decision: "approve", stage: "org", escalated: true },
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
return existing.id;
|
|
189
|
+
await this.orgLock.lockAndAuthorize(orgId, actor, "catalog.decide");
|
|
190
|
+
if (!(await readOrgMarketplaceBrowse(t))) {
|
|
191
|
+
throw new ApiError("catalog.marketplace_browse_disabled", "Organizations cannot browse the marketplaces or request imports in this deployment");
|
|
257
192
|
}
|
|
193
|
+
const { entry } = await loadMarketplaceEntry(t, this.config.get(), input.marketplaceId, input.name, input.version);
|
|
194
|
+
assertEntryNotDeprecated(entry);
|
|
195
|
+
const live = await t
|
|
196
|
+
.selectFrom("catalog_items")
|
|
197
|
+
.select("id")
|
|
198
|
+
.where("name", "=", input.name)
|
|
199
|
+
.where("deleted_at", "is", null)
|
|
200
|
+
.executeTakeFirst();
|
|
201
|
+
// Only an item the org can see or request is named back to it; a hidden `named` item stays
|
|
202
|
+
// unknown and the request is accepted (approving it adds the org to that item's list)
|
|
203
|
+
if (live && (await itemsSeenBy(t, orgId, [live.id])).has(live.id)) {
|
|
204
|
+
throw new ApiError("catalog.request_invalid", `Plugin ${input.name} is already in the catalog; request access to it instead`);
|
|
205
|
+
}
|
|
206
|
+
const existing = await t
|
|
207
|
+
.selectFrom("catalog_requests")
|
|
208
|
+
.select("id")
|
|
209
|
+
.where("org_id", "=", orgId)
|
|
210
|
+
.where("kind", "=", "import")
|
|
211
|
+
.where("marketplace_id", "=", input.marketplaceId)
|
|
212
|
+
.where("entry_name", "=", input.name)
|
|
213
|
+
.where("status", "=", "pending")
|
|
214
|
+
.executeTakeFirst();
|
|
215
|
+
if (existing)
|
|
216
|
+
throw pendingExists();
|
|
258
217
|
const id = randomUUID();
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
218
|
+
try {
|
|
219
|
+
await t
|
|
220
|
+
.insertInto("catalog_requests")
|
|
221
|
+
.values({
|
|
222
|
+
id,
|
|
223
|
+
org_id: orgId,
|
|
224
|
+
item_id: null,
|
|
225
|
+
kind: "import",
|
|
226
|
+
stage: "deployment",
|
|
227
|
+
marketplace_id: input.marketplaceId,
|
|
228
|
+
entry_name: input.name,
|
|
229
|
+
entry_version: input.version,
|
|
230
|
+
requested_by: actor,
|
|
231
|
+
note: input.note ?? "",
|
|
232
|
+
})
|
|
233
|
+
.execute();
|
|
234
|
+
}
|
|
235
|
+
catch (e) {
|
|
236
|
+
if (isUniqueViolation(e))
|
|
237
|
+
throw pendingExists();
|
|
238
|
+
throw e;
|
|
239
|
+
}
|
|
270
240
|
await audit(t, {
|
|
271
241
|
actorAccountId: actor,
|
|
272
242
|
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
273
243
|
orgId,
|
|
274
244
|
action: "catalog.requested",
|
|
275
245
|
target: id,
|
|
276
|
-
detail: {
|
|
246
|
+
detail: {
|
|
247
|
+
kind: "import",
|
|
248
|
+
marketplaceId: input.marketplaceId,
|
|
249
|
+
name: input.name,
|
|
250
|
+
version: input.version,
|
|
251
|
+
...opts.auditDetail,
|
|
252
|
+
},
|
|
277
253
|
});
|
|
278
254
|
return id;
|
|
279
255
|
}
|
|
280
256
|
/**
|
|
281
|
-
*
|
|
282
|
-
*
|
|
283
|
-
*
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
.set({ status: "approved", decided_by: actor, decided_at: sql `now()` })
|
|
290
|
-
.where("org_id", "=", orgId)
|
|
291
|
-
.where("item_id", "=", itemId)
|
|
292
|
-
.where("status", "=", "pending")
|
|
293
|
-
.returning(["id", "stage"])
|
|
294
|
-
.execute();
|
|
295
|
-
for (const r of rows) {
|
|
296
|
-
await audit(t, {
|
|
297
|
-
actorAccountId: actor,
|
|
298
|
-
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
299
|
-
orgId,
|
|
300
|
-
action: "catalog.request_decided",
|
|
301
|
-
target: r.id,
|
|
302
|
-
detail: { itemId, decision: "approve", stage: r.stage, installed: true },
|
|
303
|
-
});
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* An org admin decides a member request (`catalog.decide`, re-checked inside the org row lock;
|
|
308
|
-
* the request row FOR UPDATE). Not this org's request -> `catalog.request_not_found`; already
|
|
309
|
-
* decided or handed to the enterprise admins -> `catalog.request_decided`. On approval: item
|
|
310
|
-
* deleted or disabled -> `catalog.item_disabled`; needs_approval without a grant -> moved to stage
|
|
311
|
-
* deployment (still pending); otherwise approved. Audits `catalog.request_decided`.
|
|
257
|
+
* An org admin decides a member's `enable` or `connector_setup` request (`catalog.decide`). Not
|
|
258
|
+
* this org's request of those kinds -> `catalog.request_not_found`; decided ->
|
|
259
|
+
* `catalog.request_decided`. Approving an `enable` request switches the item on in the org as the
|
|
260
|
+
* deciding admin ({@link OrgCatalogService.setSwitch}: its errors, e.g. inputs the install
|
|
261
|
+
* needs, leave the request pending); the install itself resolves the request. A
|
|
262
|
+
* `connector_setup` request is approved only by binding its connectors (ruling P4-T6-6):
|
|
263
|
+
* approving it -> `catalog.request_invalid`. Rejecting stores the reason. Audits
|
|
264
|
+
* `catalog.request_decided`.
|
|
312
265
|
*/
|
|
313
266
|
async decideOrg(orgId, actor, requestId, decision, opts = {}) {
|
|
314
267
|
if (!UUID_RE.test(requestId))
|
|
315
268
|
throw requestNotFound();
|
|
316
|
-
|
|
269
|
+
if (decision.approve) {
|
|
270
|
+
const itemId = await this.pendingOrgRequest(orgId, actor, requestId);
|
|
271
|
+
await this.orgCatalog.setSwitch(orgId, actor, itemId, { enabled: true }, opts.actorTokenId);
|
|
272
|
+
}
|
|
273
|
+
await this.writeDecision(requestId, actor, decision, opts, { orgId });
|
|
317
274
|
return this.view(requestId);
|
|
318
275
|
}
|
|
319
|
-
|
|
320
|
-
|
|
276
|
+
/** The item of a pending `enable` request of the org (the decider re-checked). */
|
|
277
|
+
async pendingOrgRequest(orgId, actor, requestId) {
|
|
321
278
|
await this.orgLock.lockAndAuthorize(orgId, actor, "catalog.decide");
|
|
322
|
-
const row = await
|
|
279
|
+
const row = await this.db
|
|
323
280
|
.selectFrom("catalog_requests")
|
|
324
|
-
.select(["
|
|
281
|
+
.select(["item_id", "status", "kind"])
|
|
325
282
|
.where("id", "=", requestId)
|
|
326
283
|
.where("org_id", "=", orgId)
|
|
327
|
-
.
|
|
284
|
+
.where("kind", "in", [...ORG_KINDS])
|
|
328
285
|
.executeTakeFirst();
|
|
329
286
|
if (!row)
|
|
330
287
|
throw requestNotFound();
|
|
331
|
-
if (row.status !== "pending"
|
|
332
|
-
throw
|
|
333
|
-
|
|
334
|
-
|
|
288
|
+
if (row.status !== "pending")
|
|
289
|
+
throw alreadyDecided();
|
|
290
|
+
if (row.kind === "connector_setup") {
|
|
291
|
+
throw new ApiError("catalog.request_invalid", "A connector setup request is resolved by binding the agent's connectors; reject it to refuse");
|
|
335
292
|
}
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
293
|
+
if (row.item_id === null)
|
|
294
|
+
throw requestNotFound();
|
|
295
|
+
return row.item_id;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* A super admin decides an `access` or `import` request (re-checked inside the super
|
|
299
|
+
* admin lock; the request row FOR UPDATE). Missing or an `enable` request ->
|
|
300
|
+
* `catalog.request_not_found`; decided -> `catalog.request_decided`. Approving `access`: the item
|
|
301
|
+
* deleted or disabled -> `catalog.item_disabled`, the org deleted -> not found; otherwise the org
|
|
302
|
+
* joins the item's `named` list. Approving `import` prepares the import of the entry and returns
|
|
303
|
+
* it; the request stays pending, linked to the staging, until that confirm commits (approving
|
|
304
|
+
* again prepares a new one). Audits `catalog.request_decided` (`catalog.request_import_prepared`
|
|
305
|
+
* for an import's approval).
|
|
306
|
+
*/
|
|
307
|
+
async decideDeployment(actor, requestId, decision, opts = {}) {
|
|
308
|
+
if (!UUID_RE.test(requestId))
|
|
309
|
+
throw requestNotFound();
|
|
310
|
+
const row = await this.pendingDeploymentRequest(actor, requestId);
|
|
311
|
+
if (decision.approve && row.kind === "import")
|
|
312
|
+
return this.approveImport(actor, requestId, opts);
|
|
313
|
+
await this.writeDecision(requestId, actor, decision, opts, { deployment: true });
|
|
314
|
+
return { request: await this.view(requestId) };
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Approves an `import` request, one approval of a request at a time (across replicas): an item
|
|
318
|
+
* of the entry's name that holds the requested version already (one hidden from the org, which
|
|
319
|
+
* is why the request was accepted) -> the org joins its `named` list at once, nothing imported;
|
|
320
|
+
* a staging linked by an earlier approval and not expired -> that staging again; otherwise the
|
|
321
|
+
* import is prepared and linked. The confirm of a staging adds the org to an item that exists by
|
|
322
|
+
* then (`PluginImport.commit`).
|
|
323
|
+
*/
|
|
324
|
+
async approveImport(actor, requestId, opts) {
|
|
325
|
+
const row = await this.pendingDeploymentRequest(actor, requestId);
|
|
326
|
+
if (row.marketplace_id === null || row.entry_name === null) {
|
|
327
|
+
throw new ApiError("catalog.request_invalid", "The marketplace of this request was deleted; reject it");
|
|
342
328
|
}
|
|
343
|
-
await
|
|
329
|
+
const existing = await this.db
|
|
330
|
+
.selectFrom("catalog_items as i")
|
|
331
|
+
.innerJoin("catalog_item_versions as v", "v.item_id", "i.id")
|
|
332
|
+
.select("i.id")
|
|
333
|
+
.where("i.name", "=", row.entry_name)
|
|
334
|
+
.where("i.deleted_at", "is", null)
|
|
335
|
+
.where("v.version", "=", row.entry_version ?? "")
|
|
336
|
+
.executeTakeFirst();
|
|
337
|
+
if (existing) {
|
|
338
|
+
await this.writeDecision(requestId, actor, { approve: true }, opts, {
|
|
339
|
+
deployment: true,
|
|
340
|
+
grantItem: existing.id,
|
|
341
|
+
});
|
|
342
|
+
return { request: await this.view(requestId) };
|
|
343
|
+
}
|
|
344
|
+
if (row.staging_id !== null) {
|
|
345
|
+
const staged = await this.pluginImport.staged(row.staging_id).catch(() => undefined);
|
|
346
|
+
if (staged) {
|
|
347
|
+
return {
|
|
348
|
+
request: await this.view(requestId),
|
|
349
|
+
import: {
|
|
350
|
+
stagingId: staged.stagingId,
|
|
351
|
+
review: staged.review,
|
|
352
|
+
permissionsMismatch: staged.permissionsMismatch ?? null,
|
|
353
|
+
},
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
const prepared = await this.catalog.importFromMarketplace(actor, {
|
|
358
|
+
marketplaceId: row.marketplace_id,
|
|
359
|
+
name: row.entry_name,
|
|
360
|
+
...(row.entry_version !== null && { version: row.entry_version }),
|
|
361
|
+
}, opts);
|
|
362
|
+
await this.linkStaging(actor, requestId, prepared.stagingId, opts);
|
|
363
|
+
return { request: await this.view(requestId), import: prepared };
|
|
364
|
+
}
|
|
365
|
+
/** A pending `access` / `import` request (the row locked; the super admin re-checked). */
|
|
366
|
+
async pendingDeploymentRequest(actor, requestId) {
|
|
367
|
+
await this.adminLock.lockAndAuthorize(actor);
|
|
368
|
+
const row = await this.db
|
|
369
|
+
.selectFrom("catalog_requests")
|
|
370
|
+
.select(["kind", "status", "marketplace_id", "entry_name", "entry_version", "staging_id"])
|
|
371
|
+
.where("id", "=", requestId)
|
|
372
|
+
.where("kind", "in", [...DEPLOYMENT_KINDS])
|
|
373
|
+
.forUpdate()
|
|
374
|
+
.executeTakeFirst();
|
|
375
|
+
if (!row)
|
|
376
|
+
throw requestNotFound();
|
|
377
|
+
if (row.status !== "pending")
|
|
378
|
+
throw alreadyDecided();
|
|
379
|
+
return row;
|
|
380
|
+
}
|
|
381
|
+
/** Links a still pending `import` request to its prepared staging. */
|
|
382
|
+
async linkStaging(actor, requestId, stagingId, opts) {
|
|
383
|
+
await this.adminLock.lockAndAuthorize(actor);
|
|
384
|
+
const row = await this.db
|
|
385
|
+
.selectFrom("catalog_requests")
|
|
386
|
+
.select(["org_id", "status", "entry_name"])
|
|
387
|
+
.where("id", "=", requestId)
|
|
388
|
+
.forUpdate()
|
|
389
|
+
.executeTakeFirstOrThrow();
|
|
390
|
+
if (row.status !== "pending")
|
|
391
|
+
throw alreadyDecided();
|
|
392
|
+
await this.db
|
|
344
393
|
.updateTable("catalog_requests")
|
|
345
|
-
.set(
|
|
346
|
-
? { stage: "deployment", org_decided_by: actor, org_decided_at: sql `now()` }
|
|
347
|
-
: {
|
|
348
|
-
status: decision === "approve" ? "approved" : "rejected",
|
|
349
|
-
decided_by: actor,
|
|
350
|
-
decided_at: sql `now()`,
|
|
351
|
-
})
|
|
394
|
+
.set({ staging_id: stagingId })
|
|
352
395
|
.where("id", "=", requestId)
|
|
353
396
|
.execute();
|
|
354
|
-
await audit(
|
|
397
|
+
await audit(this.db, {
|
|
355
398
|
actorAccountId: actor,
|
|
356
399
|
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
357
|
-
orgId,
|
|
358
|
-
action: "catalog.
|
|
400
|
+
orgId: row.org_id,
|
|
401
|
+
action: "catalog.request_import_prepared",
|
|
359
402
|
target: requestId,
|
|
360
|
-
detail: {
|
|
403
|
+
detail: { name: row.entry_name, stagingId },
|
|
361
404
|
});
|
|
362
405
|
}
|
|
363
406
|
/**
|
|
364
|
-
*
|
|
365
|
-
*
|
|
366
|
-
* `
|
|
367
|
-
* deleted or disabled -> `catalog.item_disabled`, the request's org deleted ->
|
|
368
|
-
* `catalog.request_not_found`. Approval writes a grant to `catalog_org_grants`. Audits
|
|
369
|
-
* `catalog.request_decided` (with orgId).
|
|
407
|
+
* Writes a decision (the request row FOR UPDATE): org side (`orgId`: the org admin re-checked,
|
|
408
|
+
* `enable` only) or deployment side (the super admin re-checked, `access` / `import`). An
|
|
409
|
+
* approval of an `enable` request may find it approved already by the install it triggered.
|
|
370
410
|
*/
|
|
371
|
-
async
|
|
372
|
-
if (!UUID_RE.test(requestId))
|
|
373
|
-
throw requestNotFound();
|
|
374
|
-
await this.writeDecideDeployment(actor, requestId, decision, opts);
|
|
375
|
-
return this.view(requestId);
|
|
376
|
-
}
|
|
377
|
-
async writeDecideDeployment(actor, requestId, decision, opts) {
|
|
411
|
+
async writeDecision(requestId, actor, decision, opts, side) {
|
|
378
412
|
const t = this.db;
|
|
379
|
-
|
|
380
|
-
|
|
413
|
+
if ("orgId" in side)
|
|
414
|
+
await this.orgLock.lockAndAuthorize(side.orgId, actor, "catalog.decide");
|
|
415
|
+
else
|
|
416
|
+
await this.adminLock.lockAndAuthorize(actor);
|
|
417
|
+
let q = t
|
|
381
418
|
.selectFrom("catalog_requests")
|
|
382
|
-
.select(["id", "org_id", "item_id", "
|
|
383
|
-
.where("id", "=", requestId)
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
419
|
+
.select(["id", "org_id", "item_id", "kind", "status", "decided_by"])
|
|
420
|
+
.where("id", "=", requestId);
|
|
421
|
+
q =
|
|
422
|
+
"orgId" in side
|
|
423
|
+
? q.where("org_id", "=", side.orgId).where("kind", "in", [...ORG_KINDS])
|
|
424
|
+
: q.where("kind", "in", [...DEPLOYMENT_KINDS]);
|
|
425
|
+
const row = await q.forUpdate().executeTakeFirst();
|
|
426
|
+
if (!row)
|
|
387
427
|
throw requestNotFound();
|
|
388
428
|
if (row.status !== "pending") {
|
|
389
|
-
|
|
429
|
+
// The switch-on of this approval already resolved it (the install approves pending requests)
|
|
430
|
+
if (decision.approve && row.kind === "enable" && row.status === "approved")
|
|
431
|
+
return;
|
|
432
|
+
throw alreadyDecided();
|
|
390
433
|
}
|
|
391
|
-
if (decision === "
|
|
392
|
-
const item = await
|
|
393
|
-
|
|
434
|
+
if (decision.approve && row.kind === "access" && row.item_id !== null) {
|
|
435
|
+
const item = await t
|
|
436
|
+
.selectFrom("catalog_items")
|
|
437
|
+
.select(["deleted_at", "disabled"])
|
|
438
|
+
.where("id", "=", row.item_id)
|
|
439
|
+
.executeTakeFirst();
|
|
440
|
+
if (!item || item.deleted_at !== null || item.disabled)
|
|
394
441
|
throw itemDisabled();
|
|
395
442
|
const org = await t
|
|
396
443
|
.selectFrom("orgs")
|
|
@@ -399,16 +446,19 @@ let CatalogRequestsService = class CatalogRequestsService {
|
|
|
399
446
|
.executeTakeFirst();
|
|
400
447
|
if (!org || org.deleted_at !== null)
|
|
401
448
|
throw requestNotFound();
|
|
402
|
-
await
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
449
|
+
await this.scope.addOrg(actor, row.item_id, row.org_id, { ...opts, requestId });
|
|
450
|
+
}
|
|
451
|
+
// An `import` request whose entry is in the catalog already: the org joins that item's list
|
|
452
|
+
const grantItem = "grantItem" in side ? side.grantItem : undefined;
|
|
453
|
+
if (decision.approve && row.kind === "import" && grantItem !== undefined) {
|
|
454
|
+
await this.scope.addOrg(actor, grantItem, row.org_id, { ...opts, requestId });
|
|
407
455
|
}
|
|
408
456
|
await t
|
|
409
457
|
.updateTable("catalog_requests")
|
|
410
458
|
.set({
|
|
411
|
-
status: decision
|
|
459
|
+
status: decision.approve ? "approved" : "rejected",
|
|
460
|
+
reason: decision.approve ? null : (decision.reason ?? null),
|
|
461
|
+
...(grantItem !== undefined && { item_id: grantItem }),
|
|
412
462
|
decided_by: actor,
|
|
413
463
|
decided_at: sql `now()`,
|
|
414
464
|
})
|
|
@@ -420,36 +470,62 @@ let CatalogRequestsService = class CatalogRequestsService {
|
|
|
420
470
|
orgId: row.org_id,
|
|
421
471
|
action: "catalog.request_decided",
|
|
422
472
|
target: requestId,
|
|
423
|
-
detail: {
|
|
473
|
+
detail: {
|
|
474
|
+
itemId: row.item_id,
|
|
475
|
+
kind: row.kind,
|
|
476
|
+
decision: decision.approve ? "approve" : "reject",
|
|
477
|
+
...(!decision.approve && decision.reason !== undefined && { reason: decision.reason }),
|
|
478
|
+
},
|
|
424
479
|
});
|
|
425
480
|
}
|
|
426
|
-
/**
|
|
481
|
+
/**
|
|
482
|
+
* The requester dismisses a decided request from the inbox (`POST /orgs/:orgId/
|
|
483
|
+
* catalog-requests/:id/dismiss`). Not the requester's decided request in this org ->
|
|
484
|
+
* `catalog.request_not_found`.
|
|
485
|
+
*/
|
|
486
|
+
async dismiss(orgId, accountId, requestId) {
|
|
487
|
+
if (!UUID_RE.test(requestId))
|
|
488
|
+
throw requestNotFound();
|
|
489
|
+
const r = await this.db
|
|
490
|
+
.updateTable("catalog_requests")
|
|
491
|
+
.set({ dismissed_at: sql `now()` })
|
|
492
|
+
.where("id", "=", requestId)
|
|
493
|
+
.where("org_id", "=", orgId)
|
|
494
|
+
.where("requested_by", "=", accountId)
|
|
495
|
+
.where("status", "in", ["approved", "rejected"])
|
|
496
|
+
.where("dismissed_at", "is", null)
|
|
497
|
+
.executeTakeFirst();
|
|
498
|
+
if (r.numUpdatedRows === 0n)
|
|
499
|
+
throw requestNotFound();
|
|
500
|
+
}
|
|
501
|
+
/** 超级管理员的申请列表(`access` / `import`;`status` 缺省 pending),新的在前。 */
|
|
427
502
|
async listDeployment(q = {}) {
|
|
428
503
|
const rows = await this.baseQuery()
|
|
429
|
-
.where("r.
|
|
504
|
+
.where("r.kind", "in", [...DEPLOYMENT_KINDS])
|
|
430
505
|
.where("r.status", "=", q.status ?? "pending")
|
|
431
506
|
.where("o.deleted_at", "is", null)
|
|
432
507
|
.orderBy("r.created_at", "desc")
|
|
433
508
|
.orderBy("r.id")
|
|
434
509
|
.limit(CATALOG_REQUESTS_LIST_MAX)
|
|
435
510
|
.execute();
|
|
436
|
-
return
|
|
511
|
+
return this.toViews(rows);
|
|
437
512
|
}
|
|
438
|
-
/**
|
|
513
|
+
/** 待超级管理员处理的申请数(后台概览)。 */
|
|
439
514
|
async countPendingDeployment() {
|
|
440
515
|
const r = await this.db
|
|
441
516
|
.selectFrom("catalog_requests as r")
|
|
442
517
|
.innerJoin("orgs as o", "o.id", "r.org_id")
|
|
443
518
|
.select(sql `count(*)`.as("n"))
|
|
444
|
-
.where("r.
|
|
519
|
+
.where("r.kind", "in", [...DEPLOYMENT_KINDS])
|
|
445
520
|
.where("r.status", "=", "pending")
|
|
446
521
|
.where("o.deleted_at", "is", null)
|
|
447
522
|
.executeTakeFirstOrThrow();
|
|
448
523
|
return Number(r.n);
|
|
449
524
|
}
|
|
450
525
|
/**
|
|
451
|
-
*
|
|
452
|
-
*
|
|
526
|
+
* The inbox: when the account is an org admin of the org (the role read live), the members'
|
|
527
|
+
* pending `enable` requests and the pending `connector_setup` requests, newest first; otherwise
|
|
528
|
+
* none.
|
|
453
529
|
*/
|
|
454
530
|
async listForOrgAdmin(orgId, accountId) {
|
|
455
531
|
const m = await this.db
|
|
@@ -462,99 +538,210 @@ let CatalogRequestsService = class CatalogRequestsService {
|
|
|
462
538
|
return [];
|
|
463
539
|
const rows = await this.baseQuery()
|
|
464
540
|
.where("r.org_id", "=", orgId)
|
|
465
|
-
.where("r.
|
|
541
|
+
.where("r.kind", "in", [...ORG_KINDS])
|
|
466
542
|
.where("r.status", "=", "pending")
|
|
467
543
|
.orderBy("r.created_at", "desc")
|
|
468
544
|
.orderBy("r.id")
|
|
469
545
|
.limit(CATALOG_REQUESTS_LIST_MAX)
|
|
470
546
|
.execute();
|
|
471
|
-
|
|
547
|
+
// A request on an item the org can no longer see (its scope hid it since) is left out, so
|
|
548
|
+
// nothing reveals the item's name to the org; a setup request of a deleted agent too
|
|
549
|
+
const ids = [...new Set(rows.flatMap((r) => (r.item_id !== null ? [r.item_id] : [])))];
|
|
550
|
+
const seen = await itemsSeenBy(this.db, orgId, ids);
|
|
551
|
+
return this.toViews(rows.filter((r) => r.kind === "connector_setup"
|
|
552
|
+
? r.agent_id !== null && r.agent_deleted_at === null
|
|
553
|
+
: r.item_id !== null && seen.has(r.item_id)));
|
|
472
554
|
}
|
|
473
|
-
/**
|
|
474
|
-
async
|
|
475
|
-
const rows = await this.
|
|
476
|
-
.
|
|
477
|
-
.
|
|
478
|
-
.where("
|
|
479
|
-
.
|
|
555
|
+
/** The inbox: the account's decided requests in the org it has not dismissed, newest first. */
|
|
556
|
+
async listDecidedForRequester(orgId, accountId) {
|
|
557
|
+
const rows = await this.baseQuery()
|
|
558
|
+
.where("r.org_id", "=", orgId)
|
|
559
|
+
.where("r.requested_by", "=", accountId)
|
|
560
|
+
.where("r.status", "in", ["approved", "rejected"])
|
|
561
|
+
.where("r.dismissed_at", "is", null)
|
|
562
|
+
.orderBy("r.decided_at", "desc")
|
|
563
|
+
.orderBy("r.id")
|
|
564
|
+
.limit(CATALOG_REQUESTS_LIST_MAX)
|
|
565
|
+
.execute();
|
|
566
|
+
return this.toViews(rows);
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* The account's own requests in the org, pending and decided (dismissed ones too), newest first;
|
|
570
|
+
* cancelled ones are left out (the Platform tool's `requests.list-mine`).
|
|
571
|
+
*/
|
|
572
|
+
async listForRequester(orgId, accountId) {
|
|
573
|
+
const rows = await this.baseQuery()
|
|
574
|
+
.where("r.org_id", "=", orgId)
|
|
575
|
+
.where("r.requested_by", "=", accountId)
|
|
576
|
+
.where("r.status", "in", ["pending", "approved", "rejected"])
|
|
577
|
+
.orderBy("r.created_at", "desc")
|
|
578
|
+
.orderBy("r.id")
|
|
579
|
+
.limit(CATALOG_REQUESTS_LIST_MAX)
|
|
480
580
|
.execute();
|
|
481
|
-
|
|
482
|
-
for (const r of rows)
|
|
483
|
-
out.set(r.item_id, { id: r.id, stage: r.stage, status: r.status });
|
|
484
|
-
return out;
|
|
581
|
+
return this.toViews(rows);
|
|
485
582
|
}
|
|
486
583
|
async view(id) {
|
|
487
584
|
const row = await this.baseQuery().where("r.id", "=", id).executeTakeFirst();
|
|
488
585
|
if (!row)
|
|
489
586
|
throw requestNotFound();
|
|
490
|
-
return
|
|
587
|
+
return (await this.toViews([row]))[0];
|
|
588
|
+
}
|
|
589
|
+
/** The views of `rows`, with the display names of the connector templates setup requests name. */
|
|
590
|
+
async toViews(rows) {
|
|
591
|
+
const ids = new Set();
|
|
592
|
+
for (const r of rows) {
|
|
593
|
+
if (r.kind !== "connector_setup")
|
|
594
|
+
continue;
|
|
595
|
+
const def = r.agent_definition;
|
|
596
|
+
for (const c of def?.pendingConnectors ?? []) {
|
|
597
|
+
if ("template" in c.source && UUID_RE.test(c.source.template))
|
|
598
|
+
ids.add(c.source.template);
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
const names = new Map();
|
|
602
|
+
if (ids.size > 0) {
|
|
603
|
+
const found = await this.db
|
|
604
|
+
.selectFrom("platform_connector_templates")
|
|
605
|
+
.select(["id", "file"])
|
|
606
|
+
.where("id", "in", [...ids])
|
|
607
|
+
.execute();
|
|
608
|
+
for (const t of found) {
|
|
609
|
+
const dn = t.file?.displayName;
|
|
610
|
+
names.set(t.id, dn ?? null);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
return rows.map((r) => toView(r, names));
|
|
491
614
|
}
|
|
492
615
|
baseQuery() {
|
|
493
|
-
return this.db
|
|
616
|
+
return (this.db
|
|
494
617
|
.selectFrom("catalog_requests as r")
|
|
495
|
-
.
|
|
618
|
+
.leftJoin("catalog_items as i", "i.id", "r.item_id")
|
|
496
619
|
.innerJoin("orgs as o", "o.id", "r.org_id")
|
|
497
620
|
.leftJoin("accounts as a", "a.id", "r.requested_by")
|
|
621
|
+
// a connector_setup request's agent and its current version (name, pending connectors)
|
|
622
|
+
.leftJoin("agents as ag", "ag.id", "r.agent_id")
|
|
623
|
+
.leftJoin("agent_versions as av", (j) => j.onRef("av.agent_id", "=", "ag.id").onRef("av.version", "=", "ag.current_version"))
|
|
498
624
|
.select([
|
|
625
|
+
"r.agent_id",
|
|
626
|
+
"r.pending_keys",
|
|
627
|
+
"ag.deleted_at as agent_deleted_at",
|
|
628
|
+
"av.definition as agent_definition",
|
|
499
629
|
"r.id",
|
|
500
630
|
"r.org_id",
|
|
501
631
|
"o.name as org_name",
|
|
632
|
+
"r.kind",
|
|
502
633
|
"r.item_id",
|
|
503
634
|
"i.name",
|
|
504
635
|
"i.display_name",
|
|
505
|
-
"r.
|
|
506
|
-
"r.
|
|
636
|
+
"r.marketplace_id",
|
|
637
|
+
"r.entry_name",
|
|
638
|
+
"r.entry_version",
|
|
507
639
|
"r.status",
|
|
508
640
|
"r.note",
|
|
641
|
+
"r.reason",
|
|
509
642
|
"r.requested_by",
|
|
510
643
|
"a.display_name as requested_by_name",
|
|
511
644
|
"r.decided_by",
|
|
512
645
|
"r.decided_at",
|
|
513
|
-
"r.
|
|
514
|
-
"r.org_decided_at",
|
|
646
|
+
"r.staging_id",
|
|
515
647
|
"r.created_at",
|
|
516
|
-
]);
|
|
648
|
+
]));
|
|
517
649
|
}
|
|
518
650
|
};
|
|
519
651
|
__decorate([
|
|
520
652
|
Transactional()
|
|
521
|
-
], CatalogRequestsService.prototype, "
|
|
653
|
+
], CatalogRequestsService.prototype, "authorize", null);
|
|
522
654
|
__decorate([
|
|
523
|
-
Transactional(
|
|
524
|
-
], CatalogRequestsService.prototype, "
|
|
655
|
+
Transactional()
|
|
656
|
+
], CatalogRequestsService.prototype, "writeItemRequest", null);
|
|
525
657
|
__decorate([
|
|
526
|
-
Transactional(
|
|
527
|
-
], CatalogRequestsService.prototype, "
|
|
658
|
+
Transactional()
|
|
659
|
+
], CatalogRequestsService.prototype, "writeImportRequest", null);
|
|
660
|
+
__decorate([
|
|
661
|
+
Transactional()
|
|
662
|
+
], CatalogRequestsService.prototype, "pendingOrgRequest", null);
|
|
663
|
+
__decorate([
|
|
664
|
+
WithLock({ key: "catalog-request-#{1}", ttl: 60_000, waitTimeout: 180_000 })
|
|
665
|
+
], CatalogRequestsService.prototype, "approveImport", null);
|
|
666
|
+
__decorate([
|
|
667
|
+
Transactional()
|
|
668
|
+
], CatalogRequestsService.prototype, "pendingDeploymentRequest", null);
|
|
528
669
|
__decorate([
|
|
529
670
|
Transactional()
|
|
530
|
-
], CatalogRequestsService.prototype, "
|
|
671
|
+
], CatalogRequestsService.prototype, "linkStaging", null);
|
|
531
672
|
__decorate([
|
|
532
673
|
Transactional()
|
|
533
|
-
], CatalogRequestsService.prototype, "
|
|
674
|
+
], CatalogRequestsService.prototype, "writeDecision", null);
|
|
534
675
|
CatalogRequestsService = __decorate([
|
|
535
676
|
Injectable(),
|
|
536
677
|
__param(0, Inject(KernelDb)),
|
|
537
678
|
__param(1, Inject(OrgLock)),
|
|
538
|
-
__param(2, Inject(
|
|
539
|
-
__param(3, Inject(
|
|
679
|
+
__param(2, Inject(SuperAdminLock)),
|
|
680
|
+
__param(3, Inject(OrgCatalogService)),
|
|
681
|
+
__param(4, Inject(CatalogScopeService)),
|
|
682
|
+
__param(5, Inject(CatalogService)),
|
|
683
|
+
__param(6, Inject(KernelConfigService)),
|
|
684
|
+
__param(7, Inject(PluginImport)),
|
|
685
|
+
__param(8, Inject(TransactionHost)),
|
|
686
|
+
__param(9, Inject(LockService))
|
|
540
687
|
], CatalogRequestsService);
|
|
541
688
|
export { CatalogRequestsService };
|
|
542
|
-
|
|
689
|
+
/** The view fields of a `connector_setup` request (ruling P4-T6-5); null for other kinds. */
|
|
690
|
+
function setupFields(r, templateNames) {
|
|
691
|
+
if (r.kind !== "connector_setup" || r.agent_id === null)
|
|
692
|
+
return { agent: null, connectors: null };
|
|
693
|
+
const def = (r.agent_definition ?? null);
|
|
694
|
+
const pending = new Map((def?.pendingConnectors ?? []).map((c) => [c.key, c]));
|
|
695
|
+
const connectors = [];
|
|
696
|
+
for (const key of r.pending_keys ?? []) {
|
|
697
|
+
const c = pending.get(key);
|
|
698
|
+
if (c === undefined)
|
|
699
|
+
continue;
|
|
700
|
+
const src = c.source;
|
|
701
|
+
connectors.push({
|
|
702
|
+
key,
|
|
703
|
+
label: c.label,
|
|
704
|
+
kind: "template" in src ? "template" : "needs",
|
|
705
|
+
source: "template" in src
|
|
706
|
+
? { template: { id: src.template, displayName: templateNames.get(src.template) ?? null } }
|
|
707
|
+
: {
|
|
708
|
+
needs: {
|
|
709
|
+
protocol: src.needs.protocol,
|
|
710
|
+
endpoint: src.needs.endpoint,
|
|
711
|
+
tools: [...src.needs.tools],
|
|
712
|
+
},
|
|
713
|
+
},
|
|
714
|
+
tools: c.tools !== undefined && c.tools.length > 0 ? [...c.tools] : null,
|
|
715
|
+
// jsonb keeps no key order: sorted
|
|
716
|
+
policies: Object.keys(c.policies ?? {}).sort(),
|
|
717
|
+
});
|
|
718
|
+
}
|
|
719
|
+
return {
|
|
720
|
+
agent: { id: r.agent_id, name: def?.name ?? "", deleted: r.agent_deleted_at !== null },
|
|
721
|
+
connectors,
|
|
722
|
+
};
|
|
723
|
+
}
|
|
724
|
+
function toView(r, templateNames) {
|
|
543
725
|
return {
|
|
544
726
|
id: r.id,
|
|
545
727
|
orgId: r.org_id,
|
|
546
728
|
orgName: r.org_name,
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
729
|
+
kind: r.kind,
|
|
730
|
+
item: r.item_id !== null && r.name !== null
|
|
731
|
+
? { id: r.item_id, name: r.name, displayName: r.display_name }
|
|
732
|
+
: null,
|
|
733
|
+
entry: r.entry_name !== null
|
|
734
|
+
? { marketplaceId: r.marketplace_id, name: r.entry_name, version: r.entry_version }
|
|
735
|
+
: null,
|
|
736
|
+
...setupFields(r, templateNames),
|
|
550
737
|
status: r.status,
|
|
551
738
|
note: r.note,
|
|
739
|
+
reason: r.reason,
|
|
552
740
|
requestedBy: r.requested_by,
|
|
553
741
|
requestedByName: r.requested_by_name,
|
|
554
742
|
decidedBy: r.decided_by,
|
|
555
743
|
decidedAt: r.decided_at?.toISOString() ?? null,
|
|
556
|
-
|
|
557
|
-
orgDecidedAt: r.org_decided_at?.toISOString() ?? null,
|
|
744
|
+
stagingId: r.status === "pending" ? r.staging_id : null,
|
|
558
745
|
createdAt: r.created_at.toISOString(),
|
|
559
746
|
};
|
|
560
747
|
}
|