@capybara-hq/kernel 0.1.0-rc.3 → 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 +47 -16
- package/dist/admin/admin.controller.js +44 -19
- package/dist/admin/extensions.controller.d.ts +24 -3
- package/dist/admin/extensions.controller.js +48 -8
- 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 +19 -0
- package/dist/agents/agent-lookup.js +21 -0
- package/dist/agents/agent-profile.service.d.ts +29 -0
- package/dist/agents/agent-profile.service.js +117 -0
- package/dist/agents/agents.controller.d.ts +168 -3
- package/dist/agents/agents.controller.js +201 -12
- package/dist/agents/agents.module.d.ts +4 -1
- package/dist/agents/agents.module.js +36 -6
- package/dist/agents/agents.service.d.ts +64 -27
- package/dist/agents/agents.service.js +199 -74
- package/dist/agents/definition.d.ts +53 -0
- package/dist/agents/definition.js +55 -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/instruction-files.d.ts +60 -0
- package/dist/agents/instruction-files.js +111 -0
- package/dist/agents/models.controller.d.ts +9 -3
- package/dist/agents/models.controller.js +19 -4
- 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/profile.d.ts +96 -0
- package/dist/agents/profile.js +51 -0
- package/dist/agents/readiness.controller.d.ts +26 -0
- package/dist/agents/readiness.controller.js +56 -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 +476 -53
- package/dist/background/background.controller.d.ts +38 -0
- package/dist/background/background.controller.js +87 -0
- package/dist/background/background.module.d.ts +10 -0
- package/dist/background/background.module.js +39 -0
- package/dist/background/finish.d.ts +44 -0
- package/dist/background/finish.js +94 -0
- package/dist/background/launch-lock.d.ts +15 -0
- package/dist/background/launch-lock.js +40 -0
- package/dist/background/launch.d.ts +36 -0
- package/dist/background/launch.js +70 -0
- package/dist/background/poll.job.d.ts +56 -0
- package/dist/background/poll.job.js +190 -0
- package/dist/background/render.d.ts +23 -0
- package/dist/background/render.js +48 -0
- package/dist/background/session.d.ts +48 -0
- package/dist/background/session.js +79 -0
- package/dist/background/status.d.ts +35 -0
- package/dist/background/status.js +57 -0
- package/dist/background/stop.d.ts +68 -0
- package/dist/background/stop.js +243 -0
- package/dist/background/store.d.ts +162 -0
- package/dist/background/store.js +357 -0
- package/dist/background/store.module.d.ts +6 -0
- package/dist/background/store.module.js +22 -0
- package/dist/background/tasks.service.d.ts +77 -0
- package/dist/background/tasks.service.js +211 -0
- package/dist/background/wake-rules.d.ts +66 -0
- package/dist/background/wake-rules.js +113 -0
- package/dist/background/wake.d.ts +30 -0
- package/dist/background/wake.js +63 -0
- 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/claude/agents.js +2 -0
- 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 +623 -83
- 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 +1148 -1137
- 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 +21 -3
- package/dist/channels/channels.module.js +2 -0
- package/dist/channels/connections.service.d.ts +16 -1
- package/dist/channels/connections.service.js +38 -4
- 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/channels/threads.d.ts +5 -0
- package/dist/channels/threads.js +8 -0
- package/dist/config/docs.js +3 -1
- package/dist/config/schema.d.ts +24 -2
- package/dist/config/schema.js +145 -19
- package/dist/conversations/access.d.ts +6 -4
- package/dist/conversations/access.js +29 -5
- package/dist/conversations/agent-tree.d.ts +46 -0
- package/dist/conversations/agent-tree.js +92 -0
- package/dist/conversations/attachments.service.d.ts +30 -0
- package/dist/conversations/attachments.service.js +130 -5
- package/dist/conversations/conversations.controller.d.ts +79 -23
- package/dist/conversations/conversations.controller.js +141 -50
- package/dist/conversations/conversations.module.d.ts +1 -1
- package/dist/conversations/conversations.module.js +10 -7
- package/dist/conversations/conversations.service.d.ts +108 -9
- package/dist/conversations/conversations.service.js +237 -30
- package/dist/conversations/environment-status.d.ts +24 -0
- package/dist/conversations/environment-status.js +71 -0
- package/dist/conversations/event-log.d.ts +21 -6
- package/dist/conversations/event-log.js +70 -1
- package/dist/conversations/events.d.ts +140 -0
- package/dist/conversations/events.js +142 -13
- package/dist/conversations/queue.d.ts +3 -1
- package/dist/conversations/queue.js +13 -2
- package/dist/conversations/queue.service.d.ts +1 -1
- package/dist/conversations/queue.service.js +8 -1
- package/dist/conversations/titles.d.ts +12 -3
- package/dist/conversations/titles.js +36 -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 +420 -20
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +3 -0
- 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 +90 -2
- package/dist/errors.js +90 -2
- package/dist/evals/reconstruct.d.ts +18 -9
- package/dist/evals/reconstruct.js +26 -7
- package/dist/evals/run-replay.d.ts +7 -2
- package/dist/evals/run-replay.js +42 -7
- package/dist/evals/step-replay.d.ts +2 -5
- package/dist/evals/step-replay.js +13 -7
- package/dist/evals/trajectory.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 +67 -42
- package/dist/extensions/admin-view.d.ts +39 -10
- package/dist/extensions/admin-view.js +111 -20
- package/dist/extensions/blobs.js +1 -0
- 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-issues.d.ts +13 -1
- package/dist/extensions/config-issues.js +22 -5
- package/dist/extensions/config-json-schema.d.ts +43 -7
- package/dist/extensions/config-json-schema.js +124 -58
- package/dist/extensions/deployment-config-store.d.ts +6 -0
- package/dist/extensions/deployment-config.d.ts +78 -8
- package/dist/extensions/deployment-config.js +172 -34
- package/dist/extensions/display-name.d.ts +22 -0
- package/dist/extensions/display-name.js +77 -0
- package/dist/extensions/effective-config.d.ts +127 -0
- package/dist/extensions/effective-config.js +368 -0
- package/dist/extensions/extensions.module.js +14 -2
- package/dist/extensions/hooks.d.ts +37 -4
- package/dist/extensions/hooks.js +82 -16
- package/dist/extensions/host.d.ts +45 -2
- package/dist/extensions/host.js +112 -16
- package/dist/extensions/installs.d.ts +20 -8
- package/dist/extensions/installs.js +37 -15
- package/dist/extensions/org-config.d.ts +81 -6
- package/dist/extensions/org-config.js +195 -44
- 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/package.d.ts +14 -1
- package/dist/extensions/package.js +51 -2
- package/dist/extensions/permission-view.d.ts +19 -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.controller.d.ts +34 -0
- package/dist/extensions/point-defaults.controller.js +71 -0
- package/dist/extensions/point-defaults.d.ts +71 -0
- package/dist/extensions/point-defaults.js +234 -0
- package/dist/extensions/registry.d.ts +1 -1
- package/dist/extensions/registry.js +2 -0
- 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 +31 -3
- package/dist/http/app.d.ts +11 -2
- package/dist/http/app.js +31 -5
- package/dist/http/nest-logger.d.ts +6 -5
- package/dist/http/nest-logger.js +24 -10
- 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.controller.js +9 -5
- package/dist/identity/auth.guard.d.ts +13 -5
- package/dist/identity/auth.guard.js +26 -9
- package/dist/identity/cookies.d.ts +20 -5
- package/dist/identity/cookies.js +44 -6
- package/dist/identity/identity.module.d.ts +1 -1
- package/dist/identity/identity.module.js +4 -4
- package/dist/identity/me.controller.d.ts +5 -1
- package/dist/identity/me.controller.js +12 -3
- package/dist/identity/principal.d.ts +3 -3
- package/dist/identity/principal.js +3 -3
- package/dist/identity/sessions.d.ts +12 -0
- package/dist/identity/sessions.js +45 -0
- 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 +2 -2
- package/dist/index.js +1 -1
- package/dist/infra/cli/kernel-cli.module.js +9 -1
- package/dist/infra/config/kernel-config.service.js +27 -1
- package/dist/infra/database/database.module.js +1 -0
- 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/lifecycle/process-guards.js +4 -0
- package/dist/infra/logging/logging.module.d.ts +4 -2
- package/dist/infra/logging/logging.module.js +24 -6
- package/dist/infra/queue/add-job-once.d.ts +14 -0
- package/dist/infra/queue/add-job-once.js +16 -0
- package/dist/infra/queue/redis-connection.d.ts +6 -0
- package/dist/infra/queue/redis-connection.js +7 -0
- package/dist/infra/redis/redis.module.js +6 -2
- package/dist/infra/tokens.d.ts +6 -1
- package/dist/infra/tokens.js +6 -1
- 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/log.d.ts +13 -1
- package/dist/log.js +93 -17
- 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 +43 -9
- package/dist/models/purposes.js +48 -18
- package/dist/orgs/directory-sync.d.ts +14 -5
- package/dist/orgs/directory-sync.js +41 -17
- package/dist/orgs/offboarding.d.ts +12 -8
- package/dist/orgs/offboarding.js +54 -33
- 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 +20 -3
- package/dist/orgs/settings.service.js +19 -4
- 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 +15 -1
- package/dist/runtime/context/build.d.ts +11 -7
- package/dist/runtime/context/build.js +46 -19
- package/dist/runtime/context/claude-tools.d.ts +3 -1
- package/dist/runtime/context/claude-tools.js +8 -6
- package/dist/runtime/context/compaction.js +13 -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 +36 -17
- package/dist/runtime/loop.d.ts +34 -5
- package/dist/runtime/maintenance.d.ts +9 -4
- package/dist/runtime/maintenance.js +35 -8
- package/dist/runtime/model-call.d.ts +46 -8
- package/dist/runtime/model-call.js +72 -21
- package/dist/runtime/providers.d.ts +6 -0
- package/dist/runtime/providers.js +8 -0
- 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 +59 -2
- package/dist/runtime/run-queue.js +311 -38
- package/dist/runtime/run-worker.d.ts +11 -5
- package/dist/runtime/run-worker.js +69 -33
- package/dist/runtime/runtime.module.js +11 -3
- package/dist/runtime/step-log.d.ts +15 -4
- package/dist/runtime/step-log.js +24 -7
- 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 +44 -28
- 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.d.ts +2 -1
- package/dist/runtime/usage-report.js +19 -13
- package/dist/runtime/waits.d.ts +145 -36
- package/dist/runtime/waits.js +423 -109
- 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 +10 -4
- package/dist/sandbox/sandbox.service.d.ts +282 -129
- package/dist/sandbox/sandbox.service.js +736 -381
- 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 +25 -4
- package/dist/tools/builtin-names.d.ts +41 -7
- package/dist/tools/builtin-names.js +59 -7
- 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 +19 -1
- package/dist/tools/builtins/builtin-tools.js +59 -2
- 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.d.ts +1 -1
- package/dist/tools/builtins/sandbox/bash.js +241 -4
- package/dist/tools/builtins/sandbox/common.d.ts +69 -27
- package/dist/tools/builtins/sandbox/common.js +87 -48
- package/dist/tools/builtins/sandbox/deliver.js +1 -1
- 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 +3 -1
- package/dist/tools/builtins/sandbox/index.js +7 -1
- package/dist/tools/builtins/sandbox/read.js +1 -1
- package/dist/tools/builtins/sandbox/task-output.d.ts +74 -0
- package/dist/tools/builtins/sandbox/task-output.js +329 -0
- package/dist/tools/builtins/sandbox/task-stop.d.ts +10 -0
- package/dist/tools/builtins/sandbox/task-stop.js +113 -0
- 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/errors.d.ts +8 -0
- package/dist/tools/builtins/web/errors.js +53 -0
- package/dist/tools/builtins/web/extract.d.ts +62 -0
- package/dist/tools/builtins/web/extract.js +271 -0
- package/dist/tools/builtins/web/fetch.d.ts +55 -0
- package/dist/tools/builtins/web/fetch.js +175 -0
- package/dist/tools/builtins/web/index.d.ts +13 -0
- package/dist/tools/builtins/web/index.js +12 -0
- package/dist/tools/builtins/web/page-cache.d.ts +25 -0
- package/dist/tools/builtins/web/page-cache.js +77 -0
- package/dist/tools/builtins/web/search.d.ts +25 -0
- package/dist/tools/builtins/web/search.js +210 -0
- package/dist/tools/builtins/web/url.d.ts +17 -0
- package/dist/tools/builtins/web/url.js +43 -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/oauth/flow-paths.d.ts +1 -1
- package/dist/tools/oauth/flow-paths.js +1 -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 +202 -364
- package/dist/tools/policy.d.ts +1 -1
- package/dist/tools/policy.js +36 -16
- package/dist/tools/registry.d.ts +120 -8
- package/dist/tools/registry.js +112 -19
- package/dist/tools/tools.module.js +24 -2
- package/dist/tools/validate.js +1 -1
- package/dist/ui/views.d.ts +2 -1
- package/dist/ui/views.js +17 -3
- package/package.json +3 -3
- package/src/migrations/0064_account_last_org.sql +7 -0
- package/src/migrations/0065_conversation_archive.sql +8 -0
- package/src/migrations/0066_extension_display_name.sql +4 -0
- package/src/migrations/0067_agent_profiles.sql +20 -0
- package/src/migrations/0068_agent_avatar_uploads.sql +7 -0
- package/src/migrations/0069_attachments_agent_idx.sql +3 -0
- package/src/migrations/0070_background_tasks.sql +37 -0
- package/src/migrations/0071_background_tasks_reserve.sql +6 -0
- package/src/migrations/0072_background_tasks_stopping.sql +5 -0
- package/src/migrations/0073_org_extension_point_defaults.sql +11 -0
- 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 -24
- package/dist/extensions/org-config.controller.js +0 -62
|
@@ -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,21 +265,24 @@ 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
|
}
|
|
228
272
|
/**
|
|
229
|
-
* Appends a model call's events (its reply or compaction outcome with its `usage
|
|
273
|
+
* Appends a model call's events (its reply or compaction outcome with its `usage`; also the usage
|
|
274
|
+
* of a `WebFetch` extraction call, `tools/builtins/web/extract.ts`). For a
|
|
230
275
|
* sub-agent's run (`input.parentRunId`) in one transaction that also adds the tokens of the usage
|
|
231
|
-
* 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
|
|
232
277
|
* event already in the log (an idempotent hit after a crash) adds nothing, so each call counts
|
|
233
278
|
* exactly once.
|
|
234
279
|
*/
|
|
235
|
-
async function appendCounted(deps, input, events) {
|
|
280
|
+
export async function appendCounted(deps, input, events) {
|
|
236
281
|
const { conversationId, parentRunId } = input;
|
|
237
282
|
if (parentRunId === undefined)
|
|
238
283
|
return deps.eventLog.append(conversationId, events);
|
|
239
|
-
const
|
|
284
|
+
const budgetRunId = input.budgetRunId ?? input.parent?.budgetRunId;
|
|
285
|
+
const out = await deps.stepLog.appendCounted(conversationId, { parentRunId, ...(budgetRunId !== undefined && { budgetRunId }) }, events);
|
|
240
286
|
if (out.toSeq !== null)
|
|
241
287
|
await deps.eventLog.notify(conversationId, out.toSeq);
|
|
242
288
|
return out.written;
|
|
@@ -657,11 +703,14 @@ function mergeLocal(events, written) {
|
|
|
657
703
|
* 每次实际尝试写自己的 `model_call`(attempt 从 1 连续递增,跳过的不计);重试前经 sink 发 `step_reset`。
|
|
658
704
|
* 不可重试的失败或梯子用尽 → `RunError`。
|
|
659
705
|
*/
|
|
660
|
-
async function ladder(deps, input, events, runtime, tools,
|
|
706
|
+
async function ladder(deps, input, events, runtime, tools, wrapUpReason, streamed) {
|
|
661
707
|
const { conversationId, runId, step, signal, sink, agent } = input;
|
|
662
|
-
const
|
|
663
|
-
|
|
664
|
-
|
|
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);
|
|
665
714
|
let evs = events;
|
|
666
715
|
const rungs = [
|
|
667
716
|
{ ref: agent.model, fallback: false },
|
|
@@ -784,6 +833,8 @@ async function ladder(deps, input, events, runtime, tools, wrapUp, streamed) {
|
|
|
784
833
|
sink({ kind: "thinking", runId, step, text: ev.text });
|
|
785
834
|
}
|
|
786
835
|
});
|
|
836
|
+
// the draft's last write, before the assistant_message is logged
|
|
837
|
+
sink({ kind: "stream_end", runId, step });
|
|
787
838
|
if (scope && deps.hooks) {
|
|
788
839
|
fireObserve(deps.hooks, "model.response", {
|
|
789
840
|
...scope,
|
|
@@ -67,6 +67,12 @@ export declare class ProviderRegistry {
|
|
|
67
67
|
listTimeoutMs?: number);
|
|
68
68
|
/** `listModels()` 加时限(到时按失败处理,供应商的调用留在后台、结果丢弃)。 */
|
|
69
69
|
private listModelsWithTimeout;
|
|
70
|
+
/**
|
|
71
|
+
* Whether at least one model-provider extension is loaded on this replica (enabled, configured,
|
|
72
|
+
* set up). Read from the extension host only: never calls a vendor, so a provider whose vendor
|
|
73
|
+
* is down still counts (org readiness, web-order spec §3.8).
|
|
74
|
+
*/
|
|
75
|
+
hasProvider(): boolean;
|
|
70
76
|
/** 每个插件取一个实现(`@2` 优先),按插件首次出现的顺序;不支持的主版本记 warn 后忽略。 */
|
|
71
77
|
private providers;
|
|
72
78
|
private models;
|
|
@@ -132,6 +132,14 @@ let ProviderRegistry = class ProviderRegistry {
|
|
|
132
132
|
clearTimeout(timer);
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Whether at least one model-provider extension is loaded on this replica (enabled, configured,
|
|
137
|
+
* set up). Read from the extension host only: never calls a vendor, so a provider whose vendor
|
|
138
|
+
* is down still counts (org readiness, web-order spec §3.8).
|
|
139
|
+
*/
|
|
140
|
+
hasProvider() {
|
|
141
|
+
return this.providers().length > 0;
|
|
142
|
+
}
|
|
135
143
|
/** 每个插件取一个实现(`@2` 优先),按插件首次出现的顺序;不支持的主版本记 warn 后忽略。 */
|
|
136
144
|
providers() {
|
|
137
145
|
const chosen = new Map();
|
|
@@ -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;
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
10
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
11
|
+
import { conversationTopic, EventLog, } from "../conversations/event-log.js";
|
|
12
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
13
|
+
import { KERNEL_LOGGER, REDIS } from "../infra/tokens.js";
|
|
14
|
+
import { assistantIdemKey } from "./model-call.js";
|
|
15
|
+
/** How long a draft lives without a write (a step that keeps streaming keeps refreshing it). */
|
|
16
|
+
export const DRAFT_TTL_SECONDS = 600;
|
|
17
|
+
/** At most one write per step per window, plus the one at the end of the model stream. */
|
|
18
|
+
export const DRAFT_FLUSH_MS = 200;
|
|
19
|
+
/** One step's draft: `{ text, thinking }` as JSON (spec 2026-11-07 §3.2). */
|
|
20
|
+
export const draftKey = (runId, step) => `capk:run-draft:${runId}:${step}`;
|
|
21
|
+
/** The steps of a run that have a draft (a set, so a reader finds them without a key scan). */
|
|
22
|
+
const stepsKey = (runId) => `capk:run-draft-steps:${runId}`;
|
|
23
|
+
const parse = (step, v) => {
|
|
24
|
+
if (v === null)
|
|
25
|
+
return null;
|
|
26
|
+
try {
|
|
27
|
+
const d = JSON.parse(v);
|
|
28
|
+
return {
|
|
29
|
+
step,
|
|
30
|
+
text: typeof d.text === "string" ? d.text : "",
|
|
31
|
+
thinking: typeof d.thinking === "string" ? d.thinking : "",
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Live drafts (spec 2026-11-07-run-input-and-live-drafts §3.2): what each step of a running run
|
|
40
|
+
* has streamed so far, kept in Redis so a viewer that (re)connects on any replica gets the text
|
|
41
|
+
* already shown, then the deltas from there on.
|
|
42
|
+
*
|
|
43
|
+
* The writer is the process executing the run: it holds the step's draft in memory (only for the
|
|
44
|
+
* runs it executes; {@link release} drops them when the execution ends) and writes it at most once
|
|
45
|
+
* per {@link DRAFT_FLUSH_MS}: on the first delta past the window, or, when deltas stop inside it,
|
|
46
|
+
* by one trailing one-shot timer per held step (process-local, unref'd, cancelled by a write,
|
|
47
|
+
* {@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
|
|
48
|
+
* connection as the bus publish, so a viewer that sees a delta past its snapshot and asks again
|
|
49
|
+
* gets a draft at least that far whenever that delta was written. Every write refreshes the
|
|
50
|
+
* {@link DRAFT_TTL_SECONDS} TTL; {@link clear} deletes the step's draft once its
|
|
51
|
+
* `assistant_message` is logged or the step is reset. Redis failures are logged, never thrown to
|
|
52
|
+
* the run: a draft is a convenience, the log stays the truth.
|
|
53
|
+
*/
|
|
54
|
+
let RunDrafts = class RunDrafts {
|
|
55
|
+
redis;
|
|
56
|
+
kdb;
|
|
57
|
+
eventLog;
|
|
58
|
+
log;
|
|
59
|
+
held = new Map();
|
|
60
|
+
constructor(redis, kdb, eventLog, log) {
|
|
61
|
+
this.redis = redis;
|
|
62
|
+
this.kdb = kdb;
|
|
63
|
+
this.eventLog = eventLog;
|
|
64
|
+
this.log = log;
|
|
65
|
+
}
|
|
66
|
+
get db() {
|
|
67
|
+
return this.kdb.db;
|
|
68
|
+
}
|
|
69
|
+
/** Adds a delta to the step's draft; writes it when the last write is a window old. */
|
|
70
|
+
append(runId, step, channel, text) {
|
|
71
|
+
let h = this.held.get(runId);
|
|
72
|
+
if (h?.step !== step) {
|
|
73
|
+
if (h)
|
|
74
|
+
this.drop(runId, h);
|
|
75
|
+
h = {
|
|
76
|
+
step,
|
|
77
|
+
text: "",
|
|
78
|
+
thinking: "",
|
|
79
|
+
writtenAt: Number.NEGATIVE_INFINITY,
|
|
80
|
+
dirty: false,
|
|
81
|
+
timer: undefined,
|
|
82
|
+
};
|
|
83
|
+
this.held.set(runId, h);
|
|
84
|
+
}
|
|
85
|
+
h[channel] += text;
|
|
86
|
+
h.dirty = true;
|
|
87
|
+
const elapsed = Date.now() - h.writtenAt;
|
|
88
|
+
if (elapsed >= DRAFT_FLUSH_MS)
|
|
89
|
+
this.write(runId, h);
|
|
90
|
+
else if (h.timer === undefined) {
|
|
91
|
+
// held: written when the window ends even if no delta follows (a tool input, a pause)
|
|
92
|
+
h.timer = setTimeout(() => {
|
|
93
|
+
h.timer = undefined;
|
|
94
|
+
this.flush(runId, step);
|
|
95
|
+
}, DRAFT_FLUSH_MS - elapsed).unref();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** The end of the step's model stream: writes what the window still holds. */
|
|
99
|
+
flush(runId, step) {
|
|
100
|
+
const h = this.held.get(runId);
|
|
101
|
+
if (h?.step === step && h.dirty)
|
|
102
|
+
this.write(runId, h);
|
|
103
|
+
}
|
|
104
|
+
/** Deletes the step's draft (its `assistant_message` is logged, or the step starts over). */
|
|
105
|
+
clear(runId, step) {
|
|
106
|
+
const h = this.held.get(runId);
|
|
107
|
+
if (h?.step === step)
|
|
108
|
+
this.drop(runId, h);
|
|
109
|
+
this.redis
|
|
110
|
+
.multi()
|
|
111
|
+
.del(draftKey(runId, step))
|
|
112
|
+
.srem(stepsKey(runId), String(step))
|
|
113
|
+
.exec()
|
|
114
|
+
.catch((err) => this.log.warn("run draft clear failed", { runId, step, err }));
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Drops what this process holds for the run (its execution here ended: finished, suspended,
|
|
118
|
+
* handed over). Redis keeps what was written: another worker may continue the run, and a step
|
|
119
|
+
* that never ended is not shown once the run is no longer running (TTL removes it).
|
|
120
|
+
*/
|
|
121
|
+
release(runId) {
|
|
122
|
+
const h = this.held.get(runId);
|
|
123
|
+
if (h)
|
|
124
|
+
this.drop(runId, h);
|
|
125
|
+
}
|
|
126
|
+
/** The run's steps with a draft, by step. */
|
|
127
|
+
async read(runId) {
|
|
128
|
+
const steps = (await this.redis.smembers(stepsKey(runId)))
|
|
129
|
+
.map(Number)
|
|
130
|
+
.filter((n) => Number.isSafeInteger(n))
|
|
131
|
+
.sort((a, b) => a - b);
|
|
132
|
+
if (steps.length === 0)
|
|
133
|
+
return [];
|
|
134
|
+
const values = await this.redis.mget(steps.map((s) => draftKey(runId, s)));
|
|
135
|
+
return steps.flatMap((s, i) => parse(s, values[i] ?? null) ?? []);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* The drafts a viewer of the conversation is shown: steps of its running run (or only `runId`)
|
|
139
|
+
* whose `assistant_message` is not logged. Redis is read before the log, so a step finalized
|
|
140
|
+
* meanwhile is either skipped here or its `assistant_message` reaches the viewer after the draft.
|
|
141
|
+
*/
|
|
142
|
+
async live(conversationId, runId) {
|
|
143
|
+
let q = this.db
|
|
144
|
+
.selectFrom("runs")
|
|
145
|
+
.select("id")
|
|
146
|
+
.where("conversation_id", "=", conversationId)
|
|
147
|
+
.where("status", "=", "running");
|
|
148
|
+
if (runId !== undefined)
|
|
149
|
+
q = q.where("id", "=", runId);
|
|
150
|
+
const out = [];
|
|
151
|
+
for (const run of await q.execute()) {
|
|
152
|
+
for (const d of await this.read(run.id)) {
|
|
153
|
+
const final = await this.eventLog.findByIdem(conversationId, assistantIdemKey(run.id, d.step));
|
|
154
|
+
if (final === undefined)
|
|
155
|
+
out.push({ runId: run.id, ...d });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return out;
|
|
159
|
+
}
|
|
160
|
+
/** Whether the run belongs to the conversation (the draft route's 404). */
|
|
161
|
+
async runOf(conversationId, runId) {
|
|
162
|
+
const row = await this.db
|
|
163
|
+
.selectFrom("runs")
|
|
164
|
+
.select("id")
|
|
165
|
+
.where("id", "=", runId)
|
|
166
|
+
.where("conversation_id", "=", conversationId)
|
|
167
|
+
.executeTakeFirst();
|
|
168
|
+
return row !== undefined;
|
|
169
|
+
}
|
|
170
|
+
drop(runId, h) {
|
|
171
|
+
clearTimeout(h.timer);
|
|
172
|
+
h.timer = undefined;
|
|
173
|
+
this.held.delete(runId);
|
|
174
|
+
}
|
|
175
|
+
write(runId, h) {
|
|
176
|
+
clearTimeout(h.timer);
|
|
177
|
+
h.timer = undefined;
|
|
178
|
+
h.writtenAt = Date.now();
|
|
179
|
+
h.dirty = false;
|
|
180
|
+
const { step } = h;
|
|
181
|
+
this.redis
|
|
182
|
+
.multi()
|
|
183
|
+
.set(draftKey(runId, step), JSON.stringify({ text: h.text, thinking: h.thinking }), "EX", DRAFT_TTL_SECONDS)
|
|
184
|
+
.sadd(stepsKey(runId), String(step))
|
|
185
|
+
.expire(stepsKey(runId), DRAFT_TTL_SECONDS)
|
|
186
|
+
.exec()
|
|
187
|
+
.catch((err) => this.log.warn("run draft write failed", { runId, step, err }));
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
RunDrafts = __decorate([
|
|
191
|
+
Injectable(),
|
|
192
|
+
__param(0, Inject(REDIS)),
|
|
193
|
+
__param(1, Inject(KernelDb)),
|
|
194
|
+
__param(2, Inject(EventLog)),
|
|
195
|
+
__param(3, Inject(KERNEL_LOGGER))
|
|
196
|
+
], RunDrafts);
|
|
197
|
+
export { RunDrafts };
|
|
198
|
+
/**
|
|
199
|
+
* The run's stream sink (one per execution of a run): publishes deltas on the conversation's topic
|
|
200
|
+
* (`conv.<id>`, shared with `{ kind: "events" }`, so a subscriber on any replica gets them) with
|
|
201
|
+
* `offset`, the characters of that channel (text or thinking) this attempt of the step streamed
|
|
202
|
+
* before the delta, and keeps the step's live draft. `step_reset` clears the draft and both
|
|
203
|
+
* offsets; `stream_end` / `step_end` only flush / clear the draft and are not published. A failed
|
|
204
|
+
* publish is only logged: deltas are drafts, the `assistant_message` in the log is the truth.
|
|
205
|
+
*/
|
|
206
|
+
export function streamSink(conversationId, deps) {
|
|
207
|
+
let at = { runId: "", step: -1, text: 0, thinking: 0 };
|
|
208
|
+
const publish = (msg) => deps.bus
|
|
209
|
+
.publish(conversationTopic(conversationId), msg)
|
|
210
|
+
.catch((err) => deps.log.warn("stream delta publish failed", { conversationId, err }));
|
|
211
|
+
return (d) => {
|
|
212
|
+
if (d.kind === "stream_end")
|
|
213
|
+
return deps.drafts.flush(d.runId, d.step);
|
|
214
|
+
if (d.kind === "step_end")
|
|
215
|
+
return deps.drafts.clear(d.runId, d.step);
|
|
216
|
+
if (at.runId !== d.runId || at.step !== d.step || d.kind === "step_reset") {
|
|
217
|
+
at = { runId: d.runId, step: d.step, text: 0, thinking: 0 };
|
|
218
|
+
}
|
|
219
|
+
if (d.kind === "step_reset") {
|
|
220
|
+
deps.drafts.clear(d.runId, d.step);
|
|
221
|
+
void publish({ kind: "delta", runId: d.runId, step: d.step, delta: "step_reset" });
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
const text = d.text ?? "";
|
|
225
|
+
const offset = at[d.kind];
|
|
226
|
+
at[d.kind] += text.length;
|
|
227
|
+
deps.drafts.append(d.runId, d.step, d.kind, text);
|
|
228
|
+
void publish({ kind: "delta", runId: d.runId, step: d.step, delta: d.kind, text, offset });
|
|
229
|
+
};
|
|
230
|
+
}
|
|
@@ -34,12 +34,10 @@ export declare class RunJobs {
|
|
|
34
34
|
queue(name?: string): Queue<RunJobData>;
|
|
35
35
|
/** A run job by id on the queue `name`, or undefined. */
|
|
36
36
|
getJob(jobId: string, name?: string): Promise<Job<RunJobData> | undefined>;
|
|
37
|
-
/** Adds a conversation run job (`ensureRun`'s own enqueue). */
|
|
38
|
-
add(data: RunJobData, jobId: string): Promise<void>;
|
|
39
37
|
/**
|
|
40
|
-
* Enqueues a run job under the caller's job id (resumes, dispatches, repairs). The
|
|
41
|
-
* the conversation's kind (a sub-agent's runs go to
|
|
42
|
-
* `kind` when the caller knows it, else it is read.
|
|
38
|
+
* Enqueues a run job under the caller's job id (`ensureRun`, resumes, dispatches, repairs). The
|
|
39
|
+
* queue follows the conversation's kind (a sub-agent's runs go to
|
|
40
|
+
* {@link SUBAGENT_RUN_QUEUE_NAME}); pass `kind` when the caller knows it, else it is read.
|
|
43
41
|
*/
|
|
44
42
|
enqueue(data: RunJobData, jobId: string, kind?: ConversationKind): Promise<void>;
|
|
45
43
|
}
|
package/dist/runtime/run-jobs.js
CHANGED
|
@@ -54,14 +54,10 @@ let RunJobs = class RunJobs {
|
|
|
54
54
|
getJob(jobId, name = RUN_QUEUE_NAME) {
|
|
55
55
|
return this.queue(name).getJob(jobId);
|
|
56
56
|
}
|
|
57
|
-
/** Adds a conversation run job (`ensureRun`'s own enqueue). */
|
|
58
|
-
async add(data, jobId) {
|
|
59
|
-
await this.queue().add("run", data, { jobId, ...RUN_JOB_OPTIONS });
|
|
60
|
-
}
|
|
61
57
|
/**
|
|
62
|
-
* Enqueues a run job under the caller's job id (resumes, dispatches, repairs). The
|
|
63
|
-
* the conversation's kind (a sub-agent's runs go to
|
|
64
|
-
* `kind` when the caller knows it, else it is read.
|
|
58
|
+
* Enqueues a run job under the caller's job id (`ensureRun`, resumes, dispatches, repairs). The
|
|
59
|
+
* queue follows the conversation's kind (a sub-agent's runs go to
|
|
60
|
+
* {@link SUBAGENT_RUN_QUEUE_NAME}); pass `kind` when the caller knows it, else it is read.
|
|
65
61
|
*/
|
|
66
62
|
async enqueue(data, jobId, kind) {
|
|
67
63
|
const k = kind ??
|