@vellumai/assistant 0.8.3 → 0.8.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/ARCHITECTURE.md +2 -2
- package/docker-entrypoint.sh +0 -1
- package/docs/browser-use-architecture-phase2.md +1 -1
- package/knip.json +2 -1
- package/node_modules/@vellumai/gateway-client/src/types.ts +2 -0
- package/openapi.yaml +1492 -100
- package/package.json +1 -1
- package/src/__tests__/agent-loop-exit-reason.test.ts +4 -5
- package/src/__tests__/agent-loop-override-profile.test.ts +1 -1
- package/src/__tests__/agent-loop.test.ts +88 -3
- package/src/__tests__/anthropic-provider.test.ts +302 -33
- package/src/__tests__/approval-cascade.test.ts +1 -1
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +3 -3
- package/src/__tests__/audit-log-rotation.test.ts +70 -16
- package/src/__tests__/background-workers-disk-pressure.test.ts +4 -3
- package/src/__tests__/btw-routes.test.ts +2 -3
- package/src/__tests__/call-controller.test.ts +0 -1
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
- package/src/__tests__/channel-delivery-store.test.ts +193 -0
- package/src/__tests__/channel-guardian.test.ts +3 -3
- package/src/__tests__/channel-reply-delivery.test.ts +284 -5
- package/src/__tests__/channel-retry-sweep.test.ts +274 -1
- package/src/__tests__/checker.test.ts +6 -15
- package/src/__tests__/compaction-events.test.ts +2 -1
- package/src/__tests__/compactor-call-site-logging.test.ts +214 -0
- package/src/__tests__/compactor-preserved-tail-count.test.ts +110 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +5 -11
- package/src/__tests__/computer-use-tools.test.ts +2 -4
- package/src/__tests__/config-watcher.test.ts +1 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/context-token-estimator.test.ts +91 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +55 -4
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +228 -8
- package/src/__tests__/conversation-agent-loop.test.ts +188 -129
- package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -5
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
- package/src/__tests__/conversation-clean-command.test.ts +137 -0
- package/src/__tests__/conversation-clear-safety.test.ts +25 -25
- package/src/__tests__/conversation-confirmation-signals.test.ts +1 -1
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-error.test.ts +31 -0
- package/src/__tests__/conversation-fork-crud.test.ts +324 -0
- package/src/__tests__/conversation-lifecycle.test.ts +53 -12
- package/src/__tests__/conversation-load-history-repair.test.ts +1 -1
- package/src/__tests__/conversation-load-history-stripped.test.ts +279 -0
- package/src/__tests__/conversation-pairing.test.ts +2 -2
- package/src/__tests__/conversation-process-callsite.test.ts +1 -1
- package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -1
- package/src/__tests__/conversation-queue.test.ts +1 -1
- package/src/__tests__/conversation-routes-disk-view.test.ts +109 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +264 -81
- package/src/__tests__/conversation-seed-composer.test.ts +66 -4
- package/src/__tests__/conversation-skill-tools.test.ts +2 -5
- package/src/__tests__/conversation-slash-commands.test.ts +36 -8
- package/src/__tests__/conversation-slash-queue.test.ts +1 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +1 -1
- package/src/__tests__/conversation-speed-override.test.ts +1 -1
- package/src/__tests__/conversation-store.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +220 -0
- package/src/__tests__/conversation-sync-tags.test.ts +99 -32
- package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -1
- package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +9 -7
- package/src/__tests__/credential-execution-tools.test.ts +6 -6
- package/src/__tests__/credential-security-invariants.test.ts +7 -0
- package/src/__tests__/credential-vault-unit.test.ts +2 -2
- package/src/__tests__/cu-unified-flow.test.ts +10 -1
- package/src/__tests__/dm-backfill.test.ts +64 -0
- package/src/__tests__/dm-persistence.test.ts +33 -0
- package/src/__tests__/document-find-replace.test.ts +501 -0
- package/src/__tests__/dynamic-page-surface.test.ts +2 -2
- package/src/__tests__/email-html-renderer.test.ts +12 -0
- package/src/__tests__/first-greeting.test.ts +23 -2
- package/src/__tests__/gateway-flag-listener.test.ts +237 -0
- package/src/__tests__/gemini-provider.test.ts +78 -0
- package/src/__tests__/guardian-dispatch.test.ts +0 -1
- package/src/__tests__/guardian-outbound-http.test.ts +7 -5
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
- package/src/__tests__/headless-browser-navigate.test.ts +172 -0
- package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
- package/src/__tests__/heartbeat-service.test.ts +4 -0
- package/src/__tests__/host-bash-proxy.test.ts +6 -0
- package/src/__tests__/host-browser-proxy.test.ts +10 -0
- package/src/__tests__/host-cu-proxy.test.ts +8 -1
- package/src/__tests__/host-file-proxy.test.ts +8 -1
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/host-transfer-proxy.test.ts +8 -1
- package/src/__tests__/identity-routes.test.ts +57 -0
- package/src/__tests__/inbound-slack-persistence.test.ts +3 -0
- package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
- package/src/__tests__/injector-chain.test.ts +2 -0
- package/src/__tests__/injector-document-comments.test.ts +378 -0
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +4 -25
- package/src/__tests__/list-messages-attachments.test.ts +21 -17
- package/src/__tests__/list-messages-hidden-metadata.test.ts +217 -0
- package/src/__tests__/list-messages-page-latest.test.ts +130 -14
- package/src/__tests__/list-messages-tool-merge.test.ts +77 -17
- package/src/__tests__/llm-context-normalization.test.ts +0 -2
- package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
- package/src/__tests__/llm-resolver.test.ts +161 -9
- package/src/__tests__/llm-usage-store.test.ts +66 -0
- package/src/__tests__/log-export-routes.test.ts +99 -2
- package/src/__tests__/logger.test.ts +89 -0
- package/src/__tests__/mcp-abort-signal.test.ts +2 -2
- package/src/__tests__/media-generate-image.test.ts +31 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
- package/src/__tests__/message-queue-steer.test.ts +114 -0
- package/src/__tests__/model-intents.test.ts +2 -4
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/onboarding-template-contract.test.ts +1 -1
- package/src/__tests__/openai-provider.test.ts +151 -0
- package/src/__tests__/openai-responses-provider.test.ts +118 -16
- package/src/__tests__/outbound-slack-persistence.test.ts +187 -20
- package/src/__tests__/pending-interactions-resolved-event.test.ts +189 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
- package/src/__tests__/platform.test.ts +2 -5
- package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
- package/src/__tests__/plugin-bootstrap.test.ts +2 -2
- package/src/__tests__/plugin-source-watcher.test.ts +302 -0
- package/src/__tests__/plugin-tool-contribution.test.ts +13 -6
- package/src/__tests__/plugin-types.test.ts +3 -2
- package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
- package/src/__tests__/pricing.test.ts +12 -0
- package/src/__tests__/process-message-background-slack.test.ts +1 -51
- package/src/__tests__/process-message-display-content.test.ts +21 -16
- package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
- package/src/__tests__/registry.test.ts +2 -8
- package/src/__tests__/require-fresh-approval.test.ts +2 -2
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
- package/src/__tests__/server-history-render.test.ts +83 -4
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
- package/src/__tests__/skill-feature-flags.test.ts +2 -2
- package/src/__tests__/skill-projection-feature-flag.test.ts +4 -7
- package/src/__tests__/skill-projection.benchmark.test.ts +2 -6
- package/src/__tests__/skill-tool-factory.test.ts +1 -1
- package/src/__tests__/steer-tool-repair.test.ts +249 -0
- package/src/__tests__/subagent-notify-parent.test.ts +1 -1
- package/src/__tests__/suggestion-routes.test.ts +1 -0
- package/src/__tests__/sync-message-contract.test.ts +59 -0
- package/src/__tests__/system-prompt.test.ts +161 -124
- package/src/__tests__/terminal-tools.test.ts +12 -2
- package/src/__tests__/thinking-block-replay.test.ts +113 -0
- package/src/__tests__/thread-backfill.test.ts +370 -22
- package/src/__tests__/tool-approval-handler.test.ts +1 -5
- package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +15 -5
- package/src/__tests__/tool-executor.test.ts +89 -53
- package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +167 -0
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/twilio-routes.test.ts +1 -1
- package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
- package/src/__tests__/usage-routes.test.ts +3 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
- package/src/__tests__/web-fetch.test.ts +2 -2
- package/src/__tests__/workspace-git-service.test.ts +94 -10
- package/src/__tests__/workspace-migration-088-deprecate-background-conversation-override.test.ts +158 -0
- package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
- package/src/acp/prepare-agent-env.ts +78 -0
- package/src/acp/session-manager.ts +1 -1
- package/src/agent/attachments.ts +1 -0
- package/src/agent/loop.ts +65 -20
- package/src/api/README.md +5 -0
- package/src/api/index.ts +4 -0
- package/src/api/package.json +10 -0
- package/src/background-wake/background-wake-routes.test.ts +233 -0
- package/src/background-wake/next-wake.test.ts +289 -0
- package/src/background-wake/next-wake.ts +172 -0
- package/src/background-wake/runtime-registry.ts +24 -0
- package/src/browser/operations.ts +15 -0
- package/src/cli/commands/__tests__/browser.test.ts +23 -5
- package/src/cli/commands/__tests__/conversations-slack.test.ts +572 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
- package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
- package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +10 -12
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
- package/src/cli/commands/browser.ts +247 -0
- package/src/cli/commands/conversations.ts +128 -1
- package/src/cli/commands/domain.ts +91 -41
- package/src/cli/commands/inference-providers.ts +147 -1
- package/src/cli/commands/inference.ts +93 -40
- package/src/cli/commands/memory-v2-compare-render.ts +115 -0
- package/src/cli/commands/memory-v2.ts +483 -0
- package/src/cli/commands/memory-v3-render.ts +344 -0
- package/src/cli/commands/memory-v3.ts +316 -0
- package/src/cli/commands/notifications.ts +24 -2
- package/src/cli/program.ts +2 -0
- package/src/cli/utils/conversation-id.ts +17 -5
- package/src/config/assistant-feature-flags.ts +21 -9
- package/src/config/bundled-skills/app-builder/SKILL.md +2 -2
- package/src/config/bundled-skills/document-editor/SKILL.md +124 -0
- package/src/config/bundled-skills/document-editor/TOOLS.json +258 -0
- package/src/config/bundled-skills/document-editor/tools/comment-list.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/comment-reply.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/comment-resolve.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/document-find.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/document-replace-text.ts +12 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
- package/src/config/bundled-skills/media-processing/SKILL.md +8 -0
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
- package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +8 -0
- package/src/config/bundled-tool-registry.ts +24 -12
- package/src/config/call-site-defaults.ts +20 -0
- package/src/config/feature-flag-registry.json +115 -3
- package/src/config/llm-resolver.ts +16 -2
- package/src/config/schemas/__tests__/memory-v2.test.ts +217 -1
- package/src/config/schemas/call-site-catalog.ts +35 -0
- package/src/config/schemas/llm.ts +14 -0
- package/src/config/schemas/memory-v2.ts +294 -1
- package/src/config/schemas/memory.ts +2 -1
- package/src/context/compactor.ts +60 -1
- package/src/context/token-estimator.ts +47 -4
- package/src/context/window-manager.ts +25 -0
- package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
- package/src/conversations/message-consolidation.ts +404 -0
- package/src/credential-health/credential-health-service.ts +34 -19
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -1
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +66 -6
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +1 -1
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +357 -0
- package/src/daemon/__tests__/web-search-status-text.test.ts +287 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +155 -36
- package/src/daemon/conversation-agent-loop.ts +307 -88
- package/src/daemon/conversation-error.ts +31 -1
- package/src/daemon/conversation-lifecycle.ts +149 -118
- package/src/daemon/conversation-messaging.ts +3 -0
- package/src/daemon/conversation-process.ts +273 -0
- package/src/daemon/conversation-queue-manager.ts +14 -0
- package/src/daemon/conversation-runtime-assembly.ts +145 -84
- package/src/daemon/conversation-slash.ts +37 -5
- package/src/daemon/conversation-surfaces.ts +45 -2
- package/src/daemon/conversation-tool-setup.ts +70 -3
- package/src/daemon/conversation-usage.ts +2 -0
- package/src/daemon/conversation.ts +54 -32
- package/src/daemon/disk-pressure-guard.ts +14 -2
- package/src/daemon/first-greeting.ts +10 -0
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +498 -0
- package/src/daemon/handlers/config-a2a.ts +160 -0
- package/src/daemon/handlers/config-model.test.ts +2 -0
- package/src/daemon/handlers/conversations.ts +90 -3
- package/src/daemon/handlers/shared.ts +92 -29
- package/src/daemon/host-bash-proxy.ts +1 -1
- package/src/daemon/host-browser-proxy.ts +5 -5
- package/src/daemon/host-cu-proxy.ts +5 -5
- package/src/daemon/host-file-proxy.ts +5 -5
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/host-transfer-proxy.ts +11 -11
- package/src/daemon/lifecycle.ts +40 -23
- package/src/daemon/meet-manifest-loader.ts +1 -7
- package/src/daemon/message-protocol.ts +4 -0
- package/src/daemon/message-types/conversations.ts +14 -9
- package/src/daemon/message-types/document-comments.ts +50 -0
- package/src/daemon/message-types/home.ts +1 -13
- package/src/daemon/message-types/messages.ts +66 -7
- package/src/daemon/message-types/surfaces.ts +3 -1
- package/src/daemon/message-types/sync.ts +14 -0
- package/src/daemon/message-types/web-activity.ts +57 -0
- package/src/daemon/plugin-source-watcher.ts +135 -3
- package/src/daemon/process-message.ts +69 -12
- package/src/daemon/shutdown-handlers.ts +24 -5
- package/src/daemon/switch-inference-profile-tool.ts +52 -0
- package/src/daemon/tool-setup-types.ts +13 -0
- package/src/daemon/trust-context.ts +6 -0
- package/src/documents/document-comments-store.test.ts +338 -0
- package/src/documents/document-comments-store.ts +237 -0
- package/src/documents/document-store.ts +202 -0
- package/src/events/relationship-state-updated.ts +25 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +1 -2
- package/src/heartbeat/heartbeat-service.ts +1 -0
- package/src/home/__tests__/suggested-prompts.test.ts +33 -2
- package/src/home/feed-types.ts +6 -1
- package/src/home/home-content-refresh.ts +52 -0
- package/src/home/home-greeting-cache.ts +69 -0
- package/src/home/home-greeting.ts +85 -0
- package/src/home/suggested-prompts.ts +168 -9
- package/src/ipc/gateway-flag-listener.ts +123 -0
- package/src/ipc/skill-routes/registries.ts +8 -12
- package/src/memory/__tests__/db-async-query.test.ts +165 -0
- package/src/memory/__tests__/db-maintenance.test.ts +115 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +241 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +135 -2
- package/src/memory/__tests__/memory-retrospective-job.test.ts +327 -6
- package/src/memory/auto-analysis-enqueue.ts +5 -1
- package/src/memory/conversation-crud.ts +191 -100
- package/src/memory/conversation-starters-cadence.ts +3 -1
- package/src/memory/conversation-title-service.ts +19 -3
- package/src/memory/db-async-query.ts +214 -0
- package/src/memory/db-init.ts +26 -0
- package/src/memory/db-maintenance.ts +30 -21
- package/src/memory/delivery-crud.ts +41 -0
- package/src/memory/delivery-status.ts +141 -15
- package/src/memory/external-conversation-store.ts +32 -1
- package/src/memory/graph/bootstrap.ts +8 -1
- package/src/memory/graph/capability-seed.ts +7 -3
- package/src/memory/graph/conversation-graph-memory.ts +100 -17
- package/src/memory/graph/extraction.ts +1 -5
- package/src/memory/graph/graph-search.ts +7 -1
- package/src/memory/indexer.ts +28 -18
- package/src/memory/job-handlers/cleanup.ts +76 -18
- package/src/memory/job-handlers/conversation-starters.ts +1 -4
- package/src/memory/jobs/embed-pkb-file.ts +6 -1
- package/src/memory/jobs-store.ts +14 -0
- package/src/memory/jobs-worker.ts +68 -15
- package/src/memory/llm-request-log-source-clickhouse.ts +42 -2
- package/src/memory/llm-request-log-source-local.ts +7 -0
- package/src/memory/llm-request-log-source.ts +9 -2
- package/src/memory/llm-request-log-store.ts +43 -1
- package/src/memory/llm-usage-store.ts +24 -0
- package/src/memory/memory-retrospective-constants.ts +28 -0
- package/src/memory/memory-retrospective-enqueue.ts +11 -3
- package/src/memory/memory-retrospective-job.ts +413 -18
- package/src/memory/memory-retrospective-startup-cleanup.ts +3 -3
- package/src/memory/memory-v2-activation-log-store.ts +41 -14
- package/src/memory/migrations/100-core-tables.ts +1 -0
- package/src/memory/migrations/109-external-conversation-bindings.ts +1 -0
- package/src/memory/migrations/253-conversation-last-notified-profile.ts +15 -0
- package/src/memory/migrations/253-document-comments.ts +47 -0
- package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +43 -0
- package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +24 -0
- package/src/memory/migrations/256-memory-v2-injection-events.ts +113 -0
- package/src/memory/migrations/257-strip-base-url-non-openai-compatible.ts +22 -0
- package/src/memory/migrations/258-onboarding-events-prior-assistants.ts +13 -0
- package/src/memory/migrations/259-conversation-cleaned-at.ts +33 -0
- package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
- package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
- package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
- package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
- package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
- package/src/memory/migrations/index.ts +34 -0
- package/src/memory/migrations/registry.ts +58 -0
- package/src/memory/onboarding-events-store.ts +7 -0
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/conversations.ts +3 -0
- package/src/memory/schema/infrastructure.ts +22 -0
- package/src/memory/tool-usage-store.ts +36 -8
- package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
- package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
- package/src/memory/v2/__tests__/harness-metrics.test.ts +74 -0
- package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +225 -0
- package/src/memory/v2/__tests__/harness-runner.test.ts +109 -0
- package/src/memory/v2/__tests__/injection-events.test.ts +318 -0
- package/src/memory/v2/__tests__/injection.test.ts +158 -112
- package/src/memory/v2/__tests__/page-index.test.ts +365 -1
- package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
- package/src/memory/v2/__tests__/router.test.ts +660 -4
- package/src/memory/v2/consolidation-job.ts +14 -0
- package/src/memory/v2/harness/compare.ts +57 -0
- package/src/memory/v2/harness/metrics.ts +124 -0
- package/src/memory/v2/harness/oracle.ts +145 -0
- package/src/memory/v2/harness/replay-input.ts +224 -0
- package/src/memory/v2/harness/retriever.ts +74 -0
- package/src/memory/v2/harness/router-retriever.ts +43 -0
- package/src/memory/v2/harness/runner.ts +106 -0
- package/src/memory/v2/harness/trace.ts +58 -0
- package/src/memory/v2/injection-events.ts +101 -0
- package/src/memory/v2/injection.ts +42 -25
- package/src/memory/v2/page-index.ts +209 -7
- package/src/memory/v2/page-store.ts +18 -0
- package/src/memory/v2/prompts/router.ts +26 -1
- package/src/memory/v2/qdrant.ts +14 -2
- package/src/memory/v2/router.ts +369 -62
- package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
- package/src/memory/v3/__tests__/consolidation-job.test.ts +468 -0
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
- package/src/memory/v3/__tests__/edges.test.ts +563 -0
- package/src/memory/v3/__tests__/filter.test.ts +512 -0
- package/src/memory/v3/__tests__/gate.test.ts +574 -0
- package/src/memory/v3/__tests__/index-composition.test.ts +233 -0
- package/src/memory/v3/__tests__/loop.test.ts +530 -0
- package/src/memory/v3/__tests__/retriever.test.ts +226 -0
- package/src/memory/v3/__tests__/scouts.test.ts +440 -0
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +312 -0
- package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
- package/src/memory/v3/__tests__/traversal.test.ts +469 -0
- package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
- package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
- package/src/memory/v3/__tests__/tree-walk.test.ts +707 -0
- package/src/memory/v3/__tests__/validate.test.ts +245 -0
- package/src/memory/v3/auto-edges.ts +223 -0
- package/src/memory/v3/coactivation-store.ts +124 -0
- package/src/memory/v3/consolidation-job.ts +323 -0
- package/src/memory/v3/edge-learning-job.ts +160 -0
- package/src/memory/v3/edges.ts +249 -0
- package/src/memory/v3/filter.ts +281 -0
- package/src/memory/v3/gate.ts +334 -0
- package/src/memory/v3/index-composition.ts +113 -0
- package/src/memory/v3/llm-capture.ts +46 -0
- package/src/memory/v3/loop.ts +382 -0
- package/src/memory/v3/maintenance.ts +144 -0
- package/src/memory/v3/prompt-context.ts +33 -0
- package/src/memory/v3/prompts/consolidation.ts +458 -0
- package/src/memory/v3/prompts/system-prompts.ts +196 -0
- package/src/memory/v3/retriever.ts +33 -0
- package/src/memory/v3/scouts.ts +420 -0
- package/src/memory/v3/shadow-middleware.ts +305 -0
- package/src/memory/v3/traversal.ts +206 -0
- package/src/memory/v3/tree-index.ts +237 -0
- package/src/memory/v3/tree-store.ts +394 -0
- package/src/memory/v3/tree-walk.ts +351 -0
- package/src/memory/v3/types.ts +65 -0
- package/src/memory/v3/validate.ts +300 -0
- package/src/messaging/providers/index.ts +7 -1
- package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +329 -3
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +34 -1
- package/src/messaging/providers/slack/adapter.ts +178 -25
- package/src/messaging/providers/slack/api.test.ts +54 -0
- package/src/messaging/providers/slack/api.ts +119 -3
- package/src/messaging/providers/slack/client.ts +12 -0
- package/src/messaging/providers/slack/deep-link.ts +20 -1
- package/src/messaging/providers/slack/message-metadata.test.ts +48 -0
- package/src/messaging/providers/slack/message-metadata.ts +156 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +107 -75
- package/src/messaging/providers/slack/render-transcript.ts +176 -49
- package/src/messaging/providers/slack/send.test.ts +77 -0
- package/src/messaging/providers/slack/send.ts +8 -2
- package/src/messaging/providers/slack/types.ts +14 -0
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +4 -1
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +116 -54
- package/src/notifications/adapters/macos.ts +18 -1
- package/src/notifications/adapters/platform.ts +1 -1
- package/src/notifications/conversation-seed-composer.ts +14 -2
- package/src/notifications/decision-engine.ts +1 -4
- package/src/notifications/deferred-emit.ts +135 -0
- package/src/notifications/emit-signal.ts +38 -50
- package/src/notifications/home-feed-side-effect.ts +60 -30
- package/src/oauth/connect-orchestrator.ts +3 -0
- package/src/oauth/credential-token-resolver.ts +2 -0
- package/src/oauth/manual-token-connection.ts +19 -0
- package/src/oauth/oauth-store.ts +12 -0
- package/src/oauth/seed-providers.ts +22 -0
- package/src/permissions/prompter.ts +8 -5
- package/src/permissions/question-prompter.ts +5 -2
- package/src/permissions/secret-prompter.ts +6 -3
- package/src/plugin-api/index.ts +4 -0
- package/src/plugin-api/types.ts +7 -33
- package/src/plugins/defaults/index.ts +6 -0
- package/src/plugins/defaults/injectors.ts +100 -20
- package/src/plugins/external-plugin-loader.ts +5 -68
- package/src/plugins/types.ts +11 -16
- package/src/proactive-artifact/aux-message-injector.ts +17 -4
- package/src/prompts/__tests__/system-prompt.test.ts +46 -2
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
- package/src/prompts/normalize-onboarding.ts +40 -0
- package/src/prompts/persona-resolver.ts +36 -21
- package/src/prompts/sections.ts +69 -19
- package/src/prompts/system-prompt.ts +118 -216
- package/src/prompts/template-detection.ts +37 -0
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +141 -0
- package/src/prompts/templates/BOOTSTRAP.md +10 -2
- package/src/prompts/templates/VOICE.md +3 -0
- package/src/prompts/templates/system-sections.ts +281 -9
- package/src/providers/__tests__/connection-model-compat.test.ts +234 -0
- package/src/providers/__tests__/retry-callsite.test.ts +85 -5
- package/src/providers/anthropic/client.ts +159 -66
- package/src/providers/call-site-routing.ts +14 -2
- package/src/providers/connection-model-compat.ts +38 -0
- package/src/providers/connection-resolution.ts +16 -2
- package/src/providers/fireworks/client.ts +20 -2
- package/src/providers/gemini/client.ts +49 -6
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +342 -0
- package/src/providers/inference/__tests__/base-url-security.test.ts +189 -0
- package/src/providers/inference/__tests__/codex-token-refresh.test.ts +254 -0
- package/src/providers/inference/adapter-factory.ts +18 -1
- package/src/providers/inference/auth.ts +3 -3
- package/src/providers/inference/codex-token-refresh.ts +128 -0
- package/src/providers/inference/resolve-auth.ts +49 -6
- package/src/providers/minimax/client.ts +106 -0
- package/src/providers/model-catalog.ts +91 -1
- package/src/providers/model-intents.ts +1 -1
- package/src/providers/openai/chat-completions-provider.ts +63 -23
- package/src/providers/openai/codex-models.ts +18 -0
- package/src/providers/openai/responses-provider.ts +86 -23
- package/src/providers/openrouter/client.ts +5 -1
- package/src/providers/provider-send-message.ts +7 -1
- package/src/providers/retry.ts +34 -3
- package/src/providers/thinking-config.ts +26 -1
- package/src/providers/types.ts +25 -0
- package/src/providers/usage-tracking.ts +2 -0
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/__tests__/agent-wake.test.ts +214 -0
- package/src/runtime/__tests__/background-job-runner.test.ts +128 -0
- package/src/runtime/agent-wake.ts +152 -56
- package/src/runtime/assistant-event-hub.ts +76 -6
- package/src/runtime/auth/route-policy.ts +43 -3
- package/src/runtime/background-job-runner.ts +26 -0
- package/src/runtime/btw-sidechain.ts +0 -6
- package/src/runtime/channel-reply-delivery.ts +182 -47
- package/src/runtime/channel-retry-sweep.ts +141 -16
- package/src/runtime/http-types.ts +7 -6
- package/src/runtime/migrations/vbundle-builder.ts +10 -3
- package/src/runtime/pending-interactions.ts +50 -8
- package/src/runtime/routes/__tests__/content-source-routes.test.ts +162 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +161 -1
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +14 -0
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +290 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
- package/src/runtime/routes/__tests__/sanity-routes.test.ts +280 -0
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +266 -0
- package/src/runtime/routes/acp-routes.test.ts +255 -6
- package/src/runtime/routes/acp-routes.ts +8 -1
- package/src/runtime/routes/approval-routes.ts +4 -1
- package/src/runtime/routes/avatar-routes.ts +10 -10
- package/src/runtime/routes/background-wake-routes.ts +188 -0
- package/src/runtime/routes/browser-tabs-routes.ts +200 -0
- package/src/runtime/routes/btw-routes.ts +0 -6
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +246 -0
- package/src/runtime/routes/content-source-routes.ts +78 -0
- package/src/runtime/routes/conversation-cli-routes.ts +147 -2
- package/src/runtime/routes/conversation-list-routes.ts +12 -4
- package/src/runtime/routes/conversation-management-routes.ts +77 -20
- package/src/runtime/routes/conversation-query-routes.ts +196 -31
- package/src/runtime/routes/conversation-routes.ts +472 -425
- package/src/runtime/routes/conversation-starter-routes.ts +6 -3
- package/src/runtime/routes/disk-pressure-routes.ts +1 -1
- package/src/runtime/routes/document-comments-routes.ts +287 -0
- package/src/runtime/routes/documents-routes.ts +33 -0
- package/src/runtime/routes/domain-routes.ts +60 -10
- package/src/runtime/routes/email-routes.ts +5 -2
- package/src/runtime/routes/events-routes.ts +54 -10
- package/src/runtime/routes/group-routes.ts +24 -8
- package/src/runtime/routes/home-feed-routes.ts +6 -3
- package/src/runtime/routes/host-app-control-routes.ts +1 -1
- package/src/runtime/routes/host-browser-routes.ts +17 -2
- package/src/runtime/routes/host-cu-routes.ts +2 -2
- package/src/runtime/routes/identity-routes.ts +21 -0
- package/src/runtime/routes/inbound-message-handler.ts +288 -58
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +365 -6
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +283 -82
- package/src/runtime/routes/index.ts +20 -4
- package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
- package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
- package/src/runtime/routes/inference-provider-connection-routes.ts +63 -7
- package/src/runtime/routes/integrations/a2a.ts +60 -1
- package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
- package/src/runtime/routes/log-export-routes.ts +39 -0
- package/src/runtime/routes/memory-item-routes.ts +8 -3
- package/src/runtime/routes/memory-v2-routes.ts +427 -0
- package/src/runtime/routes/memory-v3-routes.ts +316 -0
- package/src/runtime/routes/migration-routes.ts +21 -24
- package/src/runtime/routes/notification-routes.ts +19 -2
- package/src/runtime/routes/plugins-routes.ts +337 -0
- package/src/runtime/routes/question-routes.ts +4 -1
- package/src/runtime/routes/rename-conversation-routes.ts +6 -2
- package/src/runtime/routes/sanity-routes.ts +159 -0
- package/src/runtime/routes/secret-routes.ts +25 -5
- package/src/runtime/routes/settings-routes.ts +12 -11
- package/src/runtime/routes/slack-channel-routes.ts +188 -0
- package/src/runtime/routes/workspace-routes.ts +25 -10
- package/src/runtime/services/conversation-serializer.ts +30 -4
- package/src/runtime/sync/resource-sync-events.ts +106 -38
- package/src/runtime/sync/sync-publisher.test.ts +49 -0
- package/src/runtime/sync/sync-publisher.ts +2 -1
- package/src/runtime/verification-outbound-actions.ts +73 -1
- package/src/schedule/integration-status.ts +3 -1
- package/src/security/__tests__/oauth2-device-code.test.ts +479 -0
- package/src/security/oauth2-device-code.ts +307 -0
- package/src/security/oauth2.ts +26 -9
- package/src/security/secure-keys.ts +5 -0
- package/src/skills/catalog-install.ts +6 -2
- package/src/telemetry/types.ts +12 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/acp/spawn.test.ts +119 -0
- package/src/tools/acp/spawn.ts +15 -2
- package/src/tools/apps/definitions.ts +2 -8
- package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
- package/src/tools/ask-question/ask-question-tool.ts +38 -45
- package/src/tools/browser/__tests__/pinned-tabs.test.ts +150 -0
- package/src/tools/browser/browser-execution.ts +106 -0
- package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +28 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +4 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +22 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +42 -2
- package/src/tools/browser/cdp-client/factory.ts +171 -4
- package/src/tools/browser/cdp-client/local-cdp-client.ts +21 -0
- package/src/tools/browser/cdp-client/types.ts +101 -0
- package/src/tools/browser/pinned-tabs.ts +146 -0
- package/src/tools/computer-use/definitions.ts +22 -78
- package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
- package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
- package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
- package/src/tools/credentials/vault.ts +3 -9
- package/src/tools/document/document-comment-tool.test.ts +379 -0
- package/src/tools/document/document-comment-tool.ts +156 -0
- package/src/tools/document/document-tool.ts +187 -2
- package/src/tools/execution-target.ts +21 -23
- package/src/tools/executor.ts +6 -1
- package/src/tools/filesystem/edit.ts +3 -9
- package/src/tools/filesystem/list.ts +3 -9
- package/src/tools/filesystem/read.ts +3 -9
- package/src/tools/filesystem/write.ts +3 -9
- package/src/tools/host-filesystem/edit.ts +3 -9
- package/src/tools/host-filesystem/read.ts +3 -9
- package/src/tools/host-filesystem/transfer.ts +3 -9
- package/src/tools/host-filesystem/write.ts +3 -9
- package/src/tools/host-terminal/host-shell.ts +3 -9
- package/src/tools/mcp/mcp-tool-factory.ts +1 -8
- package/src/tools/memory/register.test.ts +1 -1
- package/src/tools/memory/register.ts +4 -9
- package/src/tools/network/__tests__/web-fetch-metadata.test.ts +229 -0
- package/src/tools/network/__tests__/web-search-metadata.test.ts +346 -0
- package/src/tools/network/domain-normalize.ts +17 -0
- package/src/tools/network/web-fetch.ts +216 -73
- package/src/tools/network/web-search.ts +216 -98
- package/src/tools/registry.ts +7 -23
- package/src/tools/schema-transforms.ts +1 -1
- package/src/tools/skills/execute.ts +3 -9
- package/src/tools/skills/load.ts +3 -9
- package/src/tools/skills/skill-tool-factory.ts +1 -8
- package/src/tools/subagent/notify-parent.ts +3 -9
- package/src/tools/system/request-permission.ts +3 -9
- package/src/tools/terminal/safe-env.ts +3 -2
- package/src/tools/terminal/shell.ts +3 -9
- package/src/tools/tool-approval-handler.ts +19 -12
- package/src/tools/tool-defaults.ts +94 -0
- package/src/tools/types.ts +31 -98
- package/src/tools/ui-surface/definitions.ts +9 -23
- package/src/types/onboarding-context.ts +4 -0
- package/src/usage/pricing.ts +23 -0
- package/src/usage/types.ts +12 -0
- package/src/util/__tests__/favicon.test.ts +84 -0
- package/src/util/favicon.ts +40 -0
- package/src/util/logger.ts +16 -7
- package/src/util/platform.ts +7 -7
- package/src/util/sqlite3-runtime.ts +65 -0
- package/src/workspace/git-service.ts +75 -4
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
- package/src/workspace/migrations/088-deprecate-background-conversation-override.ts +103 -0
- package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
- package/src/workspace/migrations/registry.ts +4 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
- package/src/__tests__/message-complete-display-id.test.ts +0 -175
- package/src/config/bundled-skills/document/SKILL.md +0 -54
- package/src/config/bundled-skills/document/TOOLS.json +0 -106
- package/src/daemon/seed-files.ts +0 -18
- package/src/prompts/cache-boundary.ts +0 -8
- package/src/runtime/routes/interface-routes.ts +0 -43
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-create.ts +0 -0
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-delete.ts +0 -0
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-list.ts +0 -0
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-read.ts +0 -0
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-update.ts +0 -0
|
@@ -24,6 +24,7 @@ import type { ChannelId, InterfaceId } from "../channels/types.js";
|
|
|
24
24
|
import { parseChannelId, parseInterfaceId } from "../channels/types.js";
|
|
25
25
|
import { CHANNEL_IDS, isChannelId } from "../channels/types.js";
|
|
26
26
|
import { getConfig } from "../config/loader.js";
|
|
27
|
+
import { findDisplayTurnEndIndex } from "../conversations/message-consolidation.js";
|
|
27
28
|
import type { TrustContext } from "../daemon/trust-context.js";
|
|
28
29
|
import { UserError } from "../util/errors.js";
|
|
29
30
|
import { safeParseRecord } from "../util/json.js";
|
|
@@ -47,10 +48,11 @@ import {
|
|
|
47
48
|
} from "./conversation-disk-view.js";
|
|
48
49
|
import { ensureDisplayOrderMigration } from "./conversation-display-order-migration.js";
|
|
49
50
|
import { ensureGroupMigration } from "./conversation-group-migration.js";
|
|
51
|
+
import { runAsyncSqlite } from "./db-async-query.js";
|
|
50
52
|
import { getDb, getSqliteFrom } from "./db-connection.js";
|
|
51
53
|
import { forkGraphMemoryState } from "./graph/graph-memory-state-store.js";
|
|
52
54
|
import { indexMessageNow } from "./indexer.js";
|
|
53
|
-
import {
|
|
55
|
+
import { MEMORY_RETROSPECTIVE_SOURCES } from "./memory-retrospective-constants.js";
|
|
54
56
|
import { forkRetrospectiveState } from "./memory-retrospective-state.js";
|
|
55
57
|
import { rawExec, rawGet, rawRun } from "./raw-query.js";
|
|
56
58
|
import {
|
|
@@ -190,6 +192,7 @@ export interface ConversationRow {
|
|
|
190
192
|
contextSummary: string | null;
|
|
191
193
|
contextCompactedMessageCount: number;
|
|
192
194
|
contextCompactedAt: number | null;
|
|
195
|
+
historyStrippedAt: number | null;
|
|
193
196
|
slackContextCompactionWatermarkTs: string | null;
|
|
194
197
|
slackContextCompactionWatermarkAt: number | null;
|
|
195
198
|
conversationType: string;
|
|
@@ -206,6 +209,7 @@ export interface ConversationRow {
|
|
|
206
209
|
inferenceProfile: string | null;
|
|
207
210
|
inferenceProfileSessionId: string | null;
|
|
208
211
|
inferenceProfileExpiresAt: number | null;
|
|
212
|
+
lastNotifiedInferenceProfile: string | null;
|
|
209
213
|
}
|
|
210
214
|
|
|
211
215
|
export const parseConversation = createRowMapper<
|
|
@@ -222,6 +226,7 @@ export const parseConversation = createRowMapper<
|
|
|
222
226
|
contextSummary: "contextSummary",
|
|
223
227
|
contextCompactedMessageCount: "contextCompactedMessageCount",
|
|
224
228
|
contextCompactedAt: "contextCompactedAt",
|
|
229
|
+
historyStrippedAt: "historyStrippedAt",
|
|
225
230
|
slackContextCompactionWatermarkTs: "slackContextCompactionWatermarkTs",
|
|
226
231
|
slackContextCompactionWatermarkAt: "slackContextCompactionWatermarkAt",
|
|
227
232
|
conversationType: "conversationType",
|
|
@@ -238,6 +243,7 @@ export const parseConversation = createRowMapper<
|
|
|
238
243
|
inferenceProfile: "inferenceProfile",
|
|
239
244
|
inferenceProfileSessionId: "inferenceProfileSessionId",
|
|
240
245
|
inferenceProfileExpiresAt: "inferenceProfileExpiresAt",
|
|
246
|
+
lastNotifiedInferenceProfile: "lastNotifiedInferenceProfile",
|
|
241
247
|
});
|
|
242
248
|
|
|
243
249
|
export interface MessageRow {
|
|
@@ -482,7 +488,7 @@ export function findMostRecentRetrospectiveFor(
|
|
|
482
488
|
.from(conversations)
|
|
483
489
|
.where(
|
|
484
490
|
and(
|
|
485
|
-
|
|
491
|
+
inArray(conversations.source, MEMORY_RETROSPECTIVE_SOURCES),
|
|
486
492
|
eq(conversations.forkParentConversationId, currentId),
|
|
487
493
|
),
|
|
488
494
|
)
|
|
@@ -535,6 +541,32 @@ function getConversationGroupId(conversationId: string): string | null {
|
|
|
535
541
|
export function forkConversation(params: {
|
|
536
542
|
conversationId: string;
|
|
537
543
|
throughMessageId?: string;
|
|
544
|
+
/**
|
|
545
|
+
* Override the fork's `source` column. Defaults to the standard
|
|
546
|
+
* `createConversation` default (`"user"`). Used by fork-based memory
|
|
547
|
+
* retrospectives to mark the fork as a retrospective artifact distinct
|
|
548
|
+
* from a user-initiated fork, so dedup and cleanup queries can scope
|
|
549
|
+
* correctly.
|
|
550
|
+
*/
|
|
551
|
+
source?: string;
|
|
552
|
+
/**
|
|
553
|
+
* Optional title for the fork. Defaults to `<parent title> (Fork)`.
|
|
554
|
+
*/
|
|
555
|
+
title?: string;
|
|
556
|
+
/**
|
|
557
|
+
* Override the fork's `conversationType` column. Defaults to `"standard"`.
|
|
558
|
+
* Used by fork-based memory retrospectives to bucket the fork as a
|
|
559
|
+
* `"background"` conversation so it doesn't surface in the user's
|
|
560
|
+
* conversation list.
|
|
561
|
+
*/
|
|
562
|
+
conversationType?: ConversationCreateType;
|
|
563
|
+
/**
|
|
564
|
+
* Override the fork's `groupId`. Defaults to the parent conversation's
|
|
565
|
+
* group (or `"system:all"` when the parent has none). Used by fork-based
|
|
566
|
+
* memory retrospectives to route the fork into a dedicated background
|
|
567
|
+
* group.
|
|
568
|
+
*/
|
|
569
|
+
groupId?: string;
|
|
538
570
|
}): ConversationRow {
|
|
539
571
|
const { conversationId, throughMessageId } = params;
|
|
540
572
|
const db = getDb();
|
|
@@ -551,17 +583,30 @@ export function forkConversation(params: {
|
|
|
551
583
|
);
|
|
552
584
|
}
|
|
553
585
|
|
|
554
|
-
const
|
|
586
|
+
const initialBoundaryIndex =
|
|
555
587
|
throughMessageId == null
|
|
556
588
|
? sourceMessages.length - 1
|
|
557
589
|
: sourceMessages.findIndex((message) => message.id === throughMessageId);
|
|
558
590
|
|
|
559
|
-
if (throughMessageId != null &&
|
|
591
|
+
if (throughMessageId != null && initialBoundaryIndex === -1) {
|
|
560
592
|
throw new UserError(
|
|
561
593
|
`Message ${throughMessageId} does not belong to conversation ${conversationId}`,
|
|
562
594
|
);
|
|
563
595
|
}
|
|
564
596
|
|
|
597
|
+
// Extend the boundary to cover the full display turn the client
|
|
598
|
+
// addressed. The read-path collapses each assistant turn across
|
|
599
|
+
// multiple DB rows — consecutive assistant rows AND tool-result-only
|
|
600
|
+
// user rows between them — so "fork through message X" semantically
|
|
601
|
+
// means "fork through the entire display turn containing X" no matter
|
|
602
|
+
// which DB row in the cluster the client supplied. Single source of
|
|
603
|
+
// truth is `findDisplayTurnEndIndex`, shared with the read path so
|
|
604
|
+
// both stay in sync.
|
|
605
|
+
const copyBoundaryIndex = findDisplayTurnEndIndex(
|
|
606
|
+
sourceMessages,
|
|
607
|
+
initialBoundaryIndex,
|
|
608
|
+
);
|
|
609
|
+
|
|
565
610
|
const visibleWindowStartIndex = Math.max(
|
|
566
611
|
0,
|
|
567
612
|
Math.min(
|
|
@@ -576,8 +621,20 @@ export function forkConversation(params: {
|
|
|
576
621
|
copyBoundaryIndex >= 0
|
|
577
622
|
? sourceMessages.slice(0, copyBoundaryIndex + 1)
|
|
578
623
|
: ([] as MessageRow[]);
|
|
624
|
+
|
|
625
|
+
// Inherit the history-strip marker only when the fork boundary is at-or-
|
|
626
|
+
// after the strip event. Pre-strip forks branch from history that pre-
|
|
627
|
+
// dates the strip, so the marker would be a no-op and is misleading to
|
|
628
|
+
// copy.
|
|
629
|
+
const sourceHistoryStrippedAt = sourceConversation.historyStrippedAt ?? null;
|
|
630
|
+
const boundaryMessageCreatedAt = messagesToCopy.at(-1)?.createdAt ?? null;
|
|
631
|
+
const inheritsHistoryStrippedAt =
|
|
632
|
+
sourceHistoryStrippedAt != null &&
|
|
633
|
+
boundaryMessageCreatedAt != null &&
|
|
634
|
+
boundaryMessageCreatedAt >= sourceHistoryStrippedAt;
|
|
579
635
|
const forkParentMessageId = messagesToCopy.at(-1)?.id ?? null;
|
|
580
|
-
const forkTitle =
|
|
636
|
+
const forkTitle =
|
|
637
|
+
params.title ?? `${sourceConversation.title ?? "Untitled"} (Fork)`;
|
|
581
638
|
|
|
582
639
|
// Collect disk-sync work to run after the transaction commits.
|
|
583
640
|
const diskSyncQueue: Array<{
|
|
@@ -597,8 +654,9 @@ export function forkConversation(params: {
|
|
|
597
654
|
const forkedConversation = db.transaction(() => {
|
|
598
655
|
const fc = createConversation({
|
|
599
656
|
title: forkTitle,
|
|
600
|
-
conversationType: "standard",
|
|
601
|
-
groupId: parentGroupId ?? "system:all",
|
|
657
|
+
conversationType: params.conversationType ?? "standard",
|
|
658
|
+
groupId: params.groupId ?? parentGroupId ?? "system:all",
|
|
659
|
+
...(params.source != null ? { source: params.source } : {}),
|
|
602
660
|
});
|
|
603
661
|
|
|
604
662
|
db.update(conversations)
|
|
@@ -620,6 +678,9 @@ export function forkConversation(params: {
|
|
|
620
678
|
slackContextCompactionWatermarkAt: preserveSourceCompactionState
|
|
621
679
|
? sourceConversation.slackContextCompactionWatermarkAt
|
|
622
680
|
: null,
|
|
681
|
+
historyStrippedAt: inheritsHistoryStrippedAt
|
|
682
|
+
? sourceHistoryStrippedAt
|
|
683
|
+
: null,
|
|
623
684
|
inferenceProfile: sourceConversation.inferenceProfile,
|
|
624
685
|
})
|
|
625
686
|
.where(eq(conversations.id, fc.id))
|
|
@@ -1229,10 +1290,14 @@ interface PaginatedMessagesResult {
|
|
|
1229
1290
|
hasMore: boolean;
|
|
1230
1291
|
}
|
|
1231
1292
|
|
|
1293
|
+
const PAGINATION_CHUNK_MIN = 50;
|
|
1294
|
+
const PAGINATION_SCAN_CAP = 10_000;
|
|
1295
|
+
|
|
1232
1296
|
export function getMessagesPaginated(
|
|
1233
1297
|
conversationId: string,
|
|
1234
1298
|
limit: number | undefined,
|
|
1235
1299
|
beforeTimestamp?: number,
|
|
1300
|
+
filter?: (row: MessageRow) => boolean,
|
|
1236
1301
|
): PaginatedMessagesResult {
|
|
1237
1302
|
const db = getDb();
|
|
1238
1303
|
|
|
@@ -1248,51 +1313,69 @@ export function getMessagesPaginated(
|
|
|
1248
1313
|
.orderBy(asc(messages.createdAt))
|
|
1249
1314
|
.all()
|
|
1250
1315
|
.map(parseMessage);
|
|
1251
|
-
return {
|
|
1316
|
+
return {
|
|
1317
|
+
messages: filter ? rows.filter(filter) : rows,
|
|
1318
|
+
hasMore: false,
|
|
1319
|
+
};
|
|
1252
1320
|
}
|
|
1253
1321
|
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1322
|
+
// Walk pages newest→oldest, applying `filter` in TS (metadata parsing is
|
|
1323
|
+
// JSON, not a structured column). Keep fetching until we have `limit + 1`
|
|
1324
|
+
// visible rows or the DB is exhausted, so `hasMore` and the cursor reflect
|
|
1325
|
+
// the visible page rather than the unfiltered row count. Without this loop,
|
|
1326
|
+
// a fully-hidden page returns `{ messages: [], hasMore: true }` with no
|
|
1327
|
+
// cursor, which stalls the web client's older-page fetch.
|
|
1328
|
+
let cursorCreatedAt = beforeTimestamp;
|
|
1329
|
+
let cursorMessageId: string | undefined;
|
|
1330
|
+
const visible: MessageRow[] = [];
|
|
1331
|
+
const chunkSize = Math.max(limit + 1, PAGINATION_CHUNK_MIN);
|
|
1332
|
+
// Bound the work a single request can do when `filter` rejects nearly every
|
|
1333
|
+
// row — otherwise a pathological filter against a huge conversation would
|
|
1334
|
+
// tie up a connection for thousands of roundtrips.
|
|
1335
|
+
let rowsScanned = 0;
|
|
1336
|
+
|
|
1337
|
+
while (visible.length < limit + 1 && rowsScanned < PAGINATION_SCAN_CAP) {
|
|
1338
|
+
const cursorPredicate =
|
|
1339
|
+
cursorCreatedAt === undefined
|
|
1340
|
+
? undefined
|
|
1341
|
+
: cursorMessageId === undefined
|
|
1342
|
+
? lt(messages.createdAt, cursorCreatedAt)
|
|
1343
|
+
: or(
|
|
1344
|
+
lt(messages.createdAt, cursorCreatedAt),
|
|
1345
|
+
and(
|
|
1346
|
+
eq(messages.createdAt, cursorCreatedAt),
|
|
1347
|
+
lt(messages.id, cursorMessageId),
|
|
1348
|
+
),
|
|
1349
|
+
);
|
|
1258
1350
|
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1351
|
+
const chunk = db
|
|
1352
|
+
.select()
|
|
1353
|
+
.from(messages)
|
|
1354
|
+
.where(and(eq(messages.conversationId, conversationId), cursorPredicate))
|
|
1355
|
+
.orderBy(desc(messages.createdAt), desc(messages.id))
|
|
1356
|
+
.limit(chunkSize)
|
|
1357
|
+
.all()
|
|
1358
|
+
.map(parseMessage);
|
|
1267
1359
|
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1360
|
+
if (chunk.length === 0) break;
|
|
1361
|
+
rowsScanned += chunk.length;
|
|
1362
|
+
|
|
1363
|
+
for (const row of chunk) {
|
|
1364
|
+
if (!filter || filter(row)) visible.push(row);
|
|
1365
|
+
if (visible.length >= limit + 1) break;
|
|
1366
|
+
}
|
|
1367
|
+
|
|
1368
|
+
if (chunk.length < chunkSize) break;
|
|
1369
|
+
const lastRow = chunk[chunk.length - 1];
|
|
1370
|
+
cursorCreatedAt = lastRow.createdAt;
|
|
1371
|
+
cursorMessageId = lastRow.id;
|
|
1271
1372
|
}
|
|
1272
|
-
rows.reverse();
|
|
1273
1373
|
|
|
1274
|
-
|
|
1275
|
-
|
|
1374
|
+
const hasMore = visible.length > limit;
|
|
1375
|
+
if (hasMore) visible.splice(limit);
|
|
1376
|
+
visible.reverse();
|
|
1276
1377
|
|
|
1277
|
-
|
|
1278
|
-
conversationId: string,
|
|
1279
|
-
beforeTimestamp: number,
|
|
1280
|
-
): number {
|
|
1281
|
-
const db = getDb();
|
|
1282
|
-
const row = db
|
|
1283
|
-
.select({ createdAt: messages.createdAt })
|
|
1284
|
-
.from(messages)
|
|
1285
|
-
.where(
|
|
1286
|
-
and(
|
|
1287
|
-
eq(messages.conversationId, conversationId),
|
|
1288
|
-
eq(messages.role, "assistant"),
|
|
1289
|
-
lt(messages.createdAt, beforeTimestamp),
|
|
1290
|
-
),
|
|
1291
|
-
)
|
|
1292
|
-
.orderBy(desc(messages.createdAt))
|
|
1293
|
-
.limit(1)
|
|
1294
|
-
.get();
|
|
1295
|
-
return row?.createdAt ?? 0;
|
|
1378
|
+
return { messages: visible, hasMore };
|
|
1296
1379
|
}
|
|
1297
1380
|
|
|
1298
1381
|
export function getLastUserTimestampBefore(
|
|
@@ -1386,6 +1469,20 @@ export function updateConversationContextWindow(
|
|
|
1386
1469
|
.run();
|
|
1387
1470
|
}
|
|
1388
1471
|
|
|
1472
|
+
export function setConversationHistoryStrippedAt(
|
|
1473
|
+
id: string,
|
|
1474
|
+
historyStrippedAt: number | null,
|
|
1475
|
+
): void {
|
|
1476
|
+
const db = getDb();
|
|
1477
|
+
db.update(conversations)
|
|
1478
|
+
.set({
|
|
1479
|
+
historyStrippedAt,
|
|
1480
|
+
updatedAt: Date.now(),
|
|
1481
|
+
})
|
|
1482
|
+
.where(eq(conversations.id, id))
|
|
1483
|
+
.run();
|
|
1484
|
+
}
|
|
1485
|
+
|
|
1389
1486
|
export function updateConversationSlackContextWatermark(
|
|
1390
1487
|
id: string,
|
|
1391
1488
|
watermarkTs: string,
|
|
@@ -1609,17 +1706,50 @@ export function getConversationOverrideProfile(
|
|
|
1609
1706
|
return getConversationOverrideProfileFromRow(getConversation(conversationId));
|
|
1610
1707
|
}
|
|
1611
1708
|
|
|
1709
|
+
export function setLastNotifiedInferenceProfile(
|
|
1710
|
+
conversationId: string,
|
|
1711
|
+
profileKey: string | null,
|
|
1712
|
+
): void {
|
|
1713
|
+
rawRun(
|
|
1714
|
+
"UPDATE conversations SET last_notified_inference_profile = ? WHERE id = ?",
|
|
1715
|
+
profileKey,
|
|
1716
|
+
conversationId,
|
|
1717
|
+
);
|
|
1718
|
+
}
|
|
1719
|
+
|
|
1612
1720
|
/**
|
|
1613
1721
|
* Delete all conversations, messages, and related data (tool invocations,
|
|
1614
1722
|
* memory segments, etc.) from the daemon database.
|
|
1615
1723
|
* Returns { conversations, messages } counts.
|
|
1724
|
+
*
|
|
1725
|
+
* Each bulk DELETE is dispatched through {@link runAsyncSqlite}: when
|
|
1726
|
+
* the host has a `sqlite3` CLI it executes in a subprocess and the
|
|
1727
|
+
* daemon's main event loop stays responsive while large tables
|
|
1728
|
+
* (`llm_request_logs`, `tool_invocations`, etc.) are wiped. On hosts
|
|
1729
|
+
* without the CLI the abstraction falls back to in-process blocking
|
|
1730
|
+
* execution — the same behaviour the daemon had before.
|
|
1616
1731
|
*/
|
|
1617
|
-
export function clearAll(): {
|
|
1732
|
+
export async function clearAll(): Promise<{
|
|
1733
|
+
conversations: number;
|
|
1734
|
+
messages: number;
|
|
1735
|
+
}> {
|
|
1618
1736
|
const msgCount =
|
|
1619
1737
|
rawGet<{ c: number }>("SELECT COUNT(*) AS c FROM messages")?.c ?? 0;
|
|
1620
1738
|
const convCount =
|
|
1621
1739
|
rawGet<{ c: number }>("SELECT COUNT(*) AS c FROM conversations")?.c ?? 0;
|
|
1622
1740
|
|
|
1741
|
+
// Each DELETE goes through `runAsyncSqlite`. The original code threw
|
|
1742
|
+
// on rawExec failure; mirror that here by throwing when the async
|
|
1743
|
+
// result reports `ok: false`, so the route handler still returns 500.
|
|
1744
|
+
const runOrThrow = async (sql: string): Promise<void> => {
|
|
1745
|
+
const result = await runAsyncSqlite(sql);
|
|
1746
|
+
if (!result.ok) {
|
|
1747
|
+
throw new Error(
|
|
1748
|
+
`clearAll: \`${sql}\` failed (${result.backend}): ${result.error ?? "unknown"}`,
|
|
1749
|
+
);
|
|
1750
|
+
}
|
|
1751
|
+
};
|
|
1752
|
+
|
|
1623
1753
|
// Delete in dependency order. Cascades handle memory_segments and
|
|
1624
1754
|
// tool_invocations, but we explicitly clear non-cascading memory
|
|
1625
1755
|
// tables too.
|
|
@@ -1629,22 +1759,21 @@ export function clearAll(): { conversations: number; messages: number } {
|
|
|
1629
1759
|
// triggers so that the subsequent base-table DELETEs don't also fail
|
|
1630
1760
|
// (SQLite triggers are atomic with the triggering statement, so a
|
|
1631
1761
|
// corrupted FTS table would roll back every base-table DELETE).
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1762
|
+
await runOrThrow("DELETE FROM memory_segments");
|
|
1763
|
+
await runOrThrow("DELETE FROM memory_summaries");
|
|
1764
|
+
await runOrThrow("DELETE FROM memory_embeddings");
|
|
1765
|
+
await runOrThrow("DELETE FROM memory_jobs");
|
|
1766
|
+
await runOrThrow("DELETE FROM memory_checkpoints");
|
|
1767
|
+
await runOrThrow("DELETE FROM llm_request_logs");
|
|
1768
|
+
await runOrThrow("DELETE FROM llm_usage_events");
|
|
1769
|
+
await runOrThrow("DELETE FROM message_attachments");
|
|
1770
|
+
await runOrThrow("DELETE FROM attachments");
|
|
1771
|
+
await runOrThrow("DELETE FROM tool_invocations");
|
|
1642
1772
|
let messagesFtsCorrupted = false;
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
} catch (err) {
|
|
1773
|
+
const ftsResult = await runAsyncSqlite("DELETE FROM messages_fts");
|
|
1774
|
+
if (!ftsResult.ok) {
|
|
1646
1775
|
log.warn(
|
|
1647
|
-
{
|
|
1776
|
+
{ error: ftsResult.error, backend: ftsResult.backend },
|
|
1648
1777
|
"clearAll: failed to clear messages_fts — dropping triggers so base-table cleanup can proceed",
|
|
1649
1778
|
);
|
|
1650
1779
|
rawExec("DROP TRIGGER IF EXISTS messages_fts_ai");
|
|
@@ -1652,8 +1781,8 @@ export function clearAll(): { conversations: number; messages: number } {
|
|
|
1652
1781
|
rawExec("DROP TRIGGER IF EXISTS messages_fts_au");
|
|
1653
1782
|
messagesFtsCorrupted = true;
|
|
1654
1783
|
}
|
|
1655
|
-
|
|
1656
|
-
|
|
1784
|
+
await runOrThrow("DELETE FROM messages");
|
|
1785
|
+
await runOrThrow("DELETE FROM conversations");
|
|
1657
1786
|
|
|
1658
1787
|
// Record audit event — lifecycle_events is NOT deleted by clearAll(),
|
|
1659
1788
|
// so this survives the wipe and provides a permanent trail.
|
|
@@ -1820,44 +1949,6 @@ export function updateMessageMetadata(
|
|
|
1820
1949
|
.run();
|
|
1821
1950
|
}
|
|
1822
1951
|
|
|
1823
|
-
/**
|
|
1824
|
-
* Bulk-remove the metadata fields that back the blocks stripped by
|
|
1825
|
-
* `stripInjectionsForCompaction` — currently `pkbSystemReminderBlock`
|
|
1826
|
-
* (`<system_reminder>`), `nowScratchpadBlock` (`<NOW.md …>`),
|
|
1827
|
-
* `pkbContextBlock` (`<knowledge_base>`), and `memoryV2StaticBlock`
|
|
1828
|
-
* (the static `<memory>\n…</memory>` block matched by the `<memory>\n`
|
|
1829
|
-
* prefix in `RUNTIME_INJECTION_PREFIXES`). Called from compaction-strip
|
|
1830
|
-
* sites so post-restart rehydration stays consistent with the in-memory
|
|
1831
|
-
* state produced by `stripInjectionsForCompaction` (which removes those
|
|
1832
|
-
* tags from live messages but cannot touch the DB). Fields backing
|
|
1833
|
-
* blocks that are intentionally NOT stripped (`turnContextBlock`,
|
|
1834
|
-
* `workspaceBlock`, `memoryInjectedBlock`) are preserved.
|
|
1835
|
-
*/
|
|
1836
|
-
export function clearStrippedInjectionMetadataForConversation(
|
|
1837
|
-
conversationId: string,
|
|
1838
|
-
): void {
|
|
1839
|
-
rawRun(
|
|
1840
|
-
`UPDATE messages
|
|
1841
|
-
SET metadata = json_remove(
|
|
1842
|
-
metadata,
|
|
1843
|
-
'$.pkbSystemReminderBlock',
|
|
1844
|
-
'$.nowScratchpadBlock',
|
|
1845
|
-
'$.pkbContextBlock',
|
|
1846
|
-
'$.memoryV2StaticBlock'
|
|
1847
|
-
)
|
|
1848
|
-
WHERE conversation_id = ?
|
|
1849
|
-
AND role = 'user'
|
|
1850
|
-
AND metadata IS NOT NULL
|
|
1851
|
-
AND (
|
|
1852
|
-
json_extract(metadata, '$.pkbSystemReminderBlock') IS NOT NULL
|
|
1853
|
-
OR json_extract(metadata, '$.nowScratchpadBlock') IS NOT NULL
|
|
1854
|
-
OR json_extract(metadata, '$.pkbContextBlock') IS NOT NULL
|
|
1855
|
-
OR json_extract(metadata, '$.memoryV2StaticBlock') IS NOT NULL
|
|
1856
|
-
)`,
|
|
1857
|
-
conversationId,
|
|
1858
|
-
);
|
|
1859
|
-
}
|
|
1860
|
-
|
|
1861
1952
|
/**
|
|
1862
1953
|
* Atomically update both `content` and (shallow-merged) `metadata` for a
|
|
1863
1954
|
* message. Used by edit-propagation paths that need to update the message
|
|
@@ -9,7 +9,7 @@ import { and, eq, inArray, sql } from "drizzle-orm";
|
|
|
9
9
|
|
|
10
10
|
import { getLogger } from "../util/logger.js";
|
|
11
11
|
import { getDb } from "./db-connection.js";
|
|
12
|
-
import { enqueueMemoryJob } from "./jobs-store.js";
|
|
12
|
+
import { enqueueMemoryJob, isMemoryEnabled } from "./jobs-store.js";
|
|
13
13
|
import { rawGet } from "./raw-query.js";
|
|
14
14
|
import { memoryCheckpoints, memoryJobs } from "./schema.js";
|
|
15
15
|
|
|
@@ -20,6 +20,8 @@ const log = getLogger("conversation-starters-cadence");
|
|
|
20
20
|
* generating a fresh batch of conversation starters.
|
|
21
21
|
*/
|
|
22
22
|
export function maybeEnqueueConversationStartersJob(scopeId: string): void {
|
|
23
|
+
if (!isMemoryEnabled()) return;
|
|
24
|
+
|
|
23
25
|
const db = getDb();
|
|
24
26
|
|
|
25
27
|
// Count total active memory items
|
|
@@ -331,10 +331,10 @@ function buildTitlePrompt(
|
|
|
331
331
|
}
|
|
332
332
|
|
|
333
333
|
if (userMessage) {
|
|
334
|
-
parts.push(`User: ${userMessage}`);
|
|
334
|
+
parts.push(`User: ${stripThinkingTags(userMessage)}`);
|
|
335
335
|
}
|
|
336
336
|
if (assistantResponse) {
|
|
337
|
-
parts.push(`Assistant: ${assistantResponse}`);
|
|
337
|
+
parts.push(`Assistant: ${stripThinkingTags(assistantResponse)}`);
|
|
338
338
|
}
|
|
339
339
|
|
|
340
340
|
return parts.join("\n");
|
|
@@ -378,12 +378,28 @@ function truncateTitle(title: string): string {
|
|
|
378
378
|
function normalizeTitle(raw: string): string {
|
|
379
379
|
let title = raw.trim().replace(/^["']|["']$/g, "");
|
|
380
380
|
title = stripMarkdown(title);
|
|
381
|
+
title = stripThinkingTags(title);
|
|
381
382
|
if (META_FAILURE_TITLES.has(title.toLowerCase())) {
|
|
382
383
|
return "";
|
|
383
384
|
}
|
|
384
385
|
return truncateTitle(title);
|
|
385
386
|
}
|
|
386
387
|
|
|
388
|
+
/** Strip thinking tags so they don't bleed into generated titles. */
|
|
389
|
+
function stripThinkingTags(text: string): string {
|
|
390
|
+
return text
|
|
391
|
+
.replace(/<thinking>[\s\S]*?<\/thinking>/gi, "")
|
|
392
|
+
.replace(/<thought>[\s\S]*?<\/thought>/gi, "")
|
|
393
|
+
.replace(/<think>[\s\S]*?<\/think>/gi, "")
|
|
394
|
+
.replace(/<thought>/gi, "")
|
|
395
|
+
.replace(/<\/thought>/gi, "")
|
|
396
|
+
.replace(/<thinking>/gi, "")
|
|
397
|
+
.replace(/<\/thinking>/gi, "")
|
|
398
|
+
.replace(/<think>/gi, "")
|
|
399
|
+
.replace(/<\/think>/gi, "")
|
|
400
|
+
.replace(/<:[^>]*>/gi, "");
|
|
401
|
+
}
|
|
402
|
+
|
|
387
403
|
/** Strip common markdown formatting so titles render as plain text. */
|
|
388
404
|
function stripMarkdown(text: string): string {
|
|
389
405
|
return text
|
|
@@ -458,7 +474,7 @@ function buildRegenerationPrompt(recentMessages: MessageRow[]): string {
|
|
|
458
474
|
const text = extractTextForTitle(msg.content);
|
|
459
475
|
if (!text) continue;
|
|
460
476
|
const role = msg.role === "user" ? "User" : "Assistant";
|
|
461
|
-
parts.push(`${role}: ${text}`);
|
|
477
|
+
parts.push(`${role}: ${stripThinkingTags(text)}`);
|
|
462
478
|
}
|
|
463
479
|
|
|
464
480
|
return parts.join("\n");
|