@vellumai/assistant 0.6.4 → 0.6.6
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/.prettierignore +5 -0
- package/AGENTS.md +9 -1
- package/ARCHITECTURE.md +43 -49
- package/Dockerfile +17 -3
- package/README.md +3 -4
- package/__tests__/permissions/gateway-threshold-reader.test.ts +283 -0
- package/bun.lock +8 -3
- package/docs/architecture/integrations.md +33 -59
- package/docs/architecture/memory.md +25 -30
- package/docs/architecture/security.md +19 -18
- package/docs/browser-use-architecture-phase2.md +63 -20
- package/docs/error-handling.md +111 -0
- package/docs/plugins.md +761 -0
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +2 -1
- package/examples/plugins/echo/README.md +132 -0
- package/examples/plugins/echo/package.json +17 -0
- package/examples/plugins/echo/register.ts +187 -0
- package/knip.json +9 -2
- package/node_modules/@vellumai/ces-contracts/package.json +2 -1
- package/node_modules/@vellumai/ces-contracts/src/__tests__/trust-rules.test.ts +471 -0
- package/node_modules/@vellumai/ces-contracts/src/trust-rules.ts +398 -4
- package/node_modules/@vellumai/credential-storage/bun.lock +2 -2
- package/node_modules/@vellumai/credential-storage/package.json +2 -2
- package/node_modules/@vellumai/credential-storage/src/oauth-runtime.ts +20 -2
- package/node_modules/@vellumai/egress-proxy/bun.lock +2 -2
- package/node_modules/@vellumai/egress-proxy/package.json +2 -2
- package/node_modules/@vellumai/egress-proxy/src/types.ts +19 -0
- package/openapi.yaml +334 -78
- package/package.json +6 -3
- package/scripts/generate-openapi.ts +50 -11
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +318 -0
- package/src/__tests__/agent-loop-sentry-hygiene.test.ts +137 -0
- package/src/__tests__/agent-loop.test.ts +112 -1
- package/src/__tests__/anthropic-error-formatting.test.ts +98 -0
- package/src/__tests__/anthropic-provider.test.ts +171 -2
- package/src/__tests__/app-compiler.test.ts +57 -0
- package/src/__tests__/approval-cascade.test.ts +36 -10
- package/src/__tests__/approval-routes-http.test.ts +134 -10
- package/src/__tests__/assistant-attachments.test.ts +44 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -0
- package/src/__tests__/auto-analysis-end-to-end.test.ts +1 -0
- package/src/__tests__/avatar-generator.test.ts +4 -2
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/browser-identifier-parity-guard.test.ts +53 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +23 -33
- package/src/__tests__/browser-skill-endstate.test.ts +51 -182
- package/src/__tests__/btw-routes.test.ts +47 -1
- package/src/__tests__/bundled-asset.test.ts +6 -6
- package/src/__tests__/call-controller.test.ts +1 -2
- package/src/__tests__/call-site-routing-provider.test.ts +214 -0
- package/src/__tests__/catalog-cache.test.ts +96 -4
- package/src/__tests__/channel-approval-routes.test.ts +4 -4
- package/src/__tests__/channel-reply-delivery.test.ts +300 -2
- package/src/__tests__/checker.test.ts +870 -655
- package/src/__tests__/circuit-breaker-pipeline.test.ts +406 -0
- package/src/__tests__/cli-command-risk-guard.test.ts +30 -33
- package/src/__tests__/compaction-events.test.ts +501 -0
- package/src/__tests__/compaction-pipeline.test.ts +210 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +181 -0
- package/src/__tests__/compaction-timeout-recovery.test.ts +262 -0
- package/src/__tests__/compaction.benchmark.test.ts +1 -1
- package/src/__tests__/config-analysis.test.ts +11 -28
- package/src/__tests__/config-loader-backfill.test.ts +174 -0
- package/src/__tests__/config-loader-corrupt.test.ts +183 -0
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +202 -0
- package/src/__tests__/config-model-image-provider.test.ts +110 -0
- package/src/__tests__/config-schema-cmd.test.ts +11 -5
- package/src/__tests__/config-schema.test.ts +440 -114
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +0 -4
- package/src/__tests__/config-watcher.test.ts +2 -2
- package/src/__tests__/contact-store-user-file.test.ts +72 -73
- package/src/__tests__/contacts-tools.test.ts +26 -0
- package/src/__tests__/contacts-write.test.ts +4 -4
- package/src/__tests__/context-overflow-policy.test.ts +7 -7
- package/src/__tests__/context-token-estimator.test.ts +191 -1
- package/src/__tests__/context-window-manager.test.ts +883 -4
- package/src/__tests__/conversation-abort-tool-results.test.ts +32 -15
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +86 -46
- package/src/__tests__/conversation-agent-loop.test.ts +435 -216
- package/src/__tests__/conversation-attachments.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +36 -10
- package/src/__tests__/conversation-error.test.ts +37 -6
- package/src/__tests__/conversation-history-web-search.test.ts +7 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +34 -12
- package/src/__tests__/conversation-lifecycle.test.ts +336 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +27 -10
- package/src/__tests__/conversation-pairing.test.ts +174 -10
- package/src/__tests__/conversation-pre-run-repair.test.ts +32 -15
- package/src/__tests__/conversation-process-callsite.test.ts +309 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +44 -21
- package/src/__tests__/conversation-queue.test.ts +68 -38
- package/src/__tests__/conversation-routes-disk-view.test.ts +36 -7
- package/src/__tests__/conversation-routes-slash-commands.test.ts +31 -3
- package/src/__tests__/conversation-runtime-assembly.test.ts +2877 -152
- package/src/__tests__/conversation-runtime-workspace.test.ts +35 -50
- package/src/__tests__/conversation-seed-composer.test.ts +2 -2
- package/src/__tests__/conversation-skill-tools.test.ts +12 -146
- package/src/__tests__/conversation-slash-queue.test.ts +39 -19
- package/src/__tests__/conversation-slash-unknown.test.ts +53 -16
- package/src/__tests__/conversation-speed-override.test.ts +36 -12
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +1035 -0
- package/src/__tests__/conversation-surfaces-standalone.test.ts +630 -0
- package/src/__tests__/conversation-title-service.test.ts +118 -2
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +41 -2
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +1 -1
- package/src/__tests__/conversation-unread-route.test.ts +2 -2
- package/src/__tests__/conversation-usage.test.ts +4 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +33 -9
- package/src/__tests__/conversation-workspace-injection.test.ts +46 -15
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +46 -15
- package/src/__tests__/credential-broker-browser-fill.test.ts +110 -0
- package/src/__tests__/credential-health-service.test.ts +78 -9
- package/src/__tests__/credential-security-invariants.test.ts +5 -2
- package/src/__tests__/credential-storage-oauth-compat.test.ts +18 -0
- package/src/__tests__/credential-storage-static-compat.test.ts +28 -0
- package/src/__tests__/credential-vault-unit.test.ts +135 -19
- package/src/__tests__/credentials-cli.test.ts +1 -9
- package/src/__tests__/cross-provider-web-search.test.ts +84 -0
- package/src/__tests__/daemon-server-persist-and-process-callsite.test.ts +92 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +1 -0
- package/src/__tests__/delete-propagation.test.ts +437 -0
- package/src/__tests__/dm-backfill.test.ts +417 -0
- package/src/__tests__/dm-persistence.test.ts +227 -0
- package/src/__tests__/edit-propagation.test.ts +280 -0
- package/src/__tests__/empty-response-pipeline.test.ts +305 -0
- package/src/__tests__/ephemeral-permissions.test.ts +93 -3
- package/src/__tests__/estimator-calibration-integration.test.ts +208 -0
- package/src/__tests__/estimator-calibration.test.ts +213 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +29 -10
- package/src/__tests__/file-write-tool.test.ts +151 -1
- package/src/__tests__/filing-service.test.ts +255 -0
- package/src/__tests__/first-greeting.test.ts +247 -5
- package/src/__tests__/gemini-provider.test.ts +0 -3
- package/src/__tests__/guardian-grant-minting.test.ts +8 -0
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/headless-browser-mode.test.ts +57 -0
- package/src/__tests__/heartbeat-service.test.ts +96 -15
- package/src/__tests__/history-repair-pipeline.test.ts +399 -0
- package/src/__tests__/host-browser-e2e-cloud.test.ts +307 -0
- package/src/__tests__/host-browser-e2e-self-hosted.test.ts +3 -3
- package/src/__tests__/host-proxy-interface.test.ts +36 -2
- package/src/__tests__/host-shell-tool.test.ts +124 -18
- package/src/__tests__/http-user-message-parity.test.ts +29 -1
- package/src/__tests__/image-credentials.test.ts +137 -0
- package/src/__tests__/image-service-dispatcher.test.ts +186 -0
- package/src/__tests__/inbound-slack-persistence.test.ts +340 -0
- package/src/__tests__/injector-chain.test.ts +526 -0
- package/src/__tests__/intent-routing.test.ts +1 -66
- package/src/__tests__/llm-call-pipeline.test.ts +285 -0
- package/src/__tests__/llm-catalog-parity.test.ts +174 -0
- package/src/__tests__/llm-context-normalization.test.ts +121 -0
- package/src/__tests__/llm-resolver.test.ts +214 -0
- package/src/__tests__/llm-schema.test.ts +223 -0
- package/src/__tests__/managed-proxy-context.test.ts +6 -2
- package/src/__tests__/media-generate-image.test.ts +119 -13
- package/src/__tests__/memory-retrieval-pipeline.test.ts +401 -0
- package/src/__tests__/memory-upsert-concurrency.test.ts +1 -0
- package/src/__tests__/messaging-skill-split.test.ts +3 -34
- package/src/__tests__/migration-import-from-url.test.ts +621 -0
- package/src/__tests__/model-intents.test.ts +11 -83
- package/src/__tests__/notification-broadcaster.test.ts +3 -3
- package/src/__tests__/notification-decision-fallback.test.ts +0 -10
- package/src/__tests__/notification-decision-identity.test.ts +0 -9
- package/src/__tests__/notification-decision-recipient-context.test.ts +0 -9
- package/src/__tests__/notification-decision-strategy.test.ts +0 -11
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +108 -0
- package/src/__tests__/oauth-apps-routes.test.ts +1 -1
- package/src/__tests__/oauth-cli.test.ts +14 -12
- package/src/__tests__/oauth-connect-orchestrator.test.ts +4 -13
- package/src/__tests__/oauth-provider-serializer.test.ts +6 -4
- package/src/__tests__/oauth-provider-visibility.test.ts +3 -5
- package/src/__tests__/oauth-providers-routes.test.ts +3 -2
- package/src/__tests__/oauth-store.test.ts +46 -78
- package/src/__tests__/oauth2-gateway-transport.test.ts +8 -3
- package/src/__tests__/oauth2-refresh-retry.test.ts +279 -0
- package/src/__tests__/onboarding-template-contract.test.ts +16 -64
- package/src/__tests__/openai-image-service.test.ts +368 -0
- package/src/__tests__/openai-provider.test.ts +7 -0
- package/src/__tests__/openai-responses-provider.test.ts +396 -0
- package/src/__tests__/openrouter-provider-only.test.ts +135 -0
- package/src/__tests__/outbound-slack-persistence.test.ts +293 -0
- package/src/__tests__/overflow-reduce-pipeline.test.ts +676 -0
- package/src/__tests__/permission-checker-host-gate.test.ts +1 -25
- package/src/__tests__/permission-mode.test.ts +16 -0
- package/src/__tests__/permission-types.test.ts +0 -1
- package/src/__tests__/persist-onboarding-artifacts.test.ts +266 -0
- package/src/__tests__/persistence-pipeline.test.ts +377 -0
- package/src/__tests__/persona-resolver.test.ts +13 -13
- package/src/__tests__/pipeline-runner.test.ts +565 -0
- package/src/__tests__/pkb-autoinject.test.ts +37 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
- package/src/__tests__/platform.test.ts +5 -2
- package/src/__tests__/plugin-bootstrap.test.ts +483 -0
- package/src/__tests__/plugin-registry.test.ts +273 -0
- package/src/__tests__/plugin-route-contribution.test.ts +288 -0
- package/src/__tests__/plugin-skill-contribution.test.ts +367 -0
- package/src/__tests__/plugin-tool-contribution.test.ts +286 -0
- package/src/__tests__/plugin-types.test.ts +320 -0
- package/src/__tests__/pricing.test.ts +93 -14
- package/src/__tests__/profiler-routes.test.ts +1 -1
- package/src/__tests__/provider-commit-message-generator.test.ts +14 -84
- package/src/__tests__/provider-env-vars-scope.test.ts +52 -0
- package/src/__tests__/provider-error-scenarios.test.ts +135 -6
- package/src/__tests__/provider-managed-proxy-integration.test.ts +42 -11
- package/src/__tests__/provider-registry-ollama.test.ts +1 -2
- package/src/__tests__/proxy-approval-callback.test.ts +69 -9
- package/src/__tests__/reaction-persistence.test.ts +561 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +0 -2
- package/src/__tests__/relay-server.test.ts +1 -1
- package/src/__tests__/require-fresh-approval.test.ts +1 -1
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +136 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +226 -0
- package/src/__tests__/risk-classifier-parity.test.ts +230 -0
- package/src/__tests__/sanitize-config-for-transfer.test.ts +78 -1
- package/src/__tests__/schedule-routes.test.ts +131 -1
- package/src/__tests__/scheduler-recurrence.test.ts +14 -70
- package/src/__tests__/scheduler-reuse-conversation.test.ts +10 -50
- package/src/__tests__/secret-detection-handler.test.ts +0 -10
- package/src/__tests__/secret-ingress-http.test.ts +28 -0
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +125 -0
- package/src/__tests__/secret-routes-managed-proxy.test.ts +2 -3
- package/src/__tests__/secret-scanner-executor.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +29 -1
- package/src/__tests__/server-history-render.test.ts +31 -0
- package/src/__tests__/shell-identity.test.ts +0 -134
- package/src/__tests__/shell-parser-property.test.ts +13 -13
- package/src/__tests__/skill-cache-store.test.ts +182 -0
- package/src/__tests__/skills.test.ts +19 -33
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +3 -1
- package/src/__tests__/slack-skill.test.ts +3 -8
- package/src/__tests__/starter-bundle.test.ts +35 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +280 -0
- package/src/__tests__/suggestion-routes.test.ts +259 -3
- package/src/__tests__/system-prompt.test.ts +22 -35
- package/src/__tests__/task-memory-cleanup.test.ts +1 -0
- package/src/__tests__/task-runner.test.ts +3 -1
- package/src/__tests__/task-scheduler.test.ts +3 -15
- package/src/__tests__/tcc-sandbox-deny.test.ts +198 -0
- package/src/__tests__/terminal-tools.test.ts +8 -0
- package/src/__tests__/test-preload.ts +11 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +2 -52
- package/src/__tests__/thread-backfill.test.ts +941 -0
- package/src/__tests__/title-generate-pipeline.test.ts +224 -0
- package/src/__tests__/token-estimate-pipeline.test.ts +431 -0
- package/src/__tests__/tool-error-pipeline.test.ts +244 -0
- package/src/__tests__/tool-execute-pipeline.test.ts +431 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -8
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
- package/src/__tests__/tool-executor-shell-integration.test.ts +7 -10
- package/src/__tests__/tool-executor.test.ts +201 -94
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +356 -0
- package/src/__tests__/tool-result-truncation.test.ts +0 -110
- package/src/__tests__/trust-store.test.ts +442 -109
- package/src/__tests__/update-bulletin-job.test.ts +389 -0
- package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -1
- package/src/__tests__/user-plugin-loader.test.ts +191 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -22
- package/src/__tests__/voice-session-bridge.test.ts +39 -0
- package/src/__tests__/volume-security-guard.test.ts +3 -2
- package/src/__tests__/web-search-history.test.ts +337 -0
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +343 -0
- package/src/__tests__/workspace-migration-043-release-notes-latex-rendering.test.ts +202 -0
- package/src/__tests__/workspace-migration-045-release-notes-meet-avatar.test.ts +210 -0
- package/src/__tests__/workspace-migration-046-seed-conversation-starters-callsite.test.ts +185 -0
- package/src/__tests__/workspace-migration-049-release-notes-default-sonnet.test.ts +100 -0
- package/src/__tests__/workspace-migration-050-seed-main-agent-opus-callsite.test.ts +171 -0
- package/src/__tests__/workspace-migration-051-seed-conversation-summarization-callsite.test.ts +252 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +11 -11
- package/src/__tests__/workspace-migration-remove-hooks.test.ts +99 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +841 -0
- package/src/__tests__/workspace-policy.test.ts +22 -16
- package/src/acp/client-handler.ts +1 -2
- package/src/agent/loop.ts +545 -115
- package/src/approvals/__tests__/guardian-feed-event.test.ts +304 -0
- package/src/approvals/guardian-request-resolvers.ts +80 -0
- package/src/avatar/resvg-lazy.test.ts +136 -0
- package/src/avatar/resvg-lazy.ts +82 -9
- package/src/avatar/traits-png-sync.ts +21 -1
- package/src/backup/__tests__/backup-worker.test.ts +2 -13
- package/src/backup/backup-worker.ts +3 -15
- package/src/browser/__tests__/operations.test.ts +163 -0
- package/src/browser/identifiers.ts +51 -0
- package/src/browser/operations.ts +660 -0
- package/src/browser/types.ts +81 -0
- package/src/bundler/app-compiler.ts +84 -1
- package/src/calls/call-state.ts +2 -2
- package/src/calls/guardian-question-copy.ts +2 -2
- package/src/calls/telephony-stt-routing.ts +1 -1
- package/src/calls/voice-session-bridge.ts +1 -0
- package/src/channels/__tests__/types.test.ts +3 -3
- package/src/channels/types.ts +6 -4
- package/src/cli/AGENTS.md +1 -1
- package/src/cli/__tests__/notifications.test.ts +87 -211
- package/src/cli/commands/__tests__/attachment.test.ts +438 -0
- package/src/cli/commands/__tests__/backup.test.ts +1 -1
- package/src/cli/commands/__tests__/browser.test.ts +554 -0
- package/src/cli/commands/__tests__/cache.test.ts +623 -0
- package/src/cli/commands/__tests__/email-list.test.ts +6 -0
- package/src/cli/commands/__tests__/email-send.test.ts +93 -1
- package/src/cli/commands/__tests__/image-generation.test.ts +886 -0
- package/src/cli/commands/__tests__/inference-send.test.ts +463 -0
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +454 -0
- package/src/cli/commands/__tests__/task.test.ts +913 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +606 -0
- package/src/cli/commands/__tests__/ui-confirm.test.ts +650 -0
- package/src/cli/commands/__tests__/ui.test.ts +1215 -0
- package/src/cli/commands/__tests__/watchers.test.ts +716 -0
- package/src/cli/commands/attachment.ts +182 -0
- package/src/cli/commands/backup.ts +2 -2
- package/src/cli/commands/browser.ts +350 -0
- package/src/cli/commands/cache.ts +341 -0
- package/src/cli/commands/clients.ts +138 -0
- package/src/cli/commands/completions.ts +2 -12
- package/src/cli/commands/config.ts +6 -6
- package/src/cli/commands/conversations-import.ts +347 -0
- package/src/cli/commands/conversations.ts +69 -8
- package/src/cli/commands/email.ts +234 -194
- package/src/cli/commands/image-generation.ts +299 -0
- package/src/cli/commands/inference.ts +200 -0
- package/src/cli/commands/memory.ts +127 -17
- package/src/cli/commands/notifications.ts +68 -103
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +1 -1
- package/src/cli/commands/oauth/connect.ts +2 -2
- package/src/cli/commands/oauth/providers.ts +176 -8
- package/src/cli/commands/oauth/status.ts +46 -36
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/connect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +0 -1
- package/src/cli/commands/skills.ts +3 -4
- package/src/cli/commands/stt.ts +339 -0
- package/src/cli/commands/task.ts +795 -0
- package/src/cli/commands/trust.ts +50 -19
- package/src/cli/commands/tts.ts +273 -0
- package/src/cli/commands/ui.ts +670 -0
- package/src/cli/commands/watchers.ts +509 -0
- package/src/cli/lib/daemon-credential-client.ts +0 -19
- package/src/cli/program.ts +39 -24
- package/src/cli.ts +0 -37
- package/src/config/__tests__/backup-schema.test.ts +7 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +2 -2
- package/src/config/bundled-skills/app-builder/references/WIDGETS.md +10 -10
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +66 -87
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +28 -51
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +22 -40
- package/src/config/bundled-skills/image-studio/SKILL.md +2 -1
- package/src/config/bundled-skills/image-studio/TOOLS.json +2 -1
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +23 -39
- package/src/config/bundled-skills/media-processing/services/reduce.ts +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +5 -5
- package/src/config/bundled-skills/messaging/TOOLS.json +4 -0
- package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +207 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +20 -1
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +15 -1
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +21 -1
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +69 -12
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +9 -8
- package/src/config/bundled-skills/schedule/SKILL.md +8 -3
- package/src/config/bundled-skills/schedule/TOOLS.json +15 -7
- package/src/config/bundled-skills/schedule/references/SCRIPT_MODE_PATTERNS.md +59 -0
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-tool-registry.ts +0 -190
- package/src/config/env.ts +7 -2
- package/src/config/feature-flag-registry.json +42 -10
- package/src/config/llm-resolver.ts +128 -0
- package/src/config/loader.ts +194 -10
- package/src/config/raw-config-utils.ts +30 -2
- package/src/config/sanitize-for-transfer.ts +35 -0
- package/src/config/schema.ts +49 -41
- package/src/config/schemas/analysis.ts +3 -22
- package/src/config/schemas/backup.ts +1 -1
- package/src/config/schemas/calls.ts +0 -4
- package/src/config/schemas/conversations.ts +16 -0
- package/src/config/schemas/filing.ts +2 -7
- package/src/config/schemas/heartbeat.ts +0 -5
- package/src/config/schemas/inference.ts +3 -23
- package/src/config/schemas/llm.ts +317 -0
- package/src/config/schemas/memory-processing.ts +1 -9
- package/src/config/schemas/notifications.ts +4 -11
- package/src/config/schemas/platform.ts +3 -9
- package/src/config/schemas/security.ts +33 -0
- package/src/config/schemas/services.ts +9 -4
- package/src/config/schemas/stt.ts +1 -0
- package/src/config/schemas/tts.ts +64 -0
- package/src/config/schemas/updates.ts +1 -1
- package/src/config/schemas/workspace-git.ts +3 -40
- package/src/config/skill-state.ts +6 -2
- package/src/config/skills.ts +96 -7
- package/src/context/__tests__/compact-prompt.test.ts +63 -0
- package/src/context/__tests__/microcompact.test.ts +805 -0
- package/src/context/estimator-calibration.ts +136 -0
- package/src/context/microcompact.ts +443 -0
- package/src/context/prompts/compact.md +26 -0
- package/src/context/token-estimator.ts +61 -3
- package/src/context/tool-result-truncation.ts +3 -63
- package/src/context/window-manager.ts +417 -39
- package/src/credential-execution/approval-bridge.ts +0 -1
- package/src/credential-execution/executable-discovery.ts +19 -8
- package/src/credential-execution/process-manager.test.ts +109 -0
- package/src/credential-execution/process-manager.ts +65 -2
- package/src/credential-health/credential-health-service.ts +19 -6
- package/src/daemon/__tests__/conversation-feed-event.test.ts +317 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +4 -12
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +14 -15
- package/src/daemon/approval-generators.ts +29 -4
- package/src/daemon/assistant-attachments.ts +24 -13
- package/src/daemon/classifier.ts +2 -2
- package/src/daemon/config-watcher.ts +0 -3
- package/src/daemon/context-overflow-policy.ts +4 -13
- package/src/daemon/context-overflow-reducer.ts +4 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +162 -34
- package/src/daemon/conversation-agent-loop.ts +1282 -599
- package/src/daemon/conversation-attachments.ts +2 -6
- package/src/daemon/conversation-error.ts +36 -1
- package/src/daemon/conversation-history.ts +10 -19
- package/src/daemon/conversation-lifecycle.ts +59 -17
- package/src/daemon/conversation-messaging.ts +73 -4
- package/src/daemon/conversation-notifiers.ts +2 -110
- package/src/daemon/conversation-process.ts +24 -11
- package/src/daemon/conversation-queue-manager.ts +3 -0
- package/src/daemon/conversation-runtime-assembly.ts +1063 -211
- package/src/daemon/conversation-slash.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +389 -1
- package/src/daemon/conversation-tool-setup.ts +51 -9
- package/src/daemon/conversation-usage.ts +1 -1
- package/src/daemon/conversation.ts +197 -64
- package/src/daemon/external-plugins-bootstrap.ts +478 -0
- package/src/daemon/external-skills-bootstrap.ts +41 -0
- package/src/daemon/first-greeting.ts +191 -14
- package/src/daemon/guardian-action-generators.ts +34 -14
- package/src/daemon/handlers/config-model.test.ts +86 -0
- package/src/daemon/handlers/config-model.ts +65 -12
- package/src/daemon/handlers/conversations.ts +9 -2
- package/src/daemon/handlers/shared.ts +39 -11
- package/src/daemon/handlers/skills.ts +7 -3
- package/src/daemon/handlers/slack-channel-oauth-install.ts +197 -0
- package/src/daemon/lifecycle.ts +109 -82
- package/src/daemon/message-types/computer-use.ts +2 -34
- package/src/daemon/message-types/conversations.ts +63 -0
- package/src/daemon/message-types/messages.ts +21 -1
- package/src/daemon/message-types/trust.ts +0 -2
- package/src/daemon/parse-actual-tokens-from-error.test.ts +57 -1
- package/src/daemon/parse-actual-tokens-from-error.ts +66 -0
- package/src/daemon/pkb-context-tracker.test.ts +169 -0
- package/src/daemon/pkb-context-tracker.ts +125 -0
- package/src/daemon/pkb-reminder-builder.test.ts +70 -0
- package/src/daemon/pkb-reminder-builder.ts +31 -0
- package/src/daemon/providers-setup.ts +6 -0
- package/src/daemon/server.ts +122 -12
- package/src/daemon/shutdown-handlers.ts +2 -12
- package/src/daemon/tool-side-effects.ts +14 -65
- package/src/daemon/web-search-history.ts +126 -0
- package/src/events/domain-events.ts +0 -1
- package/src/filing/filing-service.ts +9 -10
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +160 -0
- package/src/heartbeat/heartbeat-service.ts +99 -28
- package/src/home/__tests__/feed-population-integration.test.ts +312 -0
- package/src/home/__tests__/feed-scheduler.test.ts +39 -11
- package/src/home/__tests__/rollup-producer.test.ts +44 -0
- package/src/home/assistant-feed-authoring.ts +4 -0
- package/src/home/emit-feed-event.ts +11 -0
- package/src/home/feed-scheduler.ts +20 -4
- package/src/home/feed-types.ts +97 -4
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/home/rewrite-command-preview.ts +66 -0
- package/src/home/rollup-producer.ts +34 -5
- package/src/home/suggested-prompts.ts +101 -0
- package/src/ipc/__tests__/attachment-ipc.test.ts +213 -0
- package/src/ipc/__tests__/browser-ipc.test.ts +339 -0
- package/src/ipc/__tests__/cache-ipc.test.ts +266 -0
- package/src/ipc/__tests__/socket-path.test.ts +34 -0
- package/src/ipc/__tests__/task-ipc.test.ts +577 -0
- package/src/ipc/__tests__/ui-request-route.test.ts +495 -0
- package/src/ipc/__tests__/watcher-ipc.test.ts +295 -0
- package/src/ipc/cli-client.ts +2 -1
- package/src/ipc/cli-server.ts +26 -8
- package/src/ipc/gateway-client.ts +6 -3
- package/src/ipc/routes/attachment.ts +114 -0
- package/src/ipc/routes/browser-context.ts +63 -0
- package/src/ipc/routes/browser.ts +97 -0
- package/src/ipc/routes/cache.ts +96 -0
- package/src/ipc/routes/get-contact.ts +16 -0
- package/src/ipc/routes/index.ts +31 -1
- package/src/ipc/routes/list-clients.ts +31 -0
- package/src/ipc/routes/merge-contacts.ts +17 -0
- package/src/ipc/routes/notification.ts +133 -0
- package/src/ipc/routes/rename-conversation.ts +59 -0
- package/src/ipc/routes/search-contacts.ts +19 -0
- package/src/ipc/routes/task-queue.ts +226 -0
- package/src/ipc/routes/task.ts +173 -0
- package/src/ipc/routes/ui-request.ts +50 -0
- package/src/ipc/routes/upsert-contact.ts +25 -0
- package/src/ipc/routes/watcher.ts +203 -0
- package/src/ipc/socket-path.ts +76 -0
- package/src/media/app-icon-generator.ts +23 -46
- package/src/media/avatar-router.ts +26 -41
- package/src/media/gemini-image-service.ts +8 -41
- package/src/media/image-credentials.ts +73 -0
- package/src/media/image-service.ts +85 -0
- package/src/media/openai-image-service.ts +131 -0
- package/src/media/types.ts +46 -0
- package/src/memory/__tests__/conversation-analyze-job.test.ts +9 -8
- package/src/memory/__tests__/conversation-group-migration.test.ts +99 -0
- package/src/memory/admin.ts +18 -0
- package/src/memory/conversation-analyze-job.ts +14 -13
- package/src/memory/conversation-attention-store.ts +13 -6
- package/src/memory/conversation-crud.ts +133 -3
- package/src/memory/conversation-group-migration.ts +38 -6
- package/src/memory/conversation-queries.ts +57 -4
- package/src/memory/conversation-title-service.ts +32 -4
- package/src/memory/db-init.ts +10 -0
- package/src/memory/embedding-backend.ts +1 -1
- package/src/memory/embedding-gemini.test.ts +41 -2
- package/src/memory/embedding-gemini.ts +6 -1
- package/src/memory/graph/bootstrap.test.ts +282 -0
- package/src/memory/graph/bootstrap.ts +8 -5
- package/src/memory/graph/compaction.ts +299 -0
- package/src/memory/graph/consolidation.ts +4 -4
- package/src/memory/graph/conversation-graph-memory.ts +89 -29
- package/src/memory/graph/extraction.test.ts +272 -2
- package/src/memory/graph/extraction.ts +183 -53
- package/src/memory/graph/graph-search.test.ts +93 -0
- package/src/memory/graph/graph-search.ts +4 -1
- package/src/memory/graph/inspect.ts +2 -2
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.test.ts +459 -0
- package/src/memory/graph/retriever.ts +237 -48
- package/src/memory/graph/store.ts +41 -0
- package/src/memory/graph/tool-handlers.ts +27 -0
- package/src/memory/graph/tools.ts +6 -1
- package/src/memory/indexer.ts +5 -5
- package/src/memory/job-handlers/conversation-starters.ts +23 -20
- package/src/memory/job-handlers/summarization.ts +2 -2
- package/src/memory/job-utils.ts +7 -1
- package/src/memory/jobs/embed-pkb-file.test.ts +168 -0
- package/src/memory/jobs/embed-pkb-file.ts +54 -0
- package/src/memory/jobs-store.ts +44 -3
- package/src/memory/jobs-worker.ts +4 -0
- package/src/memory/migrations/041-approval-prompt-ts-tracker.ts +26 -0
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +1 -1
- package/src/memory/migrations/149-oauth-tables.ts +1 -0
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +2 -2
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +82 -0
- package/src/memory/migrations/223-schedule-script-column.ts +11 -0
- package/src/memory/migrations/224-oauth-providers-managed-service-is-paid.ts +24 -0
- package/src/memory/migrations/225-oauth-providers-available-scopes.ts +13 -0
- package/src/memory/migrations/index.ts +5 -0
- package/src/memory/pkb/pkb-index.test.ts +369 -0
- package/src/memory/pkb/pkb-index.ts +255 -0
- package/src/memory/pkb/pkb-reconcile.test.ts +252 -0
- package/src/memory/pkb/pkb-reconcile.ts +148 -0
- package/src/memory/pkb/pkb-search.test.ts +499 -0
- package/src/memory/pkb/pkb-search.ts +159 -0
- package/src/memory/pkb/types.ts +53 -0
- package/src/memory/qdrant-client.test.ts +60 -0
- package/src/memory/qdrant-client.ts +147 -1
- package/src/memory/schema/infrastructure.ts +1 -0
- package/src/memory/schema/oauth.ts +4 -1
- package/src/memory/slack-thread-store.ts +37 -0
- package/src/messaging/providers/gmail/adapter.ts +6 -16
- package/src/messaging/providers/gmail/client.ts +22 -0
- package/src/messaging/providers/gmail/types.ts +7 -0
- package/src/messaging/providers/slack/adapter.ts +14 -2
- package/src/messaging/providers/slack/backfill.test.ts +257 -0
- package/src/messaging/providers/slack/backfill.ts +101 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +316 -0
- package/src/messaging/providers/slack/message-metadata.ts +123 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1421 -0
- package/src/messaging/providers/slack/render-transcript.ts +501 -0
- package/src/messaging/style-analyzer.ts +5 -2
- package/src/notifications/README.md +9 -5
- package/src/notifications/conversation-pairing.ts +78 -19
- package/src/notifications/copy-composer.ts +0 -5
- package/src/notifications/decision-engine.ts +3 -9
- package/src/notifications/emit-signal.ts +1 -1
- package/src/notifications/preference-extractor.ts +2 -6
- package/src/notifications/signal.ts +1 -2
- package/src/oauth/AGENTS.md +1 -1
- package/src/oauth/__tests__/identity-verifier.test.ts +2 -1
- package/src/oauth/connect-orchestrator.ts +8 -34
- package/src/oauth/connect-types.ts +6 -10
- package/src/oauth/manual-token-connection.ts +23 -0
- package/src/oauth/oauth-store.ts +31 -14
- package/src/oauth/platform-connection.test.ts +47 -0
- package/src/oauth/platform-connection.ts +15 -5
- package/src/oauth/provider-serializer.ts +6 -1
- package/src/oauth/seed-providers.ts +56 -106
- package/src/outbound-proxy/http-forwarder.ts +9 -0
- package/src/permissions/approval-policy.test.ts +1223 -0
- package/src/permissions/approval-policy.ts +309 -0
- package/src/permissions/arg-parser.test.ts +161 -0
- package/src/permissions/arg-parser.ts +141 -0
- package/src/permissions/bash-risk-classifier.test.ts +1620 -0
- package/src/permissions/bash-risk-classifier.ts +950 -0
- package/src/permissions/checker.ts +348 -711
- package/src/permissions/command-registry.test.ts +774 -0
- package/src/permissions/command-registry.ts +1005 -0
- package/src/permissions/defaults.ts +28 -79
- package/src/permissions/file-risk-classifier.test.ts +535 -0
- package/src/permissions/file-risk-classifier.ts +274 -0
- package/src/permissions/gateway-threshold-reader.ts +196 -0
- package/src/permissions/prompter.ts +4 -0
- package/src/permissions/risk-types.ts +262 -0
- package/src/permissions/schedule-risk-classifier.test.ts +129 -0
- package/src/permissions/schedule-risk-classifier.ts +85 -0
- package/src/permissions/secret-prompter.ts +53 -2
- package/src/permissions/shell-identity.ts +2 -42
- package/src/permissions/skill-risk-classifier.test.ts +311 -0
- package/src/permissions/skill-risk-classifier.ts +214 -0
- package/src/permissions/trust-client.ts +52 -25
- package/src/permissions/trust-store-interface.ts +1 -6
- package/src/permissions/trust-store.ts +161 -62
- package/src/permissions/types.ts +25 -14
- package/src/permissions/web-risk-classifier.test.ts +170 -0
- package/src/permissions/web-risk-classifier.ts +89 -0
- package/src/permissions/workspace-policy.ts +9 -19
- package/src/platform/client.ts +19 -1
- package/src/plugins/defaults/circuit-breaker.ts +146 -0
- package/src/plugins/defaults/compaction.ts +145 -0
- package/src/plugins/defaults/empty-response.ts +126 -0
- package/src/plugins/defaults/history-repair.ts +85 -0
- package/src/plugins/defaults/index.ts +116 -0
- package/src/plugins/defaults/injectors.ts +491 -0
- package/src/plugins/defaults/llm-call.ts +82 -0
- package/src/plugins/defaults/memory-retrieval.ts +226 -0
- package/src/plugins/defaults/overflow-reduce.ts +181 -0
- package/src/plugins/defaults/persistence.ts +129 -0
- package/src/plugins/defaults/title-generate.ts +95 -0
- package/src/plugins/defaults/token-estimate.ts +104 -0
- package/src/plugins/defaults/tool-error.ts +126 -0
- package/src/plugins/defaults/tool-execute.ts +89 -0
- package/src/plugins/defaults/tool-result-truncate.ts +88 -0
- package/src/plugins/pipeline.ts +316 -0
- package/src/plugins/plugin-skill-contributions.ts +292 -0
- package/src/plugins/registry.ts +241 -0
- package/src/plugins/types.ts +1134 -0
- package/src/plugins/user-loader.ts +177 -0
- package/src/prompts/persona-resolver.ts +3 -3
- package/src/prompts/system-prompt.ts +19 -20
- package/src/prompts/templates/BOOTSTRAP.md +27 -77
- package/src/prompts/templates/SOUL.md +2 -2
- package/src/prompts/update-bulletin-job.ts +190 -0
- package/src/providers/__tests__/context-overflow-error.test.ts +328 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +102 -0
- package/src/providers/__tests__/retry-callsite.test.ts +424 -0
- package/src/providers/anthropic/client.ts +183 -14
- package/src/providers/call-site-routing.ts +71 -0
- package/src/providers/gemini/client.ts +65 -2
- package/src/providers/managed-proxy/constants.ts +2 -1
- package/src/providers/model-catalog.ts +524 -33
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/openai/chat-completions-provider.ts +57 -1
- package/src/providers/openai/responses-provider.ts +86 -9
- package/src/providers/openrouter/client.ts +80 -9
- package/src/providers/provider-env-vars.ts +56 -0
- package/src/providers/provider-send-message.ts +22 -5
- package/src/providers/ratelimit.ts +4 -0
- package/src/providers/registry.ts +19 -8
- package/src/providers/retry.ts +174 -39
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +55 -0
- package/src/providers/speech-to-text/deepgram-realtime.test.ts +61 -0
- package/src/providers/speech-to-text/deepgram-realtime.ts +57 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.ts +4 -4
- package/src/providers/speech-to-text/provider-catalog.ts +17 -0
- package/src/providers/speech-to-text/resolve.ts +7 -0
- package/src/providers/speech-to-text/xai-realtime.test.ts +646 -0
- package/src/providers/speech-to-text/xai-realtime.ts +821 -0
- package/src/providers/speech-to-text/xai.test.ts +155 -0
- package/src/providers/speech-to-text/xai.ts +97 -0
- package/src/providers/types.ts +93 -3
- package/src/runtime/AGENTS.md +27 -18
- package/src/runtime/__tests__/agent-wake.test.ts +43 -2
- package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +3 -3
- package/src/runtime/__tests__/client-registry.test.ts +293 -0
- package/src/runtime/__tests__/interactive-ui.test.ts +673 -0
- package/src/runtime/agent-wake.ts +63 -22
- package/src/runtime/auth/route-policy.ts +4 -0
- package/src/runtime/btw-sidechain.ts +13 -3
- package/src/runtime/channel-reply-delivery.ts +106 -2
- package/src/runtime/client-registry.ts +261 -0
- package/src/runtime/decision-token.ts +116 -0
- package/src/runtime/gateway-client.ts +2 -2
- package/src/runtime/http-router.ts +32 -0
- package/src/runtime/http-server.ts +129 -9
- package/src/runtime/http-types.ts +23 -3
- package/src/runtime/interactive-ui.ts +362 -0
- package/src/runtime/invite-instruction-generator.ts +2 -2
- package/src/runtime/migrations/__tests__/gcs-signed-url.test.ts +176 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +390 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge.test.ts +221 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +1540 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +453 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +222 -0
- package/src/runtime/migrations/gcs-signed-url.ts +162 -0
- package/src/runtime/migrations/vbundle-builder.ts +1 -22
- package/src/runtime/migrations/vbundle-importer.ts +154 -9
- package/src/runtime/migrations/vbundle-metadata-merge.ts +124 -0
- package/src/runtime/migrations/vbundle-streaming-importer.ts +2522 -0
- package/src/runtime/migrations/vbundle-streaming-validator.ts +244 -0
- package/src/runtime/migrations/vbundle-tar-stream.ts +217 -0
- package/src/runtime/migrations/vbundle-validator.ts +15 -6
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +111 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +114 -75
- package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +246 -0
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +78 -0
- package/src/runtime/routes/approval-routes.ts +29 -17
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +9 -0
- package/src/runtime/routes/avatar-routes.ts +20 -4
- package/src/runtime/routes/browser-extension-pair-routes.ts +27 -8
- package/src/runtime/routes/btw-routes.ts +1 -4
- package/src/runtime/routes/conversation-management-routes.ts +20 -2
- package/src/runtime/routes/conversation-routes.ts +351 -138
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/diagnostics-routes.ts +6 -4
- package/src/runtime/routes/events-routes.ts +16 -0
- package/src/runtime/routes/guardian-approval-interception.ts +33 -3
- package/src/runtime/routes/guardian-approval-prompt.ts +13 -3
- package/src/runtime/routes/home-feed-routes.ts +120 -2
- package/src/runtime/routes/inbound-message-handler.ts +987 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +113 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +61 -3
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +129 -6
- package/src/runtime/routes/integrations/slack/channel.ts +25 -3
- package/src/runtime/routes/llm-context-normalization.ts +23 -1
- package/src/runtime/routes/memory-item-routes.test.ts +1 -0
- package/src/runtime/routes/migration-routes.ts +720 -127
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +284 -0
- package/src/runtime/routes/playground/__tests__/guard.test.ts +80 -0
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +294 -0
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +271 -0
- package/src/runtime/routes/playground/__tests__/seed-conversation.test.ts +202 -0
- package/src/runtime/routes/playground/__tests__/seeded-conversations.test.ts +309 -0
- package/src/runtime/routes/playground/__tests__/state.test.ts +224 -0
- package/src/runtime/routes/playground/conversation-not-found.ts +29 -0
- package/src/runtime/routes/playground/deps.ts +56 -0
- package/src/runtime/routes/playground/force-compact.ts +73 -0
- package/src/runtime/routes/playground/guard.ts +37 -0
- package/src/runtime/routes/playground/index.ts +28 -0
- package/src/runtime/routes/playground/inject-failures.ts +159 -0
- package/src/runtime/routes/playground/reset-circuit.ts +115 -0
- package/src/runtime/routes/playground/seed-conversation.ts +139 -0
- package/src/runtime/routes/playground/seeded-conversations.ts +78 -0
- package/src/runtime/routes/playground/state.ts +78 -0
- package/src/runtime/routes/schedule-routes.ts +89 -8
- package/src/runtime/routes/settings-routes.ts +4 -2
- package/src/runtime/routes/trust-rules-routes.ts +30 -14
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/routes/work-items-routes.ts +3 -2
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +25 -43
- package/src/runtime/services/analyze-conversation.ts +12 -16
- package/src/runtime/skill-route-registry.ts +97 -15
- package/src/schedule/run-script.ts +68 -0
- package/src/schedule/schedule-store.ts +7 -1
- package/src/schedule/scheduler.ts +56 -8
- package/src/security/__tests__/provider-key-env-fallback.test.ts +119 -0
- package/src/security/__tests__/untrusted-content.test.ts +109 -0
- package/src/security/oauth2.ts +98 -35
- package/src/security/secure-keys.ts +7 -8
- package/src/security/token-manager.ts +27 -13
- package/src/security/untrusted-content.ts +102 -0
- package/src/skills/catalog-cache.ts +35 -9
- package/src/skills/catalog-install.ts +31 -3
- package/src/skills/skill-cache-store.ts +97 -0
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +76 -0
- package/src/stt/daemon-batch-transcriber.ts +33 -0
- package/src/stt/stt-stream-session.ts +8 -1
- package/src/stt/types.ts +5 -1
- package/src/subagent/manager.ts +41 -13
- package/src/tasks/ephemeral-permissions.ts +9 -4
- package/src/telemetry/usage-telemetry-reporter.ts +27 -5
- package/src/tools/browser/__tests__/browser-status.test.ts +234 -2
- package/src/tools/browser/browser-execution.ts +150 -54
- package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +230 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +146 -3
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +22 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +54 -3
- package/src/tools/browser/cdp-client/factory.ts +15 -4
- package/src/tools/credentials/tool-policy.ts +39 -5
- package/src/tools/credentials/vault.ts +9 -4
- package/src/tools/executor.ts +129 -73
- package/src/tools/filesystem/write.ts +52 -0
- package/src/tools/host-terminal/host-shell.ts +45 -5
- package/src/tools/memory/register.test.ts +185 -0
- package/src/tools/memory/register.ts +3 -1
- package/src/tools/network/script-proxy/session-manager.ts +37 -1
- package/src/tools/network/web-fetch.ts +20 -10
- package/src/tools/network/web-search.ts +19 -4
- package/src/tools/permission-checker.ts +116 -46
- package/src/tools/policy-context.ts +29 -8
- package/src/tools/registry.ts +195 -6
- package/src/tools/schedule/create.ts +23 -8
- package/src/tools/schedule/update.ts +3 -1
- package/src/tools/secret-detection-handler.ts +0 -51
- package/src/tools/side-effects.ts +0 -11
- package/src/tools/skills/execute.ts +2 -2
- package/src/tools/skills/sandbox-runner.ts +5 -2
- package/src/tools/system/avatar-generator.ts +6 -2
- package/src/tools/terminal/backends/native.ts +51 -2
- package/src/tools/terminal/safe-env.ts +3 -2
- package/src/tools/terminal/shell.ts +1 -0
- package/src/tools/tool-manifest.ts +6 -21
- package/src/tools/types.ts +40 -5
- package/src/tools/verification-control-plane-policy.ts +1 -1
- package/src/tts/__tests__/provider-adapters.test.ts +240 -13
- package/src/tts/provider-catalog.ts +18 -0
- package/src/tts/providers/index.ts +2 -0
- package/src/tts/providers/xai-provider.ts +224 -0
- package/src/tts/types.ts +46 -0
- package/src/types/tar-stream.d.ts +66 -0
- package/src/util/json.ts +17 -0
- package/src/util/platform.ts +9 -4
- package/src/util/pricing.ts +41 -8
- package/src/watcher/engine.ts +1 -1
- package/src/watcher/providers/google-calendar.ts +134 -8
- package/src/watcher/providers/outlook-calendar.ts +42 -2
- package/src/workspace/git-service.ts +23 -4
- package/src/workspace/migrations/006-services-config.ts +2 -4
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +2 -3
- package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +516 -0
- package/src/workspace/migrations/039-drop-legacy-llm-keys.ts +171 -0
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +154 -0
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +56 -0
- package/src/workspace/migrations/042-fix-backfill-google-gmail-settings-scope.ts +70 -0
- package/src/workspace/migrations/043-release-notes-latex-rendering.ts +75 -0
- package/src/workspace/migrations/044-bump-stale-provider-stream-timeout.ts +51 -0
- package/src/workspace/migrations/045-release-notes-meet-avatar.ts +130 -0
- package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +108 -0
- package/src/workspace/migrations/047-remove-watch-callsites.ts +54 -0
- package/src/workspace/migrations/048-remove-workspace-hooks.ts +81 -0
- package/src/workspace/migrations/049-release-notes-default-sonnet.ts +80 -0
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +86 -0
- package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +128 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/registry.ts +28 -0
- package/src/workspace/provider-commit-message-generator.ts +19 -38
- package/tsconfig.json +1 -1
- package/hook-templates/debug-prompt-logger/hook.json +0 -7
- package/hook-templates/debug-prompt-logger/run.sh +0 -66
- package/src/__tests__/context-overflow-approval.test.ts +0 -156
- package/src/__tests__/gmail-archive-fallback.test.ts +0 -193
- package/src/__tests__/gmail-archive-gate.test.ts +0 -246
- package/src/__tests__/gmail-preferences.test.ts +0 -117
- package/src/__tests__/hooks-blocking.test.ts +0 -178
- package/src/__tests__/hooks-cli.test.ts +0 -182
- package/src/__tests__/hooks-config.test.ts +0 -108
- package/src/__tests__/hooks-discovery.test.ts +0 -211
- package/src/__tests__/hooks-integration.test.ts +0 -196
- package/src/__tests__/hooks-manager.test.ts +0 -226
- package/src/__tests__/hooks-runner.test.ts +0 -175
- package/src/__tests__/hooks-settings.test.ts +0 -160
- package/src/__tests__/hooks-templates.test.ts +0 -169
- package/src/__tests__/hooks-ts-runner.test.ts +0 -170
- package/src/__tests__/hooks-watch.test.ts +0 -112
- package/src/__tests__/notification-schedule-dedup.test.ts +0 -213
- package/src/__tests__/oauth-scope-policy.test.ts +0 -180
- package/src/__tests__/outlook-attachments.test.ts +0 -301
- package/src/__tests__/outlook-automation-tools.test.ts +0 -425
- package/src/__tests__/outlook-categories.test.ts +0 -212
- package/src/__tests__/outlook-compose-tools.test.ts +0 -325
- package/src/__tests__/outlook-declutter-tools.test.ts +0 -585
- package/src/__tests__/outlook-follow-up.test.ts +0 -196
- package/src/__tests__/outlook-trash.test.ts +0 -77
- package/src/__tests__/outlook-unsubscribe.test.ts +0 -279
- package/src/__tests__/send-notification-tool.test.ts +0 -83
- package/src/__tests__/update-bulletin-format.test.ts +0 -181
- package/src/__tests__/update-bulletin-state.test.ts +0 -135
- package/src/__tests__/update-bulletin.test.ts +0 -478
- package/src/__tests__/update-template-contract.test.ts +0 -29
- package/src/cli/commands/doctor.ts +0 -341
- package/src/cli/commands/shotgun.ts +0 -266
- package/src/config/bundled-skills/browser/SKILL.md +0 -88
- package/src/config/bundled-skills/browser/TOOLS.json +0 -516
- package/src/config/bundled-skills/browser/tools/browser-attach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-click.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-close.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-detach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-hover.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-scroll.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-select-option.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-status.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-type.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +0 -49
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +0 -12
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +0 -27
- package/src/config/bundled-skills/chatgpt-import/TOOLS.json +0 -27
- package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +0 -378
- package/src/config/bundled-skills/conversations/SKILL.md +0 -20
- package/src/config/bundled-skills/conversations/TOOLS.json +0 -23
- package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +0 -66
- package/src/config/bundled-skills/gmail/SKILL.md +0 -221
- package/src/config/bundled-skills/gmail/TOOLS.json +0 -588
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +0 -256
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +0 -112
- package/src/config/bundled-skills/gmail/tools/gmail-draft.ts +0 -44
- package/src/config/bundled-skills/gmail/tools/gmail-filters.ts +0 -81
- package/src/config/bundled-skills/gmail/tools/gmail-follow-up.ts +0 -108
- package/src/config/bundled-skills/gmail/tools/gmail-forward.ts +0 -146
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +0 -53
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +0 -59
- package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +0 -82
- package/src/config/bundled-skills/gmail/tools/gmail-send-draft.ts +0 -26
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-trash.ts +0 -29
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +0 -122
- package/src/config/bundled-skills/gmail/tools/gmail-vacation.ts +0 -67
- package/src/config/bundled-skills/gmail/tools/scan-result-store.ts +0 -100
- package/src/config/bundled-skills/gmail/tools/shared.ts +0 -47
- package/src/config/bundled-skills/google-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/google-calendar/TOOLS.json +0 -226
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +0 -223
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +0 -27
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +0 -48
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +0 -19
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +0 -36
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +0 -58
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/google-calendar/types.ts +0 -97
- package/src/config/bundled-skills/heartbeat/SKILL.md +0 -43
- package/src/config/bundled-skills/notifications/SKILL.md +0 -40
- package/src/config/bundled-skills/notifications/TOOLS.json +0 -80
- package/src/config/bundled-skills/notifications/tools/send-notification.ts +0 -152
- package/src/config/bundled-skills/notifications/tools/shared.ts +0 -13
- package/src/config/bundled-skills/outlook/SKILL.md +0 -196
- package/src/config/bundled-skills/outlook/TOOLS.json +0 -530
- package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +0 -85
- package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +0 -77
- package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +0 -84
- package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +0 -94
- package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +0 -49
- package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +0 -237
- package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +0 -161
- package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +0 -32
- package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +0 -272
- package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +0 -29
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +0 -129
- package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +0 -87
- package/src/config/bundled-skills/outlook/tools/shared.ts +0 -20
- package/src/config/bundled-skills/outlook-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/outlook-calendar/TOOLS.json +0 -221
- package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +0 -252
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +0 -53
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +0 -74
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +0 -18
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +0 -46
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +0 -36
- package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/outlook-calendar/types.ts +0 -120
- package/src/config/bundled-skills/screen-watch/SKILL.md +0 -27
- package/src/config/bundled-skills/screen-watch/TOOLS.json +0 -35
- package/src/config/bundled-skills/screen-watch/tools/start-screen-watch.ts +0 -12
- package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -84
- package/src/config/bundled-skills/slack/SKILL.md +0 -108
- package/src/config/bundled-skills/tasks/SKILL.md +0 -37
- package/src/config/bundled-skills/tasks/TOOLS.json +0 -353
- package/src/config/bundled-skills/tasks/icon.svg +0 -34
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-save.ts +0 -12
- package/src/config/bundled-skills/watcher/SKILL.md +0 -31
- package/src/config/bundled-skills/watcher/TOOLS.json +0 -167
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +0 -12
- package/src/daemon/context-overflow-approval.ts +0 -52
- package/src/daemon/watch-handler.ts +0 -399
- package/src/hooks/cli.ts +0 -253
- package/src/hooks/config.ts +0 -100
- package/src/hooks/discovery.ts +0 -135
- package/src/hooks/manager.ts +0 -179
- package/src/hooks/runner.ts +0 -117
- package/src/hooks/templates.ts +0 -77
- package/src/hooks/types.ts +0 -75
- package/src/oauth/scope-policy.ts +0 -89
- package/src/prompts/templates/UPDATES.md +0 -50
- package/src/prompts/update-bulletin-format.ts +0 -85
- package/src/prompts/update-bulletin-state.ts +0 -58
- package/src/prompts/update-bulletin-template-path.ts +0 -13
- package/src/prompts/update-bulletin.ts +0 -139
- package/src/runtime/gateway-internal-client.ts +0 -94
- package/src/runtime/routes/watch-routes.ts +0 -156
- package/src/shared/provider-env-vars.ts +0 -19
- package/src/signals/shotgun.ts +0 -203
- package/src/tools/watch/screen-watch.ts +0 -144
- package/src/tools/watch/watch-state.ts +0 -142
- package/src/tools/watcher/create.ts +0 -86
- package/src/tools/watcher/delete.ts +0 -36
- package/src/tools/watcher/digest.ts +0 -54
- package/src/tools/watcher/list.ts +0 -83
- package/src/tools/watcher/update.ts +0 -71
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Bridges the jobs worker to the shared analyzeConversation() service. The
|
|
5
5
|
// deps bundle is stashed on a module singleton during daemon startup; if it
|
|
6
|
-
// isn't set yet
|
|
7
|
-
//
|
|
8
|
-
// once the daemon has fully started.
|
|
6
|
+
// isn't set yet the handler throws BackendUnavailableError so the worker
|
|
7
|
+
// defers with exponential backoff until deps become available.
|
|
9
8
|
//
|
|
10
9
|
// The service itself distinguishes manual vs. auto triggers: this handler
|
|
11
10
|
// always invokes with `trigger: "auto"`, so the rolling analysis conversation
|
|
@@ -15,6 +14,7 @@
|
|
|
15
14
|
import type { AssistantConfig } from "../config/types.js";
|
|
16
15
|
import { analyzeConversation } from "../runtime/services/analyze-conversation.js";
|
|
17
16
|
import { getAnalysisDeps } from "../runtime/services/analyze-deps-singleton.js";
|
|
17
|
+
import { BackendUnavailableError } from "../util/errors.js";
|
|
18
18
|
import { getLogger } from "../util/logger.js";
|
|
19
19
|
import { enqueueAutoAnalysisIfEnabled } from "./auto-analysis-enqueue.js";
|
|
20
20
|
import type { MemoryJob } from "./jobs-store.js";
|
|
@@ -33,19 +33,20 @@ export async function conversationAnalyzeJob(
|
|
|
33
33
|
|
|
34
34
|
const deps = getAnalysisDeps();
|
|
35
35
|
if (!deps) {
|
|
36
|
-
// Daemon hasn't finished startup.
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
// avoids retry storms during slow daemon startup.
|
|
36
|
+
// Daemon hasn't finished startup. Throw BackendUnavailableError so the
|
|
37
|
+
// worker defers the job with exponential backoff instead of completing
|
|
38
|
+
// it. Returning success here would permanently drop the job via
|
|
39
|
+
// completeMemoryJob — conversations with a pre-existing queued job
|
|
40
|
+
// during startup and no subsequent activity would never be analyzed.
|
|
41
|
+
// The deferral budget (50 × up to 5min backoff) is generous enough to
|
|
42
|
+
// outlast any realistic startup delay.
|
|
44
43
|
log.warn(
|
|
45
44
|
{ jobId: job.id, conversationId },
|
|
46
|
-
"
|
|
45
|
+
"Deferring job: analysis deps not yet initialized",
|
|
46
|
+
);
|
|
47
|
+
throw new BackendUnavailableError(
|
|
48
|
+
"Analysis deps not yet initialized during daemon startup",
|
|
47
49
|
);
|
|
48
|
-
return;
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
const result = await analyzeConversation(conversationId, deps, {
|
|
@@ -172,11 +172,8 @@ export function seedForkedConversationAttention(params: {
|
|
|
172
172
|
latestAssistantMessageId: string | null;
|
|
173
173
|
latestAssistantMessageAt: number | null;
|
|
174
174
|
}): void {
|
|
175
|
-
const {
|
|
176
|
-
|
|
177
|
-
latestAssistantMessageId,
|
|
178
|
-
latestAssistantMessageAt,
|
|
179
|
-
} = params;
|
|
175
|
+
const { conversationId, latestAssistantMessageId, latestAssistantMessageAt } =
|
|
176
|
+
params;
|
|
180
177
|
|
|
181
178
|
if (!latestAssistantMessageId || latestAssistantMessageAt == null) {
|
|
182
179
|
return;
|
|
@@ -458,9 +455,15 @@ function resolveAssistantCursor(params: {
|
|
|
458
455
|
* This uses the existing attention projection instead of adding a separate
|
|
459
456
|
* manual-unread state machine.
|
|
460
457
|
*/
|
|
461
|
-
|
|
458
|
+
/**
|
|
459
|
+
* Returns `true` when the seen cursor was actually rewound (state changed),
|
|
460
|
+
* `false` when the conversation was already unread (no-op).
|
|
461
|
+
* Throws `UserError` when there is no assistant message to mark unread.
|
|
462
|
+
*/
|
|
463
|
+
export function markConversationUnread(conversationId: string): boolean {
|
|
462
464
|
const db = getDb();
|
|
463
465
|
const now = Date.now();
|
|
466
|
+
let changed = false;
|
|
464
467
|
|
|
465
468
|
db.transaction((tx) => {
|
|
466
469
|
const state = tx
|
|
@@ -511,6 +514,7 @@ export function markConversationUnread(conversationId: string): void {
|
|
|
511
514
|
updatedAt: now,
|
|
512
515
|
})
|
|
513
516
|
.run();
|
|
517
|
+
changed = true;
|
|
514
518
|
return;
|
|
515
519
|
}
|
|
516
520
|
|
|
@@ -524,7 +528,10 @@ export function markConversationUnread(conversationId: string): void {
|
|
|
524
528
|
eq(conversationAssistantAttentionState.conversationId, conversationId),
|
|
525
529
|
)
|
|
526
530
|
.run();
|
|
531
|
+
changed = true;
|
|
527
532
|
});
|
|
533
|
+
|
|
534
|
+
return changed;
|
|
528
535
|
}
|
|
529
536
|
|
|
530
537
|
// ── getAttentionStateByConversationIds ───────────────────────────────
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
gte,
|
|
11
11
|
inArray,
|
|
12
12
|
isNull,
|
|
13
|
+
like,
|
|
13
14
|
lt,
|
|
14
15
|
lte,
|
|
15
16
|
sql,
|
|
@@ -23,6 +24,7 @@ import { CHANNEL_IDS, INTERFACE_IDS, isChannelId } from "../channels/types.js";
|
|
|
23
24
|
import { getConfig } from "../config/loader.js";
|
|
24
25
|
import type { TrustContext } from "../daemon/conversation-runtime-assembly.js";
|
|
25
26
|
import { UserError } from "../util/errors.js";
|
|
27
|
+
import { safeParseRecord } from "../util/json.js";
|
|
26
28
|
import { getLogger } from "../util/logger.js";
|
|
27
29
|
import { getConversationsDir } from "../util/platform.js";
|
|
28
30
|
import { createRowMapper } from "../util/row-mapper.js";
|
|
@@ -102,6 +104,12 @@ export const messageMetadataSchema = z
|
|
|
102
104
|
forkSourceMessageId: z.string().optional(),
|
|
103
105
|
/** Image source paths from desktop attachments, keyed by filename. */
|
|
104
106
|
imageSourcePaths: z.record(z.string(), z.string()).optional(),
|
|
107
|
+
memoryInjectedBlock: z.string().optional(),
|
|
108
|
+
turnContextBlock: z.string().optional(),
|
|
109
|
+
pkbSystemReminderBlock: z.string().optional(),
|
|
110
|
+
workspaceBlock: z.string().optional(),
|
|
111
|
+
nowScratchpadBlock: z.string().optional(),
|
|
112
|
+
pkbContextBlock: z.string().optional(),
|
|
105
113
|
})
|
|
106
114
|
.passthrough();
|
|
107
115
|
|
|
@@ -420,9 +428,7 @@ export function findAnalysisConversationFor(
|
|
|
420
428
|
* not found. Tiny convenience used by the recursion guard in the
|
|
421
429
|
* auto-analyze loop.
|
|
422
430
|
*/
|
|
423
|
-
export function getConversationSource(
|
|
424
|
-
conversationId: string,
|
|
425
|
-
): string | null {
|
|
431
|
+
export function getConversationSource(conversationId: string): string | null {
|
|
426
432
|
const db = getDb();
|
|
427
433
|
const row = db
|
|
428
434
|
.select({ source: conversations.source })
|
|
@@ -1044,6 +1050,63 @@ export function getMessages(conversationId: string): MessageRow[] {
|
|
|
1044
1050
|
.map(parseMessage);
|
|
1045
1051
|
}
|
|
1046
1052
|
|
|
1053
|
+
/**
|
|
1054
|
+
* Return raw `metadata` strings for messages whose metadata contains the
|
|
1055
|
+
* literal substring `"slackMeta"`, capped at `limit` and skipping the first
|
|
1056
|
+
* `offset` matches. Pushes `LIKE` + `LIMIT`/`OFFSET` into SQL so warm Slack
|
|
1057
|
+
* DM conversations don't require a full-table scan on the webhook critical
|
|
1058
|
+
* path. The substring match is an indexable prefilter only — callers must
|
|
1059
|
+
* parse and validate each returned string against the Slack metadata schema,
|
|
1060
|
+
* because a malformed row (partial write, legacy format, unrelated key
|
|
1061
|
+
* accidentally containing the literal) can still slip through the substring
|
|
1062
|
+
* match. Callers that need a fixed number of *valid* rows should iterate
|
|
1063
|
+
* with increasing offsets until the target is reached (capped at a
|
|
1064
|
+
* reasonable maximum to bound scan cost).
|
|
1065
|
+
*/
|
|
1066
|
+
export function selectSlackMetaCandidateMetadata(
|
|
1067
|
+
conversationId: string,
|
|
1068
|
+
limit: number,
|
|
1069
|
+
offset = 0,
|
|
1070
|
+
): string[] {
|
|
1071
|
+
const db = getDb();
|
|
1072
|
+
const rows = db
|
|
1073
|
+
.select({ metadata: messages.metadata })
|
|
1074
|
+
.from(messages)
|
|
1075
|
+
.where(
|
|
1076
|
+
and(
|
|
1077
|
+
eq(messages.conversationId, conversationId),
|
|
1078
|
+
like(messages.metadata, '%"slackMeta"%'),
|
|
1079
|
+
),
|
|
1080
|
+
)
|
|
1081
|
+
.orderBy(asc(messages.createdAt))
|
|
1082
|
+
.limit(limit)
|
|
1083
|
+
.offset(offset)
|
|
1084
|
+
.all();
|
|
1085
|
+
const out: string[] = [];
|
|
1086
|
+
for (const r of rows) {
|
|
1087
|
+
if (typeof r.metadata === "string" && r.metadata.length > 0) {
|
|
1088
|
+
out.push(r.metadata);
|
|
1089
|
+
}
|
|
1090
|
+
}
|
|
1091
|
+
return out;
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
/**
|
|
1095
|
+
* Efficient existence check — returns true if the conversation has at least
|
|
1096
|
+
* one message row. Uses `LIMIT 1` + `select({ 1 })` to avoid loading and
|
|
1097
|
+
* parsing any message content.
|
|
1098
|
+
*/
|
|
1099
|
+
export function hasMessages(conversationId: string): boolean {
|
|
1100
|
+
const db = getDb();
|
|
1101
|
+
const row = db
|
|
1102
|
+
.select({ one: sql`1` })
|
|
1103
|
+
.from(messages)
|
|
1104
|
+
.where(eq(messages.conversationId, conversationId))
|
|
1105
|
+
.limit(1)
|
|
1106
|
+
.get();
|
|
1107
|
+
return row !== undefined;
|
|
1108
|
+
}
|
|
1109
|
+
|
|
1047
1110
|
export interface PaginatedMessagesResult {
|
|
1048
1111
|
messages: MessageRow[];
|
|
1049
1112
|
hasMore: boolean;
|
|
@@ -1456,6 +1519,73 @@ export function updateMessageMetadata(
|
|
|
1456
1519
|
.run();
|
|
1457
1520
|
}
|
|
1458
1521
|
|
|
1522
|
+
/**
|
|
1523
|
+
* Bulk-remove the metadata fields that back the blocks stripped by
|
|
1524
|
+
* `stripInjectionsForCompaction` — currently `pkbSystemReminderBlock`
|
|
1525
|
+
* (`<system_reminder>`), `nowScratchpadBlock` (`<NOW.md …>`), and
|
|
1526
|
+
* `pkbContextBlock` (`<knowledge_base>`). Called from compaction-strip
|
|
1527
|
+
* sites so post-restart rehydration stays consistent with the in-memory
|
|
1528
|
+
* state produced by `stripInjectionsForCompaction` (which removes those
|
|
1529
|
+
* tags from live messages but cannot touch the DB). Fields backing
|
|
1530
|
+
* blocks that are intentionally NOT stripped (`turnContextBlock`,
|
|
1531
|
+
* `workspaceBlock`, `memoryInjectedBlock`) are preserved.
|
|
1532
|
+
*/
|
|
1533
|
+
export function clearStrippedInjectionMetadataForConversation(
|
|
1534
|
+
conversationId: string,
|
|
1535
|
+
): void {
|
|
1536
|
+
rawRun(
|
|
1537
|
+
`UPDATE messages
|
|
1538
|
+
SET metadata = json_remove(
|
|
1539
|
+
metadata,
|
|
1540
|
+
'$.pkbSystemReminderBlock',
|
|
1541
|
+
'$.nowScratchpadBlock',
|
|
1542
|
+
'$.pkbContextBlock'
|
|
1543
|
+
)
|
|
1544
|
+
WHERE conversation_id = ?
|
|
1545
|
+
AND role = 'user'
|
|
1546
|
+
AND metadata IS NOT NULL
|
|
1547
|
+
AND (
|
|
1548
|
+
json_extract(metadata, '$.pkbSystemReminderBlock') IS NOT NULL
|
|
1549
|
+
OR json_extract(metadata, '$.nowScratchpadBlock') IS NOT NULL
|
|
1550
|
+
OR json_extract(metadata, '$.pkbContextBlock') IS NOT NULL
|
|
1551
|
+
)`,
|
|
1552
|
+
conversationId,
|
|
1553
|
+
);
|
|
1554
|
+
}
|
|
1555
|
+
|
|
1556
|
+
/**
|
|
1557
|
+
* Atomically update both `content` and (shallow-merged) `metadata` for a
|
|
1558
|
+
* message. Used by edit-propagation paths that need to update the message
|
|
1559
|
+
* body and stamp metadata (e.g. `slackMeta.editedAt`) in a single
|
|
1560
|
+
* transaction so a partial write cannot leak.
|
|
1561
|
+
*
|
|
1562
|
+
* `metadataUpdates` is shallow-merged into the existing top-level metadata
|
|
1563
|
+
* object. To merge into a nested sub-key (e.g. `slackMeta`), the caller
|
|
1564
|
+
* must compute the merged sub-value first and pass `{ slackMeta: merged }`.
|
|
1565
|
+
*/
|
|
1566
|
+
export function updateMessageContentAndMetadata(
|
|
1567
|
+
messageId: string,
|
|
1568
|
+
newContent: string,
|
|
1569
|
+
metadataUpdates: Record<string, unknown>,
|
|
1570
|
+
): void {
|
|
1571
|
+
const db = getDb();
|
|
1572
|
+
db.transaction((tx) => {
|
|
1573
|
+
const row = tx
|
|
1574
|
+
.select({ metadata: messages.metadata })
|
|
1575
|
+
.from(messages)
|
|
1576
|
+
.where(eq(messages.id, messageId))
|
|
1577
|
+
.get();
|
|
1578
|
+
const existing = row?.metadata ? safeParseRecord(row.metadata) : {};
|
|
1579
|
+
tx.update(messages)
|
|
1580
|
+
.set({
|
|
1581
|
+
content: newContent,
|
|
1582
|
+
metadata: JSON.stringify({ ...existing, ...metadataUpdates }),
|
|
1583
|
+
})
|
|
1584
|
+
.where(eq(messages.id, messageId))
|
|
1585
|
+
.run();
|
|
1586
|
+
});
|
|
1587
|
+
}
|
|
1588
|
+
|
|
1459
1589
|
/**
|
|
1460
1590
|
* Re-link all attachments from a set of source messages to a target message.
|
|
1461
1591
|
* Used during message consolidation so that attachments linked to deleted
|
|
@@ -58,10 +58,6 @@ export function ensureGroupMigration(): void {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
// 3. Seed system groups.
|
|
61
|
-
//
|
|
62
|
-
// `system:reflections` is a legacy group kept for backward compatibility
|
|
63
|
-
// with existing installations. New auto-analysis conversations are assigned
|
|
64
|
-
// to `system:background`; the migration in step 6 moves existing ones.
|
|
65
61
|
const now = Math.floor(Date.now() / 1000);
|
|
66
62
|
rawExec(`
|
|
67
63
|
INSERT OR IGNORE INTO conversation_groups (id, name, sort_position, is_system_group, created_at, updated_at)
|
|
@@ -69,8 +65,7 @@ export function ensureGroupMigration(): void {
|
|
|
69
65
|
('system:pinned', 'Pinned', 0, TRUE, ${now}, ${now}),
|
|
70
66
|
('system:scheduled', 'Scheduled', 1, TRUE, ${now}, ${now}),
|
|
71
67
|
('system:background', 'Background', 2, TRUE, ${now}, ${now}),
|
|
72
|
-
('system:all', 'Recents', 3, TRUE, ${now}, ${now})
|
|
73
|
-
('system:reflections', 'Reflections', 100, TRUE, ${now}, ${now})
|
|
68
|
+
('system:all', 'Recents', 3, TRUE, ${now}, ${now})
|
|
74
69
|
`);
|
|
75
70
|
|
|
76
71
|
// One-time migration: move system:all to sortPosition 3 (from 999999).
|
|
@@ -245,5 +240,42 @@ export function ensureGroupMigration(): void {
|
|
|
245
240
|
}
|
|
246
241
|
}
|
|
247
242
|
|
|
243
|
+
// 7. One-time cleanup: delete the orphaned system:reflections group row.
|
|
244
|
+
//
|
|
245
|
+
// Reflections render as a sub-group under Background via the client's
|
|
246
|
+
// sub-group label provider; the standalone system:reflections group is no
|
|
247
|
+
// longer referenced by any conversation after step 6. Leaving the row in
|
|
248
|
+
// place causes the macOS sidebar to render an empty duplicate "Reflections"
|
|
249
|
+
// entry with a fallback folder icon alongside the Background sub-group.
|
|
250
|
+
const reflectionsGroupDeleted = rawGet<{ id: string }>(
|
|
251
|
+
"SELECT id FROM conversation_groups WHERE id = '_reflections_group_deleted_complete'",
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
if (!reflectionsGroupDeleted) {
|
|
255
|
+
try {
|
|
256
|
+
rawExec("BEGIN");
|
|
257
|
+
|
|
258
|
+
// Belt-and-suspenders: re-run the conversation move in case a straggler
|
|
259
|
+
// crept in between step 6's sentinel being set and this step shipping.
|
|
260
|
+
rawExec(`
|
|
261
|
+
UPDATE conversations SET group_id = 'system:background'
|
|
262
|
+
WHERE group_id = 'system:reflections'
|
|
263
|
+
`);
|
|
264
|
+
|
|
265
|
+
rawExec(`DELETE FROM conversation_groups WHERE id = 'system:reflections'`);
|
|
266
|
+
|
|
267
|
+
rawExec(`
|
|
268
|
+
INSERT OR IGNORE INTO conversation_groups (id, name, sort_position, is_system_group)
|
|
269
|
+
VALUES ('_reflections_group_deleted_complete', '_reflections_group_deleted_complete', -1, TRUE)
|
|
270
|
+
`);
|
|
271
|
+
|
|
272
|
+
rawExec("COMMIT");
|
|
273
|
+
} catch (err) {
|
|
274
|
+
rawExec("ROLLBACK");
|
|
275
|
+
log.error({ err }, "reflections-group deletion failed, rolled back");
|
|
276
|
+
throw err;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
248
280
|
migrated = true;
|
|
249
281
|
}
|
|
@@ -88,6 +88,59 @@ export function listPinnedConversations(): ConversationRow[] {
|
|
|
88
88
|
return query.all().map(parseConversation);
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
+
/**
|
|
92
|
+
* Row shape returned by {@link listConversationsByTitlePrefix}.
|
|
93
|
+
*
|
|
94
|
+
* Kept deliberately narrow (no full `ConversationRow`) since the only caller
|
|
95
|
+
* today is the playground's seeded-conversation listing endpoint, which only
|
|
96
|
+
* needs display metadata plus a message count to show in a list.
|
|
97
|
+
*/
|
|
98
|
+
export interface ConversationTitlePrefixRow {
|
|
99
|
+
id: string;
|
|
100
|
+
title: string;
|
|
101
|
+
messageCount: number;
|
|
102
|
+
createdAt: number;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* List non-archived conversations whose `title` begins with `prefix`.
|
|
107
|
+
*
|
|
108
|
+
* Uses raw SQL with a subquery for `messageCount` so a single round-trip
|
|
109
|
+
* returns everything the caller needs. The `LIKE ? || '%'` pattern does a
|
|
110
|
+
* prefix match; SQLite optimizes this with an index when one exists on
|
|
111
|
+
* `title`, otherwise it degrades to a table scan — acceptable for the
|
|
112
|
+
* playground-seeded set, which is small by construction.
|
|
113
|
+
*
|
|
114
|
+
* Escaping is unnecessary here because the prefix is a build-time constant
|
|
115
|
+
* (`PLAYGROUND_TITLE_PREFIX`) rather than user input. If callers ever pass
|
|
116
|
+
* dynamic prefixes, switch to `ESCAPE '\\'` and pre-escape `%` / `_` / `\`.
|
|
117
|
+
*/
|
|
118
|
+
export function listConversationsByTitlePrefix(
|
|
119
|
+
prefix: string,
|
|
120
|
+
): ConversationTitlePrefixRow[] {
|
|
121
|
+
interface Row {
|
|
122
|
+
id: string;
|
|
123
|
+
title: string;
|
|
124
|
+
message_count: number;
|
|
125
|
+
created_at: number;
|
|
126
|
+
}
|
|
127
|
+
const rows = rawAll<Row>(
|
|
128
|
+
`SELECT c.id, c.title,
|
|
129
|
+
(SELECT COUNT(*) FROM messages WHERE conversation_id = c.id) AS message_count,
|
|
130
|
+
c.created_at
|
|
131
|
+
FROM conversations c
|
|
132
|
+
WHERE c.title LIKE ? || '%' AND c.archived_at IS NULL
|
|
133
|
+
ORDER BY c.created_at DESC`,
|
|
134
|
+
prefix,
|
|
135
|
+
);
|
|
136
|
+
return rows.map((r) => ({
|
|
137
|
+
id: r.id,
|
|
138
|
+
title: r.title,
|
|
139
|
+
messageCount: r.message_count,
|
|
140
|
+
createdAt: r.created_at,
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
143
|
+
|
|
91
144
|
export function countConversations(backgroundOnly = false): number {
|
|
92
145
|
const db = getDb();
|
|
93
146
|
const where = backgroundOnly
|
|
@@ -257,10 +310,10 @@ export function searchConversations(
|
|
|
257
310
|
.from(conversations)
|
|
258
311
|
.where(
|
|
259
312
|
and(
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
313
|
+
sql`${conversations.conversationType} NOT IN ('background', 'private', 'scheduled')`,
|
|
314
|
+
sql`${conversations.title} LIKE ${titlePattern} ESCAPE '\\'`,
|
|
315
|
+
sql`${conversations.archivedAt} IS NULL`,
|
|
316
|
+
),
|
|
264
317
|
)
|
|
265
318
|
.all();
|
|
266
319
|
for (const row of titleMatchConvs) ftsConvIds.add(row.id);
|
|
@@ -37,6 +37,7 @@ export type TitleOrigin =
|
|
|
37
37
|
| "filing"
|
|
38
38
|
| "local"
|
|
39
39
|
| "task_submit"
|
|
40
|
+
| "updates_bulletin"
|
|
40
41
|
| "misc";
|
|
41
42
|
|
|
42
43
|
export interface TitleContext {
|
|
@@ -118,7 +119,8 @@ export async function generateAndPersistConversationTitle(
|
|
|
118
119
|
return { title: conversation.title!, updated: false };
|
|
119
120
|
}
|
|
120
121
|
|
|
121
|
-
const provider =
|
|
122
|
+
const provider =
|
|
123
|
+
params.provider ?? (await getConfiguredProvider("conversationTitle"));
|
|
122
124
|
if (!provider) {
|
|
123
125
|
// No provider available — fall back to context-derived title or untitled
|
|
124
126
|
const fallback = deriveFallbackTitle(context) ?? UNTITLED_FALLBACK;
|
|
@@ -133,7 +135,7 @@ export async function generateAndPersistConversationTitle(
|
|
|
133
135
|
provider,
|
|
134
136
|
systemPrompt: buildTitleSystemPrompt(),
|
|
135
137
|
tools: [],
|
|
136
|
-
|
|
138
|
+
callSite: "conversationTitle",
|
|
137
139
|
signal,
|
|
138
140
|
timeoutMs: 10_000,
|
|
139
141
|
});
|
|
@@ -219,7 +221,8 @@ export async function regenerateConversationTitle(
|
|
|
219
221
|
return { title: conversation?.title ?? UNTITLED_FALLBACK, updated: false };
|
|
220
222
|
}
|
|
221
223
|
|
|
222
|
-
const provider =
|
|
224
|
+
const provider =
|
|
225
|
+
params.provider ?? (await getConfiguredProvider("conversationTitle"));
|
|
223
226
|
if (!provider) {
|
|
224
227
|
return { title: conversation.title ?? UNTITLED_FALLBACK, updated: false };
|
|
225
228
|
}
|
|
@@ -231,12 +234,18 @@ export async function regenerateConversationTitle(
|
|
|
231
234
|
}
|
|
232
235
|
|
|
233
236
|
const prompt = buildRegenerationPrompt(recentMessages);
|
|
237
|
+
// Skip the LLM call if no messages yielded extractable text — the prompt
|
|
238
|
+
// would be just the "Recent messages:" header, and the model tends to
|
|
239
|
+
// fabricate a meta-title about the emptiness rather than decline.
|
|
240
|
+
if (!/\n(?:User|Assistant): /.test(prompt)) {
|
|
241
|
+
return { title: conversation.title ?? UNTITLED_FALLBACK, updated: false };
|
|
242
|
+
}
|
|
234
243
|
const result = await runBtwSidechain({
|
|
235
244
|
content: prompt,
|
|
236
245
|
provider,
|
|
237
246
|
systemPrompt: buildTitleSystemPrompt(),
|
|
238
247
|
tools: [],
|
|
239
|
-
|
|
248
|
+
callSite: "conversationTitle",
|
|
240
249
|
signal,
|
|
241
250
|
timeoutMs: 10_000,
|
|
242
251
|
});
|
|
@@ -293,6 +302,7 @@ function buildTitleSystemPrompt(): string {
|
|
|
293
302
|
"- Do NOT echo back what the user asked you to do",
|
|
294
303
|
"- Do NOT respond to the conversation content",
|
|
295
304
|
"- Do NOT assess feasibility or comment on capabilities",
|
|
305
|
+
"- If input is sparse or references external context, extract a topic from the words that ARE present (e.g. 'so about that t-shirt...' → 'T-Shirt Discussion'). Never describe the absence, emptiness, or insufficiency of context — titles like 'Missing Context', 'Unclear Request', 'No Topic' are forbidden",
|
|
296
306
|
].join("\n");
|
|
297
307
|
}
|
|
298
308
|
|
|
@@ -326,9 +336,27 @@ function buildTitlePrompt(
|
|
|
326
336
|
return parts.join("\n");
|
|
327
337
|
}
|
|
328
338
|
|
|
339
|
+
const META_FAILURE_TITLES = new Set([
|
|
340
|
+
"missing context",
|
|
341
|
+
"no context",
|
|
342
|
+
"insufficient context",
|
|
343
|
+
"unclear context",
|
|
344
|
+
"empty context",
|
|
345
|
+
"no topic",
|
|
346
|
+
"unclear topic",
|
|
347
|
+
"unclear request",
|
|
348
|
+
"unclear message",
|
|
349
|
+
"empty conversation",
|
|
350
|
+
"empty message",
|
|
351
|
+
"no content",
|
|
352
|
+
]);
|
|
353
|
+
|
|
329
354
|
function normalizeTitle(raw: string): string {
|
|
330
355
|
let title = raw.trim().replace(/^["']|["']$/g, "");
|
|
331
356
|
title = stripMarkdown(title);
|
|
357
|
+
if (META_FAILURE_TITLES.has(title.toLowerCase())) {
|
|
358
|
+
return "";
|
|
359
|
+
}
|
|
332
360
|
return title;
|
|
333
361
|
}
|
|
334
362
|
|
package/src/memory/db-init.ts
CHANGED
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
addCoreColumns,
|
|
18
18
|
createActorRefreshTokenRecordsTable,
|
|
19
19
|
createActorTokenRecordsTable,
|
|
20
|
+
createApprovalPromptTsTrackerTable,
|
|
20
21
|
createAssistantInboxTables,
|
|
21
22
|
createCallSessionsTables,
|
|
22
23
|
createCanonicalGuardianTables,
|
|
@@ -110,11 +111,13 @@ import {
|
|
|
110
111
|
migrateNormalizeUserFileByPrincipal,
|
|
111
112
|
migrateNotificationDeliveryThreadDecision,
|
|
112
113
|
migrateOAuthAppsClientSecretPath,
|
|
114
|
+
migrateOAuthProvidersAvailableScopes,
|
|
113
115
|
migrateOAuthProvidersBehaviorColumns,
|
|
114
116
|
migrateOAuthProvidersDisplayMetadata,
|
|
115
117
|
migrateOAuthProvidersFeatureFlag,
|
|
116
118
|
migrateOAuthProvidersLogoUrl,
|
|
117
119
|
migrateOAuthProvidersManagedServiceConfigKey,
|
|
120
|
+
migrateOAuthProvidersManagedServiceIsPaid,
|
|
118
121
|
migrateOAuthProvidersPingConfig,
|
|
119
122
|
migrateOAuthProvidersPingUrl,
|
|
120
123
|
migrateOAuthProvidersRefreshUrl,
|
|
@@ -143,9 +146,11 @@ import {
|
|
|
143
146
|
migrateScheduleOneShotRouting,
|
|
144
147
|
migrateScheduleQuietFlag,
|
|
145
148
|
migrateScheduleReuseConversation,
|
|
149
|
+
migrateScheduleScriptColumn,
|
|
146
150
|
migrateSchemaIndexesAndColumns,
|
|
147
151
|
migrateScrubCorruptedImageAttachments,
|
|
148
152
|
migrateStripIntegrationPrefixFromProviderKeys,
|
|
153
|
+
migrateStripPlaceholderSentinelsFromMessages,
|
|
149
154
|
migrateStripThinkingFromConsolidated,
|
|
150
155
|
migrateUsageDashboardIndexes,
|
|
151
156
|
migrateUsageLlmCallCount,
|
|
@@ -266,6 +271,7 @@ export function initializeDb(): void {
|
|
|
266
271
|
migrateInviteCodeHashColumn,
|
|
267
272
|
createActorTokenRecordsTable,
|
|
268
273
|
createActorRefreshTokenRecordsTable,
|
|
274
|
+
createApprovalPromptTsTrackerTable,
|
|
269
275
|
migrateGuardianPrincipalIdColumns,
|
|
270
276
|
migrateBackfillGuardianPrincipalId,
|
|
271
277
|
migrateGuardianPrincipalIdNotNull,
|
|
@@ -359,6 +365,7 @@ export function initializeDb(): void {
|
|
|
359
365
|
migrateConversationsLastMessageAt,
|
|
360
366
|
migrateStripThinkingFromConsolidated,
|
|
361
367
|
migrateScheduleReuseConversation,
|
|
368
|
+
migrateScheduleScriptColumn,
|
|
362
369
|
migrateMemoryRecallLogsQueryContext,
|
|
363
370
|
migrateLlmRequestLogsCreatedAtIndex,
|
|
364
371
|
migrateOAuthProvidersScopeSeparator,
|
|
@@ -370,6 +377,9 @@ export function initializeDb(): void {
|
|
|
370
377
|
migrateOAuthProvidersTokenExchangeBodyFormat,
|
|
371
378
|
migrateNormalizeUserFileByPrincipal,
|
|
372
379
|
migrateConversationsArchivedAt,
|
|
380
|
+
migrateStripPlaceholderSentinelsFromMessages,
|
|
381
|
+
migrateOAuthProvidersManagedServiceIsPaid,
|
|
382
|
+
migrateOAuthProvidersAvailableScopes,
|
|
373
383
|
];
|
|
374
384
|
|
|
375
385
|
// Run each migration step, catching and logging individual failures so one
|
|
@@ -795,7 +795,7 @@ export async function selectedBackendSupportsMultimodal(
|
|
|
795
795
|
|
|
796
796
|
async function isOllamaConfigured(config: AssistantConfig): Promise<boolean> {
|
|
797
797
|
return (
|
|
798
|
-
config.
|
|
798
|
+
config.llm.default.provider === "ollama" ||
|
|
799
799
|
Boolean(await getProviderKeyAsync("ollama")) ||
|
|
800
800
|
Boolean(getOllamaBaseUrlEnv())
|
|
801
801
|
);
|
|
@@ -35,7 +35,7 @@ describe("GeminiEmbeddingBackend", () => {
|
|
|
35
35
|
expect(url).toContain("key=test-key");
|
|
36
36
|
|
|
37
37
|
const body = JSON.parse(init.body as string);
|
|
38
|
-
expect(body.model).
|
|
38
|
+
expect(body.model).toBeUndefined();
|
|
39
39
|
expect(body.content).toEqual({ parts: [{ text: "hello world" }] });
|
|
40
40
|
});
|
|
41
41
|
|
|
@@ -181,7 +181,7 @@ describe("GeminiEmbeddingBackend", () => {
|
|
|
181
181
|
const body = JSON.parse(init.body as string);
|
|
182
182
|
expect(body.taskType).toBeUndefined();
|
|
183
183
|
expect(body.outputDimensionality).toBeUndefined();
|
|
184
|
-
expect(Object.keys(body)).toEqual(["
|
|
184
|
+
expect(Object.keys(body)).toEqual(["content"]);
|
|
185
185
|
});
|
|
186
186
|
});
|
|
187
187
|
|
|
@@ -276,6 +276,45 @@ describe("GeminiEmbeddingBackend", () => {
|
|
|
276
276
|
// Should have Bearer auth header
|
|
277
277
|
const headers = init.headers as Record<string, string>;
|
|
278
278
|
expect(headers["Authorization"]).toBe("Bearer ast-managed-key");
|
|
279
|
+
// Managed path must NOT include `model` in the body — Gemini models it
|
|
280
|
+
// as a protobuf oneof populated from the URL path (internally `_model`)
|
|
281
|
+
// and rejects the duplicate with "oneof field '_model' is already set".
|
|
282
|
+
// See the comment in embedSingle() for the full invariant.
|
|
283
|
+
const body = JSON.parse(init.body as string);
|
|
284
|
+
expect(body.model).toBeUndefined();
|
|
285
|
+
expect(body._model).toBeUndefined();
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
test("never sets `model` or `_model` in the request body (oneof invariant)", async () => {
|
|
289
|
+
// Regression for JARVIS-587: every embed_segment job was failing with
|
|
290
|
+
// `Invalid value (oneof), oneof field '_model' is already set. Cannot
|
|
291
|
+
// set 'model'`. Ensure neither field is ever present on the wire,
|
|
292
|
+
// regardless of transport.
|
|
293
|
+
const managedBackend = new GeminiEmbeddingBackend(
|
|
294
|
+
"ast-managed-key",
|
|
295
|
+
"gemini-embedding-2-preview",
|
|
296
|
+
{
|
|
297
|
+
managedBaseUrl:
|
|
298
|
+
"https://platform.example.com/v1/runtime-proxy/gemini",
|
|
299
|
+
taskType: "RETRIEVAL_DOCUMENT",
|
|
300
|
+
dimensions: 3072,
|
|
301
|
+
},
|
|
302
|
+
);
|
|
303
|
+
await managedBackend.embed(["hello"]);
|
|
304
|
+
|
|
305
|
+
const directBackend = new GeminiEmbeddingBackend(
|
|
306
|
+
"direct-key",
|
|
307
|
+
"test-model",
|
|
308
|
+
);
|
|
309
|
+
await directBackend.embed(["hello"]);
|
|
310
|
+
|
|
311
|
+
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
312
|
+
for (const call of mockFetch.mock.calls) {
|
|
313
|
+
const [, init] = call as [string, RequestInit];
|
|
314
|
+
const body = JSON.parse(init.body as string);
|
|
315
|
+
expect(body.model).toBeUndefined();
|
|
316
|
+
expect(body._model).toBeUndefined();
|
|
317
|
+
}
|
|
279
318
|
});
|
|
280
319
|
|
|
281
320
|
test("uses direct Google API URL when managedBaseUrl is not set", async () => {
|
|
@@ -58,9 +58,14 @@ export class GeminiEmbeddingBackend implements EmbeddingBackend {
|
|
|
58
58
|
const parts = this.buildParts(normalized);
|
|
59
59
|
|
|
60
60
|
const body: Record<string, unknown> = {
|
|
61
|
-
model: `models/${this.model}`,
|
|
62
61
|
content: { parts },
|
|
63
62
|
};
|
|
63
|
+
// Do NOT set `model` in the body. Gemini's embedContent API models `model`
|
|
64
|
+
// as a protobuf oneof populated from the URL path (internally `_model`),
|
|
65
|
+
// so adding it to the body triggers a 400: "oneof field '_model' is
|
|
66
|
+
// already set. Cannot set 'model'". This holds for both the direct API
|
|
67
|
+
// and the managed proxy, which forwards the body unchanged; the platform
|
|
68
|
+
// billing layer parses the model from the URL path instead.
|
|
64
69
|
if (this.taskType) body.taskType = this.taskType;
|
|
65
70
|
if (this.dimensions) body.outputDimensionality = this.dimensions;
|
|
66
71
|
|