@capybara-hq/kernel 0.1.0-rc.1 → 0.1.0-rc.11
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.controller.d.ts +52 -71
- package/dist/admin/admin.controller.js +117 -63
- package/dist/admin/admin.module.d.ts +3 -0
- package/dist/admin/admin.module.js +22 -0
- package/dist/admin/admin.schemas.d.ts +60 -0
- package/dist/admin/admin.schemas.js +50 -0
- package/dist/admin/extensions.controller.d.ts +47 -16
- package/dist/admin/extensions.controller.js +94 -23
- package/dist/admin/extensions.schemas.d.ts +7 -0
- package/dist/admin/extensions.schemas.js +10 -0
- package/dist/admin/limit-defaults.d.ts +20 -0
- package/dist/admin/limit-defaults.js +10 -0
- package/dist/admin/setup-lock.d.ts +16 -0
- package/dist/admin/setup-lock.js +47 -0
- package/dist/admin/setup.controller.d.ts +9 -9
- package/dist/admin/setup.controller.js +28 -26
- package/dist/admin/setup.service.d.ts +20 -28
- package/dist/admin/setup.service.js +65 -65
- package/dist/agents/agent-lookup.d.ts +72 -0
- package/dist/agents/agent-lookup.js +208 -0
- 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 +54 -169
- package/dist/agents/agents.controller.js +172 -37
- package/dist/agents/agents.module.d.ts +10 -0
- package/dist/agents/agents.module.js +71 -0
- package/dist/agents/agents.schemas.d.ts +389 -0
- package/dist/agents/agents.schemas.js +126 -0
- package/dist/agents/agents.service.d.ts +104 -76
- package/dist/agents/agents.service.js +509 -383
- package/dist/agents/definition.d.ts +133 -21
- package/dist/agents/definition.js +361 -41
- 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 +868 -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 +78 -6
- package/dist/agents/templates.controller.js +154 -8
- package/dist/agents/templates.d.ts +132 -30
- package/dist/agents/templates.js +500 -46
- package/dist/agents/templates.schemas.d.ts +20 -0
- package/dist/agents/templates.schemas.js +45 -0
- package/dist/app.d.ts +93 -0
- package/dist/app.js +150 -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 +77 -0
- package/dist/background/tasks.service.js +216 -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 +102 -52
- package/dist/catalog/admin-catalog.controller.js +222 -67
- package/dist/catalog/admin-catalog.schemas.d.ts +72 -0
- package/dist/catalog/admin-catalog.schemas.js +92 -0
- package/dist/catalog/catalog-content.d.ts +264 -0
- package/dist/catalog/catalog-content.js +430 -0
- package/dist/catalog/catalog-files.d.ts +41 -0
- package/dist/catalog/catalog-files.js +86 -0
- package/dist/catalog/catalog-import.module.d.ts +7 -0
- package/dist/catalog/catalog-import.module.js +60 -0
- package/dist/catalog/catalog-items.d.ts +290 -0
- package/dist/catalog/catalog-items.js +677 -0
- package/dist/catalog/catalog-scope.service.d.ts +286 -0
- package/dist/catalog/catalog-scope.service.js +1196 -0
- package/dist/catalog/catalog.module.d.ts +12 -0
- package/dist/catalog/catalog.module.js +81 -0
- package/dist/catalog/catalog.service.d.ts +144 -207
- package/dist/catalog/catalog.service.js +258 -528
- package/dist/catalog/claude/agents.js +15 -10
- package/dist/catalog/claude/translate.js +3 -0
- package/dist/catalog/cli.d.ts +14 -3
- package/dist/catalog/cli.js +39 -32
- 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 +90 -0
- package/dist/catalog/component-scope.controller.js +234 -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 +366 -0
- package/dist/catalog/component-scope.service.js +1115 -0
- package/dist/catalog/component-state.d.ts +197 -0
- package/dist/catalog/component-state.js +473 -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 +45 -0
- package/dist/catalog/job-ids.js +40 -0
- package/dist/catalog/jobs.d.ts +27 -0
- package/dist/catalog/jobs.js +70 -0
- package/dist/catalog/locks.d.ts +24 -0
- package/dist/catalog/locks.js +63 -0
- package/dist/catalog/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 +53 -44
- package/dist/catalog/marketplaces.controller.js +146 -51
- package/dist/catalog/marketplaces.schemas.d.ts +48 -0
- package/dist/catalog/marketplaces.schemas.js +53 -0
- package/dist/catalog/marketplaces.service.d.ts +136 -26
- package/dist/catalog/marketplaces.service.js +663 -281
- package/dist/catalog/org-catalog.controller.d.ts +115 -63
- package/dist/catalog/org-catalog.controller.js +207 -100
- package/dist/catalog/org-catalog.schemas.d.ts +88 -0
- package/dist/catalog/org-catalog.schemas.js +93 -0
- package/dist/catalog/org-catalog.service.d.ts +89 -216
- package/dist/catalog/org-catalog.service.js +434 -472
- 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 +113 -0
- package/dist/catalog/org-extension.controller.js +271 -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 +293 -71
- package/dist/catalog/plugin-import.js +1039 -281
- package/dist/catalog/plugin-install.d.ts +271 -66
- package/dist/catalog/plugin-install.js +1198 -344
- package/dist/catalog/plugin-package.d.ts +41 -4
- package/dist/catalog/plugin-package.js +140 -7
- package/dist/catalog/plugin-upgrade.d.ts +312 -188
- package/dist/catalog/plugin-upgrade.js +1371 -1065
- package/dist/catalog/request-rules.d.ts +65 -0
- package/dist/catalog/request-rules.js +217 -0
- package/dist/catalog/requests.service.d.ts +205 -117
- package/dist/catalog/requests.service.js +612 -369
- 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.d.ts +6 -4
- package/dist/channels/actions.js +11 -4
- package/dist/channels/cards.d.ts +33 -11
- package/dist/channels/cards.js +96 -24
- package/dist/channels/channels.module.d.ts +40 -0
- package/dist/channels/channels.module.js +130 -0
- package/dist/channels/channels.schemas.d.ts +37 -0
- package/dist/channels/channels.schemas.js +38 -0
- package/dist/channels/connections.controller.d.ts +44 -37
- package/dist/channels/connections.controller.js +83 -38
- package/dist/channels/connections.service.d.ts +101 -30
- package/dist/channels/connections.service.js +380 -147
- package/dist/channels/inbound.d.ts +44 -38
- package/dist/channels/inbound.js +190 -44
- package/dist/channels/job-ids.d.ts +10 -0
- package/dist/channels/job-ids.js +10 -0
- package/dist/channels/jobs.d.ts +85 -0
- package/dist/channels/jobs.js +157 -0
- package/dist/channels/outbound.d.ts +71 -80
- package/dist/channels/outbound.js +219 -202
- package/dist/channels/phrases.d.ts +33 -2
- package/dist/channels/phrases.js +29 -1
- package/dist/channels/supervisor.d.ts +88 -46
- package/dist/channels/supervisor.js +230 -132
- package/dist/channels/threads.d.ts +34 -8
- package/dist/channels/threads.js +79 -13
- package/dist/channels/webhook.d.ts +20 -14
- package/dist/channels/webhook.js +51 -20
- package/dist/config/docs.js +5 -1
- package/dist/config/load.d.ts +3 -2
- package/dist/config/load.js +3 -2
- package/dist/config/nacos-source.js +11 -2
- package/dist/config/schema.d.ts +36 -2
- package/dist/config/schema.js +226 -25
- package/dist/conversations/access.d.ts +31 -0
- package/dist/conversations/access.js +110 -0
- package/dist/conversations/agent-tree.d.ts +46 -0
- package/dist/conversations/agent-tree.js +92 -0
- package/dist/conversations/artifacts.d.ts +11 -11
- package/dist/conversations/artifacts.js +36 -10
- package/dist/conversations/attachments.controller.d.ts +1 -1
- package/dist/conversations/attachments.controller.js +8 -6
- package/dist/conversations/attachments.module.d.ts +7 -0
- package/dist/conversations/attachments.module.js +25 -0
- package/dist/conversations/attachments.service.d.ts +60 -22
- package/dist/conversations/attachments.service.js +249 -51
- package/dist/conversations/conversations.controller.d.ts +86 -50
- package/dist/conversations/conversations.controller.js +184 -103
- package/dist/conversations/conversations.module.d.ts +8 -0
- package/dist/conversations/conversations.module.js +72 -0
- package/dist/conversations/conversations.schemas.d.ts +52 -0
- package/dist/conversations/conversations.schemas.js +79 -0
- package/dist/conversations/conversations.service.d.ts +166 -49
- package/dist/conversations/conversations.service.js +383 -179
- package/dist/conversations/environment-status.d.ts +24 -0
- package/dist/conversations/environment-status.js +71 -0
- package/dist/conversations/event-log.d.ts +64 -27
- package/dist/conversations/event-log.js +167 -31
- package/dist/conversations/events.d.ts +252 -9
- package/dist/conversations/events.js +243 -32
- package/dist/conversations/files.d.ts +10 -10
- package/dist/conversations/files.js +37 -11
- package/dist/conversations/idem-keys.d.ts +5 -0
- package/dist/conversations/idem-keys.js +5 -0
- package/dist/conversations/job-ids.d.ts +6 -0
- package/dist/conversations/job-ids.js +6 -0
- package/dist/conversations/message-context.d.ts +79 -0
- package/dist/conversations/message-context.js +145 -0
- package/dist/conversations/outputs-read.d.ts +11 -11
- package/dist/conversations/outputs-read.js +31 -7
- package/dist/conversations/queue.d.ts +53 -58
- package/dist/conversations/queue.js +37 -293
- package/dist/conversations/queue.service.d.ts +60 -0
- package/dist/conversations/queue.service.js +350 -0
- package/dist/conversations/titles.d.ts +83 -27
- package/dist/conversations/titles.js +195 -71
- package/dist/conversations/tree.d.ts +17 -0
- package/dist/conversations/tree.js +42 -0
- package/dist/ctx/bus.js +9 -3
- package/dist/ctx/create-ctx.d.ts +26 -1
- package/dist/ctx/create-ctx.js +45 -16
- package/dist/ctx/lock.d.ts +7 -3
- package/dist/ctx/lock.js +9 -20
- package/dist/ctx/secrets.d.ts +10 -2
- package/dist/ctx/secrets.js +7 -3
- package/dist/db/kernel-schema.d.ts +589 -27
- package/dist/db/pool.d.ts +10 -0
- package/dist/db/pool.js +4 -0
- package/dist/devices/device-auth.controller.d.ts +42 -0
- package/dist/devices/device-auth.controller.js +116 -0
- package/dist/devices/device-auth.d.ts +119 -0
- package/dist/devices/device-auth.js +403 -0
- package/dist/devices/device-auth.module.d.ts +7 -0
- package/dist/devices/device-auth.module.js +25 -0
- package/dist/devices/device-gateway.d.ts +128 -0
- package/dist/devices/device-gateway.js +530 -0
- package/dist/devices/device-provider.d.ts +89 -0
- package/dist/devices/device-provider.js +151 -0
- package/dist/devices/device-routes.d.ts +36 -0
- package/dist/devices/device-routes.js +90 -0
- package/dist/devices/devices.module.d.ts +16 -0
- package/dist/devices/devices.module.js +44 -0
- package/dist/devices/dto.d.ts +66 -0
- package/dist/devices/dto.js +44 -0
- package/dist/devices/keys.d.ts +25 -0
- package/dist/devices/keys.js +25 -0
- package/dist/devices/machines.d.ts +118 -0
- package/dist/devices/machines.js +366 -0
- package/dist/devices/relay.d.ts +100 -0
- package/dist/devices/relay.js +373 -0
- package/dist/devices/targets.d.ts +28 -0
- package/dist/devices/targets.js +73 -0
- package/dist/environments/access.d.ts +66 -0
- package/dist/environments/access.js +113 -0
- package/dist/environments/conversation-environments.d.ts +75 -0
- package/dist/environments/conversation-environments.js +231 -0
- package/dist/environments/dto.d.ts +25 -0
- package/dist/environments/dto.js +12 -0
- package/dist/environments/environments.controller.d.ts +36 -0
- package/dist/environments/environments.controller.js +124 -0
- package/dist/environments/environments.module.d.ts +8 -0
- package/dist/environments/environments.module.js +31 -0
- package/dist/environments/environments.schemas.d.ts +3 -0
- package/dist/environments/environments.schemas.js +14 -0
- package/dist/environments/environments.service.d.ts +251 -0
- package/dist/environments/environments.service.js +791 -0
- package/dist/environments/label.d.ts +11 -0
- package/dist/environments/label.js +25 -0
- package/dist/environments/legacy-cleanup.job.d.ts +34 -0
- package/dist/environments/legacy-cleanup.job.js +141 -0
- package/dist/errors.d.ts +160 -2
- package/dist/errors.js +160 -2
- package/dist/evals/budget.d.ts +42 -21
- package/dist/evals/budget.js +114 -62
- package/dist/evals/evals.module.d.ts +31 -0
- package/dist/evals/evals.module.js +114 -0
- package/dist/evals/evals.schemas.d.ts +110 -0
- package/dist/evals/evals.schemas.js +107 -0
- package/dist/evals/jobs.d.ts +20 -0
- package/dist/evals/jobs.js +45 -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 +75 -10
- package/dist/evals/run-replay.js +218 -94
- package/dist/evals/runs.controller.d.ts +3 -58
- package/dist/evals/runs.controller.js +18 -50
- package/dist/evals/runs.service.d.ts +31 -52
- package/dist/evals/runs.service.js +281 -255
- package/dist/evals/sets.controller.d.ts +3 -29
- package/dist/evals/sets.controller.js +18 -39
- package/dist/evals/sets.service.d.ts +29 -13
- package/dist/evals/sets.service.js +262 -202
- package/dist/evals/snapshot.d.ts +5 -4
- package/dist/evals/snapshot.js +17 -4
- package/dist/evals/step-replay.d.ts +6 -8
- package/dist/evals/step-replay.js +17 -10
- package/dist/evals/trajectory.controller.d.ts +1 -1
- package/dist/evals/trajectory.controller.js +11 -7
- package/dist/evals/trajectory.d.ts +2 -2
- package/dist/evals/trajectory.js +1 -1
- package/dist/evals/trajectory.service.d.ts +13 -7
- package/dist/evals/trajectory.service.js +56 -21
- package/dist/evals/worker.d.ts +48 -31
- package/dist/evals/worker.js +229 -124
- package/dist/extensions/admin-ops.d.ts +133 -41
- package/dist/extensions/admin-ops.js +378 -172
- package/dist/extensions/admin-view.d.ts +82 -32
- package/dist/extensions/admin-view.js +284 -71
- package/dist/extensions/approvals.d.ts +24 -10
- package/dist/extensions/approvals.js +73 -46
- package/dist/extensions/blobs.d.ts +27 -10
- package/dist/extensions/blobs.js +112 -45
- package/dist/extensions/bootstrap.d.ts +99 -36
- package/dist/extensions/bootstrap.js +290 -134
- package/dist/extensions/cli.d.ts +32 -10
- package/dist/extensions/cli.js +52 -98
- package/dist/extensions/config-hash.d.ts +10 -0
- package/dist/extensions/config-hash.js +38 -0
- package/dist/extensions/config-issues.d.ts +19 -0
- package/dist/extensions/config-issues.js +48 -0
- 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 +55 -0
- package/dist/extensions/deployment-config-store.js +133 -0
- package/dist/extensions/deployment-config.d.ts +146 -70
- package/dist/extensions/deployment-config.js +439 -246
- package/dist/extensions/display-name.d.ts +22 -0
- package/dist/extensions/display-name.js +77 -0
- package/dist/extensions/effective-config.d.ts +127 -0
- package/dist/extensions/effective-config.js +368 -0
- package/dist/extensions/enabled.d.ts +5 -5
- package/dist/extensions/extensions.module.d.ts +8 -0
- package/dist/extensions/extensions.module.js +96 -0
- package/dist/extensions/hooks.d.ts +40 -6
- package/dist/extensions/hooks.js +83 -17
- package/dist/extensions/host.d.ts +161 -80
- package/dist/extensions/host.js +505 -213
- package/dist/extensions/installs.d.ts +73 -19
- package/dist/extensions/installs.js +174 -37
- package/dist/extensions/job-ids.d.ts +6 -0
- package/dist/extensions/job-ids.js +6 -0
- package/dist/extensions/lifecycle-topics.d.ts +18 -0
- package/dist/extensions/lifecycle-topics.js +18 -0
- package/dist/extensions/lifecycle.d.ts +35 -47
- package/dist/extensions/lifecycle.js +103 -39
- package/dist/extensions/locks.d.ts +45 -0
- package/dist/extensions/locks.js +112 -0
- package/dist/extensions/migrate-lock.d.ts +3 -4
- package/dist/extensions/org-config.d.ts +141 -49
- package/dist/extensions/org-config.js +471 -243
- 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 +14 -1
- package/dist/extensions/package.js +51 -2
- package/dist/extensions/permission-view.d.ts +59 -6
- package/dist/extensions/permission-view.js +7 -5
- package/dist/extensions/plugin-guides.d.ts +129 -0
- package/dist/extensions/plugin-guides.js +283 -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 +50 -2
- package/dist/extensions/registry.js +91 -4
- 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 +19 -10
- package/dist/extensions/sources.js +34 -13
- package/dist/extensions/state.module.d.ts +9 -0
- package/dist/extensions/state.module.js +38 -0
- package/dist/extensions/unavailable.d.ts +50 -0
- package/dist/extensions/unavailable.js +115 -0
- package/dist/files/files.module.d.ts +3 -0
- package/dist/files/files.module.js +22 -0
- package/dist/files/previewers.controller.d.ts +7 -2
- package/dist/files/previewers.controller.js +19 -12
- package/dist/files/previewers.d.ts +21 -19
- package/dist/files/previewers.js +114 -38
- package/dist/files/previewers.schemas.d.ts +10 -0
- package/dist/files/previewers.schemas.js +9 -0
- package/dist/http/adapter.d.ts +3 -0
- package/dist/http/adapter.js +25 -0
- package/dist/http/api.module.d.ts +3 -110
- package/dist/http/api.module.js +93 -358
- package/dist/http/app.d.ts +22 -17
- package/dist/http/app.js +46 -65
- package/dist/http/error-filter.module.d.ts +5 -0
- package/dist/http/error-filter.module.js +18 -0
- package/dist/http/error.filter.js +2 -2
- package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +7 -3
- package/dist/http/gateway-routes.js +16 -0
- 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 +137 -38
- package/dist/identity/accounts.js +386 -186
- package/dist/identity/api-tokens.d.ts +11 -7
- package/dist/identity/api-tokens.js +71 -44
- package/dist/identity/audit.d.ts +9 -5
- package/dist/identity/audit.js +5 -1
- package/dist/identity/auth.controller.d.ts +11 -10
- package/dist/identity/auth.controller.js +40 -30
- package/dist/identity/auth.guard.d.ts +16 -8
- package/dist/identity/auth.guard.js +41 -13
- package/dist/identity/binding.d.ts +9 -11
- package/dist/identity/binding.js +41 -13
- package/dist/identity/cookies.d.ts +26 -5
- package/dist/identity/cookies.js +58 -6
- package/dist/identity/external-identity-lock.d.ts +17 -0
- package/dist/identity/external-identity-lock.js +39 -0
- package/dist/identity/external.d.ts +19 -15
- package/dist/identity/external.js +163 -125
- package/dist/identity/identity.module.d.ts +6 -0
- package/dist/identity/identity.module.js +59 -0
- 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 +32 -15
- package/dist/identity/me.controller.js +80 -33
- 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 +24 -10
- package/dist/identity/sessions.js +119 -42
- package/dist/identity/settings.d.ts +69 -23
- package/dist/identity/settings.js +201 -72
- package/dist/identity/sso.controller.d.ts +7 -7
- package/dist/identity/sso.controller.js +13 -9
- package/dist/identity/sso.d.ts +9 -12
- package/dist/identity/sso.js +54 -24
- package/dist/identity/super-admin.d.ts +20 -0
- package/dist/identity/super-admin.js +81 -0
- package/dist/inbox/inbox.module.d.ts +6 -0
- package/dist/inbox/inbox.module.js +26 -0
- package/dist/inbox/inbox.schemas.d.ts +8 -0
- package/dist/inbox/inbox.schemas.js +11 -0
- package/dist/inbox/inbox.service.d.ts +68 -11
- package/dist/inbox/inbox.service.js +104 -13
- 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 +151 -0
- package/dist/inbox/platform-inbox.service.js +263 -0
- package/dist/inbox/platform-notices.d.ts +19 -0
- package/dist/inbox/platform-notices.js +9 -0
- package/dist/index.d.ts +22 -13
- package/dist/index.js +16 -7
- package/dist/infra/cache/cache.module.d.ts +3 -0
- package/dist/infra/cache/cache.module.js +16 -0
- package/dist/infra/cache/cache.service.d.ts +21 -0
- package/dist/infra/cache/cache.service.js +80 -0
- package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
- package/dist/infra/cache/cacheable.decorator.js +83 -0
- package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
- package/dist/infra/cli/kernel-cli.module.js +173 -0
- package/dist/infra/close-within.d.ts +15 -0
- package/dist/infra/close-within.js +36 -0
- package/dist/infra/config/config.module.d.ts +13 -0
- package/dist/infra/config/config.module.js +39 -0
- package/dist/infra/config/kernel-config.service.d.ts +25 -0
- package/dist/infra/config/kernel-config.service.js +157 -0
- package/dist/infra/database/after-commit.d.ts +6 -0
- package/dist/infra/database/after-commit.js +9 -0
- package/dist/infra/database/database.module.d.ts +25 -0
- package/dist/infra/database/database.module.js +91 -0
- package/dist/infra/database/kernel-db.d.ts +22 -0
- package/dist/infra/database/kernel-db.js +65 -0
- package/dist/infra/database/transaction-host.d.ts +50 -0
- package/dist/infra/database/transaction-host.js +125 -0
- package/dist/infra/database/transactional.decorator.d.ts +15 -0
- package/dist/infra/database/transactional.decorator.js +27 -0
- package/dist/infra/database/xact-lock.d.ts +17 -0
- package/dist/infra/database/xact-lock.js +43 -0
- package/dist/infra/events/kernel-events.d.ts +121 -0
- package/dist/infra/events/kernel-events.js +65 -0
- package/dist/infra/health/health.controller.d.ts +26 -0
- package/dist/infra/health/health.controller.js +104 -0
- package/dist/infra/health/health.module.d.ts +9 -0
- package/dist/infra/health/health.module.js +24 -0
- package/dist/infra/health/health.options.d.ts +10 -0
- package/dist/infra/health/health.options.js +15 -0
- package/dist/infra/health/shutdown-state.d.ts +6 -0
- package/dist/infra/health/shutdown-state.js +2 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
- package/dist/infra/lifecycle/process-guards.d.ts +52 -0
- package/dist/infra/lifecycle/process-guards.js +90 -0
- package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
- package/dist/infra/lifecycle/shutdown-signals.js +48 -0
- package/dist/infra/lock/key-template.d.ts +13 -0
- package/dist/infra/lock/key-template.js +46 -0
- package/dist/infra/lock/lock.module.d.ts +3 -0
- package/dist/infra/lock/lock.module.js +16 -0
- package/dist/infra/lock/lock.service.d.ts +120 -0
- package/dist/infra/lock/lock.service.js +343 -0
- package/dist/infra/lock/shared-lease.d.ts +44 -0
- package/dist/infra/lock/shared-lease.js +121 -0
- package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
- package/dist/infra/lock/with-lock.decorator.js +49 -0
- package/dist/infra/logging/logging.module.d.ts +18 -0
- package/dist/infra/logging/logging.module.js +52 -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/configured-processor.d.ts +18 -0
- package/dist/infra/queue/configured-processor.js +23 -0
- package/dist/infra/queue/job-failure.d.ts +18 -0
- package/dist/infra/queue/job-failure.js +26 -0
- package/dist/infra/queue/queue-shutdown.d.ts +27 -0
- package/dist/infra/queue/queue-shutdown.js +81 -0
- package/dist/infra/queue/queue.module.d.ts +16 -0
- package/dist/infra/queue/queue.module.js +61 -0
- package/dist/infra/queue/redis-connection.d.ts +13 -0
- package/dist/infra/queue/redis-connection.js +25 -0
- package/dist/infra/queue/retired-schedulers.d.ts +7 -0
- package/dist/infra/queue/retired-schedulers.js +9 -0
- package/dist/infra/queue/run-job.d.ts +16 -0
- package/dist/infra/queue/run-job.js +19 -0
- package/dist/infra/redis/redis.module.d.ts +24 -0
- package/dist/infra/redis/redis.module.js +91 -0
- package/dist/infra/schedule/cron-tick.d.ts +12 -0
- package/dist/infra/schedule/cron-tick.js +25 -0
- package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
- package/dist/infra/schedule/locked-cron.decorator.js +53 -0
- package/dist/infra/schedule/locked-interval.d.ts +69 -0
- package/dist/infra/schedule/locked-interval.js +190 -0
- package/dist/infra/schedule/locked-tick.d.ts +90 -0
- package/dist/infra/schedule/locked-tick.js +137 -0
- package/dist/infra/schedule/schedule.module.d.ts +8 -0
- package/dist/infra/schedule/schedule.module.js +27 -0
- package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
- package/dist/infra/schedule/scheduled-runs.js +163 -0
- package/dist/infra/swagger/swagger.d.ts +16 -0
- package/dist/infra/swagger/swagger.js +31 -0
- package/dist/infra/throttler/credential-throttler.d.ts +35 -0
- package/dist/infra/throttler/credential-throttler.js +77 -0
- package/dist/infra/throttler/named-throttlers.d.ts +36 -0
- package/dist/infra/throttler/named-throttlers.js +157 -0
- package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
- package/dist/infra/throttler/redis-throttler-storage.js +130 -0
- package/dist/infra/throttler/throttler.guard.d.ts +23 -0
- package/dist/infra/throttler/throttler.guard.js +68 -0
- package/dist/infra/throttler/throttler.module.d.ts +15 -0
- package/dist/infra/throttler/throttler.module.js +53 -0
- package/dist/infra/tokens.d.ts +20 -0
- package/dist/infra/tokens.js +20 -0
- package/dist/infra/validation/create-zod-dto.d.ts +23 -0
- package/dist/infra/validation/create-zod-dto.js +35 -0
- package/dist/infra/validation/parse-with-zod.d.ts +7 -0
- package/dist/infra/validation/parse-with-zod.js +12 -0
- package/dist/infra/validation/validation.module.d.ts +3 -0
- package/dist/infra/validation/validation.module.js +16 -0
- package/dist/infra/validation/zod-params.d.ts +7 -0
- package/dist/infra/validation/zod-params.js +42 -0
- package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
- package/dist/infra/validation/zod-validation.pipe.js +31 -0
- package/dist/kernel.d.ts +9 -244
- package/dist/kernel.js +8 -1305
- package/dist/kernel.module.d.ts +17 -0
- package/dist/kernel.module.js +145 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
- package/dist/lifecycle/kernel-lifecycle.js +465 -0
- package/dist/lifecycle/tokens.d.ts +3 -0
- package/dist/lifecycle/tokens.js +3 -0
- package/dist/log-context.d.ts +2 -0
- package/dist/log-context.js +4 -0
- package/dist/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 +7 -0
- package/dist/models/models.module.js +36 -0
- 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 +13 -5
- package/dist/models/prices.js +69 -39
- package/dist/models/purposes.controller.d.ts +6 -4
- package/dist/models/purposes.controller.js +16 -11
- package/dist/models/purposes.d.ts +103 -23
- package/dist/models/purposes.js +208 -77
- package/dist/orgs/directory-sync.controller.d.ts +1 -1
- package/dist/orgs/directory-sync.controller.js +2 -2
- package/dist/orgs/directory-sync.d.ts +74 -35
- package/dist/orgs/directory-sync.js +243 -132
- package/dist/orgs/invitations.controller.d.ts +8 -8
- package/dist/orgs/invitations.controller.js +27 -26
- package/dist/orgs/invitations.service.d.ts +12 -9
- package/dist/orgs/invitations.service.js +130 -92
- package/dist/orgs/job-ids.d.ts +8 -0
- package/dist/orgs/job-ids.js +8 -0
- package/dist/orgs/members.service.d.ts +19 -12
- package/dist/orgs/members.service.js +161 -117
- package/dist/orgs/offboarding.d.ts +61 -60
- package/dist/orgs/offboarding.js +206 -95
- package/dist/orgs/org-lock.d.ts +33 -19
- package/dist/orgs/org-lock.js +94 -35
- package/dist/orgs/org.guard.d.ts +11 -1
- package/dist/orgs/org.guard.js +45 -34
- package/dist/orgs/orgs.controller.d.ts +13 -16
- package/dist/orgs/orgs.controller.js +29 -20
- package/dist/orgs/orgs.module.d.ts +6 -0
- package/dist/orgs/orgs.module.js +71 -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 +47 -21
- package/dist/orgs/orgs.service.js +166 -91
- package/dist/orgs/roles.d.ts +1 -1
- package/dist/orgs/roles.js +5 -1
- package/dist/orgs/settings.controller.d.ts +2 -2
- package/dist/orgs/settings.controller.js +8 -6
- package/dist/orgs/settings.service.d.ts +76 -14
- package/dist/orgs/settings.service.js +140 -51
- package/dist/overrides.d.ts +63 -0
- package/dist/overrides.js +34 -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 +683 -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 +94 -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.ops.d.ts +38 -0
- package/dist/platform/ops/admin.ops.js +407 -0
- package/dist/platform/ops/agent-skills.ops.d.ts +24 -0
- package/dist/platform/ops/agent-skills.ops.js +226 -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 +717 -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 +74 -0
- package/dist/platform/ops/catalog-admin.ops.js +599 -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 +188 -0
- package/dist/platform/ops/conversations.ops.d.ts +30 -0
- package/dist/platform/ops/conversations.ops.js +470 -0
- package/dist/platform/ops/environments.ops.d.ts +26 -0
- package/dist/platform/ops/environments.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 +378 -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 +29 -0
- package/dist/platform/ops/org-plugins.ops.js +329 -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 +296 -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/skills.ops.d.ts +17 -0
- package/dist/platform/ops/skills.ops.js +216 -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/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 +40 -0
- package/dist/platform/platform-ops.module.js +127 -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 +66 -0
- package/dist/roles/gateway-role.d.ts +54 -0
- package/dist/roles/gateway-role.js +118 -0
- package/dist/roles/gateway.module.d.ts +9 -0
- package/dist/roles/gateway.module.js +31 -0
- package/dist/roles/worker-role.d.ts +65 -0
- package/dist/roles/worker-role.js +151 -0
- package/dist/roles/worker.module.d.ts +14 -0
- package/dist/roles/worker.module.js +106 -0
- package/dist/runtime/abort.js +19 -2
- package/dist/runtime/checkpointer.d.ts +8 -3
- package/dist/runtime/checkpointer.js +87 -55
- package/dist/runtime/context/build.d.ts +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/environment-paths.d.ts +40 -0
- package/dist/runtime/context/environment-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/conversation-lock.d.ts +20 -11
- package/dist/runtime/conversation-lock.js +62 -72
- package/dist/runtime/hook-calls.d.ts +11 -4
- package/dist/runtime/hook-calls.js +41 -13
- package/dist/runtime/job-ids.d.ts +10 -0
- package/dist/runtime/job-ids.js +10 -0
- package/dist/runtime/langgraph-loop.d.ts +3 -1
- package/dist/runtime/langgraph-loop.js +37 -18
- package/dist/runtime/loop.d.ts +42 -6
- package/dist/runtime/loop.js +14 -0
- package/dist/runtime/maintenance-queue.d.ts +10 -0
- package/dist/runtime/maintenance-queue.js +10 -0
- package/dist/runtime/maintenance.d.ts +50 -74
- package/dist/runtime/maintenance.js +166 -137
- package/dist/runtime/model-call.d.ts +61 -15
- package/dist/runtime/model-call.js +128 -84
- package/dist/runtime/providers.d.ts +158 -27
- package/dist/runtime/providers.js +373 -63
- package/dist/runtime/quota.d.ts +17 -3
- package/dist/runtime/quota.js +27 -2
- package/dist/runtime/retired-schedulers.d.ts +7 -0
- package/dist/runtime/retired-schedulers.js +31 -0
- package/dist/runtime/run-context.service.d.ts +65 -0
- package/dist/runtime/run-context.service.js +236 -0
- package/dist/runtime/run-control.d.ts +43 -0
- package/dist/runtime/run-control.js +89 -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 +27 -18
- package/dist/runtime/run-finish.js +98 -51
- package/dist/runtime/run-jobs.d.ts +46 -0
- package/dist/runtime/run-jobs.js +91 -0
- package/dist/runtime/run-processors.d.ts +60 -0
- package/dist/runtime/run-processors.js +185 -0
- package/dist/runtime/run-queue.d.ts +90 -58
- package/dist/runtime/run-queue.js +566 -297
- package/dist/runtime/run-steps.d.ts +39 -0
- package/dist/runtime/run-steps.js +96 -0
- package/dist/runtime/run-worker.d.ts +134 -77
- package/dist/runtime/run-worker.js +412 -237
- package/dist/runtime/runtime.module.d.ts +10 -0
- package/dist/runtime/runtime.module.js +122 -0
- package/dist/runtime/step-log.d.ts +51 -0
- package/dist/runtime/step-log.js +111 -0
- package/dist/runtime/stream.controller.d.ts +28 -9
- package/dist/runtime/stream.controller.js +72 -13
- package/dist/runtime/stream.d.ts +27 -6
- package/dist/runtime/stream.js +102 -7
- package/dist/runtime/subagents/child.d.ts +58 -51
- package/dist/runtime/subagents/child.js +105 -86
- package/dist/runtime/subagents/definition.d.ts +32 -28
- package/dist/runtime/subagents/definition.js +89 -143
- package/dist/runtime/subagents/deliveries.d.ts +71 -0
- package/dist/runtime/subagents/deliveries.js +228 -0
- package/dist/runtime/subagents/dispatch.d.ts +197 -27
- package/dist/runtime/subagents/dispatch.js +336 -270
- package/dist/runtime/subagents/limits.d.ts +32 -8
- package/dist/runtime/subagents/limits.js +44 -8
- package/dist/runtime/subagents/messages.d.ts +95 -0
- package/dist/runtime/subagents/messages.js +328 -0
- package/dist/runtime/subagents/org-agents.d.ts +4 -4
- package/dist/runtime/subagents/org-agents.js +3 -2
- package/dist/runtime/subagents/preamble.d.ts +4 -4
- package/dist/runtime/subagents/preamble.js +9 -7
- package/dist/runtime/subagents/progress.d.ts +10 -8
- 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 +27 -10
- package/dist/runtime/subagents/roster.js +49 -13
- package/dist/runtime/subagents/skill-fork.d.ts +10 -10
- package/dist/runtime/subagents/skill-fork.js +23 -8
- 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 +43 -0
- package/dist/runtime/subagents/subagents.service.js +106 -0
- 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 +121 -83
- package/dist/runtime/usage-report.js +355 -181
- package/dist/runtime/waits.d.ts +258 -81
- package/dist/runtime/waits.js +800 -263
- package/dist/sandbox/job-ids.d.ts +10 -0
- package/dist/sandbox/job-ids.js +10 -0
- package/dist/sandbox/jobs.d.ts +68 -0
- package/dist/sandbox/jobs.js +150 -0
- package/dist/sandbox/leases.d.ts +73 -82
- package/dist/sandbox/leases.js +162 -346
- package/dist/sandbox/providers.d.ts +46 -0
- package/dist/sandbox/providers.js +83 -0
- package/dist/sandbox/sandbox.module.d.ts +9 -0
- package/dist/sandbox/sandbox.module.js +36 -0
- package/dist/sandbox/sandbox.service.d.ts +359 -151
- package/dist/sandbox/sandbox.service.js +950 -435
- package/dist/sandbox/unreachable.d.ts +30 -0
- package/dist/sandbox/unreachable.js +108 -0
- package/dist/skills/catalog.d.ts +40 -26
- package/dist/skills/catalog.js +120 -99
- package/dist/skills/changes.controller.d.ts +11 -4
- package/dist/skills/changes.controller.js +34 -9
- package/dist/skills/changes.service.d.ts +31 -21
- package/dist/skills/changes.service.js +426 -368
- package/dist/skills/invocable.controller.d.ts +2 -2
- package/dist/skills/invocable.controller.js +10 -7
- package/dist/skills/invocation-keys.d.ts +1 -1
- package/dist/skills/invocation-keys.js +1 -1
- package/dist/skills/invoke.d.ts +19 -18
- package/dist/skills/invoke.js +68 -24
- package/dist/skills/package.d.ts +20 -1
- package/dist/skills/package.js +28 -1
- package/dist/skills/skills.controller.d.ts +33 -7
- package/dist/skills/skills.controller.js +79 -12
- package/dist/skills/skills.module.d.ts +6 -0
- package/dist/skills/skills.module.js +39 -0
- package/dist/skills/skills.schemas.d.ts +48 -0
- package/dist/skills/skills.schemas.js +61 -0
- package/dist/skills/skills.service.d.ts +151 -44
- package/dist/skills/skills.service.js +636 -204
- package/dist/skills/usable.d.ts +81 -0
- package/dist/skills/usable.js +379 -0
- package/dist/storage/job-ids.d.ts +6 -0
- package/dist/storage/job-ids.js +6 -0
- package/dist/storage/purge.d.ts +22 -7
- package/dist/storage/purge.js +55 -3
- package/dist/storage/storage.module.d.ts +6 -0
- package/dist/storage/storage.module.js +23 -0
- package/dist/storage/storage.service.d.ts +18 -4
- package/dist/storage/storage.service.js +44 -3
- package/dist/themes/render-css.d.ts +12 -0
- package/dist/themes/render-css.js +132 -0
- package/dist/themes/theme-delivery.service.d.ts +34 -0
- package/dist/themes/theme-delivery.service.js +111 -0
- package/dist/themes/theme-state.d.ts +95 -0
- package/dist/themes/theme-state.js +203 -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 +28 -0
- package/dist/themes/themes-public.controller.js +92 -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/approvals.controller.d.ts +1 -1
- package/dist/tools/approvals.controller.js +14 -11
- package/dist/tools/approvals.schemas.d.ts +21 -0
- package/dist/tools/approvals.schemas.js +15 -0
- package/dist/tools/approvals.service.d.ts +53 -27
- package/dist/tools/approvals.service.js +365 -260
- package/dist/tools/breaker.d.ts +2 -2
- package/dist/tools/breaker.js +21 -3
- package/dist/tools/builtin-names.d.ts +109 -0
- package/dist/tools/builtin-names.js +173 -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 +3 -3
- package/dist/tools/builtins/ask-user.js +3 -3
- package/dist/tools/builtins/builtin-tools.d.ts +41 -0
- package/dist/tools/builtins/builtin-tools.js +151 -0
- 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 +3 -3
- package/dist/tools/builtins/read-tool-output.js +3 -3
- package/dist/tools/builtins/sandbox/bash.d.ts +5 -5
- package/dist/tools/builtins/sandbox/bash.js +293 -41
- package/dist/tools/builtins/sandbox/common.d.ts +137 -37
- 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 +21 -18
- package/dist/tools/builtins/sandbox/edit.d.ts +1 -1
- package/dist/tools/builtins/sandbox/edit.js +65 -51
- 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 +19 -14
- package/dist/tools/builtins/sandbox/grep.d.ts +7 -4
- package/dist/tools/builtins/sandbox/grep.js +155 -36
- 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 +30 -20
- 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 +52 -45
- 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 +32 -21
- package/dist/tools/builtins/skill-load.js +125 -74
- package/dist/tools/builtins/skill-write.d.ts +4 -4
- package/dist/tools/builtins/skill-write.js +12 -12
- 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/canonical-json.d.ts +6 -0
- package/dist/tools/canonical-json.js +16 -0
- package/dist/tools/connector-content.controller.d.ts +1 -1
- package/dist/tools/connector-content.controller.js +11 -6
- package/dist/tools/connector-content.d.ts +12 -15
- package/dist/tools/connector-content.js +53 -18
- package/dist/tools/connectors.controller.d.ts +16 -3
- package/dist/tools/connectors.controller.js +34 -14
- package/dist/tools/connectors.schemas.d.ts +12 -0
- package/dist/tools/connectors.schemas.js +19 -0
- package/dist/tools/connectors.service.d.ts +80 -18
- package/dist/tools/connectors.service.js +529 -358
- package/dist/tools/credentials.d.ts +20 -20
- package/dist/tools/credentials.js +55 -34
- package/dist/tools/display-names.d.ts +9 -0
- package/dist/tools/display-names.js +24 -0
- package/dist/tools/drift.d.ts +29 -41
- package/dist/tools/drift.js +116 -84
- package/dist/tools/elicitation.js +1 -1
- package/dist/tools/extension-tools.controller.d.ts +14 -0
- package/dist/tools/extension-tools.controller.js +37 -0
- package/dist/tools/info.d.ts +73 -13
- package/dist/tools/info.js +151 -39
- package/dist/tools/job-ids.d.ts +13 -0
- package/dist/tools/job-ids.js +15 -0
- package/dist/tools/jobs.d.ts +24 -0
- package/dist/tools/jobs.js +69 -0
- package/dist/tools/legacy-data.d.ts +34 -0
- package/dist/tools/legacy-data.js +76 -0
- package/dist/tools/legacy-keys.d.ts +51 -0
- package/dist/tools/legacy-keys.js +115 -0
- package/dist/tools/naming.d.ts +1 -5
- package/dist/tools/naming.js +1 -7
- package/dist/tools/oauth/flow-paths.d.ts +16 -0
- package/dist/tools/oauth/flow-paths.js +38 -0
- package/dist/tools/oauth/flow.d.ts +30 -30
- package/dist/tools/oauth/flow.js +109 -81
- package/dist/tools/oauth/oauth.controller.d.ts +3 -3
- package/dist/tools/oauth/oauth.controller.js +12 -9
- package/dist/tools/oauth/tokens.d.ts +45 -10
- package/dist/tools/oauth/tokens.js +70 -24
- package/dist/tools/org-tool-switches.d.ts +88 -0
- package/dist/tools/org-tool-switches.js +201 -0
- package/dist/tools/outputs.d.ts +13 -4
- package/dist/tools/outputs.js +48 -4
- package/dist/tools/pipeline.d.ts +108 -80
- package/dist/tools/pipeline.js +396 -409
- package/dist/tools/policy.d.ts +4 -17
- package/dist/tools/policy.js +49 -35
- package/dist/tools/questions.controller.d.ts +2 -2
- package/dist/tools/questions.controller.js +9 -6
- package/dist/tools/questions.service.d.ts +26 -25
- package/dist/tools/questions.service.js +201 -142
- package/dist/tools/registry.d.ts +215 -84
- package/dist/tools/registry.js +382 -264
- package/dist/tools/resources.d.ts +1 -1
- package/dist/tools/resources.js +1 -1
- package/dist/tools/specs.d.ts +5 -4
- package/dist/tools/specs.js +3 -1
- package/dist/tools/tools.module.d.ts +10 -0
- package/dist/tools/tools.module.js +113 -0
- package/dist/tools/validate.js +1 -1
- package/dist/ui/call-extension.d.ts +16 -0
- package/dist/ui/call-extension.js +38 -0
- package/dist/ui/embed-token.d.ts +9 -5
- package/dist/ui/embed-token.js +34 -6
- package/dist/ui/ui-stream.d.ts +22 -17
- package/dist/ui/ui-stream.js +72 -12
- package/dist/ui/ui.module.d.ts +7 -0
- package/dist/ui/ui.module.js +28 -0
- package/dist/ui/views.controller.d.ts +14 -12
- package/dist/ui/views.controller.js +32 -25
- package/dist/ui/views.d.ts +10 -57
- package/dist/ui/views.js +58 -46
- package/package.json +13 -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/dist/catalog/upgrade-targets.d.ts +0 -59
- package/dist/catalog/upgrade-targets.js +0 -90
- package/dist/conversations/sandbox-status.d.ts +0 -21
- package/dist/conversations/sandbox-status.js +0 -24
- package/dist/extensions/org-config.controller.d.ts +0 -24
- package/dist/extensions/org-config.controller.js +0 -59
- package/dist/http/gateway.module.js +0 -13
- package/dist/http/health.controller.d.ts +0 -26
- package/dist/http/health.controller.js +0 -79
- package/dist/http/tokens.d.ts +0 -131
- package/dist/http/tokens.js +0 -131
- package/dist/http/zod.pipe.d.ts +0 -8
- package/dist/http/zod.pipe.js +0 -14
- package/dist/identity/enterprise-admin.d.ts +0 -14
- package/dist/identity/enterprise-admin.js +0 -27
- package/dist/identity/rate-limit.d.ts +0 -55
- package/dist/identity/rate-limit.js +0 -121
- package/dist/sandbox/lifecycle.d.ts +0 -21
- package/dist/sandbox/lifecycle.js +0 -68
- package/dist/tools/builtins/sandbox/names.d.ts +0 -7
- package/dist/tools/builtins/sandbox/names.js +0 -20
|
@@ -0,0 +1,1115 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
10
|
+
import { createHash } from "node:crypto";
|
|
11
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
12
|
+
import { sql } from "kysely";
|
|
13
|
+
import { templateTypeClashes, templateTypeOf } from "../agents/templates.js";
|
|
14
|
+
import { ApiError } from "../errors.js";
|
|
15
|
+
import { audit } from "../identity/audit.js";
|
|
16
|
+
import { SuperAdminLock } from "../identity/super-admin.js";
|
|
17
|
+
import { notifyItemShared } from "../inbox/org-notices.js";
|
|
18
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
19
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
20
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
21
|
+
import { OrgLock } from "../orgs/org-lock.js";
|
|
22
|
+
import { themeDefinitions, themeSwatches } from "../themes/theme-state.js";
|
|
23
|
+
import { assertNotPlatformDefault, platformDefaultThemeId, themesPreview, } from "../themes/theme-usage.js";
|
|
24
|
+
import { assertOrgsExist } from "./catalog-items.js";
|
|
25
|
+
import { ComponentPromotion, notOwnedError, PROMOTION_ATTEMPTS, PromotionStale, promotionStaleError, } from "./component-promotion.js";
|
|
26
|
+
import { agentsUsing, COMPONENT_KINDS, componentLocked, componentOffered, componentOn, componentPluginOn, connectorsMadeFrom, listedIn, loadComponents, loadScopeState, pluginFactsOf, skillNameClashes, switchOf, themeIdClashes, } from "./component-state.js";
|
|
27
|
+
import { assertOwnerListed, assertShareable, assertShareableTarget, newlySharedWith, ownerOf, ownersOf, } from "./ownership.js";
|
|
28
|
+
const notFound = () => new ApiError("component.not_found", "Component not found");
|
|
29
|
+
const staleError = () => new ApiError("plugin.scope_stale", "What this change affects has changed since the preview; preview it again and confirm the new hash");
|
|
30
|
+
const builtinError = () => new ApiError("plugin.builtin", "This component belongs to a built-in plugin: it is on in every organization and its scope cannot be changed or disabled");
|
|
31
|
+
/** The org action that manages a kind of component (the org admin's). */
|
|
32
|
+
const ACTION = {
|
|
33
|
+
skill: "skills.manage",
|
|
34
|
+
agent_template: "agents.manage",
|
|
35
|
+
connector_template: "connectors.manage",
|
|
36
|
+
theme: "org.update",
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* 409 `plugin.skill_conflict` listing the orgs whose own skills use a component's name (rule 10);
|
|
40
|
+
* for a theme 409 `theme.id_taken` listing the orgs where another theme with its id is on (details
|
|
41
|
+
* `[{ theme, orgId, themes, plugins }]`);
|
|
42
|
+
* for an agent template 409 `agent_template.name_taken` listing the orgs that already use its
|
|
43
|
+
* roster type (ruling P4-13; details `[{ orgId, type, templateId, owner }]`, one per clashing
|
|
44
|
+
* template, `owner` as save-as names it).
|
|
45
|
+
*/
|
|
46
|
+
export function nameConflictError(conflicts, kind = "skill") {
|
|
47
|
+
if (kind === "theme") {
|
|
48
|
+
return new ApiError("theme.id_taken", conflicts
|
|
49
|
+
.map((c) => `A theme with id ${c.name} is already on in organization ${c.orgName} (plugin "${c.plugins.join('", "')}"); one theme id cannot be on there twice. Switch that theme off there first.`)
|
|
50
|
+
.join("\n"), conflicts.map((c) => ({
|
|
51
|
+
theme: c.name,
|
|
52
|
+
orgId: c.orgId,
|
|
53
|
+
themes: c.themes ?? [],
|
|
54
|
+
plugins: c.plugins,
|
|
55
|
+
})));
|
|
56
|
+
}
|
|
57
|
+
if (kind === "agent_template") {
|
|
58
|
+
// the save-as wording (ruling P4-9), naming each clashing template's owner
|
|
59
|
+
const whose = (o, orgId) => o === undefined || o.kind === "platform"
|
|
60
|
+
? "the platform's"
|
|
61
|
+
: o.orgId === orgId
|
|
62
|
+
? "its own"
|
|
63
|
+
: `from organization ${o.name}`;
|
|
64
|
+
return new ApiError("agent_template.name_taken", conflicts
|
|
65
|
+
.map((c) => `An agent template named ${c.name} is already used in organization ${c.orgName} (${c.skills.map((_, i) => whose(c.owners?.[i], c.orgId)).join(", ")}); one name cannot be offered there twice.`)
|
|
66
|
+
.join("\n"), conflicts.flatMap((c) => c.skills.map((templateId, i) => ({
|
|
67
|
+
orgId: c.orgId,
|
|
68
|
+
type: c.name,
|
|
69
|
+
templateId,
|
|
70
|
+
owner: c.owners?.[i] ?? { kind: "platform" },
|
|
71
|
+
}))));
|
|
72
|
+
}
|
|
73
|
+
return new ApiError("plugin.skill_conflict", conflicts
|
|
74
|
+
.map((c) => `Skill "${c.name}" is already used in organization ${c.orgName} (${c.plugins.length > 0 ? `plugin "${c.plugins.join('", "')}"` : "its own skill"}); it would be offered there twice.`)
|
|
75
|
+
.join("\n"), conflicts.map((c) => ({
|
|
76
|
+
skill: c.name,
|
|
77
|
+
orgId: c.orgId,
|
|
78
|
+
skills: c.skills,
|
|
79
|
+
source: c.plugins.length > 0
|
|
80
|
+
? { kind: "plugin", name: c.plugins[0], version: "" }
|
|
81
|
+
: { kind: "org" },
|
|
82
|
+
})));
|
|
83
|
+
}
|
|
84
|
+
/** The hash of a preview: sha256 over its sorted JSON, the target included. */
|
|
85
|
+
function previewHash(c, target, p) {
|
|
86
|
+
return createHash("sha256")
|
|
87
|
+
.update(JSON.stringify({
|
|
88
|
+
component: { kind: c.kind, id: c.id },
|
|
89
|
+
target: { ...target, orgs: [...target.orgs].sort() },
|
|
90
|
+
affected: [...p.affected]
|
|
91
|
+
.sort((a, b) => a.orgId.localeCompare(b.orgId))
|
|
92
|
+
.map((a) => ({ ...a, agents: [...a.agents].sort((x, y) => x.id.localeCompare(y.id)) })),
|
|
93
|
+
conflicts: [...p.conflicts].sort((a, b) => a.orgId.localeCompare(b.orgId)),
|
|
94
|
+
// only when present: a preview without themes keeps the hash it had before themes
|
|
95
|
+
...(p.themes !== undefined && { themes: p.themes }),
|
|
96
|
+
}))
|
|
97
|
+
.digest("hex");
|
|
98
|
+
}
|
|
99
|
+
/** The confirm hash of an org switch-off preview. */
|
|
100
|
+
function switchHash(orgId, c, preview) {
|
|
101
|
+
return createHash("sha256")
|
|
102
|
+
.update(JSON.stringify({ orgId, kind: c.kind, id: c.id, ...preview }))
|
|
103
|
+
.digest("hex");
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Component scope and org switches (plugin scope phase 2, Task 6; spec §5 rules 2, 5, 8, 10, 11,
|
|
107
|
+
* §13.5). The super admin gives a platform component its own scope (`all` / `optional` / `named`),
|
|
108
|
+
* sends it back to following its plugin, disables it on the whole deployment or shows it to other
|
|
109
|
+
* orgs; each change that takes something away is previewed and confirmed with `scopeHash`
|
|
110
|
+
* (recomputed under the component row lock; a difference -> 409 `plugin.scope_stale`), and one that
|
|
111
|
+
* would offer a skill to an org whose own skill has its name is refused (409 `plugin.skill_conflict`).
|
|
112
|
+
* An org admin switches one component on or off in the org (only that component, rule 5); one of a
|
|
113
|
+
* builtin plugin -> 409 `plugin.scope_locked` (an `all` one may go off, layering spec §4); switching
|
|
114
|
+
* off something in use is previewed with its agents first.
|
|
115
|
+
* Name clashes are checked for skills, agent templates by their roster type, and themes by their
|
|
116
|
+
* id among the themes on in an org (themes spec §6). A change that would take the platform default
|
|
117
|
+
* theme away from an org is refused (409 `theme.platform_default`, themes spec §7). Components are
|
|
118
|
+
* resolved at read time (skills/usable.ts, agents/templates.ts), so nothing is enqueued.
|
|
119
|
+
* Stateless, shared by every replica.
|
|
120
|
+
*/
|
|
121
|
+
let ComponentScopeService = class ComponentScopeService {
|
|
122
|
+
kdb;
|
|
123
|
+
adminLock;
|
|
124
|
+
orgLock;
|
|
125
|
+
promotion;
|
|
126
|
+
txHost;
|
|
127
|
+
constructor(kdb, adminLock,
|
|
128
|
+
/** The org row lock (orgs/org-lock.ts): joins the caller's transaction. */
|
|
129
|
+
orgLock,
|
|
130
|
+
/** Promote on share (ruling P3-3): an org row shown or associated becomes a platform row. */
|
|
131
|
+
promotion, txHost) {
|
|
132
|
+
this.kdb = kdb;
|
|
133
|
+
this.adminLock = adminLock;
|
|
134
|
+
this.orgLock = orgLock;
|
|
135
|
+
this.promotion = promotion;
|
|
136
|
+
this.txHost = txHost;
|
|
137
|
+
}
|
|
138
|
+
get db() {
|
|
139
|
+
return this.kdb.db;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* What the admin routes act on (ruling P3-23): the platform component `id`, an org row the org
|
|
143
|
+
* promoted already (its platform row), or an org's own row not promoted yet. A connector
|
|
144
|
+
* template or a theme has no org rows; anything else -> 404 `component.not_found`.
|
|
145
|
+
*/
|
|
146
|
+
async resolve(kind, id) {
|
|
147
|
+
const [c] = await loadComponents(this.db, kind, { ids: [id] });
|
|
148
|
+
if (c)
|
|
149
|
+
return { c };
|
|
150
|
+
if (kind === "connector_template" || kind === "theme")
|
|
151
|
+
throw notFound();
|
|
152
|
+
const org = await this.promotion.orgRow(kind, id);
|
|
153
|
+
if (!org)
|
|
154
|
+
throw notFound();
|
|
155
|
+
if (org.link === null)
|
|
156
|
+
return { org };
|
|
157
|
+
const [linked] = await loadComponents(this.db, kind, { ids: [org.link] });
|
|
158
|
+
if (!linked)
|
|
159
|
+
throw notFound();
|
|
160
|
+
return { c: linked };
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Runs `write` with the org row prepared for promotion ({@link ComponentPromotion.prepare}, files
|
|
164
|
+
* copied before the transaction), preparing again when the row changed meanwhile.
|
|
165
|
+
*/
|
|
166
|
+
async withPromotion(kind, orgRowId, write) {
|
|
167
|
+
for (let attempt = 1;; attempt++) {
|
|
168
|
+
const prepared = await this.promotion.prepare(kind, orgRowId);
|
|
169
|
+
try {
|
|
170
|
+
return await write(prepared);
|
|
171
|
+
}
|
|
172
|
+
catch (e) {
|
|
173
|
+
await this.promotion.discard(prepared);
|
|
174
|
+
if (!(e instanceof PromotionStale))
|
|
175
|
+
throw e;
|
|
176
|
+
if (attempt >= PROMOTION_ATTEMPTS)
|
|
177
|
+
throw promotionStaleError();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/** The platform components of `kind`, with their effective scope and the orgs they are on in. */
|
|
182
|
+
async list(kind) {
|
|
183
|
+
const comps = await loadComponents(this.db, kind);
|
|
184
|
+
const st = await loadScopeState(this.db, kind, comps);
|
|
185
|
+
const orgs = await this.liveOrgs();
|
|
186
|
+
const owners = await ownersOf(this.db, comps.flatMap((c) => (c.ownerOrgId === null ? [] : [c.ownerOrgId])));
|
|
187
|
+
// a theme's name and swatches come from its current definition (the admin pickers, §10)
|
|
188
|
+
const defs = kind === "theme"
|
|
189
|
+
? await themeDefinitions(this.db, comps.map((c) => c.id))
|
|
190
|
+
: null;
|
|
191
|
+
const platform = comps.map((c) => {
|
|
192
|
+
const def = defs?.get(c.id)?.definition;
|
|
193
|
+
const plugin = c.itemId === null ? undefined : st.plugins.get(c.itemId);
|
|
194
|
+
const follow = c.scopeMode === "follow" && c.itemId !== null;
|
|
195
|
+
const scope = follow
|
|
196
|
+
? plugin?.builtin
|
|
197
|
+
? "all"
|
|
198
|
+
: (plugin?.scope ?? c.scope)
|
|
199
|
+
: c.scope;
|
|
200
|
+
const list = follow
|
|
201
|
+
? (st.pluginListed.get(c.itemId) ?? new Set())
|
|
202
|
+
: (st.listed.get(c.id) ?? new Set());
|
|
203
|
+
return {
|
|
204
|
+
kind,
|
|
205
|
+
id: c.id,
|
|
206
|
+
name: c.name,
|
|
207
|
+
description: c.description,
|
|
208
|
+
plugin: c.plugin,
|
|
209
|
+
itemId: c.itemId,
|
|
210
|
+
owner: ownerOf(c.ownerOrgId, owners),
|
|
211
|
+
shareable: c.shareable,
|
|
212
|
+
promoted: c.itemId === null && c.originOrgId !== null,
|
|
213
|
+
builtin: plugin?.builtin === true,
|
|
214
|
+
scopeMode: c.scopeMode,
|
|
215
|
+
scope,
|
|
216
|
+
orgs: scope === "named" ? [...list].sort() : [],
|
|
217
|
+
disabled: c.disabled,
|
|
218
|
+
pluginStopped: c.itemId !== null && (plugin === undefined || plugin.disabled),
|
|
219
|
+
shownToOthers: c.shownToOthers,
|
|
220
|
+
version: c.version,
|
|
221
|
+
onIn: orgs
|
|
222
|
+
.filter((o) => this.on(c, st, o.id))
|
|
223
|
+
.map((o) => o.id)
|
|
224
|
+
.sort(),
|
|
225
|
+
offCount: scope === "all" && plugin?.builtin !== true
|
|
226
|
+
? orgs.filter((o) => switchOf(st, c.id, o.id) === false).length
|
|
227
|
+
: 0,
|
|
228
|
+
...(def !== undefined && { theme: { name: def.name, swatches: themeSwatches(def) } }),
|
|
229
|
+
};
|
|
230
|
+
});
|
|
231
|
+
const owned = await this.orgOwned(kind, orgs);
|
|
232
|
+
return [...platform, ...owned].sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* The platform components offered to the org (`kind` / `itemId`: only those), by kind then name:
|
|
236
|
+
* on there, or visible to it and not stopped on the deployment (spec §5 rules 5, 11, §13.5).
|
|
237
|
+
*/
|
|
238
|
+
async orgList(orgId, filter) {
|
|
239
|
+
const out = [];
|
|
240
|
+
// the platform default theme is locked on in every org (themes spec §7)
|
|
241
|
+
const uiTheme = await platformDefaultThemeId(this.db);
|
|
242
|
+
for (const kind of filter.kind !== undefined ? [filter.kind] : COMPONENT_KINDS) {
|
|
243
|
+
const comps = await loadComponents(this.db, kind, filter.itemId !== undefined ? { itemId: filter.itemId } : {});
|
|
244
|
+
const st = await loadScopeState(this.db, kind, comps);
|
|
245
|
+
const linked = await this.linkedCopies(orgId, kind);
|
|
246
|
+
const owners = await ownersOf(this.db, comps.flatMap((c) => (c.ownerOrgId === null ? [] : [c.ownerOrgId])));
|
|
247
|
+
const rows = [];
|
|
248
|
+
for (const c of comps) {
|
|
249
|
+
const p = pluginFactsOf(st, c.itemId, orgId);
|
|
250
|
+
const listed = listedIn(st, c.id, orgId);
|
|
251
|
+
const sw = switchOf(st, c.id, orgId);
|
|
252
|
+
const on = componentOn(c, p, listed, sw);
|
|
253
|
+
if (!on && !componentOffered(c, p, listed))
|
|
254
|
+
continue;
|
|
255
|
+
const locked = componentLocked(c, p) || isUiTheme(c, uiTheme);
|
|
256
|
+
const pluginOn = componentPluginOn(c, p);
|
|
257
|
+
rows.push({
|
|
258
|
+
kind,
|
|
259
|
+
id: c.id,
|
|
260
|
+
name: c.name,
|
|
261
|
+
description: c.description,
|
|
262
|
+
plugin: c.plugin,
|
|
263
|
+
itemId: c.itemId,
|
|
264
|
+
version: c.version,
|
|
265
|
+
scopeMode: c.scopeMode,
|
|
266
|
+
switch: sw,
|
|
267
|
+
on,
|
|
268
|
+
locked,
|
|
269
|
+
pluginOn,
|
|
270
|
+
switchable: !locked && pluginOn,
|
|
271
|
+
platformDefault: !locked && (c.scopeMode === "follow" ? p?.scope === "all" : c.scope === "all"),
|
|
272
|
+
linkedIds: linked.get(c.id) ?? [],
|
|
273
|
+
owner: ownerOf(c.ownerOrgId, owners),
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
rows.sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
|
|
277
|
+
out.push(...rows);
|
|
278
|
+
}
|
|
279
|
+
return out;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* The org's copies of platform skills or agent templates linked without a pin (ruling B2), by
|
|
283
|
+
* platform id: they resolve to it, so agents that select them use it (none for connector
|
|
284
|
+
* templates and themes).
|
|
285
|
+
*/
|
|
286
|
+
async linkedCopies(orgId, kind) {
|
|
287
|
+
const out = new Map();
|
|
288
|
+
if (kind === "connector_template" || kind === "theme")
|
|
289
|
+
return out;
|
|
290
|
+
const rows = kind === "skill"
|
|
291
|
+
? await this.db
|
|
292
|
+
.selectFrom("skills")
|
|
293
|
+
.select(["id", "platform_skill_id as link"])
|
|
294
|
+
.where("org_id", "=", orgId)
|
|
295
|
+
.where("scope", "=", "org")
|
|
296
|
+
.where("deleted_at", "is", null)
|
|
297
|
+
.where("pinned_version", "is", null)
|
|
298
|
+
.where("platform_skill_id", "is not", null)
|
|
299
|
+
.orderBy("id")
|
|
300
|
+
.execute()
|
|
301
|
+
: await this.db
|
|
302
|
+
.selectFrom("agent_templates")
|
|
303
|
+
.select(["id", "platform_template_id as link"])
|
|
304
|
+
.where("org_id", "=", orgId)
|
|
305
|
+
.where("deleted_at", "is", null)
|
|
306
|
+
.where("pinned_version", "is", null)
|
|
307
|
+
.where("platform_template_id", "is not", null)
|
|
308
|
+
.orderBy("id")
|
|
309
|
+
.execute();
|
|
310
|
+
for (const r of rows) {
|
|
311
|
+
const k = r.link;
|
|
312
|
+
out.set(k, [...(out.get(k) ?? []), r.id]);
|
|
313
|
+
}
|
|
314
|
+
return out;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* The orgs' own skills (org scope) and agent templates, not linked to a platform component
|
|
318
|
+
* (ruling P2-11): listed read-only, on in their org only. Connector templates have none; an
|
|
319
|
+
* org's own theme is a platform_themes row with its org as owner, listed with the platform ones.
|
|
320
|
+
*/
|
|
321
|
+
async orgOwned(kind, orgs) {
|
|
322
|
+
if (kind === "connector_template" || kind === "theme")
|
|
323
|
+
return [];
|
|
324
|
+
const live = new Set(orgs.map((o) => o.id));
|
|
325
|
+
const rows = kind === "skill"
|
|
326
|
+
? await this.db
|
|
327
|
+
.selectFrom("skills as s")
|
|
328
|
+
.leftJoin("catalog_items as c", "c.id", "s.catalog_item_id")
|
|
329
|
+
.select([
|
|
330
|
+
"s.id",
|
|
331
|
+
"s.org_id",
|
|
332
|
+
"s.name",
|
|
333
|
+
"s.description",
|
|
334
|
+
"s.current_version",
|
|
335
|
+
"s.catalog_item_id",
|
|
336
|
+
"s.shareable",
|
|
337
|
+
"c.name as plugin",
|
|
338
|
+
])
|
|
339
|
+
.where("s.scope", "=", "org")
|
|
340
|
+
.where("s.deleted_at", "is", null)
|
|
341
|
+
.where("s.platform_skill_id", "is", null)
|
|
342
|
+
.execute()
|
|
343
|
+
: (await this.db
|
|
344
|
+
.selectFrom("agent_templates")
|
|
345
|
+
.select([
|
|
346
|
+
"id",
|
|
347
|
+
"org_id",
|
|
348
|
+
"name",
|
|
349
|
+
"current_version",
|
|
350
|
+
"catalog_item_id",
|
|
351
|
+
"shareable",
|
|
352
|
+
"plugin_name as plugin",
|
|
353
|
+
])
|
|
354
|
+
.where("deleted_at", "is", null)
|
|
355
|
+
.where("platform_template_id", "is", null)
|
|
356
|
+
.execute()).map((r) => ({ ...r, description: null }));
|
|
357
|
+
const kept = rows.filter((r) => live.has(r.org_id));
|
|
358
|
+
const owners = await ownersOf(this.db, kept.map((r) => r.org_id));
|
|
359
|
+
return kept.map((r) => ({
|
|
360
|
+
kind,
|
|
361
|
+
id: r.id,
|
|
362
|
+
name: r.name,
|
|
363
|
+
description: r.description,
|
|
364
|
+
plugin: r.plugin,
|
|
365
|
+
itemId: r.catalog_item_id,
|
|
366
|
+
owner: ownerOf(r.org_id, owners),
|
|
367
|
+
shareable: r.shareable,
|
|
368
|
+
promoted: false,
|
|
369
|
+
builtin: false,
|
|
370
|
+
scopeMode: "own",
|
|
371
|
+
scope: "named",
|
|
372
|
+
orgs: [r.org_id],
|
|
373
|
+
disabled: false,
|
|
374
|
+
pluginStopped: false,
|
|
375
|
+
shownToOthers: false,
|
|
376
|
+
version: String(r.current_version),
|
|
377
|
+
onIn: [r.org_id],
|
|
378
|
+
offCount: 0,
|
|
379
|
+
}));
|
|
380
|
+
}
|
|
381
|
+
/** The preview of a scope change, a disable or a return to following the plugin (nothing written). */
|
|
382
|
+
async preview(kind, id, target) {
|
|
383
|
+
const r = await this.resolve(kind, id);
|
|
384
|
+
if ("c" in r) {
|
|
385
|
+
const c = await this.component(kind, r.c.id, false);
|
|
386
|
+
return this.compute(c, await this.targetOf(c, target), { hashId: id });
|
|
387
|
+
}
|
|
388
|
+
// an org row not promoted yet (P3-23): as the platform row it would become, `named: [owner]`;
|
|
389
|
+
// a disable is platform-only
|
|
390
|
+
if ("disabled" in target)
|
|
391
|
+
throw notFound();
|
|
392
|
+
const v = virtualOf(r.org);
|
|
393
|
+
const listed = [r.org.orgId];
|
|
394
|
+
return this.compute(v, await this.targetOf(v, target, listed), { hashId: id, listed });
|
|
395
|
+
}
|
|
396
|
+
/** Gives the component its own scope, or makes it follow its plugin again, after its preview. */
|
|
397
|
+
async setScope(actor, kind, id, body, opts = {}) {
|
|
398
|
+
const { scopeHash, ...target } = body;
|
|
399
|
+
const r = await this.resolve(kind, id);
|
|
400
|
+
if ("c" in r) {
|
|
401
|
+
await this.writeScope(actor, kind, r.c.id, target, scopeHash, opts, { hashId: id });
|
|
402
|
+
return this.view(kind, r.c.id);
|
|
403
|
+
}
|
|
404
|
+
// An org row not promoted yet (P3-23): a change that shows it to another org promotes it first
|
|
405
|
+
// (ruling P3-3), after the owner and share gate checks on the org row and the preview's hash
|
|
406
|
+
const v = virtualOf(r.org);
|
|
407
|
+
const listed = [r.org.orgId];
|
|
408
|
+
const t = await this.targetOf(v, target, listed);
|
|
409
|
+
if (t.scopeMode === "own" && t.scope === "named" && t.orgs.join() === listed.join()) {
|
|
410
|
+
return this.view(kind, id);
|
|
411
|
+
}
|
|
412
|
+
assertPromotable(r.org);
|
|
413
|
+
assertOwnerListed(gateRow(v), t);
|
|
414
|
+
assertShareable(gateRow(v));
|
|
415
|
+
const p = await this.compute(v, t, { hashId: id, listed });
|
|
416
|
+
if (p.scopeHash !== scopeHash)
|
|
417
|
+
throw staleError();
|
|
418
|
+
if (p.conflicts.length > 0)
|
|
419
|
+
throw nameConflictError(p.conflicts, kind);
|
|
420
|
+
const promotable = kind;
|
|
421
|
+
const written = await this.withPromotion(promotable, id, (prepared) => this.writeScope(actor, kind, prepared.platformId, target, scopeHash, opts, {
|
|
422
|
+
hashId: id,
|
|
423
|
+
promote: prepared,
|
|
424
|
+
}));
|
|
425
|
+
return this.view(kind, written);
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Disables the component on the whole deployment (after its preview, `scopeHash` required) or
|
|
429
|
+
* enables it again (no hash; refused while an org it would be offered to has a skill of its name).
|
|
430
|
+
*/
|
|
431
|
+
async setDisabled(actor, kind, id, body, opts = {}) {
|
|
432
|
+
if (body.disabled && body.scopeHash === undefined) {
|
|
433
|
+
throw new ApiError("validation_failed", "scopeHash: required when disabling (from POST scope/preview with disabled: true)", [{ path: "scopeHash", message: "required when disabling" }]);
|
|
434
|
+
}
|
|
435
|
+
await this.writeDisabled(actor, kind, id, body.disabled, body.scopeHash, opts);
|
|
436
|
+
return this.view(kind, id);
|
|
437
|
+
}
|
|
438
|
+
/** Shows or hides the component to orgs outside its `named` list (never makes it usable). */
|
|
439
|
+
async setShown(actor, kind, id, shown, opts = {}) {
|
|
440
|
+
const r = await this.resolve(kind, id);
|
|
441
|
+
if ("c" in r) {
|
|
442
|
+
await this.writeShown(actor, kind, r.c.id, shown, opts);
|
|
443
|
+
return this.view(kind, r.c.id);
|
|
444
|
+
}
|
|
445
|
+
// An org row not promoted yet is shown to nobody: hiding it changes nothing; showing it goes
|
|
446
|
+
// through the share gate on the org row, then promotes it (rulings P3-3, P3-23)
|
|
447
|
+
if (!shown)
|
|
448
|
+
return this.view(kind, id);
|
|
449
|
+
assertPromotable(r.org);
|
|
450
|
+
assertShareable(gateRow(virtualOf(r.org)));
|
|
451
|
+
const written = await this.withPromotion(kind, id, (prepared) => this.writeShown(actor, kind, prepared.platformId, true, opts, prepared));
|
|
452
|
+
return this.view(kind, written);
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* The org admin's switch of one component (`PUT orgs/:orgId/components/:kind/:id/switch`): only
|
|
456
|
+
* this component (rule 5). A component not offered to the org -> 404. On: refused while the
|
|
457
|
+
* component or its plugin is disabled (`plugin.disabled`) or an own skill of the org has its name
|
|
458
|
+
* (`plugin.skill_conflict`, rule 10; a theme: `theme.id_taken`). Off: the platform default theme
|
|
459
|
+
* while it is on -> `theme.platform_default`; of a builtin plugin -> `plugin.scope_locked`; while it
|
|
460
|
+
* is on, without `confirm` the preview (agents that use it) and its hash are returned, with the
|
|
461
|
+
* current hash the switch is written (a changed preview -> `plugin.switch_stale`).
|
|
462
|
+
*/
|
|
463
|
+
async setSwitch(orgId, actor, kind, id, body, actorTokenId, auditDetail) {
|
|
464
|
+
await this.orgLock.lockAndAuthorize(orgId, actor, ACTION[kind]);
|
|
465
|
+
// The rows an unshare narrows (ruling P3-25) are locked before the scope is read, in its order
|
|
466
|
+
// (plugin, then component): a switch-on never commits against a scope narrowed meanwhile
|
|
467
|
+
const [found] = await loadComponents(this.db, kind, { ids: [id] });
|
|
468
|
+
if (!found)
|
|
469
|
+
throw notFound();
|
|
470
|
+
if (found.itemId !== null)
|
|
471
|
+
await lockItemShared(this.db, found.itemId);
|
|
472
|
+
const [c] = await loadComponents(this.db, kind, { ids: [id], forUpdate: true });
|
|
473
|
+
if (!c)
|
|
474
|
+
throw notFound();
|
|
475
|
+
const st = await loadScopeState(this.db, kind, [c]);
|
|
476
|
+
const p = pluginFactsOf(st, c.itemId, orgId);
|
|
477
|
+
const listed = listedIn(st, c.id, orgId);
|
|
478
|
+
const sw = switchOf(st, c.id, orgId);
|
|
479
|
+
const on = componentOn(c, p, listed, sw);
|
|
480
|
+
// Disabled on the deployment (the component or its plugin): it keeps its scope, so the org's
|
|
481
|
+
// switch can still be turned off, never on; one its scope does not offer the org is unknown
|
|
482
|
+
const stopped = c.disabled || (p?.live === true && p.disabled);
|
|
483
|
+
const offered = componentOffered({ ...c, disabled: false }, p && { ...p, disabled: false }, listed);
|
|
484
|
+
if (!on && !offered)
|
|
485
|
+
throw notFound();
|
|
486
|
+
if (body.enabled && stopped) {
|
|
487
|
+
throw new ApiError("plugin.disabled", "This component is disabled by the super admin and cannot be switched on");
|
|
488
|
+
}
|
|
489
|
+
if (body.enabled) {
|
|
490
|
+
if (kind === "theme") {
|
|
491
|
+
// theme ids are unique among the themes on in the org (themes spec §6)
|
|
492
|
+
if (!on && componentOn(c, p, listed, true)) {
|
|
493
|
+
const clash = await themeIdClashes(this.db, orgId, c, c.name);
|
|
494
|
+
if (clash.length > 0) {
|
|
495
|
+
const [org] = await this.liveOrgs(orgId);
|
|
496
|
+
throw nameConflictError([
|
|
497
|
+
{
|
|
498
|
+
orgId,
|
|
499
|
+
orgName: org?.name ?? orgId,
|
|
500
|
+
name: c.name,
|
|
501
|
+
skills: [],
|
|
502
|
+
themes: clash.map((x) => x.id),
|
|
503
|
+
plugins: clash.map((x) => x.plugin ?? "platform"),
|
|
504
|
+
},
|
|
505
|
+
], kind);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
else if (kind !== "connector_template" && !on) {
|
|
510
|
+
const clash = kind === "skill"
|
|
511
|
+
? await skillNameClashes(this.db, orgId, c, c.name)
|
|
512
|
+
: await templateTypeClashes(this.db, orgId, c);
|
|
513
|
+
if (clash.skills.length > 0) {
|
|
514
|
+
const [org] = await this.liveOrgs(orgId);
|
|
515
|
+
const name = kind === "skill" ? c.name : templateTypeOf(c.plugin, c.name);
|
|
516
|
+
throw nameConflictError([{ orgId, orgName: org?.name ?? orgId, name, ...clash }], kind);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
else {
|
|
521
|
+
// The platform default theme is locked on in every org (themes spec §7): refused before the
|
|
522
|
+
// preview, inside this transaction
|
|
523
|
+
if (kind === "theme" && on)
|
|
524
|
+
await assertNotPlatformDefault(this.db, [c.id], () => "narrower");
|
|
525
|
+
if (componentLocked(c, p)) {
|
|
526
|
+
throw new ApiError("plugin.scope_locked", "This component belongs to a built-in plugin: it is on for every organization and cannot be switched off here");
|
|
527
|
+
}
|
|
528
|
+
if (on) {
|
|
529
|
+
const themes = kind === "theme"
|
|
530
|
+
? await themesPreview(this.db, new Map([[c.id, new Set([orgId])]]))
|
|
531
|
+
: undefined;
|
|
532
|
+
const preview = {
|
|
533
|
+
agents: await agentsUsing(this.db, orgId, kind, [c.id]),
|
|
534
|
+
connectorsKept: kind === "connector_template" ? await connectorsMadeFrom(this.db, orgId, c.id) : 0,
|
|
535
|
+
// a theme only: other kinds keep the preview (and the hash) they had before themes
|
|
536
|
+
...(themes !== undefined && { themes }),
|
|
537
|
+
};
|
|
538
|
+
const confirm = switchHash(orgId, c, preview);
|
|
539
|
+
if (body.confirm === undefined)
|
|
540
|
+
return { kind: "preview", preview, confirm };
|
|
541
|
+
if (body.confirm !== confirm) {
|
|
542
|
+
throw new ApiError("plugin.switch_stale", "What switching this component off affects has changed; review it and confirm again");
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
if (sw !== body.enabled) {
|
|
547
|
+
await this.db
|
|
548
|
+
.insertInto("component_org_switches")
|
|
549
|
+
.values({
|
|
550
|
+
kind,
|
|
551
|
+
component_id: c.id,
|
|
552
|
+
org_id: orgId,
|
|
553
|
+
enabled: body.enabled,
|
|
554
|
+
updated_by: actor,
|
|
555
|
+
})
|
|
556
|
+
.onConflict((oc) => oc.columns(["kind", "component_id", "org_id"]).doUpdateSet({
|
|
557
|
+
enabled: body.enabled,
|
|
558
|
+
updated_by: actor,
|
|
559
|
+
updated_at: sql `now()`,
|
|
560
|
+
}))
|
|
561
|
+
.execute();
|
|
562
|
+
await audit(this.db, {
|
|
563
|
+
actorAccountId: actor,
|
|
564
|
+
...(actorTokenId !== undefined && { actorTokenId }),
|
|
565
|
+
orgId,
|
|
566
|
+
action: "component.org_switched",
|
|
567
|
+
target: c.id,
|
|
568
|
+
detail: {
|
|
569
|
+
kind,
|
|
570
|
+
name: c.name,
|
|
571
|
+
plugin: c.plugin,
|
|
572
|
+
from: sw,
|
|
573
|
+
to: body.enabled,
|
|
574
|
+
...auditDetail,
|
|
575
|
+
},
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
return {
|
|
579
|
+
kind: "done",
|
|
580
|
+
component: {
|
|
581
|
+
kind,
|
|
582
|
+
id: c.id,
|
|
583
|
+
name: c.name,
|
|
584
|
+
plugin: c.plugin,
|
|
585
|
+
switch: body.enabled,
|
|
586
|
+
on: componentOn(c, p, listed, body.enabled),
|
|
587
|
+
locked: componentLocked(c, p) || isUiTheme(c, await platformDefaultThemeId(this.db)),
|
|
588
|
+
},
|
|
589
|
+
};
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* What {@link setSwitch} would do to the org's switch, read-only (the Platform tool's preview):
|
|
593
|
+
* the component as the org sees it, whether it is `stopped` on the deployment, and for one that
|
|
594
|
+
* is on and can be switched off the preview of the agents that lose it with the `confirm` hash
|
|
595
|
+
* the switch-off needs (both null otherwise). Unknown or not offered -> 404 `component.not_found`.
|
|
596
|
+
*/
|
|
597
|
+
async switchPreview(orgId, kind, id) {
|
|
598
|
+
const [c] = await loadComponents(this.db, kind, { ids: [id] });
|
|
599
|
+
if (!c)
|
|
600
|
+
throw notFound();
|
|
601
|
+
const st = await loadScopeState(this.db, kind, [c]);
|
|
602
|
+
const p = pluginFactsOf(st, c.itemId, orgId);
|
|
603
|
+
const listed = listedIn(st, c.id, orgId);
|
|
604
|
+
const sw = switchOf(st, c.id, orgId);
|
|
605
|
+
const on = componentOn(c, p, listed, sw);
|
|
606
|
+
const stopped = c.disabled || (p?.live === true && p.disabled);
|
|
607
|
+
const offered = componentOffered({ ...c, disabled: false }, p && { ...p, disabled: false }, listed);
|
|
608
|
+
if (!on && !offered)
|
|
609
|
+
throw notFound();
|
|
610
|
+
const locked = componentLocked(c, p) || isUiTheme(c, await platformDefaultThemeId(this.db));
|
|
611
|
+
let preview = null;
|
|
612
|
+
let confirm = null;
|
|
613
|
+
if (on && !locked) {
|
|
614
|
+
preview = {
|
|
615
|
+
agents: await agentsUsing(this.db, orgId, kind, [c.id]),
|
|
616
|
+
connectorsKept: kind === "connector_template" ? await connectorsMadeFrom(this.db, orgId, c.id) : 0,
|
|
617
|
+
};
|
|
618
|
+
confirm = switchHash(orgId, c, preview);
|
|
619
|
+
}
|
|
620
|
+
return {
|
|
621
|
+
component: { kind, id: c.id, name: c.name, plugin: c.plugin, switch: sw, on, locked },
|
|
622
|
+
stopped,
|
|
623
|
+
preview,
|
|
624
|
+
confirm,
|
|
625
|
+
};
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* `x.hashId`: the id the preview was asked for (an org row's id before its promotion);
|
|
629
|
+
* `x.promote`: the org row to promote first, in this transaction. Returns the id written.
|
|
630
|
+
*/
|
|
631
|
+
async writeScope(actor, kind, id, target, hash, opts, x) {
|
|
632
|
+
await this.adminLock.lockAndAuthorize(actor);
|
|
633
|
+
if (x.promote)
|
|
634
|
+
id = await this.promotion.promote(x.promote, actor);
|
|
635
|
+
const c = await this.component(kind, id, true);
|
|
636
|
+
const t = await this.targetOf(c, target);
|
|
637
|
+
if (kind === "theme")
|
|
638
|
+
await this.assertKeepsPlatformDefault(c, t);
|
|
639
|
+
const from = await this.listed(kind, id);
|
|
640
|
+
// Its own scope: the owner stays listed (P3-17), widening goes through the share gate (P3-16);
|
|
641
|
+
// following the plugin again takes the plugin's scope, which its own writer gates
|
|
642
|
+
if (t.scopeMode === "own") {
|
|
643
|
+
assertOwnerListed(gateRow(c), t);
|
|
644
|
+
assertShareableTarget(gateRow(c), await this.effectiveScope(c, from), t);
|
|
645
|
+
}
|
|
646
|
+
const p = await this.compute(c, t, { hashId: x.hashId });
|
|
647
|
+
if (p.scopeHash !== hash)
|
|
648
|
+
throw staleError();
|
|
649
|
+
if (p.conflicts.length > 0)
|
|
650
|
+
throw nameConflictError(p.conflicts, kind);
|
|
651
|
+
if (c.scopeMode === t.scopeMode && c.scope === t.scope && from.join() === t.orgs.join()) {
|
|
652
|
+
return id;
|
|
653
|
+
}
|
|
654
|
+
const before = await this.effectiveScope(c, from);
|
|
655
|
+
await this.db
|
|
656
|
+
.updateTable(TABLE[kind])
|
|
657
|
+
.set({
|
|
658
|
+
scope_mode: t.scopeMode,
|
|
659
|
+
scope: t.scope,
|
|
660
|
+
scope_version: sql `scope_version + 1`,
|
|
661
|
+
updated_at: sql `now()`,
|
|
662
|
+
})
|
|
663
|
+
.where("id", "=", id)
|
|
664
|
+
.execute();
|
|
665
|
+
await this.db
|
|
666
|
+
.deleteFrom("component_scope_orgs")
|
|
667
|
+
.where("kind", "=", kind)
|
|
668
|
+
.where("component_id", "=", id)
|
|
669
|
+
.execute();
|
|
670
|
+
if (t.scopeMode === "own" && t.orgs.length > 0) {
|
|
671
|
+
await this.db
|
|
672
|
+
.insertInto("component_scope_orgs")
|
|
673
|
+
.values(t.orgs.map((org_id) => ({ kind, component_id: id, org_id })))
|
|
674
|
+
.execute();
|
|
675
|
+
}
|
|
676
|
+
// An own scope that newly shows an org-owned component tells its owner (P3-22); not a theme:
|
|
677
|
+
// the `item_shared` notice names plugins, skills and agent templates only
|
|
678
|
+
if (t.scopeMode === "own" && kind !== "connector_template" && kind !== "theme") {
|
|
679
|
+
const shared = newlySharedWith(before, t);
|
|
680
|
+
if (shared === "all_orgs" || shared.length > 0) {
|
|
681
|
+
await notifyItemShared(this.db, c.ownerOrgId, { kind, id }, c.name, shared);
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
await audit(this.db, {
|
|
685
|
+
actorAccountId: actor,
|
|
686
|
+
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
687
|
+
action: "component.scope_changed",
|
|
688
|
+
target: id,
|
|
689
|
+
detail: {
|
|
690
|
+
kind,
|
|
691
|
+
name: c.name,
|
|
692
|
+
plugin: c.plugin,
|
|
693
|
+
from: { scopeMode: c.scopeMode, scope: c.scope, orgs: from },
|
|
694
|
+
to: { scopeMode: t.scopeMode, scope: t.scope, orgs: t.orgs },
|
|
695
|
+
...opts.auditDetail,
|
|
696
|
+
},
|
|
697
|
+
});
|
|
698
|
+
return id;
|
|
699
|
+
}
|
|
700
|
+
async writeDisabled(actor, kind, id, disabled, hash, opts) {
|
|
701
|
+
await this.adminLock.lockAndAuthorize(actor);
|
|
702
|
+
const c = await this.component(kind, id, true);
|
|
703
|
+
if (c.disabled === disabled)
|
|
704
|
+
return;
|
|
705
|
+
const t = await this.targetOf(c, { disabled });
|
|
706
|
+
if (kind === "theme")
|
|
707
|
+
await this.assertKeepsPlatformDefault(c, t);
|
|
708
|
+
const p = await this.compute(c, t);
|
|
709
|
+
if (disabled && p.scopeHash !== hash)
|
|
710
|
+
throw staleError();
|
|
711
|
+
if (p.conflicts.length > 0)
|
|
712
|
+
throw nameConflictError(p.conflicts, kind);
|
|
713
|
+
await this.db
|
|
714
|
+
.updateTable(TABLE[kind])
|
|
715
|
+
.set({
|
|
716
|
+
disabled,
|
|
717
|
+
scope_version: sql `scope_version + 1`,
|
|
718
|
+
updated_at: sql `now()`,
|
|
719
|
+
})
|
|
720
|
+
.where("id", "=", id)
|
|
721
|
+
.execute();
|
|
722
|
+
await audit(this.db, {
|
|
723
|
+
actorAccountId: actor,
|
|
724
|
+
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
725
|
+
action: "component.scope_changed",
|
|
726
|
+
target: id,
|
|
727
|
+
detail: {
|
|
728
|
+
kind,
|
|
729
|
+
name: c.name,
|
|
730
|
+
plugin: c.plugin,
|
|
731
|
+
disabled: { from: c.disabled, to: disabled },
|
|
732
|
+
...opts.auditDetail,
|
|
733
|
+
},
|
|
734
|
+
});
|
|
735
|
+
}
|
|
736
|
+
/** `promote`: the org row to promote first, in this transaction. Returns the id written. */
|
|
737
|
+
async writeShown(actor, kind, id, shown, opts, promote) {
|
|
738
|
+
await this.adminLock.lockAndAuthorize(actor);
|
|
739
|
+
if (promote)
|
|
740
|
+
id = await this.promotion.promote(promote, actor);
|
|
741
|
+
const [c] = await loadComponents(this.db, kind, { ids: [id], forUpdate: true });
|
|
742
|
+
if (!c)
|
|
743
|
+
throw notFound();
|
|
744
|
+
// Showing goes through the share gate (P3-16); hiding is always allowed
|
|
745
|
+
if (shown)
|
|
746
|
+
assertShareable(gateRow(c));
|
|
747
|
+
if (c.shownToOthers === shown)
|
|
748
|
+
return id;
|
|
749
|
+
await this.db
|
|
750
|
+
.updateTable(TABLE[kind])
|
|
751
|
+
.set({ shown_to_others: shown, updated_at: sql `now()` })
|
|
752
|
+
.where("id", "=", id)
|
|
753
|
+
.execute();
|
|
754
|
+
await audit(this.db, {
|
|
755
|
+
actorAccountId: actor,
|
|
756
|
+
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
757
|
+
action: "component.shown_changed",
|
|
758
|
+
target: id,
|
|
759
|
+
detail: {
|
|
760
|
+
kind,
|
|
761
|
+
name: c.name,
|
|
762
|
+
plugin: c.plugin,
|
|
763
|
+
from: c.shownToOthers,
|
|
764
|
+
to: shown,
|
|
765
|
+
...opts.auditDetail,
|
|
766
|
+
},
|
|
767
|
+
});
|
|
768
|
+
return id;
|
|
769
|
+
}
|
|
770
|
+
/**
|
|
771
|
+
* A live component's versions, newest first. A connector template keeps no history: its one entry
|
|
772
|
+
* is the current version. Missing (or removed) -> 404 `component.not_found`.
|
|
773
|
+
*/
|
|
774
|
+
async versions(kind, id) {
|
|
775
|
+
const r = await this.resolve(kind, id);
|
|
776
|
+
if ("org" in r)
|
|
777
|
+
return this.orgOwnedVersions(kind, id);
|
|
778
|
+
const c = r.c;
|
|
779
|
+
id = c.id;
|
|
780
|
+
if (kind === "connector_template") {
|
|
781
|
+
const row = await this.db
|
|
782
|
+
.selectFrom("platform_connector_templates")
|
|
783
|
+
.select("updated_at")
|
|
784
|
+
.where("id", "=", id)
|
|
785
|
+
.executeTakeFirstOrThrow();
|
|
786
|
+
return [
|
|
787
|
+
{
|
|
788
|
+
version: c.version,
|
|
789
|
+
catalogVersion: c.version,
|
|
790
|
+
updatedOnOwn: false,
|
|
791
|
+
createdAt: row.updated_at.toISOString(),
|
|
792
|
+
},
|
|
793
|
+
];
|
|
794
|
+
}
|
|
795
|
+
const rows = kind === "skill"
|
|
796
|
+
? await this.db
|
|
797
|
+
.selectFrom("platform_skill_versions")
|
|
798
|
+
.select(["version", "catalog_version", "updated_on_own", "created_at"])
|
|
799
|
+
.where("skill_id", "=", id)
|
|
800
|
+
.orderBy("version", "desc")
|
|
801
|
+
.execute()
|
|
802
|
+
: kind === "theme"
|
|
803
|
+
? await this.db
|
|
804
|
+
.selectFrom("platform_theme_versions")
|
|
805
|
+
.select(["version", "catalog_version", "updated_on_own", "created_at"])
|
|
806
|
+
.where("theme_id", "=", id)
|
|
807
|
+
.orderBy("version", "desc")
|
|
808
|
+
.execute()
|
|
809
|
+
: await this.db
|
|
810
|
+
.selectFrom("platform_agent_template_versions")
|
|
811
|
+
.select(["version", "catalog_version", "updated_on_own", "created_at"])
|
|
812
|
+
.where("template_id", "=", id)
|
|
813
|
+
.orderBy("version", "desc")
|
|
814
|
+
.execute();
|
|
815
|
+
return rows.map((r) => ({
|
|
816
|
+
version: String(r.version),
|
|
817
|
+
catalogVersion: r.catalog_version,
|
|
818
|
+
updatedOnOwn: r.updated_on_own,
|
|
819
|
+
createdAt: r.created_at.toISOString(),
|
|
820
|
+
}));
|
|
821
|
+
}
|
|
822
|
+
/** An org-owned skill's or agent template's versions (ruling P2-11); else 404. */
|
|
823
|
+
async orgOwnedVersions(kind, id) {
|
|
824
|
+
const owned = (await this.list(kind)).find((x) => x.id === id && x.owner.kind === "org");
|
|
825
|
+
if (!owned)
|
|
826
|
+
throw notFound();
|
|
827
|
+
const rows = kind === "skill"
|
|
828
|
+
? await this.db
|
|
829
|
+
.selectFrom("skill_versions")
|
|
830
|
+
.select(["version", "catalog_version", "created_at"])
|
|
831
|
+
.where("skill_id", "=", id)
|
|
832
|
+
.orderBy("version", "desc")
|
|
833
|
+
.execute()
|
|
834
|
+
: await this.db
|
|
835
|
+
.selectFrom("agent_template_versions")
|
|
836
|
+
.select(["version", "catalog_version", "created_at"])
|
|
837
|
+
.where("template_id", "=", id)
|
|
838
|
+
.orderBy("version", "desc")
|
|
839
|
+
.execute();
|
|
840
|
+
return rows.map((r) => ({
|
|
841
|
+
version: String(r.version),
|
|
842
|
+
catalogVersion: r.catalog_version,
|
|
843
|
+
updatedOnOwn: false,
|
|
844
|
+
createdAt: r.created_at.toISOString(),
|
|
845
|
+
}));
|
|
846
|
+
}
|
|
847
|
+
async view(kind, id) {
|
|
848
|
+
const v = (await this.list(kind)).find((x) => x.id === id);
|
|
849
|
+
if (!v)
|
|
850
|
+
throw notFound();
|
|
851
|
+
return v;
|
|
852
|
+
}
|
|
853
|
+
/** The live component (row locked with `forUpdate`); missing -> 404, of a builtin plugin -> 409. */
|
|
854
|
+
async component(kind, id, forUpdate) {
|
|
855
|
+
const [c] = await loadComponents(this.db, kind, { ids: [id], forUpdate });
|
|
856
|
+
if (!c)
|
|
857
|
+
throw notFound();
|
|
858
|
+
if (c.itemId !== null) {
|
|
859
|
+
const item = await this.db
|
|
860
|
+
.selectFrom("catalog_items")
|
|
861
|
+
.select("builtin")
|
|
862
|
+
.where("id", "=", c.itemId)
|
|
863
|
+
.executeTakeFirst();
|
|
864
|
+
if (item?.builtin)
|
|
865
|
+
throw builtinError();
|
|
866
|
+
}
|
|
867
|
+
return c;
|
|
868
|
+
}
|
|
869
|
+
/**
|
|
870
|
+
* The scope that offers the component now: its own (`listed`: its own list), or for `follow` its
|
|
871
|
+
* plugin's (`all` for a builtin or deleted plugin: the widest, so nothing counts as widening).
|
|
872
|
+
*/
|
|
873
|
+
async effectiveScope(c, listed) {
|
|
874
|
+
if (c.scopeMode === "own" || c.itemId === null)
|
|
875
|
+
return { scope: c.scope, orgs: listed };
|
|
876
|
+
const item = await this.db
|
|
877
|
+
.selectFrom("catalog_items")
|
|
878
|
+
.select(["scope", "builtin"])
|
|
879
|
+
.where("id", "=", c.itemId)
|
|
880
|
+
.where("deleted_at", "is", null)
|
|
881
|
+
.executeTakeFirst();
|
|
882
|
+
if (!item || item.builtin)
|
|
883
|
+
return { scope: "all", orgs: [] };
|
|
884
|
+
const rows = await this.db
|
|
885
|
+
.selectFrom("catalog_item_scope_orgs")
|
|
886
|
+
.select("org_id")
|
|
887
|
+
.where("item_id", "=", c.itemId)
|
|
888
|
+
.execute();
|
|
889
|
+
return { scope: item.scope, orgs: rows.map((r) => r.org_id) };
|
|
890
|
+
}
|
|
891
|
+
/** The component's own `named` list, sorted. */
|
|
892
|
+
async listed(kind, id) {
|
|
893
|
+
const rows = await this.db
|
|
894
|
+
.selectFrom("component_scope_orgs")
|
|
895
|
+
.select("org_id")
|
|
896
|
+
.where("kind", "=", kind)
|
|
897
|
+
.where("component_id", "=", id)
|
|
898
|
+
.orderBy("org_id")
|
|
899
|
+
.execute();
|
|
900
|
+
return rows.map((r) => r.org_id);
|
|
901
|
+
}
|
|
902
|
+
/**
|
|
903
|
+
* The state after the change: `orgs` only with `named`, each a live org. `listed`: the list now
|
|
904
|
+
* (an org row not promoted yet: `[owner]`), else read.
|
|
905
|
+
*/
|
|
906
|
+
async targetOf(c, target, listed) {
|
|
907
|
+
const now = {
|
|
908
|
+
scopeMode: c.scopeMode,
|
|
909
|
+
scope: c.scope,
|
|
910
|
+
orgs: listed ?? (await this.listed(c.kind, c.id)),
|
|
911
|
+
disabled: c.disabled,
|
|
912
|
+
};
|
|
913
|
+
if ("disabled" in target)
|
|
914
|
+
return { ...now, disabled: target.disabled };
|
|
915
|
+
if ("follow" in target) {
|
|
916
|
+
if (c.itemId === null) {
|
|
917
|
+
throw new ApiError("validation_failed", "follow: this component has no plugin to follow", [
|
|
918
|
+
{ path: "follow", message: "the component has no plugin" },
|
|
919
|
+
]);
|
|
920
|
+
}
|
|
921
|
+
return { ...now, scopeMode: "follow", orgs: [] };
|
|
922
|
+
}
|
|
923
|
+
if (target.orgs !== undefined && target.scope !== "named") {
|
|
924
|
+
throw new ApiError("validation_failed", "orgs: only allowed with scope named", [
|
|
925
|
+
{ path: "orgs", message: "only allowed with scope named" },
|
|
926
|
+
]);
|
|
927
|
+
}
|
|
928
|
+
const orgs = [...new Set(target.orgs ?? [])].sort();
|
|
929
|
+
await assertOrgsExist(this.db, orgs);
|
|
930
|
+
return { scopeMode: "own", scope: target.scope, orgs, disabled: c.disabled };
|
|
931
|
+
}
|
|
932
|
+
/**
|
|
933
|
+
* 409 `theme.platform_default` when theme `c` is the platform default and `t` would leave it
|
|
934
|
+
* narrower than `all` or gone (themes spec §7), in the caller's transaction, before any write.
|
|
935
|
+
*/
|
|
936
|
+
async assertKeepsPlatformDefault(c, t) {
|
|
937
|
+
const after = await this.themeAfter(c, t);
|
|
938
|
+
await assertNotPlatformDefault(this.db, [c.id], () => after);
|
|
939
|
+
}
|
|
940
|
+
/**
|
|
941
|
+
* Theme `c`'s availability under `t`: gone when disabled (or its plugin is disabled or deleted
|
|
942
|
+
* while it follows it), else `all` when its effective scope (its own, or its plugin's; builtin:
|
|
943
|
+
* `all`) is `all`, else narrower.
|
|
944
|
+
*/
|
|
945
|
+
async themeAfter(c, t) {
|
|
946
|
+
if (t.disabled)
|
|
947
|
+
return "gone";
|
|
948
|
+
if (t.scopeMode === "own")
|
|
949
|
+
return t.scope === "all" ? "all" : "narrower";
|
|
950
|
+
if (c.itemId === null)
|
|
951
|
+
return "gone";
|
|
952
|
+
const item = await this.db
|
|
953
|
+
.selectFrom("catalog_items")
|
|
954
|
+
.select(["scope", "builtin", "disabled"])
|
|
955
|
+
.where("id", "=", c.itemId)
|
|
956
|
+
.where("deleted_at", "is", null)
|
|
957
|
+
.executeTakeFirst();
|
|
958
|
+
if (!item || item.disabled)
|
|
959
|
+
return "gone";
|
|
960
|
+
return item.builtin || item.scope === "all" ? "all" : "narrower";
|
|
961
|
+
}
|
|
962
|
+
/** Live orgs (`only`: that one), sorted by id. */
|
|
963
|
+
async liveOrgs(only) {
|
|
964
|
+
let q = this.db
|
|
965
|
+
.selectFrom("orgs")
|
|
966
|
+
.select(["id", "name"])
|
|
967
|
+
.where("deleted_at", "is", null)
|
|
968
|
+
.orderBy("id");
|
|
969
|
+
if (only !== undefined)
|
|
970
|
+
q = q.where("id", "=", only);
|
|
971
|
+
return q.execute();
|
|
972
|
+
}
|
|
973
|
+
on(c, st, orgId) {
|
|
974
|
+
return componentOn(c, pluginFactsOf(st, c.itemId, orgId), listedIn(st, c.id, orgId), switchOf(st, c.id, orgId));
|
|
975
|
+
}
|
|
976
|
+
/**
|
|
977
|
+
* The preview of moving `c` to `target` (read through the current context). `x.hashId`: the id
|
|
978
|
+
* the hash names (the one the preview was asked for); `x.listed`: the list now of an org row not
|
|
979
|
+
* promoted yet (`[owner]`).
|
|
980
|
+
*/
|
|
981
|
+
async compute(c, target, x = {}) {
|
|
982
|
+
const st = await loadScopeState(this.db, c.kind, [c]);
|
|
983
|
+
if (x.listed !== undefined)
|
|
984
|
+
st.listed.set(c.id, new Set(x.listed));
|
|
985
|
+
const after = {
|
|
986
|
+
scopeMode: target.scopeMode,
|
|
987
|
+
scope: target.scope,
|
|
988
|
+
disabled: target.disabled,
|
|
989
|
+
itemId: c.itemId,
|
|
990
|
+
// a template shipped off stays so: following its plugin again, it is off without a switch
|
|
991
|
+
...(c.defaultOff === true && { defaultOff: true }),
|
|
992
|
+
};
|
|
993
|
+
const listedAfter = new Set(target.orgs);
|
|
994
|
+
const affected = [];
|
|
995
|
+
const conflicts = [];
|
|
996
|
+
/** A theme: the orgs it is on in now and would be off in. */
|
|
997
|
+
const lost = new Set();
|
|
998
|
+
for (const org of await this.liveOrgs()) {
|
|
999
|
+
const p = pluginFactsOf(st, c.itemId, org.id);
|
|
1000
|
+
const listed = listedIn(st, c.id, org.id);
|
|
1001
|
+
const sw = switchOf(st, c.id, org.id);
|
|
1002
|
+
const onNow = componentOn(c, p, listed, sw);
|
|
1003
|
+
const onAfter = componentOn(after, p, listedAfter.has(org.id), sw);
|
|
1004
|
+
if (onNow && !onAfter) {
|
|
1005
|
+
lost.add(org.id);
|
|
1006
|
+
const agents = await agentsUsing(this.db, org.id, c.kind, [c.id]);
|
|
1007
|
+
affected.push({
|
|
1008
|
+
orgId: org.id,
|
|
1009
|
+
orgName: org.name,
|
|
1010
|
+
agents: agents.map((a) => ({ id: a.id, name: a.name })),
|
|
1011
|
+
connectorsKept: c.kind === "connector_template" ? await connectorsMadeFrom(this.db, org.id, c.id) : 0,
|
|
1012
|
+
});
|
|
1013
|
+
}
|
|
1014
|
+
if (c.kind === "theme") {
|
|
1015
|
+
// theme ids are unique among the themes on in an org (themes spec §6)
|
|
1016
|
+
if (onAfter && !onNow) {
|
|
1017
|
+
const clash = await themeIdClashes(this.db, org.id, c, c.name);
|
|
1018
|
+
if (clash.length > 0) {
|
|
1019
|
+
conflicts.push({
|
|
1020
|
+
orgId: org.id,
|
|
1021
|
+
orgName: org.name,
|
|
1022
|
+
name: c.name,
|
|
1023
|
+
skills: [],
|
|
1024
|
+
themes: clash.map((x) => x.id),
|
|
1025
|
+
plugins: clash.map((x) => x.plugin ?? "platform"),
|
|
1026
|
+
});
|
|
1027
|
+
}
|
|
1028
|
+
}
|
|
1029
|
+
continue;
|
|
1030
|
+
}
|
|
1031
|
+
if (c.kind !== "connector_template" &&
|
|
1032
|
+
componentOffered(after, p, listedAfter.has(org.id)) &&
|
|
1033
|
+
!componentOffered(c, p, listed)) {
|
|
1034
|
+
// rule 10: a skill by its name, an agent template by its roster type (ruling P4-13)
|
|
1035
|
+
const clash = c.kind === "skill"
|
|
1036
|
+
? await skillNameClashes(this.db, org.id, c, c.name)
|
|
1037
|
+
: await templateTypeClashes(this.db, org.id, c);
|
|
1038
|
+
if (clash.skills.length > 0) {
|
|
1039
|
+
const name = c.kind === "skill" ? c.name : templateTypeOf(c.plugin, c.name);
|
|
1040
|
+
conflicts.push({ orgId: org.id, orgName: org.name, name, ...clash });
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
const themes = c.kind === "theme" ? await themesPreview(this.db, new Map([[c.id, lost]])) : undefined;
|
|
1045
|
+
const p = { affected, conflicts, ...(themes !== undefined && { themes }) };
|
|
1046
|
+
return { ...p, scopeHash: previewHash({ kind: c.kind, id: x.hashId ?? c.id }, target, p) };
|
|
1047
|
+
}
|
|
1048
|
+
};
|
|
1049
|
+
__decorate([
|
|
1050
|
+
Transactional()
|
|
1051
|
+
], ComponentScopeService.prototype, "setSwitch", null);
|
|
1052
|
+
__decorate([
|
|
1053
|
+
Transactional()
|
|
1054
|
+
], ComponentScopeService.prototype, "writeScope", null);
|
|
1055
|
+
__decorate([
|
|
1056
|
+
Transactional()
|
|
1057
|
+
], ComponentScopeService.prototype, "writeDisabled", null);
|
|
1058
|
+
__decorate([
|
|
1059
|
+
Transactional()
|
|
1060
|
+
], ComponentScopeService.prototype, "writeShown", null);
|
|
1061
|
+
ComponentScopeService = __decorate([
|
|
1062
|
+
Injectable(),
|
|
1063
|
+
__param(0, Inject(KernelDb)),
|
|
1064
|
+
__param(1, Inject(SuperAdminLock)),
|
|
1065
|
+
__param(2, Inject(OrgLock)),
|
|
1066
|
+
__param(3, Inject(ComponentPromotion)),
|
|
1067
|
+
__param(4, Inject(TransactionHost))
|
|
1068
|
+
], ComponentScopeService);
|
|
1069
|
+
export { ComponentScopeService };
|
|
1070
|
+
/** Whether `c` is the platform default theme `uiTheme` (locked on in every org, themes spec §7). */
|
|
1071
|
+
const isUiTheme = (c, uiTheme) => c.kind === "theme" && c.id === uiTheme;
|
|
1072
|
+
/** The plugin row FOR SHARE (exclusive with its scope writers and an unshare, which hold it FOR UPDATE). */
|
|
1073
|
+
async function lockItemShared(db, itemId) {
|
|
1074
|
+
await db.selectFrom("catalog_items").select("id").where("id", "=", itemId).forShare().execute();
|
|
1075
|
+
}
|
|
1076
|
+
/**
|
|
1077
|
+
* An org row not promoted yet as the platform row it would become (ruling P3-3): its own scope
|
|
1078
|
+
* `named: [owner]`, not shown, owned and created by its org.
|
|
1079
|
+
*/
|
|
1080
|
+
const virtualOf = (o) => ({
|
|
1081
|
+
kind: o.kind,
|
|
1082
|
+
id: o.id,
|
|
1083
|
+
name: o.name,
|
|
1084
|
+
plugin: o.plugin,
|
|
1085
|
+
version: String(o.version),
|
|
1086
|
+
description: null,
|
|
1087
|
+
itemId: null,
|
|
1088
|
+
scopeMode: "own",
|
|
1089
|
+
scope: "named",
|
|
1090
|
+
disabled: false,
|
|
1091
|
+
shownToOthers: false,
|
|
1092
|
+
ownerOrgId: o.orgId,
|
|
1093
|
+
originOrgId: o.orgId,
|
|
1094
|
+
shareable: o.shareable,
|
|
1095
|
+
});
|
|
1096
|
+
/**
|
|
1097
|
+
* 409 `catalog.not_owned` unless the org row is content its org created itself (ruling P3-46): a
|
|
1098
|
+
* skill without plugin provenance, an org template (no plugin, no catalog item; ruling P4-13).
|
|
1099
|
+
*/
|
|
1100
|
+
function assertPromotable(o) {
|
|
1101
|
+
if (!o.ownable)
|
|
1102
|
+
throw notOwnedError(o.name);
|
|
1103
|
+
}
|
|
1104
|
+
/** The share gate's view of a component row. */
|
|
1105
|
+
const gateRow = (c) => ({
|
|
1106
|
+
owner_org_id: c.ownerOrgId,
|
|
1107
|
+
shareable: c.shareable,
|
|
1108
|
+
name: c.name,
|
|
1109
|
+
});
|
|
1110
|
+
const TABLE = {
|
|
1111
|
+
skill: "platform_skills",
|
|
1112
|
+
agent_template: "platform_agent_templates",
|
|
1113
|
+
connector_template: "platform_connector_templates",
|
|
1114
|
+
theme: "platform_themes",
|
|
1115
|
+
};
|