@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
package/dist/runtime/loop.d.ts
CHANGED
|
@@ -22,8 +22,8 @@ export interface LoopContext {
|
|
|
22
22
|
shutdown: AbortSignal;
|
|
23
23
|
sink: StreamSink;
|
|
24
24
|
/**
|
|
25
|
-
* 下一个步骤间隙要吸收的事件:返回 seq > afterSeq 的可吸收事件(`user_message
|
|
26
|
-
* `background_task_finished`, `isAbsorbable`;且只含本轮开始时尚未被消费的,
|
|
25
|
+
* 下一个步骤间隙要吸收的事件:返回 seq > afterSeq 的可吸收事件(`user_message`、
|
|
26
|
+
* `background_task_finished` 与 `subagent_delivery`, `isAbsorbable`;且只含本轮开始时尚未被消费的,
|
|
27
27
|
* 即 seq 也大于会话的 `consumed_seq`),按 seq 升序。loop 记录吸收到的最大 seq 作为 `consumedUpToSeq`。
|
|
28
28
|
*/
|
|
29
29
|
pendingAbsorbable(afterSeq: number): Promise<AbsorbableEvent[]>;
|
|
@@ -37,21 +37,49 @@ export interface LoopContext {
|
|
|
37
37
|
*/
|
|
38
38
|
conversationKind?: "chat" | "eval" | "subagent";
|
|
39
39
|
/**
|
|
40
|
-
* Set for a sub-agent's run (phase C): the dispatch this run serves. Its tools use the
|
|
41
|
-
* conversation's sandbox (spec §10.1), and it
|
|
40
|
+
* Set for a sub-agent's run (phase C): the dispatch this run serves. Its tools use the root
|
|
41
|
+
* conversation's sandbox (spec §10.1), and it dispatches sub-agents only while its depth is
|
|
42
|
+
* below `subagents.maxDepth` (agent map spec §4.1).
|
|
42
43
|
*/
|
|
43
44
|
parent?: SubagentParent;
|
|
45
|
+
/**
|
|
46
|
+
* The run is a sub-agent's without a live `parent`: a child case's eval replay. Its requests
|
|
47
|
+
* offer the message tools a sub-agent has (`SendMessage`, `SubagentHandback`), as the recorded
|
|
48
|
+
* run's did; not for a fork invocation's child (`SubagentParent.forSkill`). Implied by `parent`.
|
|
49
|
+
*/
|
|
50
|
+
subagent?: boolean;
|
|
44
51
|
}
|
|
45
52
|
/** Where a sub-agent's run was dispatched from (its `subagent_dispatches` row). */
|
|
46
53
|
export interface SubagentParent {
|
|
47
54
|
conversationId: string;
|
|
48
55
|
runId: string;
|
|
49
56
|
callId: string;
|
|
57
|
+
/**
|
|
58
|
+
* The parent conversation's depth below the root (0: the parent is the root); this run's own
|
|
59
|
+
* depth is one more (agent map spec §6, `conversations.subagent_depth`).
|
|
60
|
+
*/
|
|
61
|
+
depth: number;
|
|
62
|
+
/** The root conversation of the tree: its sandbox is the one every sub-agent works in. */
|
|
63
|
+
rootConversationId: string;
|
|
50
64
|
/**
|
|
51
65
|
* The child runs another org agent than its parent conversation's (§5.5, `template.source`
|
|
52
66
|
* `agent`): only then the parent agent's current policies are read on top of its own.
|
|
53
67
|
*/
|
|
54
68
|
otherAgent?: boolean;
|
|
69
|
+
/**
|
|
70
|
+
* The tree's budget run of this child run (agent map spec §6): the run's own `budget_run_id`
|
|
71
|
+
* (a dispatched run's, or a wake run's current window of the root), else its dispatch row's, read
|
|
72
|
+
* once when the run starts. The loop's budget check and the token counter (`appendCounted`) use
|
|
73
|
+
* it; absent only when unknown, then read with `budgetRunOf(runId)` (the parent run's window,
|
|
74
|
+
* stale for a wake run, whose `runId` is the first dispatch's).
|
|
75
|
+
*/
|
|
76
|
+
budgetRunId?: string;
|
|
77
|
+
/**
|
|
78
|
+
* The run is a person's fork invocation's child (phase D, its dispatch's `for_skill`): its parent
|
|
79
|
+
* run waits for its final reply as the skill's report, so it gets neither `SubagentHandback` nor
|
|
80
|
+
* `SendMessage` to its parent (agent map spec §5.4: the fork's behaviour does not change).
|
|
81
|
+
*/
|
|
82
|
+
forSkill?: boolean;
|
|
55
83
|
}
|
|
56
84
|
/**
|
|
57
85
|
* 运行在等什么人处理:审批(`approvals` 行)或输入请求(`questions` 行,统一承载 `AskUserQuestion`、
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { WorkerHost } from "@nestjs/bullmq";
|
|
2
2
|
import type { Job, Queue, Worker } from "bullmq";
|
|
3
|
+
import { OwnedPluginCleanup } from "../catalog/owned-plugin-cleanup.js";
|
|
3
4
|
import { ScheduledRuns } from "../infra/schedule/scheduled-runs.js";
|
|
4
5
|
import type { KernelLogger } from "../log.js";
|
|
5
6
|
import { DirectorySync } from "../orgs/directory-sync.js";
|
|
@@ -12,9 +13,10 @@ export { MAINTENANCE_QUEUE_NAME } from "./maintenance-queue.js";
|
|
|
12
13
|
export declare const MAINTENANCE_CONCURRENCY = 5;
|
|
13
14
|
/**
|
|
14
15
|
* The one consumer of `cap-kernel-maintenance` (decision R11 of the Nest kernel spec): dispatches
|
|
15
|
-
* each one-off job by name to its domain (`wait-timeout` → {@link Waits}, `sandbox-destroy-for`
|
|
16
|
-
* {@link SandboxService}, `drift-connector` → {@link ToolDrift}, `directory-sync` →
|
|
17
|
-
* {@link DirectorySync}, `bg-wake` → {@link RunQueue.ensureRun}
|
|
16
|
+
* each one-off job by name to its domain (`wait-timeout` → {@link Waits}, `sandbox-destroy-for` and
|
|
17
|
+
* `sandbox-reset-files` → {@link SandboxService}, `drift-connector` → {@link ToolDrift}, `directory-sync` →
|
|
18
|
+
* {@link DirectorySync}, `bg-wake` → {@link RunQueue.ensureRun}, `owned-plugin-cleanup` →
|
|
19
|
+
* {@link OwnedPluginCleanup}). The name of a periodic job (a `@LockedCron` / `@LockedInterval` job,
|
|
18
20
|
* such as `sandbox-suspend-idle`) runs that job's body once ({@link ScheduledRuns.runNow}), as the
|
|
19
21
|
* maintenance handlers did when those jobs were schedulers on this queue: an operator's or a
|
|
20
22
|
* test's one-off run, not a second schedule (decision R23 of the Nest kernel spec). Any other
|
|
@@ -26,10 +28,11 @@ export declare class MaintenanceProcessor extends WorkerHost<Worker> {
|
|
|
26
28
|
private readonly drift;
|
|
27
29
|
private readonly directory;
|
|
28
30
|
private readonly runs;
|
|
31
|
+
private readonly ownedCleanup;
|
|
29
32
|
private readonly scheduled;
|
|
30
33
|
private readonly log;
|
|
31
34
|
private readonly queue;
|
|
32
|
-
constructor(waits: Pick<Waits, "processTimeout">, sandbox: Pick<SandboxService, "
|
|
35
|
+
constructor(waits: Pick<Waits, "processTimeout">, sandbox: Pick<SandboxService, "destroyEnvironment" | "resetFileSystem">, drift: Pick<ToolDrift, "check">, directory: Pick<DirectorySync, "runSyncJob">, runs: Pick<RunQueue, "ensureRun">, ownedCleanup: Pick<OwnedPluginCleanup, "run">, scheduled: Pick<ScheduledRuns, "runNow">, log: Pick<KernelLogger, "error" | "warn">, queue: Pick<Queue, "removeJobScheduler">);
|
|
33
36
|
/**
|
|
34
37
|
* Removes the retired job schedulers (`RETIRED_SCHEDULER_IDS`, runtime/retired-schedulers.ts): every fixed-period
|
|
35
38
|
* maintenance job is a `@LockedCron` / `@LockedInterval` now. Idempotent; called once when a
|
|
@@ -10,6 +10,8 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
10
10
|
import { getQueueToken, OnWorkerEvent, WorkerHost } from "@nestjs/bullmq";
|
|
11
11
|
import { Inject, Injectable, Module } from "@nestjs/common";
|
|
12
12
|
import { BG_WAKE_JOB } from "../background/wake-rules.js";
|
|
13
|
+
import { OWNED_PLUGIN_CLEANUP_JOB } from "../catalog/job-ids.js";
|
|
14
|
+
import { OwnedPluginCleanup, OwnedPluginCleanupModule } from "../catalog/owned-plugin-cleanup.js";
|
|
13
15
|
import { configuredProcessor } from "../infra/queue/configured-processor.js";
|
|
14
16
|
import { QueueModule } from "../infra/queue/queue.module.js";
|
|
15
17
|
import { removeRetiredSchedulers } from "../infra/queue/retired-schedulers.js";
|
|
@@ -19,7 +21,7 @@ import { ScheduledRuns } from "../infra/schedule/scheduled-runs.js";
|
|
|
19
21
|
import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
20
22
|
import { DIRECTORY_SYNC_JOB, DirectorySync } from "../orgs/directory-sync.js";
|
|
21
23
|
import { OrgsModule } from "../orgs/orgs.module.js";
|
|
22
|
-
import { runSandboxDestroyFor, SANDBOX_DESTROY_FOR_JOB } from "../sandbox/jobs.js";
|
|
24
|
+
import { runSandboxDestroyFor, runSandboxResetFiles, SANDBOX_DESTROY_FOR_JOB, SANDBOX_RESET_FILES_JOB, } from "../sandbox/jobs.js";
|
|
23
25
|
import { SandboxModule } from "../sandbox/sandbox.module.js";
|
|
24
26
|
import { SandboxService } from "../sandbox/sandbox.service.js";
|
|
25
27
|
import { ToolDrift } from "../tools/drift.js";
|
|
@@ -35,9 +37,10 @@ export { MAINTENANCE_QUEUE_NAME } from "./maintenance-queue.js";
|
|
|
35
37
|
export const MAINTENANCE_CONCURRENCY = 5;
|
|
36
38
|
/**
|
|
37
39
|
* The one consumer of `cap-kernel-maintenance` (decision R11 of the Nest kernel spec): dispatches
|
|
38
|
-
* each one-off job by name to its domain (`wait-timeout` → {@link Waits}, `sandbox-destroy-for`
|
|
39
|
-
* {@link SandboxService}, `drift-connector` → {@link ToolDrift}, `directory-sync` →
|
|
40
|
-
* {@link DirectorySync}, `bg-wake` → {@link RunQueue.ensureRun}
|
|
40
|
+
* each one-off job by name to its domain (`wait-timeout` → {@link Waits}, `sandbox-destroy-for` and
|
|
41
|
+
* `sandbox-reset-files` → {@link SandboxService}, `drift-connector` → {@link ToolDrift}, `directory-sync` →
|
|
42
|
+
* {@link DirectorySync}, `bg-wake` → {@link RunQueue.ensureRun}, `owned-plugin-cleanup` →
|
|
43
|
+
* {@link OwnedPluginCleanup}). The name of a periodic job (a `@LockedCron` / `@LockedInterval` job,
|
|
41
44
|
* such as `sandbox-suspend-idle`) runs that job's body once ({@link ScheduledRuns.runNow}), as the
|
|
42
45
|
* maintenance handlers did when those jobs were schedulers on this queue: an operator's or a
|
|
43
46
|
* test's one-off run, not a second schedule (decision R23 of the Nest kernel spec). Any other
|
|
@@ -49,16 +52,18 @@ let MaintenanceProcessor = class MaintenanceProcessor extends WorkerHost {
|
|
|
49
52
|
drift;
|
|
50
53
|
directory;
|
|
51
54
|
runs;
|
|
55
|
+
ownedCleanup;
|
|
52
56
|
scheduled;
|
|
53
57
|
log;
|
|
54
58
|
queue;
|
|
55
|
-
constructor(waits, sandbox, drift, directory, runs, scheduled, log, queue) {
|
|
59
|
+
constructor(waits, sandbox, drift, directory, runs, ownedCleanup, scheduled, log, queue) {
|
|
56
60
|
super();
|
|
57
61
|
this.waits = waits;
|
|
58
62
|
this.sandbox = sandbox;
|
|
59
63
|
this.drift = drift;
|
|
60
64
|
this.directory = directory;
|
|
61
65
|
this.runs = runs;
|
|
66
|
+
this.ownedCleanup = ownedCleanup;
|
|
62
67
|
this.scheduled = scheduled;
|
|
63
68
|
this.log = log;
|
|
64
69
|
this.queue = queue;
|
|
@@ -86,6 +91,9 @@ let MaintenanceProcessor = class MaintenanceProcessor extends WorkerHost {
|
|
|
86
91
|
case SANDBOX_DESTROY_FOR_JOB:
|
|
87
92
|
await runSandboxDestroyFor(this.sandbox, this.log, job);
|
|
88
93
|
return;
|
|
94
|
+
case SANDBOX_RESET_FILES_JOB:
|
|
95
|
+
await runSandboxResetFiles(this.sandbox, job);
|
|
96
|
+
return;
|
|
89
97
|
case DRIFT_CONNECTOR_JOB: {
|
|
90
98
|
const { orgId, connectorId, trigger } = job.data;
|
|
91
99
|
await this.drift.check(orgId, connectorId, trigger);
|
|
@@ -101,6 +109,10 @@ let MaintenanceProcessor = class MaintenanceProcessor extends WorkerHost {
|
|
|
101
109
|
await this.runs.ensureRun(conversationId, { wakeRetry: (retry ?? 0) + 1 });
|
|
102
110
|
return;
|
|
103
111
|
}
|
|
112
|
+
// a removed org-owned plugin's extension (plugin scope phase 3, P3-20)
|
|
113
|
+
case OWNED_PLUGIN_CLEANUP_JOB:
|
|
114
|
+
await this.ownedCleanup.run(job.data.itemId);
|
|
115
|
+
return;
|
|
104
116
|
default:
|
|
105
117
|
if (await this.scheduled.runNow(job.name))
|
|
106
118
|
return;
|
|
@@ -127,9 +139,10 @@ MaintenanceProcessor = __decorate([
|
|
|
127
139
|
__param(2, Inject(ToolDrift)),
|
|
128
140
|
__param(3, Inject(DirectorySync)),
|
|
129
141
|
__param(4, Inject(RunQueue)),
|
|
130
|
-
__param(5, Inject(
|
|
131
|
-
__param(6, Inject(
|
|
132
|
-
__param(7, Inject(
|
|
142
|
+
__param(5, Inject(OwnedPluginCleanup)),
|
|
143
|
+
__param(6, Inject(ScheduledRuns)),
|
|
144
|
+
__param(7, Inject(KERNEL_LOGGER)),
|
|
145
|
+
__param(8, Inject(getQueueToken(MAINTENANCE_QUEUE_NAME)))
|
|
133
146
|
], MaintenanceProcessor);
|
|
134
147
|
export { MaintenanceProcessor };
|
|
135
148
|
/**
|
|
@@ -149,6 +162,8 @@ MaintenanceModule = __decorate([
|
|
|
149
162
|
SandboxModule,
|
|
150
163
|
ToolsModule,
|
|
151
164
|
OrgsModule,
|
|
165
|
+
// the removed org plugins' cleanup and its daily sweep (worker-only through this module)
|
|
166
|
+
OwnedPluginCleanupModule,
|
|
152
167
|
QueueModule.registerQueue(MAINTENANCE_QUEUE_NAME),
|
|
153
168
|
],
|
|
154
169
|
providers: [
|
|
@@ -14,17 +14,28 @@ import type { StepLog } from "./step-log.js";
|
|
|
14
14
|
import type { UsageReporter } from "./usage-report.js";
|
|
15
15
|
/** 单轮收尾的尾部提醒(模型可见,英文;spec 6 轮次额度收尾)。 */
|
|
16
16
|
export declare const WRAP_UP_REMINDER = "Step limit reached. Do not call tools. Summarize what you found and what remains for the user.";
|
|
17
|
-
/**
|
|
18
|
-
|
|
17
|
+
/**
|
|
18
|
+
* The tail reminder of a sub-agent's final call once its tree used its token budget (model-visible,
|
|
19
|
+
* English; sub-agents spec §8.3): the child hands back what it found instead of ending with nothing.
|
|
20
|
+
*/
|
|
21
|
+
export declare const BUDGET_WRAP_UP_REMINDER: string;
|
|
22
|
+
/** Why a run makes its final, tool-less call: its step limit, or its tree's token budget. */
|
|
23
|
+
export type WrapUpReason = "max_steps" | "budget";
|
|
24
|
+
export { TOOLS_UNSUPPORTED_REMINDER } from "./context/reminders.js";
|
|
19
25
|
/** 不可用工具提醒的前缀(模型可见,英文)。 */
|
|
20
26
|
export declare const TOOLS_UNAVAILABLE_PREFIX = "The following tools are unavailable in this run: ";
|
|
21
27
|
/** 本 run 中此前有工具不可用、现在全部恢复时的提醒(模型可见,英文)。 */
|
|
22
28
|
export declare const TOOLS_AVAILABLE_AGAIN = "All previously unavailable tools are available again.";
|
|
23
29
|
/** 不可用工具提醒:`The following tools are unavailable in this run: <ref> (<reason>), ...`。 */
|
|
24
30
|
export declare function toolsUnavailableReminder(unavailable: readonly UnavailableTool[]): string;
|
|
25
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
* 流式增量的出口(推给前端等订阅方);`step_reset` 表示丢弃本步已推出的增量、重新开始。
|
|
33
|
+
* `stream_end` (the step's model stream completed) and `step_end` (the step's `assistant_message`
|
|
34
|
+
* is logged) carry no delta: the run worker's sink writes and then clears the step's live draft on
|
|
35
|
+
* them (spec 2026-11-07 §3.2) and publishes neither.
|
|
36
|
+
*/
|
|
26
37
|
export type StreamSink = (delta: {
|
|
27
|
-
kind: "text" | "thinking" | "step_reset";
|
|
38
|
+
kind: "text" | "thinking" | "step_reset" | "stream_end" | "step_end";
|
|
28
39
|
runId: string;
|
|
29
40
|
step: number;
|
|
30
41
|
text?: string;
|
|
@@ -95,9 +106,12 @@ export interface ModelStepInput {
|
|
|
95
106
|
conversationKind?: ConversationKindForHooks;
|
|
96
107
|
/** A sub-agent's run: where it was dispatched from (hook payloads carry it as `parent`). */
|
|
97
108
|
parent?: SubagentParent;
|
|
109
|
+
/** A sub-agent's run without a live parent (a child case's eval replay, `LoopContext`). */
|
|
110
|
+
subagent?: boolean;
|
|
98
111
|
/**
|
|
99
|
-
* A sub-agent's run (phase C): the parent run whose `subagent_tokens_used` counts
|
|
100
|
-
* event this step writes (step, wrap-up and compaction calls; spec §8.3
|
|
112
|
+
* A sub-agent's run (phase C): the parent run whose budget run's `subagent_tokens_used` counts
|
|
113
|
+
* every usage event this step writes (step, wrap-up and compaction calls; spec §8.3, agent map
|
|
114
|
+
* spec §6).
|
|
101
115
|
*/
|
|
102
116
|
parentRunId?: string;
|
|
103
117
|
/**
|
|
@@ -150,13 +164,16 @@ export declare function runModelStep(deps: ModelStepDeps, input: ModelStepInput)
|
|
|
150
164
|
* 单轮收尾:到达步数上限时调用一次。写入收尾 `reminder`(位于请求末尾);照常带工具(历史里有工具调用时
|
|
151
165
|
* 部分供应商要求请求声明工具,也保持缓存前缀稳定),但 `toolChoice: "none"`——模型只能回复文本。
|
|
152
166
|
* 其余与 `runModelStep` 相同(幂等、降级、中止)。
|
|
167
|
+
*
|
|
168
|
+
* `reason: "budget"`: a sub-agent whose tree used its token budget makes this one call to hand back
|
|
169
|
+
* what it found (sub-agents spec §8.3); it is not stopped by the budget again (one call over).
|
|
153
170
|
*/
|
|
154
|
-
export declare function runFinalWrapUp(deps: ModelStepDeps, input: ModelStepInput): Promise<ModelStepResult>;
|
|
171
|
+
export declare function runFinalWrapUp(deps: ModelStepDeps, input: ModelStepInput, reason?: WrapUpReason): Promise<ModelStepResult>;
|
|
155
172
|
/**
|
|
156
173
|
* Appends a model call's events (its reply or compaction outcome with its `usage`; also the usage
|
|
157
174
|
* of a `WebFetch` extraction call, `tools/builtins/web/extract.ts`). For a
|
|
158
175
|
* sub-agent's run (`input.parentRunId`) in one transaction that also adds the tokens of the usage
|
|
159
|
-
* events it newly wrote to the
|
|
176
|
+
* events it newly wrote to the budget run's `subagent_tokens_used` (sub-agents spec §8.3): a usage
|
|
160
177
|
* event already in the log (an idempotent hit after a crash) adds nothing, so each call counts
|
|
161
178
|
* exactly once.
|
|
162
179
|
*/
|
|
@@ -166,6 +183,11 @@ export declare function appendCounted(deps: {
|
|
|
166
183
|
}, input: {
|
|
167
184
|
conversationId: string;
|
|
168
185
|
parentRunId?: string | undefined;
|
|
186
|
+
/** The run's budget window (agent map spec §6), when known; else the parent run's. */
|
|
187
|
+
budgetRunId?: string | undefined;
|
|
188
|
+
parent?: {
|
|
189
|
+
budgetRunId?: string | undefined;
|
|
190
|
+
} | undefined;
|
|
169
191
|
}, events: AppendEvent[]): Promise<ConversationEvent[]>;
|
|
170
192
|
/** {@link assembleModelRequest} 的输入。 */
|
|
171
193
|
export interface AssembleModelRequestInput extends Omit<BuildModelRequestInput, "tools"> {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
1
2
|
import { isModelError, isRetryableKind, ModelError, sanitizeParams, } from "@capybara-hq/plugin-sdk";
|
|
2
3
|
import { MEDIA_EXCLUDED_MAX_IDS } from "../conversations/events.js";
|
|
3
4
|
import { ApiError } from "../errors.js";
|
|
@@ -6,16 +7,23 @@ import { hasInvocation, skillLoadOffered } from "../skills/catalog.js";
|
|
|
6
7
|
import { buildModelRequest, latestSummary, mediaRefs, planMedia, } from "./context/build.js";
|
|
7
8
|
import { acceptSummary, buildCompactionRequest, compactionBackoff, compactionPlan, shouldCompact, } from "./context/compaction.js";
|
|
8
9
|
import { guardToolPairs } from "./context/pairing.js";
|
|
9
|
-
import { turnLimitReminder } from "./context/reminders.js";
|
|
10
|
+
import { TOOLS_UNSUPPORTED_REMINDER, turnLimitReminder } from "./context/reminders.js";
|
|
10
11
|
import { calibrate, estimateTokens } from "./context/tokens.js";
|
|
12
|
+
import { toolSetChange } from "./context/tool-changes.js";
|
|
11
13
|
import { fireObserve, hookDeniedAudit, hookDeniedEvent, hookRequestOf, hookScope, recordHookDenial, } from "./hook-calls.js";
|
|
12
14
|
import { MediaCache } from "./media-cache.js";
|
|
13
15
|
import { ProviderListError } from "./providers.js";
|
|
14
|
-
import { subagentBudgetUsedUp } from "./subagents/limits.js";
|
|
16
|
+
import { budgetRunOf, subagentBudgetUsedUp } from "./subagents/limits.js";
|
|
15
17
|
/** 单轮收尾的尾部提醒(模型可见,英文;spec 6 轮次额度收尾)。 */
|
|
16
18
|
export const WRAP_UP_REMINDER = "Step limit reached. Do not call tools. Summarize what you found and what remains for the user.";
|
|
17
|
-
/**
|
|
18
|
-
|
|
19
|
+
/**
|
|
20
|
+
* The tail reminder of a sub-agent's final call once its tree used its token budget (model-visible,
|
|
21
|
+
* English; sub-agents spec §8.3): the child hands back what it found instead of ending with nothing.
|
|
22
|
+
*/
|
|
23
|
+
export const BUDGET_WRAP_UP_REMINDER = "The sub-agents' token budget is used up, so this is your last reply. Do not call tools. " +
|
|
24
|
+
"Report what you found so far, with the sources and details that matter, and what remains " +
|
|
25
|
+
"unfinished.";
|
|
26
|
+
export { TOOLS_UNSUPPORTED_REMINDER } from "./context/reminders.js";
|
|
19
27
|
/** 不可用工具提醒的前缀(模型可见,英文)。 */
|
|
20
28
|
export const TOOLS_UNAVAILABLE_PREFIX = "The following tools are unavailable in this run: ";
|
|
21
29
|
/** 本 run 中此前有工具不可用、现在全部恢复时的提醒(模型可见,英文)。 */
|
|
@@ -70,6 +78,10 @@ const idem = {
|
|
|
70
78
|
reminder: (runId, step) => `reminder:${runId}:${step}`,
|
|
71
79
|
toolsUnavailable: (runId, step) => `tools_unavailable:${runId}:${step}`,
|
|
72
80
|
toolsUnsupported: (runId, step) => `tools_unsupported:${runId}:${step}`,
|
|
81
|
+
toolsChanged: (runId, step, keys) => `tools_changed:${runId}:${step}:${createHash("sha256")
|
|
82
|
+
.update(JSON.stringify([...keys].sort()))
|
|
83
|
+
.digest("hex")
|
|
84
|
+
.slice(0, 16)}`,
|
|
73
85
|
modelCall: modelCallIdemKey,
|
|
74
86
|
hookDenied: (runId, step, attempt) => `hook_denied:${runId}:${step}:${attempt}`,
|
|
75
87
|
/** Usage of a compaction call: `n` is the compaction attempt (consecutive failures + 1). */
|
|
@@ -88,18 +100,24 @@ class StepAborted extends Error {
|
|
|
88
100
|
* 模型看到的一切先写进日志(`model_call` / `reminder` / `compaction_summary`),请求可由日志还原。
|
|
89
101
|
*/
|
|
90
102
|
export function runModelStep(deps, input) {
|
|
91
|
-
return runStep(deps, input,
|
|
103
|
+
return runStep(deps, input, null);
|
|
92
104
|
}
|
|
93
105
|
/**
|
|
94
106
|
* 单轮收尾:到达步数上限时调用一次。写入收尾 `reminder`(位于请求末尾);照常带工具(历史里有工具调用时
|
|
95
107
|
* 部分供应商要求请求声明工具,也保持缓存前缀稳定),但 `toolChoice: "none"`——模型只能回复文本。
|
|
96
108
|
* 其余与 `runModelStep` 相同(幂等、降级、中止)。
|
|
109
|
+
*
|
|
110
|
+
* `reason: "budget"`: a sub-agent whose tree used its token budget makes this one call to hand back
|
|
111
|
+
* what it found (sub-agents spec §8.3); it is not stopped by the budget again (one call over).
|
|
97
112
|
*/
|
|
98
|
-
export function runFinalWrapUp(deps, input) {
|
|
99
|
-
return runStep(deps, input,
|
|
113
|
+
export function runFinalWrapUp(deps, input, reason = "max_steps") {
|
|
114
|
+
return runStep(deps, input, reason);
|
|
100
115
|
}
|
|
101
|
-
async function runStep(deps, input,
|
|
102
|
-
|
|
116
|
+
async function runStep(deps, input,
|
|
117
|
+
/** The final call's reason, or null for an ordinary step. */
|
|
118
|
+
wrapUpReason) {
|
|
119
|
+
const wrapUp = wrapUpReason !== null;
|
|
120
|
+
const { conversationId, runId, step, signal, sink } = input;
|
|
103
121
|
const existing = await findExisting(deps.eventLog, conversationId, runId, step);
|
|
104
122
|
if (existing) {
|
|
105
123
|
// resumed after a crash between writing usage and enqueueing it: enqueue again (job id dedupes)
|
|
@@ -108,6 +126,8 @@ async function runStep(deps, input, wrapUp) {
|
|
|
108
126
|
if (u)
|
|
109
127
|
void deps.usageReport.enqueue(conversationId, u.seq);
|
|
110
128
|
}
|
|
129
|
+
// a crash between the assistant_message and clearing its draft leaves one behind
|
|
130
|
+
sink({ kind: "step_end", runId, step });
|
|
111
131
|
return existing;
|
|
112
132
|
}
|
|
113
133
|
const runtime = deps.config.get().runtime;
|
|
@@ -117,6 +137,11 @@ async function runStep(deps, input, wrapUp) {
|
|
|
117
137
|
if (signal.aborted)
|
|
118
138
|
throw new StepAborted();
|
|
119
139
|
let events = await readAll(deps.eventLog, conversationId);
|
|
140
|
+
// an earlier execution of this run already sent this step (it streamed, then crashed or was
|
|
141
|
+
// handed over): this one starts at offset 0, so viewers drop that attempt's draft first
|
|
142
|
+
if (events.some((e) => e.type === "model_call" && e.runId === runId && e.payload.step === step)) {
|
|
143
|
+
sink({ kind: "step_reset", runId, step });
|
|
144
|
+
}
|
|
120
145
|
// sticky (M-4): a model.request denial already logged for this step (any attempt, e.g. a crash
|
|
121
146
|
// after recording it) is final: fail the same way, before compaction or any model call. Read from
|
|
122
147
|
// the events just loaded, so it costs no query (M-2).
|
|
@@ -132,6 +157,8 @@ async function runStep(deps, input, wrapUp) {
|
|
|
132
157
|
const resolved = await deps.tools.forAgent(input.orgId, {
|
|
133
158
|
tools: input.agent.tools ?? [],
|
|
134
159
|
subagents: input.agent.subagents,
|
|
160
|
+
child: input.parent !== undefined || input.parentRunId !== undefined || input.subagent === true,
|
|
161
|
+
forkChild: input.parent?.forSkill === true,
|
|
135
162
|
skillLoad: skillLoadOffered(events.findLast((e) => e.type === "skills_catalog"), hasInvocation(events)),
|
|
136
163
|
});
|
|
137
164
|
const tools = {
|
|
@@ -147,10 +174,12 @@ async function runStep(deps, input, wrapUp) {
|
|
|
147
174
|
const beforeCompaction = events.length;
|
|
148
175
|
events = await maybeCompact(deps, input, events, runtime, tools);
|
|
149
176
|
// a sub-agent checks its budget again after a compaction call, so the step's own request is
|
|
150
|
-
// not a second call over the cap (review M5; the loop checks before each step)
|
|
151
|
-
|
|
177
|
+
// not a second call over the cap (review M5; the loop checks before each step); the budget
|
|
178
|
+
// wrap-up is the one call allowed over it
|
|
179
|
+
if (wrapUpReason !== "budget" &&
|
|
180
|
+
input.parentRunId !== undefined &&
|
|
152
181
|
events.length !== beforeCompaction &&
|
|
153
|
-
(await subagentBudgetUsedUp(deps.db, deps.config, input.orgId, input.parentRunId))) {
|
|
182
|
+
(await subagentBudgetUsedUp(deps.db, deps.config, input.orgId, input.parent?.budgetRunId ?? (await budgetRunOf(deps.db, input.parentRunId))))) {
|
|
154
183
|
return {
|
|
155
184
|
content: [],
|
|
156
185
|
stopReason: "end_turn",
|
|
@@ -160,6 +189,19 @@ async function runStep(deps, input, wrapUp) {
|
|
|
160
189
|
budget: true,
|
|
161
190
|
};
|
|
162
191
|
}
|
|
192
|
+
// the tool set changed since the previous request (an extension switched on, a sub-agent
|
|
193
|
+
// roster added): tell the model before this request (tool naming spec §9.1). Keyed by the new
|
|
194
|
+
// set, so a retried step finds it in the log (previousToolSet applies it) and writes nothing
|
|
195
|
+
const toolKeys = resolved.tools.map((t) => t.key);
|
|
196
|
+
const change = toolSetChange(events, toolKeys);
|
|
197
|
+
if (change !== null) {
|
|
198
|
+
events = await appendLocal(deps.eventLog, conversationId, events, {
|
|
199
|
+
type: "tools_changed",
|
|
200
|
+
runId,
|
|
201
|
+
idemKey: idem.toolsChanged(runId, step, toolKeys),
|
|
202
|
+
payload: { step, ...change },
|
|
203
|
+
});
|
|
204
|
+
}
|
|
163
205
|
const last = lastToolsReminder(events, runId);
|
|
164
206
|
// 有不可用工具 → 列出;此前列过、现在全部恢复 → 说明已恢复,避免过时的「不可用」成为最后一句
|
|
165
207
|
// (收尾调用不得调用工具,可用性变化不写)。
|
|
@@ -181,7 +223,7 @@ async function runStep(deps, input, wrapUp) {
|
|
|
181
223
|
});
|
|
182
224
|
}
|
|
183
225
|
}
|
|
184
|
-
const { outcome, ref } = await ladder(deps, input, events, runtime, tools,
|
|
226
|
+
const { outcome, ref } = await ladder(deps, input, events, runtime, tools, wrapUpReason, streamed);
|
|
185
227
|
// assistant_message 与 usage 同一次 append = 同一事务。
|
|
186
228
|
const appended = await appendCounted(deps, input, [
|
|
187
229
|
{
|
|
@@ -201,6 +243,7 @@ async function runStep(deps, input, wrapUp) {
|
|
|
201
243
|
const usageEvent = appended.find((e) => e.type === "usage");
|
|
202
244
|
if (deps.usageReport && usageEvent)
|
|
203
245
|
void deps.usageReport.enqueue(conversationId, usageEvent.seq);
|
|
246
|
+
sink({ kind: "step_end", runId, step });
|
|
204
247
|
return {
|
|
205
248
|
content: outcome.content,
|
|
206
249
|
stopReason: outcome.stopReason,
|
|
@@ -222,6 +265,7 @@ async function runStep(deps, input, wrapUp) {
|
|
|
222
265
|
payload: { step, content, stopReason: "aborted" },
|
|
223
266
|
},
|
|
224
267
|
]);
|
|
268
|
+
sink({ kind: "step_end", runId, step });
|
|
225
269
|
return { content, stopReason: "aborted", reused: false, aborted: true, usage: null };
|
|
226
270
|
}
|
|
227
271
|
}
|
|
@@ -229,7 +273,7 @@ async function runStep(deps, input, wrapUp) {
|
|
|
229
273
|
* Appends a model call's events (its reply or compaction outcome with its `usage`; also the usage
|
|
230
274
|
* of a `WebFetch` extraction call, `tools/builtins/web/extract.ts`). For a
|
|
231
275
|
* sub-agent's run (`input.parentRunId`) in one transaction that also adds the tokens of the usage
|
|
232
|
-
* events it newly wrote to the
|
|
276
|
+
* events it newly wrote to the budget run's `subagent_tokens_used` (sub-agents spec §8.3): a usage
|
|
233
277
|
* event already in the log (an idempotent hit after a crash) adds nothing, so each call counts
|
|
234
278
|
* exactly once.
|
|
235
279
|
*/
|
|
@@ -237,7 +281,8 @@ export async function appendCounted(deps, input, events) {
|
|
|
237
281
|
const { conversationId, parentRunId } = input;
|
|
238
282
|
if (parentRunId === undefined)
|
|
239
283
|
return deps.eventLog.append(conversationId, events);
|
|
240
|
-
const
|
|
284
|
+
const budgetRunId = input.budgetRunId ?? input.parent?.budgetRunId;
|
|
285
|
+
const out = await deps.stepLog.appendCounted(conversationId, { parentRunId, ...(budgetRunId !== undefined && { budgetRunId }) }, events);
|
|
241
286
|
if (out.toSeq !== null)
|
|
242
287
|
await deps.eventLog.notify(conversationId, out.toSeq);
|
|
243
288
|
return out.written;
|
|
@@ -658,11 +703,14 @@ function mergeLocal(events, written) {
|
|
|
658
703
|
* 每次实际尝试写自己的 `model_call`(attempt 从 1 连续递增,跳过的不计);重试前经 sink 发 `step_reset`。
|
|
659
704
|
* 不可重试的失败或梯子用尽 → `RunError`。
|
|
660
705
|
*/
|
|
661
|
-
async function ladder(deps, input, events, runtime, tools,
|
|
706
|
+
async function ladder(deps, input, events, runtime, tools, wrapUpReason, streamed) {
|
|
662
707
|
const { conversationId, runId, step, signal, sink, agent } = input;
|
|
663
|
-
const
|
|
664
|
-
|
|
665
|
-
|
|
708
|
+
const wrapUp = wrapUpReason !== null;
|
|
709
|
+
const turnReminder = wrapUpReason === "budget"
|
|
710
|
+
? BUDGET_WRAP_UP_REMINDER
|
|
711
|
+
: wrapUp
|
|
712
|
+
? WRAP_UP_REMINDER
|
|
713
|
+
: turnLimitReminder(step, input.maxSteps ?? runtime.maxSteps);
|
|
666
714
|
let evs = events;
|
|
667
715
|
const rungs = [
|
|
668
716
|
{ ref: agent.model, fallback: false },
|
|
@@ -785,6 +833,8 @@ async function ladder(deps, input, events, runtime, tools, wrapUp, streamed) {
|
|
|
785
833
|
sink({ kind: "thinking", runId, step, text: ev.text });
|
|
786
834
|
}
|
|
787
835
|
});
|
|
836
|
+
// the draft's last write, before the assistant_message is logged
|
|
837
|
+
sink({ kind: "stream_end", runId, step });
|
|
788
838
|
if (scope && deps.hooks) {
|
|
789
839
|
fireObserve(deps.hooks, "model.response", {
|
|
790
840
|
...scope,
|
|
@@ -13,9 +13,11 @@ export declare class RunControl {
|
|
|
13
13
|
private readonly abort;
|
|
14
14
|
private readonly events;
|
|
15
15
|
private readonly log;
|
|
16
|
-
constructor(queue: Pick<RunQueue, "ensureRun" | "abortIfOrphaned">, waits: Pick<Waits, "abortWaiting" | "childFinished" | "stopChildren">, abort: Pick<RunAbort, "request">, events: KernelEvents, log: Pick<KernelLogger, "error">);
|
|
16
|
+
constructor(queue: Pick<RunQueue, "ensureRun" | "abortIfOrphaned" | "wakeHeldTree">, waits: Pick<Waits, "abortWaiting" | "childFinished" | "stopChildren" | "stopTree">, abort: Pick<RunAbort, "request">, events: KernelEvents, log: Pick<KernelLogger, "error">);
|
|
17
17
|
/** 有未消费的消息且没有进行中的运行时投递一轮运行;返回 runId 或 null。 */
|
|
18
18
|
ensureRun(conversationId: string): Promise<string | null>;
|
|
19
|
+
/** After a root's queue was unpaused: the wakes it held for its tree ({@link RunQueue.wakeHeldTree}). */
|
|
20
|
+
wakeHeldTree(rootId: string): Promise<void>;
|
|
19
21
|
/**
|
|
20
22
|
* 运行是孤儿(会话锁空闲、任务已不存在,没有 worker 会收到中止广播)时直接把它写成 aborted,返回 true;
|
|
21
23
|
* 否则返回 false。A stopped sub-agent then reports to its parent at once, and a stopped parent
|
|
@@ -28,6 +30,14 @@ export declare class RunControl {
|
|
|
28
30
|
* changed: `run.wait-stopped` lets the channel outbound update them.
|
|
29
31
|
*/
|
|
30
32
|
abortWaiting(conversationId: string, runId: string, byAccountId: string | null): Promise<boolean>;
|
|
33
|
+
/**
|
|
34
|
+
* Stops a sub-agent with its descendants, or with `includeSelf: false` only the sub-agent
|
|
35
|
+
* conversations below `conversationId` (agent map spec §6; {@link Waits.stopTree}). Returns
|
|
36
|
+
* the number of runs asked to stop.
|
|
37
|
+
*/
|
|
38
|
+
stopTree(conversationId: string, byAccountId: string | null, opts?: {
|
|
39
|
+
includeSelf?: boolean;
|
|
40
|
+
}): Promise<number>;
|
|
31
41
|
/** 请求中止运行(广播到所有副本)。 */
|
|
32
42
|
requestAbort(runId: string, byAccountId: string | null): Promise<void>;
|
|
33
43
|
}
|
|
@@ -34,6 +34,10 @@ let RunControl = class RunControl {
|
|
|
34
34
|
ensureRun(conversationId) {
|
|
35
35
|
return this.queue.ensureRun(conversationId);
|
|
36
36
|
}
|
|
37
|
+
/** After a root's queue was unpaused: the wakes it held for its tree ({@link RunQueue.wakeHeldTree}). */
|
|
38
|
+
wakeHeldTree(rootId) {
|
|
39
|
+
return this.queue.wakeHeldTree(rootId);
|
|
40
|
+
}
|
|
37
41
|
/**
|
|
38
42
|
* 运行是孤儿(会话锁空闲、任务已不存在,没有 worker 会收到中止广播)时直接把它写成 aborted,返回 true;
|
|
39
43
|
* 否则返回 false。A stopped sub-agent then reports to its parent at once, and a stopped parent
|
|
@@ -61,6 +65,14 @@ let RunControl = class RunControl {
|
|
|
61
65
|
await this.events.emit("run.wait-stopped", { conversationId, runId });
|
|
62
66
|
return r;
|
|
63
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Stops a sub-agent with its descendants, or with `includeSelf: false` only the sub-agent
|
|
70
|
+
* conversations below `conversationId` (agent map spec §6; {@link Waits.stopTree}). Returns
|
|
71
|
+
* the number of runs asked to stop.
|
|
72
|
+
*/
|
|
73
|
+
stopTree(conversationId, byAccountId, opts = {}) {
|
|
74
|
+
return this.waits.stopTree(conversationId, byAccountId, opts);
|
|
75
|
+
}
|
|
64
76
|
/** 请求中止运行(广播到所有副本)。 */
|
|
65
77
|
requestAbort(runId, byAccountId) {
|
|
66
78
|
return this.abort.request(runId, byAccountId);
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { ExtensionContext, Logger } from "@capybara-hq/plugin-sdk";
|
|
2
|
+
import type { Redis } from "ioredis";
|
|
3
|
+
import { EventLog } from "../conversations/event-log.js";
|
|
4
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
5
|
+
import { type StreamSink } from "./model-call.js";
|
|
6
|
+
/** How long a draft lives without a write (a step that keeps streaming keeps refreshing it). */
|
|
7
|
+
export declare const DRAFT_TTL_SECONDS = 600;
|
|
8
|
+
/** At most one write per step per window, plus the one at the end of the model stream. */
|
|
9
|
+
export declare const DRAFT_FLUSH_MS = 200;
|
|
10
|
+
/** One step's draft: `{ text, thinking }` as JSON (spec 2026-11-07 §3.2). */
|
|
11
|
+
export declare const draftKey: (runId: string, step: number) => string;
|
|
12
|
+
/** What one step of a run has streamed so far. */
|
|
13
|
+
export interface RunDraft {
|
|
14
|
+
step: number;
|
|
15
|
+
text: string;
|
|
16
|
+
thinking: string;
|
|
17
|
+
}
|
|
18
|
+
/** A draft of a conversation's active run (the `event: draft` frame's data). */
|
|
19
|
+
export interface LiveDraft extends RunDraft {
|
|
20
|
+
runId: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Live drafts (spec 2026-11-07-run-input-and-live-drafts §3.2): what each step of a running run
|
|
24
|
+
* has streamed so far, kept in Redis so a viewer that (re)connects on any replica gets the text
|
|
25
|
+
* already shown, then the deltas from there on.
|
|
26
|
+
*
|
|
27
|
+
* The writer is the process executing the run: it holds the step's draft in memory (only for the
|
|
28
|
+
* runs it executes; {@link release} drops them when the execution ends) and writes it at most once
|
|
29
|
+
* per {@link DRAFT_FLUSH_MS}: on the first delta past the window, or, when deltas stop inside it,
|
|
30
|
+
* by one trailing one-shot timer per held step (process-local, unref'd, cancelled by a write,
|
|
31
|
+
* {@link clear} and {@link release}), plus once when the model stream ends ({@link flush}). Writes are issued before the delta is published, on the same
|
|
32
|
+
* connection as the bus publish, so a viewer that sees a delta past its snapshot and asks again
|
|
33
|
+
* gets a draft at least that far whenever that delta was written. Every write refreshes the
|
|
34
|
+
* {@link DRAFT_TTL_SECONDS} TTL; {@link clear} deletes the step's draft once its
|
|
35
|
+
* `assistant_message` is logged or the step is reset. Redis failures are logged, never thrown to
|
|
36
|
+
* the run: a draft is a convenience, the log stays the truth.
|
|
37
|
+
*/
|
|
38
|
+
export declare class RunDrafts {
|
|
39
|
+
private readonly redis;
|
|
40
|
+
private readonly kdb;
|
|
41
|
+
private readonly eventLog;
|
|
42
|
+
private readonly log;
|
|
43
|
+
private readonly held;
|
|
44
|
+
constructor(redis: Redis, kdb: KernelDb, eventLog: Pick<EventLog, "findByIdem">, log: Pick<Logger, "warn">);
|
|
45
|
+
private get db();
|
|
46
|
+
/** Adds a delta to the step's draft; writes it when the last write is a window old. */
|
|
47
|
+
append(runId: string, step: number, channel: "text" | "thinking", text: string): void;
|
|
48
|
+
/** The end of the step's model stream: writes what the window still holds. */
|
|
49
|
+
flush(runId: string, step: number): void;
|
|
50
|
+
/** Deletes the step's draft (its `assistant_message` is logged, or the step starts over). */
|
|
51
|
+
clear(runId: string, step: number): void;
|
|
52
|
+
/**
|
|
53
|
+
* Drops what this process holds for the run (its execution here ended: finished, suspended,
|
|
54
|
+
* handed over). Redis keeps what was written: another worker may continue the run, and a step
|
|
55
|
+
* that never ended is not shown once the run is no longer running (TTL removes it).
|
|
56
|
+
*/
|
|
57
|
+
release(runId: string): void;
|
|
58
|
+
/** The run's steps with a draft, by step. */
|
|
59
|
+
read(runId: string): Promise<RunDraft[]>;
|
|
60
|
+
/**
|
|
61
|
+
* The drafts a viewer of the conversation is shown: steps of its running run (or only `runId`)
|
|
62
|
+
* whose `assistant_message` is not logged. Redis is read before the log, so a step finalized
|
|
63
|
+
* meanwhile is either skipped here or its `assistant_message` reaches the viewer after the draft.
|
|
64
|
+
*/
|
|
65
|
+
live(conversationId: string, runId?: string): Promise<LiveDraft[]>;
|
|
66
|
+
/** Whether the run belongs to the conversation (the draft route's 404). */
|
|
67
|
+
runOf(conversationId: string, runId: string): Promise<boolean>;
|
|
68
|
+
private drop;
|
|
69
|
+
private write;
|
|
70
|
+
}
|
|
71
|
+
/** What {@link streamSink} uses. */
|
|
72
|
+
export interface StreamSinkDeps {
|
|
73
|
+
bus: Pick<ExtensionContext["bus"], "publish">;
|
|
74
|
+
drafts: Pick<RunDrafts, "append" | "flush" | "clear">;
|
|
75
|
+
log: Pick<Logger, "warn">;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The run's stream sink (one per execution of a run): publishes deltas on the conversation's topic
|
|
79
|
+
* (`conv.<id>`, shared with `{ kind: "events" }`, so a subscriber on any replica gets them) with
|
|
80
|
+
* `offset`, the characters of that channel (text or thinking) this attempt of the step streamed
|
|
81
|
+
* before the delta, and keeps the step's live draft. `step_reset` clears the draft and both
|
|
82
|
+
* offsets; `stream_end` / `step_end` only flush / clear the draft and are not published. A failed
|
|
83
|
+
* publish is only logged: deltas are drafts, the `assistant_message` in the log is the truth.
|
|
84
|
+
*/
|
|
85
|
+
export declare function streamSink(conversationId: string, deps: StreamSinkDeps): StreamSink;
|