@vellumai/assistant 0.8.0 → 0.8.2
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/AGENTS.md +11 -0
- package/ARCHITECTURE.md +2 -7
- package/Dockerfile +80 -5
- package/README.md +2 -2
- package/bun.lock +11 -1
- package/docker-entrypoint.sh +21 -0
- package/docker-init-apt-root.sh +94 -0
- package/docker-kata-apt-env.sh +39 -0
- package/docs/plugins.md +88 -47
- package/docs/skills.md +9 -7
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +420 -0
- package/eslint-rules/cli-no-daemon-internals.js +283 -0
- package/eslint.config.mjs +12 -0
- package/examples/plugins/echo/README.md +27 -27
- package/examples/plugins/echo/package.json +3 -0
- package/examples/plugins/echo/register.ts +31 -31
- package/knip.json +2 -1
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -1
- package/node_modules/@vellumai/slack-text/src/index.test.ts +114 -14
- package/node_modules/@vellumai/slack-text/src/index.ts +82 -18
- package/openapi.yaml +4462 -991
- package/package.json +5 -1
- package/scripts/generate-openapi.ts +135 -14
- package/scripts/sync-llm-catalog.ts +165 -0
- package/scripts/sync-web-search-catalog.ts +129 -0
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +169 -0
- package/src/__tests__/agent-image-optimize.test.ts +11 -3
- package/src/__tests__/agent-loop-override-profile.test.ts +26 -1
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +131 -0
- package/src/__tests__/anthropic-provider.test.ts +137 -2
- package/src/__tests__/app-builder-tool-scripts.test.ts +9 -3
- package/src/__tests__/app-control-flow.test.ts +7 -0
- package/src/__tests__/app-executors.test.ts +220 -4
- package/src/__tests__/assistant-events-sse-shed.test.ts +232 -0
- package/src/__tests__/auto-analysis-end-to-end.test.ts +35 -0
- package/src/__tests__/avatar-identity-sync.test.ts +87 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +11 -22
- package/src/__tests__/btw-routes.test.ts +1 -0
- package/src/__tests__/bundled-asset.test.ts +6 -6
- package/src/__tests__/call-site-routing-provider.test.ts +172 -45
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +44 -3
- package/src/__tests__/channel-availability-routes.test.ts +206 -0
- package/src/__tests__/channel-delivery-store.test.ts +289 -1
- package/src/__tests__/channel-policy.test.ts +12 -0
- package/src/__tests__/checker.test.ts +89 -0
- package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -1
- package/src/__tests__/clawhub.test.ts +75 -16
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +35 -7
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +33 -5
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +26 -1
- package/src/__tests__/compactor-tail-resolution.test.ts +41 -0
- package/src/__tests__/config-loader-backfill.test.ts +526 -102
- package/src/__tests__/config-loader-corrupt.test.ts +68 -0
- package/src/__tests__/config-loader-platform-defaults.test.ts +77 -23
- package/src/__tests__/config-schema-cmd.test.ts +63 -29
- package/src/__tests__/config-schema.test.ts +35 -3
- package/src/__tests__/config-set-platform-guard.test.ts +75 -152
- package/src/__tests__/config-set-route.test.ts +278 -0
- package/src/__tests__/config-sounds-sync.test.ts +97 -0
- package/src/__tests__/config-watcher-skill-reseed.test.ts +453 -0
- package/src/__tests__/config-watcher.test.ts +6 -0
- package/src/__tests__/contacts-tools.test.ts +51 -199
- package/src/__tests__/context-search-agent-protocol.test.ts +21 -2
- package/src/__tests__/context-search-agent-runner.test.ts +22 -138
- package/src/__tests__/context-search-conversations-source.test.ts +159 -18
- package/src/__tests__/context-search-fanout.test.ts +20 -157
- package/src/__tests__/context-search-memory-v2-source.test.ts +3 -4
- package/src/__tests__/context-search-types.test.ts +7 -2
- package/src/__tests__/context-search-workspace-source.test.ts +7 -0
- package/src/__tests__/context-token-estimator.test.ts +1 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +4 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +93 -92
- package/src/__tests__/conversation-agent-loop.test.ts +2 -0
- package/src/__tests__/conversation-crud-inference-profile.test.ts +100 -0
- package/src/__tests__/conversation-error.test.ts +80 -3
- package/src/__tests__/conversation-fork-crud.test.ts +323 -1
- package/src/__tests__/conversation-inference-profile-route.test.ts +54 -18
- package/src/__tests__/conversation-init.benchmark.test.ts +1 -0
- package/src/__tests__/conversation-lifecycle.test.ts +297 -0
- package/src/__tests__/conversation-message-sync-tags.test.ts +97 -0
- package/src/__tests__/conversation-pairing.test.ts +54 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +100 -1
- package/src/__tests__/conversation-process-callsite.test.ts +25 -2
- package/src/__tests__/conversation-provider-retry-repair.test.ts +5 -1
- package/src/__tests__/conversation-queue.test.ts +4 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +80 -13
- package/src/__tests__/conversation-slash-commands.test.ts +194 -2
- package/src/__tests__/conversation-slash-queue.test.ts +59 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +4 -1
- package/src/__tests__/conversation-surfaces-app-control.test.ts +323 -3
- package/src/__tests__/conversation-surfaces-table-action.test.ts +360 -0
- package/src/__tests__/conversation-sync-tags.test.ts +235 -0
- 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-security-invariants.test.ts +8 -8
- package/src/__tests__/daemon-credential-client.test.ts +56 -1
- package/src/__tests__/db-activation-state-fk-cascade.test.ts +132 -0
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +37 -0
- package/src/__tests__/db-memory-graph-event-date-repair.test.ts +43 -20
- package/src/__tests__/db-proxy-transaction.test.ts +206 -0
- package/src/__tests__/db-slack-external-content-normalization.test.ts +301 -0
- package/src/__tests__/delete-managed-skill-tool.test.ts +55 -13
- package/src/__tests__/disk-pressure-tools.test.ts +1 -0
- package/src/__tests__/dm-backfill.test.ts +121 -10
- package/src/__tests__/document-tool-security.test.ts +258 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/edit-propagation.test.ts +33 -0
- package/src/__tests__/empty-response-pipeline.test.ts +0 -4
- package/src/__tests__/external-plugin-loader.test.ts +482 -0
- package/src/__tests__/filing-service.test.ts +163 -3
- package/src/__tests__/fixtures/mock-chrome-extension.ts +5 -0
- package/src/__tests__/gateway-only-guard.test.ts +0 -1
- package/src/__tests__/get-skill-detail-audit.test.ts +0 -4
- package/src/__tests__/graph-extraction-event-date.test.ts +34 -0
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +42 -69
- package/src/__tests__/heartbeat-disk-pressure.test.ts +21 -8
- package/src/__tests__/heartbeat-service.test.ts +50 -233
- package/src/__tests__/helpers/tar-fixtures.ts +39 -0
- package/src/__tests__/helpers/wait-for.ts +21 -0
- package/src/__tests__/history-repair-pipeline.test.ts +0 -3
- package/src/__tests__/history-repair.test.ts +162 -0
- package/src/__tests__/host-app-control-proxy.test.ts +365 -1
- package/src/__tests__/host-app-control-routes.test.ts +247 -1
- package/src/__tests__/host-browser-proxy.test.ts +416 -20
- package/src/__tests__/host-browser-routes.test.ts +325 -33
- package/src/__tests__/host-proxy-preactivation.test.ts +211 -0
- package/src/__tests__/image-credentials.test.ts +1 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +2 -0
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +246 -0
- package/src/__tests__/inference-profile-reaper.test.ts +156 -0
- package/src/__tests__/inference-profile-session-handler.test.ts +410 -0
- package/src/__tests__/inference-profile-session-ipc.test.ts +248 -0
- package/src/__tests__/injector-chain.test.ts +10 -8
- package/src/__tests__/inline-skill-load-permissions.test.ts +6 -1
- package/src/__tests__/install-skill-routing.test.ts +157 -39
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +107 -3
- package/src/__tests__/list-messages-page-latest.test.ts +55 -0
- package/src/__tests__/llm-call-pipeline.test.ts +0 -3
- package/src/__tests__/llm-callsite-catalog.test.ts +20 -1
- package/src/__tests__/llm-catalog-parity.test.ts +190 -2
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +222 -0
- package/src/__tests__/llm-request-log-source-factory.test.ts +100 -0
- package/src/__tests__/llm-resolver.test.ts +46 -0
- package/src/__tests__/llm-usage-store.test.ts +114 -0
- package/src/__tests__/managed-profile-guard.test.ts +145 -14
- package/src/__tests__/managed-skill-lifecycle.test.ts +109 -18
- package/src/__tests__/managed-store.test.ts +84 -192
- package/src/__tests__/mcp-auth-routes.test.ts +1 -0
- package/src/__tests__/mcp-cli.test.ts +182 -220
- package/src/__tests__/mcp-health-check.test.ts +56 -27
- package/src/__tests__/media-generate-image.test.ts +1 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +18 -11
- package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -2
- package/src/__tests__/message-complete-display-id.test.ts +175 -0
- package/src/__tests__/messages-after-tiebreaker.test.ts +122 -0
- package/src/__tests__/notification-platform-adapter.test.ts +229 -0
- package/src/__tests__/oauth-cli.test.ts +38 -2009
- package/src/__tests__/oauth-commands-routes.test.ts +863 -0
- package/src/__tests__/oauth-connect-routes.test.ts +174 -11
- package/src/__tests__/oauth-provider-profiles.test.ts +9 -0
- package/src/__tests__/oauth-providers-routes.test.ts +14 -10
- package/src/__tests__/openai-provider.test.ts +24 -0
- package/src/__tests__/openai-responses-cutover-guard.test.ts +48 -19
- package/src/__tests__/openai-responses-provider.test.ts +17 -0
- package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -2
- package/src/__tests__/persistence-pipeline.test.ts +0 -2
- package/src/__tests__/{managed-proxy-context.test.ts → platform-proxy-context.test.ts} +1 -1
- package/src/__tests__/platform.test.ts +2 -0
- package/src/__tests__/plugin-api-shim.test.ts +125 -0
- package/src/__tests__/plugin-bootstrap.test.ts +41 -38
- package/src/__tests__/plugin-external-api.test.ts +68 -0
- package/src/__tests__/plugin-registry.test.ts +0 -77
- package/src/__tests__/plugin-route-contribution.test.ts +31 -4
- package/src/__tests__/plugin-skill-contribution.test.ts +0 -2
- package/src/__tests__/plugin-tool-contribution.test.ts +47 -18
- package/src/__tests__/plugin-types.test.ts +15 -23
- package/src/__tests__/process-message-background-slack.test.ts +53 -0
- package/src/__tests__/process-message-display-content.test.ts +421 -0
- package/src/__tests__/profile-entry-status.test.ts +43 -0
- package/src/__tests__/provider-catalog-visibility.test.ts +142 -0
- package/src/__tests__/provider-error-scenarios.test.ts +111 -0
- package/src/__tests__/{provider-managed-proxy-integration.test.ts → provider-platform-proxy-integration.test.ts} +20 -12
- package/src/__tests__/provider-registry-ollama.test.ts +12 -4
- package/src/__tests__/provider-send-message-override-profile.test.ts +10 -4
- package/src/__tests__/relay-server.test.ts +118 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +15 -0
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +65 -13
- package/src/__tests__/schedule-retry.test.ts +56 -4
- package/src/__tests__/schedule-routes.test.ts +151 -0
- package/src/__tests__/schedule-store.test.ts +94 -0
- package/src/__tests__/scheduler-disk-pressure.test.ts +0 -4
- package/src/__tests__/scheduler-recurrence.test.ts +87 -34
- package/src/__tests__/scheduler-reuse-conversation.test.ts +208 -5
- package/src/__tests__/scheduler-wake.test.ts +0 -63
- package/src/__tests__/schema-transforms.test.ts +20 -0
- package/src/__tests__/search-skills-unified.test.ts +0 -5
- package/src/__tests__/secret-allowlist.test.ts +1 -0
- package/src/__tests__/{secret-routes-managed-proxy.test.ts → secret-routes-platform-proxy.test.ts} +12 -4
- package/src/__tests__/server-history-render.test.ts +43 -0
- package/src/__tests__/shell-credential-ref.test.ts +95 -3
- package/src/__tests__/shell-tool-proxy-mode.test.ts +14 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -12
- package/src/__tests__/skill-load-tool.test.ts +29 -93
- package/src/__tests__/skill-memory.test.ts +23 -3
- package/src/__tests__/skills-file-content-endpoint.test.ts +9 -38
- package/src/__tests__/skills-files-catalog-fallback.test.ts +0 -3
- package/src/__tests__/skills-install-extract.test.ts +49 -38
- package/src/__tests__/skills-install-staging.test.ts +159 -0
- package/src/__tests__/skills-uninstall.test.ts +9 -41
- package/src/__tests__/skills.test.ts +51 -58
- package/src/__tests__/slack-channel-config.test.ts +9 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +78 -16
- package/src/__tests__/subagent-tool-filtering.test.ts +50 -0
- package/src/__tests__/suggestion-routes.test.ts +3 -3
- package/src/__tests__/sync-message-contract.test.ts +63 -0
- package/src/__tests__/system-prompt.test.ts +737 -63
- package/src/__tests__/task-scheduler.test.ts +88 -23
- package/src/__tests__/terminal-tools.test.ts +28 -1
- package/src/__tests__/thread-backfill.test.ts +557 -27
- package/src/__tests__/title-generate-pipeline.test.ts +0 -13
- package/src/__tests__/token-estimate-pipeline.test.ts +0 -3
- package/src/__tests__/tool-error-pipeline.test.ts +0 -3
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
- package/src/__tests__/tool-executor.test.ts +16 -4
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -12
- package/src/__tests__/turn-events-store.test.ts +256 -0
- package/src/__tests__/twilio-routes.test.ts +4 -0
- package/src/__tests__/update-bulletin-job.test.ts +96 -193
- package/src/__tests__/usage-cli.test.ts +11 -73
- package/src/__tests__/user-plugin-loader.test.ts +143 -5
- package/src/__tests__/vercel-config.test.ts +168 -0
- package/src/__tests__/voice-session-bridge.test.ts +198 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +108 -0
- package/src/__tests__/web-search.test.ts +303 -2
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +1 -21
- package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +170 -0
- package/src/__tests__/workspace-migration-069-seed-onboarding-threads.test.ts +53 -20
- package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +241 -0
- package/src/__tests__/workspace-migration-073-repair-recall-callsite-empty-profile.test.ts +153 -0
- package/src/__tests__/workspace-migration-076-drop-services-inference-mode.test.ts +211 -0
- package/src/__tests__/workspace-migration-077-seed-memory-router-callsite.test.ts +174 -0
- package/src/__tests__/workspace-migration-079-home-feed-notification-only.test.ts +323 -0
- package/src/__tests__/workspace-migration-080-restrict-vercel-api-token-metadata.test.ts +299 -0
- package/src/__tests__/workspace-migration-081-backfill-bash-allowed-tools.test.ts +410 -0
- package/src/__tests__/workspace-migration-082-backfill-managed-profile-labels.test.ts +268 -0
- package/src/__tests__/workspace-migration-085-memory-v2-bm25-b-reembed-disabled-v2-pages.test.ts +220 -0
- package/src/__tests__/workspace-migration-086-revert-stale-gemini-mis-rewrites.test.ts +269 -0
- package/src/__tests__/workspace-migration-remove-legacy-skills-index.test.ts +309 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +3 -3
- package/src/__tests__/workspace-migrations-runner.test.ts +111 -3
- package/src/__tests__/workspace-release-notes-feature-flag-guard.test.ts +115 -0
- package/src/acp/__tests__/helpers/which-stub.ts +4 -2
- package/src/acp/resolve-agent.test.ts +25 -0
- package/src/acp/resolve-agent.ts +13 -2
- package/src/acp/session-manager.ts +14 -0
- package/src/agent/image-optimize.ts +13 -5
- package/src/approvals/guardian-request-resolvers.ts +32 -87
- package/src/calls/relay-server.ts +35 -0
- package/src/calls/relay-setup-router.ts +36 -0
- package/src/calls/types.ts +1 -0
- package/src/calls/voice-session-bridge.ts +74 -36
- package/src/channels/config.ts +14 -1
- package/src/channels/types.ts +109 -0
- package/src/cli/AGENTS.md +164 -4
- package/src/cli/__tests__/notifications.test.ts +54 -0
- package/src/cli/__tests__/unknown-command.test.ts +24 -0
- package/src/cli/commands/__tests__/avatar.test.ts +540 -0
- package/src/cli/commands/__tests__/backup.test.ts +236 -776
- package/src/cli/commands/__tests__/cache.test.ts +1 -1
- package/src/cli/commands/__tests__/changelog.test.ts +578 -0
- package/src/cli/commands/__tests__/channel-verification-sessions.test.ts +503 -0
- package/src/cli/commands/__tests__/conversations-import.test.ts +515 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +140 -167
- package/src/cli/commands/__tests__/domain-status.test.ts +137 -76
- package/src/cli/commands/__tests__/email-attachment.test.ts +314 -337
- package/src/cli/commands/__tests__/email-core.test.ts +579 -0
- package/src/cli/commands/__tests__/image-generation.test.ts +87 -824
- package/src/cli/commands/__tests__/inference-send.test.ts +30 -266
- package/src/cli/commands/__tests__/inference-session.test.ts +423 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +81 -110
- package/src/cli/commands/__tests__/schedules.test.ts +491 -0
- package/src/cli/commands/__tests__/skills.test.ts +563 -0
- package/src/cli/commands/__tests__/status.test.ts +249 -0
- package/src/cli/commands/__tests__/stt.test.ts +320 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +4 -603
- package/src/cli/commands/__tests__/tts.test.ts +321 -0
- package/src/cli/commands/__tests__/webhooks.test.ts +86 -511
- package/src/cli/commands/attachment.ts +8 -3
- package/src/cli/commands/audit.ts +95 -64
- package/src/cli/commands/auth.ts +61 -58
- package/src/cli/commands/avatar.ts +276 -390
- package/src/cli/commands/backup.ts +409 -505
- package/src/cli/commands/bash.ts +9 -5
- package/src/cli/commands/browser.ts +28 -9
- package/src/cli/commands/cache.ts +9 -4
- package/src/cli/commands/changelog.ts +478 -0
- package/src/cli/commands/channel-verification-sessions.ts +238 -317
- package/src/cli/commands/clients.ts +8 -3
- package/src/cli/commands/completions.ts +9 -9
- package/src/cli/commands/config.ts +102 -72
- package/src/cli/commands/contacts.ts +575 -696
- package/src/cli/commands/conversations-defer.ts +17 -69
- package/src/cli/commands/conversations-import.ts +90 -253
- package/src/cli/commands/conversations.ts +429 -434
- package/src/cli/commands/credential-execution.ts +9 -6
- package/src/cli/commands/credentials.ts +456 -736
- package/src/cli/commands/default-action.ts +10 -53
- package/src/cli/commands/domain.ts +128 -206
- package/src/cli/commands/email.ts +606 -794
- package/src/cli/commands/gateway.ts +8 -1
- package/src/cli/commands/image-generation.ts +157 -205
- package/src/cli/commands/inference-providers.ts +352 -0
- package/src/cli/commands/inference-session.ts +415 -0
- package/src/cli/commands/inference.ts +87 -65
- package/src/cli/commands/keys.ts +8 -3
- package/src/cli/commands/mcp.ts +103 -287
- package/src/cli/commands/memory-v2.ts +162 -516
- package/src/cli/commands/notifications.ts +342 -304
- package/src/cli/commands/oauth/apps.ts +292 -261
- package/src/cli/commands/oauth/connect.ts +176 -297
- package/src/cli/commands/oauth/disconnect.ts +16 -215
- package/src/cli/commands/oauth/index.ts +49 -45
- package/src/cli/commands/oauth/mode.ts +43 -199
- package/src/cli/commands/oauth/ping.ts +17 -125
- package/src/cli/commands/oauth/providers.ts +732 -921
- package/src/cli/commands/oauth/request.ts +60 -350
- package/src/cli/commands/oauth/shared.ts +11 -121
- package/src/cli/commands/oauth/status.ts +31 -121
- package/src/cli/commands/oauth/token.ts +13 -55
- package/src/cli/commands/pending.ts +19 -10
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +133 -183
- package/src/cli/commands/platform/__tests__/connect.test.ts +66 -181
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +71 -227
- package/src/cli/commands/platform/__tests__/status.test.ts +169 -287
- package/src/cli/commands/platform/connect.ts +16 -80
- package/src/cli/commands/platform/disconnect.ts +14 -112
- package/src/cli/commands/platform/index.ts +177 -246
- package/src/cli/commands/plugins.ts +185 -0
- package/src/cli/commands/routes.ts +153 -336
- package/src/cli/commands/schedules.ts +391 -0
- package/src/cli/commands/sequence.ts +316 -360
- package/src/cli/commands/skills.ts +449 -671
- package/src/cli/commands/status.ts +58 -37
- package/src/cli/commands/stt.ts +94 -262
- package/src/cli/commands/task.ts +14 -40
- package/src/cli/commands/telemetry.ts +40 -0
- package/src/cli/commands/trust.ts +8 -3
- package/src/cli/commands/tts.ts +162 -167
- package/src/cli/commands/ui.ts +35 -42
- package/src/cli/commands/usage.ts +188 -126
- package/src/cli/commands/watchers.ts +8 -3
- package/src/cli/commands/webhooks.ts +99 -193
- package/src/cli/lib/__tests__/cli-colors.test.ts +48 -0
- package/src/cli/lib/__tests__/confirm-prompt.test.ts +159 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +355 -0
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +154 -0
- package/src/cli/lib/__tests__/register-command.test.ts +85 -0
- package/src/cli/lib/__tests__/uninstall-plugin.test.ts +124 -0
- package/src/cli/lib/__tests__/unknown-command.test.ts +106 -0
- package/src/cli/lib/cli-colors.ts +12 -0
- package/src/cli/lib/confirm-prompt.ts +79 -0
- package/src/cli/lib/daemon-credential-client.ts +4 -5
- package/src/cli/lib/install-from-github.ts +304 -0
- package/src/cli/lib/list-installed-plugins.ts +137 -0
- package/src/cli/lib/nested-value.ts +44 -0
- package/src/cli/lib/open-browser.ts +36 -0
- package/src/cli/lib/register-command.ts +19 -0
- package/src/cli/lib/time-ago.ts +34 -0
- package/src/cli/lib/uninstall-plugin.ts +82 -0
- package/src/cli/lib/unknown-command.ts +111 -0
- package/src/cli/program.ts +40 -6
- package/src/cli/utils/__tests__/conversation-id.test.ts +66 -0
- package/src/cli/utils/__tests__/parse-duration.test.ts +49 -0
- package/src/cli/utils/conversation-id.ts +30 -0
- package/src/cli/utils/parse-duration.ts +41 -0
- package/src/config/acp-defaults.test.ts +5 -1
- package/src/config/acp-defaults.ts +11 -4
- package/src/config/bundled-skills/acp/TOOLS.json +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +23 -21
- package/src/config/bundled-skills/app-builder/TOOLS.json +7 -0
- package/src/config/bundled-skills/app-control/TOOLS.json +32 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +15 -52
- package/src/config/bundled-skills/contacts/SKILL.md +12 -45
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -57
- package/src/config/bundled-skills/document/SKILL.md +23 -3
- package/src/config/bundled-skills/document/TOOLS.json +53 -0
- package/src/config/bundled-skills/document/tools/document-delete.ts +12 -0
- package/src/config/bundled-skills/document/tools/document-list.ts +12 -0
- package/src/config/bundled-skills/document/tools/document-read.ts +12 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +0 -12
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -58
- package/src/config/bundled-skills/skill-management/SKILL.md +2 -2
- package/src/config/bundled-skills/skill-management/TOOLS.json +7 -7
- package/src/config/bundled-tool-registry.ts +6 -2
- package/src/config/feature-flag-registry.json +57 -1
- package/src/config/llm-resolver.ts +16 -1
- package/src/config/loader.ts +140 -52
- package/src/config/raw-config-utils.ts +2 -30
- package/src/config/schema.ts +8 -7
- package/src/config/schemas/__tests__/llm-request-logs.test.ts +36 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +49 -0
- package/src/config/schemas/call-site-catalog.ts +29 -7
- package/src/config/schemas/channels.ts +8 -0
- package/src/config/schemas/compaction.ts +28 -0
- package/src/config/schemas/heartbeat.ts +9 -0
- package/src/config/schemas/llm-request-logs.ts +81 -0
- package/src/config/schemas/llm.ts +55 -2
- package/src/config/schemas/memory-retrieval.ts +18 -0
- package/src/config/schemas/memory-retrospective.ts +48 -0
- package/src/config/schemas/memory-v2.ts +32 -1
- package/src/config/schemas/memory.ts +4 -0
- package/src/config/schemas/services.ts +15 -12
- package/src/config/schemas/tools.ts +14 -0
- package/src/config/seed-inference-profiles.ts +195 -134
- package/src/config/skills.ts +3 -96
- package/src/contacts/contact-store.ts +0 -61
- package/src/context/compactor.ts +1047 -0
- package/src/context/token-estimator.ts +2 -2
- package/src/context/window-manager.ts +197 -1334
- package/src/credential-execution/managed-catalog.ts +37 -0
- package/src/credential-health/credential-health-service.ts +280 -19
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +113 -0
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +138 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +183 -4
- package/src/daemon/__tests__/daemon-skill-host.test.ts +10 -4
- package/src/daemon/approval-generators.ts +26 -30
- package/src/daemon/config-watcher.ts +94 -29
- package/src/daemon/conversation-agent-loop-handlers.ts +24 -0
- package/src/daemon/conversation-agent-loop.ts +293 -103
- package/src/daemon/conversation-error.ts +188 -33
- package/src/daemon/conversation-lifecycle.ts +80 -26
- package/src/daemon/conversation-messaging.ts +25 -6
- package/src/daemon/conversation-process.ts +85 -31
- package/src/daemon/conversation-runtime-assembly.ts +30 -6
- package/src/daemon/conversation-slash.ts +184 -25
- package/src/daemon/conversation-store.ts +24 -10
- package/src/daemon/conversation-surfaces.ts +76 -12
- package/src/daemon/conversation-tool-setup.ts +63 -21
- package/src/daemon/conversation.ts +81 -10
- package/src/daemon/external-plugins-bootstrap.ts +231 -185
- package/src/daemon/first-greeting.ts +22 -2
- package/src/daemon/guardian-action-generators.ts +7 -22
- package/src/daemon/handlers/config-model.ts +13 -130
- package/src/daemon/handlers/config-slack-channel.ts +25 -10
- package/src/daemon/handlers/config-vercel.ts +3 -1
- package/src/daemon/handlers/shared.ts +14 -5
- package/src/daemon/handlers/skills.ts +166 -84
- package/src/daemon/history-repair.ts +61 -7
- package/src/daemon/host-app-control-proxy.ts +129 -29
- package/src/daemon/host-bash-proxy.ts +85 -158
- package/src/daemon/host-browser-proxy.ts +96 -35
- package/src/daemon/host-proxy-base.ts +13 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -1
- package/src/daemon/identity-helpers.ts +19 -0
- package/src/daemon/lifecycle.ts +79 -70
- package/src/daemon/meet-host-supervisor.ts +20 -19
- package/src/daemon/memory-v2-startup.ts +58 -2
- package/src/daemon/message-protocol.ts +7 -0
- package/src/daemon/message-types/bookmarks.ts +18 -0
- package/src/daemon/message-types/conversations.ts +37 -9
- package/src/daemon/message-types/messages.ts +70 -1
- package/src/daemon/message-types/subagents.ts +1 -0
- package/src/daemon/message-types/sync.ts +61 -0
- package/src/daemon/pkb-reminder-builder.test.ts +54 -13
- package/src/daemon/pkb-reminder-builder.ts +21 -7
- package/src/daemon/plugin-source-watcher.ts +146 -0
- package/src/daemon/process-message.ts +77 -26
- package/src/daemon/server.ts +34 -20
- package/src/daemon/shutdown-handlers.ts +0 -2
- package/src/daemon/skill-memory-refresh.ts +29 -0
- package/src/daemon/tool-setup-types.ts +9 -0
- package/src/daemon/tool-side-effects.ts +6 -4
- package/src/daemon/wake-target-adapter.ts +11 -0
- package/src/documents/document-store.ts +221 -3
- package/src/embedded/plugin-api.ts +40 -0
- package/src/export/transcript-formatter.ts +61 -2
- package/src/filing/filing-service.ts +79 -53
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +444 -0
- package/src/heartbeat/heartbeat-run-store.ts +3 -1
- package/src/heartbeat/heartbeat-service.ts +189 -127
- package/src/home/__tests__/feed-types.test.ts +99 -127
- package/src/home/__tests__/feed-writer.test.ts +77 -278
- package/src/home/__tests__/post-connect-feed.test.ts +9 -12
- package/src/home/feed-types.ts +41 -73
- package/src/home/feed-writer.ts +25 -156
- package/src/home/post-connect-feed.ts +2 -3
- package/src/index.ts +18 -1
- package/src/ipc/__tests__/cli-ipc.test.ts +2 -0
- package/src/ipc/__tests__/email-ipc.test.ts +506 -0
- package/src/ipc/__tests__/exit-helper.test.ts +104 -0
- package/src/ipc/__tests__/streaming-client.test.ts +237 -0
- package/src/ipc/__tests__/streaming-framing.test.ts +142 -0
- package/src/ipc/assistant-server.ts +55 -6
- package/src/ipc/cli-client.ts +370 -50
- package/src/ipc/routes/db-proxy-transaction.ts +151 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +60 -0
- package/src/ipc/skill-routes/events.ts +30 -3
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +46 -0
- package/src/live-voice/__tests__/live-voice-stt.test.ts +57 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +1 -0
- package/src/live-voice/live-voice-session-manager.ts +11 -4
- package/src/live-voice/live-voice-session.ts +14 -6
- package/src/mcp/client.ts +20 -4
- package/src/media/image-credentials.ts +3 -3
- package/src/memory/__tests__/bookmark-crud.test.ts +264 -0
- package/src/memory/__tests__/bookmark-schema.test.ts +181 -0
- package/src/memory/__tests__/conversation-queries.test.ts +263 -0
- package/src/memory/__tests__/conversation-types.test.ts +36 -0
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +130 -0
- package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +113 -0
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +177 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +328 -0
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +318 -0
- package/src/memory/__tests__/memory-retrospective-trigger-check.test.ts +90 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +69 -0
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -0
- package/src/memory/__tests__/message-content.test.ts +35 -0
- package/src/memory/bookmark-crud.ts +211 -0
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +31 -9
- package/src/memory/context-search/agent-protocol.ts +5 -1
- package/src/memory/context-search/agent-runner.ts +60 -85
- package/src/memory/context-search/limits.ts +1 -4
- package/src/memory/context-search/search.ts +23 -113
- package/src/memory/context-search/sources/conversations.ts +80 -8
- package/src/memory/context-search/sources/memory-v2.ts +39 -14
- package/src/memory/context-search/sources/memory.ts +7 -0
- package/src/memory/context-search/sources/workspace.ts +17 -10
- package/src/memory/context-search/types.ts +1 -1
- package/src/memory/conversation-bootstrap.ts +11 -0
- package/src/memory/conversation-crud.ts +368 -22
- package/src/memory/conversation-queries.ts +116 -12
- package/src/memory/conversation-title-service.ts +1 -0
- package/src/memory/conversation-types.ts +16 -0
- package/src/memory/db-init.ts +20 -0
- package/src/memory/delivery-crud.ts +152 -5
- package/src/memory/embedding-backend.ts +6 -5
- package/src/memory/embedding-runtime-manager.ts +1 -2
- package/src/memory/external-conversation-store.ts +66 -5
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +66 -9
- package/src/memory/graph/__tests__/remember-description.test.ts +55 -0
- package/src/memory/graph/conversation-graph-memory.ts +92 -5
- package/src/memory/graph/extraction.ts +4 -0
- package/src/memory/graph/graph-memory-state-store.ts +16 -3
- package/src/memory/graph/tool-handlers.ts +17 -7
- package/src/memory/graph/tools.ts +45 -6
- package/src/memory/indexer.ts +51 -29
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +86 -15
- package/src/memory/jobs/embed-concept-page.ts +65 -20
- package/src/memory/jobs-store.ts +51 -1
- package/src/memory/jobs-worker.ts +57 -3
- package/src/memory/llm-request-log-source-clickhouse.ts +324 -0
- package/src/memory/llm-request-log-source-local.ts +26 -0
- package/src/memory/llm-request-log-source.ts +64 -0
- package/src/memory/llm-request-log-store.ts +1 -1
- package/src/memory/llm-usage-store.ts +125 -5
- package/src/memory/memory-retrospective-constants.ts +13 -0
- package/src/memory/memory-retrospective-enqueue.ts +114 -0
- package/src/memory/memory-retrospective-job.ts +351 -0
- package/src/memory/memory-retrospective-startup-cleanup.ts +175 -0
- package/src/memory/memory-retrospective-state.ts +162 -0
- package/src/memory/memory-retrospective-trigger-check.ts +91 -0
- package/src/memory/memory-v2-activation-log-store.ts +49 -5
- package/src/memory/memory-v2-concept-frequency.ts +4 -0
- package/src/memory/message-content.ts +38 -1
- package/src/memory/migrations/109-external-conversation-bindings.ts +15 -4
- package/src/memory/migrations/227-add-conversation-inference-profile.ts +6 -1
- package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +20 -7
- package/src/memory/migrations/229-delete-private-conversations.test.ts +107 -1
- package/src/memory/migrations/229-delete-private-conversations.ts +19 -0
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +16 -2
- package/src/memory/migrations/240-conversation-inference-profile-session.ts +25 -0
- package/src/memory/migrations/241-activation-state-fk-cascade.ts +50 -0
- package/src/memory/migrations/242-message-bookmarks.ts +38 -0
- package/src/memory/migrations/243-provider-connections.ts +68 -0
- package/src/memory/migrations/244-provider-connection-status-label.ts +23 -0
- package/src/memory/migrations/245-memory-retrospective-state.ts +36 -0
- package/src/memory/migrations/246-backfill-provider-connection-label.ts +81 -0
- package/src/memory/migrations/247-external-conversation-binding-thread-id.ts +78 -0
- package/src/memory/migrations/248-create-onboarding-events.ts +21 -0
- package/src/memory/migrations/249-normalize-slack-external-content.ts +240 -0
- package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +84 -0
- package/src/memory/migrations/__tests__/245-memory-retrospective-state.test.ts +125 -0
- package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +192 -0
- package/src/memory/migrations/index.ts +13 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/onboarding-events-store.ts +106 -0
- package/src/memory/published-pages-store.ts +16 -0
- package/src/memory/schema/bookmarks.ts +36 -0
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/conversations.ts +2 -0
- package/src/memory/schema/index.ts +2 -0
- package/src/memory/schema/inference.ts +27 -0
- package/src/memory/schema/infrastructure.ts +12 -0
- package/src/memory/schema/memory-core.ts +9 -0
- package/src/memory/search/semantic.ts +1 -4
- package/src/memory/turn-events-store.ts +127 -2
- package/src/memory/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +27 -0
- package/src/memory/v2/__tests__/activation-store.test.ts +5 -5
- package/src/memory/v2/__tests__/activation.test.ts +11 -12
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +38 -21
- package/src/memory/v2/__tests__/consolidation-job.test.ts +123 -135
- package/src/memory/v2/__tests__/edge-index.test.ts +1 -1
- package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +111 -0
- package/src/memory/v2/__tests__/injection.test.ts +726 -18
- package/src/memory/v2/__tests__/migration.test.ts +94 -3
- package/src/memory/v2/__tests__/page-index.test.ts +360 -0
- package/src/memory/v2/__tests__/page-store.test.ts +14 -1
- package/src/memory/v2/__tests__/prompts-router.test.ts +309 -0
- package/src/memory/v2/__tests__/qdrant.test.ts +138 -3
- package/src/memory/v2/__tests__/reranker.test.ts +4 -4
- package/src/memory/v2/__tests__/router.test.ts +531 -0
- package/src/memory/v2/__tests__/sim.test.ts +45 -1
- package/src/memory/v2/__tests__/skill-store.test.ts +445 -11
- package/src/memory/v2/__tests__/static-context.test.ts +7 -22
- package/src/memory/v2/__tests__/sweep-job.test.ts +95 -0
- package/src/memory/v2/activation-store.ts +34 -5
- package/src/memory/v2/activation.ts +40 -27
- package/src/memory/v2/backfill-jobs.ts +17 -84
- package/src/memory/v2/consolidation-job.ts +85 -78
- package/src/memory/v2/frontmatter-sweep.ts +91 -0
- package/src/memory/v2/injection.ts +466 -109
- package/src/memory/v2/migration.ts +147 -20
- package/src/memory/v2/page-index.ts +221 -0
- package/src/memory/v2/page-store.ts +3 -0
- package/src/memory/v2/prompts/consolidation.ts +9 -7
- package/src/memory/v2/prompts/router.ts +195 -0
- package/src/memory/v2/prompts/sweep.ts +2 -2
- package/src/memory/v2/qdrant.ts +234 -93
- package/src/memory/v2/reranker.ts +14 -7
- package/src/memory/v2/router.ts +323 -0
- package/src/memory/v2/sim.ts +25 -12
- package/src/memory/v2/skill-store.ts +204 -30
- package/src/memory/v2/static-context.ts +16 -9
- package/src/memory/v2/sweep-job.ts +122 -96
- package/src/memory/v2/types.ts +10 -6
- package/src/memory/validation.ts +13 -0
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +45 -5
- package/src/messaging/providers/slack/__tests__/download.test.ts +231 -0
- package/src/messaging/providers/slack/adapter.ts +43 -5
- package/src/messaging/providers/slack/client.ts +27 -0
- package/src/messaging/providers/slack/deep-link.ts +65 -0
- package/src/messaging/providers/slack/download.ts +104 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +32 -0
- package/src/messaging/providers/slack/message-metadata.ts +27 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +134 -0
- package/src/messaging/providers/slack/render-transcript.ts +69 -5
- package/src/messaging/providers/slack/types.ts +20 -1
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +182 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +199 -0
- package/src/notifications/__tests__/signal-registry.test.ts +17 -0
- package/src/notifications/adapters/platform.ts +171 -0
- package/src/notifications/conversation-pairing.ts +4 -3
- package/src/notifications/copy-composer.ts +15 -0
- package/src/notifications/decision-engine.ts +2 -1
- package/src/notifications/destination-resolver.ts +21 -0
- package/src/notifications/emit-signal.ts +48 -2
- package/src/notifications/home-feed-side-effect.ts +165 -0
- package/src/notifications/signal.ts +8 -1
- package/src/oauth/connection-resolver.ts +8 -4
- package/src/oauth/platform-connection.ts +6 -2
- package/src/oauth/seed-providers.ts +10 -1
- package/src/permissions/checker.ts +14 -0
- package/src/permissions/ipc-risk-types.ts +3 -0
- package/src/permissions/question-prompter.test.ts +416 -0
- package/src/permissions/question-prompter.ts +294 -0
- package/src/platform/client.test.ts +1 -1
- package/src/platform/client.ts +1 -1
- package/src/plugin-api/constants.ts +26 -0
- package/src/plugin-api/index.ts +46 -0
- package/src/plugin-api/package.json +12 -0
- package/src/plugin-api/types.ts +144 -0
- package/src/plugins/defaults/circuit-breaker.ts +0 -5
- package/src/plugins/defaults/compaction.ts +0 -4
- package/src/plugins/defaults/empty-response.ts +0 -2
- package/src/plugins/defaults/history-repair.ts +0 -2
- package/src/plugins/defaults/injectors.ts +55 -6
- package/src/plugins/defaults/llm-call.ts +0 -2
- package/src/plugins/defaults/memory-retrieval.ts +0 -1
- package/src/plugins/defaults/overflow-reduce.ts +0 -1
- package/src/plugins/defaults/persistence.ts +0 -2
- package/src/plugins/defaults/title-generate.ts +0 -5
- package/src/plugins/defaults/token-estimate.ts +0 -2
- package/src/plugins/defaults/tool-error.ts +0 -7
- package/src/plugins/defaults/tool-execute.ts +0 -2
- package/src/plugins/defaults/tool-result-truncate.ts +0 -4
- package/src/plugins/ensure-plugin-api-shim.ts +96 -0
- package/src/plugins/external-api.ts +104 -0
- package/src/plugins/external-plugin-loader.ts +367 -0
- package/src/plugins/feature-gate.ts +22 -0
- package/src/plugins/pipeline.ts +37 -0
- package/src/plugins/registry.ts +48 -80
- package/src/plugins/types.ts +74 -53
- package/src/plugins/user-loader.ts +85 -43
- package/src/proactive-artifact/aux-message-injector.ts +11 -0
- package/src/proactive-artifact/job.test.ts +49 -9
- package/src/proactive-artifact/job.ts +4 -0
- package/src/proactive-artifact/trigger-state.test.ts +9 -0
- package/src/proactive-artifact/trigger-state.ts +4 -0
- package/src/prompts/__tests__/system-prompt.test.ts +117 -0
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +99 -0
- package/src/prompts/normalize-onboarding.ts +27 -0
- package/src/prompts/sections.ts +302 -0
- package/src/prompts/system-prompt.ts +72 -154
- package/src/prompts/templates/BOOTSTRAP.md +17 -1
- package/src/prompts/templates/system-sections.ts +173 -0
- package/src/prompts/update-bulletin-job.ts +61 -73
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +279 -0
- package/src/providers/__tests__/inference.test.ts +303 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
- package/src/providers/__tests__/provider-secret-catalog.test.ts +6 -0
- package/src/providers/__tests__/retry-callsite.test.ts +14 -32
- package/src/providers/__tests__/satellite-connection-routing.test.ts +510 -0
- package/src/providers/__tests__/search-provider-catalog.test.ts +80 -0
- package/src/providers/anthropic/client.ts +123 -54
- package/src/providers/call-site-routing.ts +94 -16
- package/src/providers/connection-resolution.ts +170 -0
- package/src/providers/inference/__tests__/connections-status-label.test.ts +250 -0
- package/src/providers/inference/adapter-factory.ts +210 -0
- package/src/providers/inference/auth.ts +112 -0
- package/src/providers/inference/backfill.ts +196 -0
- package/src/providers/inference/connections.ts +401 -0
- package/src/providers/inference/resolve-auth.ts +73 -0
- package/src/providers/model-catalog.ts +386 -6
- package/src/providers/openai/chat-completions-provider.ts +10 -2
- package/src/providers/openai/responses-provider.ts +4 -2
- package/src/providers/openrouter/client.ts +7 -0
- package/src/providers/{managed-proxy → platform-proxy}/constants.ts +4 -1
- package/src/providers/{managed-proxy → platform-proxy}/context.ts +3 -3
- package/src/providers/provider-availability.ts +17 -2
- package/src/providers/provider-catalog-visibility.ts +36 -0
- package/src/providers/provider-env-vars.ts +17 -7
- package/src/providers/provider-secret-catalog.ts +49 -30
- package/src/providers/provider-send-message.ts +41 -20
- package/src/providers/registry.ts +151 -159
- package/src/providers/retry.ts +65 -11
- package/src/providers/search-provider-catalog.ts +121 -0
- package/src/runtime/AGENTS.md +18 -5
- package/src/runtime/__tests__/agent-wake.test.ts +152 -0
- package/src/runtime/__tests__/background-job-runner.test.ts +357 -0
- package/src/runtime/__tests__/pre-first-message-gate.test.ts +82 -0
- package/src/runtime/actor-trust-resolver.ts +32 -10
- package/src/runtime/agent-wake.ts +64 -7
- package/src/runtime/assistant-event-hub.ts +3 -85
- package/src/runtime/auth/route-policy.ts +311 -9
- package/src/runtime/auth/same-actor.ts +2 -0
- package/src/runtime/background-job-runner.ts +339 -0
- package/src/runtime/btw-sidechain.ts +3 -0
- package/src/runtime/http-router.ts +36 -1
- package/src/runtime/http-server.ts +31 -5
- package/src/runtime/http-types.ts +21 -0
- package/src/runtime/middleware/__tests__/request-logger.test.ts +162 -0
- package/src/runtime/middleware/request-logger.ts +62 -1
- package/src/runtime/migrations/origin-mode.ts +1 -1
- package/src/runtime/pending-interactions.ts +1 -0
- package/src/runtime/pre-first-message-gate.ts +83 -0
- package/src/runtime/routes/__tests__/backup-routes.test.ts +8 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +268 -0
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +142 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +319 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +280 -4
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +15 -136
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +736 -0
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/question-routes.test.ts +395 -0
- package/src/runtime/routes/__tests__/stt-routes.test.ts +5 -1
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +384 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +70 -3
- package/src/runtime/routes/acp-routes-list.test.ts +143 -0
- package/src/runtime/routes/acp-routes.ts +12 -8
- package/src/runtime/routes/app-management-routes.ts +228 -3
- package/src/runtime/routes/approval-routes.ts +0 -18
- package/src/runtime/routes/audit-routes.ts +43 -0
- package/src/runtime/routes/auth-routes.ts +72 -0
- package/src/runtime/routes/avatar-routes.ts +273 -20
- package/src/runtime/routes/backup-routes.ts +406 -2
- package/src/runtime/routes/bookmark-routes.ts +156 -0
- package/src/runtime/routes/btw-routes.ts +5 -1
- package/src/runtime/routes/channel-availability-routes.ts +121 -0
- package/src/runtime/routes/channel-verification-routes.ts +2 -1
- package/src/runtime/routes/contact-routes.ts +0 -160
- package/src/runtime/routes/conversation-cli-routes.ts +233 -0
- package/src/runtime/routes/conversation-list-routes.ts +3 -20
- package/src/runtime/routes/conversation-management-routes.ts +47 -85
- package/src/runtime/routes/conversation-query-routes.ts +350 -97
- package/src/runtime/routes/conversation-routes.ts +121 -21
- package/src/runtime/routes/conversations-import-routes.ts +229 -0
- package/src/runtime/routes/credential-routes.ts +540 -0
- package/src/runtime/routes/debug-routes.ts +2 -2
- package/src/runtime/routes/document-pdf-renderer.ts +5 -1
- package/src/runtime/routes/documents-routes.ts +25 -86
- package/src/runtime/routes/domain-routes.ts +167 -0
- package/src/runtime/routes/email-routes.ts +603 -0
- package/src/runtime/routes/errors.ts +2 -2
- package/src/runtime/routes/events-routes.ts +192 -0
- package/src/runtime/routes/group-routes.ts +5 -0
- package/src/runtime/routes/home-feed-routes.ts +6 -78
- package/src/runtime/routes/host-app-control-routes.ts +44 -2
- package/src/runtime/routes/host-browser-routes.ts +103 -22
- package/src/runtime/routes/http-adapter.ts +2 -0
- package/src/runtime/routes/identity-routes.ts +5 -0
- package/src/runtime/routes/image-generation-routes.ts +99 -0
- package/src/runtime/routes/inbound-conversation.ts +28 -8
- package/src/runtime/routes/inbound-message-handler.ts +236 -41
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +248 -1
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +118 -7
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +17 -4
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +156 -0
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +22 -4
- package/src/runtime/routes/index.ts +42 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +285 -0
- package/src/runtime/routes/inference-profile-session-reaper.ts +84 -0
- package/src/runtime/routes/inference-profile-session-routes.ts +146 -0
- package/src/runtime/routes/inference-provider-connection-routes.ts +361 -0
- package/src/runtime/routes/inference-send-routes.ts +115 -0
- package/src/runtime/routes/integrations/slack/share.ts +4 -52
- package/src/runtime/routes/integrations/slack/token.ts +43 -0
- package/src/runtime/routes/integrations/twilio.ts +7 -13
- package/src/runtime/routes/mcp-auth-routes.ts +283 -9
- package/src/runtime/routes/memory-v2-routes.ts +13 -398
- package/src/runtime/routes/notification-routes.ts +3 -1
- package/src/runtime/routes/oauth-apps.ts +112 -7
- package/src/runtime/routes/oauth-commands-routes.ts +1097 -0
- package/src/runtime/routes/oauth-connect-routes.ts +67 -5
- package/src/runtime/routes/oauth-lifecycle-routes.ts +43 -0
- package/src/runtime/routes/oauth-providers.ts +298 -8
- package/src/runtime/routes/platform-routes.ts +336 -0
- package/src/runtime/routes/playground/inject-failures.ts +2 -1
- package/src/runtime/routes/playground/reset-circuit.ts +2 -1
- package/src/runtime/routes/playground/state.ts +2 -1
- package/src/runtime/routes/publish-routes.ts +221 -0
- package/src/runtime/routes/question-routes.ts +259 -0
- package/src/runtime/routes/rename-conversation-routes.ts +2 -33
- package/src/runtime/routes/schedule-routes.ts +79 -0
- package/src/runtime/routes/sequence-routes.ts +291 -0
- package/src/runtime/routes/settings-routes.ts +2 -10
- package/src/runtime/routes/skills-routes.ts +31 -1
- package/src/runtime/routes/stt-routes.ts +240 -3
- package/src/runtime/routes/subagents-routes.ts +57 -18
- package/src/runtime/routes/surface-action-routes.ts +43 -7
- package/src/runtime/routes/telemetry-routes.ts +27 -0
- package/src/runtime/routes/tts-routes.ts +93 -1
- package/src/runtime/routes/types.ts +32 -0
- package/src/runtime/routes/user-routes-cli.ts +243 -0
- package/src/runtime/routes/webhook-routes.ts +165 -0
- package/src/runtime/routes/workspace-routes.test.ts +43 -0
- package/src/runtime/routes/workspace-routes.ts +28 -0
- package/src/runtime/services/conversation-serializer.ts +39 -7
- package/src/runtime/sync/resource-sync-events.ts +117 -0
- package/src/runtime/sync/sync-publisher.test.ts +105 -0
- package/src/runtime/sync/sync-publisher.ts +21 -0
- package/src/schedule/schedule-store.ts +27 -2
- package/src/schedule/scheduler.ts +208 -123
- package/src/security/__tests__/provider-key-env-fallback.test.ts +12 -6
- package/src/security/__tests__/untrusted-content.test.ts +86 -0
- package/src/security/secret-patterns.ts +3 -0
- package/src/security/untrusted-content.ts +93 -8
- package/src/sequence/engine.ts +38 -40
- package/src/skills/catalog-files.ts +1 -1
- package/src/skills/catalog-install.ts +233 -116
- package/src/skills/clawhub.ts +70 -13
- package/src/skills/managed-store.ts +4 -119
- package/src/skills/skillssh-registry.ts +27 -48
- package/src/subagent/manager.ts +28 -15
- package/src/telemetry/types.ts +113 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +312 -5
- package/src/telemetry/usage-telemetry-reporter.ts +113 -7
- package/src/tools/apps/executors.ts +58 -7
- package/src/tools/ask-question/ask-question-tool.test.ts +509 -0
- package/src/tools/ask-question/ask-question-tool.ts +304 -0
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +206 -0
- package/src/tools/browser/browser-execution.ts +29 -14
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +174 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +16 -13
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +24 -1
- package/src/tools/browser/cdp-client/factory.ts +66 -5
- package/src/tools/browser/runtime-check.ts +77 -0
- package/src/tools/computer-use/definitions.ts +3 -3
- package/src/tools/credentials/vault.ts +1 -1
- package/src/tools/document/document-tool.ts +124 -1
- package/src/tools/filesystem/edit.ts +1 -1
- package/src/tools/filesystem/list.ts +1 -1
- package/src/tools/filesystem/read.ts +1 -1
- package/src/tools/filesystem/write.ts +5 -2
- package/src/tools/host-filesystem/transfer.ts +1 -1
- package/src/tools/host-terminal/host-shell.ts +1 -1
- package/src/tools/memory/register.test.ts +3 -3
- package/src/tools/memory/register.ts +9 -1
- package/src/tools/network/__tests__/web-search.test.ts +156 -0
- package/src/tools/network/web-search.ts +280 -37
- package/src/tools/permission-checker.ts +14 -6
- package/src/tools/registry.ts +17 -7
- package/src/tools/schedule/create.ts +2 -2
- package/src/tools/schema-transforms.ts +7 -2
- package/src/tools/side-effects.ts +1 -0
- package/src/tools/skills/delete-managed.ts +4 -4
- package/src/tools/skills/execute.ts +1 -1
- package/src/tools/skills/scaffold-managed.ts +3 -2
- package/src/tools/subagent/notify-parent.ts +1 -1
- package/src/tools/subagent/spawn.ts +3 -3
- package/src/tools/system/request-permission.ts +2 -2
- package/src/tools/terminal/safe-env.ts +60 -1
- package/src/tools/terminal/shell.ts +44 -0
- package/src/tools/tool-manifest.ts +2 -0
- package/src/tools/types.ts +72 -21
- package/src/tools/ui-surface/definitions.ts +6 -5
- package/src/tts/__tests__/provider-adapters.test.ts +76 -2
- package/src/tts/providers/elevenlabs-provider.ts +75 -1
- package/src/types/onboarding-context.ts +2 -0
- package/src/usage/attribution.ts +3 -2
- package/src/util/errors.ts +17 -0
- package/src/util/platform.ts +10 -0
- package/src/util/pricing.ts +86 -160
- package/src/watcher/__tests__/engine.test.ts +323 -0
- package/src/watcher/constants.ts +7 -0
- package/src/watcher/engine.ts +94 -90
- package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +6 -9
- package/src/workspace/migrations/054-seed-recall-callsite.ts +10 -1
- package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +94 -5
- package/src/workspace/migrations/069-seed-onboarding-threads.ts +8 -2
- package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +117 -0
- package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +95 -0
- package/src/workspace/migrations/074-drop-deprecated-secret-detection-keys.ts +117 -0
- package/src/workspace/migrations/075-memory-v2-bm25-b-default-reembed.ts +61 -0
- package/src/workspace/migrations/076-drop-services-inference-mode.ts +62 -0
- package/src/workspace/migrations/077-seed-memory-router-callsite.ts +89 -0
- package/src/workspace/migrations/078-release-notes-tavily-web-search.ts +66 -0
- package/src/workspace/migrations/079-home-feed-notification-only.ts +197 -0
- package/src/workspace/migrations/080-restrict-vercel-api-token-metadata.ts +182 -0
- package/src/workspace/migrations/081-backfill-bash-allowed-tools-for-injection-credentials.ts +160 -0
- package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +154 -0
- package/src/workspace/migrations/083-system-prompt-prefix-to-file.ts +191 -0
- package/src/workspace/migrations/084-remove-legacy-skills-index.ts +276 -0
- package/src/workspace/migrations/085-memory-v2-bm25-b-reembed-disabled-v2-pages.ts +137 -0
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +198 -0
- package/src/workspace/migrations/registry.ts +30 -0
- package/src/workspace/migrations/runner.ts +46 -5
- package/src/workspace/migrations/types.ts +17 -3
- package/src/workspace/provider-commit-message-generator.ts +3 -2
- package/examples/plugins/echo/bun.lock +0 -25
- package/src/__tests__/context-search-pkb-source.test.ts +0 -498
- package/src/__tests__/context-window-manager.test.ts +0 -2093
- package/src/__tests__/credentials-cli.test.ts +0 -1225
- package/src/__tests__/memory-admin-recall.test.ts +0 -213
- package/src/approvals/__tests__/guardian-feed-event.test.ts +0 -303
- package/src/cli/commands/__tests__/email-download.test.ts +0 -260
- package/src/cli/commands/__tests__/email-list.test.ts +0 -216
- package/src/cli/commands/__tests__/email-register.test.ts +0 -186
- package/src/cli/commands/__tests__/email-send.test.ts +0 -416
- package/src/cli/commands/__tests__/email-status.test.ts +0 -185
- package/src/cli/commands/__tests__/email-unregister.test.ts +0 -168
- package/src/cli/commands/__tests__/routes.test.ts +0 -562
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +0 -454
- package/src/cli/commands/autonomy.ts +0 -365
- package/src/cli/commands/memory.ts +0 -424
- package/src/cli/commands/oauth/__tests__/connect.test.ts +0 -947
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +0 -686
- package/src/cli/commands/oauth/__tests__/mode.test.ts +0 -632
- package/src/cli/commands/oauth/__tests__/ping.test.ts +0 -631
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +0 -573
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +0 -330
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +0 -521
- package/src/cli/commands/oauth/__tests__/status.test.ts +0 -551
- package/src/cli/commands/oauth/__tests__/token.test.ts +0 -420
- package/src/cli/lib/daemon-avatar-client.ts +0 -37
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -87
- package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +0 -207
- package/src/context/__tests__/compact-prompt.test.ts +0 -63
- package/src/context/prompts/compact.md +0 -26
- package/src/daemon/__tests__/conversation-feed-event.test.ts +0 -304
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +0 -233
- package/src/home/__tests__/assistant-feed-authoring.test.ts +0 -156
- package/src/home/__tests__/emit-feed-event.test.ts +0 -169
- package/src/home/__tests__/feed-population-integration.test.ts +0 -312
- package/src/home/__tests__/feed-scheduler.test.ts +0 -222
- package/src/home/__tests__/phase5-exit-criteria.test.ts +0 -229
- package/src/home/__tests__/platform-gmail-digest.test.ts +0 -222
- package/src/home/__tests__/rollup-producer.test.ts +0 -507
- package/src/home/assistant-feed-authoring.ts +0 -135
- package/src/home/emit-feed-event.ts +0 -169
- package/src/home/feed-scheduler.ts +0 -281
- package/src/home/platform-gmail-digest.ts +0 -163
- package/src/home/rewrite-command-preview.ts +0 -66
- package/src/home/rewrite-feed-title.ts +0 -58
- package/src/home/rollup-producer.ts +0 -426
- package/src/memory/admin.ts +0 -326
- package/src/memory/context-search/sources/pkb.ts +0 -476
- package/src/memory/graph/compaction.ts +0 -299
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +0 -37
- /package/src/cli/{commands → lib}/cache-fs.ts +0 -0
|
@@ -16,6 +16,35 @@ export interface ClassifiedConversationError {
|
|
|
16
16
|
debugDetails?: string;
|
|
17
17
|
/** Machine-readable error category for log report metadata and triage. */
|
|
18
18
|
errorCategory: string;
|
|
19
|
+
/**
|
|
20
|
+
* Name of the `provider_connections` row in play when the error
|
|
21
|
+
* occurred. Forwarded to the wire `ConversationErrorMessage` so chat
|
|
22
|
+
* banners can point users at the specific slot to fix. Only set by
|
|
23
|
+
* classifiers / callers that have the resolved connection in scope —
|
|
24
|
+
* generic regex fallbacks leave it undefined.
|
|
25
|
+
*/
|
|
26
|
+
connectionName?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Name of the resolved profile (`llm.activeProfile` / per-call override)
|
|
29
|
+
* in play when the error occurred. Forwarded to the wire message so
|
|
30
|
+
* banners can name the profile when the connection identifier is
|
|
31
|
+
* generic (e.g. the canonical managed connection). Optional for the
|
|
32
|
+
* same reason as `connectionName`.
|
|
33
|
+
*/
|
|
34
|
+
profileName?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Optional resolved-config context that callers can attach to error
|
|
39
|
+
* classification so the resulting `ConversationErrorMessage` can name the
|
|
40
|
+
* exact connection / profile in play. Used in particular by the chat
|
|
41
|
+
* dispatch sites to make `PROVIDER_INVALID_KEY` and `PROVIDER_NOT_CONFIGURED`
|
|
42
|
+
* actionable (the macOS banner reads these to render "Invalid API key for
|
|
43
|
+
* profile X" instead of a generic "API key required").
|
|
44
|
+
*/
|
|
45
|
+
export interface ConversationErrorAttribution {
|
|
46
|
+
connectionName?: string;
|
|
47
|
+
profileName?: string;
|
|
19
48
|
}
|
|
20
49
|
|
|
21
50
|
// Network-level error patterns (connection refused, timeout, DNS, reset)
|
|
@@ -120,6 +149,13 @@ const STREAMING_ERROR_PATTERNS = [
|
|
|
120
149
|
];
|
|
121
150
|
|
|
122
151
|
// User-initiated cancellation patterns — these should NOT produce conversation_error
|
|
152
|
+
// Image-input validation patterns — Anthropic 400s with this message when an image
|
|
153
|
+
// block exceeds the per-side pixel cap. Distinct classification matters because
|
|
154
|
+
// retrying with the same oversized image is futile; the user needs to resize.
|
|
155
|
+
const IMAGE_DIMENSIONS_TOO_LARGE_PATTERNS = [
|
|
156
|
+
/image dimensions? exceeds? max allowed size/i,
|
|
157
|
+
];
|
|
158
|
+
|
|
123
159
|
const CANCEL_PATTERNS = [/abort/i, /cancel/i];
|
|
124
160
|
|
|
125
161
|
/**
|
|
@@ -130,6 +166,20 @@ export interface ErrorContext {
|
|
|
130
166
|
phase: "agent_loop" | "regenerate" | "handler" | "persist";
|
|
131
167
|
/** Whether the abort signal was active when the error occurred. */
|
|
132
168
|
aborted?: boolean;
|
|
169
|
+
/**
|
|
170
|
+
* Optional name of the `provider_connections` row in play. Plumbed by
|
|
171
|
+
* dispatch sites that know the resolved connection (chat agent loop)
|
|
172
|
+
* so credential-related classifications (`PROVIDER_INVALID_KEY`,
|
|
173
|
+
* `PROVIDER_NOT_CONFIGURED`) can name the exact slot to fix.
|
|
174
|
+
*/
|
|
175
|
+
connectionName?: string;
|
|
176
|
+
/**
|
|
177
|
+
* Optional name of the resolved profile in play. Plumbed alongside
|
|
178
|
+
* `connectionName` by dispatch sites; surfaces in the wire message so
|
|
179
|
+
* the macOS chat banner can reference the profile even when the
|
|
180
|
+
* underlying connection name is generic.
|
|
181
|
+
*/
|
|
182
|
+
profileName?: string;
|
|
133
183
|
}
|
|
134
184
|
|
|
135
185
|
/**
|
|
@@ -188,32 +238,43 @@ export function classifyConversationError(
|
|
|
188
238
|
(error instanceof Error ? error.stack : undefined) ?? message;
|
|
189
239
|
const debugDetails = truncateDebugDetails(rawDetails);
|
|
190
240
|
|
|
241
|
+
// Extract optional attribution (connection / profile names) so
|
|
242
|
+
// credential-related classifications can name the exact slot to fix.
|
|
243
|
+
// A `ProviderNotConfiguredError` instance carries its own attribution
|
|
244
|
+
// (from the throw site) which takes priority over context when present.
|
|
245
|
+
const attribution: ConversationErrorAttribution = {
|
|
246
|
+
...(ctx.connectionName ? { connectionName: ctx.connectionName } : {}),
|
|
247
|
+
...(ctx.profileName ? { profileName: ctx.profileName } : {}),
|
|
248
|
+
};
|
|
249
|
+
|
|
191
250
|
// Dedicated classification for missing provider API key
|
|
192
251
|
if (error instanceof ProviderNotConfiguredError) {
|
|
193
252
|
return {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
253
|
+
...providerNotConfiguredClassification({
|
|
254
|
+
connectionName:
|
|
255
|
+
error.connectionName ?? attribution.connectionName,
|
|
256
|
+
profileName: error.profileName ?? attribution.profileName,
|
|
257
|
+
}),
|
|
199
258
|
debugDetails,
|
|
200
259
|
};
|
|
201
260
|
}
|
|
202
261
|
|
|
203
262
|
// Phase-specific overrides
|
|
204
263
|
if (ctx.phase === "regenerate") {
|
|
205
|
-
const base = classifyCore(error, message);
|
|
264
|
+
const base = classifyCore(error, message, attribution);
|
|
206
265
|
return {
|
|
207
266
|
code: "REGENERATE_FAILED",
|
|
208
267
|
userMessage: `Could not regenerate the response. ${base.userMessage}`,
|
|
209
268
|
retryable: true,
|
|
210
269
|
debugDetails,
|
|
211
270
|
errorCategory: `regenerate:${base.errorCategory}`,
|
|
271
|
+
...(base.connectionName ? { connectionName: base.connectionName } : {}),
|
|
272
|
+
...(base.profileName ? { profileName: base.profileName } : {}),
|
|
212
273
|
};
|
|
213
274
|
}
|
|
214
275
|
|
|
215
276
|
// Classify using statusCode (if ProviderError) then regex fallback
|
|
216
|
-
const classified = classifyCore(error, message);
|
|
277
|
+
const classified = classifyCore(error, message, attribution);
|
|
217
278
|
return {
|
|
218
279
|
...classified,
|
|
219
280
|
debugDetails,
|
|
@@ -223,10 +284,16 @@ export function classifyConversationError(
|
|
|
223
284
|
/**
|
|
224
285
|
* Core classification: check ProviderError.statusCode first for
|
|
225
286
|
* deterministic classification, then fall back to regex patterns.
|
|
287
|
+
*
|
|
288
|
+
* `attribution` carries the resolved connection / profile names (when the
|
|
289
|
+
* caller knows them) so credential-related results can name the exact
|
|
290
|
+
* slot for the user to fix. Pass an empty object when no attribution is
|
|
291
|
+
* available — the classifier falls back to a generic message.
|
|
226
292
|
*/
|
|
227
293
|
function classifyCore(
|
|
228
294
|
error: unknown,
|
|
229
295
|
message: string,
|
|
296
|
+
attribution: ConversationErrorAttribution = {},
|
|
230
297
|
): Omit<ClassifiedConversationError, "debugDetails"> {
|
|
231
298
|
// ProviderError with statusCode — deterministic classification
|
|
232
299
|
if (error instanceof ProviderError && error.statusCode !== undefined) {
|
|
@@ -240,39 +307,33 @@ function classifyCore(
|
|
|
240
307
|
};
|
|
241
308
|
}
|
|
242
309
|
if (error.statusCode === 401 || error.statusCode === 403) {
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
code: "MANAGED_KEY_INVALID",
|
|
254
|
-
userMessage:
|
|
255
|
-
"The assistant API key is invalid. Attempting to re-provision…",
|
|
256
|
-
retryable: true,
|
|
257
|
-
errorCategory: "managed_key_invalid",
|
|
258
|
-
};
|
|
259
|
-
}
|
|
310
|
+
// Both managed-proxy and user-key 401/403s reach this branch.
|
|
311
|
+
// Managed-proxy routes through the assistant API key (stale → re-
|
|
312
|
+
// provision) and emits `MANAGED_KEY_INVALID`; everything else is a
|
|
313
|
+
// user-set credential that the upstream provider rejected → emit
|
|
314
|
+
// `PROVIDER_INVALID_KEY` so the macOS chat banner renders an
|
|
315
|
+
// "Invalid API key" surface (distinct from "API key required"
|
|
316
|
+
// which only fires when the key is genuinely missing — see
|
|
317
|
+
// `providerNotConfiguredClassification`).
|
|
318
|
+
const providerName = error.provider;
|
|
319
|
+
if (getProviderRoutingSource(providerName) === "managed-proxy") {
|
|
260
320
|
return {
|
|
261
|
-
code: "
|
|
321
|
+
code: "MANAGED_KEY_INVALID",
|
|
262
322
|
userMessage:
|
|
263
|
-
"
|
|
264
|
-
retryable:
|
|
265
|
-
errorCategory: "
|
|
323
|
+
"The assistant API key is invalid. Attempting to re-provision…",
|
|
324
|
+
retryable: true,
|
|
325
|
+
errorCategory: "managed_key_invalid",
|
|
266
326
|
};
|
|
267
327
|
}
|
|
328
|
+
return invalidApiKeyClassification(attribution);
|
|
268
329
|
}
|
|
269
330
|
if (error.statusCode === 401) {
|
|
270
331
|
return {
|
|
271
|
-
code: "
|
|
332
|
+
code: "PROVIDER_INVALID_KEY",
|
|
272
333
|
userMessage:
|
|
273
334
|
"Your API key is invalid or expired. Update it in Settings or switch to managed mode.",
|
|
274
335
|
retryable: false,
|
|
275
|
-
errorCategory: "
|
|
336
|
+
errorCategory: "provider_invalid_key",
|
|
276
337
|
};
|
|
277
338
|
}
|
|
278
339
|
if (error.statusCode === 402) {
|
|
@@ -362,12 +423,18 @@ function classifyCore(
|
|
|
362
423
|
message,
|
|
363
424
|
)
|
|
364
425
|
) {
|
|
426
|
+
// Mirror the 401/403 branch: a credential-shaped 4xx is an
|
|
427
|
+
// "invalid key" surface (banner: "Invalid API key"), distinct
|
|
428
|
+
// from "no key configured" (banner: "API key required").
|
|
429
|
+
return invalidApiKeyClassification(attribution);
|
|
430
|
+
}
|
|
431
|
+
if (isImageDimensionsTooLarge(message)) {
|
|
365
432
|
return {
|
|
366
|
-
code: "
|
|
433
|
+
code: "IMAGE_TOO_LARGE",
|
|
367
434
|
userMessage:
|
|
368
|
-
"
|
|
435
|
+
"An attached image is too large for the AI provider — image dimensions must be under 8000 pixels per side. Resize the image and try again.",
|
|
369
436
|
retryable: false,
|
|
370
|
-
errorCategory: "
|
|
437
|
+
errorCategory: "image_dimensions_too_large",
|
|
371
438
|
};
|
|
372
439
|
}
|
|
373
440
|
return {
|
|
@@ -388,6 +455,11 @@ export function isContextTooLarge(message: string): boolean {
|
|
|
388
455
|
return CONTEXT_TOO_LARGE_PATTERNS.some((p) => p.test(message));
|
|
389
456
|
}
|
|
390
457
|
|
|
458
|
+
/** Check whether an error message indicates an image-input dimension failure. */
|
|
459
|
+
function isImageDimensionsTooLarge(message: string): boolean {
|
|
460
|
+
return IMAGE_DIMENSIONS_TOO_LARGE_PATTERNS.some((p) => p.test(message));
|
|
461
|
+
}
|
|
462
|
+
|
|
391
463
|
/** Check whether an error message indicates a web-search-specific ordering failure. */
|
|
392
464
|
function isWebSearchOrderingError(message: string): boolean {
|
|
393
465
|
return WEB_SEARCH_ORDERING_PATTERNS.some((p) => p.test(message));
|
|
@@ -456,6 +528,80 @@ function providerBillingClassification(): Omit<
|
|
|
456
528
|
};
|
|
457
529
|
}
|
|
458
530
|
|
|
531
|
+
/**
|
|
532
|
+
* Build a user-facing message that names the exact profile / connection
|
|
533
|
+
* to fix when one is known, falling back to a generic phrase otherwise.
|
|
534
|
+
* Profile is preferred because that's the entity the user picks in the
|
|
535
|
+
* chat picker; connection is shown when no profile is in play (e.g.
|
|
536
|
+
* `llm.default` direct dispatch) or as a parenthetical when both differ.
|
|
537
|
+
*/
|
|
538
|
+
function describeAttribution(
|
|
539
|
+
attribution: ConversationErrorAttribution | undefined,
|
|
540
|
+
): string {
|
|
541
|
+
if (!attribution) return "";
|
|
542
|
+
const { profileName, connectionName } = attribution;
|
|
543
|
+
if (profileName && connectionName && profileName !== connectionName) {
|
|
544
|
+
return ` for profile "${profileName}" (connection "${connectionName}")`;
|
|
545
|
+
}
|
|
546
|
+
if (profileName) return ` for profile "${profileName}"`;
|
|
547
|
+
if (connectionName) return ` for connection "${connectionName}"`;
|
|
548
|
+
return "";
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* Classification for an invalid (rejected by the upstream provider, e.g.
|
|
553
|
+
* Anthropic 401/403) API key. Distinct from `PROVIDER_NOT_CONFIGURED`
|
|
554
|
+
* (which is for a key that was never set) so the macOS chat banner can
|
|
555
|
+
* render "Invalid API key" rather than "API key required" — they have
|
|
556
|
+
* different recovery actions (update vs. add).
|
|
557
|
+
*/
|
|
558
|
+
function invalidApiKeyClassification(
|
|
559
|
+
attribution?: ConversationErrorAttribution,
|
|
560
|
+
): Omit<ClassifiedConversationError, "debugDetails"> {
|
|
561
|
+
const target = describeAttribution(attribution);
|
|
562
|
+
return {
|
|
563
|
+
code: "PROVIDER_INVALID_KEY",
|
|
564
|
+
userMessage: target
|
|
565
|
+
? `The API key${target} was rejected by the provider. Update it in Settings.`
|
|
566
|
+
: "Your API key was rejected by the provider. Update it in Settings.",
|
|
567
|
+
retryable: false,
|
|
568
|
+
errorCategory: "provider_invalid_key",
|
|
569
|
+
...(attribution?.connectionName
|
|
570
|
+
? { connectionName: attribution.connectionName }
|
|
571
|
+
: {}),
|
|
572
|
+
...(attribution?.profileName
|
|
573
|
+
? { profileName: attribution.profileName }
|
|
574
|
+
: {}),
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
/**
|
|
579
|
+
* Classification for a genuinely-missing provider credential — vault has
|
|
580
|
+
* no entry for the resolved connection's `auth.credential`, or no
|
|
581
|
+
* provider is registered at all. The macOS chat banner renders this as
|
|
582
|
+
* "API key required" with an "Open Settings" CTA. Distinct from
|
|
583
|
+
* `PROVIDER_INVALID_KEY` (where a key exists but was rejected).
|
|
584
|
+
*/
|
|
585
|
+
function providerNotConfiguredClassification(
|
|
586
|
+
attribution?: ConversationErrorAttribution,
|
|
587
|
+
): Omit<ClassifiedConversationError, "debugDetails"> {
|
|
588
|
+
const target = describeAttribution(attribution);
|
|
589
|
+
return {
|
|
590
|
+
code: "PROVIDER_NOT_CONFIGURED",
|
|
591
|
+
userMessage: target
|
|
592
|
+
? `No API key configured${target}. Add one in Settings to start chatting.`
|
|
593
|
+
: "No API key configured for inference. Add one in Settings to start chatting.",
|
|
594
|
+
retryable: true,
|
|
595
|
+
errorCategory: "provider_not_configured",
|
|
596
|
+
...(attribution?.connectionName
|
|
597
|
+
? { connectionName: attribution.connectionName }
|
|
598
|
+
: {}),
|
|
599
|
+
...(attribution?.profileName
|
|
600
|
+
? { profileName: attribution.profileName }
|
|
601
|
+
: {}),
|
|
602
|
+
};
|
|
603
|
+
}
|
|
604
|
+
|
|
459
605
|
function classifyByMessage(
|
|
460
606
|
error: unknown,
|
|
461
607
|
message: string,
|
|
@@ -629,5 +775,14 @@ export function buildConversationErrorMessage(
|
|
|
629
775
|
retryable: classified.retryable,
|
|
630
776
|
debugDetails: classified.debugDetails,
|
|
631
777
|
errorCategory: classified.errorCategory,
|
|
778
|
+
// Optional attribution — only forwarded when the classifier was able
|
|
779
|
+
// to pin the failure to a specific provider connection / profile.
|
|
780
|
+
// The macOS chat banner reads these to render targeted CTAs.
|
|
781
|
+
...(classified.connectionName
|
|
782
|
+
? { connectionName: classified.connectionName }
|
|
783
|
+
: {}),
|
|
784
|
+
...(classified.profileName
|
|
785
|
+
? { profileName: classified.profileName }
|
|
786
|
+
: {}),
|
|
632
787
|
};
|
|
633
788
|
}
|
|
@@ -17,6 +17,8 @@ import {
|
|
|
17
17
|
type MessageRow,
|
|
18
18
|
} from "../memory/conversation-crud.js";
|
|
19
19
|
import { enqueueMemoryJob } from "../memory/jobs-store.js";
|
|
20
|
+
import { enqueueMemoryRetrospectiveIfEnabled } from "../memory/memory-retrospective-enqueue.js";
|
|
21
|
+
import { shouldExposePersonalMemory } from "../memory/v2/static-context.js";
|
|
20
22
|
import type { PermissionPrompter } from "../permissions/prompter.js";
|
|
21
23
|
import type { SecretPrompter } from "../permissions/secret-prompter.js";
|
|
22
24
|
import type { ContentBlock, Message } from "../providers/types.js";
|
|
@@ -30,12 +32,14 @@ import { getLogger } from "../util/logger.js";
|
|
|
30
32
|
import { unregisterCallNotifiers } from "./conversation-notifiers.js";
|
|
31
33
|
import type { MessageQueue } from "./conversation-queue-manager.js";
|
|
32
34
|
import { resetSkillToolProjection } from "./conversation-skill-tools.js";
|
|
35
|
+
import { resolveTrustClass } from "./conversation-tool-setup.js";
|
|
33
36
|
import { repairHistory } from "./history-repair.js";
|
|
34
37
|
import type {
|
|
35
38
|
SurfaceData,
|
|
36
39
|
SurfaceType,
|
|
37
40
|
UsageStats,
|
|
38
41
|
} from "./message-protocol.js";
|
|
42
|
+
import type { TrustContext } from "./trust-context.js";
|
|
39
43
|
|
|
40
44
|
const log = getLogger("conversation-lifecycle");
|
|
41
45
|
|
|
@@ -112,8 +116,9 @@ export interface LoadFromDbContext {
|
|
|
112
116
|
usageStats: UsageStats;
|
|
113
117
|
contextCompactedMessageCount: number;
|
|
114
118
|
contextCompactedAt: number | null;
|
|
115
|
-
trustContext?:
|
|
119
|
+
trustContext?: TrustContext;
|
|
116
120
|
loadedHistoryTrustClass?: TrustClass;
|
|
121
|
+
loadedHistoryPersonalMemoryAllowed?: boolean;
|
|
117
122
|
}
|
|
118
123
|
|
|
119
124
|
export interface AbortContext {
|
|
@@ -183,6 +188,16 @@ export async function loadFromDb(ctx: LoadFromDbContext): Promise<void> {
|
|
|
183
188
|
ctx.contextCompactedAt = conv?.contextCompactedAt ?? null;
|
|
184
189
|
}
|
|
185
190
|
|
|
191
|
+
// Mirror the injection-time gate (`shouldExposePersonalMemory` in
|
|
192
|
+
// `conversation-agent-loop.ts`) so background/local conversations
|
|
193
|
+
// (sourceChannel `undefined` or `"vellum"`) can rehydrate the persisted
|
|
194
|
+
// v2 static memory block. Use `resolveTrustClass` for parity with the
|
|
195
|
+
// agent loop — it folds in the HTTP-auth-disabled dev bypass so
|
|
196
|
+
// rehydration and injection agree on the effective trust class.
|
|
197
|
+
const personalMemoryAllowed = shouldExposePersonalMemory({
|
|
198
|
+
sourceChannel: ctx.trustContext?.sourceChannel,
|
|
199
|
+
isTrustedActor: resolveTrustClass(ctx.trustContext) === "guardian",
|
|
200
|
+
});
|
|
186
201
|
const parsedMessages: Message[] = dbMessages
|
|
187
202
|
.slice(ctx.contextCompactedMessageCount)
|
|
188
203
|
.map((m, index, arr) => {
|
|
@@ -210,20 +225,19 @@ export async function loadFromDb(ctx: LoadFromDbContext): Promise<void> {
|
|
|
210
225
|
const meta = JSON.parse(m.metadata);
|
|
211
226
|
const isTail = index === arr.length - 1;
|
|
212
227
|
|
|
213
|
-
//
|
|
214
|
-
//
|
|
215
|
-
//
|
|
216
|
-
//
|
|
217
|
-
//
|
|
218
|
-
//
|
|
219
|
-
//
|
|
220
|
-
//
|
|
221
|
-
//
|
|
222
|
-
//
|
|
223
|
-
//
|
|
224
|
-
//
|
|
225
|
-
//
|
|
226
|
-
// is not always re-injected on the next turn).
|
|
228
|
+
// Rehydrate in reverse injection order (innermost block first)
|
|
229
|
+
// so the resulting layout matches `applyRuntimeInjections`'s
|
|
230
|
+
// after-memory-prefix splices in ascending injector order
|
|
231
|
+
// (pkb-context 30, pkb-reminder 35, memory-v2-static 38,
|
|
232
|
+
// now-md 40 — the v2 static block lands inside the memory
|
|
233
|
+
// prefix, so now-md splices *after* it):
|
|
234
|
+
// [<workspace>, <turn_context>, <memory __injected>,
|
|
235
|
+
// <memory>\n…</memory>, <NOW.md>, <system_reminder>,
|
|
236
|
+
// <knowledge_base>, ...original]
|
|
237
|
+
// Required so Anthropic's prefix cache keeps matching msg[0]
|
|
238
|
+
// across daemon restart and conversation eviction. The tail
|
|
239
|
+
// row only rehydrates `memoryInjectedBlock` — the next turn
|
|
240
|
+
// re-injects the rest fresh.
|
|
227
241
|
if (!isTail && typeof meta.pkbContextBlock === "string") {
|
|
228
242
|
content = [
|
|
229
243
|
{ type: "text" as const, text: meta.pkbContextBlock },
|
|
@@ -238,15 +252,44 @@ export async function loadFromDb(ctx: LoadFromDbContext): Promise<void> {
|
|
|
238
252
|
];
|
|
239
253
|
}
|
|
240
254
|
|
|
255
|
+
if (!isTail && typeof meta.nowScratchpadBlock === "string") {
|
|
256
|
+
content = [
|
|
257
|
+
{ type: "text" as const, text: meta.nowScratchpadBlock },
|
|
258
|
+
...content,
|
|
259
|
+
];
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// The v2 static memory block (essentials/threads/recent/buffer
|
|
263
|
+
// wrapped in `<memory>…</memory>`) carries personal user memory.
|
|
264
|
+
// Trust-gated to mirror `shouldExposePersonalMemory` at injection
|
|
265
|
+
// time — untrusted-actor views must not read persisted personal
|
|
266
|
+
// memory back through metadata. Skipped on the tail row because
|
|
267
|
+
// the next turn re-injects fresh content on full-mode turns.
|
|
268
|
+
if (
|
|
269
|
+
!isTail &&
|
|
270
|
+
personalMemoryAllowed &&
|
|
271
|
+
typeof meta.memoryV2StaticBlock === "string"
|
|
272
|
+
) {
|
|
273
|
+
content = [
|
|
274
|
+
{ type: "text" as const, text: meta.memoryV2StaticBlock },
|
|
275
|
+
...content,
|
|
276
|
+
];
|
|
277
|
+
}
|
|
278
|
+
|
|
241
279
|
// Memory remains rehydrated on all rows (existing behavior).
|
|
242
280
|
// Strip any pre-existing wrapper before re-wrapping so historical
|
|
243
281
|
// rows persisted with the wrapper (v2 path before the
|
|
244
282
|
// injectedBlockText contract was unified with v1's unwrapped form)
|
|
245
|
-
// don't render double-wrapped after rehydrate.
|
|
283
|
+
// don't render double-wrapped after rehydrate. Only unwrap when
|
|
284
|
+
// the full <memory>...</memory> pair is present so we don't mutate
|
|
285
|
+
// legitimate unwrapped payloads that happen to start with
|
|
286
|
+
// "<memory>\n" or end with "\n</memory>".
|
|
246
287
|
if (typeof meta.memoryInjectedBlock === "string") {
|
|
247
|
-
const
|
|
248
|
-
|
|
249
|
-
.
|
|
288
|
+
const block = meta.memoryInjectedBlock;
|
|
289
|
+
const inner =
|
|
290
|
+
block.startsWith("<memory>\n") && block.endsWith("\n</memory>")
|
|
291
|
+
? block.slice("<memory>\n".length, -"\n</memory>".length)
|
|
292
|
+
: block;
|
|
250
293
|
content = [
|
|
251
294
|
{
|
|
252
295
|
type: "text" as const,
|
|
@@ -256,13 +299,6 @@ export async function loadFromDb(ctx: LoadFromDbContext): Promise<void> {
|
|
|
256
299
|
];
|
|
257
300
|
}
|
|
258
301
|
|
|
259
|
-
if (!isTail && typeof meta.nowScratchpadBlock === "string") {
|
|
260
|
-
content = [
|
|
261
|
-
{ type: "text" as const, text: meta.nowScratchpadBlock },
|
|
262
|
-
...content,
|
|
263
|
-
];
|
|
264
|
-
}
|
|
265
|
-
|
|
266
302
|
if (!isTail && typeof meta.turnContextBlock === "string") {
|
|
267
303
|
content = [
|
|
268
304
|
{ type: "text" as const, text: meta.turnContextBlock },
|
|
@@ -311,6 +347,7 @@ export async function loadFromDb(ctx: LoadFromDbContext): Promise<void> {
|
|
|
311
347
|
}
|
|
312
348
|
|
|
313
349
|
ctx.loadedHistoryTrustClass = trustClass;
|
|
350
|
+
ctx.loadedHistoryPersonalMemoryAllowed = personalMemoryAllowed;
|
|
314
351
|
|
|
315
352
|
log.info(
|
|
316
353
|
{ conversationId: ctx.conversationId, count: ctx.messages.length },
|
|
@@ -398,6 +435,23 @@ export function disposeConversation(ctx: DisposeContext): void {
|
|
|
398
435
|
// Best-effort — don't block conversation disposal
|
|
399
436
|
}
|
|
400
437
|
}
|
|
438
|
+
|
|
439
|
+
try {
|
|
440
|
+
// Memory-retrospective lifecycle safety-net. The periodic triggers
|
|
441
|
+
// (interval / message_count / pre-compaction) handle the common
|
|
442
|
+
// path; lifecycle catches the gap between the last interval fire
|
|
443
|
+
// and conversation eviction. The job's `no_new_messages` early
|
|
444
|
+
// return makes this a cheap no-op when the periodic path already
|
|
445
|
+
// covered things. Lives inside the `!isAutoAnalysis` guard so
|
|
446
|
+
// auto-analysis conversations don't trigger retrospective enqueues
|
|
447
|
+
// on disposal — mirrors the indexer-time gate in `indexer.ts`.
|
|
448
|
+
enqueueMemoryRetrospectiveIfEnabled({
|
|
449
|
+
conversationId: ctx.conversationId,
|
|
450
|
+
trigger: "lifecycle",
|
|
451
|
+
});
|
|
452
|
+
} catch {
|
|
453
|
+
// Best-effort — don't block conversation disposal
|
|
454
|
+
}
|
|
401
455
|
}
|
|
402
456
|
|
|
403
457
|
try {
|
|
@@ -7,7 +7,10 @@
|
|
|
7
7
|
|
|
8
8
|
import { v4 as uuid } from "uuid";
|
|
9
9
|
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
enrichMessageWithSourcePaths,
|
|
12
|
+
type MessageAttachmentInput,
|
|
13
|
+
} from "../agent/attachments.js";
|
|
11
14
|
import { createUserMessage } from "../agent/message-types.js";
|
|
12
15
|
import type {
|
|
13
16
|
TurnChannelContext,
|
|
@@ -191,6 +194,19 @@ export interface MessagingConversationContext {
|
|
|
191
194
|
getTurnInterfaceContext(): TurnInterfaceContext | null;
|
|
192
195
|
}
|
|
193
196
|
|
|
197
|
+
export function serializePersistedUserMessageContent(
|
|
198
|
+
content: string,
|
|
199
|
+
attachments: MessageAttachmentInput[],
|
|
200
|
+
displayContent: string | undefined,
|
|
201
|
+
): string {
|
|
202
|
+
return JSON.stringify(
|
|
203
|
+
createUserMessage(
|
|
204
|
+
displayContent !== undefined ? displayContent : content,
|
|
205
|
+
attachments,
|
|
206
|
+
).content,
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
|
|
194
210
|
function extractTurnChannelContext(
|
|
195
211
|
metadata?: Record<string, unknown>,
|
|
196
212
|
): TurnChannelContext | null {
|
|
@@ -258,6 +274,9 @@ export function buildSlackMetaForPersistence(params: {
|
|
|
258
274
|
eventKind: "message",
|
|
259
275
|
...(candidate.threadTs ? { threadTs: candidate.threadTs } : {}),
|
|
260
276
|
...(candidate.displayName ? { displayName: candidate.displayName } : {}),
|
|
277
|
+
...(candidate.actorExternalUserId
|
|
278
|
+
? { actorExternalUserId: candidate.actorExternalUserId }
|
|
279
|
+
: {}),
|
|
261
280
|
};
|
|
262
281
|
return writeSlackMetadata(slackMeta);
|
|
263
282
|
}
|
|
@@ -454,11 +473,11 @@ export async function persistQueuedMessageBody(
|
|
|
454
473
|
// intent stripping), persist that to DB so users see the full message
|
|
455
474
|
// after restart. The in-memory userMessage (sent to the LLM) still uses
|
|
456
475
|
// the stripped content.
|
|
457
|
-
const contentToPersist =
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
476
|
+
const contentToPersist = serializePersistedUserMessageContent(
|
|
477
|
+
content,
|
|
478
|
+
attachmentInputs,
|
|
479
|
+
displayContent,
|
|
480
|
+
);
|
|
462
481
|
const persistedUserMessage = await addMessage(
|
|
463
482
|
ctx.conversationId,
|
|
464
483
|
"user",
|