@capybara-hq/kernel 0.1.0-rc.4 → 0.1.0-rc.6
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 +51 -14
- package/dist/admin/admin.controller.js +60 -19
- package/dist/admin/extensions.controller.d.ts +16 -2
- package/dist/admin/extensions.controller.js +26 -6
- 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 +16 -0
- package/dist/agents/agent-lookup.js +11 -0
- package/dist/agents/agents.controller.d.ts +76 -1
- package/dist/agents/agents.controller.js +90 -11
- package/dist/agents/agents.module.d.ts +4 -1
- package/dist/agents/agents.module.js +32 -6
- package/dist/agents/agents.service.d.ts +54 -23
- package/dist/agents/agents.service.js +180 -76
- package/dist/agents/definition.d.ts +49 -0
- package/dist/agents/definition.js +45 -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/models.controller.d.ts +34 -5
- package/dist/agents/models.controller.js +50 -6
- 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/readiness.controller.d.ts +5 -5
- package/dist/agents/readiness.controller.js +6 -6
- 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 +475 -52
- package/dist/background/background.module.js +8 -1
- package/dist/background/finish.d.ts +3 -2
- package/dist/background/launch-lock.d.ts +4 -3
- package/dist/background/launch-lock.js +4 -3
- package/dist/background/poll.job.d.ts +9 -6
- package/dist/background/poll.job.js +30 -22
- package/dist/background/session.d.ts +13 -2
- package/dist/background/session.js +13 -0
- package/dist/background/stop.d.ts +12 -6
- package/dist/background/stop.js +57 -39
- package/dist/background/store.d.ts +18 -6
- package/dist/background/store.js +12 -6
- package/dist/background/tasks.service.d.ts +15 -5
- package/dist/background/tasks.service.js +42 -17
- package/dist/background/wake-rules.d.ts +27 -18
- package/dist/background/wake-rules.js +52 -22
- package/dist/background/wake.d.ts +13 -11
- package/dist/background/wake.js +20 -14
- 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/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 +622 -82
- 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 +1147 -1136
- 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 +20 -2
- package/dist/channels/channels.module.js +2 -0
- 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/config/docs.js +3 -1
- package/dist/config/schema.d.ts +10 -2
- package/dist/config/schema.js +70 -22
- package/dist/conversations/access.d.ts +6 -4
- package/dist/conversations/access.js +27 -5
- package/dist/conversations/agent-tree.d.ts +46 -0
- package/dist/conversations/agent-tree.js +92 -0
- package/dist/conversations/conversations.controller.d.ts +43 -18
- package/dist/conversations/conversations.controller.js +79 -38
- package/dist/conversations/conversations.module.d.ts +1 -1
- package/dist/conversations/conversations.module.js +7 -7
- package/dist/conversations/conversations.service.d.ts +73 -15
- package/dist/conversations/conversations.service.js +115 -35
- package/dist/conversations/environment-status.d.ts +24 -0
- package/dist/conversations/environment-status.js +71 -0
- package/dist/conversations/event-log.d.ts +20 -5
- package/dist/conversations/event-log.js +60 -0
- package/dist/conversations/events.d.ts +84 -2
- package/dist/conversations/events.js +91 -17
- package/dist/conversations/queue.service.d.ts +1 -1
- package/dist/conversations/queue.service.js +5 -0
- package/dist/conversations/titles.d.ts +5 -3
- package/dist/conversations/titles.js +21 -8
- package/dist/conversations/tree.d.ts +17 -0
- package/dist/conversations/tree.js +42 -0
- package/dist/ctx/create-ctx.d.ts +20 -1
- package/dist/ctx/create-ctx.js +38 -7
- package/dist/db/kernel-schema.d.ts +386 -18
- 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 +85 -2
- package/dist/errors.js +85 -2
- package/dist/evals/reconstruct.d.ts +18 -9
- package/dist/evals/reconstruct.js +26 -7
- package/dist/evals/run-replay.d.ts +4 -2
- package/dist/evals/run-replay.js +20 -6
- package/dist/evals/runs.service.d.ts +2 -1
- package/dist/evals/runs.service.js +13 -12
- package/dist/evals/step-replay.d.ts +4 -6
- package/dist/evals/step-replay.js +4 -3
- 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 +65 -42
- package/dist/extensions/admin-view.d.ts +37 -10
- package/dist/extensions/admin-view.js +103 -20
- 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-hash.d.ts +10 -0
- package/dist/extensions/config-hash.js +38 -0
- package/dist/extensions/deployment-config.d.ts +28 -5
- package/dist/extensions/deployment-config.js +48 -7
- package/dist/extensions/effective-config.d.ts +127 -0
- package/dist/extensions/effective-config.js +368 -0
- package/dist/extensions/extensions.module.js +11 -11
- package/dist/extensions/hooks.d.ts +37 -4
- package/dist/extensions/hooks.js +82 -16
- package/dist/extensions/host.d.ts +24 -10
- package/dist/extensions/host.js +49 -54
- package/dist/extensions/installs.d.ts +20 -8
- package/dist/extensions/installs.js +37 -15
- package/dist/extensions/org-config.d.ts +75 -6
- package/dist/extensions/org-config.js +184 -32
- 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/permission-view.d.ts +16 -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.d.ts +12 -5
- package/dist/extensions/point-defaults.js +37 -9
- package/dist/extensions/resolve.d.ts +5 -1
- package/dist/extensions/resolve.js +15 -2
- package/dist/extensions/state.module.d.ts +9 -0
- package/dist/extensions/state.module.js +38 -0
- package/dist/files/previewers.d.ts +8 -1
- package/dist/files/previewers.js +35 -6
- package/dist/http/api.module.js +25 -3
- package/dist/http/app.d.ts +11 -2
- package/dist/http/app.js +31 -5
- package/dist/http/plugin-dispatch.d.ts +4 -1
- package/dist/http/plugin-dispatch.js +14 -2
- 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.guard.d.ts +13 -5
- package/dist/identity/auth.guard.js +26 -9
- package/dist/identity/identity.module.d.ts +1 -1
- package/dist/identity/identity.module.js +4 -4
- package/dist/identity/me.controller.js +1 -1
- package/dist/identity/principal.d.ts +3 -3
- package/dist/identity/principal.js +3 -3
- 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 +1 -1
- package/dist/index.js +1 -1
- package/dist/infra/cli/kernel-cli.module.js +9 -1
- package/dist/infra/config/kernel-config.service.js +24 -1
- 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/queue/add-job-once.d.ts +14 -0
- package/dist/infra/queue/add-job-once.js +16 -0
- 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/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 +99 -0
- package/dist/models/enablement.js +263 -0
- package/dist/models/models.module.d.ts +5 -1
- package/dist/models/models.module.js +16 -4
- 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 +37 -12
- package/dist/models/purposes.js +63 -17
- package/dist/orgs/directory-sync.d.ts +14 -5
- package/dist/orgs/directory-sync.js +41 -17
- package/dist/orgs/offboarding.d.ts +9 -7
- package/dist/orgs/offboarding.js +28 -17
- 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 +15 -3
- package/dist/orgs/settings.service.js +6 -2
- 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 +1405 -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 +9 -1
- package/dist/runtime/context/build.d.ts +6 -4
- package/dist/runtime/context/build.js +26 -7
- package/dist/runtime/context/claude-tools.d.ts +2 -1
- package/dist/runtime/context/claude-tools.js +5 -4
- package/dist/runtime/context/compaction.js +9 -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.d.ts +8 -1
- package/dist/runtime/hook-calls.js +40 -7
- package/dist/runtime/langgraph-loop.d.ts +3 -1
- package/dist/runtime/langgraph-loop.js +35 -17
- package/dist/runtime/loop.d.ts +32 -4
- package/dist/runtime/maintenance.d.ts +7 -4
- package/dist/runtime/maintenance.js +23 -8
- package/dist/runtime/model-call.d.ts +38 -11
- package/dist/runtime/model-call.js +97 -24
- package/dist/runtime/providers.d.ts +146 -32
- package/dist/runtime/providers.js +321 -67
- 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 +37 -3
- package/dist/runtime/run-queue.js +188 -11
- package/dist/runtime/run-worker.d.ts +12 -6
- package/dist/runtime/run-worker.js +58 -35
- package/dist/runtime/runtime.module.js +3 -0
- package/dist/runtime/step-log.d.ts +9 -4
- package/dist/runtime/step-log.js +8 -5
- 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 +46 -32
- 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-jobs.d.ts +88 -0
- package/dist/runtime/usage-report-jobs.js +158 -0
- package/dist/runtime/usage-report.d.ts +33 -38
- package/dist/runtime/usage-report.js +169 -96
- package/dist/runtime/waits.d.ts +140 -37
- package/dist/runtime/waits.js +394 -106
- 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 +4 -3
- package/dist/sandbox/sandbox.service.d.ts +229 -134
- package/dist/sandbox/sandbox.service.js +630 -409
- 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 +23 -4
- package/dist/tools/builtin-names.d.ts +21 -5
- package/dist/tools/builtin-names.js +30 -5
- 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 +6 -2
- package/dist/tools/builtins/builtin-tools.js +37 -12
- 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.js +13 -3
- package/dist/tools/builtins/sandbox/common.d.ts +43 -24
- package/dist/tools/builtins/sandbox/common.js +80 -45
- 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 +1 -1
- package/dist/tools/builtins/sandbox/index.js +1 -1
- package/dist/tools/builtins/sandbox/read.js +1 -1
- package/dist/tools/builtins/sandbox/task-output.d.ts +14 -3
- package/dist/tools/builtins/sandbox/task-output.js +30 -5
- package/dist/tools/builtins/sandbox/task-stop.js +2 -1
- 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/extract.js +5 -1
- package/dist/tools/builtins/web/fetch.js +1 -0
- package/dist/tools/builtins/web/search.js +1 -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/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 +193 -364
- package/dist/tools/policy.d.ts +1 -1
- package/dist/tools/policy.js +36 -16
- package/dist/tools/registry.d.ts +98 -5
- package/dist/tools/registry.js +87 -9
- package/dist/tools/tools.module.js +12 -2
- package/dist/ui/views.d.ts +2 -1
- package/dist/ui/views.js +17 -3
- package/package.json +3 -3
- 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/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 -32
- package/dist/extensions/org-config.controller.js +0 -70
|
@@ -13,6 +13,7 @@ import { sql } from "kysely";
|
|
|
13
13
|
import { AgentLookup, visibleTo } from "../agents/agent-lookup.js";
|
|
14
14
|
import { BackgroundTaskStopper } from "../background/stop.js";
|
|
15
15
|
import { unbindConversation } from "../channels/threads.js";
|
|
16
|
+
import { ConversationEnvironments, } from "../environments/conversation-environments.js";
|
|
16
17
|
import { ApiError } from "../errors.js";
|
|
17
18
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
18
19
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
@@ -20,13 +21,16 @@ import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
|
20
21
|
import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
21
22
|
import { ProviderRegistry } from "../runtime/providers.js";
|
|
22
23
|
import { RunControl as RunControlService } from "../runtime/run-control.js";
|
|
24
|
+
import { rootConversationOf } from "../runtime/subagents/child.js";
|
|
23
25
|
import { SkillInvoker } from "../skills/invoke.js";
|
|
24
26
|
import { ConnectorContent } from "../tools/connector-content.js";
|
|
25
27
|
import { ConversationAccess, parentReachable } from "./access.js";
|
|
28
|
+
import { readAgentTree } from "./agent-tree.js";
|
|
26
29
|
import { AttachmentsService } from "./attachments.service.js";
|
|
27
30
|
import { EventLog } from "./event-log.js";
|
|
28
31
|
import { userMessageIdemKey } from "./idem-keys.js";
|
|
29
32
|
import { NO_SELECTION, planSelection, readSelection } from "./selection.js";
|
|
33
|
+
import { conversationTree } from "./tree.js";
|
|
30
34
|
/** Escapes `\`, `%` and `_` so user text is matched literally by `LIKE … ESCAPE '\'`. */
|
|
31
35
|
export function escapeLike(s) {
|
|
32
36
|
return s.replace(/[\\%_]/g, (ch) => `\\${ch}`);
|
|
@@ -64,6 +68,7 @@ const COLUMNS = [
|
|
|
64
68
|
"parent_conversation_id",
|
|
65
69
|
"subagent_type",
|
|
66
70
|
"archived_at",
|
|
71
|
+
"environment_id",
|
|
67
72
|
];
|
|
68
73
|
function toView(r) {
|
|
69
74
|
return {
|
|
@@ -80,11 +85,17 @@ function toView(r) {
|
|
|
80
85
|
parentConversationId: r.parent_conversation_id,
|
|
81
86
|
subagentType: r.subagent_type,
|
|
82
87
|
archivedAt: r.archived_at,
|
|
88
|
+
environmentId: r.environment_id,
|
|
83
89
|
activity: r.activity ?? null,
|
|
84
90
|
};
|
|
85
91
|
}
|
|
86
92
|
/** The longest conversation title (characters, after trimming). */
|
|
87
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;
|
|
88
99
|
/** The sums of the `usage` events matching `where` (over `conversation_events e`), one row. */
|
|
89
100
|
const usageSums = (where) => sql `
|
|
90
101
|
SELECT
|
|
@@ -117,6 +128,7 @@ let ConversationsService = class ConversationsService {
|
|
|
117
128
|
attachments;
|
|
118
129
|
invoker;
|
|
119
130
|
background;
|
|
131
|
+
environments;
|
|
120
132
|
txHost;
|
|
121
133
|
constructor(db, eventLog, agents, access,
|
|
122
134
|
/** Starts and stops the conversation's runs. */
|
|
@@ -130,7 +142,9 @@ let ConversationsService = class ConversationsService {
|
|
|
130
142
|
/** Renders a person's skill invocation (phase D). */
|
|
131
143
|
invoker,
|
|
132
144
|
/** Stops a deleted conversation's background tasks. */
|
|
133
|
-
background,
|
|
145
|
+
background,
|
|
146
|
+
/** The environment a new conversation is bound to (environments spec §4.1 item 1). */
|
|
147
|
+
environments, txHost) {
|
|
134
148
|
this.db = db;
|
|
135
149
|
this.eventLog = eventLog;
|
|
136
150
|
this.agents = agents;
|
|
@@ -142,6 +156,7 @@ let ConversationsService = class ConversationsService {
|
|
|
142
156
|
this.attachments = attachments;
|
|
143
157
|
this.invoker = invoker;
|
|
144
158
|
this.background = background;
|
|
159
|
+
this.environments = environments;
|
|
145
160
|
this.txHost = txHost;
|
|
146
161
|
}
|
|
147
162
|
/**
|
|
@@ -153,12 +168,24 @@ let ConversationsService = class ConversationsService {
|
|
|
153
168
|
.ensureRun(conversationId)
|
|
154
169
|
.catch((err) => this.log.warn("ensureRun on conversation open failed", { conversationId, err }));
|
|
155
170
|
}
|
|
156
|
-
/**
|
|
157
|
-
|
|
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 = {}) {
|
|
158
178
|
await this.agents.get(orgId, agentId, accountId);
|
|
179
|
+
const environmentId = await this.environments.forNew(orgId, accountId, pick);
|
|
159
180
|
const row = await this.db
|
|
160
181
|
.insertInto("conversations")
|
|
161
|
-
.values({
|
|
182
|
+
.values({
|
|
183
|
+
id: randomUUID(),
|
|
184
|
+
org_id: orgId,
|
|
185
|
+
agent_id: agentId,
|
|
186
|
+
account_id: accountId,
|
|
187
|
+
environment_id: environmentId,
|
|
188
|
+
})
|
|
162
189
|
.returning(COLUMNS)
|
|
163
190
|
.executeTakeFirstOrThrow();
|
|
164
191
|
return toView(row);
|
|
@@ -172,16 +199,17 @@ let ConversationsService = class ConversationsService {
|
|
|
172
199
|
* `events` are every event the create wrote, in seq order from seq 1 (a `model_switched` before
|
|
173
200
|
* the message when the send switched), so a client can seed the new conversation's log whole.
|
|
174
201
|
*/
|
|
175
|
-
async createWithMessage(orgId, accountId, agentId, input) {
|
|
202
|
+
async createWithMessage(orgId, accountId, agentId, input, pick = {}) {
|
|
176
203
|
const agent = await this.agents.get(orgId, agentId, accountId);
|
|
177
204
|
const prior = await this.findCreated(orgId, accountId, agentId, input.clientMessageId);
|
|
178
205
|
if (prior)
|
|
179
206
|
return prior;
|
|
180
|
-
const
|
|
207
|
+
const environmentId = await this.environments.forNew(orgId, accountId, pick);
|
|
208
|
+
const next = await this.planSwitch(orgId, agent.definition, NO_SELECTION, input);
|
|
181
209
|
const extra = await this.resolveExtra(orgId, accountId, input);
|
|
182
210
|
const invoked = await this.prepareSkill(orgId, agentId, undefined, agent.definition, input);
|
|
183
211
|
const id = randomUUID();
|
|
184
|
-
const all = await this.createIn(id, orgId, accountId, agentId, input, next, extra, invoked);
|
|
212
|
+
const all = await this.createIn({ id, orgId, accountId, agentId, environmentId }, input, next, extra, invoked);
|
|
185
213
|
const written = all?.at(-1);
|
|
186
214
|
if (!all || !written) {
|
|
187
215
|
const raced = await this.findCreated(orgId, accountId, agentId, input.clientMessageId);
|
|
@@ -195,14 +223,16 @@ let ConversationsService = class ConversationsService {
|
|
|
195
223
|
}
|
|
196
224
|
/** The conversation row and its first message (undefined: a concurrent retry committed first). */
|
|
197
225
|
// its own transaction: the caller notifies and publishes after the commit
|
|
198
|
-
async createIn(
|
|
226
|
+
async createIn(conv, input, next, extra, invoked) {
|
|
227
|
+
const { id, orgId, accountId } = conv;
|
|
199
228
|
const row = await this.db
|
|
200
229
|
.insertInto("conversations")
|
|
201
230
|
.values({
|
|
202
231
|
id,
|
|
203
232
|
org_id: orgId,
|
|
204
|
-
agent_id: agentId,
|
|
233
|
+
agent_id: conv.agentId,
|
|
205
234
|
account_id: accountId,
|
|
235
|
+
environment_id: conv.environmentId,
|
|
206
236
|
create_request_id: input.clientMessageId,
|
|
207
237
|
})
|
|
208
238
|
.onConflict((oc) => oc
|
|
@@ -284,12 +314,13 @@ let ConversationsService = class ConversationsService {
|
|
|
284
314
|
/**
|
|
285
315
|
* Soft-deletes a conversation (owner only; a sub-agent's conversation is `conversation.read_only`):
|
|
286
316
|
* stops an active run, hides the conversation everywhere for its owner and drops its channel
|
|
287
|
-
* bindings,
|
|
288
|
-
*
|
|
289
|
-
* `kill_pending`)
|
|
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
|
|
290
321
|
* (the stops' own, or one the poller writes meanwhile) can wake a run on it: `ensureRun` refuses a
|
|
291
322
|
* deleted conversation (the stops' finishes carry `stoppedBy: "deletion"` as well). The event
|
|
292
|
-
* log, runs and trajectory stay (
|
|
323
|
+
* log, runs and trajectory stay (super admins still see them).
|
|
293
324
|
*/
|
|
294
325
|
async remove(orgId, conversationId, accountId) {
|
|
295
326
|
await this.writable(orgId, conversationId, accountId);
|
|
@@ -301,7 +332,13 @@ let ConversationsService = class ConversationsService {
|
|
|
301
332
|
throw e;
|
|
302
333
|
}
|
|
303
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)
|
|
304
339
|
await this.background.stopForDeletedConversation(conversationId);
|
|
340
|
+
// the whole tree stops (agent map spec §10)
|
|
341
|
+
await this.runs.stopTree(conversationId, accountId, { includeSelf: false });
|
|
305
342
|
await this.eventLog.publishChanged(conversationId, "deleted");
|
|
306
343
|
}
|
|
307
344
|
// the publish happens after the commit, in the caller
|
|
@@ -446,14 +483,14 @@ let ConversationsService = class ConversationsService {
|
|
|
446
483
|
SELECT page.agent_id, page.latest_at, v.definition ->> 'name' AS agent_name,
|
|
447
484
|
cs.id, cs.org_id, cs.account_id, cs.title, cs.title_source, cs.selection, cs.last_seq,
|
|
448
485
|
cs.created_at, cs.updated_at, cs.parent_conversation_id, cs.subagent_type,
|
|
449
|
-
cs.archived_at, cs.activity
|
|
486
|
+
cs.archived_at, cs.environment_id, cs.activity
|
|
450
487
|
FROM page
|
|
451
488
|
JOIN capybara.agents a ON a.id = page.agent_id
|
|
452
489
|
JOIN capybara.agent_versions v ON v.agent_id = a.id AND v.version = a.current_version
|
|
453
490
|
CROSS JOIN LATERAL (
|
|
454
491
|
SELECT c.id, c.org_id, c.account_id, c.title, c.title_source, c.selection, c.last_seq,
|
|
455
492
|
c.created_at, c.updated_at, c.parent_conversation_id, c.subagent_type,
|
|
456
|
-
c.archived_at, ${activitySql("c")} AS activity
|
|
493
|
+
c.archived_at, c.environment_id, ${activitySql("c")} AS activity
|
|
457
494
|
FROM capybara.conversations c
|
|
458
495
|
WHERE c.org_id = ${orgId} AND c.account_id = ${accountId} AND c.kind = 'chat'
|
|
459
496
|
AND c.deleted_at IS NULL AND ${archivedFilter} ${searchFilter} ${stateFilter}
|
|
@@ -572,26 +609,38 @@ let ConversationsService = class ConversationsService {
|
|
|
572
609
|
return { subagents, next };
|
|
573
610
|
}
|
|
574
611
|
/**
|
|
575
|
-
*
|
|
576
|
-
*
|
|
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}.
|
|
577
629
|
*/
|
|
578
630
|
async usage(orgId, conversationId, viewerAccountId) {
|
|
579
631
|
if (!(await this.isAccessible(orgId, conversationId, viewerAccountId)))
|
|
580
632
|
throw notFound();
|
|
581
|
-
const
|
|
582
|
-
|
|
583
|
-
UNION ALL
|
|
584
|
-
SELECT c.id FROM capybara.conversations c
|
|
585
|
-
WHERE c.parent_conversation_id = ${conversationId} AND c.kind = 'subagent'
|
|
586
|
-
)`)}`.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);
|
|
587
635
|
const row = rows[0];
|
|
588
636
|
return row
|
|
589
637
|
? toUsage(row)
|
|
590
638
|
: { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0 };
|
|
591
639
|
}
|
|
592
640
|
/**
|
|
593
|
-
* The conversation whose sandbox `conversationId` works in: a sub-agent's is its
|
|
594
|
-
* (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.
|
|
595
644
|
*/
|
|
596
645
|
async sandboxConversationOf(orgId, conversationId) {
|
|
597
646
|
const row = await this.db
|
|
@@ -600,7 +649,9 @@ let ConversationsService = class ConversationsService {
|
|
|
600
649
|
.where("id", "=", conversationId)
|
|
601
650
|
.where("org_id", "=", orgId)
|
|
602
651
|
.executeTakeFirst();
|
|
603
|
-
|
|
652
|
+
if (!row?.parent_conversation_id)
|
|
653
|
+
return conversationId;
|
|
654
|
+
return rootConversationOf(this.db.db, row.parent_conversation_id);
|
|
604
655
|
}
|
|
605
656
|
/** 读事件(先做 `get` 的可见性判定);顺带不阻塞地 {@link kickRun}。 */
|
|
606
657
|
async listEvents(orgId, conversationId, viewerAccountId, afterSeq, limit) {
|
|
@@ -608,6 +659,16 @@ let ConversationsService = class ConversationsService {
|
|
|
608
659
|
this.kickRun(conversationId);
|
|
609
660
|
return this.eventLog.readAfter(conversationId, afterSeq, limit);
|
|
610
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
|
+
}
|
|
611
672
|
/**
|
|
612
673
|
* 追加一条用户消息;带 `clientMessageId` 时重复提交返回同一事件。写入后调用 `ensureRun`:
|
|
613
674
|
* 没有进行中的运行时投递一轮;运行中则由当前运行在步骤间隙吸收,或在它结束时再次 `ensureRun`。
|
|
@@ -640,7 +701,7 @@ let ConversationsService = class ConversationsService {
|
|
|
640
701
|
: undefined;
|
|
641
702
|
const next = agent === undefined || (input.model === undefined && input.effort === undefined)
|
|
642
703
|
? null
|
|
643
|
-
: await this.planSwitch(agent, conv.selection, input);
|
|
704
|
+
: await this.planSwitch(orgId, agent, conv.selection, input);
|
|
644
705
|
const extra = await this.resolveExtra(orgId, accountId, input);
|
|
645
706
|
const invoked = agent === undefined
|
|
646
707
|
? undefined
|
|
@@ -680,16 +741,17 @@ let ConversationsService = class ConversationsService {
|
|
|
680
741
|
* The selection a message switches to, or null when it changes nothing. A model equal to the
|
|
681
742
|
* agent's means "back to the agent's model" (null); a model change without `effort` resets the
|
|
682
743
|
* effort. The target model must resolve (`agent.model_unavailable`) and declare the effort
|
|
683
|
-
* (`validation_failed`). Resolving is the agent editor's check
|
|
684
|
-
*
|
|
685
|
-
* worker's `fallBackIfUnavailable`
|
|
744
|
+
* (`validation_failed`). Resolving is the agent editor's check, for the org (its effective
|
|
745
|
+
* provider config, spec B §5.5) and its disabled lists: a model the platform or the org disabled,
|
|
746
|
+
* or a non-chat model, is refused (spec B §5.3), as the run worker's `fallBackIfUnavailable` falls
|
|
747
|
+
* back from it.
|
|
686
748
|
*/
|
|
687
|
-
async planSwitch(agent, current, input) {
|
|
749
|
+
async planSwitch(orgId, agent, current, input) {
|
|
688
750
|
const next = planSelection(agent.model, current, input);
|
|
689
751
|
if (next === null)
|
|
690
752
|
return null;
|
|
691
753
|
const { model, effort } = next;
|
|
692
|
-
const { info } = await this.providers.resolve(model ?? agent.model);
|
|
754
|
+
const { info } = await this.providers.resolve(orgId, model ?? agent.model);
|
|
693
755
|
if (effort !== null) {
|
|
694
756
|
const knob = info.parameters.find((p) => p.key === "effort");
|
|
695
757
|
const values = knob?.schema?.enum ?? [];
|
|
@@ -710,7 +772,7 @@ let ConversationsService = class ConversationsService {
|
|
|
710
772
|
if (pick.model === undefined && pick.effort === undefined)
|
|
711
773
|
return;
|
|
712
774
|
const agent = await this.agents.get(orgId, conv.agentId, accountId);
|
|
713
|
-
await this.planSwitch(agent.definition, conv.selection, pick);
|
|
775
|
+
await this.planSwitch(orgId, agent.definition, conv.selection, pick);
|
|
714
776
|
}
|
|
715
777
|
/**
|
|
716
778
|
* Writes the message (preceded by its `model_switched` when it switches) inside `t` and updates
|
|
@@ -812,9 +874,26 @@ let ConversationsService = class ConversationsService {
|
|
|
812
874
|
* 中止会话当前的运行(queued / running / waiting):返回 runId;没有 → `run.not_active`。
|
|
813
875
|
* 等人处理的运行没有 worker:直接取消等待并写终态。其余经 Redis 广播,运行所在的任意副本都会收到;
|
|
814
876
|
* 运行已是孤儿(没有任何 worker 在执行)时直接写终态。
|
|
877
|
+
*
|
|
878
|
+
* A root conversation's stop stops only its own run: its background sub-agents keep working
|
|
879
|
+
* (agent map spec §6). A sub-agent's conversation (its owner, from the agent map) stops that
|
|
880
|
+
* sub-agent with every descendant (`RunControl.stopTree`); `run.not_active` when nothing in that
|
|
881
|
+
* subtree runs, else the sub-agent's latest run id.
|
|
815
882
|
*/
|
|
816
883
|
async abort(orgId, conversationId, accountId) {
|
|
817
|
-
await this.get(orgId, conversationId, accountId);
|
|
884
|
+
const conv = await this.get(orgId, conversationId, accountId);
|
|
885
|
+
if (conv.parentConversationId !== null) {
|
|
886
|
+
const latest = await this.db
|
|
887
|
+
.selectFrom("runs")
|
|
888
|
+
.select("id")
|
|
889
|
+
.where("conversation_id", "=", conversationId)
|
|
890
|
+
.orderBy("created_at", "desc")
|
|
891
|
+
.executeTakeFirst();
|
|
892
|
+
const n = await this.runs.stopTree(conversationId, accountId);
|
|
893
|
+
if (n === 0 || !latest)
|
|
894
|
+
throw new ApiError("run.not_active", "No active run to abort");
|
|
895
|
+
return latest.id;
|
|
896
|
+
}
|
|
818
897
|
const run = await this.db
|
|
819
898
|
.selectFrom("runs")
|
|
820
899
|
.select(["id", "status"])
|
|
@@ -867,6 +946,7 @@ ConversationsService = __decorate([
|
|
|
867
946
|
__param(8, Inject(AttachmentsService)),
|
|
868
947
|
__param(9, Inject(SkillInvoker)),
|
|
869
948
|
__param(10, Inject(BackgroundTaskStopper)),
|
|
870
|
-
__param(11, Inject(
|
|
949
|
+
__param(11, Inject(ConversationEnvironments)),
|
|
950
|
+
__param(12, Inject(TransactionHost))
|
|
871
951
|
], ConversationsService);
|
|
872
952
|
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 };
|
|
@@ -28,13 +28,16 @@ export declare const conversationTopic: (conversationId: string) => string;
|
|
|
28
28
|
* 会话频道上的总线消息:
|
|
29
29
|
* - `events`:会话日志已推进到 `toSeq`(订阅方据此 `readAfter` 补读,消息本身不携带事件);
|
|
30
30
|
* - `delta`:运行的流式增量(文本 / 思考 / `step_reset`:丢弃该步此前推出的增量),只是草稿,
|
|
31
|
-
* 最终内容以日志中的 assistant_message 为准。`offset
|
|
32
|
-
*
|
|
31
|
+
* 最终内容以日志中的 assistant_message 为准。`offset` (text and thinking): the characters of
|
|
32
|
+
* that channel this attempt of the step streamed before the delta; a subscriber that joined midway
|
|
33
|
+
* tells by it whether it has the step's text from the start (the channel outbound only drafts
|
|
34
|
+
* complete text) and drops what a live draft already covers (spec 2026-11-07 §3.2);
|
|
33
35
|
* - `ui`:插件经 `ctx.ui.invalidate` 告知这个会话的某个界面贡献变了(不进日志、不是模型可见内容),
|
|
34
36
|
* SSE 转发为 `event: ui`,网页据此重新取视图。
|
|
35
|
-
* - `subagent_progress`: after each step of a sub-agent run, on
|
|
36
|
-
* spec §14.2
|
|
37
|
-
* log; the SSE forwards it as
|
|
37
|
+
* - `subagent_progress`: after each step of a sub-agent run, on the topic of **every ancestor**
|
|
38
|
+
* (sub-agents spec §14.2, agent map spec §8), `subagentId` the progressing agent: its step and
|
|
39
|
+
* tool call count so far, and its last tool's key. Not in any log; the SSE forwards it as
|
|
40
|
+
* `event: subagent_progress` (data without `kind`).
|
|
38
41
|
*/
|
|
39
42
|
export type ConversationBusMessage = {
|
|
40
43
|
kind: "events";
|
|
@@ -107,6 +110,18 @@ export declare class EventLog {
|
|
|
107
110
|
publishChanged(conversationId: string, what: ConversationChange): Promise<void>;
|
|
108
111
|
/** 读 `afterSeq` 之后的事件,按 seq 升序,最多 `limit` 条。 */
|
|
109
112
|
readAfter(conversationId: string, afterSeq: number, limit?: number): Promise<ConversationEvent[]>;
|
|
113
|
+
/**
|
|
114
|
+
* The page of the log that ends right before `beforeSeq` (`null`: the log's end), in ascending
|
|
115
|
+
* seq: the last `limit` events before it, extended back so the first event is the log's first or
|
|
116
|
+
* the first one after a run's end (`run_finished` / `run_failed` / `run_aborted`), at most
|
|
117
|
+
* `extend` events further back (a longer run then starts mid-run). `turnsBefore`: how many runs
|
|
118
|
+
* started (distinct `run_id` of `run_started`) before the page's first event. History paging
|
|
119
|
+
* spec §2.
|
|
120
|
+
*/
|
|
121
|
+
readTurnPageBefore(conversationId: string, beforeSeq: number | null, limit: number, extend: number): Promise<{
|
|
122
|
+
events: ConversationEvent[];
|
|
123
|
+
turnsBefore: number;
|
|
124
|
+
}>;
|
|
110
125
|
/**
|
|
111
126
|
* 读 `afterSeq` 之后、属于 `runIds` 中某次运行的事件,按 seq 升序,最多 `limit` 条(轨迹按运行分页用)。
|
|
112
127
|
* `runIds` 为空时返回空数组。走部分索引 `conversation_events_run_idx (conversation_id, run_id, seq)`(0027):
|
|
@@ -155,6 +155,66 @@ let EventLog = class EventLog {
|
|
|
155
155
|
.execute();
|
|
156
156
|
return rows.map(toEvent);
|
|
157
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* The page of the log that ends right before `beforeSeq` (`null`: the log's end), in ascending
|
|
160
|
+
* seq: the last `limit` events before it, extended back so the first event is the log's first or
|
|
161
|
+
* the first one after a run's end (`run_finished` / `run_failed` / `run_aborted`), at most
|
|
162
|
+
* `extend` events further back (a longer run then starts mid-run). `turnsBefore`: how many runs
|
|
163
|
+
* started (distinct `run_id` of `run_started`) before the page's first event. History paging
|
|
164
|
+
* spec §2.
|
|
165
|
+
*/
|
|
166
|
+
async readTurnPageBefore(conversationId, beforeSeq, limit, extend) {
|
|
167
|
+
let q = this.db
|
|
168
|
+
.selectFrom("conversation_events")
|
|
169
|
+
.select(EVENT_COLUMNS)
|
|
170
|
+
.where("conversation_id", "=", conversationId);
|
|
171
|
+
if (beforeSeq !== null)
|
|
172
|
+
q = q.where("seq", "<", String(beforeSeq));
|
|
173
|
+
const rows = (await q.orderBy("seq", "desc").limit(limit).execute()).reverse();
|
|
174
|
+
const first = rows[0] === undefined ? null : Number(rows[0].seq);
|
|
175
|
+
if (first === null)
|
|
176
|
+
return { events: [], turnsBefore: 0 };
|
|
177
|
+
let start = first;
|
|
178
|
+
if (first > 1) {
|
|
179
|
+
// the latest run end at or before the event just above the page, within the extension
|
|
180
|
+
const end = await this.db
|
|
181
|
+
.selectFrom("conversation_events")
|
|
182
|
+
.select((eb) => eb.fn.max("seq").as("seq"))
|
|
183
|
+
.where("conversation_id", "=", conversationId)
|
|
184
|
+
.where("seq", "<", String(first))
|
|
185
|
+
.where("seq", ">=", String(Math.max(1, first - 1 - extend)))
|
|
186
|
+
.where("type", "in", ["run_finished", "run_failed", "run_aborted"])
|
|
187
|
+
.executeTakeFirst();
|
|
188
|
+
// none within reach: the page starts at the log's start when that is in reach, else mid-run
|
|
189
|
+
if (end?.seq != null)
|
|
190
|
+
start = Number(end.seq) + 1;
|
|
191
|
+
else if (first - 1 <= extend)
|
|
192
|
+
start = 1;
|
|
193
|
+
}
|
|
194
|
+
const head = start < first
|
|
195
|
+
? await this.db
|
|
196
|
+
.selectFrom("conversation_events")
|
|
197
|
+
.select(EVENT_COLUMNS)
|
|
198
|
+
.where("conversation_id", "=", conversationId)
|
|
199
|
+
.where("seq", ">=", String(start))
|
|
200
|
+
.where("seq", "<", String(first))
|
|
201
|
+
.orderBy("seq")
|
|
202
|
+
.execute()
|
|
203
|
+
: [];
|
|
204
|
+
const turns = start > 1
|
|
205
|
+
? await this.db
|
|
206
|
+
.selectFrom("conversation_events")
|
|
207
|
+
.select((eb) => eb.fn.count("run_id").distinct().as("n"))
|
|
208
|
+
.where("conversation_id", "=", conversationId)
|
|
209
|
+
.where("type", "=", "run_started")
|
|
210
|
+
.where("seq", "<", String(start))
|
|
211
|
+
.executeTakeFirst()
|
|
212
|
+
: undefined;
|
|
213
|
+
return {
|
|
214
|
+
events: [...head, ...rows].map(toEvent),
|
|
215
|
+
turnsBefore: Number(turns?.n ?? 0),
|
|
216
|
+
};
|
|
217
|
+
}
|
|
158
218
|
/**
|
|
159
219
|
* 读 `afterSeq` 之后、属于 `runIds` 中某次运行的事件,按 seq 升序,最多 `limit` 条(轨迹按运行分页用)。
|
|
160
220
|
* `runIds` 为空时返回空数组。走部分索引 `conversation_events_run_idx (conversation_id, run_id, seq)`(0027):
|