@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
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage for the turn-scoped overflow-recovery state machine that lives on
|
|
3
|
+
* `ContextWindowManager.reduceOverflowOneRung`. The manager holds the reducer
|
|
4
|
+
* state across the successive rung calls of a single turn, derives the
|
|
5
|
+
* compaction target from its own preflight budget corrected by the provider's
|
|
6
|
+
* actual token count, and starts a fresh ladder once the turn boundary resets
|
|
7
|
+
* it. `reduceContextOverflow` is mocked so these tests pin the manager's own
|
|
8
|
+
* orchestration without exercising the full reduction ladder.
|
|
9
|
+
*/
|
|
10
|
+
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
11
|
+
|
|
12
|
+
function makeLoggerStub(): Record<string, unknown> {
|
|
13
|
+
const stub: Record<string, unknown> = {};
|
|
14
|
+
for (const m of [
|
|
15
|
+
"info",
|
|
16
|
+
"warn",
|
|
17
|
+
"error",
|
|
18
|
+
"debug",
|
|
19
|
+
"trace",
|
|
20
|
+
"fatal",
|
|
21
|
+
"silent",
|
|
22
|
+
"child",
|
|
23
|
+
]) {
|
|
24
|
+
stub[m] = m === "child" ? () => makeLoggerStub() : () => {};
|
|
25
|
+
}
|
|
26
|
+
return stub;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
mock.module("../util/logger.js", () => ({
|
|
30
|
+
getLogger: () => makeLoggerStub(),
|
|
31
|
+
}));
|
|
32
|
+
|
|
33
|
+
// ── Module-level mock state ───────────────────────────────────────────
|
|
34
|
+
// The reducer call is captured so tests can assert which state and config the
|
|
35
|
+
// manager fed in; the returned step is seeded per call so tests can drive the
|
|
36
|
+
// ladder forward across rungs.
|
|
37
|
+
|
|
38
|
+
interface ReducerState {
|
|
39
|
+
appliedTiers: string[];
|
|
40
|
+
injectionMode: string;
|
|
41
|
+
exhausted: boolean;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
interface ReducerStepResult {
|
|
45
|
+
messages: unknown;
|
|
46
|
+
tier: string;
|
|
47
|
+
state: ReducerState;
|
|
48
|
+
estimatedTokens: number;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
let reduceCalls: Array<{
|
|
52
|
+
messages: unknown;
|
|
53
|
+
config: Record<string, unknown>;
|
|
54
|
+
state: ReducerState | undefined;
|
|
55
|
+
}> = [];
|
|
56
|
+
let reduceSteps: ReducerStepResult[] = [];
|
|
57
|
+
|
|
58
|
+
const estimateReturns: number[] = [];
|
|
59
|
+
|
|
60
|
+
mock.module("../context/token-estimator.js", () => ({
|
|
61
|
+
estimatePromptTokens: (): number => {
|
|
62
|
+
const next = estimateReturns.shift();
|
|
63
|
+
if (next === undefined) {
|
|
64
|
+
throw new Error(
|
|
65
|
+
"estimatePromptTokens called more times than estimateReturns seeded",
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
return next;
|
|
69
|
+
},
|
|
70
|
+
// Deterministic per-tool budget so tests can assert the manager fed the
|
|
71
|
+
// turn's resolved tool set (not the constructor-time snapshot) into the
|
|
72
|
+
// overflow estimate.
|
|
73
|
+
estimateToolsTokens: (tools: unknown[]): number => tools.length * 1_000,
|
|
74
|
+
}));
|
|
75
|
+
|
|
76
|
+
mock.module(
|
|
77
|
+
"../plugins/defaults/compaction/context-overflow-reducer.js",
|
|
78
|
+
() => ({
|
|
79
|
+
createInitialReducerState: (): ReducerState => ({
|
|
80
|
+
appliedTiers: [],
|
|
81
|
+
injectionMode: "full",
|
|
82
|
+
exhausted: false,
|
|
83
|
+
}),
|
|
84
|
+
reduceContextOverflow: async (
|
|
85
|
+
messages: unknown,
|
|
86
|
+
config: Record<string, unknown>,
|
|
87
|
+
state: ReducerState | undefined,
|
|
88
|
+
): Promise<ReducerStepResult> => {
|
|
89
|
+
reduceCalls.push({ messages, config, state });
|
|
90
|
+
const idx = reduceCalls.length - 1;
|
|
91
|
+
const step = reduceSteps[idx];
|
|
92
|
+
if (!step) {
|
|
93
|
+
throw new Error(
|
|
94
|
+
`Mock reducer called ${reduceCalls.length} time(s) but only ${reduceSteps.length} step(s) seeded`,
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
return step;
|
|
98
|
+
},
|
|
99
|
+
}),
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
import { ContextWindowManager } from "../plugins/defaults/compaction/window-manager.js";
|
|
103
|
+
import type { Message, Provider, ToolDefinition } from "../providers/types.js";
|
|
104
|
+
|
|
105
|
+
function makeProvider(): Provider {
|
|
106
|
+
return {
|
|
107
|
+
name: "mock-provider",
|
|
108
|
+
sendMessage: async () => ({
|
|
109
|
+
content: [],
|
|
110
|
+
model: "mock-model",
|
|
111
|
+
usage: { inputTokens: 0, outputTokens: 0 },
|
|
112
|
+
stopReason: "end_turn",
|
|
113
|
+
}),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function makeMessages(count: number): Message[] {
|
|
118
|
+
const messages: Message[] = [];
|
|
119
|
+
for (let i = 0; i < count; i++) {
|
|
120
|
+
messages.push({
|
|
121
|
+
role: i % 2 === 0 ? "user" : "assistant",
|
|
122
|
+
content: [{ type: "text", text: `msg ${i}` }],
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return messages;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function makeConfig(maxAttempts: number = 3) {
|
|
129
|
+
return {
|
|
130
|
+
enabled: true,
|
|
131
|
+
maxInputTokens: 200_000,
|
|
132
|
+
targetBudgetRatio: 0.3,
|
|
133
|
+
compactThreshold: 0.8,
|
|
134
|
+
summaryBudgetRatio: 0.05,
|
|
135
|
+
overflowRecovery: {
|
|
136
|
+
enabled: true,
|
|
137
|
+
safetyMarginRatio: 0.05,
|
|
138
|
+
maxAttempts,
|
|
139
|
+
interactiveLatestTurnCompression: "summarize" as const,
|
|
140
|
+
nonInteractiveLatestTurnCompression: "summarize" as const,
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function buildManager(maxAttempts: number = 3): ContextWindowManager {
|
|
146
|
+
return new ContextWindowManager({
|
|
147
|
+
provider: makeProvider(),
|
|
148
|
+
systemPrompt: "you are a test assistant",
|
|
149
|
+
config: makeConfig(maxAttempts),
|
|
150
|
+
conversationId: "conv-test",
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function makeStep(
|
|
155
|
+
appliedTiers: string[],
|
|
156
|
+
exhausted: boolean = false,
|
|
157
|
+
): ReducerStepResult {
|
|
158
|
+
return {
|
|
159
|
+
messages: makeMessages(2),
|
|
160
|
+
tier: appliedTiers[appliedTiers.length - 1] ?? "emergency_compaction",
|
|
161
|
+
state: { appliedTiers, injectionMode: "full", exhausted },
|
|
162
|
+
estimatedTokens: 100_000,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
describe("ContextWindowManager.reduceOverflowOneRung", () => {
|
|
167
|
+
beforeEach(() => {
|
|
168
|
+
reduceCalls = [];
|
|
169
|
+
reduceSteps = [];
|
|
170
|
+
estimateReturns.length = 0;
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test("holds reducer state across rungs within a turn", async () => {
|
|
174
|
+
// GIVEN a manager and a reducer that advances the ladder one rung per call
|
|
175
|
+
estimateReturns.push(240_000, 240_000);
|
|
176
|
+
reduceSteps = [
|
|
177
|
+
makeStep(["emergency_compaction"]),
|
|
178
|
+
makeStep(["emergency_compaction", "forced_compaction"]),
|
|
179
|
+
];
|
|
180
|
+
const manager = buildManager();
|
|
181
|
+
|
|
182
|
+
// WHEN two rungs run within the same turn
|
|
183
|
+
await manager.reduceOverflowOneRung(makeMessages(10), {
|
|
184
|
+
actualTokens: null,
|
|
185
|
+
allowAutoCompressLatestTurn: false,
|
|
186
|
+
});
|
|
187
|
+
await manager.reduceOverflowOneRung(makeMessages(10), {
|
|
188
|
+
actualTokens: null,
|
|
189
|
+
allowAutoCompressLatestTurn: false,
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
// THEN the first call seeds an empty ladder
|
|
193
|
+
expect(reduceCalls).toHaveLength(2);
|
|
194
|
+
expect(reduceCalls[0]?.state?.appliedTiers).toEqual([]);
|
|
195
|
+
// AND the second call carries the first rung's state forward
|
|
196
|
+
expect(reduceCalls[1]?.state?.appliedTiers).toEqual([
|
|
197
|
+
"emergency_compaction",
|
|
198
|
+
]);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
test("reuses the first rung's corrected target across the turn's later rungs", async () => {
|
|
202
|
+
// GIVEN the provider rejected at 480k while the estimator counted 240k, and
|
|
203
|
+
// only one estimate is seeded so a second estimate call would throw
|
|
204
|
+
estimateReturns.push(240_000);
|
|
205
|
+
reduceSteps = [
|
|
206
|
+
makeStep(["emergency_compaction"]),
|
|
207
|
+
makeStep(["emergency_compaction", "forced_compaction"]),
|
|
208
|
+
];
|
|
209
|
+
const manager = buildManager();
|
|
210
|
+
|
|
211
|
+
// WHEN two rungs run within the same turn with the provider's actual count
|
|
212
|
+
await manager.reduceOverflowOneRung(makeMessages(10), {
|
|
213
|
+
actualTokens: 480_000,
|
|
214
|
+
allowAutoCompressLatestTurn: false,
|
|
215
|
+
});
|
|
216
|
+
await manager.reduceOverflowOneRung(makeMessages(4), {
|
|
217
|
+
actualTokens: 480_000,
|
|
218
|
+
allowAutoCompressLatestTurn: false,
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
// THEN the corrected target (190k preflight / 2x error ratio) is computed
|
|
222
|
+
// once and reused, rather than re-derived against the shrunk prompt
|
|
223
|
+
expect(reduceCalls[0]?.config.targetTokens).toBe(95_000);
|
|
224
|
+
expect(reduceCalls[1]?.config.targetTokens).toBe(95_000);
|
|
225
|
+
expect(reduceCalls[0]?.config.previousEstimatedInputTokens).toBe(240_000);
|
|
226
|
+
expect(reduceCalls[1]?.config.previousEstimatedInputTokens).toBe(240_000);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
test("resetOverflowRecovery starts a fresh ladder", async () => {
|
|
230
|
+
// GIVEN a manager whose ladder has already advanced one rung
|
|
231
|
+
estimateReturns.push(240_000, 240_000);
|
|
232
|
+
reduceSteps = [
|
|
233
|
+
makeStep(["emergency_compaction"]),
|
|
234
|
+
makeStep(["emergency_compaction"]),
|
|
235
|
+
];
|
|
236
|
+
const manager = buildManager();
|
|
237
|
+
await manager.reduceOverflowOneRung(makeMessages(10), {
|
|
238
|
+
actualTokens: null,
|
|
239
|
+
allowAutoCompressLatestTurn: false,
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
// WHEN the turn boundary resets recovery and a new rung runs
|
|
243
|
+
manager.resetOverflowRecovery();
|
|
244
|
+
await manager.reduceOverflowOneRung(makeMessages(10), {
|
|
245
|
+
actualTokens: null,
|
|
246
|
+
allowAutoCompressLatestTurn: false,
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
// THEN the post-reset call seeds an empty ladder again
|
|
250
|
+
expect(reduceCalls[1]?.state?.appliedTiers).toEqual([]);
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
test("corrected target lowers below preflight when the provider under-counted", async () => {
|
|
254
|
+
// GIVEN the provider rejected at 480k while the estimator counted 240k
|
|
255
|
+
estimateReturns.push(240_000);
|
|
256
|
+
reduceSteps = [makeStep(["emergency_compaction"])];
|
|
257
|
+
const manager = buildManager();
|
|
258
|
+
|
|
259
|
+
// WHEN a rung runs with the provider's actual token count
|
|
260
|
+
await manager.reduceOverflowOneRung(makeMessages(10), {
|
|
261
|
+
actualTokens: 480_000,
|
|
262
|
+
allowAutoCompressLatestTurn: false,
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
// THEN the target is the preflight budget (200k * 0.95 = 190k) divided by
|
|
266
|
+
// the 2x estimation-error ratio
|
|
267
|
+
expect(reduceCalls[0]?.config.targetTokens).toBe(95_000);
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
test("estimates against the turn's resolved tool set, not the constructor snapshot", async () => {
|
|
271
|
+
// GIVEN a manager whose live tool set (3 tools) differs from the stale
|
|
272
|
+
// constructor-time budget snapshot
|
|
273
|
+
estimateReturns.push(240_000);
|
|
274
|
+
reduceSteps = [makeStep(["emergency_compaction"])];
|
|
275
|
+
const resolvedTools = [
|
|
276
|
+
{ name: "a" },
|
|
277
|
+
{ name: "b" },
|
|
278
|
+
{ name: "c" },
|
|
279
|
+
] as unknown as ToolDefinition[];
|
|
280
|
+
const manager = new ContextWindowManager({
|
|
281
|
+
provider: makeProvider(),
|
|
282
|
+
systemPrompt: "you are a test assistant",
|
|
283
|
+
config: makeConfig(),
|
|
284
|
+
conversationId: "conv-test",
|
|
285
|
+
toolTokenBudget: 50,
|
|
286
|
+
resolveTools: () => resolvedTools,
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
// WHEN a rung runs
|
|
290
|
+
await manager.reduceOverflowOneRung(makeMessages(10), {
|
|
291
|
+
actualTokens: null,
|
|
292
|
+
allowAutoCompressLatestTurn: false,
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
// THEN the reducer is fed the resolved tool budget (3 tools * 1k) rather
|
|
296
|
+
// than the constructor snapshot (50)
|
|
297
|
+
expect(reduceCalls[0]?.config.toolTokenBudget).toBe(3_000);
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
test("target is the full preflight budget when the actual count is unknown", async () => {
|
|
301
|
+
// GIVEN no provider-reported actual token count
|
|
302
|
+
estimateReturns.push(240_000);
|
|
303
|
+
reduceSteps = [makeStep(["emergency_compaction"])];
|
|
304
|
+
const manager = buildManager();
|
|
305
|
+
|
|
306
|
+
// WHEN a rung runs
|
|
307
|
+
await manager.reduceOverflowOneRung(makeMessages(10), {
|
|
308
|
+
actualTokens: null,
|
|
309
|
+
allowAutoCompressLatestTurn: false,
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
// THEN the target is the uncorrected preflight budget (200k * 0.95)
|
|
313
|
+
expect(reduceCalls[0]?.config.targetTokens).toBe(190_000);
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
test("long histories widen the safety margin", async () => {
|
|
317
|
+
// GIVEN a history longer than the 50-message threshold
|
|
318
|
+
estimateReturns.push(240_000);
|
|
319
|
+
reduceSteps = [makeStep(["emergency_compaction"])];
|
|
320
|
+
const manager = buildManager();
|
|
321
|
+
|
|
322
|
+
// WHEN a rung runs over 60 messages with no actual-token correction
|
|
323
|
+
await manager.reduceOverflowOneRung(makeMessages(60), {
|
|
324
|
+
actualTokens: null,
|
|
325
|
+
allowAutoCompressLatestTurn: false,
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
// THEN the safety margin bumps to 0.15 → preflight budget 200k * 0.85
|
|
329
|
+
expect(reduceCalls[0]?.config.targetTokens).toBe(170_000);
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
test("forwards the policy auto-compress permission to the ladder", async () => {
|
|
333
|
+
// GIVEN the overflow policy permits the terminal auto-compress rung
|
|
334
|
+
estimateReturns.push(240_000);
|
|
335
|
+
reduceSteps = [makeStep(["emergency_compaction"])];
|
|
336
|
+
const manager = buildManager();
|
|
337
|
+
|
|
338
|
+
// WHEN a rung runs
|
|
339
|
+
await manager.reduceOverflowOneRung(makeMessages(10), {
|
|
340
|
+
actualTokens: null,
|
|
341
|
+
allowAutoCompressLatestTurn: true,
|
|
342
|
+
overrideProfile: "fast",
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
// THEN the manager passes the policy decision and profile through to the
|
|
346
|
+
// reducer config alongside the budget it owns
|
|
347
|
+
expect(reduceCalls[0]?.config.allowAutoCompressLatestTurn).toBe(true);
|
|
348
|
+
expect(reduceCalls[0]?.config.overrideProfile).toBe("fast");
|
|
349
|
+
expect(reduceCalls[0]?.config.maxMiddleTierAttempts).toBe(3);
|
|
350
|
+
});
|
|
351
|
+
});
|
|
@@ -177,6 +177,7 @@ mock.module("../plugins/defaults/compaction/window-manager.js", () => ({
|
|
|
177
177
|
async maybeCompact() {
|
|
178
178
|
return { compacted: false };
|
|
179
179
|
}
|
|
180
|
+
resetOverflowRecovery() {}
|
|
180
181
|
},
|
|
181
182
|
createContextSummaryMessage: () => ({
|
|
182
183
|
role: "user",
|
|
@@ -273,7 +274,6 @@ mock.module("../agent/loop.js", () => ({
|
|
|
273
274
|
return {
|
|
274
275
|
history,
|
|
275
276
|
exitReason: null,
|
|
276
|
-
appendedNewMessages: true,
|
|
277
277
|
newMessages: history.slice(messages.length),
|
|
278
278
|
};
|
|
279
279
|
}
|
|
@@ -123,7 +123,7 @@ mock.module(
|
|
|
123
123
|
}),
|
|
124
124
|
);
|
|
125
125
|
|
|
126
|
-
mock.module("../
|
|
126
|
+
mock.module("../plugins/defaults/compaction/overflow-policy.js", () => ({
|
|
127
127
|
resolveOverflowAction: () => "fail_gracefully",
|
|
128
128
|
}));
|
|
129
129
|
|
|
@@ -264,6 +264,7 @@ mock.module("../plugins/defaults/history-repair/terminal.js", () => ({
|
|
|
264
264
|
},
|
|
265
265
|
}),
|
|
266
266
|
deepRepairHistory: (msgs: Message[]) => ({ messages: msgs, stats: {} }),
|
|
267
|
+
isRepairableOrderingError: () => false,
|
|
267
268
|
}));
|
|
268
269
|
|
|
269
270
|
mock.module("../daemon/conversation-usage.js", () => ({
|
|
@@ -331,10 +332,6 @@ mock.module("../daemon/conversation-error.js", () => ({
|
|
|
331
332
|
isContextTooLarge: () => false,
|
|
332
333
|
}));
|
|
333
334
|
|
|
334
|
-
mock.module("../daemon/conversation-slash.js", () => ({
|
|
335
|
-
isProviderOrderingError: () => false,
|
|
336
|
-
}));
|
|
337
|
-
|
|
338
335
|
mock.module("../util/truncate.js", () => ({
|
|
339
336
|
truncate: (s: string) => s,
|
|
340
337
|
}));
|
|
@@ -435,6 +432,17 @@ function makeCtx(
|
|
|
435
432
|
updateConfig: () => {},
|
|
436
433
|
shouldCompact: () => ({ needed: false, estimatedTokens: 0 }),
|
|
437
434
|
maybeCompact: async () => ({ compacted: false }),
|
|
435
|
+
resetOverflowRecovery: () => {},
|
|
436
|
+
reduceOverflowOneRung: async (msgs: Message[]) => ({
|
|
437
|
+
messages: msgs,
|
|
438
|
+
tier: "forced_compaction",
|
|
439
|
+
state: {
|
|
440
|
+
appliedTiers: ["forced_compaction"],
|
|
441
|
+
injectionMode: "full",
|
|
442
|
+
exhausted: true,
|
|
443
|
+
},
|
|
444
|
+
estimatedTokens: 1000,
|
|
445
|
+
}),
|
|
438
446
|
} as unknown as Conversation["contextWindowManager"],
|
|
439
447
|
contextCompactedMessageCount: 0,
|
|
440
448
|
contextCompactedAt: null,
|