@capybara-hq/kernel 0.1.0-rc.4 → 0.1.0-rc.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bootstrap.json +61 -5
- package/dist/admin/admin.controller.d.ts +51 -14
- package/dist/admin/admin.controller.js +60 -19
- package/dist/admin/extensions.controller.d.ts +16 -2
- package/dist/admin/extensions.controller.js +26 -6
- package/dist/admin/setup-lock.d.ts +1 -1
- package/dist/admin/setup-lock.js +1 -1
- package/dist/admin/setup.controller.d.ts +1 -1
- package/dist/admin/setup.controller.js +1 -1
- package/dist/admin/setup.service.d.ts +4 -4
- package/dist/admin/setup.service.js +8 -8
- package/dist/agents/agent-lookup.d.ts +16 -0
- package/dist/agents/agent-lookup.js +11 -0
- package/dist/agents/agents.controller.d.ts +76 -1
- package/dist/agents/agents.controller.js +90 -11
- package/dist/agents/agents.module.d.ts +4 -1
- package/dist/agents/agents.module.js +32 -6
- package/dist/agents/agents.service.d.ts +54 -23
- package/dist/agents/agents.service.js +180 -76
- package/dist/agents/definition.d.ts +49 -0
- package/dist/agents/definition.js +45 -0
- package/dist/agents/from-template.d.ts +106 -0
- package/dist/agents/from-template.js +649 -0
- package/dist/agents/from-template.service.d.ts +60 -0
- package/dist/agents/from-template.service.js +161 -0
- package/dist/agents/models.controller.d.ts +34 -5
- package/dist/agents/models.controller.js +50 -6
- package/dist/agents/org-templates.d.ts +176 -0
- package/dist/agents/org-templates.js +827 -0
- package/dist/agents/pending-connector-requests.d.ts +77 -0
- package/dist/agents/pending-connector-requests.js +215 -0
- package/dist/agents/pending-connectors.controller.d.ts +39 -0
- package/dist/agents/pending-connectors.controller.js +91 -0
- package/dist/agents/pending-connectors.service.d.ts +62 -0
- package/dist/agents/pending-connectors.service.js +282 -0
- package/dist/agents/readiness.controller.d.ts +5 -5
- package/dist/agents/readiness.controller.js +6 -6
- package/dist/agents/templates.controller.d.ts +86 -5
- package/dist/agents/templates.controller.js +171 -7
- package/dist/agents/templates.d.ts +127 -23
- package/dist/agents/templates.js +475 -52
- package/dist/background/background.module.js +8 -1
- package/dist/background/finish.d.ts +3 -2
- package/dist/background/launch-lock.d.ts +4 -3
- package/dist/background/launch-lock.js +4 -3
- package/dist/background/poll.job.d.ts +9 -6
- package/dist/background/poll.job.js +30 -22
- package/dist/background/session.d.ts +13 -2
- package/dist/background/session.js +13 -0
- package/dist/background/stop.d.ts +12 -6
- package/dist/background/stop.js +57 -39
- package/dist/background/store.d.ts +18 -6
- package/dist/background/store.js +12 -6
- package/dist/background/tasks.service.d.ts +15 -5
- package/dist/background/tasks.service.js +42 -17
- package/dist/background/wake-rules.d.ts +27 -18
- package/dist/background/wake-rules.js +52 -22
- package/dist/background/wake.d.ts +13 -11
- package/dist/background/wake.js +20 -14
- package/dist/catalog/admin-catalog.controller.d.ts +129 -30
- package/dist/catalog/admin-catalog.controller.js +213 -42
- package/dist/catalog/catalog-content.d.ts +58 -32
- package/dist/catalog/catalog-content.js +34 -8
- package/dist/catalog/catalog-import.module.d.ts +7 -0
- package/dist/catalog/catalog-import.module.js +60 -0
- package/dist/catalog/catalog-items.d.ts +111 -7
- package/dist/catalog/catalog-items.js +279 -13
- package/dist/catalog/catalog-scope.service.d.ts +260 -0
- package/dist/catalog/catalog-scope.service.js +1116 -0
- package/dist/catalog/catalog.module.d.ts +7 -9
- package/dist/catalog/catalog.module.js +41 -31
- package/dist/catalog/catalog.service.d.ts +101 -29
- package/dist/catalog/catalog.service.js +104 -106
- package/dist/catalog/cli.d.ts +11 -1
- package/dist/catalog/cli.js +26 -1
- package/dist/catalog/component-promotion.d.ts +96 -0
- package/dist/catalog/component-promotion.js +395 -0
- package/dist/catalog/component-scope.controller.d.ts +152 -0
- package/dist/catalog/component-scope.controller.js +287 -0
- package/dist/catalog/component-scope.service.d.ts +303 -0
- package/dist/catalog/component-scope.service.js +936 -0
- package/dist/catalog/component-state.d.ts +174 -0
- package/dist/catalog/component-state.js +437 -0
- package/dist/catalog/job-ids.d.ts +30 -0
- package/dist/catalog/job-ids.js +25 -0
- package/dist/catalog/marketplace-fetch.d.ts +1 -1
- package/dist/catalog/marketplaces.controller.d.ts +22 -5
- package/dist/catalog/marketplaces.controller.js +56 -7
- package/dist/catalog/marketplaces.service.d.ts +54 -14
- package/dist/catalog/marketplaces.service.js +71 -22
- package/dist/catalog/org-catalog.controller.d.ts +125 -34
- package/dist/catalog/org-catalog.controller.js +181 -65
- package/dist/catalog/org-catalog.service.d.ts +65 -33
- package/dist/catalog/org-catalog.service.js +324 -157
- package/dist/catalog/org-extension-switch.d.ts +41 -0
- package/dist/catalog/org-extension-switch.js +115 -0
- package/dist/catalog/org-extension.controller.d.ts +119 -0
- package/dist/catalog/org-extension.controller.js +266 -0
- package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
- package/dist/catalog/org-plugin-uploads.controller.js +213 -0
- package/dist/catalog/org-plugin-uploads.d.ts +63 -0
- package/dist/catalog/org-plugin-uploads.js +116 -0
- package/dist/catalog/owned-items.d.ts +184 -0
- package/dist/catalog/owned-items.js +789 -0
- package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
- package/dist/catalog/owned-plugin-cleanup.js +194 -0
- package/dist/catalog/ownership.d.ts +172 -0
- package/dist/catalog/ownership.js +326 -0
- package/dist/catalog/platform-components.d.ts +221 -0
- package/dist/catalog/platform-components.js +761 -0
- package/dist/catalog/platform-migration.d.ts +115 -0
- package/dist/catalog/platform-migration.js +582 -0
- package/dist/catalog/plugin-import.d.ts +178 -34
- package/dist/catalog/plugin-import.js +622 -82
- package/dist/catalog/plugin-install.d.ts +185 -41
- package/dist/catalog/plugin-install.js +758 -126
- package/dist/catalog/plugin-upgrade.d.ts +260 -225
- package/dist/catalog/plugin-upgrade.js +1147 -1136
- package/dist/catalog/request-rules.d.ts +65 -0
- package/dist/catalog/request-rules.js +217 -0
- package/dist/catalog/requests.service.d.ts +193 -118
- package/dist/catalog/requests.service.js +526 -343
- package/dist/catalog/reserved-names.d.ts +8 -0
- package/dist/catalog/reserved-names.js +42 -0
- package/dist/catalog/scope-orgs.d.ts +21 -0
- package/dist/catalog/scope-orgs.js +67 -0
- package/dist/catalog/scope-state.d.ts +35 -0
- package/dist/catalog/scope-state.js +87 -0
- package/dist/catalog/scope-sync-workers.d.ts +7 -0
- package/dist/catalog/scope-sync-workers.js +29 -0
- package/dist/catalog/scope-sync.d.ts +176 -0
- package/dist/catalog/scope-sync.js +576 -0
- package/dist/catalog/scope.d.ts +42 -0
- package/dist/catalog/scope.js +42 -0
- package/dist/catalog/unshare.d.ts +22 -0
- package/dist/catalog/unshare.js +118 -0
- package/dist/channels/actions.js +1 -0
- package/dist/channels/cards.js +20 -2
- package/dist/channels/channels.module.js +2 -0
- package/dist/channels/inbound.d.ts +9 -1
- package/dist/channels/inbound.js +67 -5
- package/dist/channels/phrases.d.ts +35 -0
- package/dist/channels/phrases.js +29 -0
- package/dist/config/docs.js +3 -1
- package/dist/config/schema.d.ts +10 -2
- package/dist/config/schema.js +70 -22
- package/dist/conversations/access.d.ts +6 -4
- package/dist/conversations/access.js +27 -5
- package/dist/conversations/agent-tree.d.ts +46 -0
- package/dist/conversations/agent-tree.js +92 -0
- package/dist/conversations/conversations.controller.d.ts +43 -18
- package/dist/conversations/conversations.controller.js +79 -38
- package/dist/conversations/conversations.module.d.ts +1 -1
- package/dist/conversations/conversations.module.js +7 -7
- package/dist/conversations/conversations.service.d.ts +73 -15
- package/dist/conversations/conversations.service.js +115 -35
- package/dist/conversations/environment-status.d.ts +24 -0
- package/dist/conversations/environment-status.js +71 -0
- package/dist/conversations/event-log.d.ts +20 -5
- package/dist/conversations/event-log.js +60 -0
- package/dist/conversations/events.d.ts +84 -2
- package/dist/conversations/events.js +91 -17
- package/dist/conversations/queue.service.d.ts +1 -1
- package/dist/conversations/queue.service.js +5 -0
- package/dist/conversations/titles.d.ts +5 -3
- package/dist/conversations/titles.js +21 -8
- package/dist/conversations/tree.d.ts +17 -0
- package/dist/conversations/tree.js +42 -0
- package/dist/ctx/create-ctx.d.ts +20 -1
- package/dist/ctx/create-ctx.js +38 -7
- package/dist/db/kernel-schema.d.ts +386 -18
- package/dist/environments/access.d.ts +41 -0
- package/dist/environments/access.js +77 -0
- package/dist/environments/conversation-environments.d.ts +61 -0
- package/dist/environments/conversation-environments.js +170 -0
- package/dist/environments/dto.d.ts +25 -0
- package/dist/environments/dto.js +12 -0
- package/dist/environments/environments.controller.d.ts +33 -0
- package/dist/environments/environments.controller.js +110 -0
- package/dist/environments/environments.module.d.ts +8 -0
- package/dist/environments/environments.module.js +27 -0
- package/dist/environments/environments.service.d.ts +153 -0
- package/dist/environments/environments.service.js +541 -0
- package/dist/environments/legacy-cleanup.job.d.ts +34 -0
- package/dist/environments/legacy-cleanup.job.js +141 -0
- package/dist/errors.d.ts +85 -2
- package/dist/errors.js +85 -2
- package/dist/evals/reconstruct.d.ts +18 -9
- package/dist/evals/reconstruct.js +26 -7
- package/dist/evals/run-replay.d.ts +4 -2
- package/dist/evals/run-replay.js +20 -6
- package/dist/evals/runs.service.d.ts +2 -1
- package/dist/evals/runs.service.js +13 -12
- package/dist/evals/step-replay.d.ts +4 -6
- package/dist/evals/step-replay.js +4 -3
- package/dist/evals/trajectory.service.d.ts +8 -3
- package/dist/evals/trajectory.service.js +26 -14
- package/dist/evals/worker.d.ts +5 -5
- package/dist/evals/worker.js +9 -3
- package/dist/extensions/admin-ops.d.ts +36 -10
- package/dist/extensions/admin-ops.js +65 -42
- package/dist/extensions/admin-view.d.ts +37 -10
- package/dist/extensions/admin-view.js +103 -20
- package/dist/extensions/bootstrap.d.ts +17 -4
- package/dist/extensions/bootstrap.js +70 -9
- package/dist/extensions/cli.d.ts +12 -0
- package/dist/extensions/cli.js +11 -2
- package/dist/extensions/config-hash.d.ts +10 -0
- package/dist/extensions/config-hash.js +38 -0
- package/dist/extensions/deployment-config.d.ts +28 -5
- package/dist/extensions/deployment-config.js +48 -7
- package/dist/extensions/effective-config.d.ts +127 -0
- package/dist/extensions/effective-config.js +368 -0
- package/dist/extensions/extensions.module.js +11 -11
- package/dist/extensions/hooks.d.ts +37 -4
- package/dist/extensions/hooks.js +82 -16
- package/dist/extensions/host.d.ts +24 -10
- package/dist/extensions/host.js +49 -54
- package/dist/extensions/installs.d.ts +20 -8
- package/dist/extensions/installs.js +37 -15
- package/dist/extensions/org-config.d.ts +75 -6
- package/dist/extensions/org-config.js +184 -32
- package/dist/extensions/org-levels.d.ts +37 -0
- package/dist/extensions/org-levels.js +71 -0
- package/dist/extensions/org-overrides.d.ts +151 -0
- package/dist/extensions/org-overrides.js +524 -0
- package/dist/extensions/permission-view.d.ts +16 -4
- package/dist/extensions/permission-view.js +4 -4
- package/dist/extensions/plugin-items.d.ts +21 -0
- package/dist/extensions/plugin-items.js +42 -0
- package/dist/extensions/point-defaults.d.ts +12 -5
- package/dist/extensions/point-defaults.js +37 -9
- package/dist/extensions/resolve.d.ts +5 -1
- package/dist/extensions/resolve.js +15 -2
- package/dist/extensions/state.module.d.ts +9 -0
- package/dist/extensions/state.module.js +38 -0
- package/dist/files/previewers.d.ts +8 -1
- package/dist/files/previewers.js +35 -6
- package/dist/http/api.module.js +25 -3
- package/dist/http/app.d.ts +11 -2
- package/dist/http/app.js +31 -5
- package/dist/http/plugin-dispatch.d.ts +4 -1
- package/dist/http/plugin-dispatch.js +14 -2
- package/dist/identity/accounts.d.ts +29 -29
- package/dist/identity/accounts.js +47 -47
- package/dist/identity/audit.d.ts +2 -1
- package/dist/identity/auth.guard.d.ts +13 -5
- package/dist/identity/auth.guard.js +26 -9
- package/dist/identity/identity.module.d.ts +1 -1
- package/dist/identity/identity.module.js +4 -4
- package/dist/identity/me.controller.js +1 -1
- package/dist/identity/principal.d.ts +3 -3
- package/dist/identity/principal.js +3 -3
- package/dist/identity/settings.d.ts +22 -11
- package/dist/identity/settings.js +53 -18
- package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
- package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
- package/dist/inbox/inbox.module.d.ts +4 -1
- package/dist/inbox/inbox.module.js +7 -3
- package/dist/inbox/inbox.service.d.ts +62 -3
- package/dist/inbox/inbox.service.js +74 -4
- package/dist/inbox/org-notices.d.ts +63 -0
- package/dist/inbox/org-notices.js +91 -0
- package/dist/inbox/platform-inbox.controller.d.ts +23 -0
- package/dist/inbox/platform-inbox.controller.js +58 -0
- package/dist/inbox/platform-inbox.service.d.ts +151 -0
- package/dist/inbox/platform-inbox.service.js +263 -0
- package/dist/inbox/platform-notices.d.ts +19 -0
- package/dist/inbox/platform-notices.js +9 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/infra/cli/kernel-cli.module.js +9 -1
- package/dist/infra/config/kernel-config.service.js +24 -1
- package/dist/infra/database/xact-lock.d.ts +1 -1
- package/dist/infra/database/xact-lock.js +1 -1
- package/dist/infra/events/kernel-events.d.ts +19 -2
- package/dist/infra/queue/add-job-once.d.ts +14 -0
- package/dist/infra/queue/add-job-once.js +16 -0
- package/dist/kernel.module.js +6 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
- package/dist/lifecycle/kernel-lifecycle.js +4 -4
- package/dist/models/embeddings.d.ts +82 -0
- package/dist/models/embeddings.js +326 -0
- package/dist/models/enablement.controller.d.ts +40 -0
- package/dist/models/enablement.controller.js +74 -0
- package/dist/models/enablement.d.ts +99 -0
- package/dist/models/enablement.js +263 -0
- package/dist/models/models.module.d.ts +5 -1
- package/dist/models/models.module.js +16 -4
- package/dist/models/prices.d.ts +5 -5
- package/dist/models/prices.js +4 -4
- package/dist/models/purposes.controller.d.ts +6 -4
- package/dist/models/purposes.controller.js +13 -7
- package/dist/models/purposes.d.ts +37 -12
- package/dist/models/purposes.js +63 -17
- package/dist/orgs/directory-sync.d.ts +14 -5
- package/dist/orgs/directory-sync.js +41 -17
- package/dist/orgs/offboarding.d.ts +9 -7
- package/dist/orgs/offboarding.js +28 -17
- package/dist/orgs/org-lock.d.ts +5 -0
- package/dist/orgs/org-lock.js +13 -0
- package/dist/orgs/org.guard.d.ts +10 -0
- package/dist/orgs/org.guard.js +43 -32
- package/dist/orgs/orgs.module.js +3 -0
- package/dist/orgs/orgs.service.d.ts +20 -7
- package/dist/orgs/orgs.service.js +32 -12
- package/dist/orgs/roles.d.ts +1 -1
- package/dist/orgs/roles.js +5 -1
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.service.d.ts +15 -3
- package/dist/orgs/settings.service.js +6 -2
- package/dist/overrides.d.ts +3 -0
- package/dist/overrides.js +2 -0
- package/dist/platform/actor.d.ts +48 -0
- package/dist/platform/actor.js +100 -0
- package/dist/platform/agent-docs.d.ts +18 -0
- package/dist/platform/agent-docs.js +59 -0
- package/dist/platform/availability.d.ts +14 -0
- package/dist/platform/availability.js +43 -0
- package/dist/platform/errors.d.ts +11 -0
- package/dist/platform/errors.js +26 -0
- package/dist/platform/exclusions.d.ts +12 -0
- package/dist/platform/exclusions.js +1405 -0
- package/dist/platform/method.d.ts +6 -0
- package/dist/platform/method.js +15 -0
- package/dist/platform/operation.d.ts +92 -0
- package/dist/platform/operation.js +35 -0
- package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
- package/dist/platform/ops/agent-templates.ops.js +92 -0
- package/dist/platform/ops/agents.ops.d.ts +19 -0
- package/dist/platform/ops/agents.ops.js +294 -0
- package/dist/platform/ops/connectors.ops.d.ts +15 -0
- package/dist/platform/ops/connectors.ops.js +126 -0
- package/dist/platform/ops/errors.d.ts +11 -0
- package/dist/platform/ops/errors.js +22 -0
- package/dist/platform/ops/extensions.ops.d.ts +19 -0
- package/dist/platform/ops/extensions.ops.js +116 -0
- package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
- package/dist/platform/ops/marketplaces.ops.js +157 -0
- package/dist/platform/ops/paging.d.ts +14 -0
- package/dist/platform/ops/paging.js +20 -0
- package/dist/platform/ops/platform.ops.d.ts +23 -0
- package/dist/platform/ops/platform.ops.js +158 -0
- package/dist/platform/ops/plugins.ops.d.ts +33 -0
- package/dist/platform/ops/plugins.ops.js +377 -0
- package/dist/platform/ops/requests.ops.d.ts +14 -0
- package/dist/platform/ops/requests.ops.js +153 -0
- package/dist/platform/ops/role.d.ts +4 -0
- package/dist/platform/ops/role.js +10 -0
- package/dist/platform/ops/skills.ops.d.ts +13 -0
- package/dist/platform/ops/skills.ops.js +98 -0
- package/dist/platform/ops/summary.d.ts +10 -0
- package/dist/platform/ops/summary.js +18 -0
- package/dist/platform/platform-ops.module.d.ts +7 -0
- package/dist/platform/platform-ops.module.js +55 -0
- package/dist/platform/platform.module.d.ts +8 -0
- package/dist/platform/platform.module.js +25 -0
- package/dist/platform/redact-orgs.d.ts +7 -0
- package/dist/platform/redact-orgs.js +52 -0
- package/dist/platform/registry.d.ts +30 -0
- package/dist/platform/registry.js +111 -0
- package/dist/roles/worker-role.d.ts +6 -4
- package/dist/roles/worker-role.js +14 -7
- package/dist/roles/worker.module.d.ts +1 -1
- package/dist/roles/worker.module.js +9 -1
- package/dist/runtime/context/build.d.ts +6 -4
- package/dist/runtime/context/build.js +26 -7
- package/dist/runtime/context/claude-tools.d.ts +2 -1
- package/dist/runtime/context/claude-tools.js +5 -4
- package/dist/runtime/context/compaction.js +9 -0
- package/dist/runtime/context/reminders.d.ts +2 -0
- package/dist/runtime/context/reminders.js +2 -0
- package/dist/runtime/context/skills.js +9 -2
- package/dist/runtime/context/tool-changes.d.ts +27 -0
- package/dist/runtime/context/tool-changes.js +60 -0
- package/dist/runtime/hook-calls.d.ts +8 -1
- package/dist/runtime/hook-calls.js +40 -7
- package/dist/runtime/langgraph-loop.d.ts +3 -1
- package/dist/runtime/langgraph-loop.js +35 -17
- package/dist/runtime/loop.d.ts +32 -4
- package/dist/runtime/maintenance.d.ts +7 -4
- package/dist/runtime/maintenance.js +23 -8
- package/dist/runtime/model-call.d.ts +38 -11
- package/dist/runtime/model-call.js +97 -24
- package/dist/runtime/providers.d.ts +146 -32
- package/dist/runtime/providers.js +321 -67
- package/dist/runtime/run-control.d.ts +11 -1
- package/dist/runtime/run-control.js +12 -0
- package/dist/runtime/run-drafts.d.ts +85 -0
- package/dist/runtime/run-drafts.js +230 -0
- package/dist/runtime/run-jobs.d.ts +3 -5
- package/dist/runtime/run-jobs.js +3 -7
- package/dist/runtime/run-queue.d.ts +37 -3
- package/dist/runtime/run-queue.js +188 -11
- package/dist/runtime/run-worker.d.ts +12 -6
- package/dist/runtime/run-worker.js +58 -35
- package/dist/runtime/runtime.module.js +3 -0
- package/dist/runtime/step-log.d.ts +9 -4
- package/dist/runtime/step-log.js +8 -5
- package/dist/runtime/stream.controller.d.ts +23 -1
- package/dist/runtime/stream.controller.js +60 -3
- package/dist/runtime/stream.d.ts +4 -1
- package/dist/runtime/stream.js +27 -3
- package/dist/runtime/subagents/child.d.ts +55 -7
- package/dist/runtime/subagents/child.js +105 -7
- package/dist/runtime/subagents/definition.d.ts +12 -3
- package/dist/runtime/subagents/definition.js +46 -32
- package/dist/runtime/subagents/deliveries.d.ts +71 -0
- package/dist/runtime/subagents/deliveries.js +228 -0
- package/dist/runtime/subagents/dispatch.d.ts +115 -26
- package/dist/runtime/subagents/dispatch.js +212 -141
- package/dist/runtime/subagents/limits.d.ts +24 -5
- package/dist/runtime/subagents/limits.js +40 -6
- package/dist/runtime/subagents/messages.d.ts +95 -0
- package/dist/runtime/subagents/messages.js +328 -0
- package/dist/runtime/subagents/preamble.d.ts +4 -4
- package/dist/runtime/subagents/preamble.js +9 -7
- package/dist/runtime/subagents/progress.d.ts +8 -6
- package/dist/runtime/subagents/progress.js +11 -6
- package/dist/runtime/subagents/render.d.ts +30 -0
- package/dist/runtime/subagents/render.js +53 -0
- package/dist/runtime/subagents/roster.d.ts +24 -7
- package/dist/runtime/subagents/roster.js +47 -11
- package/dist/runtime/subagents/skill-fork.d.ts +3 -2
- package/dist/runtime/subagents/skill-fork.js +8 -4
- package/dist/runtime/subagents/status.d.ts +14 -0
- package/dist/runtime/subagents/status.js +23 -0
- package/dist/runtime/subagents/subagents.service.d.ts +7 -4
- package/dist/runtime/subagents/subagents.service.js +11 -6
- package/dist/runtime/usage-report-jobs.d.ts +88 -0
- package/dist/runtime/usage-report-jobs.js +158 -0
- package/dist/runtime/usage-report.d.ts +33 -38
- package/dist/runtime/usage-report.js +169 -96
- package/dist/runtime/waits.d.ts +140 -37
- package/dist/runtime/waits.js +394 -106
- package/dist/sandbox/jobs.d.ts +40 -13
- package/dist/sandbox/jobs.js +57 -20
- package/dist/sandbox/leases.d.ts +37 -54
- package/dist/sandbox/leases.js +71 -115
- package/dist/sandbox/providers.d.ts +2 -2
- package/dist/sandbox/providers.js +1 -1
- package/dist/sandbox/sandbox.module.d.ts +3 -2
- package/dist/sandbox/sandbox.module.js +4 -3
- package/dist/sandbox/sandbox.service.d.ts +229 -134
- package/dist/sandbox/sandbox.service.js +630 -409
- package/dist/skills/catalog.d.ts +3 -2
- package/dist/skills/catalog.js +21 -43
- package/dist/skills/changes.controller.d.ts +7 -0
- package/dist/skills/changes.controller.js +19 -1
- package/dist/skills/invoke.js +8 -3
- package/dist/skills/package.d.ts +20 -1
- package/dist/skills/package.js +28 -1
- package/dist/skills/skills.controller.d.ts +39 -4
- package/dist/skills/skills.controller.js +88 -10
- package/dist/skills/skills.module.js +10 -1
- package/dist/skills/skills.service.d.ts +106 -26
- package/dist/skills/skills.service.js +421 -75
- package/dist/skills/usable.d.ts +81 -0
- package/dist/skills/usable.js +379 -0
- package/dist/tools/approvals.service.d.ts +20 -2
- package/dist/tools/approvals.service.js +23 -4
- package/dist/tools/builtin-names.d.ts +21 -5
- package/dist/tools/builtin-names.js +30 -5
- package/dist/tools/builtins/agent.d.ts +23 -21
- package/dist/tools/builtins/agent.js +62 -55
- package/dist/tools/builtins/builtin-tools.d.ts +6 -2
- package/dist/tools/builtins/builtin-tools.js +37 -12
- package/dist/tools/builtins/handback.d.ts +28 -0
- package/dist/tools/builtins/handback.js +53 -0
- package/dist/tools/builtins/platform.d.ts +34 -0
- package/dist/tools/builtins/platform.js +362 -0
- package/dist/tools/builtins/sandbox/bash.js +13 -3
- package/dist/tools/builtins/sandbox/common.d.ts +43 -24
- package/dist/tools/builtins/sandbox/common.js +80 -45
- package/dist/tools/builtins/sandbox/edit.js +2 -2
- package/dist/tools/builtins/sandbox/glob.js +2 -2
- package/dist/tools/builtins/sandbox/grep.js +2 -4
- package/dist/tools/builtins/sandbox/index.d.ts +1 -1
- package/dist/tools/builtins/sandbox/index.js +1 -1
- package/dist/tools/builtins/sandbox/read.js +1 -1
- package/dist/tools/builtins/sandbox/task-output.d.ts +14 -3
- package/dist/tools/builtins/sandbox/task-output.js +30 -5
- package/dist/tools/builtins/sandbox/task-stop.js +2 -1
- package/dist/tools/builtins/sandbox/write.js +2 -2
- package/dist/tools/builtins/send-message.d.ts +56 -0
- package/dist/tools/builtins/send-message.js +100 -0
- package/dist/tools/builtins/skill-load.d.ts +22 -14
- package/dist/tools/builtins/skill-load.js +86 -57
- package/dist/tools/builtins/skill-write.js +1 -1
- package/dist/tools/builtins/web/extract.js +5 -1
- package/dist/tools/builtins/web/fetch.js +1 -0
- package/dist/tools/builtins/web/search.js +1 -0
- package/dist/tools/connectors.controller.d.ts +10 -0
- package/dist/tools/connectors.controller.js +12 -0
- package/dist/tools/connectors.service.d.ts +46 -5
- package/dist/tools/connectors.service.js +94 -15
- package/dist/tools/extension-tools.controller.d.ts +14 -0
- package/dist/tools/extension-tools.controller.js +37 -0
- package/dist/tools/info.d.ts +42 -1
- package/dist/tools/info.js +64 -1
- package/dist/tools/org-tool-switches.d.ts +74 -0
- package/dist/tools/org-tool-switches.js +184 -0
- package/dist/tools/pipeline.d.ts +46 -40
- package/dist/tools/pipeline.js +193 -364
- package/dist/tools/policy.d.ts +1 -1
- package/dist/tools/policy.js +36 -16
- package/dist/tools/registry.d.ts +98 -5
- package/dist/tools/registry.js +87 -9
- package/dist/tools/tools.module.js +12 -2
- package/dist/ui/views.d.ts +2 -1
- package/dist/ui/views.js +17 -3
- package/package.json +3 -3
- package/src/migrations/0074_subagent_tree.sql +50 -0
- package/src/migrations/0075_plugin_scope.sql +61 -0
- package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
- package/src/migrations/0077_scope_requests.sql +52 -0
- package/src/migrations/0078_scope_grant_switches.sql +18 -0
- package/src/migrations/0079_scope_live_install_switches.sql +19 -0
- package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
- package/src/migrations/0081_platform_components.sql +129 -0
- package/src/migrations/0082_platform_migration.sql +33 -0
- package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
- package/src/migrations/0084_org_owned_items.sql +85 -0
- package/src/migrations/0085_agent_templates_phase4.sql +45 -0
- package/src/migrations/0086_org_layering.sql +30 -0
- package/src/migrations/0087_approval_summary.sql +6 -0
- package/src/migrations/0088_environments.sql +80 -0
- package/src/migrations/0089_model_kinds_usage.sql +38 -0
- package/dist/catalog/upgrade-targets.d.ts +0 -56
- package/dist/catalog/upgrade-targets.js +0 -90
- package/dist/conversations/sandbox-status.d.ts +0 -24
- package/dist/conversations/sandbox-status.js +0 -52
- package/dist/extensions/org-config.controller.d.ts +0 -32
- package/dist/extensions/org-config.controller.js +0 -70
|
@@ -15,6 +15,7 @@ import { visibleTo } from "../agents/agent-lookup.js";
|
|
|
15
15
|
import { BG_WAKE_JOB, bgWakeJobId, wakeDecisionIn, } from "../background/wake-rules.js";
|
|
16
16
|
import { EventLog } from "../conversations/event-log.js";
|
|
17
17
|
import { dispatchQueuedIn, pauseQueueWith } from "../conversations/queue.js";
|
|
18
|
+
import { conversationTree } from "../conversations/tree.js";
|
|
18
19
|
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
19
20
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
20
21
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
@@ -27,6 +28,8 @@ import { ConversationLock } from "./conversation-lock.js";
|
|
|
27
28
|
import { MAINTENANCE_QUEUE_NAME } from "./maintenance-queue.js";
|
|
28
29
|
import { notifyFinished, RunFinish } from "./run-finish.js";
|
|
29
30
|
import { ACTIVE_RUN_STATUSES, RunJobs, runJobId, runQueueNameFor, } from "./run-jobs.js";
|
|
31
|
+
import { rootConversationOf } from "./subagents/child.js";
|
|
32
|
+
import { budgetWindowOf } from "./subagents/limits.js";
|
|
30
33
|
export { ACTIVE_RUN_STATUSES, RUN_QUEUE_NAME, runJobId, runQueueNameFor, SUBAGENT_RUN_QUEUE_NAME, } from "./run-jobs.js";
|
|
31
34
|
/**
|
|
32
35
|
* queued 运行的宽限期(秒):`ensureRun` / 续跑先提交 runs 行、再投递任务,两步之间任务暂时不存在;
|
|
@@ -98,9 +101,11 @@ let RunQueue = class RunQueue {
|
|
|
98
101
|
* 且没有 queued / running / waiting 的运行时:插入 `runs`(queued)并投递任务,返回 runId;否则返回 null。
|
|
99
102
|
*
|
|
100
103
|
* The boundary (`trigger_seq`) is that newest message; with none unconsumed, the queue's head
|
|
101
|
-
* once it is sent; with no head either, a wake-eligible finished background task
|
|
102
|
-
* Bash spec §3, {@link wakeDecisionIn}): the run is
|
|
103
|
-
*
|
|
104
|
+
* once it is sent; with no head either, a wake-eligible finished background task or sub-agent
|
|
105
|
+
* delivery (background Bash spec §3, agent map spec §5.3, {@link wakeDecisionIn}): the run is
|
|
106
|
+
* then attributed to the event's trigger account and joins the tree's budget window, and an
|
|
107
|
+
* event inside the wake window schedules the delayed `bg-wake` job instead. A sub-agent's
|
|
108
|
+
* conversation is only woken this way ({@link childWakeIn}).
|
|
104
109
|
*
|
|
105
110
|
* 孤儿清理(R29,按需进行,没有定时器):已有的 queued / running 运行若 BullMQ 任务已不存在、
|
|
106
111
|
* 会话锁也无人持有(queued 的还要超过宽限期),说明没有任何 worker 会再执行它——写
|
|
@@ -124,8 +129,14 @@ let RunQueue = class RunQueue {
|
|
|
124
129
|
pausedNow: false,
|
|
125
130
|
orphanStop: undefined,
|
|
126
131
|
wakeLater: null,
|
|
132
|
+
repairRunId: null,
|
|
127
133
|
};
|
|
128
134
|
const created = await this.ensureRunIn(conversationId, st);
|
|
135
|
+
if (st.repairRunId !== null) {
|
|
136
|
+
// a sub-agent's run nobody runs any more: requeued when queued, failed when running (its
|
|
137
|
+
// finish then reaches the parent through the wait sweep's undelivered repair)
|
|
138
|
+
await this.repairOrphan(conversationId, st.repairRunId);
|
|
139
|
+
}
|
|
129
140
|
if (st.wakeLater !== null) {
|
|
130
141
|
await this.scheduleWake(conversationId, st.wakeLater, opts.wakeRetry ?? 0);
|
|
131
142
|
}
|
|
@@ -155,10 +166,10 @@ let RunQueue = class RunQueue {
|
|
|
155
166
|
}
|
|
156
167
|
if (!created)
|
|
157
168
|
return null;
|
|
158
|
-
const { runId, jobId } = created;
|
|
169
|
+
const { runId, jobId, kind } = created;
|
|
159
170
|
try {
|
|
160
|
-
const queue = this.jobs.queue();
|
|
161
|
-
await this.jobs.
|
|
171
|
+
const queue = this.jobs.queue(runQueueNameFor(kind));
|
|
172
|
+
await this.jobs.enqueue({ runId, conversationId }, jobId, kind);
|
|
162
173
|
// 从 Redis 读回核对:检查与 add 之间出现了同 jobId 的任务时 add 被静默忽略,撤销本次插入,
|
|
163
174
|
// 不留下没有任务的 queued 行。读不到说明任务已被领取并移除(只可能是本次投递的),不撤销。
|
|
164
175
|
const stored = await queue.getJob(jobId);
|
|
@@ -197,11 +208,13 @@ let RunQueue = class RunQueue {
|
|
|
197
208
|
.forUpdate()
|
|
198
209
|
.executeTakeFirst();
|
|
199
210
|
// 评测回放的隐藏对话:运行由评测 worker 在里面直接驱动(工具只回放记录),绝不为它起真实运行
|
|
200
|
-
if (conv?.kind !== "chat")
|
|
211
|
+
if (conv?.kind !== "chat" && conv?.kind !== "subagent")
|
|
201
212
|
return null;
|
|
202
213
|
// A deleted conversation starts no run, whatever is still unconsumed or queued
|
|
203
214
|
if (conv.deleted_at !== null)
|
|
204
215
|
return null;
|
|
216
|
+
if (conv.kind === "subagent")
|
|
217
|
+
return this.childWakeIn(conversationId, conv, st);
|
|
205
218
|
const newest = await t
|
|
206
219
|
.selectFrom("conversation_events")
|
|
207
220
|
.select(["seq", "payload"])
|
|
@@ -210,6 +223,8 @@ let RunQueue = class RunQueue {
|
|
|
210
223
|
.orderBy("seq", "desc")
|
|
211
224
|
.limit(1)
|
|
212
225
|
.executeTakeFirst();
|
|
226
|
+
/** The boundary is a wake event: the run joins the tree's budget window (agent map §6). */
|
|
227
|
+
let isWake = false;
|
|
213
228
|
/** The run's boundary: its `trigger_seq` and the account it runs as. */
|
|
214
229
|
let last = newest && {
|
|
215
230
|
seq: newest.seq,
|
|
@@ -220,8 +235,8 @@ let RunQueue = class RunQueue {
|
|
|
220
235
|
: undefined;
|
|
221
236
|
if (idleActive && Number(idleActive.trigger_seq) > Number(conv.consumed_seq)) {
|
|
222
237
|
// No unconsumed message, but a run whose boundary is not consumed yet (a wake run, whose
|
|
223
|
-
// boundary is a finished background task): it goes through the
|
|
224
|
-
// that boundary, as a message's run does
|
|
238
|
+
// boundary is a finished background task or a sub-agent's delivery): it goes through the
|
|
239
|
+
// orphan check below with that boundary, as a message's run does
|
|
225
240
|
last = { seq: idleActive.trigger_seq, accountId: idleActive.trigger_account_id };
|
|
226
241
|
}
|
|
227
242
|
else if (!last || Number(last.seq) <= Number(conv.consumed_seq)) {
|
|
@@ -276,12 +291,13 @@ let RunQueue = class RunQueue {
|
|
|
276
291
|
else {
|
|
277
292
|
// Nothing queued either: a finished background task may wake the idle conversation
|
|
278
293
|
// (background Bash spec §3; a person's message or the queue always goes first)
|
|
279
|
-
const wake = await wakeDecisionIn(t, { id: conversationId, orgId: conv.org_id }, Number(conv.consumed_seq), this.config.get().runtime.wakeOnBackgroundTask, (accountId) => authorCanSend(t, conversationId, accountId));
|
|
294
|
+
const wake = await wakeDecisionIn(t, { id: conversationId, orgId: conv.org_id, rootId: conversationId }, Number(conv.consumed_seq), this.config.get().runtime.wakeOnBackgroundTask, (accountId) => authorCanSend(t, conversationId, accountId));
|
|
280
295
|
if (wake?.kind === "later")
|
|
281
296
|
st.wakeLater = wake;
|
|
282
297
|
if (wake?.kind !== "wake")
|
|
283
298
|
return null;
|
|
284
299
|
last = { seq: String(wake.seq), accountId: wake.triggerAccountId };
|
|
300
|
+
isWake = true;
|
|
285
301
|
}
|
|
286
302
|
}
|
|
287
303
|
const active = await this.activeRun(t, conversationId);
|
|
@@ -357,9 +373,170 @@ let RunQueue = class RunQueue {
|
|
|
357
373
|
agent_version: agent.current_version,
|
|
358
374
|
trigger_account_id: trigger.accountId,
|
|
359
375
|
trigger_seq: Number(trigger.seq),
|
|
376
|
+
// a chat conversation always has its person-triggered run before any wake (a wake event
|
|
377
|
+
// comes from a run of it or of its tree); null would only make the wake run its own window
|
|
378
|
+
budget_run_id: isWake ? await budgetWindowOf(t, conversationId) : null,
|
|
360
379
|
})
|
|
361
380
|
.execute();
|
|
362
|
-
return { runId, jobId };
|
|
381
|
+
return { runId, jobId, kind: "chat" };
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* {@link ensureRunIn} for a sub-agent's conversation (agent map spec §5.3), under its row lock.
|
|
385
|
+
* Its runs from a task, or from a message to an idle sub-agent, are started by the dispatch
|
|
386
|
+
* (`Agent`, `SendMessage`), which also records the dispatch. Here it is started from a parent's
|
|
387
|
+
* message that reached its run after that run's last model call (agent map spec §10: a message
|
|
388
|
+
* racing the run's end starts a new run, never lost); and it is woken by its own background
|
|
389
|
+
* task's finish or a delivery from its own sub-agent, under the same rules as a chat
|
|
390
|
+
* conversation. Neither happens once its last run was stopped (`aborted`): a stopped sub-agent is
|
|
391
|
+
* started again only by its parent. Both read the queue and the trigger account's access on the root
|
|
392
|
+
* of its tree; a message needs no wake setting and has no wake window. The run counts against
|
|
393
|
+
* the root's budget window and runs on the sub-agent queue under `runJobId(child, boundary
|
|
394
|
+
* seq)`. An active run is left to the orphan repair after the commit (`repairRunId`), never
|
|
395
|
+
* started past.
|
|
396
|
+
*/
|
|
397
|
+
async childWakeIn(conversationId, conv, st) {
|
|
398
|
+
const t = this.db;
|
|
399
|
+
const active = await this.activeRun(t, conversationId);
|
|
400
|
+
if (active) {
|
|
401
|
+
if (active.status !== "waiting")
|
|
402
|
+
st.repairRunId = active.id;
|
|
403
|
+
return null;
|
|
404
|
+
}
|
|
405
|
+
// a stopped sub-agent (its last run `aborted`: a person's or a tree stop) stays stopped: no
|
|
406
|
+
// message, task finish or delivery that reached it before or during the stop wakes it (a
|
|
407
|
+
// descendant's report that landed just before the stop would otherwise restart the stopped
|
|
408
|
+
// branch); they are parked for its next run, which only its parent starts (`Agent`,
|
|
409
|
+
// `SendMessage`)
|
|
410
|
+
const last = await t
|
|
411
|
+
.selectFrom("runs")
|
|
412
|
+
.select("status")
|
|
413
|
+
.where("conversation_id", "=", conversationId)
|
|
414
|
+
.orderBy("created_at", "desc")
|
|
415
|
+
.orderBy("id", "desc")
|
|
416
|
+
.limit(1)
|
|
417
|
+
.executeTakeFirst();
|
|
418
|
+
if (last?.status === "aborted")
|
|
419
|
+
return null;
|
|
420
|
+
const rootId = await rootConversationOf(t, conversationId);
|
|
421
|
+
const wake = (await this.pendingMessageIn(conversationId, Number(conv.consumed_seq), rootId)) ??
|
|
422
|
+
(await wakeDecisionIn(t, { id: conversationId, orgId: conv.org_id, rootId }, Number(conv.consumed_seq), this.config.get().runtime.wakeOnBackgroundTask, (accountId) => authorCanSend(t, rootId, accountId)));
|
|
423
|
+
if (wake?.kind === "later")
|
|
424
|
+
st.wakeLater = wake;
|
|
425
|
+
if (wake?.kind !== "wake")
|
|
426
|
+
return null;
|
|
427
|
+
const jobId = runJobId(conversationId, wake.seq);
|
|
428
|
+
const existing = await this.jobs.getJob(jobId, runQueueNameFor("subagent"));
|
|
429
|
+
if (existing) {
|
|
430
|
+
this.log.warn("run job for this trigger already exists; not enqueuing", {
|
|
431
|
+
conversationId,
|
|
432
|
+
jobId,
|
|
433
|
+
existingRunId: existing.data?.runId,
|
|
434
|
+
});
|
|
435
|
+
return null;
|
|
436
|
+
}
|
|
437
|
+
const agent = await t
|
|
438
|
+
.selectFrom("agents")
|
|
439
|
+
.select(["current_version", "deleted_at"])
|
|
440
|
+
.where("id", "=", conv.agent_id)
|
|
441
|
+
.executeTakeFirstOrThrow();
|
|
442
|
+
if (agent.deleted_at !== null)
|
|
443
|
+
return null;
|
|
444
|
+
// a sub-agent runs its definition frozen at dispatch: its runs keep the version recorded then
|
|
445
|
+
const previous = await t
|
|
446
|
+
.selectFrom("runs")
|
|
447
|
+
.select("agent_version")
|
|
448
|
+
.where("conversation_id", "=", conversationId)
|
|
449
|
+
.orderBy("created_at", "desc")
|
|
450
|
+
.limit(1)
|
|
451
|
+
.executeTakeFirst();
|
|
452
|
+
const runId = randomUUID();
|
|
453
|
+
await t
|
|
454
|
+
.insertInto("runs")
|
|
455
|
+
.values({
|
|
456
|
+
id: runId,
|
|
457
|
+
conversation_id: conversationId,
|
|
458
|
+
status: "queued",
|
|
459
|
+
agent_version: previous?.agent_version ?? agent.current_version,
|
|
460
|
+
trigger_account_id: wake.triggerAccountId,
|
|
461
|
+
trigger_seq: wake.seq,
|
|
462
|
+
budget_run_id: await budgetWindowOf(t, rootId),
|
|
463
|
+
})
|
|
464
|
+
.execute();
|
|
465
|
+
return { runId, jobId, kind: "subagent" };
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* The newest unconsumed message of an idle sub-agent (a `SendMessage` its last run did not absorb)
|
|
469
|
+
* as a run boundary, or null: none; the root's queue is paused or the root deleted (the
|
|
470
|
+
* message waits for the unpause, {@link wakeHeldTree}); or its author can no longer send to the
|
|
471
|
+
* root (it waits for a later run). The caller already refused a stopped sub-agent (last run
|
|
472
|
+
* `aborted`): a message that reached it while running and then stopped is parked, and the next
|
|
473
|
+
* run its parent starts absorbs it. Called under the sub-agent's row lock.
|
|
474
|
+
*/
|
|
475
|
+
async pendingMessageIn(conversationId, consumed, rootId) {
|
|
476
|
+
const t = this.db;
|
|
477
|
+
const message = await t
|
|
478
|
+
.selectFrom("conversation_events")
|
|
479
|
+
.select(["seq", "payload"])
|
|
480
|
+
.where("conversation_id", "=", conversationId)
|
|
481
|
+
.where("type", "=", "user_message")
|
|
482
|
+
.where("seq", ">", String(consumed))
|
|
483
|
+
.orderBy("seq", "desc")
|
|
484
|
+
.limit(1)
|
|
485
|
+
.executeTakeFirst();
|
|
486
|
+
if (!message)
|
|
487
|
+
return null;
|
|
488
|
+
const root = await t
|
|
489
|
+
.selectFrom("conversations")
|
|
490
|
+
.select(["queue_paused", "deleted_at"])
|
|
491
|
+
.where("id", "=", rootId)
|
|
492
|
+
.executeTakeFirst();
|
|
493
|
+
if (!root || root.queue_paused || root.deleted_at !== null)
|
|
494
|
+
return null;
|
|
495
|
+
const accountId = message.payload.authorAccountId;
|
|
496
|
+
if (!(await authorCanSend(t, rootId, accountId)))
|
|
497
|
+
return null;
|
|
498
|
+
return { kind: "wake", seq: Number(message.seq), triggerAccountId: accountId };
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Re-derives the wakes a paused root held for its tree (agent map spec §5.3: a paused root queue
|
|
502
|
+
* holds the wakes of the whole tree): after the root's queue is unpaused, {@link ensureRun} on
|
|
503
|
+
* every sub-agent conversation below it that has an unconsumed wake event or message and no
|
|
504
|
+
* active run (the root itself is the caller's own `ensureRun`). Errors are logged; the next
|
|
505
|
+
* event, run end or page opening of that conversation re-derives its wake.
|
|
506
|
+
*/
|
|
507
|
+
async wakeHeldTree(rootId) {
|
|
508
|
+
const ids = (await conversationTree(this.db, rootId))
|
|
509
|
+
.filter((c) => c.level > 0)
|
|
510
|
+
.map((c) => c.id);
|
|
511
|
+
if (ids.length === 0)
|
|
512
|
+
return;
|
|
513
|
+
const held = await this.db
|
|
514
|
+
.selectFrom("conversations as c")
|
|
515
|
+
.select("c.id")
|
|
516
|
+
.where("c.id", "in", ids)
|
|
517
|
+
.where("c.deleted_at", "is", null)
|
|
518
|
+
.where(({ exists, selectFrom }) => exists(selectFrom("conversation_events as e")
|
|
519
|
+
.select(sql `1`.as("one"))
|
|
520
|
+
.whereRef("e.conversation_id", "=", "c.id")
|
|
521
|
+
.where("e.type", "in", [
|
|
522
|
+
"background_task_finished",
|
|
523
|
+
"subagent_delivery",
|
|
524
|
+
"user_message",
|
|
525
|
+
])
|
|
526
|
+
.whereRef("e.seq", ">", "c.consumed_seq")))
|
|
527
|
+
.where(({ not, exists, selectFrom }) => not(exists(selectFrom("runs as r")
|
|
528
|
+
.select(sql `1`.as("one"))
|
|
529
|
+
.whereRef("r.conversation_id", "=", "c.id")
|
|
530
|
+
.where("r.status", "in", ACTIVE_RUN_STATUSES))))
|
|
531
|
+
.execute();
|
|
532
|
+
for (const c of held) {
|
|
533
|
+
try {
|
|
534
|
+
await this.ensureRun(c.id);
|
|
535
|
+
}
|
|
536
|
+
catch (err) {
|
|
537
|
+
this.log.warn("cannot wake a held sub-agent", { conversationId: c.id, err });
|
|
538
|
+
}
|
|
539
|
+
}
|
|
363
540
|
}
|
|
364
541
|
/**
|
|
365
542
|
* Schedules the delayed `bg-wake` job at the end of the conversation's wake window (after the
|
|
@@ -14,6 +14,7 @@ import { KyselyCheckpointSaver } from "./checkpointer.js";
|
|
|
14
14
|
import { ConversationLock } from "./conversation-lock.js";
|
|
15
15
|
import { ProviderRegistry } from "./providers.js";
|
|
16
16
|
import { type OrgQuota } from "./quota.js";
|
|
17
|
+
import { RunDrafts } from "./run-drafts.js";
|
|
17
18
|
import { RunFinish } from "./run-finish.js";
|
|
18
19
|
import type { RunJobData } from "./run-jobs.js";
|
|
19
20
|
import { RunQueue } from "./run-queue.js";
|
|
@@ -70,6 +71,8 @@ export declare class RunWorker {
|
|
|
70
71
|
private readonly pipeline;
|
|
71
72
|
private readonly finisher;
|
|
72
73
|
readonly txHost: TransactionHost;
|
|
74
|
+
/** The steps' live drafts this process writes for the runs it executes. */
|
|
75
|
+
private readonly drafts;
|
|
73
76
|
private readonly hooks?;
|
|
74
77
|
/** The two run queues' BullMQ workers (spec §7.4), once {@link start}ed on the worker role. */
|
|
75
78
|
private workers;
|
|
@@ -84,7 +87,7 @@ export declare class RunWorker {
|
|
|
84
87
|
/** 运行到达终态后删除该运行(thread_id = runId)的 checkpoint thread(只用于续跑,结束后无用)。 */
|
|
85
88
|
checkpoints: Pick<KyselyCheckpointSaver, "deleteThread">,
|
|
86
89
|
/** loop 返回 `suspended` 后把运行置为 waiting(释放会话锁与配额之后); the child lifecycle. */
|
|
87
|
-
waits: Pick<Waits, "suspend" | "childFinished" | "stopChildren">,
|
|
90
|
+
waits: Pick<Waits, "suspend" | "childFinished" | "stopChildren" | "stopDescendantsOfStopped">,
|
|
88
91
|
/** `run.started` (the channel outbound enqueues the conversation's IM delivery). */
|
|
89
92
|
events: KernelEvents,
|
|
90
93
|
/** A completed run enqueues the conversation's title job. */
|
|
@@ -98,7 +101,9 @@ export declare class RunWorker {
|
|
|
98
101
|
* (`stopOpenAgentCalls`; a no-op without dispatches); `fire` runs their observe hooks after the
|
|
99
102
|
* commit (sub-agents spec §12, review m1: a failed or stalled parent too).
|
|
100
103
|
*/
|
|
101
|
-
pipeline: Pick<ToolPipeline, "stopOpenAgentCalls">, finisher: Pick<RunFinish, "finish">, txHost: TransactionHost,
|
|
104
|
+
pipeline: Pick<ToolPipeline, "stopOpenAgentCalls">, finisher: Pick<RunFinish, "finish">, txHost: TransactionHost,
|
|
105
|
+
/** The steps' live drafts this process writes for the runs it executes. */
|
|
106
|
+
drafts: RunDrafts, hooks?: RunHooks | undefined);
|
|
102
107
|
private get db();
|
|
103
108
|
/**
|
|
104
109
|
* Starts consuming (worker role only): `workers` are the `@Processor` workers of both run queues
|
|
@@ -119,13 +124,14 @@ export declare class RunWorker {
|
|
|
119
124
|
/** A job failed (the worker's `failed` event). */
|
|
120
125
|
onFailed(job: Job<RunJobData> | undefined, err: Error): void;
|
|
121
126
|
/**
|
|
122
|
-
*
|
|
123
|
-
*
|
|
127
|
+
* The run's stream sink: deltas on the conversation's topic (any replica's subscribers get them)
|
|
128
|
+
* and the steps' live drafts in Redis ({@link streamSink}, spec 2026-11-07 §3.2).
|
|
124
129
|
*/
|
|
125
130
|
private sinkFor;
|
|
126
131
|
/**
|
|
127
132
|
* After any terminal commit of a run that is not a sub-agent's (sub-agents spec §12): stops its
|
|
128
|
-
* active
|
|
133
|
+
* active fork invocation child on its behalf (no account); background `Agent` children keep
|
|
134
|
+
* running (agent map spec §5.4). The wait sweep is the backstop.
|
|
129
135
|
*/
|
|
130
136
|
private stopChildren;
|
|
131
137
|
/**
|
|
@@ -164,7 +170,7 @@ export declare class RunWorker {
|
|
|
164
170
|
* model removed), writes `model_switched { model: null, effort: null, reason: "unavailable" }`
|
|
165
171
|
* for this run (idempotent) and clears the cached selection: the run and the next ones use the
|
|
166
172
|
* agent's model. A provider that only failed to list its models is not "gone" (the run's ladder
|
|
167
|
-
* handles it).
|
|
173
|
+
* handles it). Resolved for the conversation's org (its effective provider config).
|
|
168
174
|
*/
|
|
169
175
|
private fallBackIfUnavailable;
|
|
170
176
|
/**
|
|
@@ -10,7 +10,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
10
10
|
import { Inject, Injectable, Optional } from "@nestjs/common";
|
|
11
11
|
import { DelayedError } from "bullmq";
|
|
12
12
|
import { sql } from "kysely";
|
|
13
|
-
import {
|
|
13
|
+
import { EventLog } from "../conversations/event-log.js";
|
|
14
14
|
import { isAbsorbable, } from "../conversations/events.js";
|
|
15
15
|
import { effectiveDefinition, NO_SELECTION, readSelection, sameModel, sameSelection, } from "../conversations/selection.js";
|
|
16
16
|
import { TitleQueue } from "../conversations/titles.js";
|
|
@@ -32,10 +32,11 @@ import { ConversationLock } from "./conversation-lock.js";
|
|
|
32
32
|
import { RunError } from "./model-call.js";
|
|
33
33
|
import { ProviderListError, ProviderRegistry } from "./providers.js";
|
|
34
34
|
import { ORG_QUOTA_LEASE_MS, orgRunLimit, RUN_QUOTA } from "./quota.js";
|
|
35
|
+
import { RunDrafts, streamSink } from "./run-drafts.js";
|
|
35
36
|
import { RunFinish, TERMINAL_STATUSES } from "./run-finish.js";
|
|
36
37
|
import { RunQueue } from "./run-queue.js";
|
|
37
38
|
import { AgentLoops, RunSteps } from "./run-steps.js";
|
|
38
|
-
import { dispatchOfChildRun } from "./subagents/child.js";
|
|
39
|
+
import { dispatchOfChildRun, rootConversationOf } from "./subagents/child.js";
|
|
39
40
|
import { childRunDefinition } from "./subagents/definition.js";
|
|
40
41
|
import { forkBoundary } from "./subagents/skill-fork.js";
|
|
41
42
|
import { Waits } from "./waits.js";
|
|
@@ -86,6 +87,7 @@ let RunWorker = class RunWorker {
|
|
|
86
87
|
pipeline;
|
|
87
88
|
finisher;
|
|
88
89
|
txHost;
|
|
90
|
+
drafts;
|
|
89
91
|
hooks;
|
|
90
92
|
/** The two run queues' BullMQ workers (spec §7.4), once {@link start}ed on the worker role. */
|
|
91
93
|
workers = [];
|
|
@@ -114,7 +116,9 @@ let RunWorker = class RunWorker {
|
|
|
114
116
|
* (`stopOpenAgentCalls`; a no-op without dispatches); `fire` runs their observe hooks after the
|
|
115
117
|
* commit (sub-agents spec §12, review m1: a failed or stalled parent too).
|
|
116
118
|
*/
|
|
117
|
-
pipeline, finisher, txHost,
|
|
119
|
+
pipeline, finisher, txHost,
|
|
120
|
+
/** The steps' live drafts this process writes for the runs it executes. */
|
|
121
|
+
drafts, hooks) {
|
|
118
122
|
this.kdb = kdb;
|
|
119
123
|
this.eventLog = eventLog;
|
|
120
124
|
this.lock = lock;
|
|
@@ -134,6 +138,7 @@ let RunWorker = class RunWorker {
|
|
|
134
138
|
this.pipeline = pipeline;
|
|
135
139
|
this.finisher = finisher;
|
|
136
140
|
this.txHost = txHost;
|
|
141
|
+
this.drafts = drafts;
|
|
137
142
|
this.hooks = hooks;
|
|
138
143
|
this.loop = loops.create(steps.deps);
|
|
139
144
|
}
|
|
@@ -178,35 +183,16 @@ let RunWorker = class RunWorker {
|
|
|
178
183
|
}
|
|
179
184
|
}
|
|
180
185
|
/**
|
|
181
|
-
*
|
|
182
|
-
*
|
|
186
|
+
* The run's stream sink: deltas on the conversation's topic (any replica's subscribers get them)
|
|
187
|
+
* and the steps' live drafts in Redis ({@link streamSink}, spec 2026-11-07 §3.2).
|
|
183
188
|
*/
|
|
184
189
|
sinkFor(conversationId) {
|
|
185
|
-
|
|
186
|
-
let at = { runId: "", step: -1, chars: 0 };
|
|
187
|
-
return (d) => {
|
|
188
|
-
if (at.runId !== d.runId || at.step !== d.step || d.kind === "step_reset") {
|
|
189
|
-
at = { runId: d.runId, step: d.step, chars: 0 };
|
|
190
|
-
}
|
|
191
|
-
const offset = at.chars;
|
|
192
|
-
if (d.kind === "text")
|
|
193
|
-
at.chars += d.text?.length ?? 0;
|
|
194
|
-
const msg = {
|
|
195
|
-
kind: "delta",
|
|
196
|
-
runId: d.runId,
|
|
197
|
-
step: d.step,
|
|
198
|
-
delta: d.kind,
|
|
199
|
-
...(d.text !== undefined && { text: d.text }),
|
|
200
|
-
...(d.kind === "text" && { offset }),
|
|
201
|
-
};
|
|
202
|
-
this.bus
|
|
203
|
-
.publish(conversationTopic(conversationId), msg)
|
|
204
|
-
.catch((err) => this.log.warn("stream delta publish failed", { conversationId, err }));
|
|
205
|
-
};
|
|
190
|
+
return streamSink(conversationId, { bus: this.bus, drafts: this.drafts, log: this.log });
|
|
206
191
|
}
|
|
207
192
|
/**
|
|
208
193
|
* After any terminal commit of a run that is not a sub-agent's (sub-agents spec §12): stops its
|
|
209
|
-
* active
|
|
194
|
+
* active fork invocation child on its behalf (no account); background `Agent` children keep
|
|
195
|
+
* running (agent map spec §5.4). The wait sweep is the backstop.
|
|
210
196
|
*/
|
|
211
197
|
async stopChildren(runId) {
|
|
212
198
|
try {
|
|
@@ -228,6 +214,14 @@ let RunWorker = class RunWorker {
|
|
|
228
214
|
catch (err) {
|
|
229
215
|
this.log.error("cannot report finished sub-agent run to its parent", { runId, err });
|
|
230
216
|
}
|
|
217
|
+
// a sub-agent a person stopped stops its descendants too, also one it dispatched after the
|
|
218
|
+
// tree stop read the tree (agent map spec §6); any other end leaves them running
|
|
219
|
+
try {
|
|
220
|
+
await this.waits.stopDescendantsOfStopped(runId);
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
this.log.error("cannot stop the descendants of a stopped sub-agent", { runId, err });
|
|
224
|
+
}
|
|
231
225
|
}
|
|
232
226
|
/**
|
|
233
227
|
* 任务结束后的 ensureRun,失败按 {@link ENSURE_RETRY_DELAYS_MS} 退避重试;停机开始后不再等待间隔
|
|
@@ -369,6 +363,7 @@ let RunWorker = class RunWorker {
|
|
|
369
363
|
"trigger_seq",
|
|
370
364
|
"started_at",
|
|
371
365
|
"waited_ms",
|
|
366
|
+
"budget_run_id",
|
|
372
367
|
])
|
|
373
368
|
.where("id", "=", runId)
|
|
374
369
|
.executeTakeFirst();
|
|
@@ -386,7 +381,7 @@ let RunWorker = class RunWorker {
|
|
|
386
381
|
return;
|
|
387
382
|
const conv = await this.db
|
|
388
383
|
.selectFrom("conversations")
|
|
389
|
-
.select(["org_id", "agent_id", "kind"])
|
|
384
|
+
.select(["org_id", "agent_id", "kind", "subagent_depth"])
|
|
390
385
|
.where("id", "=", conversationId)
|
|
391
386
|
.executeTakeFirst();
|
|
392
387
|
if (!conv)
|
|
@@ -532,18 +527,36 @@ let RunWorker = class RunWorker {
|
|
|
532
527
|
maxSteps = Math.min(started.payload.maxSteps, runtime.maxSteps);
|
|
533
528
|
const row = await dispatchOfChildRun(this.db, runId);
|
|
534
529
|
const otherAgent = started.payload.template.source === "agent";
|
|
530
|
+
const parentConversationId = row?.parentConversationId ?? started.payload.parent.conversationId;
|
|
531
|
+
// a sub-agent conversation is at depth 1 at least: one written before depths were recorded
|
|
532
|
+
// (default 0) was a child of a root
|
|
533
|
+
const depth = Math.max(conv.subagent_depth, 1) - 1;
|
|
534
|
+
const rootConversationId = depth === 0
|
|
535
|
+
? parentConversationId
|
|
536
|
+
: await rootConversationOf(this.db, parentConversationId);
|
|
537
|
+
// the tree's budget window of THIS run (agent map spec §6): its own `budget_run_id`, set when
|
|
538
|
+
// it was created (a dispatch, or a wake run from the root's current window), else its
|
|
539
|
+
// dispatch's; never derived from the parent run, which for a wake run is the first dispatch's
|
|
540
|
+
const budgetRunId = run.budget_run_id ?? row?.budgetRunId;
|
|
535
541
|
parent = row
|
|
536
542
|
? {
|
|
537
543
|
conversationId: row.parentConversationId,
|
|
538
544
|
runId: row.parentRunId,
|
|
539
545
|
callId: row.parentCallId,
|
|
546
|
+
depth,
|
|
547
|
+
rootConversationId,
|
|
540
548
|
otherAgent,
|
|
549
|
+
...(budgetRunId !== undefined && { budgetRunId }),
|
|
550
|
+
...(row.forSkill === true && { forSkill: true }),
|
|
541
551
|
}
|
|
542
552
|
: {
|
|
543
553
|
conversationId: started.payload.parent.conversationId,
|
|
544
554
|
runId: started.payload.parent.runId,
|
|
545
555
|
callId: started.payload.parent.callId,
|
|
556
|
+
depth,
|
|
557
|
+
rootConversationId,
|
|
546
558
|
otherAgent,
|
|
559
|
+
...(budgetRunId !== undefined && { budgetRunId }),
|
|
547
560
|
};
|
|
548
561
|
}
|
|
549
562
|
else {
|
|
@@ -568,7 +581,7 @@ let RunWorker = class RunWorker {
|
|
|
568
581
|
if (run.status === "queued" || startedAt === null) {
|
|
569
582
|
if (!existingStart) {
|
|
570
583
|
if (saved !== undefined)
|
|
571
|
-
await this.fallBackIfUnavailable(conversationId, runId, saved);
|
|
584
|
+
await this.fallBackIfUnavailable(conv.org_id, conversationId, runId, saved);
|
|
572
585
|
const started = await this.appendRunStarted(conversationId, run, agent, saved);
|
|
573
586
|
agent = started.agent;
|
|
574
587
|
const toSeq = started.toSeq;
|
|
@@ -703,6 +716,10 @@ let RunWorker = class RunWorker {
|
|
|
703
716
|
});
|
|
704
717
|
return "finished";
|
|
705
718
|
}
|
|
719
|
+
finally {
|
|
720
|
+
// the execution here ended: what this process held of the run's drafts goes
|
|
721
|
+
this.drafts.release(runId);
|
|
722
|
+
}
|
|
706
723
|
if (state.abandoned)
|
|
707
724
|
return "abandoned";
|
|
708
725
|
// 锁在运行中丢失:无论 loop 返回什么都不写终态,任务回到队列由持锁者续跑。
|
|
@@ -772,14 +789,14 @@ let RunWorker = class RunWorker {
|
|
|
772
789
|
* model removed), writes `model_switched { model: null, effort: null, reason: "unavailable" }`
|
|
773
790
|
* for this run (idempotent) and clears the cached selection: the run and the next ones use the
|
|
774
791
|
* agent's model. A provider that only failed to list its models is not "gone" (the run's ladder
|
|
775
|
-
* handles it).
|
|
792
|
+
* handles it). Resolved for the conversation's org (its effective provider config).
|
|
776
793
|
*/
|
|
777
|
-
async fallBackIfUnavailable(conversationId, runId, agent) {
|
|
794
|
+
async fallBackIfUnavailable(orgId, conversationId, runId, agent) {
|
|
778
795
|
const sel = await readSelection(this.db, conversationId);
|
|
779
796
|
if (sel.model === null || sameModel(sel.model, agent.model))
|
|
780
797
|
return;
|
|
781
798
|
try {
|
|
782
|
-
await this.models.resolve(sel.model);
|
|
799
|
+
await this.models.resolve(orgId, sel.model);
|
|
783
800
|
return;
|
|
784
801
|
}
|
|
785
802
|
catch (e) {
|
|
@@ -816,7 +833,8 @@ let RunWorker = class RunWorker {
|
|
|
816
833
|
const agent = saved !== undefined
|
|
817
834
|
? effectiveDefinition(saved, await readSelection(t, conversationId))
|
|
818
835
|
: current;
|
|
819
|
-
// a wake run's boundary is a finished background task
|
|
836
|
+
// a wake run's boundary is a finished background task (background Bash §3) or a sub-agent's
|
|
837
|
+
// delivery (agent map spec §5.3), not a message
|
|
820
838
|
const boundary = await t
|
|
821
839
|
.selectFrom("conversation_events")
|
|
822
840
|
.select("type")
|
|
@@ -836,6 +854,10 @@ let RunWorker = class RunWorker {
|
|
|
836
854
|
trigger: "background_task",
|
|
837
855
|
triggerSeq: Number(run.trigger_seq),
|
|
838
856
|
}),
|
|
857
|
+
...(boundary?.type === "subagent_delivery" && {
|
|
858
|
+
trigger: "subagent",
|
|
859
|
+
triggerSeq: Number(run.trigger_seq),
|
|
860
|
+
}),
|
|
839
861
|
},
|
|
840
862
|
},
|
|
841
863
|
]);
|
|
@@ -927,7 +949,8 @@ RunWorker = __decorate([
|
|
|
927
949
|
__param(18, Inject(ToolPipeline)),
|
|
928
950
|
__param(19, Inject(RunFinish)),
|
|
929
951
|
__param(20, Inject(TransactionHost)),
|
|
930
|
-
__param(21,
|
|
931
|
-
__param(
|
|
952
|
+
__param(21, Inject(RunDrafts)),
|
|
953
|
+
__param(22, Optional()),
|
|
954
|
+
__param(22, Inject(RUN_HOOKS))
|
|
932
955
|
], RunWorker);
|
|
933
956
|
export { RunWorker };
|
|
@@ -25,6 +25,7 @@ import { MAINTENANCE_QUEUE_NAME } from "./maintenance-queue.js";
|
|
|
25
25
|
import { ProvidersModule } from "./providers.js";
|
|
26
26
|
import { EVAL_QUOTA, EVAL_QUOTA_PREFIX, OrgQuota, RUN_QUOTA, RUN_QUOTA_PREFIX } from "./quota.js";
|
|
27
27
|
import { RunControl } from "./run-control.js";
|
|
28
|
+
import { RunDrafts } from "./run-drafts.js";
|
|
28
29
|
import { RunFinish } from "./run-finish.js";
|
|
29
30
|
import { RunJobsModule } from "./run-jobs.js";
|
|
30
31
|
import { RunQueue } from "./run-queue.js";
|
|
@@ -75,6 +76,7 @@ RuntimeModule = __decorate([
|
|
|
75
76
|
Waits,
|
|
76
77
|
DecisionResumer,
|
|
77
78
|
RunControl,
|
|
79
|
+
RunDrafts,
|
|
78
80
|
AgentLoops,
|
|
79
81
|
RunSteps,
|
|
80
82
|
RunWorker,
|
|
@@ -102,6 +104,7 @@ RuntimeModule = __decorate([
|
|
|
102
104
|
RunQueue,
|
|
103
105
|
Waits,
|
|
104
106
|
RunControl,
|
|
107
|
+
RunDrafts,
|
|
105
108
|
AgentLoops,
|
|
106
109
|
RunSteps,
|
|
107
110
|
RunWorker,
|
|
@@ -19,11 +19,16 @@ export declare class StepLog {
|
|
|
19
19
|
constructor(kdb: KernelDb, eventLog: EventLog, txHost: TransactionHost);
|
|
20
20
|
/**
|
|
21
21
|
* Appends events of a sub-agent's run and adds the tokens of the usage events it newly wrote to
|
|
22
|
-
* the
|
|
23
|
-
*
|
|
24
|
-
*
|
|
22
|
+
* the `subagent_tokens_used` of the tree's budget run (sub-agents spec §8.3, agent map spec §6:
|
|
23
|
+
* the whole tree counts on one run): `counter.budgetRunId`, the run's own window
|
|
24
|
+
* (`SubagentParent.budgetRunId`), else the parent run's ({@link budgetRunOf}). A usage event
|
|
25
|
+
* already in the log (an idempotent hit after a crash) adds nothing, so each call counts exactly
|
|
26
|
+
* once. Returns what was written (hits included) and the highest new seq (null: nothing new).
|
|
25
27
|
*/
|
|
26
|
-
appendCounted(conversationId: string,
|
|
28
|
+
appendCounted(conversationId: string, counter: {
|
|
29
|
+
parentRunId: string;
|
|
30
|
+
budgetRunId?: string | undefined;
|
|
31
|
+
}, events: AppendEvent[]): Promise<{
|
|
27
32
|
written: ConversationEvent[];
|
|
28
33
|
toSeq: number | null;
|
|
29
34
|
}>;
|
package/dist/runtime/step-log.js
CHANGED
|
@@ -16,6 +16,7 @@ import { KernelDb } from "../infra/database/kernel-db.js";
|
|
|
16
16
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
17
17
|
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
18
18
|
import { recordToolSpecs } from "../tools/specs.js";
|
|
19
|
+
import { budgetRunOf } from "./subagents/limits.js";
|
|
19
20
|
/**
|
|
20
21
|
* The writes of a run step that go to the event log together with another row, each in a
|
|
21
22
|
* transaction of its own (the caller notifies the log after the commit): a model call with the
|
|
@@ -33,11 +34,13 @@ let StepLog = class StepLog {
|
|
|
33
34
|
}
|
|
34
35
|
/**
|
|
35
36
|
* Appends events of a sub-agent's run and adds the tokens of the usage events it newly wrote to
|
|
36
|
-
* the
|
|
37
|
-
*
|
|
38
|
-
*
|
|
37
|
+
* the `subagent_tokens_used` of the tree's budget run (sub-agents spec §8.3, agent map spec §6:
|
|
38
|
+
* the whole tree counts on one run): `counter.budgetRunId`, the run's own window
|
|
39
|
+
* (`SubagentParent.budgetRunId`), else the parent run's ({@link budgetRunOf}). A usage event
|
|
40
|
+
* already in the log (an idempotent hit after a crash) adds nothing, so each call counts exactly
|
|
41
|
+
* once. Returns what was written (hits included) and the highest new seq (null: nothing new).
|
|
39
42
|
*/
|
|
40
|
-
async appendCounted(conversationId,
|
|
43
|
+
async appendCounted(conversationId, counter, events) {
|
|
41
44
|
const t = this.kdb.db;
|
|
42
45
|
// the conversation row lock the append takes anyway, taken first to read the seq before it
|
|
43
46
|
const before = await t
|
|
@@ -56,7 +59,7 @@ let StepLog = class StepLog {
|
|
|
56
59
|
await t
|
|
57
60
|
.updateTable("runs")
|
|
58
61
|
.set({ subagent_tokens_used: sql `subagent_tokens_used + ${tokens}` })
|
|
59
|
-
.where("id", "=", parentRunId)
|
|
62
|
+
.where("id", "=", counter.budgetRunId ?? (await budgetRunOf(t, counter.parentRunId)))
|
|
60
63
|
.execute();
|
|
61
64
|
}
|
|
62
65
|
return { written, toSeq: fresh.length > 0 ? Math.max(...fresh.map((e) => e.seq)) : null };
|