@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
|
@@ -12,9 +12,10 @@ import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
|
12
12
|
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
13
13
|
import { XactLock } from "../infra/database/xact-lock.js";
|
|
14
14
|
/**
|
|
15
|
-
* The launch lock of one
|
|
16
|
-
* serializes background task reservations in
|
|
17
|
-
* against `sandbox.background.maxTasks`
|
|
15
|
+
* The launch lock of one root conversation (decision R9: one provider per transaction-scoped
|
|
16
|
+
* lock): serializes background task reservations in its tree, so the count of running tasks
|
|
17
|
+
* checked against `sandbox.background.maxTasks` (per root conversation, whatever environment it
|
|
18
|
+
* works in) and the insert of the new row are one step. Joins the
|
|
18
19
|
* caller's transaction (`mandatory`), which holds it until it ends.
|
|
19
20
|
*/
|
|
20
21
|
let BackgroundLaunchLock = class BackgroundLaunchLock {
|
|
@@ -21,11 +21,12 @@ export declare const launchAbandonedAfterMs: (cfg: KernelConfig) => number;
|
|
|
21
21
|
/**
|
|
22
22
|
* The worker's background task jobs (spec 2026-11-05-background-bash-design §4.3), each once per
|
|
23
23
|
* tick across replicas:
|
|
24
|
-
* - `background-task-poll` (every `sandbox.background.pollSeconds`): for every
|
|
25
|
-
* running tasks
|
|
26
|
-
*
|
|
27
|
-
* {@link BackgroundTaskFinisher}. Each poll
|
|
28
|
-
*
|
|
24
|
+
* - `background-task-poll` (every `sandbox.background.pollSeconds`): for every environment
|
|
25
|
+
* instance with running tasks (of any conversation using it), one exec through
|
|
26
|
+
* `SandboxService.ifRunning` (which never creates or resumes an instance) reports each task's
|
|
27
|
+
* exit file and liveness; ended tasks finish through {@link BackgroundTaskFinisher}. Each poll
|
|
28
|
+
* takes and releases a lease, so `last_used_at` stays fresh and an instance with running tasks
|
|
29
|
+
* is never idle-suspended;
|
|
29
30
|
* - `background-task-prune` (daily): deletes finished tasks older than `tools.outputRetentionDays`.
|
|
30
31
|
*/
|
|
31
32
|
export declare class BackgroundTaskPollJob {
|
|
@@ -46,8 +47,10 @@ export declare class BackgroundTaskPollJob {
|
|
|
46
47
|
* result: they never started), with a `changed: "background"` frame to their conversations.
|
|
47
48
|
*/
|
|
48
49
|
pollOnce(signal?: AbortSignal): Promise<number>;
|
|
49
|
-
/** Polls the tasks of one
|
|
50
|
+
/** Polls the tasks of one environment instance; returns how many finished. */
|
|
50
51
|
private pollSandbox;
|
|
52
|
+
/** The poll exec of one instance: each task's report by id. */
|
|
53
|
+
private pollExec;
|
|
51
54
|
/** Deletes the finished tasks older than `tools.outputRetentionDays` (their rows only). */
|
|
52
55
|
prune(): Promise<void>;
|
|
53
56
|
}
|
|
@@ -14,10 +14,11 @@ import { LockService } from "../infra/lock/lock.service.js";
|
|
|
14
14
|
import { LockedCron } from "../infra/schedule/locked-cron.decorator.js";
|
|
15
15
|
import { LockedInterval } from "../infra/schedule/locked-interval.js";
|
|
16
16
|
import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
17
|
-
import { SandboxService } from "../sandbox/sandbox.service.js";
|
|
17
|
+
import { SandboxService, } from "../sandbox/sandbox.service.js";
|
|
18
18
|
import { sandboxBaseTimeoutMs } from "../tools/builtins/sandbox/common.js";
|
|
19
19
|
import { BackgroundTaskFinisher } from "./finish.js";
|
|
20
20
|
import { LAUNCH_EXEC_TIMEOUT_MS } from "./launch.js";
|
|
21
|
+
import { actingAs, taskActor } from "./session.js";
|
|
21
22
|
import { parsePollOutput, polledAs, pollScript } from "./status.js";
|
|
22
23
|
import { notRunningAs, RECREATED } from "./stop.js";
|
|
23
24
|
import { BackgroundTaskStore } from "./store.js";
|
|
@@ -42,11 +43,12 @@ const POLL_MAX_OUTPUT_BYTES = 4 * 1024 * 1024;
|
|
|
42
43
|
/**
|
|
43
44
|
* The worker's background task jobs (spec 2026-11-05-background-bash-design §4.3), each once per
|
|
44
45
|
* tick across replicas:
|
|
45
|
-
* - `background-task-poll` (every `sandbox.background.pollSeconds`): for every
|
|
46
|
-
* running tasks
|
|
47
|
-
*
|
|
48
|
-
* {@link BackgroundTaskFinisher}. Each poll
|
|
49
|
-
*
|
|
46
|
+
* - `background-task-poll` (every `sandbox.background.pollSeconds`): for every environment
|
|
47
|
+
* instance with running tasks (of any conversation using it), one exec through
|
|
48
|
+
* `SandboxService.ifRunning` (which never creates or resumes an instance) reports each task's
|
|
49
|
+
* exit file and liveness; ended tasks finish through {@link BackgroundTaskFinisher}. Each poll
|
|
50
|
+
* takes and releases a lease, so `last_used_at` stays fresh and an instance with running tasks
|
|
51
|
+
* is never idle-suspended;
|
|
50
52
|
* - `background-task-prune` (daily): deletes finished tasks older than `tools.outputRetentionDays`.
|
|
51
53
|
*/
|
|
52
54
|
let BackgroundTaskPollJob = class BackgroundTaskPollJob {
|
|
@@ -92,7 +94,8 @@ let BackgroundTaskPollJob = class BackgroundTaskPollJob {
|
|
|
92
94
|
for (const t of await this.store.runningStarted()) {
|
|
93
95
|
if (t.sid === null || t.sandboxCreatedAt === null)
|
|
94
96
|
continue;
|
|
95
|
-
|
|
97
|
+
// one exec per instance: the tasks of every conversation sharing the environment
|
|
98
|
+
const key = `${t.environmentId} ${t.sandboxCreatedAt.getTime()}`;
|
|
96
99
|
groups.set(key, [...(groups.get(key) ?? []), t]);
|
|
97
100
|
}
|
|
98
101
|
let finished = 0;
|
|
@@ -106,7 +109,7 @@ let BackgroundTaskPollJob = class BackgroundTaskPollJob {
|
|
|
106
109
|
if (signal.aborted)
|
|
107
110
|
break;
|
|
108
111
|
this.log.warn("cannot poll background tasks; retrying next tick", {
|
|
109
|
-
|
|
112
|
+
environmentId: tasks[0]?.environmentId,
|
|
110
113
|
err,
|
|
111
114
|
});
|
|
112
115
|
}
|
|
@@ -115,22 +118,13 @@ let BackgroundTaskPollJob = class BackgroundTaskPollJob {
|
|
|
115
118
|
this.log.info("background tasks finished", { count: finished });
|
|
116
119
|
return finished;
|
|
117
120
|
}
|
|
118
|
-
/** Polls the tasks of one
|
|
121
|
+
/** Polls the tasks of one environment instance; returns how many finished. */
|
|
119
122
|
async pollSandbox(tasks, signal) {
|
|
120
123
|
const [first] = tasks;
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
timeoutMs: POLL_EXEC_TIMEOUT_MS,
|
|
126
|
-
maxOutputBytes: POLL_MAX_OUTPUT_BYTES,
|
|
127
|
-
signal: sig,
|
|
128
|
-
});
|
|
129
|
-
if (res.exitCode !== 0 || res.truncated) {
|
|
130
|
-
throw new Error(`the poll exec failed (exit ${res.exitCode}${res.truncated ? ", truncated" : ""}): ${res.stderr.slice(0, 500)}`);
|
|
131
|
-
}
|
|
132
|
-
return parsePollOutput(res.stdout);
|
|
133
|
-
}, signal);
|
|
124
|
+
// a task from before environments has no instance any more
|
|
125
|
+
const r = first.environmentId === null
|
|
126
|
+
? { kind: "not_running", status: "gone" }
|
|
127
|
+
: await this.sandbox.ifRunning(first.environmentId, { createdAt: first.sandboxCreatedAt }, (p, h, sig) => this.pollExec(actingAs(p, taskActor(first)), h, tasks, sig), signal);
|
|
134
128
|
const now = new Date();
|
|
135
129
|
let n = 0;
|
|
136
130
|
for (const t of tasks) {
|
|
@@ -155,6 +149,20 @@ let BackgroundTaskPollJob = class BackgroundTaskPollJob {
|
|
|
155
149
|
}
|
|
156
150
|
return n;
|
|
157
151
|
}
|
|
152
|
+
/** The poll exec of one instance: each task's report by id. */
|
|
153
|
+
async pollExec(p, h, tasks, signal) {
|
|
154
|
+
const res = await p.exec(h, {
|
|
155
|
+
command: pollScript(tasks.map((t) => ({ id: t.id, sid: t.sid }))),
|
|
156
|
+
cwd: "/workspace",
|
|
157
|
+
timeoutMs: POLL_EXEC_TIMEOUT_MS,
|
|
158
|
+
maxOutputBytes: POLL_MAX_OUTPUT_BYTES,
|
|
159
|
+
signal,
|
|
160
|
+
});
|
|
161
|
+
if (res.exitCode !== 0 || res.truncated) {
|
|
162
|
+
throw new Error(`the poll exec failed (exit ${res.exitCode}${res.truncated ? ", truncated" : ""}): ${res.stderr.slice(0, 500)}`);
|
|
163
|
+
}
|
|
164
|
+
return parsePollOutput(res.stdout);
|
|
165
|
+
}
|
|
158
166
|
/** Deletes the finished tasks older than `tools.outputRetentionDays` (their rows only). */
|
|
159
167
|
async prune() {
|
|
160
168
|
const days = this.config.get().tools.outputRetentionDays;
|
|
@@ -1,10 +1,21 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { SandboxActor, SandboxHandle } from "@capybara-hq/plugin-sdk";
|
|
2
|
+
import type { HeldProvider, TaggedProvider } from "../sandbox/sandbox.service.js";
|
|
2
3
|
/**
|
|
3
4
|
* A background task's session inside the sandbox (spec 2026-11-05-background-bash-design §4.2):
|
|
4
5
|
* every process of a task is in the session `setsid` started, so liveness is `pgrep -s <sid>` and
|
|
5
6
|
* stopping is `pkill -s <sid>` (never `kill -0` or `/proc`, which disagree between sandbox-fake and
|
|
6
7
|
* Linux).
|
|
7
8
|
*/
|
|
9
|
+
/**
|
|
10
|
+
* `p` with every `exec` carrying `actor` (`SandboxService.ifRunning` tags execs but leaves the
|
|
11
|
+
* actor to the caller): the provider then reads like a `withSandbox` holder's.
|
|
12
|
+
*/
|
|
13
|
+
export declare function actingAs(p: TaggedProvider, actor: SandboxActor): HeldProvider;
|
|
14
|
+
/** Who a background task's own execs (poll, stop, reads) act for: its trigger and its owner. */
|
|
15
|
+
export declare const taskActor: (task: {
|
|
16
|
+
triggerAccountId: string;
|
|
17
|
+
conversationId: string;
|
|
18
|
+
}) => SandboxActor;
|
|
8
19
|
/** A session id (the pid `setsid` started). */
|
|
9
20
|
export declare const SID_RE: RegExp;
|
|
10
21
|
/** The time limit of one kill of a session ({@link killSession}). */
|
|
@@ -25,7 +36,7 @@ export declare function killSessionScript(sid: string): string;
|
|
|
25
36
|
* must be killed even when the caller was just aborted). True when the session was confirmed
|
|
26
37
|
* empty; false when it could not be (an error is never thrown).
|
|
27
38
|
*/
|
|
28
|
-
export declare function killSession(p:
|
|
39
|
+
export declare function killSession(p: Pick<HeldProvider, "exec">, h: SandboxHandle, sid: string): Promise<boolean>;
|
|
29
40
|
/** The longest `lastLines` of a finished task (spec §2.4). */
|
|
30
41
|
export declare const LAST_LINES_MAX_CHARS = 4000;
|
|
31
42
|
/**
|
|
@@ -5,6 +5,19 @@ import { TASK_ID_RE, TASKS_DIR } from "./launch.js";
|
|
|
5
5
|
* stopping is `pkill -s <sid>` (never `kill -0` or `/proc`, which disagree between sandbox-fake and
|
|
6
6
|
* Linux).
|
|
7
7
|
*/
|
|
8
|
+
/**
|
|
9
|
+
* `p` with every `exec` carrying `actor` (`SandboxService.ifRunning` tags execs but leaves the
|
|
10
|
+
* actor to the caller): the provider then reads like a `withSandbox` holder's.
|
|
11
|
+
*/
|
|
12
|
+
export function actingAs(p, actor) {
|
|
13
|
+
const wrapped = Object.create(p);
|
|
14
|
+
Object.defineProperty(wrapped, "exec", {
|
|
15
|
+
value: (h, args) => p.exec(h, { ...args, actor }),
|
|
16
|
+
});
|
|
17
|
+
return wrapped;
|
|
18
|
+
}
|
|
19
|
+
/** Who a background task's own execs (poll, stop, reads) act for: its trigger and its owner. */
|
|
20
|
+
export const taskActor = (task) => ({ accountId: task.triggerAccountId, conversationId: task.conversationId });
|
|
8
21
|
/** A session id (the pid `setsid` started). */
|
|
9
22
|
export const SID_RE = /^[1-9][0-9]*$/;
|
|
10
23
|
/** The time limit of one kill of a session ({@link killSession}). */
|
|
@@ -42,13 +42,19 @@ export declare class BackgroundTaskStopper {
|
|
|
42
42
|
*/
|
|
43
43
|
stop(task: BackgroundTaskRow, why: StopReason, signal?: AbortSignal): Promise<BackgroundTaskRow>;
|
|
44
44
|
/**
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* that run's model after that); any other conversation is left alone. Only that run's tasks: a
|
|
48
|
-
* follow-up run of the same child keeps its own when an older run's end is handled late. Never
|
|
49
|
-
* throws (see {@link stopAll}).
|
|
45
|
+
* SIGTERM, the grace period, SIGKILL until the session is empty, then the last lines: in the
|
|
46
|
+
* task's own instance only (`ifRunning`); a task from before environments has none.
|
|
50
47
|
*/
|
|
51
|
-
|
|
48
|
+
private signalTask;
|
|
49
|
+
/**
|
|
50
|
+
* After a sub-agent run ended (spec §4.3): stops the running tasks of `conversationId` when it
|
|
51
|
+
* is a sub-agent's conversation; any other conversation is left alone. With `runId`, only the
|
|
52
|
+
* tasks that run started (a fork child's run: a later run of the same child keeps its own when
|
|
53
|
+
* an older run's end is handled late); without, all of them (a stopped background child, agent
|
|
54
|
+
* map spec §6). Their finish is marked `stoppedBy: "subagent_end"`, so it never wakes the child.
|
|
55
|
+
* Never throws (see {@link stopAll}).
|
|
56
|
+
*/
|
|
57
|
+
stopSubagentTasks(conversationId: string, runId?: string): Promise<void>;
|
|
52
58
|
/**
|
|
53
59
|
* Before a conversation is deleted: stops every running task in its sandbox (its own and its
|
|
54
60
|
* sub-agents'). Never throws (see {@link stopAll}).
|
package/dist/background/stop.js
CHANGED
|
@@ -13,7 +13,7 @@ import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
|
13
13
|
import { SandboxService } from "../sandbox/sandbox.service.js";
|
|
14
14
|
import { BackgroundTaskFinisher, } from "./finish.js";
|
|
15
15
|
import { TASKS_DIR } from "./launch.js";
|
|
16
|
-
import { assertTaskRef, decodeTail, killSession, tailCommand } from "./session.js";
|
|
16
|
+
import { actingAs, assertTaskRef, decodeTail, killSession, tailCommand, taskActor, } from "./session.js";
|
|
17
17
|
import { BackgroundTaskStore } from "./store.js";
|
|
18
18
|
/** How long a stop waits after SIGTERM before SIGKILL (spec §2.3). */
|
|
19
19
|
export const STOP_GRACE_MS = 5000;
|
|
@@ -100,45 +100,23 @@ let BackgroundTaskStopper = class BackgroundTaskStopper {
|
|
|
100
100
|
const cur = (await this.store.get(task.id)) ?? task;
|
|
101
101
|
if (cur.status !== "running" || cur.sid === null || cur.sandboxCreatedAt === null)
|
|
102
102
|
return cur;
|
|
103
|
+
const started = { ...cur, sandboxCreatedAt: cur.sandboxCreatedAt };
|
|
103
104
|
const sid = cur.sid;
|
|
104
105
|
assertTaskRef(cur.id, sid);
|
|
105
106
|
const reported = why === "tool";
|
|
106
107
|
// a person's stop never wakes the conversation (background Bash §3, fix round 1), nor does
|
|
107
|
-
// the stop of a conversation being deleted
|
|
108
|
-
const stoppedBy = why === "person"
|
|
108
|
+
// the stop of a conversation being deleted or of a sub-agent that ended (agent map spec §5.3)
|
|
109
|
+
const stoppedBy = why === "person"
|
|
110
|
+
? "person"
|
|
111
|
+
: why === "conversation_deleted"
|
|
112
|
+
? "deletion"
|
|
113
|
+
: why === "subagent_end"
|
|
114
|
+
? "subagent_end"
|
|
115
|
+
: undefined;
|
|
109
116
|
const opts = stoppedBy === undefined ? {} : { stoppedBy };
|
|
110
117
|
let r;
|
|
111
118
|
try {
|
|
112
|
-
r = await this.
|
|
113
|
-
const term = await p.exec(h, {
|
|
114
|
-
command: termScript(cur.id, sid),
|
|
115
|
-
cwd: "/workspace",
|
|
116
|
-
timeoutMs: TERM_EXEC_TIMEOUT_MS,
|
|
117
|
-
maxOutputBytes: 4096,
|
|
118
|
-
signal: sig,
|
|
119
|
-
});
|
|
120
|
-
const exited = /^exited (-?[0-9]+)$/.exec(term.stdout.trim());
|
|
121
|
-
if (term.exitCode !== 0 || (!exited && term.stdout.trim() !== "term")) {
|
|
122
|
-
throw new Error(`the stop of background task ${cur.id} failed (${term.exitCode})`);
|
|
123
|
-
}
|
|
124
|
-
// also after an exit: processes the command left running are stopped with the task
|
|
125
|
-
if (!(await killSession(p, h, sid))) {
|
|
126
|
-
throw new Error(`background task ${cur.id} could not be confirmed stopped`);
|
|
127
|
-
}
|
|
128
|
-
const tail = await p.exec(h, {
|
|
129
|
-
command: tailCommand(cur.id),
|
|
130
|
-
cwd: "/workspace",
|
|
131
|
-
timeoutMs: TAIL_EXEC_TIMEOUT_MS,
|
|
132
|
-
maxOutputBytes: 64 * 1024,
|
|
133
|
-
signal: sig,
|
|
134
|
-
});
|
|
135
|
-
const lastLines = tail.exitCode === 0 ? decodeTail(tail.stdout) : "";
|
|
136
|
-
// a task that had exited before the signal ends as its exit says
|
|
137
|
-
const to = exited
|
|
138
|
-
? exitedAs(cur, Number(exited[1]), new Date())
|
|
139
|
-
: { status: "stopped" };
|
|
140
|
-
return { to, lastLines };
|
|
141
|
-
}, signal);
|
|
119
|
+
r = await this.signalTask(started, sid, signal);
|
|
142
120
|
}
|
|
143
121
|
catch (err) {
|
|
144
122
|
await this.store
|
|
@@ -158,11 +136,51 @@ let BackgroundTaskStopper = class BackgroundTaskStopper {
|
|
|
158
136
|
return (await this.store.get(cur.id)) ?? cur;
|
|
159
137
|
}
|
|
160
138
|
/**
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
139
|
+
* SIGTERM, the grace period, SIGKILL until the session is empty, then the last lines: in the
|
|
140
|
+
* task's own instance only (`ifRunning`); a task from before environments has none.
|
|
141
|
+
*/
|
|
142
|
+
async signalTask(cur, sid, signal) {
|
|
143
|
+
if (cur.environmentId === null)
|
|
144
|
+
return { kind: "not_running", status: "gone" };
|
|
145
|
+
return this.sandbox.ifRunning(cur.environmentId, { createdAt: cur.sandboxCreatedAt }, async (tp, h, sig) => {
|
|
146
|
+
const p = actingAs(tp, taskActor(cur));
|
|
147
|
+
const term = await p.exec(h, {
|
|
148
|
+
command: termScript(cur.id, sid),
|
|
149
|
+
cwd: "/workspace",
|
|
150
|
+
timeoutMs: TERM_EXEC_TIMEOUT_MS,
|
|
151
|
+
maxOutputBytes: 4096,
|
|
152
|
+
signal: sig,
|
|
153
|
+
});
|
|
154
|
+
const exited = /^exited (-?[0-9]+)$/.exec(term.stdout.trim());
|
|
155
|
+
if (term.exitCode !== 0 || (!exited && term.stdout.trim() !== "term")) {
|
|
156
|
+
throw new Error(`the stop of background task ${cur.id} failed (${term.exitCode})`);
|
|
157
|
+
}
|
|
158
|
+
// also after an exit: processes the command left running are stopped with the task
|
|
159
|
+
if (!(await killSession(p, h, sid))) {
|
|
160
|
+
throw new Error(`background task ${cur.id} could not be confirmed stopped`);
|
|
161
|
+
}
|
|
162
|
+
const tail = await p.exec(h, {
|
|
163
|
+
command: tailCommand(cur.id),
|
|
164
|
+
cwd: "/workspace",
|
|
165
|
+
timeoutMs: TAIL_EXEC_TIMEOUT_MS,
|
|
166
|
+
maxOutputBytes: 64 * 1024,
|
|
167
|
+
signal: sig,
|
|
168
|
+
});
|
|
169
|
+
const lastLines = tail.exitCode === 0 ? decodeTail(tail.stdout) : "";
|
|
170
|
+
// a task that had exited before the signal ends as its exit says
|
|
171
|
+
const to = exited
|
|
172
|
+
? exitedAs(cur, Number(exited[1]), new Date())
|
|
173
|
+
: { status: "stopped" };
|
|
174
|
+
return { to, lastLines };
|
|
175
|
+
}, signal);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* After a sub-agent run ended (spec §4.3): stops the running tasks of `conversationId` when it
|
|
179
|
+
* is a sub-agent's conversation; any other conversation is left alone. With `runId`, only the
|
|
180
|
+
* tasks that run started (a fork child's run: a later run of the same child keeps its own when
|
|
181
|
+
* an older run's end is handled late); without, all of them (a stopped background child, agent
|
|
182
|
+
* map spec §6). Their finish is marked `stoppedBy: "subagent_end"`, so it never wakes the child.
|
|
183
|
+
* Never throws (see {@link stopAll}).
|
|
166
184
|
*/
|
|
167
185
|
async stopSubagentTasks(conversationId, runId) {
|
|
168
186
|
try {
|
|
@@ -173,7 +191,7 @@ let BackgroundTaskStopper = class BackgroundTaskStopper {
|
|
|
173
191
|
.executeTakeFirst();
|
|
174
192
|
if (conv?.kind !== "subagent")
|
|
175
193
|
return;
|
|
176
|
-
const tasks = (await this.store.runningOwnedBy(conversationId)).filter((t) => t.runId === runId);
|
|
194
|
+
const tasks = (await this.store.runningOwnedBy(conversationId)).filter((t) => runId === undefined || t.runId === runId);
|
|
177
195
|
await this.stopAll(tasks, "subagent_end");
|
|
178
196
|
}
|
|
179
197
|
catch (err) {
|
|
@@ -8,8 +8,16 @@ export interface BackgroundTaskRow {
|
|
|
8
8
|
orgId: string;
|
|
9
9
|
/** The owner: the child conversation for a sub-agent. */
|
|
10
10
|
conversationId: string;
|
|
11
|
-
/**
|
|
11
|
+
/**
|
|
12
|
+
* The root conversation of the owner's tree: `sandbox.background.maxTasks` counts per root
|
|
13
|
+
* conversation.
|
|
14
|
+
*/
|
|
12
15
|
sandboxConversationId: string;
|
|
16
|
+
/**
|
|
17
|
+
* The environment the task runs in (the root conversation's when it was launched): its instance
|
|
18
|
+
* is where the task's processes are. Null only for tasks from before environments (all finished).
|
|
19
|
+
*/
|
|
20
|
+
environmentId: string | null;
|
|
13
21
|
runId: string;
|
|
14
22
|
callId: string;
|
|
15
23
|
triggerAccountId: string;
|
|
@@ -64,9 +72,9 @@ export declare class BackgroundTaskStore {
|
|
|
64
72
|
private readonly launchLock;
|
|
65
73
|
constructor(db: KernelDb, txHost: TransactionHost, launchLock: BackgroundLaunchLock);
|
|
66
74
|
/**
|
|
67
|
-
* Reserves a launch: under the
|
|
75
|
+
* Reserves a launch: under the root conversation's launch lock, counts the running tasks of
|
|
68
76
|
* `row.sandboxConversationId` and inserts `row` as `running` (no `sid`) when fewer than
|
|
69
|
-
* `maxTasks` run. False (nothing written) when
|
|
77
|
+
* `maxTasks` run. False (nothing written) when that conversation tree already runs `maxTasks`.
|
|
70
78
|
*/
|
|
71
79
|
reserve(row: BackgroundTaskReservation, maxTasks: number): Promise<boolean>;
|
|
72
80
|
/**
|
|
@@ -114,7 +122,7 @@ export declare class BackgroundTaskStore {
|
|
|
114
122
|
}[]>;
|
|
115
123
|
insert(row: BackgroundTaskInsert): Promise<void>;
|
|
116
124
|
get(id: string): Promise<BackgroundTaskRow | undefined>;
|
|
117
|
-
/** The running tasks of one
|
|
125
|
+
/** The running tasks of one root conversation's tree, oldest first. */
|
|
118
126
|
runningIn(sandboxConversationId: string): Promise<BackgroundTaskRow[]>;
|
|
119
127
|
/**
|
|
120
128
|
* Every running task that has started (its `sid` is set) and no live stop claimed, across
|
|
@@ -124,6 +132,7 @@ export declare class BackgroundTaskStore {
|
|
|
124
132
|
runningStarted(): Promise<BackgroundTaskRow[]>;
|
|
125
133
|
/** The running tasks one conversation owns (not those of its sub-agents), oldest first. */
|
|
126
134
|
runningOwnedBy(conversationId: string): Promise<BackgroundTaskRow[]>;
|
|
135
|
+
/** The running tasks of one root conversation's tree (what `maxTasks` limits). */
|
|
127
136
|
countRunning(sandboxConversationId: string): Promise<number>;
|
|
128
137
|
/** The tasks owned by any of the conversations, newest first. */
|
|
129
138
|
listFor(conversationIds: string[]): Promise<BackgroundTaskRow[]>;
|
|
@@ -142,8 +151,11 @@ export declare class BackgroundTaskStore {
|
|
|
142
151
|
}): Promise<boolean>;
|
|
143
152
|
/** Moves the read offset forward only (a concurrent reader never moves it back). */
|
|
144
153
|
advanceOffset(id: string, to: number): Promise<void>;
|
|
145
|
-
/**
|
|
146
|
-
|
|
154
|
+
/**
|
|
155
|
+
* Finished tasks of an environment whose process may still exist (any conversation's: they
|
|
156
|
+
* share the instance).
|
|
157
|
+
*/
|
|
158
|
+
pendingKills(environmentId: string): Promise<BackgroundTaskRow[]>;
|
|
147
159
|
clearKill(ids: string[]): Promise<void>;
|
|
148
160
|
/** Deletes finished tasks that ended before `before`; a running one is never deleted. */
|
|
149
161
|
pruneFinished(before: Date): Promise<number>;
|
package/dist/background/store.js
CHANGED
|
@@ -18,6 +18,7 @@ const toRow = (r) => ({
|
|
|
18
18
|
orgId: r.org_id,
|
|
19
19
|
conversationId: r.conversation_id,
|
|
20
20
|
sandboxConversationId: r.sandbox_conversation_id,
|
|
21
|
+
environmentId: r.environment_id,
|
|
21
22
|
runId: r.run_id,
|
|
22
23
|
callId: r.call_id,
|
|
23
24
|
triggerAccountId: r.trigger_account_id,
|
|
@@ -66,9 +67,9 @@ let BackgroundTaskStore = class BackgroundTaskStore {
|
|
|
66
67
|
this.launchLock = launchLock;
|
|
67
68
|
}
|
|
68
69
|
/**
|
|
69
|
-
* Reserves a launch: under the
|
|
70
|
+
* Reserves a launch: under the root conversation's launch lock, counts the running tasks of
|
|
70
71
|
* `row.sandboxConversationId` and inserts `row` as `running` (no `sid`) when fewer than
|
|
71
|
-
* `maxTasks` run. False (nothing written) when
|
|
72
|
+
* `maxTasks` run. False (nothing written) when that conversation tree already runs `maxTasks`.
|
|
72
73
|
*/
|
|
73
74
|
async reserve(row, maxTasks) {
|
|
74
75
|
await this.launchLock.lock(row.sandboxConversationId);
|
|
@@ -190,6 +191,7 @@ let BackgroundTaskStore = class BackgroundTaskStore {
|
|
|
190
191
|
org_id: row.orgId,
|
|
191
192
|
conversation_id: row.conversationId,
|
|
192
193
|
sandbox_conversation_id: row.sandboxConversationId,
|
|
194
|
+
environment_id: row.environmentId,
|
|
193
195
|
run_id: row.runId,
|
|
194
196
|
call_id: row.callId,
|
|
195
197
|
trigger_account_id: row.triggerAccountId,
|
|
@@ -211,7 +213,7 @@ let BackgroundTaskStore = class BackgroundTaskStore {
|
|
|
211
213
|
.executeTakeFirst();
|
|
212
214
|
return r === undefined ? undefined : toRow(r);
|
|
213
215
|
}
|
|
214
|
-
/** The running tasks of one
|
|
216
|
+
/** The running tasks of one root conversation's tree, oldest first. */
|
|
215
217
|
async runningIn(sandboxConversationId) {
|
|
216
218
|
const rows = await this.db
|
|
217
219
|
.selectFrom("background_tasks")
|
|
@@ -252,6 +254,7 @@ let BackgroundTaskStore = class BackgroundTaskStore {
|
|
|
252
254
|
.execute();
|
|
253
255
|
return rows.map(toRow);
|
|
254
256
|
}
|
|
257
|
+
/** The running tasks of one root conversation's tree (what `maxTasks` limits). */
|
|
255
258
|
async countRunning(sandboxConversationId) {
|
|
256
259
|
const r = await this.db
|
|
257
260
|
.selectFrom("background_tasks")
|
|
@@ -306,12 +309,15 @@ let BackgroundTaskStore = class BackgroundTaskStore {
|
|
|
306
309
|
.where(sql `read_offset < ${to}`)
|
|
307
310
|
.execute();
|
|
308
311
|
}
|
|
309
|
-
/**
|
|
310
|
-
|
|
312
|
+
/**
|
|
313
|
+
* Finished tasks of an environment whose process may still exist (any conversation's: they
|
|
314
|
+
* share the instance).
|
|
315
|
+
*/
|
|
316
|
+
async pendingKills(environmentId) {
|
|
311
317
|
const rows = await this.db
|
|
312
318
|
.selectFrom("background_tasks")
|
|
313
319
|
.selectAll()
|
|
314
|
-
.where("
|
|
320
|
+
.where("environment_id", "=", environmentId)
|
|
315
321
|
.where("kill_pending", "=", true)
|
|
316
322
|
.orderBy("started_at", "asc")
|
|
317
323
|
.execute();
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ConversationAccess } from "../conversations/access.js";
|
|
2
2
|
import { EventLog } from "../conversations/event-log.js";
|
|
3
|
+
import { ConversationEnvironments } from "../environments/conversation-environments.js";
|
|
3
4
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
4
5
|
import { SandboxService } from "../sandbox/sandbox.service.js";
|
|
5
6
|
import { BackgroundTaskStopper } from "./stop.js";
|
|
@@ -33,7 +34,7 @@ export interface BackgroundTaskOutput {
|
|
|
33
34
|
/**
|
|
34
35
|
* The HTTP side of background tasks (spec 2026-11-05-background-bash-design §5): the tasks of a
|
|
35
36
|
* conversation and of its sub-agents, stopping one, reading its output. A task is reachable
|
|
36
|
-
* through the conversation that owns it or through
|
|
37
|
+
* through the conversation that owns it or through any conversation above it, and only by a
|
|
37
38
|
* person who may see the conversation (`ConversationAccess`, the rule of `GET :id`, which is also
|
|
38
39
|
* what `POST :id/abort` checks: the owner).
|
|
39
40
|
*/
|
|
@@ -44,8 +45,12 @@ export declare class BackgroundTasks {
|
|
|
44
45
|
private readonly sandbox;
|
|
45
46
|
private readonly eventLog;
|
|
46
47
|
private readonly db;
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
private readonly environments;
|
|
49
|
+
constructor(access: Pick<ConversationAccess, "isAccessible">, store: Pick<BackgroundTaskStore, "listFor" | "get">, stopper: Pick<BackgroundTaskStopper, "stop">, sandbox: Pick<SandboxService, "available" | "ifRunning">, eventLog: Pick<EventLog, "findByIdem">, db: KernelDb, environments: Pick<ConversationEnvironments, "forTool">);
|
|
50
|
+
/**
|
|
51
|
+
* The conversation and every sub-agent conversation below it (grandchildren too: their tasks run
|
|
52
|
+
* in the root's sandbox, agent map spec §6); `conversation.not_found` when not visible.
|
|
53
|
+
*/
|
|
49
54
|
private scope;
|
|
50
55
|
private view;
|
|
51
56
|
private owned;
|
|
@@ -58,8 +63,13 @@ export declare class BackgroundTasks {
|
|
|
58
63
|
*/
|
|
59
64
|
stop(orgId: string, conversationId: string, accountId: string, taskId: string, actorTokenId?: string): Promise<BackgroundTaskView>;
|
|
60
65
|
/**
|
|
61
|
-
*
|
|
62
|
-
*
|
|
66
|
+
* Whether the task's environment may still be used by its conversation's owner (the access
|
|
67
|
+
* re-check every sandbox tool call makes); when it may not, the live read is skipped.
|
|
68
|
+
*/
|
|
69
|
+
private environmentUsable;
|
|
70
|
+
/**
|
|
71
|
+
* The end of the task's output, at most `tail` bytes. Read live when the task's environment
|
|
72
|
+
* instance runs (never resuming a suspended one); a finished task whose sandbox does not run answers
|
|
63
73
|
* with the last lines its finished event kept. Anything else is
|
|
64
74
|
* `background_task.output_unavailable` (409).
|
|
65
75
|
*/
|