@capybara-hq/kernel 0.1.0-rc.4 → 0.1.0-rc.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bootstrap.json +61 -5
- package/dist/admin/admin.controller.d.ts +39 -13
- package/dist/admin/admin.controller.js +33 -17
- 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 +51 -22
- package/dist/agents/agents.service.js +172 -70
- 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/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/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 +6 -2
- package/dist/config/schema.js +46 -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 +69 -12
- package/dist/conversations/conversations.service.js +106 -27
- 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 +5 -0
- package/dist/ctx/create-ctx.js +15 -5
- package/dist/db/kernel-schema.d.ts +362 -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 +82 -2
- package/dist/errors.js +82 -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 +16 -4
- package/dist/evals/step-replay.d.ts +2 -5
- package/dist/evals/step-replay.js +1 -1
- package/dist/evals/trajectory.service.d.ts +8 -3
- package/dist/evals/trajectory.service.js +26 -14
- package/dist/evals/worker.d.ts +5 -5
- package/dist/evals/worker.js +9 -3
- package/dist/extensions/admin-ops.d.ts +36 -10
- package/dist/extensions/admin-ops.js +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/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 +8 -2
- package/dist/extensions/hooks.d.ts +37 -4
- package/dist/extensions/hooks.js +82 -16
- package/dist/extensions/host.d.ts +19 -1
- package/dist/extensions/host.js +30 -7
- 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/files/previewers.d.ts +8 -1
- package/dist/files/previewers.js +35 -6
- package/dist/http/api.module.js +23 -3
- package/dist/http/app.d.ts +11 -2
- package/dist/http/app.js +31 -5
- 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 +21 -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 +11 -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/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 +20 -9
- package/dist/models/purposes.js +17 -8
- 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 +1387 -0
- package/dist/platform/method.d.ts +6 -0
- package/dist/platform/method.js +15 -0
- package/dist/platform/operation.d.ts +92 -0
- package/dist/platform/operation.js +35 -0
- package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
- package/dist/platform/ops/agent-templates.ops.js +92 -0
- package/dist/platform/ops/agents.ops.d.ts +19 -0
- package/dist/platform/ops/agents.ops.js +294 -0
- package/dist/platform/ops/connectors.ops.d.ts +15 -0
- package/dist/platform/ops/connectors.ops.js +126 -0
- package/dist/platform/ops/errors.d.ts +11 -0
- package/dist/platform/ops/errors.js +22 -0
- package/dist/platform/ops/extensions.ops.d.ts +19 -0
- package/dist/platform/ops/extensions.ops.js +116 -0
- package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
- package/dist/platform/ops/marketplaces.ops.js +157 -0
- package/dist/platform/ops/paging.d.ts +14 -0
- package/dist/platform/ops/paging.js +20 -0
- package/dist/platform/ops/platform.ops.d.ts +23 -0
- package/dist/platform/ops/platform.ops.js +158 -0
- package/dist/platform/ops/plugins.ops.d.ts +33 -0
- package/dist/platform/ops/plugins.ops.js +377 -0
- package/dist/platform/ops/requests.ops.d.ts +14 -0
- package/dist/platform/ops/requests.ops.js +153 -0
- package/dist/platform/ops/role.d.ts +4 -0
- package/dist/platform/ops/role.js +10 -0
- package/dist/platform/ops/skills.ops.d.ts +13 -0
- package/dist/platform/ops/skills.ops.js +98 -0
- package/dist/platform/ops/summary.d.ts +10 -0
- package/dist/platform/ops/summary.js +18 -0
- package/dist/platform/platform-ops.module.d.ts +7 -0
- package/dist/platform/platform-ops.module.js +55 -0
- package/dist/platform/platform.module.d.ts +8 -0
- package/dist/platform/platform.module.js +25 -0
- package/dist/platform/redact-orgs.d.ts +7 -0
- package/dist/platform/redact-orgs.js +52 -0
- package/dist/platform/registry.d.ts +30 -0
- package/dist/platform/registry.js +111 -0
- package/dist/roles/worker-role.d.ts +6 -4
- package/dist/roles/worker-role.js +14 -7
- package/dist/roles/worker.module.d.ts +1 -1
- package/dist/roles/worker.module.js +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.js +2 -0
- 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 +30 -8
- package/dist/runtime/model-call.js +69 -19
- 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 +11 -5
- package/dist/runtime/run-worker.js +54 -31
- 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 +43 -29
- 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.js +17 -12
- 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 +187 -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/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
|
@@ -11,13 +11,17 @@ import { isSandboxGoneError } from "@capybara-hq/plugin-sdk";
|
|
|
11
11
|
import { Inject, Injectable } from "@nestjs/common";
|
|
12
12
|
import { ConversationAccess } from "../conversations/access.js";
|
|
13
13
|
import { EventLog } from "../conversations/event-log.js";
|
|
14
|
+
import { conversationTree } from "../conversations/tree.js";
|
|
15
|
+
import { ConversationEnvironments } from "../environments/conversation-environments.js";
|
|
14
16
|
import { ApiError } from "../errors.js";
|
|
15
17
|
import { audit } from "../identity/audit.js";
|
|
16
18
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
19
|
+
import { rootConversationOf } from "../runtime/subagents/child.js";
|
|
17
20
|
import { SandboxService } from "../sandbox/sandbox.service.js";
|
|
18
21
|
import { UUID_RE } from "../ui/registry.js";
|
|
19
22
|
import { finishedEventKey } from "./finish.js";
|
|
20
23
|
import { TASK_ID_RE, TASKS_DIR } from "./launch.js";
|
|
24
|
+
import { actingAs } from "./session.js";
|
|
21
25
|
import { BackgroundTaskStopper } from "./stop.js";
|
|
22
26
|
import { BackgroundTaskStore } from "./store.js";
|
|
23
27
|
/** The most bytes of output one read returns. */
|
|
@@ -29,7 +33,7 @@ const taskNotFound = () => new ApiError("background_task.not_found", "Background
|
|
|
29
33
|
/**
|
|
30
34
|
* The HTTP side of background tasks (spec 2026-11-05-background-bash-design §5): the tasks of a
|
|
31
35
|
* conversation and of its sub-agents, stopping one, reading its output. A task is reachable
|
|
32
|
-
* through the conversation that owns it or through
|
|
36
|
+
* through the conversation that owns it or through any conversation above it, and only by a
|
|
33
37
|
* person who may see the conversation (`ConversationAccess`, the rule of `GET :id`, which is also
|
|
34
38
|
* what `POST :id/abort` checks: the owner).
|
|
35
39
|
*/
|
|
@@ -40,28 +44,27 @@ let BackgroundTasks = class BackgroundTasks {
|
|
|
40
44
|
sandbox;
|
|
41
45
|
eventLog;
|
|
42
46
|
db;
|
|
43
|
-
|
|
47
|
+
environments;
|
|
48
|
+
constructor(access, store, stopper, sandbox, eventLog, db, environments) {
|
|
44
49
|
this.access = access;
|
|
45
50
|
this.store = store;
|
|
46
51
|
this.stopper = stopper;
|
|
47
52
|
this.sandbox = sandbox;
|
|
48
53
|
this.eventLog = eventLog;
|
|
49
54
|
this.db = db;
|
|
55
|
+
this.environments = environments;
|
|
50
56
|
}
|
|
51
|
-
/**
|
|
57
|
+
/**
|
|
58
|
+
* The conversation and every sub-agent conversation below it (grandchildren too: their tasks run
|
|
59
|
+
* in the root's sandbox, agent map spec §6); `conversation.not_found` when not visible.
|
|
60
|
+
*/
|
|
52
61
|
async scope(orgId, conversationId, accountId) {
|
|
53
62
|
if (!UUID_RE.test(conversationId) ||
|
|
54
63
|
!(await this.access.isAccessible(orgId, conversationId, accountId))) {
|
|
55
64
|
throw conversationNotFound();
|
|
56
65
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
.select("id")
|
|
60
|
-
.where("org_id", "=", orgId)
|
|
61
|
-
.where("parent_conversation_id", "=", conversationId)
|
|
62
|
-
.where("kind", "=", "subagent")
|
|
63
|
-
.execute();
|
|
64
|
-
return [conversationId, ...children.map((c) => c.id)];
|
|
66
|
+
// the conversation is the org's (isAccessible), and so is every sub-agent conversation below it
|
|
67
|
+
return (await conversationTree(this.db.db, conversationId)).map((c) => c.id);
|
|
65
68
|
}
|
|
66
69
|
view(task, conversationId) {
|
|
67
70
|
return {
|
|
@@ -111,18 +114,39 @@ let BackgroundTasks = class BackgroundTasks {
|
|
|
111
114
|
return this.view(after, conversationId);
|
|
112
115
|
}
|
|
113
116
|
/**
|
|
114
|
-
*
|
|
115
|
-
*
|
|
117
|
+
* Whether the task's environment may still be used by its conversation's owner (the access
|
|
118
|
+
* re-check every sandbox tool call makes); when it may not, the live read is skipped.
|
|
119
|
+
*/
|
|
120
|
+
async environmentUsable(orgId, taskConversationId) {
|
|
121
|
+
try {
|
|
122
|
+
await this.environments.forTool(orgId, await rootConversationOf(this.db.db, taskConversationId));
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
if (e instanceof ApiError)
|
|
127
|
+
return false;
|
|
128
|
+
throw e;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* The end of the task's output, at most `tail` bytes. Read live when the task's environment
|
|
133
|
+
* instance runs (never resuming a suspended one); a finished task whose sandbox does not run answers
|
|
116
134
|
* with the last lines its finished event kept. Anything else is
|
|
117
135
|
* `background_task.output_unavailable` (409).
|
|
118
136
|
*/
|
|
119
137
|
async output(orgId, conversationId, accountId, taskId, tail) {
|
|
120
138
|
const task = await this.owned(orgId, conversationId, accountId, taskId);
|
|
121
|
-
if (task.sid !== null &&
|
|
139
|
+
if (task.sid !== null &&
|
|
140
|
+
task.sandboxCreatedAt !== null &&
|
|
141
|
+
task.environmentId !== null &&
|
|
142
|
+
this.sandbox.available &&
|
|
143
|
+
(await this.environmentUsable(orgId, task.conversationId))) {
|
|
122
144
|
const createdAt = task.sandboxCreatedAt;
|
|
145
|
+
// the person reading it acts in the task's conversation
|
|
146
|
+
const actor = { accountId, conversationId: task.conversationId };
|
|
123
147
|
try {
|
|
124
|
-
const r = await this.sandbox.ifRunning(task.
|
|
125
|
-
const res = await p.exec(h, {
|
|
148
|
+
const r = await this.sandbox.ifRunning(task.environmentId, { createdAt }, async (p, h, signal) => {
|
|
149
|
+
const res = await actingAs(p, actor).exec(h, {
|
|
126
150
|
command: tailScript(task.id, tail),
|
|
127
151
|
cwd: "/workspace",
|
|
128
152
|
timeoutMs: OUTPUT_READ_TIMEOUT_MS,
|
|
@@ -155,7 +179,8 @@ BackgroundTasks = __decorate([
|
|
|
155
179
|
__param(2, Inject(BackgroundTaskStopper)),
|
|
156
180
|
__param(3, Inject(SandboxService)),
|
|
157
181
|
__param(4, Inject(EventLog)),
|
|
158
|
-
__param(5, Inject(KernelDb))
|
|
182
|
+
__param(5, Inject(KernelDb)),
|
|
183
|
+
__param(6, Inject(ConversationEnvironments))
|
|
159
184
|
], BackgroundTasks);
|
|
160
185
|
export { BackgroundTasks };
|
|
161
186
|
/** Prints `size <bytes>` and `out <base64 of the last `tail` bytes>`. Relative to `/workspace`. */
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { KernelSchemaDb } from "../db/kernel-schema.js";
|
|
2
2
|
/**
|
|
3
|
-
* The wake rules of
|
|
4
|
-
* by
|
|
5
|
-
* a run
|
|
6
|
-
*
|
|
3
|
+
* The wake rules of an idle conversation (spec 2026-11-05-background-bash-design §3, generalized
|
|
4
|
+
* by agent map spec §5.3 to a second event kind): a finished background task or a sub-agent's
|
|
5
|
+
* delivery starts a run. Read by `RunQueue.ensureRun` in its transaction: every path that may start
|
|
6
|
+
* a run (a finish, a delivery, the end of a run, the delayed wake job, a page opening) applies the
|
|
7
|
+
* same rules. `BackgroundWake` is what calls `ensureRun` when a task finishes or a delivery lands.
|
|
7
8
|
*/
|
|
8
9
|
/** No two wakes of one conversation start within this window. */
|
|
9
10
|
export declare const WAKE_WINDOW_MS = 60000;
|
|
@@ -21,8 +22,8 @@ export interface BgWakeJobData {
|
|
|
21
22
|
retry?: number;
|
|
22
23
|
}
|
|
23
24
|
/**
|
|
24
|
-
* What a conversation's unconsumed
|
|
25
|
-
* - `wake`: start a run whose boundary is the
|
|
25
|
+
* What a conversation's unconsumed wake events decide:
|
|
26
|
+
* - `wake`: start a run whose boundary is the event at `seq`, as `triggerAccountId`;
|
|
26
27
|
* - `later`: a wake started less than {@link WAKE_WINDOW_MS} ago; the window ends at `windowEnd`
|
|
27
28
|
* (epoch ms, the database's clock), `delayMs` from now;
|
|
28
29
|
* - null: nothing wakes the conversation.
|
|
@@ -37,21 +38,29 @@ export type WakeDecision = {
|
|
|
37
38
|
delayMs: number;
|
|
38
39
|
} | null;
|
|
39
40
|
/**
|
|
40
|
-
* The wake decision for a
|
|
41
|
-
*
|
|
42
|
-
* wakes it when:
|
|
43
|
-
* - it is after `consumed
|
|
44
|
-
* `
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
41
|
+
* The wake decision for a conversation that is idle and has no unconsumed message (the caller
|
|
42
|
+
* checked these under the conversation's row lock): a chat conversation (`rootId` = its own id) or
|
|
43
|
+
* a sub-agent's (`rootId` = the root of its tree). An event wakes it when:
|
|
44
|
+
* - it is after `consumed` and is either
|
|
45
|
+
* - a `background_task_finished` of a task of this conversation (the join on `conversation_id`
|
|
46
|
+
* reads the task's trigger account) that is not `reported` (a tool call already told the model)
|
|
47
|
+
* and has no `stoppedBy` (`"person"`: that person is looking at the conversation;
|
|
48
|
+
* `"deletion"`: the conversation is being deleted), or
|
|
49
|
+
* - a `subagent_delivery` (its own `triggerAccountId`: the trigger account of the child run that
|
|
50
|
+
* delivered it, agent map spec §7), except the finish of a child that was stopped
|
|
51
|
+
* (`status: "aborted"`: a person's stop of it or of a sub-agent above it, a tree stop, the
|
|
52
|
+
* deletion of the root), for the same reason as a person's task stop; a tree stop thus never
|
|
53
|
+
* wakes the stopped ancestors through their descendants' finishes, which land after them;
|
|
49
54
|
* - the wake setting is on (the org's override, else `deploymentOn`);
|
|
50
|
-
* - the
|
|
51
|
-
*
|
|
52
|
-
*
|
|
55
|
+
* - the root's queue is not paused and the root is not deleted (a paused root holds the wakes of
|
|
56
|
+
* the whole tree, agent map spec §5.3);
|
|
57
|
+
* - the event's trigger account can still send to the root (`canSend`, which the caller binds to
|
|
58
|
+
* the root);
|
|
59
|
+
* - no other wake of this conversation started in the last {@link WAKE_WINDOW_MS} (else `later`).
|
|
60
|
+
* The boundary is the newest event whose trigger account can send.
|
|
53
61
|
*/
|
|
54
62
|
export declare function wakeDecisionIn(t: KernelSchemaDb, conv: {
|
|
55
63
|
id: string;
|
|
56
64
|
orgId: string;
|
|
65
|
+
rootId: string;
|
|
57
66
|
}, consumed: number, deploymentOn: boolean, canSend: (accountId: string) => Promise<boolean>): Promise<WakeDecision>;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { sql } from "kysely";
|
|
2
2
|
import { effectiveWakeOnBackgroundTask, readOrgSettings } from "../orgs/settings.service.js";
|
|
3
3
|
/**
|
|
4
|
-
* The wake rules of
|
|
5
|
-
* by
|
|
6
|
-
* a run
|
|
7
|
-
*
|
|
4
|
+
* The wake rules of an idle conversation (spec 2026-11-05-background-bash-design §3, generalized
|
|
5
|
+
* by agent map spec §5.3 to a second event kind): a finished background task or a sub-agent's
|
|
6
|
+
* delivery starts a run. Read by `RunQueue.ensureRun` in its transaction: every path that may start
|
|
7
|
+
* a run (a finish, a delivery, the end of a run, the delayed wake job, a page opening) applies the
|
|
8
|
+
* same rules. `BackgroundWake` is what calls `ensureRun` when a task finishes or a delivery lands.
|
|
8
9
|
*/
|
|
9
10
|
/** No two wakes of one conversation start within this window. */
|
|
10
11
|
export const WAKE_WINDOW_MS = 60_000;
|
|
@@ -16,30 +17,39 @@ export const BG_WAKE_JOB = "bg-wake";
|
|
|
16
17
|
* BullMQ ignores an add under the id of the job still running.
|
|
17
18
|
*/
|
|
18
19
|
export const bgWakeJobId = (conversationId, windowEnd, retry = 0) => `bg-wake-${conversationId}-${windowEnd}${retry > 0 ? `-r${retry}` : ""}`;
|
|
19
|
-
/** How many unconsumed
|
|
20
|
+
/** How many unconsumed events are tried for a trigger account that can still send. */
|
|
20
21
|
const CANDIDATES = 20;
|
|
22
|
+
/** The event types whose run is a wake run (its boundary, `runs.trigger_seq`, is one of them). */
|
|
23
|
+
const WAKE_EVENT_TYPES = ["background_task_finished", "subagent_delivery"];
|
|
21
24
|
/**
|
|
22
|
-
* The wake decision for a
|
|
23
|
-
*
|
|
24
|
-
* wakes it when:
|
|
25
|
-
* - it is after `consumed
|
|
26
|
-
* `
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
25
|
+
* The wake decision for a conversation that is idle and has no unconsumed message (the caller
|
|
26
|
+
* checked these under the conversation's row lock): a chat conversation (`rootId` = its own id) or
|
|
27
|
+
* a sub-agent's (`rootId` = the root of its tree). An event wakes it when:
|
|
28
|
+
* - it is after `consumed` and is either
|
|
29
|
+
* - a `background_task_finished` of a task of this conversation (the join on `conversation_id`
|
|
30
|
+
* reads the task's trigger account) that is not `reported` (a tool call already told the model)
|
|
31
|
+
* and has no `stoppedBy` (`"person"`: that person is looking at the conversation;
|
|
32
|
+
* `"deletion"`: the conversation is being deleted), or
|
|
33
|
+
* - a `subagent_delivery` (its own `triggerAccountId`: the trigger account of the child run that
|
|
34
|
+
* delivered it, agent map spec §7), except the finish of a child that was stopped
|
|
35
|
+
* (`status: "aborted"`: a person's stop of it or of a sub-agent above it, a tree stop, the
|
|
36
|
+
* deletion of the root), for the same reason as a person's task stop; a tree stop thus never
|
|
37
|
+
* wakes the stopped ancestors through their descendants' finishes, which land after them;
|
|
31
38
|
* - the wake setting is on (the org's override, else `deploymentOn`);
|
|
32
|
-
* - the
|
|
33
|
-
*
|
|
34
|
-
*
|
|
39
|
+
* - the root's queue is not paused and the root is not deleted (a paused root holds the wakes of
|
|
40
|
+
* the whole tree, agent map spec §5.3);
|
|
41
|
+
* - the event's trigger account can still send to the root (`canSend`, which the caller binds to
|
|
42
|
+
* the root);
|
|
43
|
+
* - no other wake of this conversation started in the last {@link WAKE_WINDOW_MS} (else `later`).
|
|
44
|
+
* The boundary is the newest event whose trigger account can send.
|
|
35
45
|
*/
|
|
36
46
|
export async function wakeDecisionIn(t, conv, consumed, deploymentOn, canSend) {
|
|
37
|
-
const
|
|
47
|
+
const finishes = await t
|
|
38
48
|
.selectFrom("conversation_events as e")
|
|
39
49
|
.innerJoin("background_tasks as b", (j) => j
|
|
40
50
|
.on(sql `b.id = e.payload ->> 'taskId'`)
|
|
41
51
|
.onRef("b.conversation_id", "=", "e.conversation_id"))
|
|
42
|
-
.select(["e.seq", "b.trigger_account_id"])
|
|
52
|
+
.select(["e.seq", "b.trigger_account_id as account"])
|
|
43
53
|
.where("e.conversation_id", "=", conv.id)
|
|
44
54
|
.where("e.type", "=", "background_task_finished")
|
|
45
55
|
.where("e.seq", ">", String(consumed))
|
|
@@ -48,15 +58,35 @@ export async function wakeDecisionIn(t, conv, consumed, deploymentOn, canSend) {
|
|
|
48
58
|
.orderBy("e.seq", "desc")
|
|
49
59
|
.limit(CANDIDATES)
|
|
50
60
|
.execute();
|
|
61
|
+
const deliveries = await t
|
|
62
|
+
.selectFrom("conversation_events as e")
|
|
63
|
+
.select(["e.seq", sql `e.payload ->> 'triggerAccountId'`.as("account")])
|
|
64
|
+
.where("e.conversation_id", "=", conv.id)
|
|
65
|
+
.where("e.type", "=", "subagent_delivery")
|
|
66
|
+
.where("e.seq", ">", String(consumed))
|
|
67
|
+
.where(sql `e.payload ->> 'status' IS DISTINCT FROM 'aborted'`)
|
|
68
|
+
.orderBy("e.seq", "desc")
|
|
69
|
+
.limit(CANDIDATES)
|
|
70
|
+
.execute();
|
|
71
|
+
const candidates = [...finishes, ...deliveries]
|
|
72
|
+
.sort((a, b) => Number(b.seq) - Number(a.seq))
|
|
73
|
+
.slice(0, CANDIDATES);
|
|
51
74
|
if (candidates.length === 0)
|
|
52
75
|
return null;
|
|
53
76
|
const org = (await readOrgSettings(t, conv.orgId)).wakeOnBackgroundTask;
|
|
54
77
|
if (!effectiveWakeOnBackgroundTask(deploymentOn, org))
|
|
55
78
|
return null;
|
|
79
|
+
const root = await t
|
|
80
|
+
.selectFrom("conversations")
|
|
81
|
+
.select(["queue_paused", "deleted_at"])
|
|
82
|
+
.where("id", "=", conv.rootId)
|
|
83
|
+
.executeTakeFirst();
|
|
84
|
+
if (!root || root.queue_paused || root.deleted_at !== null)
|
|
85
|
+
return null;
|
|
56
86
|
let boundary;
|
|
57
87
|
for (const c of candidates) {
|
|
58
|
-
if (await canSend(c.
|
|
59
|
-
boundary = { seq: Number(c.seq), triggerAccountId: c.
|
|
88
|
+
if (await canSend(c.account)) {
|
|
89
|
+
boundary = { seq: Number(c.seq), triggerAccountId: c.account };
|
|
60
90
|
break;
|
|
61
91
|
}
|
|
62
92
|
}
|
|
@@ -71,7 +101,7 @@ export async function wakeDecisionIn(t, conv, consumed, deploymentOn, canSend) {
|
|
|
71
101
|
sql `floor(extract(epoch from now()) * 1000)::bigint`.as("now"),
|
|
72
102
|
])
|
|
73
103
|
.where("r.conversation_id", "=", conv.id)
|
|
74
|
-
.where("w.type", "
|
|
104
|
+
.where("w.type", "in", WAKE_EVENT_TYPES)
|
|
75
105
|
.executeTakeFirst();
|
|
76
106
|
if (last?.started != null) {
|
|
77
107
|
const windowEnd = Number(last.started) + WAKE_WINDOW_MS;
|
|
@@ -4,24 +4,26 @@ import { KernelEvents } from "../infra/events/kernel-events.js";
|
|
|
4
4
|
import { RunQueue } from "../runtime/run-queue.js";
|
|
5
5
|
/**
|
|
6
6
|
* Wakes an idle conversation when one of its background tasks finished (spec
|
|
7
|
-
* 2026-11-05-background-bash-design §3)
|
|
8
|
-
* finish (`background_task.finished
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
7
|
+
* 2026-11-05-background-bash-design §3) or a sub-agent delivered to it (agent map spec §5.3).
|
|
8
|
+
* {@link BackgroundTaskFinisher} announces the committed finish (`background_task.finished`) and
|
|
9
|
+
* `SubagentDeliveries` the committed delivery (`subagent.delivered`), both in-process domain
|
|
10
|
+
* events emitted after the commit; {@link onFinished} asks the run queue for a run. The wake rules
|
|
11
|
+
* themselves (own task, not reported, the wake setting, the root's queue not paused, the trigger
|
|
12
|
+
* account can still send to the root, the 60 s window and its delayed `bg-wake` job) are applied
|
|
13
|
+
* by `RunQueue.ensureRun` in its transaction (`wakeDecisionIn`, ./wake-rules.ts), so a run's end,
|
|
14
|
+
* the delayed job and a page opening apply the same rules; a lost event is re-derived by the next
|
|
15
|
+
* of them. Provided by `RuntimeModule`.
|
|
14
16
|
*/
|
|
15
17
|
export declare class BackgroundWake implements OnApplicationShutdown {
|
|
16
18
|
private readonly runs;
|
|
17
19
|
private readonly log;
|
|
18
|
-
/** Drops the
|
|
20
|
+
/** Drops the subscriptions (the events may outlive this instance). */
|
|
19
21
|
private readonly unsubscribe;
|
|
20
22
|
constructor(runs: Pick<RunQueue, "ensureRun">, events: KernelEvents, log: Pick<Logger, "warn">);
|
|
21
23
|
/**
|
|
22
|
-
* A task of `conversationId` finished (after the commit): starts
|
|
23
|
-
* allow it, or schedules one at the end of the wake window. A run in
|
|
24
|
-
* at its next step instead, or its end starts the wake. Never throws.
|
|
24
|
+
* A task of `conversationId` finished, or a sub-agent delivered to it (after the commit): starts
|
|
25
|
+
* a wake run when the rules allow it, or schedules one at the end of the wake window. A run in
|
|
26
|
+
* progress absorbs the event at its next step instead, or its end starts the wake. Never throws.
|
|
25
27
|
*/
|
|
26
28
|
onFinished(conversationId: string): Promise<void>;
|
|
27
29
|
onApplicationShutdown(): void;
|
package/dist/background/wake.js
CHANGED
|
@@ -13,39 +13,45 @@ import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
|
13
13
|
import { RunQueue } from "../runtime/run-queue.js";
|
|
14
14
|
/**
|
|
15
15
|
* Wakes an idle conversation when one of its background tasks finished (spec
|
|
16
|
-
* 2026-11-05-background-bash-design §3)
|
|
17
|
-
* finish (`background_task.finished
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
16
|
+
* 2026-11-05-background-bash-design §3) or a sub-agent delivered to it (agent map spec §5.3).
|
|
17
|
+
* {@link BackgroundTaskFinisher} announces the committed finish (`background_task.finished`) and
|
|
18
|
+
* `SubagentDeliveries` the committed delivery (`subagent.delivered`), both in-process domain
|
|
19
|
+
* events emitted after the commit; {@link onFinished} asks the run queue for a run. The wake rules
|
|
20
|
+
* themselves (own task, not reported, the wake setting, the root's queue not paused, the trigger
|
|
21
|
+
* account can still send to the root, the 60 s window and its delayed `bg-wake` job) are applied
|
|
22
|
+
* by `RunQueue.ensureRun` in its transaction (`wakeDecisionIn`, ./wake-rules.ts), so a run's end,
|
|
23
|
+
* the delayed job and a page opening apply the same rules; a lost event is re-derived by the next
|
|
24
|
+
* of them. Provided by `RuntimeModule`.
|
|
23
25
|
*/
|
|
24
26
|
let BackgroundWake = class BackgroundWake {
|
|
25
27
|
runs;
|
|
26
28
|
log;
|
|
27
|
-
/** Drops the
|
|
29
|
+
/** Drops the subscriptions (the events may outlive this instance). */
|
|
28
30
|
unsubscribe;
|
|
29
31
|
constructor(runs, events, log) {
|
|
30
32
|
this.runs = runs;
|
|
31
33
|
this.log = log;
|
|
32
|
-
this.unsubscribe =
|
|
34
|
+
this.unsubscribe = [
|
|
35
|
+
events.on("background_task.finished", ({ conversationId }) => this.onFinished(conversationId)),
|
|
36
|
+
events.on("subagent.delivered", ({ conversationId }) => this.onFinished(conversationId)),
|
|
37
|
+
];
|
|
33
38
|
}
|
|
34
39
|
/**
|
|
35
|
-
* A task of `conversationId` finished (after the commit): starts
|
|
36
|
-
* allow it, or schedules one at the end of the wake window. A run in
|
|
37
|
-
* at its next step instead, or its end starts the wake. Never throws.
|
|
40
|
+
* A task of `conversationId` finished, or a sub-agent delivered to it (after the commit): starts
|
|
41
|
+
* a wake run when the rules allow it, or schedules one at the end of the wake window. A run in
|
|
42
|
+
* progress absorbs the event at its next step instead, or its end starts the wake. Never throws.
|
|
38
43
|
*/
|
|
39
44
|
async onFinished(conversationId) {
|
|
40
45
|
try {
|
|
41
46
|
await this.runs.ensureRun(conversationId);
|
|
42
47
|
}
|
|
43
48
|
catch (err) {
|
|
44
|
-
this.log.warn("background
|
|
49
|
+
this.log.warn("background wake failed", { conversationId, err });
|
|
45
50
|
}
|
|
46
51
|
}
|
|
47
52
|
onApplicationShutdown() {
|
|
48
|
-
this.unsubscribe
|
|
53
|
+
for (const off of this.unsubscribe)
|
|
54
|
+
off();
|
|
49
55
|
}
|
|
50
56
|
};
|
|
51
57
|
BackgroundWake = __decorate([
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { FastifyReply } from "fastify";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import type { AdminExtensionView } from "../extensions/permission-view.js";
|
|
4
3
|
import { type Principal } from "../identity/principal.js";
|
|
5
4
|
import { type CatalogItemDetail, type CatalogItemView, CatalogService, type PermissionsMismatch } from "./catalog.service.js";
|
|
5
|
+
import { CatalogScopeService, type ScopePreview } from "./catalog-scope.service.js";
|
|
6
6
|
import { OrgCatalogService } from "./org-catalog.service.js";
|
|
7
7
|
import { type PluginConfirmResult, PluginImport, type PluginReview } from "./plugin-import.js";
|
|
8
|
+
import { PlatformPluginUpdater, type PlatformUpdatePreview, type PlatformUpdateResult } from "./plugin-upgrade.js";
|
|
8
9
|
declare const NpmBody: z.ZodObject<{
|
|
9
10
|
package: z.ZodString;
|
|
10
11
|
version: z.ZodOptional<z.ZodString>;
|
|
@@ -14,21 +15,42 @@ declare const GitBody: z.ZodObject<{
|
|
|
14
15
|
ref: z.ZodOptional<z.ZodString>;
|
|
15
16
|
path: z.ZodOptional<z.ZodString>;
|
|
16
17
|
}, z.core.$strict>;
|
|
17
|
-
declare const PolicyBody: z.ZodObject<{
|
|
18
|
-
policy: z.ZodEnum<{
|
|
19
|
-
allow: "allow";
|
|
20
|
-
disabled: "disabled";
|
|
21
|
-
needs_approval: "needs_approval";
|
|
22
|
-
}>;
|
|
23
|
-
}, z.core.$strip>;
|
|
24
|
-
declare const InstallBody: z.ZodObject<{
|
|
25
|
-
version: z.ZodString;
|
|
26
|
-
}, z.core.$strip>;
|
|
27
18
|
declare const ConfirmBody: z.ZodObject<{
|
|
28
19
|
reviewHash: z.ZodString;
|
|
29
|
-
|
|
20
|
+
scope: z.ZodOptional<z.ZodEnum<{
|
|
21
|
+
all: "all";
|
|
22
|
+
named: "named";
|
|
23
|
+
optional: "optional";
|
|
24
|
+
}>>;
|
|
25
|
+
orgs: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
30
26
|
pinnedSuggestions: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
31
|
-
}, z.core.$
|
|
27
|
+
}, z.core.$strict>;
|
|
28
|
+
/** `{ scope, orgs? }` (a scope change) or `{ disabled: true }` (a disable), not both. */
|
|
29
|
+
declare const ScopePreviewBody: z.ZodObject<{
|
|
30
|
+
scope: z.ZodOptional<z.ZodEnum<{
|
|
31
|
+
all: "all";
|
|
32
|
+
named: "named";
|
|
33
|
+
optional: "optional";
|
|
34
|
+
}>>;
|
|
35
|
+
orgs: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
36
|
+
disabled: z.ZodOptional<z.ZodLiteral<true>>;
|
|
37
|
+
}, z.core.$strict>;
|
|
38
|
+
declare const ScopeBody: z.ZodObject<{
|
|
39
|
+
scope: z.ZodEnum<{
|
|
40
|
+
all: "all";
|
|
41
|
+
named: "named";
|
|
42
|
+
optional: "optional";
|
|
43
|
+
}>;
|
|
44
|
+
orgs: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
45
|
+
scopeHash: z.ZodString;
|
|
46
|
+
}, z.core.$strict>;
|
|
47
|
+
declare const DisabledBody: z.ZodObject<{
|
|
48
|
+
disabled: z.ZodBoolean;
|
|
49
|
+
scopeHash: z.ZodOptional<z.ZodString>;
|
|
50
|
+
}, z.core.$strict>;
|
|
51
|
+
declare const ShownBody: z.ZodObject<{
|
|
52
|
+
shownToOthers: z.ZodBoolean;
|
|
53
|
+
}, z.core.$strict>;
|
|
32
54
|
declare const ListQuery: z.ZodObject<{
|
|
33
55
|
includeDeleted: z.ZodOptional<z.ZodEnum<{
|
|
34
56
|
false: "false";
|
|
@@ -36,18 +58,38 @@ declare const ListQuery: z.ZodObject<{
|
|
|
36
58
|
}>>;
|
|
37
59
|
limit: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
38
60
|
offset: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
61
|
+
pending: z.ZodOptional<z.ZodEnum<{
|
|
62
|
+
false: "false";
|
|
63
|
+
true: "true";
|
|
64
|
+
}>>;
|
|
39
65
|
}, z.core.$strip>;
|
|
66
|
+
declare const ConfirmPermissionsBody: z.ZodObject<{
|
|
67
|
+
permissionsHash: z.ZodString;
|
|
68
|
+
}, z.core.$strict>;
|
|
69
|
+
/** The reason shown to the owner org in its `upload_rejected` notice (optional). */
|
|
70
|
+
declare const RejectBody: z.ZodObject<{
|
|
71
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
72
|
+
}, z.core.$strict>;
|
|
73
|
+
declare const UpdatePreviewBody: z.ZodObject<{
|
|
74
|
+
version: z.ZodString;
|
|
75
|
+
}, z.core.$strict>;
|
|
76
|
+
declare const UpdateBody: z.ZodObject<{
|
|
77
|
+
version: z.ZodString;
|
|
78
|
+
diffHash: z.ZodString;
|
|
79
|
+
}, z.core.$strict>;
|
|
40
80
|
/**
|
|
41
|
-
* The
|
|
42
|
-
* prepare, then confirm), the item list and detail,
|
|
43
|
-
*
|
|
81
|
+
* The platform catalog (`/api/v1/admin/catalog/*`, super admins): plugin import (upload / npm
|
|
82
|
+
* prepare, then confirm, which installs the plugin's extension), the item list and detail, scope and
|
|
83
|
+
* disable (previewed, then confirmed with `scopeHash`), delete. Writes re-check the super admin inside the service's lock and are
|
|
44
84
|
* audited.
|
|
45
85
|
*/
|
|
46
86
|
export declare class AdminCatalogController {
|
|
47
87
|
private readonly catalog;
|
|
48
88
|
private readonly pluginImport;
|
|
49
89
|
private readonly orgCatalog;
|
|
50
|
-
|
|
90
|
+
private readonly scope;
|
|
91
|
+
private readonly updater;
|
|
92
|
+
constructor(catalog: CatalogService, pluginImport: PluginImport, orgCatalog: OrgCatalogService, scope: CatalogScopeService, updater: PlatformPluginUpdater);
|
|
51
93
|
/**
|
|
52
94
|
* Prepares the import of an uploaded plugin (an npm-pack tgz as the raw body,
|
|
53
95
|
* `application/octet-stream`, at most `packages.maxBytes`): reads and checks the whole plugin
|
|
@@ -97,11 +139,13 @@ export declare class AdminCatalogController {
|
|
|
97
139
|
permissionsMismatch?: PermissionsMismatch;
|
|
98
140
|
}>;
|
|
99
141
|
/**
|
|
100
|
-
* Confirms a staged import: approves the plugin's extension when this import installs
|
|
101
|
-
* its snapshot)
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
142
|
+
* Confirms a staged import: approves the plugin's extension when this import installs or upgrades
|
|
143
|
+
* it (writes its snapshot), creates the item (with `scope`, default `optional`; `orgs` only with
|
|
144
|
+
* `named`, each an existing org, else 400 `validation_failed`) or adds the version, installs and
|
|
145
|
+
* enables the plugin's own extension after the commit and enqueues the item's scope sync; returns
|
|
146
|
+
* `{ item, deploy }`, where `deploy` says enabled / failed (+ code), null without an extension to
|
|
147
|
+
* deploy; a failed deploy does not make the committed import fail (retry from the extension admin
|
|
148
|
+
* by sha256). An unknown field (the removed `deployExtension`) -> 400 `validation_failed`. A foreseeable failure (a downgrade to a version with
|
|
105
149
|
* unrun migrations) is a 409 `extension.downgrade_unsupported` before anything is written.
|
|
106
150
|
* Staging missing or expired -> 404 `plugin.staging_not_found`; `reviewHash` differs or the
|
|
107
151
|
* extension on the deployment changed -> 409 `plugin.review_stale`. `pinnedSuggestions` (skill
|
|
@@ -129,15 +173,70 @@ export declare class AdminCatalogController {
|
|
|
129
173
|
* `sendCatalogIcon`). No icon -> 404 `catalog.icon_not_found`.
|
|
130
174
|
*/
|
|
131
175
|
icon(id: string, reply: FastifyReply): Promise<void>;
|
|
132
|
-
/** 改策略(allow / needs_approval / disabled)。 */
|
|
133
|
-
setPolicy(principal: Principal, id: string, body: z.infer<typeof PolicyBody>): Promise<CatalogItemView>;
|
|
134
|
-
/** 删除条目(软删除,已安装的组件不受影响)。 */
|
|
135
|
-
remove(principal: Principal, id: string): Promise<void>;
|
|
136
176
|
/**
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
* `
|
|
177
|
+
* What a scope change (`{ scope, orgs? }`, `orgs` only with `named`) or a disable
|
|
178
|
+
* (`{ disabled: true }`) would take away: `{ affected: [{ orgId, orgName, agents,
|
|
179
|
+
* connectorsKept }], needsConfig, scopeHash }` (spec §5 rule 8; nothing written; the connectors
|
|
180
|
+
* stay as the orgs' own). A builtin item -> 409 `plugin.builtin`; unknown
|
|
181
|
+
* orgs -> 400 `validation_failed`.
|
|
182
|
+
*/
|
|
183
|
+
previewScope(id: string, body: z.infer<typeof ScopePreviewBody>): Promise<ScopePreview>;
|
|
184
|
+
/**
|
|
185
|
+
* Changes the scope, confirmed with the preview's `scopeHash` (recomputed under the item row lock;
|
|
186
|
+
* a difference -> 409 `plugin.scope_stale`); bumps the scope version, audits
|
|
187
|
+
* `catalog.scope_changed` and enqueues the scope sync. Builtin -> 409 `plugin.builtin`.
|
|
188
|
+
*/
|
|
189
|
+
setScope(principal: Principal, id: string, body: z.infer<typeof ScopeBody>): Promise<CatalogItemView>;
|
|
190
|
+
/**
|
|
191
|
+
* Disables the plugin on the whole deployment (`scopeHash` of the `{ disabled: true }` preview
|
|
192
|
+
* required; the scope sync then uninstalls it everywhere, its scope and the org switches are kept)
|
|
193
|
+
* or enables it again (no hash; the sync reinstalls where it is wanted). Builtin -> 409
|
|
194
|
+
* `plugin.builtin`; a stale hash -> 409 `plugin.scope_stale`.
|
|
195
|
+
*/
|
|
196
|
+
setDisabled(principal: Principal, id: string, body: z.infer<typeof DisabledBody>): Promise<CatalogItemView>;
|
|
197
|
+
/**
|
|
198
|
+
* Confirms the item's extension permissions (the admin's 待确认; body `{ permissionsHash }` from
|
|
199
|
+
* the item view): approves the current permission set (snapshot source `web`) and installs and
|
|
200
|
+
* enables an extension that was never deployed. A changed set -> 409 `extension.approval_stale`;
|
|
201
|
+
* nothing to confirm -> 409 `extension.not_pending`. Returns the item. An org's upload
|
|
202
|
+
* (`owner.kind` org, ruling P3-10): the digest of its pending version's package; a first version
|
|
203
|
+
* is installed, approved, enabled and synced, a new version applied by the platform update
|
|
204
|
+
* (the item removed meanwhile -> 409 `catalog.item_removed`, P3-21).
|
|
140
205
|
*/
|
|
141
|
-
|
|
206
|
+
confirmPermissions(principal: Principal, id: string, body: z.infer<typeof ConfirmPermissionsBody>): Promise<CatalogItemView>;
|
|
207
|
+
/**
|
|
208
|
+
* Rejects an org upload's pending version (ruling P3-10; body `{ reason? }`, told to the owner
|
|
209
|
+
* org in `upload_rejected`): a first version is removed (its name free again), a new version's
|
|
210
|
+
* pending state cleared. Nothing pending, or a platform item (pre-flight F11) -> 409
|
|
211
|
+
* `extension.not_pending`. 204.
|
|
212
|
+
*/
|
|
213
|
+
reject(principal: Principal, id: string, body: z.infer<typeof RejectBody>): Promise<void>;
|
|
214
|
+
/**
|
|
215
|
+
* Whether orgs outside a `named` item's list see it as requestable (spec §5.1 rule 1). Hiding it
|
|
216
|
+
* keeps pending requests as they are; new requests from unlisted orgs are then 404. Never makes
|
|
217
|
+
* anything usable, so no preview and no scope sync. Audits `catalog.shown_changed`.
|
|
218
|
+
*/
|
|
219
|
+
setShown(principal: Principal, id: string, body: z.infer<typeof ShownBody>): Promise<CatalogItemView>;
|
|
220
|
+
/**
|
|
221
|
+
* What updating the platform plugin to `version` would do (spec §7.1, `PlatformPluginUpdater`):
|
|
222
|
+
* `{ itemId, name, from, to, components: [{ kind, id, name, change: added | removed | upgrade |
|
|
223
|
+
* downgrade | same, from, to, updatedOnOwn, ownScope, pinnedOrgs, kept? }], extension,
|
|
224
|
+
* connectorOrgs: [{ orgId, connectors, needsConfig }], diffHash }`. Nothing written. The same
|
|
225
|
+
* version, a target the deployment's extension or a dependent plugin cannot take -> 409
|
|
226
|
+
* `plugin.upgrade_target_invalid`; an added skill named like one in use where the plugin is on
|
|
227
|
+
* -> 409 `plugin.skill_conflict`; disabled -> 403 `catalog.item_disabled`.
|
|
228
|
+
*/
|
|
229
|
+
previewUpdate(id: string, body: z.infer<typeof UpdatePreviewBody>): Promise<PlatformUpdatePreview>;
|
|
230
|
+
/**
|
|
231
|
+
* Updates the platform plugin, confirmed with the preview's `diffHash` (recomputed under the item
|
|
232
|
+
* lock; a difference -> 409 `plugin.upgrade_stale`; another update running -> 409
|
|
233
|
+
* `plugin.install_in_progress`). A failure undoes everything -> 502 `plugin.upgrade_failed`.
|
|
234
|
+
* Audits `plugin.platform_updated`. A version an org upload waits with (or an item whose first
|
|
235
|
+
* version waits) -> 409 `catalog.item_pending`: confirm it in 待确认 (pre-flight F8); the
|
|
236
|
+
* preview answers the same.
|
|
237
|
+
*/
|
|
238
|
+
update(principal: Principal, id: string, body: z.infer<typeof UpdateBody>): Promise<PlatformUpdateResult>;
|
|
239
|
+
/** 删除条目(软删除,已安装的组件不受影响)。 */
|
|
240
|
+
remove(principal: Principal, id: string): Promise<void>;
|
|
142
241
|
}
|
|
143
242
|
export {};
|