@capybara-hq/kernel 0.1.0-rc.0 → 0.1.0-rc.10
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 +92 -8
- 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 +57 -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 +232 -0
- package/dist/catalog/catalog-content.js +367 -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 +676 -0
- package/dist/catalog/catalog-scope.service.d.ts +260 -0
- package/dist/catalog/catalog-scope.service.js +1124 -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 +141 -206
- package/dist/catalog/catalog.service.js +237 -528
- package/dist/catalog/claude/agents.js +15 -10
- 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 +114 -0
- package/dist/catalog/component-scope.schemas.js +97 -0
- package/dist/catalog/component-scope.service.d.ts +327 -0
- package/dist/catalog/component-scope.service.js +990 -0
- package/dist/catalog/component-state.d.ts +188 -0
- package/dist/catalog/component-state.js +455 -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 +431 -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 +801 -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 +223 -0
- package/dist/catalog/platform-components.js +763 -0
- package/dist/catalog/platform-migration.d.ts +115 -0
- package/dist/catalog/platform-migration.js +582 -0
- package/dist/catalog/plugin-import.d.ts +270 -68
- package/dist/catalog/plugin-import.js +1004 -277
- package/dist/catalog/plugin-install.d.ts +251 -65
- package/dist/catalog/plugin-install.js +1128 -344
- package/dist/catalog/plugin-package.js +14 -1
- package/dist/catalog/plugin-upgrade.d.ts +301 -188
- package/dist/catalog/plugin-upgrade.js +1256 -1068
- 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 +118 -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 -201
- 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 +51 -3
- package/dist/config/schema.js +269 -27
- 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 -70
- 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/queue.js +3 -2
- package/dist/ctx/secrets.d.ts +10 -2
- package/dist/ctx/secrets.js +7 -3
- package/dist/db/kernel-schema.d.ts +550 -25
- 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 +136 -2
- package/dist/errors.js +136 -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 -123
- 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 +136 -46
- package/dist/extensions/bootstrap.js +417 -167
- 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 +86 -358
- package/dist/http/app.d.ts +22 -17
- package/dist/http/app.js +83 -52
- 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 +130 -38
- package/dist/identity/accounts.js +373 -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 +78 -33
- package/dist/identity/me.schemas.d.ts +14 -0
- package/dist/identity/me.schemas.js +17 -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 +42 -23
- package/dist/identity/settings.js +137 -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 +25 -14
- package/dist/index.js +20 -9
- 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 -241
- 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-config.d.ts +9 -0
- package/dist/log-config.js +27 -0
- package/dist/log-context.d.ts +34 -0
- package/dist/log-context.js +44 -0
- package/dist/log-loki.d.ts +34 -0
- package/dist/log-loki.js +145 -0
- package/dist/log.d.ts +53 -10
- package/dist/log.js +168 -18
- 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/net/public-address.js +3 -2
- 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 +45 -14
- package/dist/orgs/settings.service.js +110 -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 +667 -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 +90 -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 +36 -0
- package/dist/platform/ops/admin.ops.js +389 -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 +853 -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 +16 -0
- package/dist/platform/ops/org-settings.ops.js +102 -0
- package/dist/platform/ops/orgs.ops.d.ts +28 -0
- package/dist/platform/ops/orgs.ops.js +295 -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 +28 -0
- package/dist/platform/ops/platform.ops.js +204 -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/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 +39 -0
- package/dist/platform/platform-ops.module.js +122 -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 +63 -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 -136
- 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 -236
- 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 -180
- 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/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 +142 -40
- package/dist/tools/builtins/sandbox/common.js +227 -65
- 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 +15 -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/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,791 @@
|
|
|
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 { randomUUID } from "node:crypto";
|
|
11
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
12
|
+
import { sql } from "kysely";
|
|
13
|
+
import { deviceLeaseKey } from "../devices/keys.js";
|
|
14
|
+
import { MachinesService } from "../devices/machines.js";
|
|
15
|
+
import { ApiError } from "../errors.js";
|
|
16
|
+
import { ExtensionDisplayNames } from "../extensions/display-name.js";
|
|
17
|
+
import { audit } from "../identity/audit.js";
|
|
18
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
19
|
+
import { afterCommit } from "../infra/database/after-commit.js";
|
|
20
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
21
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
22
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
23
|
+
import { LockService } from "../infra/lock/lock.service.js";
|
|
24
|
+
import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
25
|
+
import { SandboxJobs } from "../sandbox/jobs.js";
|
|
26
|
+
import { DEVICE_PROVIDER, isInternalProvider, SandboxProviders } from "../sandbox/providers.js";
|
|
27
|
+
import { environmentNotFound, SandboxService } from "../sandbox/sandbox.service.js";
|
|
28
|
+
import { demotedProvider, EnvironmentAccess, environmentProvider, environmentUnavailable, inUseForDefault, } from "./access.js";
|
|
29
|
+
const isUniqueViolation = (e, constraint) => typeof e === "object" &&
|
|
30
|
+
e !== null &&
|
|
31
|
+
e.code === "23505" &&
|
|
32
|
+
e.constraint === constraint;
|
|
33
|
+
const nameTaken = () => new ApiError("environment.name_taken", "You already have an environment with this name");
|
|
34
|
+
/**
|
|
35
|
+
* Personal environments (spec 2026-11-07-environments-design §4.2 items 7, 12, 13; §6; §9):
|
|
36
|
+
* cloud ones on the deployment's sandbox provider and `device` ones on a connected machine; a
|
|
37
|
+
* person's environments in an org, visible and usable only by their owner (anyone else gets
|
|
38
|
+
* `environment.not_found`). Deleting one soft-deletes it and destroys its instance and files in a
|
|
39
|
+
* `sandbox-destroy-for` job after the commit.
|
|
40
|
+
*/
|
|
41
|
+
let EnvironmentsService = class EnvironmentsService {
|
|
42
|
+
db;
|
|
43
|
+
txHost;
|
|
44
|
+
config;
|
|
45
|
+
providers;
|
|
46
|
+
sandbox;
|
|
47
|
+
sandboxJobs;
|
|
48
|
+
access;
|
|
49
|
+
displayNames;
|
|
50
|
+
log;
|
|
51
|
+
locks;
|
|
52
|
+
machines;
|
|
53
|
+
constructor(db, txHost, config, providers, sandbox, sandboxJobs, access, displayNames, log,
|
|
54
|
+
/** Reads the device relay's lease (`online`). */
|
|
55
|
+
locks, machines) {
|
|
56
|
+
this.db = db;
|
|
57
|
+
this.txHost = txHost;
|
|
58
|
+
this.config = config;
|
|
59
|
+
this.providers = providers;
|
|
60
|
+
this.sandbox = sandbox;
|
|
61
|
+
this.sandboxJobs = sandboxJobs;
|
|
62
|
+
this.access = access;
|
|
63
|
+
this.displayNames = displayNames;
|
|
64
|
+
this.log = log;
|
|
65
|
+
this.locks = locks;
|
|
66
|
+
this.machines = machines;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The person's live environments in the org, the default first, then by creation. With a
|
|
70
|
+
* current sandbox provider the default environment is created first if missing (its first need,
|
|
71
|
+
* spec §4.2 item 7; an existing one is only read).
|
|
72
|
+
*/
|
|
73
|
+
async list(orgId, accountId) {
|
|
74
|
+
const cloudAvailable = this.providers.cloud() !== undefined;
|
|
75
|
+
const defaultId = cloudAvailable ? await this.ensureDefault(orgId, accountId) : null;
|
|
76
|
+
const items = await this.views(orgId, accountId);
|
|
77
|
+
const last = await this.db
|
|
78
|
+
.selectFrom("conversations as c")
|
|
79
|
+
.innerJoin("environments as e", "e.id", "c.environment_id")
|
|
80
|
+
.select("c.environment_id")
|
|
81
|
+
.where("c.org_id", "=", orgId)
|
|
82
|
+
.where("c.account_id", "=", accountId)
|
|
83
|
+
.where("e.org_id", "=", orgId)
|
|
84
|
+
.where("e.owner_kind", "=", "personal")
|
|
85
|
+
.where("e.owner_account_id", "=", accountId)
|
|
86
|
+
.where("e.deleted_at", "is", null)
|
|
87
|
+
.orderBy("c.updated_at", "desc")
|
|
88
|
+
.limit(1)
|
|
89
|
+
.executeTakeFirst();
|
|
90
|
+
return {
|
|
91
|
+
items,
|
|
92
|
+
defaultId: defaultId ?? items.find((v) => v.isDefault)?.id ?? null,
|
|
93
|
+
lastUsedId: last?.environment_id ?? null,
|
|
94
|
+
cloudAvailable,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** One of the person's live environments; anyone else's (or a missing one) → `not_found`. */
|
|
98
|
+
async get(orgId, accountId, id) {
|
|
99
|
+
const [view] = await this.views(orgId, accountId, id);
|
|
100
|
+
if (!view)
|
|
101
|
+
throw environmentNotFound();
|
|
102
|
+
return view;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* A new personal cloud environment, ready at once (its instance and files are made on first
|
|
106
|
+
* use). Needs a current sandbox provider (`environment.unavailable`); a live name of the person's
|
|
107
|
+
* (case-insensitive) → `environment.name_taken`; `environments.maxPersonal` live ones (the
|
|
108
|
+
* default counts) → `environment.limit_reached`. Serialized per person by their membership row.
|
|
109
|
+
*/
|
|
110
|
+
async create(orgId, accountId, input, actorTokenId, auditDetail) {
|
|
111
|
+
const id = await this.insert(orgId, accountId, input.name, actorTokenId, auditDetail);
|
|
112
|
+
return this.get(orgId, accountId, id);
|
|
113
|
+
}
|
|
114
|
+
async insert(orgId, accountId, name, actorTokenId, auditDetail) {
|
|
115
|
+
const current = this.providers.cloud();
|
|
116
|
+
if (!current)
|
|
117
|
+
throw environmentUnavailable(null);
|
|
118
|
+
return this.insertNamed(orgId, accountId, name, "cloud", current.plugin, actorTokenId, auditDetail ?? {});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* A new personal `device` environment for a machine being connected (provider `@device`; the
|
|
122
|
+
* machine row is the caller's). Joins the caller's transaction (the device authorization's).
|
|
123
|
+
* Counted against `environments.maxPersonal` (`environment.limit_reached`); a live name of the
|
|
124
|
+
* person's → `environment.name_taken`. Needs no cloud provider.
|
|
125
|
+
*/
|
|
126
|
+
async createDevice(orgId, accountId, name) {
|
|
127
|
+
const id = await this.insertNamed(orgId, accountId, name, "device", DEVICE_PROVIDER, undefined, {
|
|
128
|
+
source: "device",
|
|
129
|
+
});
|
|
130
|
+
return { id };
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Inserts a named personal environment under the person's membership lock, after the limit
|
|
134
|
+
* and name checks, and audits `environment.created`. Runs in the caller's transaction.
|
|
135
|
+
*/
|
|
136
|
+
async insertNamed(orgId, accountId, name, source, provider, actorTokenId, auditDetail) {
|
|
137
|
+
await this.lockMember(orgId, accountId);
|
|
138
|
+
const { n } = await this.db
|
|
139
|
+
.selectFrom("environments")
|
|
140
|
+
.select((eb) => eb.fn.countAll().as("n"))
|
|
141
|
+
.where("org_id", "=", orgId)
|
|
142
|
+
.where("owner_kind", "=", "personal")
|
|
143
|
+
.where("owner_account_id", "=", accountId)
|
|
144
|
+
.where("deleted_at", "is", null)
|
|
145
|
+
.executeTakeFirstOrThrow();
|
|
146
|
+
const max = this.config.get().environments.maxPersonal;
|
|
147
|
+
if (Number(n) >= max) {
|
|
148
|
+
throw new ApiError("environment.limit_reached", `You already have ${max} environments in this organization; delete one to create another`);
|
|
149
|
+
}
|
|
150
|
+
await this.assertNameFree(orgId, accountId, name);
|
|
151
|
+
const id = randomUUID();
|
|
152
|
+
try {
|
|
153
|
+
await this.db
|
|
154
|
+
.insertInto("environments")
|
|
155
|
+
.values({
|
|
156
|
+
id,
|
|
157
|
+
org_id: orgId,
|
|
158
|
+
owner_kind: "personal",
|
|
159
|
+
owner_account_id: accountId,
|
|
160
|
+
name,
|
|
161
|
+
source,
|
|
162
|
+
provider,
|
|
163
|
+
})
|
|
164
|
+
.execute();
|
|
165
|
+
}
|
|
166
|
+
catch (e) {
|
|
167
|
+
if (isUniqueViolation(e, "environments_name_uq"))
|
|
168
|
+
throw nameTaken();
|
|
169
|
+
throw e;
|
|
170
|
+
}
|
|
171
|
+
await audit(this.db.db, {
|
|
172
|
+
actorAccountId: accountId,
|
|
173
|
+
...(actorTokenId !== undefined && { actorTokenId }),
|
|
174
|
+
orgId,
|
|
175
|
+
action: "environment.created",
|
|
176
|
+
target: id,
|
|
177
|
+
detail: { name, ...auditDetail },
|
|
178
|
+
});
|
|
179
|
+
return id;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* The refusals {@link create} would raise, read without locks or writes (a precheck before a
|
|
183
|
+
* confirmation card): no sandbox provider, the person's limit, a name already taken. Throws the
|
|
184
|
+
* same {@link ApiError}s; a race still ends in `create`'s own refusal.
|
|
185
|
+
*/
|
|
186
|
+
async checkCreate(orgId, accountId, name) {
|
|
187
|
+
if (!this.providers.cloud())
|
|
188
|
+
throw environmentUnavailable(null);
|
|
189
|
+
const { n } = await this.db
|
|
190
|
+
.selectFrom("environments")
|
|
191
|
+
.select((eb) => eb.fn.countAll().as("n"))
|
|
192
|
+
.where("org_id", "=", orgId)
|
|
193
|
+
.where("owner_kind", "=", "personal")
|
|
194
|
+
.where("owner_account_id", "=", accountId)
|
|
195
|
+
.where("deleted_at", "is", null)
|
|
196
|
+
.executeTakeFirstOrThrow();
|
|
197
|
+
const max = this.config.get().environments.maxPersonal;
|
|
198
|
+
if (Number(n) >= max) {
|
|
199
|
+
throw new ApiError("environment.limit_reached", `You already have ${max} environments in this organization; delete one to create another`);
|
|
200
|
+
}
|
|
201
|
+
await this.assertNameFree(orgId, accountId, name);
|
|
202
|
+
}
|
|
203
|
+
/** How many of the person's conversations work in the environment (read only). */
|
|
204
|
+
async boundConversations(orgId, accountId, id) {
|
|
205
|
+
const { n } = await this.db
|
|
206
|
+
.selectFrom("conversations")
|
|
207
|
+
.select((eb) => eb.fn.countAll().as("n"))
|
|
208
|
+
.where("org_id", "=", orgId)
|
|
209
|
+
.where("account_id", "=", accountId)
|
|
210
|
+
.where("environment_id", "=", id)
|
|
211
|
+
.executeTakeFirstOrThrow();
|
|
212
|
+
return Number(n);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* The refusals {@link resetFiles} would raise (not found, its provider not current, a connected
|
|
216
|
+
* environment), read only.
|
|
217
|
+
*/
|
|
218
|
+
async checkReset(orgId, accountId, id) {
|
|
219
|
+
refuseDeviceReset(await this.access.usable(orgId, accountId, id));
|
|
220
|
+
}
|
|
221
|
+
/** The refusals {@link rename} would raise, read without locks (see {@link checkCreate}). */
|
|
222
|
+
async checkRename(orgId, accountId, id, name) {
|
|
223
|
+
const before = await this.get(orgId, accountId, id);
|
|
224
|
+
if (before.name?.toLowerCase() !== name.toLowerCase()) {
|
|
225
|
+
await this.assertNameFree(orgId, accountId, name);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Renames one of the person's live environments (the default too); see {@link create}. A
|
|
230
|
+
* renamed former default is the person's own from then on: it loses its demotion mark, so a
|
|
231
|
+
* switch back to its provider no longer restores it.
|
|
232
|
+
*/
|
|
233
|
+
async rename(orgId, accountId, id, name, actorTokenId, auditDetail) {
|
|
234
|
+
await this.renameIn(orgId, accountId, id, name, actorTokenId, auditDetail);
|
|
235
|
+
return this.get(orgId, accountId, id);
|
|
236
|
+
}
|
|
237
|
+
async renameIn(orgId, accountId, id, name, actorTokenId, auditDetail) {
|
|
238
|
+
const before = await this.lockOwn(orgId, accountId, id);
|
|
239
|
+
if (before.name === name)
|
|
240
|
+
return;
|
|
241
|
+
// the same name in another case is this environment's own: the index allows it
|
|
242
|
+
if (before.name?.toLowerCase() !== name.toLowerCase()) {
|
|
243
|
+
await this.assertNameFree(orgId, accountId, name);
|
|
244
|
+
}
|
|
245
|
+
try {
|
|
246
|
+
await this.db
|
|
247
|
+
.updateTable("environments")
|
|
248
|
+
.set({ name, demoted_from_provider: null, updated_at: sql `now()` })
|
|
249
|
+
.where("id", "=", id)
|
|
250
|
+
.execute();
|
|
251
|
+
}
|
|
252
|
+
catch (e) {
|
|
253
|
+
if (isUniqueViolation(e, "environments_name_uq"))
|
|
254
|
+
throw nameTaken();
|
|
255
|
+
throw e;
|
|
256
|
+
}
|
|
257
|
+
await audit(this.db.db, {
|
|
258
|
+
actorAccountId: accountId,
|
|
259
|
+
...(actorTokenId !== undefined && { actorTokenId }),
|
|
260
|
+
orgId,
|
|
261
|
+
action: "environment.renamed",
|
|
262
|
+
target: id,
|
|
263
|
+
detail: { from: before.name, to: name, ...auditDetail },
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Deletes one of the person's live environments: soft delete, its IM default row cleared, and
|
|
268
|
+
* after the commit a `sandbox-destroy-for` job (the worker waits for running commands, then
|
|
269
|
+
* destroys the instance and the files). Conversations bound to it keep pointing at it; their
|
|
270
|
+
* sandbox tools then fail with `environment.not_found`. A device environment's machine is
|
|
271
|
+
* revoked in the same transaction; after the commit it is told `stop { reason: "deleted" }`
|
|
272
|
+
* (while connected) and its connection is closed.
|
|
273
|
+
*/
|
|
274
|
+
async remove(orgId, accountId, id, actorTokenId, auditDetail) {
|
|
275
|
+
const before = await this.lockOwn(orgId, accountId, id);
|
|
276
|
+
await this.db
|
|
277
|
+
.updateTable("environments")
|
|
278
|
+
.set({ deleted_at: sql `now()`, updated_at: sql `now()` })
|
|
279
|
+
.where("id", "=", id)
|
|
280
|
+
.execute();
|
|
281
|
+
await this.db
|
|
282
|
+
.deleteFrom("environment_defaults")
|
|
283
|
+
.where("org_id", "=", orgId)
|
|
284
|
+
.where("account_id", "=", accountId)
|
|
285
|
+
.where("environment_id", "=", id)
|
|
286
|
+
.execute();
|
|
287
|
+
await this.machines.revokeActive(id, "deleted");
|
|
288
|
+
await audit(this.db.db, {
|
|
289
|
+
actorAccountId: accountId,
|
|
290
|
+
...(actorTokenId !== undefined && { actorTokenId }),
|
|
291
|
+
orgId,
|
|
292
|
+
action: "environment.deleted",
|
|
293
|
+
target: id,
|
|
294
|
+
detail: { name: before.name, isDefault: before.is_default, ...auditDetail },
|
|
295
|
+
});
|
|
296
|
+
afterCommit(async () => {
|
|
297
|
+
try {
|
|
298
|
+
await this.sandboxJobs.destroy([id]);
|
|
299
|
+
}
|
|
300
|
+
catch (err) {
|
|
301
|
+
// the hourly destruction sweep destroys deleted environments too
|
|
302
|
+
this.log.warn("cannot schedule environment destruction", { environmentId: id, err });
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Disconnects the machine of one of the person's own device environments (it must sign in
|
|
308
|
+
* again); see {@link MachinesService.revoke}.
|
|
309
|
+
*/
|
|
310
|
+
async revokeMachine(orgId, accountId, id, actorTokenId) {
|
|
311
|
+
await this.machines.revoke(orgId, accountId, id, actorTokenId);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Starts one of the person's environments over with empty files (after
|
|
315
|
+
* `environment.files_lost`): records the request (audit), then, after the commit, enqueues the
|
|
316
|
+
* `sandbox-reset-files` job (deterministic id per environment), whose worker waits for running
|
|
317
|
+
* commands and destroys any instance and the file system; the next use creates new ones. Its
|
|
318
|
+
* provider must be the current one (`environment.unavailable`); a connected environment's files
|
|
319
|
+
* are its machine owner's (`environment.files_on_device`). An enqueue failure is thrown
|
|
320
|
+
* (the request can be repeated: the reset is idempotent).
|
|
321
|
+
*/
|
|
322
|
+
async resetFiles(orgId, accountId, id, actorTokenId, auditDetail) {
|
|
323
|
+
await this.recordReset(orgId, accountId, id, actorTokenId, auditDetail);
|
|
324
|
+
await this.sandboxJobs.resetFiles(id);
|
|
325
|
+
}
|
|
326
|
+
/** The check and audit row of {@link resetFiles}, committed before the job is enqueued. */
|
|
327
|
+
async recordReset(orgId, accountId, id, actorTokenId, auditDetail) {
|
|
328
|
+
refuseDeviceReset(await this.access.usable(orgId, accountId, id));
|
|
329
|
+
await audit(this.db.db, {
|
|
330
|
+
actorAccountId: accountId,
|
|
331
|
+
...(actorTokenId !== undefined && { actorTokenId }),
|
|
332
|
+
orgId,
|
|
333
|
+
action: "environment.files_reset",
|
|
334
|
+
target: id,
|
|
335
|
+
...(auditDetail !== undefined && { detail: auditDetail }),
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* The person's default environment in the org, created when missing (named by the UI, `name`
|
|
340
|
+
* NULL). An existing usable one is read without locking. A live default whose files or
|
|
341
|
+
* instance are kept by a provider that is not the current one (a provider switch, spec §4.2
|
|
342
|
+
* item 13) is stranded: it is demoted (marked with the provider it was demoted from; the UI
|
|
343
|
+
* names it 「个人环境(<provider display name>)」) and stays listed as unavailable and deletable.
|
|
344
|
+
* Its replacement is the person's former default demoted from the current provider when there
|
|
345
|
+
* is one (switching back restores it, with its files), else a fresh default. A live default
|
|
346
|
+
* not in use yet (no healthy files, no instance, none being created: {@link inUseForDefault})
|
|
347
|
+
* is likewise swapped for a former default holding healthy files at the current provider; it is
|
|
348
|
+
* demoted (from the provider it was made under) so it can come back in turn. A former default
|
|
349
|
+
* belongs to the provider holding its resources once it holds any, else to the one it was
|
|
350
|
+
* demoted from ({@link demotedProvider}), so one swapped out empty and used afterwards is
|
|
351
|
+
* labelled and restored by where its files are.
|
|
352
|
+
* All of it in one transaction: switching back and forth never adds environments.
|
|
353
|
+
*
|
|
354
|
+
* Replacing one first takes the person's membership row (`FOR SHARE`, after the org row), so an
|
|
355
|
+
* offboarding that removes them cannot leave a live default behind; not a member (any more) →
|
|
356
|
+
* `org.not_found`. Idempotent under concurrency: the live default row and the person's former
|
|
357
|
+
* defaults of the current provider are locked (`FOR NO KEY UPDATE`) and the live default re-read
|
|
358
|
+
* after them, the partial unique index on the live default makes a racing insert do nothing, and
|
|
359
|
+
* the select that follows reads the winner. Needs a current sandbox provider
|
|
360
|
+
* (`environment.unavailable`). It is the person's baseline, so it is created even at
|
|
361
|
+
* `environments.maxPersonal`.
|
|
362
|
+
*/
|
|
363
|
+
async ensureDefault(orgId, accountId) {
|
|
364
|
+
const live = await this.defaultOf(orgId, accountId);
|
|
365
|
+
if (live && !this.stranded(live)) {
|
|
366
|
+
const current = this.providers.cloud()?.plugin;
|
|
367
|
+
if (inUseForDefault(live) || current === undefined)
|
|
368
|
+
return live.id;
|
|
369
|
+
const former = await this.formerDefaults(orgId, accountId, current);
|
|
370
|
+
if (!former.some((f) => f.holdsFiles))
|
|
371
|
+
return live.id;
|
|
372
|
+
}
|
|
373
|
+
return this.insertDefault(orgId, accountId);
|
|
374
|
+
}
|
|
375
|
+
async insertDefault(orgId, accountId) {
|
|
376
|
+
const current = this.providers.cloud();
|
|
377
|
+
if (!current)
|
|
378
|
+
throw environmentUnavailable(null);
|
|
379
|
+
await this.lockMember(orgId, accountId, "share");
|
|
380
|
+
const locked = await this.defaultOf(orgId, accountId, true);
|
|
381
|
+
const former = await this.formerDefaults(orgId, accountId, current.plugin, true);
|
|
382
|
+
// a racing replacement committed while this waited: its default is the answer
|
|
383
|
+
const live = locked ?? (await this.defaultOf(orgId, accountId));
|
|
384
|
+
if (live && live !== locked)
|
|
385
|
+
return live.id;
|
|
386
|
+
const stranded = live !== undefined && this.stranded(live);
|
|
387
|
+
const withFiles = former.find((f) => f.holdsFiles);
|
|
388
|
+
if (live && !stranded && (inUseForDefault(live) || withFiles === undefined))
|
|
389
|
+
return live.id;
|
|
390
|
+
// a default is needed (none, or a stranded one): any former default will do, files first
|
|
391
|
+
const restore = withFiles ?? (live === undefined || stranded ? former[0] : undefined);
|
|
392
|
+
if (live) {
|
|
393
|
+
const from = stranded
|
|
394
|
+
? (environmentProvider(live, current.plugin) ?? "unknown")
|
|
395
|
+
: (live.provider ?? current.plugin);
|
|
396
|
+
await this.demote(live.id, from);
|
|
397
|
+
}
|
|
398
|
+
if (restore) {
|
|
399
|
+
await this.db
|
|
400
|
+
.updateTable("environments")
|
|
401
|
+
.set({ is_default: true, demoted_from_provider: null, updated_at: sql `now()` })
|
|
402
|
+
.where("id", "=", restore.id)
|
|
403
|
+
.execute();
|
|
404
|
+
return restore.id;
|
|
405
|
+
}
|
|
406
|
+
await this.db
|
|
407
|
+
.insertInto("environments")
|
|
408
|
+
.values({
|
|
409
|
+
id: randomUUID(),
|
|
410
|
+
org_id: orgId,
|
|
411
|
+
owner_kind: "personal",
|
|
412
|
+
owner_account_id: accountId,
|
|
413
|
+
name: null,
|
|
414
|
+
is_default: true,
|
|
415
|
+
source: "cloud",
|
|
416
|
+
provider: current.plugin,
|
|
417
|
+
})
|
|
418
|
+
.onConflict((oc) => oc
|
|
419
|
+
.columns(["org_id", "owner_account_id"])
|
|
420
|
+
.where(sql `is_default AND deleted_at IS NULL`)
|
|
421
|
+
.doNothing())
|
|
422
|
+
.execute();
|
|
423
|
+
const row = await this.defaultOf(orgId, accountId);
|
|
424
|
+
if (row === undefined)
|
|
425
|
+
throw new Error("the default environment was not created");
|
|
426
|
+
return row.id;
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Turns the live default into an ordinary environment marked as demoted from `provider`; a name
|
|
430
|
+
* the person gave it stays. Runs under the person's membership lock and the default row's lock,
|
|
431
|
+
* before any other row becomes the default (the partial unique index).
|
|
432
|
+
*/
|
|
433
|
+
async demote(id, provider) {
|
|
434
|
+
await this.db
|
|
435
|
+
.updateTable("environments")
|
|
436
|
+
.set({ is_default: false, demoted_from_provider: provider, updated_at: sql `now()` })
|
|
437
|
+
.where("id", "=", id)
|
|
438
|
+
.execute();
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* The person's live former defaults of `provider` ({@link demotedProvider}: files or an instance
|
|
442
|
+
* kept by `provider`, or none and demoted from it), the ones holding healthy files first (lost
|
|
443
|
+
* files count as none), then the most recently used, then the most recently demoted. `lock`
|
|
444
|
+
* takes their rows (`FOR NO KEY UPDATE`, in id order, so racing replacements queue on the same
|
|
445
|
+
* rows).
|
|
446
|
+
*/
|
|
447
|
+
async formerDefaults(orgId, accountId, provider, lock = false) {
|
|
448
|
+
const rows = await this.db
|
|
449
|
+
.selectFrom("environments as e")
|
|
450
|
+
.leftJoin("environment_instances as i", "i.environment_id", "e.id")
|
|
451
|
+
.select([
|
|
452
|
+
"e.id",
|
|
453
|
+
"e.provider",
|
|
454
|
+
"e.updated_at",
|
|
455
|
+
"i.provider as instance_provider",
|
|
456
|
+
"i.fs_status",
|
|
457
|
+
"e.demoted_from_provider",
|
|
458
|
+
"i.handle",
|
|
459
|
+
"i.status",
|
|
460
|
+
"i.last_used_at",
|
|
461
|
+
])
|
|
462
|
+
.where("e.org_id", "=", orgId)
|
|
463
|
+
.where("e.owner_kind", "=", "personal")
|
|
464
|
+
.where("e.owner_account_id", "=", accountId)
|
|
465
|
+
.where("e.is_default", "=", false)
|
|
466
|
+
.where("e.demoted_from_provider", "is not", null)
|
|
467
|
+
.where((eb) => eb.or([eb("e.demoted_from_provider", "=", provider), eb("i.provider", "=", provider)]))
|
|
468
|
+
.where("e.deleted_at", "is", null)
|
|
469
|
+
.orderBy("e.id")
|
|
470
|
+
.$if(lock, (q) => q.forNoKeyUpdate("e"))
|
|
471
|
+
.execute();
|
|
472
|
+
const time = (d) => d?.getTime() ?? 0;
|
|
473
|
+
return rows
|
|
474
|
+
.map((r) => {
|
|
475
|
+
const facts = {
|
|
476
|
+
provider: r.provider,
|
|
477
|
+
instanceProvider: r.instance_provider,
|
|
478
|
+
fsStatus: r.fs_status,
|
|
479
|
+
hasInstance: r.handle !== null,
|
|
480
|
+
};
|
|
481
|
+
return {
|
|
482
|
+
r,
|
|
483
|
+
holdsFiles: inUseForDefault({ ...facts, status: r.status }),
|
|
484
|
+
belongs: demotedProvider(r.demoted_from_provider, facts) === provider,
|
|
485
|
+
};
|
|
486
|
+
})
|
|
487
|
+
.filter(({ belongs }) => belongs)
|
|
488
|
+
.sort((a, b) => Number(b.holdsFiles) - Number(a.holdsFiles) ||
|
|
489
|
+
time(b.r.last_used_at) - time(a.r.last_used_at) ||
|
|
490
|
+
time(b.r.updated_at) - time(a.r.updated_at))
|
|
491
|
+
.map(({ r, holdsFiles }) => ({ id: r.id, holdsFiles }));
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* The person's IM default (what `/env` set): the environment their next new IM conversation
|
|
495
|
+
* uses. Null when none was set, or the chosen one is deleted (the row is cleared with it).
|
|
496
|
+
*/
|
|
497
|
+
async imDefault(orgId, accountId) {
|
|
498
|
+
const row = await this.db
|
|
499
|
+
.selectFrom("environment_defaults as d")
|
|
500
|
+
.innerJoin("environments as e", "e.id", "d.environment_id")
|
|
501
|
+
.select("e.id")
|
|
502
|
+
.where("d.org_id", "=", orgId)
|
|
503
|
+
.where("d.account_id", "=", accountId)
|
|
504
|
+
.where("e.org_id", "=", orgId)
|
|
505
|
+
.where("e.owner_kind", "=", "personal")
|
|
506
|
+
.where("e.owner_account_id", "=", accountId)
|
|
507
|
+
.where("e.deleted_at", "is", null)
|
|
508
|
+
.executeTakeFirst();
|
|
509
|
+
return row?.id ?? null;
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Sets the person's IM default. Only one of their own live environments in the org, usable now
|
|
513
|
+
* (`environment.not_found` / `environment.unavailable` otherwise); the row is written by one
|
|
514
|
+
* statement that re-checks the environment is live. There is no row lock, so a delete racing
|
|
515
|
+
* past that check can leave a stale row; reads ignore it ({@link imDefault} joins on
|
|
516
|
+
* `deleted_at IS NULL`).
|
|
517
|
+
*/
|
|
518
|
+
async setImDefault(orgId, accountId, environmentId) {
|
|
519
|
+
await this.access.usable(orgId, accountId, environmentId);
|
|
520
|
+
const written = await this.db
|
|
521
|
+
.insertInto("environment_defaults")
|
|
522
|
+
.columns(["org_id", "account_id", "environment_id"])
|
|
523
|
+
.expression(this.db
|
|
524
|
+
.selectFrom("environments")
|
|
525
|
+
.select([
|
|
526
|
+
sql `${orgId}::text`.as("org_id"),
|
|
527
|
+
sql `${accountId}::text`.as("account_id"),
|
|
528
|
+
"id",
|
|
529
|
+
])
|
|
530
|
+
.where("id", "=", environmentId)
|
|
531
|
+
.where("org_id", "=", orgId)
|
|
532
|
+
.where("owner_kind", "=", "personal")
|
|
533
|
+
.where("owner_account_id", "=", accountId)
|
|
534
|
+
.where("deleted_at", "is", null))
|
|
535
|
+
.onConflict((oc) => oc
|
|
536
|
+
.columns(["org_id", "account_id"])
|
|
537
|
+
.doUpdateSet({ environment_id: environmentId, updated_at: new Date() }))
|
|
538
|
+
.executeTakeFirst();
|
|
539
|
+
if (Number(written.numInsertedOrUpdatedRows ?? 0) === 0)
|
|
540
|
+
throw environmentNotFound();
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* The person's live default environment in the org, if any, with what decides its provider;
|
|
544
|
+
* `lock` takes its row (`FOR NO KEY UPDATE`; a racing demotion makes it read none).
|
|
545
|
+
*/
|
|
546
|
+
async defaultOf(orgId, accountId, lock = false) {
|
|
547
|
+
const row = await this.db
|
|
548
|
+
.selectFrom("environments as e")
|
|
549
|
+
.leftJoin("environment_instances as i", "i.environment_id", "e.id")
|
|
550
|
+
.select([
|
|
551
|
+
"e.id",
|
|
552
|
+
"e.provider",
|
|
553
|
+
"i.provider as instance_provider",
|
|
554
|
+
"i.fs_status",
|
|
555
|
+
"i.handle",
|
|
556
|
+
"i.status",
|
|
557
|
+
])
|
|
558
|
+
.where("e.org_id", "=", orgId)
|
|
559
|
+
.where("e.owner_kind", "=", "personal")
|
|
560
|
+
.where("e.owner_account_id", "=", accountId)
|
|
561
|
+
.where("e.is_default", "=", true)
|
|
562
|
+
.where("e.deleted_at", "is", null)
|
|
563
|
+
.$if(lock, (q) => q.forNoKeyUpdate("e"))
|
|
564
|
+
.executeTakeFirst();
|
|
565
|
+
return (row && {
|
|
566
|
+
id: row.id,
|
|
567
|
+
provider: row.provider,
|
|
568
|
+
instanceProvider: row.instance_provider,
|
|
569
|
+
fsStatus: row.fs_status,
|
|
570
|
+
hasInstance: row.handle !== null,
|
|
571
|
+
status: row.status,
|
|
572
|
+
});
|
|
573
|
+
}
|
|
574
|
+
/** Its files or instance are kept by a provider that is not the current one. */
|
|
575
|
+
stranded(f) {
|
|
576
|
+
const current = this.providers.cloud()?.plugin;
|
|
577
|
+
return current !== undefined && environmentProvider(f, current) !== current;
|
|
578
|
+
}
|
|
579
|
+
/** The person's live environments (or the one `id`) as views. */
|
|
580
|
+
async views(orgId, accountId, id) {
|
|
581
|
+
// all of them even for one `id`: a former default's ordinal counts its siblings
|
|
582
|
+
const all = await this.db
|
|
583
|
+
.selectFrom("environments as e")
|
|
584
|
+
.leftJoin("environment_instances as i", "i.environment_id", "e.id")
|
|
585
|
+
.leftJoin("environment_machines as m", (j) => j.onRef("m.environment_id", "=", "e.id").on("m.revoked_at", "is", null))
|
|
586
|
+
.select([
|
|
587
|
+
"e.id",
|
|
588
|
+
"e.name",
|
|
589
|
+
"e.is_default",
|
|
590
|
+
"e.source",
|
|
591
|
+
"e.provider",
|
|
592
|
+
"e.demoted_from_provider",
|
|
593
|
+
"e.created_at",
|
|
594
|
+
"m.id as machine_id",
|
|
595
|
+
"m.name as machine_name",
|
|
596
|
+
"m.os as machine_os",
|
|
597
|
+
"m.mode as machine_mode",
|
|
598
|
+
"m.program_version as machine_program_version",
|
|
599
|
+
"m.last_seen_at as machine_last_seen_at",
|
|
600
|
+
"m.session_isolation as machine_session_isolation",
|
|
601
|
+
"i.provider as instance_provider",
|
|
602
|
+
"i.fs_status",
|
|
603
|
+
"i.handle",
|
|
604
|
+
"i.status",
|
|
605
|
+
"i.last_used_at",
|
|
606
|
+
])
|
|
607
|
+
.where("e.org_id", "=", orgId)
|
|
608
|
+
.where("e.owner_kind", "=", "personal")
|
|
609
|
+
.where("e.owner_account_id", "=", accountId)
|
|
610
|
+
.where("e.deleted_at", "is", null)
|
|
611
|
+
.orderBy("e.is_default", "desc")
|
|
612
|
+
.orderBy("e.created_at")
|
|
613
|
+
.orderBy("e.id")
|
|
614
|
+
.execute();
|
|
615
|
+
const rows = id === undefined ? all : all.filter((r) => r.id === id);
|
|
616
|
+
if (rows.length === 0)
|
|
617
|
+
return [];
|
|
618
|
+
const factsOf = (r) => ({
|
|
619
|
+
provider: r.provider,
|
|
620
|
+
instanceProvider: r.instance_provider,
|
|
621
|
+
fsStatus: r.fs_status,
|
|
622
|
+
hasInstance: r.handle !== null,
|
|
623
|
+
});
|
|
624
|
+
// a former default is labelled after the provider holding its resources, else its marker
|
|
625
|
+
const demoted = new Map(all.map((r) => [r.id, demotedProvider(r.demoted_from_provider, factsOf(r))]));
|
|
626
|
+
const ordinals = new Map();
|
|
627
|
+
const seen = new Map();
|
|
628
|
+
for (const r of [...all].sort((a, b) => a.created_at.getTime() - b.created_at.getTime() || a.id.localeCompare(b.id))) {
|
|
629
|
+
const from = demoted.get(r.id) ?? null;
|
|
630
|
+
if (from === null || r.name !== null)
|
|
631
|
+
continue;
|
|
632
|
+
const n = (seen.get(from) ?? 0) + 1;
|
|
633
|
+
seen.set(from, n);
|
|
634
|
+
ordinals.set(r.id, n);
|
|
635
|
+
}
|
|
636
|
+
const demotedProviders = [
|
|
637
|
+
...new Set(rows.flatMap((r) => (demoted.get(r.id) ? [demoted.get(r.id)] : []))),
|
|
638
|
+
];
|
|
639
|
+
const [limits, names] = await Promise.all([
|
|
640
|
+
this.sandbox.orgLimits(orgId),
|
|
641
|
+
this.displayNames.many(demotedProviders),
|
|
642
|
+
]);
|
|
643
|
+
const current = this.providers.cloud()?.plugin;
|
|
644
|
+
// a device environment is online while a replica holds its machine's connection lease
|
|
645
|
+
const online = new Map(await Promise.all(rows
|
|
646
|
+
.filter((r) => r.source === "device")
|
|
647
|
+
.map(async (r) => [r.id, (await this.locks.holderOf(deviceLeaseKey(r.id))) !== null])));
|
|
648
|
+
return rows.map((r) => {
|
|
649
|
+
const provider = environmentProvider(factsOf(r), current);
|
|
650
|
+
const live = (r.status === "running" || r.status === "suspended") && r.last_used_at;
|
|
651
|
+
const from = demoted.get(r.id) ?? null;
|
|
652
|
+
return {
|
|
653
|
+
id: r.id,
|
|
654
|
+
name: r.name,
|
|
655
|
+
isDefault: r.is_default,
|
|
656
|
+
demotedFrom: from === null
|
|
657
|
+
? null
|
|
658
|
+
: {
|
|
659
|
+
provider: from,
|
|
660
|
+
displayName: names.get(from) ?? null,
|
|
661
|
+
ordinal: ordinals.get(r.id) ?? 1,
|
|
662
|
+
},
|
|
663
|
+
ownerKind: "personal",
|
|
664
|
+
source: r.source,
|
|
665
|
+
provider,
|
|
666
|
+
available: provider !== null && isInternalProvider(provider)
|
|
667
|
+
? this.providers.forName(provider) !== undefined
|
|
668
|
+
: current !== undefined && provider === current,
|
|
669
|
+
online: r.source === "device" ? (online.get(r.id) ?? false) : null,
|
|
670
|
+
machine: r.machine_id !== null && r.machine_name !== null && r.machine_os !== null
|
|
671
|
+
? {
|
|
672
|
+
id: r.machine_id,
|
|
673
|
+
name: r.machine_name,
|
|
674
|
+
os: r.machine_os,
|
|
675
|
+
mode: r.machine_mode,
|
|
676
|
+
programVersion: r.machine_program_version,
|
|
677
|
+
lastSeenAt: r.machine_last_seen_at?.toISOString() ?? null,
|
|
678
|
+
}
|
|
679
|
+
: null,
|
|
680
|
+
// a device environment's machine decides it; cloud environments have none in phase 2
|
|
681
|
+
sessionIsolation: r.machine_session_isolation ?? false,
|
|
682
|
+
filesLost: r.fs_status === "lost",
|
|
683
|
+
instance: live
|
|
684
|
+
? {
|
|
685
|
+
status: r.status,
|
|
686
|
+
lastUsedAt: r.last_used_at.toISOString(),
|
|
687
|
+
}
|
|
688
|
+
: null,
|
|
689
|
+
limits: { ...limits, allowHosts: [...limits.allowHosts] },
|
|
690
|
+
createdAt: r.created_at.toISOString(),
|
|
691
|
+
};
|
|
692
|
+
});
|
|
693
|
+
}
|
|
694
|
+
/**
|
|
695
|
+
* Serializes the person's environment writes in the org: the org row (`FOR SHARE`), then their
|
|
696
|
+
* membership row (`FOR NO KEY UPDATE`, or `FOR SHARE` with `mode` share: enough to keep the
|
|
697
|
+
* membership from being removed meanwhile), the order member removal locks them in. Not a
|
|
698
|
+
* member (any more) → `org.not_found`, as the org guard answers.
|
|
699
|
+
*/
|
|
700
|
+
async lockMember(orgId, accountId, mode = "update") {
|
|
701
|
+
const org = await this.db
|
|
702
|
+
.selectFrom("orgs")
|
|
703
|
+
.select("id")
|
|
704
|
+
.where("id", "=", orgId)
|
|
705
|
+
.where("deleted_at", "is", null)
|
|
706
|
+
.forShare()
|
|
707
|
+
.executeTakeFirst();
|
|
708
|
+
const m = org &&
|
|
709
|
+
(await this.db
|
|
710
|
+
.selectFrom("memberships")
|
|
711
|
+
.select("account_id")
|
|
712
|
+
.where("org_id", "=", orgId)
|
|
713
|
+
.where("account_id", "=", accountId)
|
|
714
|
+
.$if(mode === "update", (q) => q.forNoKeyUpdate())
|
|
715
|
+
.$if(mode === "share", (q) => q.forShare())
|
|
716
|
+
.executeTakeFirst());
|
|
717
|
+
if (!m)
|
|
718
|
+
throw new ApiError("org.not_found", "Organization not found");
|
|
719
|
+
}
|
|
720
|
+
/** Locks one of the person's live environments (after their membership); else `not_found`. */
|
|
721
|
+
async lockOwn(orgId, accountId, id) {
|
|
722
|
+
await this.lockMember(orgId, accountId);
|
|
723
|
+
const row = await this.db
|
|
724
|
+
.selectFrom("environments")
|
|
725
|
+
.select(["name", "is_default"])
|
|
726
|
+
.where("id", "=", id)
|
|
727
|
+
.where("org_id", "=", orgId)
|
|
728
|
+
.where("owner_kind", "=", "personal")
|
|
729
|
+
.where("owner_account_id", "=", accountId)
|
|
730
|
+
.where("deleted_at", "is", null)
|
|
731
|
+
.forNoKeyUpdate()
|
|
732
|
+
.executeTakeFirst();
|
|
733
|
+
if (!row)
|
|
734
|
+
throw environmentNotFound();
|
|
735
|
+
return row;
|
|
736
|
+
}
|
|
737
|
+
async assertNameFree(orgId, accountId, name) {
|
|
738
|
+
const clash = await this.db
|
|
739
|
+
.selectFrom("environments")
|
|
740
|
+
.select("id")
|
|
741
|
+
.where("org_id", "=", orgId)
|
|
742
|
+
.where("owner_account_id", "=", accountId)
|
|
743
|
+
.where("deleted_at", "is", null)
|
|
744
|
+
.where(sql `lower(name) = lower(${name})`)
|
|
745
|
+
.executeTakeFirst();
|
|
746
|
+
if (clash)
|
|
747
|
+
throw nameTaken();
|
|
748
|
+
}
|
|
749
|
+
};
|
|
750
|
+
__decorate([
|
|
751
|
+
Transactional()
|
|
752
|
+
], EnvironmentsService.prototype, "insert", null);
|
|
753
|
+
__decorate([
|
|
754
|
+
Transactional()
|
|
755
|
+
], EnvironmentsService.prototype, "createDevice", null);
|
|
756
|
+
__decorate([
|
|
757
|
+
Transactional()
|
|
758
|
+
], EnvironmentsService.prototype, "renameIn", null);
|
|
759
|
+
__decorate([
|
|
760
|
+
Transactional()
|
|
761
|
+
], EnvironmentsService.prototype, "remove", null);
|
|
762
|
+
__decorate([
|
|
763
|
+
Transactional()
|
|
764
|
+
], EnvironmentsService.prototype, "recordReset", null);
|
|
765
|
+
__decorate([
|
|
766
|
+
Transactional()
|
|
767
|
+
], EnvironmentsService.prototype, "insertDefault", null);
|
|
768
|
+
EnvironmentsService = __decorate([
|
|
769
|
+
Injectable(),
|
|
770
|
+
__param(0, Inject(KernelDb)),
|
|
771
|
+
__param(1, Inject(TransactionHost)),
|
|
772
|
+
__param(2, Inject(KernelConfigService)),
|
|
773
|
+
__param(3, Inject(SandboxProviders)),
|
|
774
|
+
__param(4, Inject(SandboxService)),
|
|
775
|
+
__param(5, Inject(SandboxJobs)),
|
|
776
|
+
__param(6, Inject(EnvironmentAccess)),
|
|
777
|
+
__param(7, Inject(ExtensionDisplayNames)),
|
|
778
|
+
__param(8, Inject(KERNEL_LOGGER)),
|
|
779
|
+
__param(9, Inject(LockService)),
|
|
780
|
+
__param(10, Inject(MachinesService))
|
|
781
|
+
], EnvironmentsService);
|
|
782
|
+
export { EnvironmentsService };
|
|
783
|
+
/**
|
|
784
|
+
* Ruling R24: a connected environment's files are in a directory on its machine, which the
|
|
785
|
+
* platform never wipes; a lost directory comes back with `capybara-device logout` and a new `login` on the machine.
|
|
786
|
+
*/
|
|
787
|
+
function refuseDeviceReset(env) {
|
|
788
|
+
if (env.provider === DEVICE_PROVIDER) {
|
|
789
|
+
throw new ApiError("environment.files_on_device", "This environment's files are in a directory on its connected machine and cannot be reset from here. To start over, run capybara-device logout, then capybara-device login into this environment, on that machine.");
|
|
790
|
+
}
|
|
791
|
+
}
|