@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
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { EventLog } from "../../conversations/event-log.js";
|
|
2
|
+
import { KernelConfigService } from "../../infra/config/kernel-config.service.js";
|
|
3
|
+
import { KernelDb } from "../../infra/database/kernel-db.js";
|
|
4
|
+
import { TransactionHost } from "../../infra/database/transaction-host.js";
|
|
5
|
+
import type { KernelLogger } from "../../log.js";
|
|
6
|
+
import type { ToolStepContext } from "../../tools/pipeline.js";
|
|
7
|
+
import { RunJobs } from "../run-jobs.js";
|
|
8
|
+
import { SubagentDeliveries } from "./deliveries.js";
|
|
9
|
+
/** The message tools' test seams (`SUBAGENT_MESSAGES_HOOKS`; the kernel never provides them). */
|
|
10
|
+
export interface SubagentMessagesHooks {
|
|
11
|
+
/**
|
|
12
|
+
* Called by {@link SubagentMessages.toChild} after it read whether the sub-agent has an active
|
|
13
|
+
* run and before it acts on that: a test ends the run here to race the send.
|
|
14
|
+
*/
|
|
15
|
+
afterStatusRead?(childConversationId: string): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/** Optional provider: {@link SubagentMessagesHooks} (tests). */
|
|
18
|
+
export declare const SUBAGENT_MESSAGES_HOOKS: unique symbol;
|
|
19
|
+
/**
|
|
20
|
+
* What a message tool call did. `logged`: its `tool_result` (and `tool.called` audit) is already
|
|
21
|
+
* in the log, written with the dispatch that started an idle sub-agent; otherwise the pipeline
|
|
22
|
+
* writes the result.
|
|
23
|
+
*/
|
|
24
|
+
export interface MessageOutcome {
|
|
25
|
+
content: string;
|
|
26
|
+
isError: boolean;
|
|
27
|
+
logged?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/** Idempotency key of a report or note a sub-agent's call delivered to its parent. */
|
|
30
|
+
export declare const toParentIdemKey: (runId: string, callId: string) => string;
|
|
31
|
+
/**
|
|
32
|
+
* Messages between the agents of one tree (agent map spec §4.2, §4.3, §5): `SendMessage` and
|
|
33
|
+
* `SubagentHandback`, called by the tool pipeline.
|
|
34
|
+
*
|
|
35
|
+
* A message to a sub-agent ({@link toChild}) is a `user_message` in its log with
|
|
36
|
+
* `dispatch.kind: "message"`, idempotent by the sending call. While the sub-agent has an active run
|
|
37
|
+
* it is appended under the sub-agent's row lock, which every terminal path of its runs takes too:
|
|
38
|
+
* the run absorbs it at its next model call, or, when the run ends without another call, the end's
|
|
39
|
+
* `ensureRun` starts the next run from it (`RunQueue.childWakeIn`). An idle sub-agent is started
|
|
40
|
+
* again through the dispatch transaction (a follow-up: it counts as a dispatch and takes a
|
|
41
|
+
* concurrency slot, refused at the limits, agent map spec §6), with the gates of the sub-agent's
|
|
42
|
+
* type checked again and its frozen tools narrowed to what the sender's current version allows.
|
|
43
|
+
* A message never waits on a lock a running sub-agent holds while it waits for the sender's run
|
|
44
|
+
* row (the dispatch transaction locks the sub-agent's row only when it has no active run).
|
|
45
|
+
*
|
|
46
|
+
* A sub-agent's note or report to its parent ({@link toParent}) is one `subagent_delivery` in the
|
|
47
|
+
* parent's log (`SubagentDeliveries.deliverIn`), idempotent by the call.
|
|
48
|
+
*/
|
|
49
|
+
export declare class SubagentMessages {
|
|
50
|
+
private readonly kdb;
|
|
51
|
+
private readonly eventLog;
|
|
52
|
+
private readonly config;
|
|
53
|
+
private readonly deliveries;
|
|
54
|
+
readonly txHost: TransactionHost;
|
|
55
|
+
private readonly hooks?;
|
|
56
|
+
/** What the dispatch transaction of a restart needs (`commit`). */
|
|
57
|
+
private readonly deps;
|
|
58
|
+
constructor(kdb: KernelDb, eventLog: EventLog, config: KernelConfigService, jobs: RunJobs, log: KernelLogger, deliveries: SubagentDeliveries, txHost: TransactionHost, hooks?: SubagentMessagesHooks | undefined);
|
|
59
|
+
/** The restart's dispatch writes in a transaction of their own (see `commitDispatchIn`). */
|
|
60
|
+
private commitDispatch;
|
|
61
|
+
/** The context's handle (the transaction of a `@Transactional` method, else the pool). */
|
|
62
|
+
private get db();
|
|
63
|
+
/**
|
|
64
|
+
* `SendMessage` (agent map spec §4.2, §5.1): `to` is one of the caller's own sub-agents by id,
|
|
65
|
+
* or `"parent"` in a sub-agent. Anything else (a sibling, a grandchild, another conversation's
|
|
66
|
+
* sub-agent, an unknown id, `"parent"` at the root) is refused with the valid targets.
|
|
67
|
+
*/
|
|
68
|
+
toChild(ctx: ToolStepContext, callId: string, childId: string, text: string,
|
|
69
|
+
/** The pipeline's record of why the call was allowed (the `tool.called` audit of a restart). */
|
|
70
|
+
opts?: {
|
|
71
|
+
authorization?: Record<string, unknown>;
|
|
72
|
+
}): Promise<MessageOutcome>;
|
|
73
|
+
/**
|
|
74
|
+
* A sub-agent's note (`SendMessage` to `"parent"`) or report (`SubagentHandback`) to its parent
|
|
75
|
+
* (agent map spec §4.3, §5.2): one `subagent_delivery` of this run in the parent's log,
|
|
76
|
+
* idempotent by the call; an active parent run absorbs it, an idle parent is woken.
|
|
77
|
+
*/
|
|
78
|
+
toParent(ctx: ToolStepContext, kind: "note" | "report", text: string, callId: string): Promise<MessageOutcome>;
|
|
79
|
+
/**
|
|
80
|
+
* Appends the message to a sub-agent whose run is active, under its row lock (a run's terminal
|
|
81
|
+
* write takes the same lock, so the run is still active when the message lands). Null when no
|
|
82
|
+
* run is active any more: the caller starts one.
|
|
83
|
+
*/
|
|
84
|
+
private appendToRunning;
|
|
85
|
+
/**
|
|
86
|
+
* Starts an idle sub-agent again with the message (the dispatch transaction, `commit`): its row
|
|
87
|
+
* is locked only after no active run was found, and again checked under the lock. `"active"`
|
|
88
|
+
* when a run is active after all (the caller appends to it instead).
|
|
89
|
+
*/
|
|
90
|
+
private restart;
|
|
91
|
+
/** The active run of a conversation, if any. */
|
|
92
|
+
private activeRunOf;
|
|
93
|
+
/** The unknown-target refusal, listing the caller's own sub-agents (newest first). */
|
|
94
|
+
private unknownTarget;
|
|
95
|
+
}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
10
|
+
import { Inject, Injectable, Optional } from "@nestjs/common";
|
|
11
|
+
import { normalizeStoredDefinition } from "../../agents/definition.js";
|
|
12
|
+
import { EventLog } from "../../conversations/event-log.js";
|
|
13
|
+
import { KernelConfigService } from "../../infra/config/kernel-config.service.js";
|
|
14
|
+
import { KernelDb } from "../../infra/database/kernel-db.js";
|
|
15
|
+
import { TransactionHost } from "../../infra/database/transaction-host.js";
|
|
16
|
+
import { Transactional } from "../../infra/database/transactional.decorator.js";
|
|
17
|
+
import { KERNEL_LOGGER } from "../../infra/tokens.js";
|
|
18
|
+
import { SEND_MESSAGE } from "../../tools/builtin-names.js";
|
|
19
|
+
import { AGENT_REFUSALS } from "../../tools/builtins/agent.js";
|
|
20
|
+
import { HANDBACK_FORK_TEXT, HANDBACK_NOT_A_CHILD_TEXT, HANDBACK_RESULT_TEXT, } from "../../tools/builtins/handback.js";
|
|
21
|
+
import { PARENT_TARGET, SEND_MESSAGE_REFUSALS, SEND_TARGETS_LISTED, SENT_TO_PARENT_TEXT, sentToIdleText, sentToRunningText, } from "../../tools/builtins/send-message.js";
|
|
22
|
+
import { ACTIVE_RUN_STATUSES, RunJobs } from "../run-jobs.js";
|
|
23
|
+
import { deliveryRowOfChildRun, dispatchOfCall } from "./child.js";
|
|
24
|
+
import { narrowFollowUp } from "./definition.js";
|
|
25
|
+
import { SubagentDeliveries } from "./deliveries.js";
|
|
26
|
+
import { commit, commitDispatchIn, orgAgentGates, sentMessageIdemKey, taskMessage, } from "./dispatch.js";
|
|
27
|
+
import { findType, resolveRoster } from "./roster.js";
|
|
28
|
+
/** Optional provider: {@link SubagentMessagesHooks} (tests). */
|
|
29
|
+
export const SUBAGENT_MESSAGES_HOOKS = Symbol("SUBAGENT_MESSAGES_HOOKS");
|
|
30
|
+
/** How often a send re-reads a sub-agent whose run started or ended while it acted. */
|
|
31
|
+
const SEND_ATTEMPTS = 3;
|
|
32
|
+
/** The sub-agent's state changed on every attempt (a run starting and ending each time). */
|
|
33
|
+
const SEND_RETRY_TEXT = "The sub-agent changed state while the message was being sent; call SendMessage again.";
|
|
34
|
+
const refused = (content) => ({ content, isError: true });
|
|
35
|
+
/** Idempotency key of a report or note a sub-agent's call delivered to its parent. */
|
|
36
|
+
export const toParentIdemKey = (runId, callId) => `subagent_delivery:${runId}:${callId}`;
|
|
37
|
+
/**
|
|
38
|
+
* Messages between the agents of one tree (agent map spec §4.2, §4.3, §5): `SendMessage` and
|
|
39
|
+
* `SubagentHandback`, called by the tool pipeline.
|
|
40
|
+
*
|
|
41
|
+
* A message to a sub-agent ({@link toChild}) is a `user_message` in its log with
|
|
42
|
+
* `dispatch.kind: "message"`, idempotent by the sending call. While the sub-agent has an active run
|
|
43
|
+
* it is appended under the sub-agent's row lock, which every terminal path of its runs takes too:
|
|
44
|
+
* the run absorbs it at its next model call, or, when the run ends without another call, the end's
|
|
45
|
+
* `ensureRun` starts the next run from it (`RunQueue.childWakeIn`). An idle sub-agent is started
|
|
46
|
+
* again through the dispatch transaction (a follow-up: it counts as a dispatch and takes a
|
|
47
|
+
* concurrency slot, refused at the limits, agent map spec §6), with the gates of the sub-agent's
|
|
48
|
+
* type checked again and its frozen tools narrowed to what the sender's current version allows.
|
|
49
|
+
* A message never waits on a lock a running sub-agent holds while it waits for the sender's run
|
|
50
|
+
* row (the dispatch transaction locks the sub-agent's row only when it has no active run).
|
|
51
|
+
*
|
|
52
|
+
* A sub-agent's note or report to its parent ({@link toParent}) is one `subagent_delivery` in the
|
|
53
|
+
* parent's log (`SubagentDeliveries.deliverIn`), idempotent by the call.
|
|
54
|
+
*/
|
|
55
|
+
let SubagentMessages = class SubagentMessages {
|
|
56
|
+
kdb;
|
|
57
|
+
eventLog;
|
|
58
|
+
config;
|
|
59
|
+
deliveries;
|
|
60
|
+
txHost;
|
|
61
|
+
hooks;
|
|
62
|
+
/** What the dispatch transaction of a restart needs (`commit`). */
|
|
63
|
+
deps;
|
|
64
|
+
constructor(kdb, eventLog, config, jobs, log, deliveries, txHost, hooks) {
|
|
65
|
+
this.kdb = kdb;
|
|
66
|
+
this.eventLog = eventLog;
|
|
67
|
+
this.config = config;
|
|
68
|
+
this.deliveries = deliveries;
|
|
69
|
+
this.txHost = txHost;
|
|
70
|
+
this.hooks = hooks;
|
|
71
|
+
this.deps = {
|
|
72
|
+
eventLog,
|
|
73
|
+
enqueue: (data, jobId, kind) => jobs.enqueue(data, jobId, kind),
|
|
74
|
+
log,
|
|
75
|
+
commitDispatch: (a, plan, child) => this.commitDispatch(a, plan, child),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/** The restart's dispatch writes in a transaction of their own (see `commitDispatchIn`). */
|
|
79
|
+
commitDispatch(a, plan, child) {
|
|
80
|
+
return commitDispatchIn({ db: this.db, eventLog: this.eventLog, config: this.config }, a, plan, child);
|
|
81
|
+
}
|
|
82
|
+
/** The context's handle (the transaction of a `@Transactional` method, else the pool). */
|
|
83
|
+
get db() {
|
|
84
|
+
return this.kdb.db;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* `SendMessage` (agent map spec §4.2, §5.1): `to` is one of the caller's own sub-agents by id,
|
|
88
|
+
* or `"parent"` in a sub-agent. Anything else (a sibling, a grandchild, another conversation's
|
|
89
|
+
* sub-agent, an unknown id, `"parent"` at the root) is refused with the valid targets.
|
|
90
|
+
*/
|
|
91
|
+
async toChild(ctx, callId, childId, text,
|
|
92
|
+
/** The pipeline's record of why the call was allowed (the `tool.called` audit of a restart). */
|
|
93
|
+
opts = {}) {
|
|
94
|
+
if (childId === PARENT_TARGET && ctx.parent !== undefined) {
|
|
95
|
+
return this.toParent(ctx, "note", text, callId);
|
|
96
|
+
}
|
|
97
|
+
const child = await this.db
|
|
98
|
+
.selectFrom("conversations")
|
|
99
|
+
.select(["id", "title", "subagent_type"])
|
|
100
|
+
.where("id", "=", childId)
|
|
101
|
+
.where("org_id", "=", ctx.orgId)
|
|
102
|
+
.where("kind", "=", "subagent")
|
|
103
|
+
.where("parent_conversation_id", "=", ctx.conversationId)
|
|
104
|
+
.where("deleted_at", "is", null)
|
|
105
|
+
.executeTakeFirst();
|
|
106
|
+
const started = child && (await this.eventLog.findByIdem(child.id, "subagent_started"));
|
|
107
|
+
if (!child || started?.type !== "subagent_started")
|
|
108
|
+
return this.unknownTarget(ctx, childId);
|
|
109
|
+
const target = { id: child.id, description: child.title ?? "" };
|
|
110
|
+
const { template } = started.payload;
|
|
111
|
+
const agentType = child.subagent_type ?? started.payload.agentType;
|
|
112
|
+
// a retried call (its holder died after sending): the same answer, nothing sent twice
|
|
113
|
+
const prior = await this.eventLog.findByIdem(child.id, sentMessageIdemKey(ctx.runId, callId));
|
|
114
|
+
if (prior && !(await dispatchOfCall(this.db, ctx.runId, callId))) {
|
|
115
|
+
return { content: sentToRunningText(target), isError: false };
|
|
116
|
+
}
|
|
117
|
+
// the sub-agent's type stays available to the sender (§4.1, checked at every message): an org
|
|
118
|
+
// agent passes its gates, any other type is still in the sender's roster
|
|
119
|
+
let current = ctx.agent;
|
|
120
|
+
if (template.source === "agent") {
|
|
121
|
+
const gates = await orgAgentGates(this.db, { ctx, callId }, template.id ?? "", agentType, true);
|
|
122
|
+
if ("refused" in gates)
|
|
123
|
+
return refused(SEND_MESSAGE_REFUSALS.notAvailable(child.id, agentType));
|
|
124
|
+
current = gates.checked.definition;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
const roster = await resolveRoster(this.db, ctx.orgId, ctx.agent, this.deps.log);
|
|
128
|
+
// a plugin template by its template id: an org template's, a linked copy's own or a
|
|
129
|
+
// platform template's, or an alias of the entry
|
|
130
|
+
const entry = template.source === "plugin"
|
|
131
|
+
? roster.find((e) => e.source === "plugin" &&
|
|
132
|
+
template.id !== undefined &&
|
|
133
|
+
(e.templateId === template.id || e.aliasTemplateIds?.includes(template.id)))
|
|
134
|
+
: findType(roster, agentType);
|
|
135
|
+
if (entry?.source !== template.source) {
|
|
136
|
+
return refused(SEND_MESSAGE_REFUSALS.notAvailable(child.id, agentType));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const frozen = normalizeStoredDefinition(started.payload.definition);
|
|
140
|
+
for (let attempt = 0; attempt < SEND_ATTEMPTS; attempt++) {
|
|
141
|
+
const active = prior === undefined && (await this.activeRunOf(child.id)) !== undefined;
|
|
142
|
+
await this.hooks?.afterStatusRead?.(child.id);
|
|
143
|
+
if (active) {
|
|
144
|
+
const seq = await this.appendToRunning(ctx, callId, child.id, text, narrowFollowUp(frozen, current));
|
|
145
|
+
if (seq !== null) {
|
|
146
|
+
await this.eventLog.notify(child.id, seq);
|
|
147
|
+
return { content: sentToRunningText(target), isError: false };
|
|
148
|
+
}
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const out = await this.restart(ctx, callId, text, target, opts.authorization, {
|
|
152
|
+
childConversationId: child.id,
|
|
153
|
+
agentType,
|
|
154
|
+
source: template.source,
|
|
155
|
+
agentId: template.source === "agent" ? (template.id ?? "") : ctx.agentId,
|
|
156
|
+
agentVersion: template.source === "agent" ? (template.version ?? ctx.agentVersion) : ctx.agentVersion,
|
|
157
|
+
resumed: true,
|
|
158
|
+
model: started.payload.definition.model,
|
|
159
|
+
tierFallback: false,
|
|
160
|
+
}, frozen);
|
|
161
|
+
if (out === "active")
|
|
162
|
+
continue;
|
|
163
|
+
return out;
|
|
164
|
+
}
|
|
165
|
+
return refused(SEND_RETRY_TEXT);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* A sub-agent's note (`SendMessage` to `"parent"`) or report (`SubagentHandback`) to its parent
|
|
169
|
+
* (agent map spec §4.3, §5.2): one `subagent_delivery` of this run in the parent's log,
|
|
170
|
+
* idempotent by the call; an active parent run absorbs it, an idle parent is woken.
|
|
171
|
+
*/
|
|
172
|
+
async toParent(ctx, kind, text, callId) {
|
|
173
|
+
if (ctx.parent === undefined)
|
|
174
|
+
return refused(HANDBACK_NOT_A_CHILD_TEXT);
|
|
175
|
+
const row = await deliveryRowOfChildRun(this.db, ctx.runId);
|
|
176
|
+
if (!row)
|
|
177
|
+
return refused(SEND_MESSAGE_REFUSALS.notAvailableHere);
|
|
178
|
+
// a fork invocation's parent run waits for the final reply (phase D, agent map spec §5.4)
|
|
179
|
+
if (row.forSkill === true)
|
|
180
|
+
return refused(HANDBACK_FORK_TEXT);
|
|
181
|
+
await this.deliveries.deliverIn(row, { kind, text }, { idemKey: toParentIdemKey(ctx.runId, callId) });
|
|
182
|
+
return {
|
|
183
|
+
content: kind === "report" ? HANDBACK_RESULT_TEXT : SENT_TO_PARENT_TEXT,
|
|
184
|
+
isError: false,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Appends the message to a sub-agent whose run is active, under its row lock (a run's terminal
|
|
189
|
+
* write takes the same lock, so the run is still active when the message lands). Null when no
|
|
190
|
+
* run is active any more: the caller starts one.
|
|
191
|
+
*/
|
|
192
|
+
async appendToRunning(ctx, callId, childId, text, narrowed) {
|
|
193
|
+
await this.db
|
|
194
|
+
.selectFrom("conversations")
|
|
195
|
+
.select("id")
|
|
196
|
+
.where("id", "=", childId)
|
|
197
|
+
.forUpdate()
|
|
198
|
+
.executeTakeFirst();
|
|
199
|
+
if ((await this.activeRunOf(childId)) === undefined)
|
|
200
|
+
return null;
|
|
201
|
+
const [ev] = await this.eventLog.appendIn(childId, [
|
|
202
|
+
taskMessage(ctx, callId, text, narrowed, undefined, true),
|
|
203
|
+
]);
|
|
204
|
+
return ev?.seq ?? null;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Starts an idle sub-agent again with the message (the dispatch transaction, `commit`): its row
|
|
208
|
+
* is locked only after no active run was found, and again checked under the lock. `"active"`
|
|
209
|
+
* when a run is active after all (the caller appends to it instead).
|
|
210
|
+
*/
|
|
211
|
+
async restart(ctx, callId, text, target, authorization, plan, frozen) {
|
|
212
|
+
const a = {
|
|
213
|
+
ctx,
|
|
214
|
+
callId,
|
|
215
|
+
input: { description: target.description || target.id, prompt: text },
|
|
216
|
+
call: {
|
|
217
|
+
toolKey: SEND_MESSAGE,
|
|
218
|
+
authorization: authorization ?? { policy: "allow" },
|
|
219
|
+
startedAt: Date.now(),
|
|
220
|
+
},
|
|
221
|
+
sent: { content: sentToIdleText(target), refusals: SEND_MESSAGE_REFUSALS },
|
|
222
|
+
};
|
|
223
|
+
const out = await commit(this.deps, a, plan, async (t, checked) => {
|
|
224
|
+
const current = plan.source === "agent" ? checked?.definition : ctx.agent;
|
|
225
|
+
if (current === undefined)
|
|
226
|
+
throw new Error("org agent message without its checked version");
|
|
227
|
+
const activeRun = () => t
|
|
228
|
+
.selectFrom("runs")
|
|
229
|
+
.select("id")
|
|
230
|
+
.where("conversation_id", "=", plan.childConversationId)
|
|
231
|
+
.where("status", "in", ACTIVE_RUN_STATUSES)
|
|
232
|
+
.executeTakeFirst();
|
|
233
|
+
// an active sub-agent is not waited for here: its token append locks its row and then the
|
|
234
|
+
// sender's run row, which this transaction already holds (review I1 of phase C)
|
|
235
|
+
if (await activeRun())
|
|
236
|
+
return null;
|
|
237
|
+
// A brief inverted-order window remains: this transaction holds the tree's budget run
|
|
238
|
+
// (`commit`) and now takes the child's row, while a run of the child that started between the
|
|
239
|
+
// check above and this lock (a wake run, `RunQueue.childWakeIn`) takes the child's row and
|
|
240
|
+
// then the budget run in its token append (`StepLog.appendCounted`). PostgreSQL's deadlock
|
|
241
|
+
// detection aborts one of the two transactions and the other goes on: either this
|
|
242
|
+
// `SendMessage` call errors (nothing written; a repeat finds the running sub-agent and
|
|
243
|
+
// appends to it) or that step's append errors as any database error of a step does. Accepted
|
|
244
|
+
// rather than a lock reordering, for a window of a few statements.
|
|
245
|
+
await t
|
|
246
|
+
.selectFrom("conversations")
|
|
247
|
+
.select("id")
|
|
248
|
+
.where("id", "=", plan.childConversationId)
|
|
249
|
+
.forUpdate()
|
|
250
|
+
.executeTakeFirst();
|
|
251
|
+
if (await activeRun())
|
|
252
|
+
return null;
|
|
253
|
+
const [task] = await this.eventLog.appendIn(plan.childConversationId, [
|
|
254
|
+
taskMessage(ctx, callId, text, narrowFollowUp(frozen, current), undefined, true),
|
|
255
|
+
]);
|
|
256
|
+
return task ?? null;
|
|
257
|
+
});
|
|
258
|
+
if (out === null)
|
|
259
|
+
return "active";
|
|
260
|
+
if (out.kind === "dispatched")
|
|
261
|
+
return { content: out.content, isError: false, logged: true };
|
|
262
|
+
// a gate revoked since the check above, under the dispatch's locks
|
|
263
|
+
if (out.content === AGENT_REFUSALS.agentNotAvailable(plan.agentType)) {
|
|
264
|
+
return refused(SEND_MESSAGE_REFUSALS.notAvailable(target.id, plan.agentType));
|
|
265
|
+
}
|
|
266
|
+
// a limit refusal counts the sub-agent's slot as free: when a run of it started meanwhile,
|
|
267
|
+
// the message goes to that run instead
|
|
268
|
+
if ((await this.activeRunOf(plan.childConversationId)) !== undefined)
|
|
269
|
+
return "active";
|
|
270
|
+
return refused(out.content);
|
|
271
|
+
}
|
|
272
|
+
/** The active run of a conversation, if any. */
|
|
273
|
+
activeRunOf(conversationId) {
|
|
274
|
+
return this.db
|
|
275
|
+
.selectFrom("runs")
|
|
276
|
+
.select("id")
|
|
277
|
+
.where("conversation_id", "=", conversationId)
|
|
278
|
+
.where("status", "in", ACTIVE_RUN_STATUSES)
|
|
279
|
+
.executeTakeFirst();
|
|
280
|
+
}
|
|
281
|
+
/** The unknown-target refusal, listing the caller's own sub-agents (newest first). */
|
|
282
|
+
async unknownTarget(ctx, to) {
|
|
283
|
+
const rows = await this.db
|
|
284
|
+
.selectFrom("conversations")
|
|
285
|
+
.select(["id", "title"])
|
|
286
|
+
.where("org_id", "=", ctx.orgId)
|
|
287
|
+
.where("kind", "=", "subagent")
|
|
288
|
+
.where("parent_conversation_id", "=", ctx.conversationId)
|
|
289
|
+
.where("deleted_at", "is", null)
|
|
290
|
+
.orderBy("created_at", "desc")
|
|
291
|
+
.orderBy("id")
|
|
292
|
+
.limit(SEND_TARGETS_LISTED + 1)
|
|
293
|
+
.execute();
|
|
294
|
+
const listed = rows.slice(0, SEND_TARGETS_LISTED);
|
|
295
|
+
let more = 0;
|
|
296
|
+
if (rows.length > SEND_TARGETS_LISTED) {
|
|
297
|
+
const total = await this.db
|
|
298
|
+
.selectFrom("conversations")
|
|
299
|
+
.select((eb) => eb.fn.countAll().as("n"))
|
|
300
|
+
.where("org_id", "=", ctx.orgId)
|
|
301
|
+
.where("kind", "=", "subagent")
|
|
302
|
+
.where("parent_conversation_id", "=", ctx.conversationId)
|
|
303
|
+
.where("deleted_at", "is", null)
|
|
304
|
+
.executeTakeFirstOrThrow();
|
|
305
|
+
more = Number(total.n) - listed.length;
|
|
306
|
+
}
|
|
307
|
+
return refused(SEND_MESSAGE_REFUSALS.unknownTarget(to, listed.map((r) => ({ id: r.id, description: r.title ?? "" })), { hasParent: ctx.parent !== undefined, more }));
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
__decorate([
|
|
311
|
+
Transactional({ propagation: "requires_new" })
|
|
312
|
+
], SubagentMessages.prototype, "commitDispatch", null);
|
|
313
|
+
__decorate([
|
|
314
|
+
Transactional({ propagation: "requires_new" })
|
|
315
|
+
], SubagentMessages.prototype, "appendToRunning", null);
|
|
316
|
+
SubagentMessages = __decorate([
|
|
317
|
+
Injectable(),
|
|
318
|
+
__param(0, Inject(KernelDb)),
|
|
319
|
+
__param(1, Inject(EventLog)),
|
|
320
|
+
__param(2, Inject(KernelConfigService)),
|
|
321
|
+
__param(3, Inject(RunJobs)),
|
|
322
|
+
__param(4, Inject(KERNEL_LOGGER)),
|
|
323
|
+
__param(5, Inject(SubagentDeliveries)),
|
|
324
|
+
__param(6, Inject(TransactionHost)),
|
|
325
|
+
__param(7, Optional()),
|
|
326
|
+
__param(7, Inject(SUBAGENT_MESSAGES_HOOKS))
|
|
327
|
+
], SubagentMessages);
|
|
328
|
+
export { SubagentMessages };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The sub-agent preamble (spec §6.3, model-visible): rendered in a child's
|
|
3
|
-
* `BEHAVIOR_RULES` and before its instructions. Frozen into each child's
|
|
4
|
-
* dispatch, and request building reads it from there, so changing this text
|
|
5
|
-
* child's requests.
|
|
2
|
+
* The sub-agent preamble (spec §6.3, agent map spec §4.4, model-visible): rendered in a child's
|
|
3
|
+
* system text after `BEHAVIOR_RULES` and before its instructions. Frozen into each child's
|
|
4
|
+
* `subagent_started` at dispatch, and request building reads it from there, so changing this text
|
|
5
|
+
* never alters an old child's requests.
|
|
6
6
|
*/
|
|
7
7
|
export declare const SUBAGENT_PREAMBLE: string;
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The sub-agent preamble (spec §6.3, model-visible): rendered in a child's
|
|
3
|
-
* `BEHAVIOR_RULES` and before its instructions. Frozen into each child's
|
|
4
|
-
* dispatch, and request building reads it from there, so changing this text
|
|
5
|
-
* child's requests.
|
|
2
|
+
* The sub-agent preamble (spec §6.3, agent map spec §4.4, model-visible): rendered in a child's
|
|
3
|
+
* system text after `BEHAVIOR_RULES` and before its instructions. Frozen into each child's
|
|
4
|
+
* `subagent_started` at dispatch, and request building reads it from there, so changing this text
|
|
5
|
+
* never alters an old child's requests.
|
|
6
6
|
*/
|
|
7
7
|
export const SUBAGENT_PREAMBLE = "You are a sub-agent. Another agent dispatched you with the task in the first user message. " +
|
|
8
8
|
"Work on it on your own: the user does not watch this conversation and you cannot ask them " +
|
|
9
|
-
"questions. When you are done,
|
|
10
|
-
"
|
|
11
|
-
"
|
|
9
|
+
"questions. When you are done, hand your report back with SubagentHandback and include " +
|
|
10
|
+
"everything the agent that dispatched you needs; if you end your turn without handing back, " +
|
|
11
|
+
"your final reply is delivered as your report. While you work you can send that agent a short " +
|
|
12
|
+
'note with SendMessage to "parent", and messages from it may arrive in this conversation. If ' +
|
|
13
|
+
"you cannot finish, say what is missing and why.";
|
|
@@ -2,7 +2,7 @@ import type { Logger } from "@capybara-hq/plugin-sdk";
|
|
|
2
2
|
import type { KernelSchemaDb } from "../../db/kernel-schema.js";
|
|
3
3
|
/** A finished step of a sub-agent run, as the loop reports it. */
|
|
4
4
|
export interface SubagentStep {
|
|
5
|
-
/** The parent conversation
|
|
5
|
+
/** The parent conversation: its topic and those of every conversation above it get the message. */
|
|
6
6
|
parentConversationId: string;
|
|
7
7
|
/** The child conversation (the sub-agent's id). */
|
|
8
8
|
conversationId: string;
|
|
@@ -17,10 +17,12 @@ export interface SubagentProgressDeps {
|
|
|
17
17
|
log: Pick<Logger, "warn">;
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
|
-
* Publishes `{ kind: "subagent_progress", subagentId, step, toolCalls, lastToolKey? }`
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
20
|
+
* Publishes `{ kind: "subagent_progress", subagentId, step, toolCalls, lastToolKey? }` after a
|
|
21
|
+
* child step on the topic of every ancestor (sub-agents spec §14.2; agent map spec §8: the root's
|
|
22
|
+
* agent map follows a sub-agent at any depth), `subagentId` naming the progressing agent.
|
|
23
|
+
* Ephemeral: not in any log, lost on reconnect (the tree and summary APIs have the current
|
|
24
|
+
* numbers). The counts come from the child run's log (its `tool_result` events), never from
|
|
25
|
+
* process memory, so any replica running the step reports the same. Never throws: a lost progress
|
|
26
|
+
* message costs nothing.
|
|
25
27
|
*/
|
|
26
28
|
export declare function publishSubagentProgress(d: SubagentProgressDeps, s: SubagentStep): Promise<void>;
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { sql } from "kysely";
|
|
2
2
|
import { conversationTopic } from "../../conversations/event-log.js";
|
|
3
|
+
import { conversationAncestors } from "../../conversations/tree.js";
|
|
3
4
|
/**
|
|
4
|
-
* Publishes `{ kind: "subagent_progress", subagentId, step, toolCalls, lastToolKey? }`
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* Publishes `{ kind: "subagent_progress", subagentId, step, toolCalls, lastToolKey? }` after a
|
|
6
|
+
* child step on the topic of every ancestor (sub-agents spec §14.2; agent map spec §8: the root's
|
|
7
|
+
* agent map follows a sub-agent at any depth), `subagentId` naming the progressing agent.
|
|
8
|
+
* Ephemeral: not in any log, lost on reconnect (the tree and summary APIs have the current
|
|
9
|
+
* numbers). The counts come from the child run's log (its `tool_result` events), never from
|
|
10
|
+
* process memory, so any replica running the step reports the same. Never throws: a lost progress
|
|
11
|
+
* message costs nothing.
|
|
9
12
|
*/
|
|
10
13
|
export async function publishSubagentProgress(d, s) {
|
|
11
14
|
try {
|
|
@@ -24,7 +27,9 @@ export async function publishSubagentProgress(d, s) {
|
|
|
24
27
|
toolCalls: Number(row?.n ?? 0),
|
|
25
28
|
...(row?.last != null && { lastToolKey: row.last }),
|
|
26
29
|
};
|
|
27
|
-
await d.
|
|
30
|
+
const ancestors = await conversationAncestors(d.db, s.conversationId);
|
|
31
|
+
const topics = new Set([s.parentConversationId, ...ancestors]);
|
|
32
|
+
await Promise.all([...topics].map((id) => d.bus.publish(conversationTopic(id), msg)));
|
|
28
33
|
}
|
|
29
34
|
catch (err) {
|
|
30
35
|
d.log.warn("sub-agent progress publish failed", {
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { EventPayload } from "../../conversations/events.js";
|
|
2
|
+
type Delivery = EventPayload<"subagent_delivery">;
|
|
3
|
+
/**
|
|
4
|
+
* The model-visible text of a `subagent_delivery` event, rendered as a system message in the
|
|
5
|
+
* parent's request (agent map spec §4.5):
|
|
6
|
+
*
|
|
7
|
+
* ```
|
|
8
|
+
* Sub-agent <id> ("<description>") handed back a report:
|
|
9
|
+
* <text>
|
|
10
|
+
* Sub-agent <id> ("<description>") sent a message:
|
|
11
|
+
* <text>
|
|
12
|
+
* Sub-agent <id> ("<description>") completed; its report was already delivered.
|
|
13
|
+
* Sub-agent <id> ("<description>") completed. Final reply:
|
|
14
|
+
* <text>
|
|
15
|
+
* Sub-agent <id> ("<description>") failed (<code>): <message>
|
|
16
|
+
* Sub-agent <id> ("<description>") stopped by the user.
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* A finish uses `agentResultText`'s status wording (`subagentStatusText`, with the error code and
|
|
20
|
+
* who stopped it); after a handback only the status itself (up to its first `;`), and without a
|
|
21
|
+
* reply `It produced no reply.` A failed finish's `text` is the error message, an aborted one has
|
|
22
|
+
* none. Read only from the payload, so a replay renders it identically.
|
|
23
|
+
*
|
|
24
|
+
* A run that handed back and then `completed` no longer gets a finished delivery (acceptance
|
|
25
|
+
* 2026-11-07, `SubagentDeliveries.finishIn`); the "already delivered" line stays for the other
|
|
26
|
+
* statuses after a handback and for the completed ones older logs recorded, which rebuild byte for
|
|
27
|
+
* byte. The switch is the delivery's absence in the log, so it needs no `DriftReason`.
|
|
28
|
+
*/
|
|
29
|
+
export declare function renderSubagentDelivery(p: Delivery): string;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { subagentStatusText } from "./status.js";
|
|
2
|
+
/**
|
|
3
|
+
* The model-visible text of a `subagent_delivery` event, rendered as a system message in the
|
|
4
|
+
* parent's request (agent map spec §4.5):
|
|
5
|
+
*
|
|
6
|
+
* ```
|
|
7
|
+
* Sub-agent <id> ("<description>") handed back a report:
|
|
8
|
+
* <text>
|
|
9
|
+
* Sub-agent <id> ("<description>") sent a message:
|
|
10
|
+
* <text>
|
|
11
|
+
* Sub-agent <id> ("<description>") completed; its report was already delivered.
|
|
12
|
+
* Sub-agent <id> ("<description>") completed. Final reply:
|
|
13
|
+
* <text>
|
|
14
|
+
* Sub-agent <id> ("<description>") failed (<code>): <message>
|
|
15
|
+
* Sub-agent <id> ("<description>") stopped by the user.
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* A finish uses `agentResultText`'s status wording (`subagentStatusText`, with the error code and
|
|
19
|
+
* who stopped it); after a handback only the status itself (up to its first `;`), and without a
|
|
20
|
+
* reply `It produced no reply.` A failed finish's `text` is the error message, an aborted one has
|
|
21
|
+
* none. Read only from the payload, so a replay renders it identically.
|
|
22
|
+
*
|
|
23
|
+
* A run that handed back and then `completed` no longer gets a finished delivery (acceptance
|
|
24
|
+
* 2026-11-07, `SubagentDeliveries.finishIn`); the "already delivered" line stays for the other
|
|
25
|
+
* statuses after a handback and for the completed ones older logs recorded, which rebuild byte for
|
|
26
|
+
* byte. The switch is the delivery's absence in the log, so it needs no `DriftReason`.
|
|
27
|
+
*/
|
|
28
|
+
export function renderSubagentDelivery(p) {
|
|
29
|
+
const head = `Sub-agent ${p.subagentId} (${JSON.stringify(p.description)})`;
|
|
30
|
+
switch (p.kind) {
|
|
31
|
+
case "report":
|
|
32
|
+
return `${head} handed back a report:\n${p.text}`;
|
|
33
|
+
case "note":
|
|
34
|
+
return `${head} sent a message:\n${p.text}`;
|
|
35
|
+
case "finished": {
|
|
36
|
+
const status = subagentStatusText(p.status ?? "completed", {
|
|
37
|
+
errorCode: p.errorCode,
|
|
38
|
+
abortedBy: p.abortedBy,
|
|
39
|
+
});
|
|
40
|
+
if (p.handedBack === true) {
|
|
41
|
+
return `${head} ${status.split(";")[0]}; its report was already delivered.`;
|
|
42
|
+
}
|
|
43
|
+
const text = p.text.trim();
|
|
44
|
+
if (p.status === "failed")
|
|
45
|
+
return text === "" ? `${head} ${status}.` : `${head} ${status}: ${text}`;
|
|
46
|
+
if (p.status === "aborted" || p.status === "timed_out")
|
|
47
|
+
return `${head} ${status}.`;
|
|
48
|
+
return text === ""
|
|
49
|
+
? `${head} ${status}. It produced no reply.`
|
|
50
|
+
: `${head} ${status}. Final reply:\n${p.text}`;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|