@capybara-hq/kernel 0.1.0-rc.3 → 0.1.0-rc.5
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 +61 -5
- package/dist/admin/admin.controller.d.ts +47 -16
- package/dist/admin/admin.controller.js +44 -19
- package/dist/admin/extensions.controller.d.ts +24 -3
- package/dist/admin/extensions.controller.js +48 -8
- package/dist/admin/setup-lock.d.ts +1 -1
- package/dist/admin/setup-lock.js +1 -1
- package/dist/admin/setup.controller.d.ts +1 -1
- package/dist/admin/setup.controller.js +1 -1
- package/dist/admin/setup.service.d.ts +4 -4
- package/dist/admin/setup.service.js +8 -8
- package/dist/agents/agent-lookup.d.ts +19 -0
- package/dist/agents/agent-lookup.js +21 -0
- package/dist/agents/agent-profile.service.d.ts +29 -0
- package/dist/agents/agent-profile.service.js +117 -0
- package/dist/agents/agents.controller.d.ts +168 -3
- package/dist/agents/agents.controller.js +201 -12
- package/dist/agents/agents.module.d.ts +4 -1
- package/dist/agents/agents.module.js +36 -6
- package/dist/agents/agents.service.d.ts +64 -27
- package/dist/agents/agents.service.js +199 -74
- package/dist/agents/definition.d.ts +53 -0
- package/dist/agents/definition.js +55 -0
- package/dist/agents/from-template.d.ts +106 -0
- package/dist/agents/from-template.js +649 -0
- package/dist/agents/from-template.service.d.ts +60 -0
- package/dist/agents/from-template.service.js +161 -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 +9 -3
- package/dist/agents/models.controller.js +19 -4
- package/dist/agents/org-templates.d.ts +176 -0
- package/dist/agents/org-templates.js +827 -0
- package/dist/agents/pending-connector-requests.d.ts +77 -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 +96 -0
- package/dist/agents/profile.js +51 -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 +86 -5
- package/dist/agents/templates.controller.js +171 -7
- package/dist/agents/templates.d.ts +127 -23
- package/dist/agents/templates.js +476 -53
- package/dist/background/background.controller.d.ts +38 -0
- package/dist/background/background.controller.js +87 -0
- package/dist/background/background.module.d.ts +10 -0
- package/dist/background/background.module.js +39 -0
- package/dist/background/finish.d.ts +44 -0
- package/dist/background/finish.js +94 -0
- package/dist/background/launch-lock.d.ts +15 -0
- package/dist/background/launch-lock.js +40 -0
- package/dist/background/launch.d.ts +36 -0
- package/dist/background/launch.js +70 -0
- package/dist/background/poll.job.d.ts +56 -0
- package/dist/background/poll.job.js +190 -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 +79 -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 +243 -0
- package/dist/background/store.d.ts +162 -0
- package/dist/background/store.js +357 -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 +211 -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 +129 -30
- package/dist/catalog/admin-catalog.controller.js +213 -42
- package/dist/catalog/catalog-content.d.ts +58 -32
- package/dist/catalog/catalog-content.js +34 -8
- 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 +111 -7
- package/dist/catalog/catalog-items.js +279 -13
- package/dist/catalog/catalog-scope.service.d.ts +260 -0
- package/dist/catalog/catalog-scope.service.js +1116 -0
- package/dist/catalog/catalog.module.d.ts +7 -9
- package/dist/catalog/catalog.module.js +41 -31
- package/dist/catalog/catalog.service.d.ts +101 -29
- package/dist/catalog/catalog.service.js +104 -106
- package/dist/catalog/claude/agents.js +2 -0
- package/dist/catalog/cli.d.ts +11 -1
- package/dist/catalog/cli.js +26 -1
- package/dist/catalog/component-promotion.d.ts +96 -0
- package/dist/catalog/component-promotion.js +395 -0
- package/dist/catalog/component-scope.controller.d.ts +152 -0
- package/dist/catalog/component-scope.controller.js +287 -0
- package/dist/catalog/component-scope.service.d.ts +303 -0
- package/dist/catalog/component-scope.service.js +936 -0
- package/dist/catalog/component-state.d.ts +174 -0
- package/dist/catalog/component-state.js +437 -0
- package/dist/catalog/job-ids.d.ts +30 -0
- package/dist/catalog/job-ids.js +25 -0
- package/dist/catalog/marketplace-fetch.d.ts +1 -1
- package/dist/catalog/marketplaces.controller.d.ts +22 -5
- package/dist/catalog/marketplaces.controller.js +56 -7
- package/dist/catalog/marketplaces.service.d.ts +54 -14
- package/dist/catalog/marketplaces.service.js +71 -22
- package/dist/catalog/org-catalog.controller.d.ts +125 -34
- package/dist/catalog/org-catalog.controller.js +181 -65
- package/dist/catalog/org-catalog.service.d.ts +65 -33
- package/dist/catalog/org-catalog.service.js +324 -157
- 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 +119 -0
- package/dist/catalog/org-extension.controller.js +266 -0
- package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
- package/dist/catalog/org-plugin-uploads.controller.js +213 -0
- package/dist/catalog/org-plugin-uploads.d.ts +63 -0
- package/dist/catalog/org-plugin-uploads.js +116 -0
- package/dist/catalog/owned-items.d.ts +184 -0
- package/dist/catalog/owned-items.js +789 -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 +221 -0
- package/dist/catalog/platform-components.js +761 -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 +178 -34
- package/dist/catalog/plugin-import.js +623 -83
- package/dist/catalog/plugin-install.d.ts +185 -41
- package/dist/catalog/plugin-install.js +758 -126
- package/dist/catalog/plugin-upgrade.d.ts +260 -225
- package/dist/catalog/plugin-upgrade.js +1148 -1137
- package/dist/catalog/request-rules.d.ts +65 -0
- package/dist/catalog/request-rules.js +217 -0
- package/dist/catalog/requests.service.d.ts +193 -118
- package/dist/catalog/requests.service.js +526 -343
- package/dist/catalog/reserved-names.d.ts +8 -0
- package/dist/catalog/reserved-names.js +42 -0
- package/dist/catalog/scope-orgs.d.ts +21 -0
- package/dist/catalog/scope-orgs.js +67 -0
- package/dist/catalog/scope-state.d.ts +35 -0
- package/dist/catalog/scope-state.js +87 -0
- package/dist/catalog/scope-sync-workers.d.ts +7 -0
- package/dist/catalog/scope-sync-workers.js +29 -0
- package/dist/catalog/scope-sync.d.ts +176 -0
- package/dist/catalog/scope-sync.js +576 -0
- package/dist/catalog/scope.d.ts +42 -0
- package/dist/catalog/scope.js +42 -0
- package/dist/catalog/unshare.d.ts +22 -0
- package/dist/catalog/unshare.js +118 -0
- package/dist/channels/actions.js +1 -0
- package/dist/channels/cards.js +21 -3
- package/dist/channels/channels.module.js +2 -0
- package/dist/channels/connections.service.d.ts +16 -1
- package/dist/channels/connections.service.js +38 -4
- package/dist/channels/inbound.d.ts +9 -1
- package/dist/channels/inbound.js +67 -5
- package/dist/channels/phrases.d.ts +35 -0
- package/dist/channels/phrases.js +29 -0
- package/dist/channels/threads.d.ts +5 -0
- package/dist/channels/threads.js +8 -0
- package/dist/config/docs.js +3 -1
- package/dist/config/schema.d.ts +24 -2
- package/dist/config/schema.js +145 -19
- package/dist/conversations/access.d.ts +6 -4
- package/dist/conversations/access.js +29 -5
- package/dist/conversations/agent-tree.d.ts +46 -0
- package/dist/conversations/agent-tree.js +92 -0
- package/dist/conversations/attachments.service.d.ts +30 -0
- package/dist/conversations/attachments.service.js +130 -5
- package/dist/conversations/conversations.controller.d.ts +79 -23
- package/dist/conversations/conversations.controller.js +141 -50
- package/dist/conversations/conversations.module.d.ts +1 -1
- package/dist/conversations/conversations.module.js +10 -7
- package/dist/conversations/conversations.service.d.ts +108 -9
- package/dist/conversations/conversations.service.js +237 -30
- package/dist/conversations/environment-status.d.ts +24 -0
- package/dist/conversations/environment-status.js +71 -0
- package/dist/conversations/event-log.d.ts +21 -6
- package/dist/conversations/event-log.js +70 -1
- package/dist/conversations/events.d.ts +140 -0
- package/dist/conversations/events.js +142 -13
- package/dist/conversations/queue.d.ts +3 -1
- package/dist/conversations/queue.js +13 -2
- package/dist/conversations/queue.service.d.ts +1 -1
- package/dist/conversations/queue.service.js +8 -1
- package/dist/conversations/titles.d.ts +12 -3
- package/dist/conversations/titles.js +36 -8
- package/dist/conversations/tree.d.ts +17 -0
- package/dist/conversations/tree.js +42 -0
- package/dist/ctx/create-ctx.d.ts +5 -0
- package/dist/ctx/create-ctx.js +15 -5
- package/dist/db/kernel-schema.d.ts +420 -20
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +3 -0
- package/dist/environments/access.d.ts +41 -0
- package/dist/environments/access.js +77 -0
- package/dist/environments/conversation-environments.d.ts +61 -0
- package/dist/environments/conversation-environments.js +170 -0
- package/dist/environments/dto.d.ts +25 -0
- package/dist/environments/dto.js +12 -0
- package/dist/environments/environments.controller.d.ts +33 -0
- package/dist/environments/environments.controller.js +110 -0
- package/dist/environments/environments.module.d.ts +8 -0
- package/dist/environments/environments.module.js +27 -0
- package/dist/environments/environments.service.d.ts +153 -0
- package/dist/environments/environments.service.js +541 -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 +90 -2
- package/dist/errors.js +90 -2
- package/dist/evals/reconstruct.d.ts +18 -9
- package/dist/evals/reconstruct.js +26 -7
- package/dist/evals/run-replay.d.ts +7 -2
- package/dist/evals/run-replay.js +42 -7
- package/dist/evals/step-replay.d.ts +2 -5
- package/dist/evals/step-replay.js +13 -7
- package/dist/evals/trajectory.js +1 -1
- package/dist/evals/trajectory.service.d.ts +8 -3
- package/dist/evals/trajectory.service.js +26 -14
- package/dist/evals/worker.d.ts +5 -5
- package/dist/evals/worker.js +9 -3
- package/dist/extensions/admin-ops.d.ts +36 -10
- package/dist/extensions/admin-ops.js +67 -42
- package/dist/extensions/admin-view.d.ts +39 -10
- package/dist/extensions/admin-view.js +111 -20
- package/dist/extensions/blobs.js +1 -0
- package/dist/extensions/bootstrap.d.ts +17 -4
- package/dist/extensions/bootstrap.js +70 -9
- package/dist/extensions/cli.d.ts +12 -0
- package/dist/extensions/cli.js +11 -2
- package/dist/extensions/config-issues.d.ts +13 -1
- package/dist/extensions/config-issues.js +22 -5
- package/dist/extensions/config-json-schema.d.ts +43 -7
- package/dist/extensions/config-json-schema.js +124 -58
- package/dist/extensions/deployment-config-store.d.ts +6 -0
- package/dist/extensions/deployment-config.d.ts +78 -8
- package/dist/extensions/deployment-config.js +172 -34
- package/dist/extensions/display-name.d.ts +22 -0
- package/dist/extensions/display-name.js +77 -0
- package/dist/extensions/effective-config.d.ts +127 -0
- package/dist/extensions/effective-config.js +368 -0
- package/dist/extensions/extensions.module.js +14 -2
- package/dist/extensions/hooks.d.ts +37 -4
- package/dist/extensions/hooks.js +82 -16
- package/dist/extensions/host.d.ts +45 -2
- package/dist/extensions/host.js +112 -16
- package/dist/extensions/installs.d.ts +20 -8
- package/dist/extensions/installs.js +37 -15
- package/dist/extensions/org-config.d.ts +81 -6
- package/dist/extensions/org-config.js +195 -44
- 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 +19 -4
- package/dist/extensions/permission-view.js +4 -4
- 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 +34 -0
- package/dist/extensions/point-defaults.controller.js +71 -0
- package/dist/extensions/point-defaults.d.ts +71 -0
- package/dist/extensions/point-defaults.js +234 -0
- package/dist/extensions/registry.d.ts +1 -1
- package/dist/extensions/registry.js +2 -0
- package/dist/extensions/resolve.d.ts +5 -1
- package/dist/extensions/resolve.js +15 -2
- package/dist/files/previewers.d.ts +8 -1
- package/dist/files/previewers.js +35 -6
- package/dist/http/api.module.js +31 -3
- package/dist/http/app.d.ts +11 -2
- package/dist/http/app.js +31 -5
- package/dist/http/nest-logger.d.ts +6 -5
- package/dist/http/nest-logger.js +24 -10
- package/dist/identity/accounts.d.ts +29 -29
- package/dist/identity/accounts.js +47 -47
- package/dist/identity/audit.d.ts +2 -1
- package/dist/identity/auth.controller.js +9 -5
- package/dist/identity/auth.guard.d.ts +13 -5
- package/dist/identity/auth.guard.js +26 -9
- package/dist/identity/cookies.d.ts +20 -5
- package/dist/identity/cookies.js +44 -6
- package/dist/identity/identity.module.d.ts +1 -1
- package/dist/identity/identity.module.js +4 -4
- package/dist/identity/me.controller.d.ts +5 -1
- package/dist/identity/me.controller.js +12 -3
- package/dist/identity/principal.d.ts +3 -3
- package/dist/identity/principal.js +3 -3
- package/dist/identity/sessions.d.ts +12 -0
- package/dist/identity/sessions.js +45 -0
- package/dist/identity/settings.d.ts +22 -11
- package/dist/identity/settings.js +53 -18
- package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
- package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
- package/dist/inbox/inbox.module.d.ts +4 -1
- package/dist/inbox/inbox.module.js +7 -3
- package/dist/inbox/inbox.service.d.ts +62 -3
- package/dist/inbox/inbox.service.js +74 -4
- package/dist/inbox/org-notices.d.ts +63 -0
- package/dist/inbox/org-notices.js +91 -0
- package/dist/inbox/platform-inbox.controller.d.ts +23 -0
- package/dist/inbox/platform-inbox.controller.js +58 -0
- package/dist/inbox/platform-inbox.service.d.ts +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 +2 -2
- package/dist/index.js +1 -1
- package/dist/infra/cli/kernel-cli.module.js +9 -1
- package/dist/infra/config/kernel-config.service.js +27 -1
- package/dist/infra/database/database.module.js +1 -0
- package/dist/infra/database/xact-lock.d.ts +1 -1
- package/dist/infra/database/xact-lock.js +1 -1
- package/dist/infra/events/kernel-events.d.ts +19 -2
- package/dist/infra/lifecycle/process-guards.js +4 -0
- package/dist/infra/logging/logging.module.d.ts +4 -2
- package/dist/infra/logging/logging.module.js +24 -6
- package/dist/infra/queue/add-job-once.d.ts +14 -0
- package/dist/infra/queue/add-job-once.js +16 -0
- package/dist/infra/queue/redis-connection.d.ts +6 -0
- package/dist/infra/queue/redis-connection.js +7 -0
- package/dist/infra/redis/redis.module.js +6 -2
- package/dist/infra/tokens.d.ts +6 -1
- package/dist/infra/tokens.js +6 -1
- package/dist/kernel.module.js +6 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
- package/dist/lifecycle/kernel-lifecycle.js +4 -4
- package/dist/log.d.ts +13 -1
- package/dist/log.js +93 -17
- package/dist/models/prices.d.ts +5 -5
- package/dist/models/prices.js +4 -4
- package/dist/models/purposes.controller.d.ts +6 -4
- package/dist/models/purposes.controller.js +13 -7
- package/dist/models/purposes.d.ts +43 -9
- package/dist/models/purposes.js +48 -18
- package/dist/orgs/directory-sync.d.ts +14 -5
- package/dist/orgs/directory-sync.js +41 -17
- package/dist/orgs/offboarding.d.ts +12 -8
- package/dist/orgs/offboarding.js +54 -33
- package/dist/orgs/org-lock.d.ts +5 -0
- package/dist/orgs/org-lock.js +13 -0
- package/dist/orgs/org.guard.d.ts +10 -0
- package/dist/orgs/org.guard.js +43 -32
- package/dist/orgs/orgs.module.js +3 -0
- package/dist/orgs/orgs.service.d.ts +20 -7
- package/dist/orgs/orgs.service.js +32 -12
- package/dist/orgs/roles.d.ts +1 -1
- package/dist/orgs/roles.js +5 -1
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.service.d.ts +20 -3
- package/dist/orgs/settings.service.js +19 -4
- package/dist/overrides.d.ts +3 -0
- package/dist/overrides.js +2 -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 +11 -0
- package/dist/platform/errors.js +26 -0
- package/dist/platform/exclusions.d.ts +12 -0
- package/dist/platform/exclusions.js +1387 -0
- package/dist/platform/method.d.ts +6 -0
- package/dist/platform/method.js +15 -0
- package/dist/platform/operation.d.ts +92 -0
- package/dist/platform/operation.js +35 -0
- package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
- package/dist/platform/ops/agent-templates.ops.js +92 -0
- package/dist/platform/ops/agents.ops.d.ts +19 -0
- package/dist/platform/ops/agents.ops.js +294 -0
- package/dist/platform/ops/connectors.ops.d.ts +15 -0
- package/dist/platform/ops/connectors.ops.js +126 -0
- package/dist/platform/ops/errors.d.ts +11 -0
- package/dist/platform/ops/errors.js +22 -0
- package/dist/platform/ops/extensions.ops.d.ts +19 -0
- package/dist/platform/ops/extensions.ops.js +116 -0
- package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
- package/dist/platform/ops/marketplaces.ops.js +157 -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 +23 -0
- package/dist/platform/ops/platform.ops.js +158 -0
- package/dist/platform/ops/plugins.ops.d.ts +33 -0
- package/dist/platform/ops/plugins.ops.js +377 -0
- package/dist/platform/ops/requests.ops.d.ts +14 -0
- package/dist/platform/ops/requests.ops.js +153 -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 +13 -0
- package/dist/platform/ops/skills.ops.js +98 -0
- package/dist/platform/ops/summary.d.ts +10 -0
- package/dist/platform/ops/summary.js +18 -0
- package/dist/platform/platform-ops.module.d.ts +7 -0
- package/dist/platform/platform-ops.module.js +55 -0
- package/dist/platform/platform.module.d.ts +8 -0
- package/dist/platform/platform.module.js +25 -0
- package/dist/platform/redact-orgs.d.ts +7 -0
- package/dist/platform/redact-orgs.js +52 -0
- package/dist/platform/registry.d.ts +30 -0
- package/dist/platform/registry.js +111 -0
- package/dist/roles/worker-role.d.ts +6 -4
- package/dist/roles/worker-role.js +14 -7
- package/dist/roles/worker.module.d.ts +1 -1
- package/dist/roles/worker.module.js +15 -1
- package/dist/runtime/context/build.d.ts +11 -7
- package/dist/runtime/context/build.js +46 -19
- package/dist/runtime/context/claude-tools.d.ts +3 -1
- package/dist/runtime/context/claude-tools.js +8 -6
- package/dist/runtime/context/compaction.js +13 -0
- package/dist/runtime/context/reminders.d.ts +2 -0
- package/dist/runtime/context/reminders.js +2 -0
- package/dist/runtime/context/skills.js +9 -2
- package/dist/runtime/context/tool-changes.d.ts +27 -0
- package/dist/runtime/context/tool-changes.js +60 -0
- package/dist/runtime/hook-calls.js +2 -0
- package/dist/runtime/langgraph-loop.d.ts +3 -1
- package/dist/runtime/langgraph-loop.js +36 -17
- package/dist/runtime/loop.d.ts +34 -5
- package/dist/runtime/maintenance.d.ts +9 -4
- package/dist/runtime/maintenance.js +35 -8
- package/dist/runtime/model-call.d.ts +46 -8
- package/dist/runtime/model-call.js +72 -21
- package/dist/runtime/providers.d.ts +6 -0
- package/dist/runtime/providers.js +8 -0
- package/dist/runtime/run-control.d.ts +11 -1
- package/dist/runtime/run-control.js +12 -0
- package/dist/runtime/run-drafts.d.ts +85 -0
- package/dist/runtime/run-drafts.js +230 -0
- package/dist/runtime/run-jobs.d.ts +3 -5
- package/dist/runtime/run-jobs.js +3 -7
- package/dist/runtime/run-queue.d.ts +59 -2
- package/dist/runtime/run-queue.js +311 -38
- package/dist/runtime/run-worker.d.ts +11 -5
- package/dist/runtime/run-worker.js +69 -33
- package/dist/runtime/runtime.module.js +11 -3
- package/dist/runtime/step-log.d.ts +15 -4
- package/dist/runtime/step-log.js +24 -7
- package/dist/runtime/stream.controller.d.ts +23 -1
- package/dist/runtime/stream.controller.js +60 -3
- package/dist/runtime/stream.d.ts +4 -1
- package/dist/runtime/stream.js +27 -3
- package/dist/runtime/subagents/child.d.ts +55 -7
- package/dist/runtime/subagents/child.js +105 -7
- package/dist/runtime/subagents/definition.d.ts +12 -3
- package/dist/runtime/subagents/definition.js +44 -28
- package/dist/runtime/subagents/deliveries.d.ts +71 -0
- package/dist/runtime/subagents/deliveries.js +228 -0
- package/dist/runtime/subagents/dispatch.d.ts +115 -26
- package/dist/runtime/subagents/dispatch.js +212 -141
- package/dist/runtime/subagents/limits.d.ts +24 -5
- package/dist/runtime/subagents/limits.js +40 -6
- package/dist/runtime/subagents/messages.d.ts +95 -0
- package/dist/runtime/subagents/messages.js +328 -0
- package/dist/runtime/subagents/preamble.d.ts +4 -4
- package/dist/runtime/subagents/preamble.js +9 -7
- package/dist/runtime/subagents/progress.d.ts +8 -6
- package/dist/runtime/subagents/progress.js +11 -6
- package/dist/runtime/subagents/render.d.ts +30 -0
- package/dist/runtime/subagents/render.js +53 -0
- package/dist/runtime/subagents/roster.d.ts +24 -7
- package/dist/runtime/subagents/roster.js +47 -11
- package/dist/runtime/subagents/skill-fork.d.ts +3 -2
- package/dist/runtime/subagents/skill-fork.js +8 -4
- 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 +7 -4
- package/dist/runtime/subagents/subagents.service.js +11 -6
- package/dist/runtime/usage-report.d.ts +2 -1
- package/dist/runtime/usage-report.js +19 -13
- package/dist/runtime/waits.d.ts +145 -36
- package/dist/runtime/waits.js +423 -109
- package/dist/sandbox/jobs.d.ts +40 -13
- package/dist/sandbox/jobs.js +57 -20
- package/dist/sandbox/leases.d.ts +37 -54
- package/dist/sandbox/leases.js +71 -115
- package/dist/sandbox/providers.d.ts +2 -2
- package/dist/sandbox/providers.js +1 -1
- package/dist/sandbox/sandbox.module.d.ts +3 -2
- package/dist/sandbox/sandbox.module.js +10 -4
- package/dist/sandbox/sandbox.service.d.ts +282 -129
- package/dist/sandbox/sandbox.service.js +736 -381
- package/dist/skills/catalog.d.ts +3 -2
- package/dist/skills/catalog.js +21 -43
- package/dist/skills/changes.controller.d.ts +7 -0
- package/dist/skills/changes.controller.js +19 -1
- package/dist/skills/invoke.js +8 -3
- package/dist/skills/package.d.ts +20 -1
- package/dist/skills/package.js +28 -1
- package/dist/skills/skills.controller.d.ts +39 -4
- package/dist/skills/skills.controller.js +88 -10
- package/dist/skills/skills.module.js +10 -1
- package/dist/skills/skills.service.d.ts +106 -26
- package/dist/skills/skills.service.js +421 -75
- package/dist/skills/usable.d.ts +81 -0
- package/dist/skills/usable.js +379 -0
- package/dist/tools/approvals.service.d.ts +20 -2
- package/dist/tools/approvals.service.js +25 -4
- package/dist/tools/builtin-names.d.ts +41 -7
- package/dist/tools/builtin-names.js +59 -7
- package/dist/tools/builtins/agent.d.ts +23 -21
- package/dist/tools/builtins/agent.js +62 -55
- package/dist/tools/builtins/builtin-tools.d.ts +19 -1
- package/dist/tools/builtins/builtin-tools.js +59 -2
- package/dist/tools/builtins/handback.d.ts +28 -0
- package/dist/tools/builtins/handback.js +53 -0
- package/dist/tools/builtins/platform.d.ts +34 -0
- package/dist/tools/builtins/platform.js +362 -0
- package/dist/tools/builtins/sandbox/bash.d.ts +1 -1
- package/dist/tools/builtins/sandbox/bash.js +241 -4
- package/dist/tools/builtins/sandbox/common.d.ts +69 -27
- package/dist/tools/builtins/sandbox/common.js +87 -48
- package/dist/tools/builtins/sandbox/deliver.js +1 -1
- package/dist/tools/builtins/sandbox/edit.js +2 -2
- package/dist/tools/builtins/sandbox/glob.js +2 -2
- package/dist/tools/builtins/sandbox/grep.js +2 -4
- package/dist/tools/builtins/sandbox/index.d.ts +3 -1
- package/dist/tools/builtins/sandbox/index.js +7 -1
- package/dist/tools/builtins/sandbox/read.js +1 -1
- package/dist/tools/builtins/sandbox/task-output.d.ts +74 -0
- package/dist/tools/builtins/sandbox/task-output.js +329 -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.js +2 -2
- 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 +22 -14
- package/dist/tools/builtins/skill-load.js +86 -57
- package/dist/tools/builtins/skill-write.js +1 -1
- 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/connectors.controller.d.ts +10 -0
- package/dist/tools/connectors.controller.js +12 -0
- package/dist/tools/connectors.service.d.ts +46 -5
- package/dist/tools/connectors.service.js +94 -15
- 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 +42 -1
- package/dist/tools/info.js +64 -1
- package/dist/tools/oauth/flow-paths.d.ts +1 -1
- package/dist/tools/oauth/flow-paths.js +1 -1
- package/dist/tools/org-tool-switches.d.ts +74 -0
- package/dist/tools/org-tool-switches.js +184 -0
- package/dist/tools/pipeline.d.ts +46 -40
- package/dist/tools/pipeline.js +202 -364
- package/dist/tools/policy.d.ts +1 -1
- package/dist/tools/policy.js +36 -16
- package/dist/tools/registry.d.ts +120 -8
- package/dist/tools/registry.js +112 -19
- package/dist/tools/tools.module.js +24 -2
- package/dist/tools/validate.js +1 -1
- package/dist/ui/views.d.ts +2 -1
- package/dist/ui/views.js +17 -3
- package/package.json +3 -3
- 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/dist/catalog/upgrade-targets.d.ts +0 -56
- package/dist/catalog/upgrade-targets.js +0 -90
- package/dist/conversations/sandbox-status.d.ts +0 -24
- package/dist/conversations/sandbox-status.js +0 -52
- package/dist/extensions/org-config.controller.d.ts +0 -24
- package/dist/extensions/org-config.controller.js +0 -62
|
@@ -11,6 +11,9 @@ import { randomUUID } from "node:crypto";
|
|
|
11
11
|
import { Inject, Injectable } from "@nestjs/common";
|
|
12
12
|
import { sql } from "kysely";
|
|
13
13
|
import { AgentLookup, visibleTo } from "../agents/agent-lookup.js";
|
|
14
|
+
import { BackgroundTaskStopper } from "../background/stop.js";
|
|
15
|
+
import { unbindConversation } from "../channels/threads.js";
|
|
16
|
+
import { ConversationEnvironments, } from "../environments/conversation-environments.js";
|
|
14
17
|
import { ApiError } from "../errors.js";
|
|
15
18
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
16
19
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
@@ -18,13 +21,37 @@ import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
|
18
21
|
import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
19
22
|
import { ProviderRegistry } from "../runtime/providers.js";
|
|
20
23
|
import { RunControl as RunControlService } from "../runtime/run-control.js";
|
|
24
|
+
import { rootConversationOf } from "../runtime/subagents/child.js";
|
|
21
25
|
import { SkillInvoker } from "../skills/invoke.js";
|
|
22
26
|
import { ConnectorContent } from "../tools/connector-content.js";
|
|
23
27
|
import { ConversationAccess, parentReachable } from "./access.js";
|
|
28
|
+
import { readAgentTree } from "./agent-tree.js";
|
|
24
29
|
import { AttachmentsService } from "./attachments.service.js";
|
|
25
30
|
import { EventLog } from "./event-log.js";
|
|
26
31
|
import { userMessageIdemKey } from "./idem-keys.js";
|
|
27
32
|
import { NO_SELECTION, planSelection, readSelection } from "./selection.js";
|
|
33
|
+
import { conversationTree } from "./tree.js";
|
|
34
|
+
/** Escapes `\`, `%` and `_` so user text is matched literally by `LIKE … ESCAPE '\'`. */
|
|
35
|
+
export function escapeLike(s) {
|
|
36
|
+
return s.replace(/[\\%_]/g, (ch) => `\\${ch}`);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* SQL for the activity of the conversation row aliased/named `ref` (a correlated subquery).
|
|
40
|
+
* A run waiting on its sub-agents (status waiting with `wait_expires_at`, set only for a
|
|
41
|
+
* `subagents` wait) is still working, so it reports `running`; only a wait for a person
|
|
42
|
+
* (approval, input) reports `waiting`.
|
|
43
|
+
*/
|
|
44
|
+
function activitySql(ref) {
|
|
45
|
+
const id = sql.ref(`${ref}.id`);
|
|
46
|
+
return sql `(
|
|
47
|
+
SELECT CASE
|
|
48
|
+
WHEN lr.status IN ('queued', 'running') THEN 'running'
|
|
49
|
+
WHEN lr.status = 'waiting' AND lr.wait_expires_at IS NOT NULL THEN 'running'
|
|
50
|
+
WHEN lr.status = 'waiting' THEN 'waiting' END
|
|
51
|
+
FROM capybara.runs lr WHERE lr.conversation_id = ${id}
|
|
52
|
+
ORDER BY lr.created_at DESC, lr.id DESC LIMIT 1
|
|
53
|
+
)`;
|
|
54
|
+
}
|
|
28
55
|
const notFound = () => new ApiError("conversation.not_found", "Conversation not found");
|
|
29
56
|
export { userMessageIdemKey } from "./idem-keys.js";
|
|
30
57
|
const COLUMNS = [
|
|
@@ -40,6 +67,8 @@ const COLUMNS = [
|
|
|
40
67
|
"updated_at",
|
|
41
68
|
"parent_conversation_id",
|
|
42
69
|
"subagent_type",
|
|
70
|
+
"archived_at",
|
|
71
|
+
"environment_id",
|
|
43
72
|
];
|
|
44
73
|
function toView(r) {
|
|
45
74
|
return {
|
|
@@ -55,10 +84,18 @@ function toView(r) {
|
|
|
55
84
|
updatedAt: r.updated_at,
|
|
56
85
|
parentConversationId: r.parent_conversation_id,
|
|
57
86
|
subagentType: r.subagent_type,
|
|
87
|
+
archivedAt: r.archived_at,
|
|
88
|
+
environmentId: r.environment_id,
|
|
89
|
+
activity: r.activity ?? null,
|
|
58
90
|
};
|
|
59
91
|
}
|
|
60
92
|
/** The longest conversation title (characters, after trimming). */
|
|
61
93
|
export const CONVERSATION_TITLE_MAX_CHARS = 120;
|
|
94
|
+
/**
|
|
95
|
+
* How far back a `before` page of events reaches past its `limit` for the start of a turn (history
|
|
96
|
+
* paging spec §2); a longer run starts mid-run.
|
|
97
|
+
*/
|
|
98
|
+
export const EVENTS_TURN_EXTEND = 2000;
|
|
62
99
|
/** The sums of the `usage` events matching `where` (over `conversation_events e`), one row. */
|
|
63
100
|
const usageSums = (where) => sql `
|
|
64
101
|
SELECT
|
|
@@ -90,6 +127,8 @@ let ConversationsService = class ConversationsService {
|
|
|
90
127
|
content;
|
|
91
128
|
attachments;
|
|
92
129
|
invoker;
|
|
130
|
+
background;
|
|
131
|
+
environments;
|
|
93
132
|
txHost;
|
|
94
133
|
constructor(db, eventLog, agents, access,
|
|
95
134
|
/** Starts and stops the conversation's runs. */
|
|
@@ -101,7 +140,11 @@ let ConversationsService = class ConversationsService {
|
|
|
101
140
|
/** Binds uploaded files to the conversation in the message's transaction. */
|
|
102
141
|
attachments,
|
|
103
142
|
/** Renders a person's skill invocation (phase D). */
|
|
104
|
-
invoker,
|
|
143
|
+
invoker,
|
|
144
|
+
/** Stops a deleted conversation's background tasks. */
|
|
145
|
+
background,
|
|
146
|
+
/** The environment a new conversation is bound to (environments spec §4.1 item 1). */
|
|
147
|
+
environments, txHost) {
|
|
105
148
|
this.db = db;
|
|
106
149
|
this.eventLog = eventLog;
|
|
107
150
|
this.agents = agents;
|
|
@@ -112,6 +155,8 @@ let ConversationsService = class ConversationsService {
|
|
|
112
155
|
this.content = content;
|
|
113
156
|
this.attachments = attachments;
|
|
114
157
|
this.invoker = invoker;
|
|
158
|
+
this.background = background;
|
|
159
|
+
this.environments = environments;
|
|
115
160
|
this.txHost = txHost;
|
|
116
161
|
}
|
|
117
162
|
/**
|
|
@@ -123,12 +168,24 @@ let ConversationsService = class ConversationsService {
|
|
|
123
168
|
.ensureRun(conversationId)
|
|
124
169
|
.catch((err) => this.log.warn("ensureRun on conversation open failed", { conversationId, err }));
|
|
125
170
|
}
|
|
126
|
-
/**
|
|
127
|
-
|
|
171
|
+
/**
|
|
172
|
+
* Creates an empty conversation bound to its environment (`pick`, see
|
|
173
|
+
* {@link ConversationEnvironments.forNew}); an agent the account cannot use →
|
|
174
|
+
* `agent.not_found`, an environment it may not use → `environment.not_found` /
|
|
175
|
+
* `environment.unavailable`, and nothing is created.
|
|
176
|
+
*/
|
|
177
|
+
async create(orgId, accountId, agentId, pick = {}) {
|
|
128
178
|
await this.agents.get(orgId, agentId, accountId);
|
|
179
|
+
const environmentId = await this.environments.forNew(orgId, accountId, pick);
|
|
129
180
|
const row = await this.db
|
|
130
181
|
.insertInto("conversations")
|
|
131
|
-
.values({
|
|
182
|
+
.values({
|
|
183
|
+
id: randomUUID(),
|
|
184
|
+
org_id: orgId,
|
|
185
|
+
agent_id: agentId,
|
|
186
|
+
account_id: accountId,
|
|
187
|
+
environment_id: environmentId,
|
|
188
|
+
})
|
|
132
189
|
.returning(COLUMNS)
|
|
133
190
|
.executeTakeFirstOrThrow();
|
|
134
191
|
return toView(row);
|
|
@@ -139,18 +196,22 @@ let ConversationsService = class ConversationsService {
|
|
|
139
196
|
* message's `clientMessageId` (`create_request_id`), so a retried send returns the same
|
|
140
197
|
* conversation and event with `created: false`. An agent the caller cannot use →
|
|
141
198
|
* `agent.not_found` and nothing is written. Queues a run afterwards, like `postUserMessage`.
|
|
199
|
+
* `events` are every event the create wrote, in seq order from seq 1 (a `model_switched` before
|
|
200
|
+
* the message when the send switched), so a client can seed the new conversation's log whole.
|
|
142
201
|
*/
|
|
143
|
-
async createWithMessage(orgId, accountId, agentId, input) {
|
|
202
|
+
async createWithMessage(orgId, accountId, agentId, input, pick = {}) {
|
|
144
203
|
const agent = await this.agents.get(orgId, agentId, accountId);
|
|
145
204
|
const prior = await this.findCreated(orgId, accountId, agentId, input.clientMessageId);
|
|
146
205
|
if (prior)
|
|
147
206
|
return prior;
|
|
207
|
+
const environmentId = await this.environments.forNew(orgId, accountId, pick);
|
|
148
208
|
const next = await this.planSwitch(agent.definition, NO_SELECTION, input);
|
|
149
209
|
const extra = await this.resolveExtra(orgId, accountId, input);
|
|
150
210
|
const invoked = await this.prepareSkill(orgId, agentId, undefined, agent.definition, input);
|
|
151
211
|
const id = randomUUID();
|
|
152
|
-
const
|
|
153
|
-
|
|
212
|
+
const all = await this.createIn({ id, orgId, accountId, agentId, environmentId }, input, next, extra, invoked);
|
|
213
|
+
const written = all?.at(-1);
|
|
214
|
+
if (!all || !written) {
|
|
154
215
|
const raced = await this.findCreated(orgId, accountId, agentId, input.clientMessageId);
|
|
155
216
|
if (!raced)
|
|
156
217
|
throw new ApiError("conflict", "The conversation is being created; retry");
|
|
@@ -158,18 +219,20 @@ let ConversationsService = class ConversationsService {
|
|
|
158
219
|
}
|
|
159
220
|
await this.eventLog.notify(id, written.seq);
|
|
160
221
|
await this.runs.ensureRun(id);
|
|
161
|
-
return { conversation: await this.rowView(id), event: written, created: true };
|
|
222
|
+
return { conversation: await this.rowView(id), event: written, events: all, created: true };
|
|
162
223
|
}
|
|
163
224
|
/** The conversation row and its first message (undefined: a concurrent retry committed first). */
|
|
164
225
|
// its own transaction: the caller notifies and publishes after the commit
|
|
165
|
-
async createIn(
|
|
226
|
+
async createIn(conv, input, next, extra, invoked) {
|
|
227
|
+
const { id, orgId, accountId } = conv;
|
|
166
228
|
const row = await this.db
|
|
167
229
|
.insertInto("conversations")
|
|
168
230
|
.values({
|
|
169
231
|
id,
|
|
170
232
|
org_id: orgId,
|
|
171
|
-
agent_id: agentId,
|
|
233
|
+
agent_id: conv.agentId,
|
|
172
234
|
account_id: accountId,
|
|
235
|
+
environment_id: conv.environmentId,
|
|
173
236
|
create_request_id: input.clientMessageId,
|
|
174
237
|
})
|
|
175
238
|
.onConflict((oc) => oc
|
|
@@ -206,8 +269,10 @@ let ConversationsService = class ConversationsService {
|
|
|
206
269
|
const event = await this.eventLog.findByIdem(row.id, userMessageIdemKey(clientMessageId));
|
|
207
270
|
if (!event)
|
|
208
271
|
return null;
|
|
272
|
+
// what the first send wrote: the log from its start up to the message
|
|
273
|
+
const events = (await this.eventLog.readAfter(row.id, 0, event.seq)).filter((e) => e.seq <= event.seq);
|
|
209
274
|
await this.runs.ensureRun(row.id);
|
|
210
|
-
return { conversation: toView(row), event, created: false };
|
|
275
|
+
return { conversation: toView(row), event, events, created: false };
|
|
211
276
|
}
|
|
212
277
|
async rowView(id) {
|
|
213
278
|
return toView(await this.db
|
|
@@ -231,6 +296,65 @@ let ConversationsService = class ConversationsService {
|
|
|
231
296
|
await this.eventLog.publishChanged(conversationId, "title");
|
|
232
297
|
return toView(row);
|
|
233
298
|
}
|
|
299
|
+
/**
|
|
300
|
+
* Archives or unarchives a conversation (owner only, as {@link rename}). An archived
|
|
301
|
+
* conversation leaves the default lists but stays readable. Publishes `changed: archived`.
|
|
302
|
+
*/
|
|
303
|
+
async setArchived(orgId, conversationId, accountId, archived) {
|
|
304
|
+
await this.writable(orgId, conversationId, accountId);
|
|
305
|
+
const row = await this.db
|
|
306
|
+
.updateTable("conversations")
|
|
307
|
+
.set({ archived_at: archived ? sql `now()` : null })
|
|
308
|
+
.where("id", "=", conversationId)
|
|
309
|
+
.returning(COLUMNS)
|
|
310
|
+
.executeTakeFirstOrThrow();
|
|
311
|
+
await this.eventLog.publishChanged(conversationId, "archived");
|
|
312
|
+
return toView(row);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Soft-deletes a conversation (owner only; a sub-agent's conversation is `conversation.read_only`):
|
|
316
|
+
* stops an active run, hides the conversation everywhere for its owner and drops its channel
|
|
317
|
+
* bindings, stops every running background task in its sandbox (its sub-agents' too; outside
|
|
318
|
+
* the delete's transaction, a task whose sandbox cannot be reached ends `lost` with
|
|
319
|
+
* `kill_pending`), then every active run of its sub-agent tree (agent map spec §10). The tasks
|
|
320
|
+
* are stopped after the conversation is marked deleted, so no finish
|
|
321
|
+
* (the stops' own, or one the poller writes meanwhile) can wake a run on it: `ensureRun` refuses a
|
|
322
|
+
* deleted conversation (the stops' finishes carry `stoppedBy: "deletion"` as well). The event
|
|
323
|
+
* log, runs and trajectory stay (super admins still see them).
|
|
324
|
+
*/
|
|
325
|
+
async remove(orgId, conversationId, accountId) {
|
|
326
|
+
await this.writable(orgId, conversationId, accountId);
|
|
327
|
+
try {
|
|
328
|
+
await this.abort(orgId, conversationId, accountId);
|
|
329
|
+
}
|
|
330
|
+
catch (e) {
|
|
331
|
+
if (!(e instanceof ApiError && e.code === "run.not_active"))
|
|
332
|
+
throw e;
|
|
333
|
+
}
|
|
334
|
+
await this.markDeleted(conversationId);
|
|
335
|
+
// after the mark, so no finish or delivery of the stops below can start a run on the deleted
|
|
336
|
+
// root (`ensureRun` refuses it). The sandbox's tasks stop first, so the sub-agents' tasks end
|
|
337
|
+
// as a deletion; the tree stop then only stops a task a sub-agent started in between
|
|
338
|
+
// (`stoppedBy: "subagent_end"`, which never wakes either)
|
|
339
|
+
await this.background.stopForDeletedConversation(conversationId);
|
|
340
|
+
// the whole tree stops (agent map spec §10)
|
|
341
|
+
await this.runs.stopTree(conversationId, accountId, { includeSelf: false });
|
|
342
|
+
await this.eventLog.publishChanged(conversationId, "deleted");
|
|
343
|
+
}
|
|
344
|
+
// the publish happens after the commit, in the caller
|
|
345
|
+
async markDeleted(conversationId) {
|
|
346
|
+
await this.db
|
|
347
|
+
.updateTable("conversations")
|
|
348
|
+
.set({ deleted_at: sql `now()` })
|
|
349
|
+
.where("id", "=", conversationId)
|
|
350
|
+
.execute();
|
|
351
|
+
// Queued messages must not start a run on a deleted conversation
|
|
352
|
+
await this.db
|
|
353
|
+
.deleteFrom("conversation_queue")
|
|
354
|
+
.where("conversation_id", "=", conversationId)
|
|
355
|
+
.execute();
|
|
356
|
+
await unbindConversation(this.db.db, conversationId);
|
|
357
|
+
}
|
|
234
358
|
/** 读会话:非所有者、或 agent 已对所有者不可用 → `conversation.not_found`。 */
|
|
235
359
|
async get(orgId, conversationId, viewerAccountId) {
|
|
236
360
|
const { kind: _kind, ...row } = await this.readable(orgId, conversationId, viewerAccountId);
|
|
@@ -255,6 +379,7 @@ let ConversationsService = class ConversationsService {
|
|
|
255
379
|
.where("id", "=", conversationId)
|
|
256
380
|
.where("org_id", "=", orgId)
|
|
257
381
|
.where("account_id", "=", viewerAccountId)
|
|
382
|
+
.where("deleted_at", "is", null)
|
|
258
383
|
// Hidden eval replay conversations (kind 'eval') are not reachable here (only the trajectory
|
|
259
384
|
// viewer shows them); a sub-agent's conversation is, for its owner (sub-agents spec §6.1)
|
|
260
385
|
.where("kind", "in", ["chat", "subagent"])
|
|
@@ -284,10 +409,13 @@ let ConversationsService = class ConversationsService {
|
|
|
284
409
|
let q = this.db
|
|
285
410
|
.selectFrom("conversations")
|
|
286
411
|
.select(COLUMNS)
|
|
412
|
+
.select(activitySql("conversations").as("activity"))
|
|
287
413
|
.where("org_id", "=", orgId)
|
|
288
414
|
.where("account_id", "=", accountId)
|
|
289
415
|
// 评测回放的隐藏对话(kind = 'eval')不在「我的对话」里
|
|
290
416
|
.where("kind", "=", "chat")
|
|
417
|
+
.where("deleted_at", "is", null)
|
|
418
|
+
.where("archived_at", opts.archived === true ? "is not" : "is", null)
|
|
291
419
|
.where((eb) => eb.exists(eb
|
|
292
420
|
.selectFrom("agents")
|
|
293
421
|
.select(sql `1`.as("one"))
|
|
@@ -299,6 +427,12 @@ let ConversationsService = class ConversationsService {
|
|
|
299
427
|
.limit(opts.limit);
|
|
300
428
|
if (opts.agentId !== undefined)
|
|
301
429
|
q = q.where("agent_id", "=", opts.agentId);
|
|
430
|
+
if (opts.q !== undefined) {
|
|
431
|
+
q = q.where(sql `conversations.title ILIKE ${`%${escapeLike(opts.q)}%`} ESCAPE '\\'`);
|
|
432
|
+
}
|
|
433
|
+
if (opts.state !== undefined) {
|
|
434
|
+
q = q.where(sql `${activitySql("conversations")} = ${opts.state}`);
|
|
435
|
+
}
|
|
302
436
|
if (opts.after !== undefined) {
|
|
303
437
|
const after = opts.after;
|
|
304
438
|
q = q.where((eb) => sql `(${eb.ref("updated_at")}, ${eb.ref("id")}) < (
|
|
@@ -322,6 +456,11 @@ let ConversationsService = class ConversationsService {
|
|
|
322
456
|
.where("agents.org_id", "=", orgId)
|
|
323
457
|
.where("agents.deleted_at", "is", null)
|
|
324
458
|
.where(visibleTo(accountId));
|
|
459
|
+
const archivedFilter = opts.archived === true ? sql `c.archived_at IS NOT NULL` : sql `c.archived_at IS NULL`;
|
|
460
|
+
const searchFilter = opts.q === undefined
|
|
461
|
+
? sql ``
|
|
462
|
+
: sql `AND c.title ILIKE ${`%${escapeLike(opts.q)}%`} ESCAPE '\\'`;
|
|
463
|
+
const stateFilter = opts.state === undefined ? sql `` : sql `AND ${activitySql("c")} = ${opts.state}`;
|
|
325
464
|
const cursor = opts.after === undefined
|
|
326
465
|
? sql ``
|
|
327
466
|
: sql `WHERE (g.latest_at, g.agent_id) < (
|
|
@@ -332,6 +471,7 @@ let ConversationsService = class ConversationsService {
|
|
|
332
471
|
SELECT c.agent_id, max(c.updated_at) AS latest_at
|
|
333
472
|
FROM capybara.conversations c
|
|
334
473
|
WHERE c.org_id = ${orgId} AND c.account_id = ${accountId} AND c.kind = 'chat'
|
|
474
|
+
AND c.deleted_at IS NULL AND ${archivedFilter} ${searchFilter} ${stateFilter}
|
|
335
475
|
AND c.agent_id IN ${visibleAgents}
|
|
336
476
|
GROUP BY c.agent_id
|
|
337
477
|
), page AS (
|
|
@@ -342,15 +482,18 @@ let ConversationsService = class ConversationsService {
|
|
|
342
482
|
)
|
|
343
483
|
SELECT page.agent_id, page.latest_at, v.definition ->> 'name' AS agent_name,
|
|
344
484
|
cs.id, cs.org_id, cs.account_id, cs.title, cs.title_source, cs.selection, cs.last_seq,
|
|
345
|
-
cs.created_at, cs.updated_at, cs.parent_conversation_id, cs.subagent_type
|
|
485
|
+
cs.created_at, cs.updated_at, cs.parent_conversation_id, cs.subagent_type,
|
|
486
|
+
cs.archived_at, cs.environment_id, cs.activity
|
|
346
487
|
FROM page
|
|
347
488
|
JOIN capybara.agents a ON a.id = page.agent_id
|
|
348
489
|
JOIN capybara.agent_versions v ON v.agent_id = a.id AND v.version = a.current_version
|
|
349
490
|
CROSS JOIN LATERAL (
|
|
350
491
|
SELECT c.id, c.org_id, c.account_id, c.title, c.title_source, c.selection, c.last_seq,
|
|
351
|
-
c.created_at, c.updated_at, c.parent_conversation_id, c.subagent_type
|
|
492
|
+
c.created_at, c.updated_at, c.parent_conversation_id, c.subagent_type,
|
|
493
|
+
c.archived_at, c.environment_id, ${activitySql("c")} AS activity
|
|
352
494
|
FROM capybara.conversations c
|
|
353
495
|
WHERE c.org_id = ${orgId} AND c.account_id = ${accountId} AND c.kind = 'chat'
|
|
496
|
+
AND c.deleted_at IS NULL AND ${archivedFilter} ${searchFilter} ${stateFilter}
|
|
354
497
|
AND c.agent_id = page.agent_id
|
|
355
498
|
ORDER BY c.updated_at DESC, c.id DESC
|
|
356
499
|
LIMIT ${opts.perGroup + 1}
|
|
@@ -377,7 +520,14 @@ let ConversationsService = class ConversationsService {
|
|
|
377
520
|
}
|
|
378
521
|
const page = groups.slice(0, opts.limit);
|
|
379
522
|
const next = groups.length > opts.limit ? (page.at(-1)?.agent.id ?? null) : null;
|
|
380
|
-
|
|
523
|
+
// The archived entry's count ignores `q` and `state`
|
|
524
|
+
const counted = await sql `
|
|
525
|
+
SELECT count(*) AS n FROM capybara.conversations c
|
|
526
|
+
WHERE c.org_id = ${orgId} AND c.account_id = ${accountId} AND c.kind = 'chat'
|
|
527
|
+
AND c.deleted_at IS NULL AND c.archived_at IS NOT NULL
|
|
528
|
+
AND c.agent_id IN ${visibleAgents}
|
|
529
|
+
`.execute(this.db.db);
|
|
530
|
+
return { groups: page, next, archivedCount: Number(counted.rows[0]?.n ?? 0) };
|
|
381
531
|
}
|
|
382
532
|
/**
|
|
383
533
|
* The sub-agents of a conversation, newest first (sub-agents spec §14.3); owner only, as
|
|
@@ -459,26 +609,38 @@ let ConversationsService = class ConversationsService {
|
|
|
459
609
|
return { subagents, next };
|
|
460
610
|
}
|
|
461
611
|
/**
|
|
462
|
-
*
|
|
463
|
-
*
|
|
612
|
+
* The agent tree of a root conversation (agent map spec §8, §9.2): the root and every sub-agent
|
|
613
|
+
* below it with status, model, time, tokens and tool calls. Owner only, as {@link isAccessible};
|
|
614
|
+
* a sub-agent's id (not a root) is `conversation.not_found` too.
|
|
615
|
+
*/
|
|
616
|
+
async agentTree(orgId, conversationId, viewerAccountId) {
|
|
617
|
+
if (!(await this.isAccessible(orgId, conversationId, viewerAccountId)))
|
|
618
|
+
throw notFound();
|
|
619
|
+
const root = await readAgentTree(this.db.db, orgId, conversationId);
|
|
620
|
+
if (!root)
|
|
621
|
+
throw notFound();
|
|
622
|
+
return { root };
|
|
623
|
+
}
|
|
624
|
+
/**
|
|
625
|
+
* A conversation's token usage: its own `usage` events (compaction included) plus those of every
|
|
626
|
+
* sub-agent below it, at any depth (sub-agents spec §8.3, agent map spec §6: every descendant
|
|
627
|
+
* counts toward the root; `conversationTree`), whose logs keep their own. Owner only, as
|
|
628
|
+
* {@link get}.
|
|
464
629
|
*/
|
|
465
630
|
async usage(orgId, conversationId, viewerAccountId) {
|
|
466
631
|
if (!(await this.isAccessible(orgId, conversationId, viewerAccountId)))
|
|
467
632
|
throw notFound();
|
|
468
|
-
const
|
|
469
|
-
|
|
470
|
-
UNION ALL
|
|
471
|
-
SELECT c.id FROM capybara.conversations c
|
|
472
|
-
WHERE c.parent_conversation_id = ${conversationId} AND c.kind = 'subagent'
|
|
473
|
-
)`)}`.execute(this.db.db);
|
|
633
|
+
const ids = (await conversationTree(this.db.db, conversationId)).map((c) => c.id);
|
|
634
|
+
const { rows } = await sql `${usageSums(sql `e.conversation_id IN (${sql.join(ids.length > 0 ? ids : [conversationId])})`)}`.execute(this.db.db);
|
|
474
635
|
const row = rows[0];
|
|
475
636
|
return row
|
|
476
637
|
? toUsage(row)
|
|
477
638
|
: { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0 };
|
|
478
639
|
}
|
|
479
640
|
/**
|
|
480
|
-
* The conversation whose sandbox `conversationId` works in: a sub-agent's is its
|
|
481
|
-
* (sub-agents spec §10.1), any other its own. Call
|
|
641
|
+
* The conversation whose sandbox `conversationId` works in: a sub-agent's is its root
|
|
642
|
+
* conversation's at any depth (sub-agents spec §10.1, agent map spec §6), any other its own. Call
|
|
643
|
+
* only after an access check.
|
|
482
644
|
*/
|
|
483
645
|
async sandboxConversationOf(orgId, conversationId) {
|
|
484
646
|
const row = await this.db
|
|
@@ -487,7 +649,9 @@ let ConversationsService = class ConversationsService {
|
|
|
487
649
|
.where("id", "=", conversationId)
|
|
488
650
|
.where("org_id", "=", orgId)
|
|
489
651
|
.executeTakeFirst();
|
|
490
|
-
|
|
652
|
+
if (!row?.parent_conversation_id)
|
|
653
|
+
return conversationId;
|
|
654
|
+
return rootConversationOf(this.db.db, row.parent_conversation_id);
|
|
491
655
|
}
|
|
492
656
|
/** 读事件(先做 `get` 的可见性判定);顺带不阻塞地 {@link kickRun}。 */
|
|
493
657
|
async listEvents(orgId, conversationId, viewerAccountId, afterSeq, limit) {
|
|
@@ -495,6 +659,16 @@ let ConversationsService = class ConversationsService {
|
|
|
495
659
|
this.kickRun(conversationId);
|
|
496
660
|
return this.eventLog.readAfter(conversationId, afterSeq, limit);
|
|
497
661
|
}
|
|
662
|
+
/**
|
|
663
|
+
* The turn-aligned page of events before `beforeSeq` (`null`: the log's last page), with how
|
|
664
|
+
* many runs started before it ({@link EventLog.readTurnPageBefore}; history paging spec §2).
|
|
665
|
+
* Visibility as {@link get}; kicks a stalled run as {@link listEvents} does.
|
|
666
|
+
*/
|
|
667
|
+
async listEventsBefore(orgId, conversationId, viewerAccountId, beforeSeq, limit) {
|
|
668
|
+
await this.get(orgId, conversationId, viewerAccountId);
|
|
669
|
+
this.kickRun(conversationId);
|
|
670
|
+
return this.eventLog.readTurnPageBefore(conversationId, beforeSeq, limit, EVENTS_TURN_EXTEND);
|
|
671
|
+
}
|
|
498
672
|
/**
|
|
499
673
|
* 追加一条用户消息;带 `clientMessageId` 时重复提交返回同一事件。写入后调用 `ensureRun`:
|
|
500
674
|
* 没有进行中的运行时投递一轮;运行中则由当前运行在步骤间隙吸收,或在它结束时再次 `ensureRun`。
|
|
@@ -544,6 +718,15 @@ let ConversationsService = class ConversationsService {
|
|
|
544
718
|
this.userMessage(accountId, input, extra, [], invoked),
|
|
545
719
|
]);
|
|
546
720
|
}
|
|
721
|
+
// The message is written: it brings an archived conversation back into the default lists
|
|
722
|
+
if (conv.archivedAt !== null) {
|
|
723
|
+
await this.db
|
|
724
|
+
.updateTable("conversations")
|
|
725
|
+
.set({ archived_at: null })
|
|
726
|
+
.where("id", "=", conversationId)
|
|
727
|
+
.execute();
|
|
728
|
+
await this.eventLog.publishChanged(conversationId, "archived");
|
|
729
|
+
}
|
|
547
730
|
await this.runs.ensureRun(conversationId);
|
|
548
731
|
return event;
|
|
549
732
|
}
|
|
@@ -551,7 +734,8 @@ let ConversationsService = class ConversationsService {
|
|
|
551
734
|
// its own transaction: the caller notifies and publishes after the commit
|
|
552
735
|
async postIn(orgId, conversationId, accountId, input, next, extra, invoked) {
|
|
553
736
|
const blocks = await this.bindIn(orgId, conversationId, accountId, input.files ?? []);
|
|
554
|
-
|
|
737
|
+
const written = await this.writeMessage(conversationId, accountId, input, next, extra, blocks, invoked);
|
|
738
|
+
return written.at(-1);
|
|
555
739
|
}
|
|
556
740
|
/**
|
|
557
741
|
* The selection a message switches to, or null when it changes nothing. A model equal to the
|
|
@@ -591,7 +775,8 @@ let ConversationsService = class ConversationsService {
|
|
|
591
775
|
}
|
|
592
776
|
/**
|
|
593
777
|
* Writes the message (preceded by its `model_switched` when it switches) inside `t` and updates
|
|
594
|
-
* `conversations.selection`; returns the
|
|
778
|
+
* `conversations.selection`; returns the events written, in seq order (the `user_message`
|
|
779
|
+
* last). The caller notifies after commit.
|
|
595
780
|
*/
|
|
596
781
|
async writeMessage(conversationId, accountId, input, next, extra, blocks, invoked) {
|
|
597
782
|
const events = [];
|
|
@@ -616,7 +801,7 @@ let ConversationsService = class ConversationsService {
|
|
|
616
801
|
.where("id", "=", conversationId)
|
|
617
802
|
.execute();
|
|
618
803
|
}
|
|
619
|
-
return written
|
|
804
|
+
return written;
|
|
620
805
|
}
|
|
621
806
|
/**
|
|
622
807
|
* Renders the message's skill invocation (phase D), or undefined when it has none. Resolved
|
|
@@ -688,9 +873,26 @@ let ConversationsService = class ConversationsService {
|
|
|
688
873
|
* 中止会话当前的运行(queued / running / waiting):返回 runId;没有 → `run.not_active`。
|
|
689
874
|
* 等人处理的运行没有 worker:直接取消等待并写终态。其余经 Redis 广播,运行所在的任意副本都会收到;
|
|
690
875
|
* 运行已是孤儿(没有任何 worker 在执行)时直接写终态。
|
|
876
|
+
*
|
|
877
|
+
* A root conversation's stop stops only its own run: its background sub-agents keep working
|
|
878
|
+
* (agent map spec §6). A sub-agent's conversation (its owner, from the agent map) stops that
|
|
879
|
+
* sub-agent with every descendant (`RunControl.stopTree`); `run.not_active` when nothing in that
|
|
880
|
+
* subtree runs, else the sub-agent's latest run id.
|
|
691
881
|
*/
|
|
692
882
|
async abort(orgId, conversationId, accountId) {
|
|
693
|
-
await this.get(orgId, conversationId, accountId);
|
|
883
|
+
const conv = await this.get(orgId, conversationId, accountId);
|
|
884
|
+
if (conv.parentConversationId !== null) {
|
|
885
|
+
const latest = await this.db
|
|
886
|
+
.selectFrom("runs")
|
|
887
|
+
.select("id")
|
|
888
|
+
.where("conversation_id", "=", conversationId)
|
|
889
|
+
.orderBy("created_at", "desc")
|
|
890
|
+
.executeTakeFirst();
|
|
891
|
+
const n = await this.runs.stopTree(conversationId, accountId);
|
|
892
|
+
if (n === 0 || !latest)
|
|
893
|
+
throw new ApiError("run.not_active", "No active run to abort");
|
|
894
|
+
return latest.id;
|
|
895
|
+
}
|
|
694
896
|
const run = await this.db
|
|
695
897
|
.selectFrom("runs")
|
|
696
898
|
.select(["id", "status"])
|
|
@@ -718,6 +920,9 @@ let ConversationsService = class ConversationsService {
|
|
|
718
920
|
__decorate([
|
|
719
921
|
Transactional({ propagation: "requires_new" })
|
|
720
922
|
], ConversationsService.prototype, "createIn", null);
|
|
923
|
+
__decorate([
|
|
924
|
+
Transactional()
|
|
925
|
+
], ConversationsService.prototype, "markDeleted", null);
|
|
721
926
|
__decorate([
|
|
722
927
|
Transactional({ propagation: "requires_new" })
|
|
723
928
|
], ConversationsService.prototype, "postIn", null);
|
|
@@ -739,6 +944,8 @@ ConversationsService = __decorate([
|
|
|
739
944
|
__param(7, Inject(ConnectorContent)),
|
|
740
945
|
__param(8, Inject(AttachmentsService)),
|
|
741
946
|
__param(9, Inject(SkillInvoker)),
|
|
742
|
-
__param(10, Inject(
|
|
947
|
+
__param(10, Inject(BackgroundTaskStopper)),
|
|
948
|
+
__param(11, Inject(ConversationEnvironments)),
|
|
949
|
+
__param(12, Inject(TransactionHost))
|
|
743
950
|
], ConversationsService);
|
|
744
951
|
export { ConversationsService };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { EnvironmentsService, type EnvironmentView } from "../environments/environments.service.js";
|
|
2
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
3
|
+
import { ConversationAccess } from "./access.js";
|
|
4
|
+
import { ConversationsService } from "./conversations.service.js";
|
|
5
|
+
/**
|
|
6
|
+
* The environment a conversation works in, for its page (environments spec §9: shown read only):
|
|
7
|
+
* a conversation the viewer may not see → `conversation.not_found`. A sub-agent shows its root
|
|
8
|
+
* conversation's environment. Null while the conversation is unbound, or when its environment is
|
|
9
|
+
* deleted or no longer its owner's (its sandbox tools then fail).
|
|
10
|
+
*/
|
|
11
|
+
export declare class ConversationEnvironmentStatus {
|
|
12
|
+
/** Who may see the conversation (the rule of its event stream). */
|
|
13
|
+
private readonly access;
|
|
14
|
+
/** The conversation whose environment it works in: a sub-agent's root, else itself. */
|
|
15
|
+
private readonly conversations;
|
|
16
|
+
private readonly environments;
|
|
17
|
+
private readonly db;
|
|
18
|
+
constructor(
|
|
19
|
+
/** Who may see the conversation (the rule of its event stream). */
|
|
20
|
+
access: Pick<ConversationAccess, "isAccessible">,
|
|
21
|
+
/** The conversation whose environment it works in: a sub-agent's root, else itself. */
|
|
22
|
+
conversations: Pick<ConversationsService, "sandboxConversationOf">, environments: Pick<EnvironmentsService, "get">, db: KernelDb);
|
|
23
|
+
get(orgId: string, conversationId: string, viewerAccountId: string): Promise<EnvironmentView | null>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
10
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
11
|
+
import { EnvironmentsService } from "../environments/environments.service.js";
|
|
12
|
+
import { ApiError } from "../errors.js";
|
|
13
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
14
|
+
import { UUID_RE } from "../ui/registry.js";
|
|
15
|
+
import { ConversationAccess } from "./access.js";
|
|
16
|
+
import { ConversationsService } from "./conversations.service.js";
|
|
17
|
+
/**
|
|
18
|
+
* The environment a conversation works in, for its page (environments spec §9: shown read only):
|
|
19
|
+
* a conversation the viewer may not see → `conversation.not_found`. A sub-agent shows its root
|
|
20
|
+
* conversation's environment. Null while the conversation is unbound, or when its environment is
|
|
21
|
+
* deleted or no longer its owner's (its sandbox tools then fail).
|
|
22
|
+
*/
|
|
23
|
+
let ConversationEnvironmentStatus = class ConversationEnvironmentStatus {
|
|
24
|
+
access;
|
|
25
|
+
conversations;
|
|
26
|
+
environments;
|
|
27
|
+
db;
|
|
28
|
+
constructor(
|
|
29
|
+
/** Who may see the conversation (the rule of its event stream). */
|
|
30
|
+
access,
|
|
31
|
+
/** The conversation whose environment it works in: a sub-agent's root, else itself. */
|
|
32
|
+
conversations, environments, db) {
|
|
33
|
+
this.access = access;
|
|
34
|
+
this.conversations = conversations;
|
|
35
|
+
this.environments = environments;
|
|
36
|
+
this.db = db;
|
|
37
|
+
}
|
|
38
|
+
async get(orgId, conversationId, viewerAccountId) {
|
|
39
|
+
if (!UUID_RE.test(conversationId) ||
|
|
40
|
+
!(await this.access.isAccessible(orgId, conversationId, viewerAccountId))) {
|
|
41
|
+
throw new ApiError("conversation.not_found", "Conversation not found");
|
|
42
|
+
}
|
|
43
|
+
// a sub-agent works in its root conversation's environment (at every depth)
|
|
44
|
+
const root = await this.conversations.sandboxConversationOf(orgId, conversationId);
|
|
45
|
+
const conv = await this.db
|
|
46
|
+
.selectFrom("conversations")
|
|
47
|
+
.select(["account_id", "environment_id"])
|
|
48
|
+
.where("id", "=", root)
|
|
49
|
+
.where("org_id", "=", orgId)
|
|
50
|
+
.executeTakeFirst();
|
|
51
|
+
if (!conv?.environment_id)
|
|
52
|
+
return null;
|
|
53
|
+
try {
|
|
54
|
+
// the environment as its owner sees it (only the owner may use a personal environment)
|
|
55
|
+
return await this.environments.get(orgId, conv.account_id, conv.environment_id);
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
if (e instanceof ApiError && e.code === "environment.not_found")
|
|
59
|
+
return null;
|
|
60
|
+
throw e;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
ConversationEnvironmentStatus = __decorate([
|
|
65
|
+
Injectable(),
|
|
66
|
+
__param(0, Inject(ConversationAccess)),
|
|
67
|
+
__param(1, Inject(ConversationsService)),
|
|
68
|
+
__param(2, Inject(EnvironmentsService)),
|
|
69
|
+
__param(3, Inject(KernelDb))
|
|
70
|
+
], ConversationEnvironmentStatus);
|
|
71
|
+
export { ConversationEnvironmentStatus };
|