@vellumai/assistant 0.8.10 → 0.8.11-staging.1
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/bun.lock +62 -1
- package/docs/workspace-tools.md +196 -0
- package/examples/plugins/echo/README.md +3 -3
- package/knip.json +1 -0
- package/openapi.yaml +460 -128
- package/package.json +2 -1
- package/scripts/build-plugin-api.ts +299 -0
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +7 -0
- package/src/__tests__/agent-loop-compaction-events.test.ts +197 -0
- package/src/__tests__/agent-loop-exit-reason.test.ts +93 -96
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +2 -0
- package/src/__tests__/agent-loop-output-hooks.test.ts +274 -1
- package/src/__tests__/agent-loop-override-profile.test.ts +3 -0
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +4 -0
- package/src/__tests__/agent-loop-thinking.test.ts +4 -0
- package/src/__tests__/agent-loop.test.ts +578 -5
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +0 -1
- package/src/__tests__/approval-cascade.test.ts +1 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +0 -2
- package/src/__tests__/btw-routes.test.ts +0 -1
- package/src/__tests__/build-persisted-content.test.ts +75 -1
- package/src/__tests__/catalog-install-normalize.test.ts +141 -0
- package/src/__tests__/ces-startup-timeout.test.ts +60 -0
- package/src/__tests__/compaction-events.test.ts +1 -0
- package/src/__tests__/config-managed-gemini-defaults.test.ts +2 -46
- package/src/__tests__/context-overflow-reducer.test.ts +264 -124
- package/src/__tests__/context-window-manager-overflow-rung.test.ts +351 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +13 -5
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +284 -455
- package/src/__tests__/conversation-agent-loop.test.ts +131 -551
- package/src/__tests__/conversation-app-control-instantiation.test.ts +13 -0
- package/src/__tests__/conversation-confirmation-signals.test.ts +1 -0
- package/src/__tests__/conversation-fork-crud.test.ts +259 -0
- package/src/__tests__/conversation-history-web-search.test.ts +1 -1
- package/src/__tests__/conversation-lifecycle.test.ts +257 -1
- package/src/__tests__/conversation-process-callsite.test.ts +1 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +38 -377
- package/src/__tests__/conversation-queue.test.ts +1 -39
- package/src/__tests__/conversation-runtime-assembly.test.ts +119 -8
- package/src/__tests__/conversation-skill-tools.test.ts +491 -5
- package/src/__tests__/conversation-slash-queue.test.ts +1 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +1 -0
- package/src/__tests__/conversation-speed-override.test.ts +1 -0
- package/src/__tests__/conversation-store.test.ts +74 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +4 -1
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +323 -0
- package/src/__tests__/conversation-tool-setup-tools-disabled.test.ts +34 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +1 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +1 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -0
- package/src/__tests__/corrected-target.test.ts +93 -0
- package/src/__tests__/credential-execution-feature-gates.test.ts +3 -5
- package/src/__tests__/credential-execution-tools.test.ts +23 -11
- package/src/__tests__/credential-security-invariants.test.ts +6 -1
- package/src/__tests__/db-schedule-syntax-migration.test.ts +80 -0
- package/src/__tests__/device-id.test.ts +70 -1
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +6 -40
- package/src/__tests__/empty-response-hook.test.ts +242 -66
- package/src/__tests__/external-plugin-loader.test.ts +0 -31
- package/src/__tests__/get-skill-detail-audit.test.ts +43 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +91 -0
- package/src/__tests__/history-repair-hook.test.ts +228 -3
- package/src/__tests__/host-app-control-proxy.test.ts +45 -0
- package/src/__tests__/host-browser-proxy.test.ts +254 -9
- package/src/__tests__/identity-routes.test.ts +1 -0
- package/src/__tests__/image-recovery-hook.test.ts +387 -0
- package/src/__tests__/injector-chain.test.ts +5 -4
- package/src/__tests__/injector-v3-suppression.test.ts +373 -47
- package/src/__tests__/intent-routing.test.ts +7 -0
- package/src/__tests__/memory-retrieval-hook.test.ts +117 -15
- package/src/__tests__/notification-decision-strategy.test.ts +3 -3
- package/src/__tests__/oauth-store.test.ts +0 -85
- package/src/__tests__/{context-overflow-policy.test.ts → overflow-policy.test.ts} +1 -1
- package/src/__tests__/parallel-tool.benchmark.test.ts +4 -0
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +29 -9
- package/src/__tests__/persist-unsendable-image.test.ts +4 -4
- package/src/__tests__/persistence-secret-redaction.test.ts +78 -0
- package/src/__tests__/plugin-bootstrap.test.ts +82 -73
- package/src/__tests__/plugin-tool-contribution.test.ts +7 -4
- package/src/__tests__/plugin-types.test.ts +0 -8
- package/src/__tests__/provider-catalog-visibility.test.ts +1 -9
- package/src/__tests__/prune-old-conversations-job.test.ts +99 -0
- package/src/__tests__/registry.test.ts +240 -1
- package/src/__tests__/require-fresh-approval.test.ts +3 -0
- package/src/__tests__/schedule-routes.test.ts +116 -1
- package/src/__tests__/schedule-store.test.ts +28 -0
- package/src/__tests__/schedule-tools.test.ts +94 -1
- package/src/__tests__/server-history-render.test.ts +39 -0
- package/src/__tests__/skill-projection-feature-flag.test.ts +13 -0
- package/src/__tests__/skill-projection.benchmark.test.ts +25 -7
- package/src/__tests__/skills.test.ts +202 -0
- package/src/__tests__/slim-skill-category.test.ts +195 -0
- package/src/__tests__/strip-memory-injections.test.ts +33 -39
- package/src/__tests__/test-support/tool-invocation-seed.ts +79 -0
- package/src/__tests__/title-generate-hook.test.ts +9 -7
- package/src/__tests__/tool-audit-listener.test.ts +264 -1
- package/src/__tests__/tool-error-hook.test.ts +4 -3
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -0
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +273 -0
- package/src/__tests__/tool-result-truncate-hook.test.ts +1 -0
- package/src/__tests__/tool-start-timestamp.test.ts +218 -0
- package/src/__tests__/tools-get-route.test.ts +202 -0
- package/src/__tests__/workspace-tool-loader.test.ts +319 -0
- package/src/__tests__/workspace-tools-watcher-flag.test.ts +70 -0
- package/src/agent/loop.ts +569 -319
- package/src/api/events/tool-result.ts +9 -0
- package/src/api/events/tool-use-start.ts +7 -0
- package/src/api/index.ts +10 -0
- package/src/api/responses/conversation-message.ts +135 -27
- package/src/api/responses/memory-v3-selection-log.ts +4 -4
- package/src/approvals/guardian-request-resolvers.ts +26 -0
- package/src/browser-session/backends/host-bridge.ts +29 -0
- package/src/browser-session/index.ts +1 -0
- package/src/browser-session/types.ts +5 -1
- package/src/cli/commands/__tests__/schedules.test.ts +62 -4
- package/src/cli/commands/__tests__/skills.test.ts +53 -0
- package/src/cli/commands/channel-verification-sessions.ts +6 -6
- package/src/cli/commands/inference-providers.ts +0 -8
- package/src/cli/commands/plugins.ts +2 -2
- package/src/cli/commands/schedules.ts +27 -4
- package/src/cli/commands/skills.ts +187 -146
- package/src/cli/commands/tools.ts +106 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +256 -328
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +6 -2
- package/src/cli/lib/__tests__/plugin-details.test.ts +10 -16
- package/src/cli/lib/__tests__/plugin-marketplace.test.ts +2 -2
- package/src/cli/lib/__tests__/search-plugins.test.ts +145 -240
- package/src/cli/lib/install-from-github.ts +187 -117
- package/src/cli/lib/plugin-catalog-cache.ts +9 -9
- package/src/cli/lib/plugin-details.ts +38 -68
- package/src/cli/lib/plugin-marketplace.ts +42 -14
- package/src/cli/lib/search-plugins.ts +29 -129
- package/src/cli/program.ts +2 -0
- package/src/config/bundled-skills/acp/SKILL.md +1 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +1 -0
- package/src/config/bundled-skills/app-control/SKILL.md +1 -0
- package/src/config/bundled-skills/computer-use/SKILL.md +1 -0
- package/src/config/bundled-skills/contacts/SKILL.md +1 -0
- package/src/config/bundled-skills/document-editor/SKILL.md +1 -0
- package/src/config/bundled-skills/followups/SKILL.md +1 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +1 -0
- package/src/config/bundled-skills/media-processing/SKILL.md +1 -0
- package/src/config/bundled-skills/messaging/SKILL.md +1 -0
- package/src/config/bundled-skills/phone-calls/SKILL.md +1 -0
- package/src/config/bundled-skills/playbooks/SKILL.md +1 -0
- package/src/config/bundled-skills/schedule/SKILL.md +1 -0
- package/src/config/bundled-skills/schedule/TOOLS.json +11 -3
- package/src/config/bundled-skills/sequences/SKILL.md +1 -0
- package/src/config/bundled-skills/settings/SKILL.md +1 -0
- package/src/config/bundled-skills/skill-management/SKILL.md +101 -1
- package/src/config/bundled-skills/subagent/SKILL.md +1 -0
- package/src/config/bundled-skills/transcribe/SKILL.md +1 -0
- package/src/config/env-registry.ts +23 -0
- package/src/config/feature-flag-registry.json +17 -81
- package/src/config/loader.ts +5 -22
- package/src/config/schema.ts +2 -0
- package/src/config/schemas/__tests__/compaction-logs.test.ts +56 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +0 -1
- package/src/config/schemas/__tests__/memory-v3.test.ts +61 -1
- package/src/config/schemas/compaction-logs.ts +79 -0
- package/src/config/schemas/memory-v2.ts +0 -8
- package/src/config/schemas/memory-v3.ts +104 -33
- package/src/config/seed-inference-profiles.ts +1 -1
- package/src/config/skills.ts +117 -47
- package/src/context/compactor.ts +11 -0
- package/src/context/strip-injections.ts +38 -4
- package/src/credential-execution/feature-gates.ts +0 -21
- package/src/credential-execution/startup-timeout.ts +32 -4
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +18 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +140 -91
- package/src/daemon/conversation-agent-loop.ts +123 -658
- package/src/daemon/conversation-error.ts +6 -33
- package/src/daemon/conversation-lifecycle.ts +1 -1
- package/src/daemon/conversation-runtime-assembly.ts +183 -22
- package/src/daemon/conversation-skill-tools.ts +137 -8
- package/src/daemon/conversation-slash.ts +0 -14
- package/src/daemon/conversation-store.ts +2 -19
- package/src/daemon/conversation-tool-setup.ts +87 -1
- package/src/daemon/conversation.ts +119 -50
- package/src/daemon/external-plugins-bootstrap.ts +36 -95
- package/src/daemon/handlers/config-channels.ts +11 -2
- package/src/daemon/handlers/shared.ts +9 -1
- package/src/daemon/handlers/skills.ts +10 -4
- package/src/daemon/host-app-control-proxy.ts +72 -57
- package/src/daemon/host-browser-proxy.ts +117 -22
- package/src/daemon/lifecycle.ts +34 -5
- package/src/daemon/message-protocol.ts +0 -7
- package/src/daemon/message-types/schedules.ts +1 -0
- package/src/daemon/message-types/skills.ts +17 -0
- package/src/daemon/providers-setup.ts +3 -0
- package/src/daemon/server.ts +3 -3
- package/src/daemon/tool-setup-types.ts +9 -3
- package/src/daemon/trust-context.ts +23 -0
- package/src/daemon/workspace-tools-watcher.ts +324 -0
- package/src/events/tool-audit-listener.ts +78 -16
- package/src/events/tool-metrics-listener.ts +2 -5
- package/src/memory/__tests__/compaction-log-writer-clickhouse.test.ts +227 -0
- package/src/memory/__tests__/conversation-queries.test.ts +176 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +20 -32
- package/src/memory/compaction-log-writer-clickhouse.ts +418 -0
- package/src/memory/conversation-crud.ts +134 -3
- package/src/memory/conversation-queries.ts +64 -7
- package/src/memory/db-init.ts +14 -0
- package/src/memory/embedding-backend.test.ts +130 -1
- package/src/memory/embedding-backend.ts +79 -106
- package/src/memory/embedding-gemini.ts +5 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +12 -0
- package/src/memory/graph/__tests__/handle-remember-v2.test.ts +19 -0
- package/src/memory/graph/conversation-graph-memory.ts +36 -25
- package/src/memory/graph/tool-handlers.ts +3 -0
- package/src/memory/job-handlers/cleanup.ts +3 -1
- package/src/memory/jobs-store.ts +0 -28
- package/src/memory/jobs-worker.ts +10 -22
- package/src/memory/memory-marker.ts +29 -0
- package/src/memory/memory-retrospective-startup-cleanup.ts +1 -1
- package/src/memory/migrations/268-add-memory-v3-selections.ts +6 -0
- package/src/memory/migrations/270-schedule-description.ts +36 -0
- package/src/memory/migrations/275-tool-invocations-add-skill-id.test.ts +81 -0
- package/src/memory/migrations/275-tool-invocations-add-skill-id.ts +20 -0
- package/src/memory/migrations/276-tool-invocations-created-at-id-index.test.ts +68 -0
- package/src/memory/migrations/276-tool-invocations-created-at-id-index.ts +20 -0
- package/src/memory/migrations/277-add-memory-v3-ever-injected.ts +29 -0
- package/src/memory/migrations/278-tool-invocations-telemetry-columns.test.ts +96 -0
- package/src/memory/migrations/278-tool-invocations-telemetry-columns.ts +39 -0
- package/src/memory/migrations/279-create-skill-loaded-events.test.ts +84 -0
- package/src/memory/migrations/279-create-skill-loaded-events.ts +26 -0
- package/src/memory/migrations/280-conversations-surfaced-at.test.ts +88 -0
- package/src/memory/migrations/280-conversations-surfaced-at.ts +24 -0
- package/src/memory/migrations/index.ts +10 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/schema/conversations.ts +16 -0
- package/src/memory/schema/infrastructure.ts +26 -0
- package/src/memory/skill-loaded-events-store.test.ts +160 -0
- package/src/memory/skill-loaded-events-store.ts +95 -0
- package/src/memory/tool-executed-events-store.test.ts +219 -0
- package/src/memory/tool-executed-events-store.ts +102 -0
- package/src/memory/tool-usage-store.ts +15 -3
- package/src/memory/v2/__tests__/consolidation-job.test.ts +117 -12
- package/src/memory/v2/__tests__/consolidation-prompt-flag-gating-guard.test.ts +189 -0
- package/src/memory/v2/__tests__/injected-block-slugs.test.ts +90 -0
- package/src/memory/v2/__tests__/page-store.test.ts +33 -0
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +88 -15
- package/src/memory/v2/activation-store.ts +50 -1
- package/src/memory/v2/consolidation-job.ts +113 -29
- package/src/memory/v2/injected-block-slugs.ts +79 -0
- package/src/memory/v2/injection.ts +6 -1
- package/src/memory/v2/prompts/consolidation.ts +414 -13
- package/src/memory/v2/router.ts +2 -28
- package/src/memory/v2/static-context.ts +1 -1
- package/src/memory/v2/types.ts +16 -0
- package/src/notifications/__tests__/copy-composer.test.ts +244 -0
- package/src/notifications/access-request-copy.ts +298 -0
- package/src/notifications/adapters/slack.ts +3 -3
- package/src/notifications/adapters/telegram.ts +2 -1
- package/src/notifications/copy-composer.ts +49 -267
- package/src/notifications/decision-engine.ts +16 -35
- package/src/notifications/home-feed-side-effect.ts +1 -6
- package/src/oauth/oauth-store.ts +0 -9
- package/src/permissions/checker.test.ts +83 -1
- package/src/permissions/checker.ts +25 -2
- package/src/permissions/gateway-threshold-reader.test.ts +182 -0
- package/src/permissions/gateway-threshold-reader.ts +80 -0
- package/src/platform/client.ts +1 -3
- package/src/platform/feature-gate.ts +3 -12
- package/src/plugin-api/constants.ts +4 -2
- package/src/plugin-api/index.ts +63 -11
- package/src/plugin-api/types.ts +236 -71
- package/src/plugins/defaults/compaction/compact.ts +66 -2
- package/src/plugins/defaults/compaction/context-overflow-reducer.ts +240 -32
- package/src/plugins/defaults/compaction/corrected-target.ts +53 -0
- package/src/{daemon/context-overflow-policy.ts → plugins/defaults/compaction/overflow-policy.ts} +1 -1
- package/src/plugins/defaults/compaction/window-manager.ts +303 -1
- package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +173 -0
- package/src/plugins/defaults/empty-response/hooks/stop.ts +11 -115
- package/src/plugins/defaults/empty-response/nudge-state-store.ts +46 -0
- package/src/plugins/defaults/history-repair/hooks/post-model-call.ts +50 -0
- package/src/plugins/defaults/history-repair/hooks/stop.ts +22 -0
- package/src/plugins/defaults/history-repair/repair-state-store.ts +51 -0
- package/src/plugins/defaults/history-repair/terminal.ts +39 -2
- package/src/plugins/defaults/image-recovery/detect.ts +25 -0
- package/src/plugins/defaults/image-recovery/hooks/post-model-call.ts +73 -0
- package/src/plugins/defaults/image-recovery/hooks/stop.ts +22 -0
- package/src/plugins/defaults/image-recovery/image-recovery-state-store.ts +48 -0
- package/src/plugins/defaults/image-recovery/package.json +14 -0
- package/src/{daemon/persist-unsendable-image.ts → plugins/defaults/image-recovery/recover.ts} +67 -14
- package/src/plugins/defaults/index.ts +71 -5
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +76 -112
- package/src/plugins/defaults/memory-retrieval/hooks/{user-prompt-submit-temp.ts → user-prompt-submit.ts} +83 -74
- package/src/plugins/defaults/memory-retrieval/injector-chain.ts +14 -8
- package/src/plugins/defaults/memory-retrieval/injectors.ts +2 -18
- package/src/plugins/defaults/memory-retrieval/package.json +14 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/carry-integration.test.ts +1157 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +683 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/live-integration.test.ts +161 -140
- package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +160 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +335 -316
- package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +145 -53
- package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +38 -1
- package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +18 -8
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +112 -71
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +192 -51
- package/src/plugins/defaults/memory-v3-shadow/__tests__/types.test.ts +4 -16
- package/src/plugins/defaults/memory-v3-shadow/card.test.ts +173 -0
- package/src/plugins/defaults/memory-v3-shadow/card.ts +116 -0
- package/src/plugins/defaults/memory-v3-shadow/core-set.test.ts +104 -0
- package/src/plugins/defaults/memory-v3-shadow/core-set.ts +59 -0
- package/src/plugins/defaults/memory-v3-shadow/ever-injected-store.test.ts +305 -0
- package/src/plugins/defaults/memory-v3-shadow/ever-injected-store.ts +278 -0
- package/src/plugins/defaults/memory-v3-shadow/hot-set.test.ts +138 -0
- package/src/plugins/defaults/memory-v3-shadow/hot-set.ts +85 -0
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +331 -24
- package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +119 -13
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +169 -114
- package/src/plugins/defaults/memory-v3-shadow/page-content.ts +47 -16
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +144 -66
- package/src/plugins/defaults/memory-v3-shadow/prune.test.ts +758 -0
- package/src/plugins/defaults/memory-v3-shadow/prune.ts +471 -0
- package/src/plugins/defaults/memory-v3-shadow/render-injection.ts +68 -16
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +19 -12
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +96 -43
- package/src/plugins/defaults/memory-v3-shadow/types.ts +34 -17
- package/src/plugins/defaults/title-generate/hooks/stop.ts +9 -11
- package/src/plugins/pipeline.ts +8 -5
- package/src/plugins/types.ts +5 -51
- package/src/providers/cache-control.ts +26 -0
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +1 -2
- package/src/providers/model-catalog.ts +13 -1
- package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +147 -0
- package/src/providers/openai/chat-completions-provider.ts +46 -0
- package/src/providers/openai/responses-provider.ts +45 -0
- package/src/providers/registry.ts +0 -8
- package/src/runtime/__tests__/agent-wake.test.ts +0 -1
- package/src/runtime/agent-wake.ts +13 -0
- package/src/runtime/routes/__tests__/acp-routes.test.ts +151 -0
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +12 -50
- package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +322 -0
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +0 -62
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +31 -11
- package/src/runtime/routes/acp-routes.test.ts +106 -0
- package/src/runtime/routes/acp-routes.ts +248 -2
- package/src/runtime/routes/browser-tabs-routes.ts +1 -1
- package/src/runtime/routes/channel-verification-routes.ts +14 -5
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +0 -14
- package/src/runtime/routes/consolidation-routes.ts +6 -82
- package/src/runtime/routes/conversation-list-routes.ts +6 -0
- package/src/runtime/routes/conversation-management-routes.ts +71 -0
- package/src/runtime/routes/identity-routes.ts +8 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +33 -34
- package/src/runtime/routes/inference-provider-connection-routes.ts +0 -45
- package/src/runtime/routes/plugins-routes.ts +34 -45
- package/src/runtime/routes/schedule-routes.ts +43 -5
- package/src/runtime/routes/settings-routes.ts +140 -15
- package/src/runtime/routes/skills-routes.ts +18 -6
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +140 -0
- package/src/runtime/services/conversation-serializer.ts +38 -1
- package/src/runtime/verification-outbound-actions.ts +147 -2
- package/src/runtime/verification-templates.ts +29 -3
- package/src/schedule/schedule-store.ts +19 -0
- package/src/skills/catalog-install.ts +77 -13
- package/src/tasks/task-scheduler.ts +1 -0
- package/src/telemetry/types.ts +66 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +542 -13
- package/src/telemetry/usage-telemetry-reporter.ts +213 -20
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +49 -2
- package/src/tools/browser/__tests__/browser-status.test.ts +29 -5
- package/src/tools/browser/browser-execution.ts +27 -9
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +380 -4
- package/src/tools/browser/cdp-client/__tests__/host-bridge-cdp-client.test.ts +107 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +6 -1
- package/src/tools/browser/cdp-client/factory.ts +217 -17
- package/src/tools/browser/cdp-client/host-bridge-cdp-client.ts +67 -0
- package/src/tools/browser/cdp-client/types.ts +22 -2
- package/src/tools/credential-execution/make-authenticated-request.ts +2 -1
- package/src/tools/credential-execution/manage-secure-command-tool.ts +169 -164
- package/src/tools/credential-execution/run-authenticated-command.ts +2 -1
- package/src/tools/executor.ts +39 -7
- package/src/tools/registry.ts +387 -5
- package/src/tools/schedule/create.ts +16 -0
- package/src/tools/schedule/list.ts +12 -4
- package/src/tools/schedule/update.ts +12 -0
- package/src/tools/skills/load.ts +11 -6
- package/src/tools/terminal/safe-env.ts +2 -0
- package/src/tools/types.ts +65 -9
- package/src/tools/workspace-tools/loader.ts +673 -0
- package/src/usage/attribution.ts +28 -0
- package/src/util/device-id.ts +17 -3
- package/src/util/platform.ts +16 -0
- package/tsconfig.plugin-api.json +13 -0
- package/src/__tests__/plugin-external-api.test.ts +0 -68
- package/src/__tests__/plugin-skill-contribution.test.ts +0 -355
- package/src/daemon/message-types/browser.ts +0 -10
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +0 -187
- package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/eval-turns.json +0 -36
- package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/live-turns.json +0 -37
- package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-eviction.test.ts +0 -106
- package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-skeleton.test.ts +0 -44
- package/src/plugins/defaults/memory-v3-shadow/working-set.ts +0 -91
- package/src/plugins/external-api.ts +0 -114
- package/src/plugins/plugin-skill-contributions.ts +0 -292
|
@@ -9,11 +9,20 @@
|
|
|
9
9
|
* messages is a no-op. Tiers are ordered so that less destructive
|
|
10
10
|
* transformations are tried first.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
12
|
+
* Rung progression:
|
|
13
|
+
* 0. Emergency summarize-around-last-tool-pair (preserves the most recent
|
|
14
|
+
* tool call/result while aggressively compressing earlier history)
|
|
15
|
+
* 1. Forced full-history compaction (emergency keep-boundary options)
|
|
14
16
|
* 2. Aggressive tool-result text truncation across retained history
|
|
15
17
|
* 3. Media/file payload stubbing (replace images/files with text stubs)
|
|
16
18
|
* 4. Runtime injection downgrade to minimal mode
|
|
19
|
+
* terminal. Auto-compress the latest turn (policy-gated by the caller)
|
|
20
|
+
*
|
|
21
|
+
* Rungs 1–4 are the "middle tiers" and are bounded by `maxMiddleTierAttempts`.
|
|
22
|
+
* The emergency rung always runs first; the auto-compress rung runs last and
|
|
23
|
+
* only when the caller permits it. The caller invokes the reducer repeatedly,
|
|
24
|
+
* re-running the agent loop after each rung, until either the context fits or
|
|
25
|
+
* `state.exhausted` is true.
|
|
17
26
|
*/
|
|
18
27
|
|
|
19
28
|
import type { ContextWindowConfig } from "../../../config/types.js";
|
|
@@ -29,19 +38,38 @@ import {
|
|
|
29
38
|
} from "../../../daemon/conversation-media-retry.js";
|
|
30
39
|
import type { InjectionMode } from "../../../daemon/conversation-runtime-assembly.js";
|
|
31
40
|
import type { Message } from "../../../providers/types.js";
|
|
41
|
+
import type { TrustClass } from "../../../runtime/actor-trust-resolver.js";
|
|
42
|
+
import { getLogger } from "../../../util/logger.js";
|
|
43
|
+
import { defaultCompact, defaultEmergencyCompact } from "./compact.js";
|
|
32
44
|
import type {
|
|
33
45
|
ContextWindowCompactOptions,
|
|
34
46
|
ContextWindowResult,
|
|
35
47
|
} from "./window-manager.js";
|
|
36
48
|
|
|
49
|
+
const log = getLogger("context-overflow-reducer");
|
|
50
|
+
|
|
37
51
|
/**
|
|
38
52
|
* Identifies which reduction tier was applied in a given step.
|
|
39
53
|
*/
|
|
40
54
|
export type ReducerTier =
|
|
55
|
+
| "emergency_compaction"
|
|
41
56
|
| "forced_compaction"
|
|
42
57
|
| "tool_result_truncation"
|
|
43
58
|
| "media_stubbing"
|
|
44
|
-
| "injection_downgrade"
|
|
59
|
+
| "injection_downgrade"
|
|
60
|
+
| "auto_compress_latest_turn";
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* The "middle tiers" — the rungs bounded by `maxMiddleTierAttempts`. The
|
|
64
|
+
* emergency and auto-compress rungs are intentionally excluded so they remain
|
|
65
|
+
* reachable regardless of how small the middle-tier budget is.
|
|
66
|
+
*/
|
|
67
|
+
const MIDDLE_TIERS: readonly ReducerTier[] = [
|
|
68
|
+
"forced_compaction",
|
|
69
|
+
"tool_result_truncation",
|
|
70
|
+
"media_stubbing",
|
|
71
|
+
"injection_downgrade",
|
|
72
|
+
];
|
|
45
73
|
|
|
46
74
|
/**
|
|
47
75
|
* Tracks the cumulative state of the reducer across successive calls.
|
|
@@ -94,18 +122,35 @@ export interface ReducerConfig {
|
|
|
94
122
|
targetTokens: number;
|
|
95
123
|
/** Pre-computed tool token budget to include in estimations. */
|
|
96
124
|
toolTokenBudget?: number;
|
|
125
|
+
/**
|
|
126
|
+
* Conversation whose {@link ContextWindowManager} the compaction rungs
|
|
127
|
+
* resolve from the compaction store to run the summary call.
|
|
128
|
+
*/
|
|
129
|
+
conversationId: string;
|
|
130
|
+
/** Per-conversation inference-profile override for the summary call. */
|
|
131
|
+
overrideProfile?: string | null;
|
|
132
|
+
/** Trust class of the actor whose turn triggered overflow recovery. */
|
|
133
|
+
actorTrustClass?: TrustClass;
|
|
134
|
+
/**
|
|
135
|
+
* The provider-reported estimate at the overflow that triggered recovery.
|
|
136
|
+
* Sizes the emergency summarize-around-last-tool-pair cut.
|
|
137
|
+
*/
|
|
138
|
+
previousEstimatedInputTokens: number;
|
|
139
|
+
/**
|
|
140
|
+
* Maximum number of middle-tier reductions (forced compaction, tool-result
|
|
141
|
+
* truncation, media stubbing, injection downgrade) to apply before
|
|
142
|
+
* escalating to the terminal auto-compress rung. The emergency and
|
|
143
|
+
* auto-compress rungs are not counted against this budget.
|
|
144
|
+
*/
|
|
145
|
+
maxMiddleTierAttempts: number;
|
|
146
|
+
/**
|
|
147
|
+
* Whether the terminal auto-compress-latest-turn rung is permitted. The
|
|
148
|
+
* caller resolves this from the overflow policy; when false, the ladder ends
|
|
149
|
+
* once the middle tiers are exhausted.
|
|
150
|
+
*/
|
|
151
|
+
allowAutoCompressLatestTurn: boolean;
|
|
97
152
|
}
|
|
98
153
|
|
|
99
|
-
/**
|
|
100
|
-
* Compaction callback — the reducer does not own the ContextWindowManager
|
|
101
|
-
* instance, so the caller provides a function that performs compaction.
|
|
102
|
-
*/
|
|
103
|
-
export type CompactFn = (
|
|
104
|
-
messages: Message[],
|
|
105
|
-
signal: AbortSignal | undefined,
|
|
106
|
-
options: ContextWindowCompactOptions,
|
|
107
|
-
) => Promise<ContextWindowResult>;
|
|
108
|
-
|
|
109
154
|
// Aggressive truncation cap for tool results during overflow recovery.
|
|
110
155
|
// Much tighter than the normal per-result budget.
|
|
111
156
|
const OVERFLOW_TOOL_RESULT_MAX_CHARS = 4_000;
|
|
@@ -121,53 +166,163 @@ export async function reduceContextOverflow(
|
|
|
121
166
|
messages: Message[],
|
|
122
167
|
config: ReducerConfig,
|
|
123
168
|
state: ReducerState | undefined,
|
|
124
|
-
compactFn: CompactFn,
|
|
125
169
|
signal?: AbortSignal,
|
|
126
170
|
): Promise<ReducerStepResult> {
|
|
127
171
|
const applied = state?.appliedTiers ?? [];
|
|
172
|
+
const step = await selectNextRung(messages, config, state, applied, signal);
|
|
128
173
|
|
|
129
|
-
//
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
174
|
+
// Exhaustion is decided centrally from the rungs applied so far so the last
|
|
175
|
+
// rung that actually runs sets `exhausted`, avoiding a wasted no-op rerun.
|
|
176
|
+
step.state.exhausted = isLadderExhausted(step.state.appliedTiers, config);
|
|
177
|
+
return step;
|
|
178
|
+
}
|
|
133
179
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
180
|
+
async function selectNextRung(
|
|
181
|
+
messages: Message[],
|
|
182
|
+
config: ReducerConfig,
|
|
183
|
+
state: ReducerState | undefined,
|
|
184
|
+
applied: ReducerTier[],
|
|
185
|
+
signal?: AbortSignal,
|
|
186
|
+
): Promise<ReducerStepResult> {
|
|
187
|
+
// Rung 0: emergency summarize-around-last-tool-pair (uncounted, runs first).
|
|
188
|
+
if (!applied.includes("emergency_compaction")) {
|
|
189
|
+
return applyEmergencyCompaction(messages, config, applied, signal);
|
|
137
190
|
}
|
|
138
191
|
|
|
139
|
-
//
|
|
140
|
-
|
|
141
|
-
|
|
192
|
+
// Middle tiers (rungs 1–4), bounded by the configured attempt budget.
|
|
193
|
+
const middleApplied = applied.filter((t) => MIDDLE_TIERS.includes(t)).length;
|
|
194
|
+
if (
|
|
195
|
+
middleApplied < config.maxMiddleTierAttempts &&
|
|
196
|
+
hasUnappliedMiddleTier(applied)
|
|
197
|
+
) {
|
|
198
|
+
if (!applied.includes("forced_compaction")) {
|
|
199
|
+
return applyForcedCompaction(messages, config, applied, signal);
|
|
200
|
+
}
|
|
201
|
+
if (!applied.includes("tool_result_truncation")) {
|
|
202
|
+
return applyToolResultTruncation(messages, config, applied, state);
|
|
203
|
+
}
|
|
204
|
+
if (!applied.includes("media_stubbing")) {
|
|
205
|
+
return applyMediaStubbing(messages, config, applied, state);
|
|
206
|
+
}
|
|
207
|
+
return applyInjectionDowngrade(messages, config, applied, state);
|
|
142
208
|
}
|
|
143
209
|
|
|
144
|
-
//
|
|
145
|
-
if (
|
|
146
|
-
|
|
210
|
+
// Terminal rung: auto-compress the latest turn (uncounted, policy-gated).
|
|
211
|
+
if (
|
|
212
|
+
config.allowAutoCompressLatestTurn &&
|
|
213
|
+
!applied.includes("auto_compress_latest_turn")
|
|
214
|
+
) {
|
|
215
|
+
return applyAutoCompressLatestTurn(
|
|
216
|
+
messages,
|
|
217
|
+
config,
|
|
218
|
+
applied,
|
|
219
|
+
state,
|
|
220
|
+
signal,
|
|
221
|
+
);
|
|
147
222
|
}
|
|
148
223
|
|
|
149
|
-
//
|
|
224
|
+
// No rung left to apply — return a no-op step. `reduceContextOverflow`
|
|
225
|
+
// marks it exhausted via `isLadderExhausted`.
|
|
150
226
|
const estimatedTokens = estimatePromptTokens(messages, config.systemPrompt, {
|
|
151
227
|
providerName: config.providerName,
|
|
152
228
|
toolTokenBudget: config.toolTokenBudget,
|
|
153
229
|
});
|
|
154
230
|
return {
|
|
155
231
|
messages,
|
|
156
|
-
tier: "
|
|
232
|
+
tier: applied[applied.length - 1] ?? "forced_compaction",
|
|
157
233
|
state: {
|
|
158
234
|
appliedTiers: [...applied],
|
|
159
235
|
injectionMode: state?.injectionMode ?? "minimal",
|
|
236
|
+
toolResultMaxChars: state?.toolResultMaxChars,
|
|
237
|
+
compactionOptions: state?.compactionOptions,
|
|
160
238
|
exhausted: true,
|
|
161
239
|
},
|
|
162
240
|
estimatedTokens,
|
|
163
241
|
};
|
|
164
242
|
}
|
|
165
243
|
|
|
244
|
+
/** Whether any middle tier remains unapplied. */
|
|
245
|
+
function hasUnappliedMiddleTier(applied: ReducerTier[]): boolean {
|
|
246
|
+
return MIDDLE_TIERS.some((tier) => !applied.includes(tier));
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Decide whether the ladder has nothing more to try after the given rungs.
|
|
251
|
+
* The terminal auto-compress rung is the last; before it, the middle tiers
|
|
252
|
+
* are exhausted once the attempt budget is spent or every middle tier ran.
|
|
253
|
+
*/
|
|
254
|
+
function isLadderExhausted(
|
|
255
|
+
applied: ReducerTier[],
|
|
256
|
+
config: ReducerConfig,
|
|
257
|
+
): boolean {
|
|
258
|
+
if (applied.includes("auto_compress_latest_turn")) {
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
const middleApplied = applied.filter((t) => MIDDLE_TIERS.includes(t)).length;
|
|
262
|
+
const middleExhausted =
|
|
263
|
+
middleApplied >= config.maxMiddleTierAttempts ||
|
|
264
|
+
!hasUnappliedMiddleTier(applied);
|
|
265
|
+
if (!middleExhausted) {
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
// Middle tiers are done — the ladder continues only if the terminal
|
|
269
|
+
// auto-compress rung is permitted and has not run yet.
|
|
270
|
+
return !config.allowAutoCompressLatestTurn;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
async function applyEmergencyCompaction(
|
|
274
|
+
messages: Message[],
|
|
275
|
+
config: ReducerConfig,
|
|
276
|
+
applied: ReducerTier[],
|
|
277
|
+
signal?: AbortSignal,
|
|
278
|
+
): Promise<ReducerStepResult> {
|
|
279
|
+
let result: ContextWindowResult | null = null;
|
|
280
|
+
try {
|
|
281
|
+
result = await defaultEmergencyCompact({
|
|
282
|
+
conversationId: config.conversationId,
|
|
283
|
+
messages,
|
|
284
|
+
previousEstimatedInputTokens: config.previousEstimatedInputTokens,
|
|
285
|
+
overrideProfile: config.overrideProfile ?? null,
|
|
286
|
+
signal,
|
|
287
|
+
});
|
|
288
|
+
} catch (err) {
|
|
289
|
+
// No tool pair to split on, an unparseable summary, or a provider error.
|
|
290
|
+
// Fall through to forced compaction below rather than failing recovery.
|
|
291
|
+
log.warn(
|
|
292
|
+
{ err },
|
|
293
|
+
"Emergency mid-turn compaction failed; falling through to forced compaction",
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
if (result?.compacted) {
|
|
298
|
+
return {
|
|
299
|
+
messages: result.messages,
|
|
300
|
+
tier: "emergency_compaction",
|
|
301
|
+
state: {
|
|
302
|
+
appliedTiers: [...applied, "emergency_compaction"],
|
|
303
|
+
injectionMode: "full",
|
|
304
|
+
exhausted: false,
|
|
305
|
+
},
|
|
306
|
+
estimatedTokens: result.estimatedInputTokens,
|
|
307
|
+
compactionResult: result,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// Emergency compaction produced no reduction; continue straight to forced
|
|
312
|
+
// compaction in the same step so the caller does not waste a provider rerun
|
|
313
|
+
// on unchanged messages.
|
|
314
|
+
return applyForcedCompaction(
|
|
315
|
+
messages,
|
|
316
|
+
config,
|
|
317
|
+
[...applied, "emergency_compaction"],
|
|
318
|
+
signal,
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
|
|
166
322
|
async function applyForcedCompaction(
|
|
167
323
|
messages: Message[],
|
|
168
324
|
config: ReducerConfig,
|
|
169
325
|
applied: ReducerTier[],
|
|
170
|
-
compactFn: CompactFn,
|
|
171
326
|
signal?: AbortSignal,
|
|
172
327
|
): Promise<ReducerStepResult> {
|
|
173
328
|
const compactionOptions: ContextWindowCompactOptions = {
|
|
@@ -175,7 +330,14 @@ async function applyForcedCompaction(
|
|
|
175
330
|
minKeepRecentUserTurns: 0,
|
|
176
331
|
};
|
|
177
332
|
|
|
178
|
-
const result = await
|
|
333
|
+
const result = await defaultCompact({
|
|
334
|
+
conversationId: config.conversationId,
|
|
335
|
+
messages,
|
|
336
|
+
signal,
|
|
337
|
+
...compactionOptions,
|
|
338
|
+
overrideProfile: config.overrideProfile ?? null,
|
|
339
|
+
actorTrustClass: config.actorTrustClass,
|
|
340
|
+
});
|
|
179
341
|
const nextMessages = result.compacted ? result.messages : messages;
|
|
180
342
|
const estimatedTokens = result.compacted
|
|
181
343
|
? result.estimatedInputTokens
|
|
@@ -339,12 +501,58 @@ function applyInjectionDowngrade(
|
|
|
339
501
|
injectionMode: "minimal",
|
|
340
502
|
toolResultMaxChars: prevState?.toolResultMaxChars,
|
|
341
503
|
compactionOptions: prevState?.compactionOptions,
|
|
342
|
-
exhausted:
|
|
504
|
+
exhausted: false,
|
|
343
505
|
},
|
|
344
506
|
estimatedTokens,
|
|
345
507
|
};
|
|
346
508
|
}
|
|
347
509
|
|
|
510
|
+
async function applyAutoCompressLatestTurn(
|
|
511
|
+
messages: Message[],
|
|
512
|
+
config: ReducerConfig,
|
|
513
|
+
applied: ReducerTier[],
|
|
514
|
+
prevState: ReducerState | undefined,
|
|
515
|
+
signal?: AbortSignal,
|
|
516
|
+
): Promise<ReducerStepResult> {
|
|
517
|
+
// Force-compress the latest turn as a last resort. Shares the forced
|
|
518
|
+
// compaction options, but runs after the middle tiers have been spent.
|
|
519
|
+
const compactionOptions: ContextWindowCompactOptions = {
|
|
520
|
+
force: true,
|
|
521
|
+
minKeepRecentUserTurns: 0,
|
|
522
|
+
};
|
|
523
|
+
|
|
524
|
+
const result = await defaultCompact({
|
|
525
|
+
conversationId: config.conversationId,
|
|
526
|
+
messages,
|
|
527
|
+
signal,
|
|
528
|
+
...compactionOptions,
|
|
529
|
+
overrideProfile: config.overrideProfile ?? null,
|
|
530
|
+
actorTrustClass: config.actorTrustClass,
|
|
531
|
+
});
|
|
532
|
+
const nextMessages = result.compacted ? result.messages : messages;
|
|
533
|
+
const estimatedTokens = result.compacted
|
|
534
|
+
? result.estimatedInputTokens
|
|
535
|
+
: estimatePromptTokens(nextMessages, config.systemPrompt, {
|
|
536
|
+
providerName: config.providerName,
|
|
537
|
+
toolTokenBudget: config.toolTokenBudget,
|
|
538
|
+
});
|
|
539
|
+
|
|
540
|
+
const nextApplied: ReducerTier[] = [...applied, "auto_compress_latest_turn"];
|
|
541
|
+
return {
|
|
542
|
+
messages: nextMessages,
|
|
543
|
+
tier: "auto_compress_latest_turn",
|
|
544
|
+
state: {
|
|
545
|
+
appliedTiers: nextApplied,
|
|
546
|
+
injectionMode: prevState?.injectionMode ?? "full",
|
|
547
|
+
toolResultMaxChars: prevState?.toolResultMaxChars,
|
|
548
|
+
compactionOptions,
|
|
549
|
+
exhausted: false,
|
|
550
|
+
},
|
|
551
|
+
estimatedTokens,
|
|
552
|
+
compactionResult: result,
|
|
553
|
+
};
|
|
554
|
+
}
|
|
555
|
+
|
|
348
556
|
/**
|
|
349
557
|
* Create the initial (empty) reducer state.
|
|
350
558
|
*/
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Corrected compaction target for reactive context-overflow recovery.
|
|
3
|
+
*
|
|
4
|
+
* When the provider rejects a request as context-too-large, the rejection
|
|
5
|
+
* reveals the *actual* token count it measured (e.g. "242201 tokens > 200000").
|
|
6
|
+
* The local estimator that gated the call may have significantly under-counted,
|
|
7
|
+
* so compacting to the nominal preflight budget would still overshoot the
|
|
8
|
+
* provider's real limit and re-reject. Scaling the preflight budget down by the
|
|
9
|
+
* observed estimator error yields a target that, once the estimator re-measures
|
|
10
|
+
* the reduced history, lands under the provider's true ceiling.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/** The compaction target plus the estimator-error context used to derive it. */
|
|
14
|
+
export interface CorrectedOverflowTarget {
|
|
15
|
+
/**
|
|
16
|
+
* Token budget the reducer should compact below. Equal to `preflightBudget`
|
|
17
|
+
* when the estimator did not under-count, and lower otherwise.
|
|
18
|
+
*/
|
|
19
|
+
targetTokens: number;
|
|
20
|
+
/**
|
|
21
|
+
* The provider-actual / estimator ratio when the estimator under-counted
|
|
22
|
+
* (> 1), otherwise `null`. Exposed so callers can log the adjustment without
|
|
23
|
+
* recomputing it.
|
|
24
|
+
*/
|
|
25
|
+
estimationErrorRatio: number | null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Compute the compaction target for an overflow rejection, lowering the
|
|
30
|
+
* preflight budget in proportion to how badly the estimator under-counted.
|
|
31
|
+
*
|
|
32
|
+
* @param preflightBudget The nominal target the estimator gates against.
|
|
33
|
+
* @param actualTokens Provider-reported token count from the rejection, or
|
|
34
|
+
* `null` when it could not be parsed.
|
|
35
|
+
* @param estimatedTokens The estimator's count for the same history at overflow.
|
|
36
|
+
*/
|
|
37
|
+
export function computeCorrectedOverflowTarget(params: {
|
|
38
|
+
preflightBudget: number;
|
|
39
|
+
actualTokens: number | null;
|
|
40
|
+
estimatedTokens: number;
|
|
41
|
+
}): CorrectedOverflowTarget {
|
|
42
|
+
const { preflightBudget, actualTokens, estimatedTokens } = params;
|
|
43
|
+
if (actualTokens != null && actualTokens > 0 && estimatedTokens > 0) {
|
|
44
|
+
const estimationErrorRatio = actualTokens / estimatedTokens;
|
|
45
|
+
if (estimationErrorRatio > 1.0) {
|
|
46
|
+
return {
|
|
47
|
+
targetTokens: Math.floor(preflightBudget / estimationErrorRatio),
|
|
48
|
+
estimationErrorRatio,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return { targetTokens: preflightBudget, estimationErrorRatio: null };
|
|
53
|
+
}
|