@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
|
@@ -15,7 +15,11 @@ import {
|
|
|
15
15
|
import type { ContentBlock, ImageContent } from "../../providers/types.js";
|
|
16
16
|
import { getLogger } from "../../util/logger.js";
|
|
17
17
|
import { embedWithRetry } from "../embed.js";
|
|
18
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
generateSparseEmbedding,
|
|
20
|
+
selectedBackendSupportsMultimodal,
|
|
21
|
+
} from "../embedding-backend.js";
|
|
22
|
+
import type { QdrantSparseVector } from "../qdrant-client.js";
|
|
19
23
|
import { searchGraphNodes } from "./graph-search.js";
|
|
20
24
|
import type { InContextTracker } from "./injection.js";
|
|
21
25
|
import {
|
|
@@ -28,7 +32,12 @@ import {
|
|
|
28
32
|
weightsForContextLoad,
|
|
29
33
|
} from "./scoring.js";
|
|
30
34
|
import { sampleSerendipity } from "./serendipity.js";
|
|
31
|
-
import {
|
|
35
|
+
import {
|
|
36
|
+
getEdgesForNode,
|
|
37
|
+
getNodesByIds,
|
|
38
|
+
queryCapabilityNodes,
|
|
39
|
+
queryNodes,
|
|
40
|
+
} from "./store.js";
|
|
32
41
|
import { getActiveTriggersByType } from "./store.js";
|
|
33
42
|
import {
|
|
34
43
|
evaluateEventTriggers,
|
|
@@ -46,6 +55,13 @@ import { isCapabilityNode } from "./types.js";
|
|
|
46
55
|
|
|
47
56
|
const log = getLogger("graph-retriever");
|
|
48
57
|
|
|
58
|
+
function extractCapabilityId(node: MemoryNode): string | null {
|
|
59
|
+
const match = node.content.match(
|
|
60
|
+
/^skill:(\S+)\n|^cli:(\S+)\n|^\s*The ".*?" skill \(([^)]+)\)|^\s*The "assistant (\S+)" CLI command/,
|
|
61
|
+
);
|
|
62
|
+
return match?.[1] ?? match?.[2] ?? match?.[3] ?? match?.[4] ?? null;
|
|
63
|
+
}
|
|
64
|
+
|
|
49
65
|
// ---------------------------------------------------------------------------
|
|
50
66
|
// LLM re-ranking + deduplication
|
|
51
67
|
// ---------------------------------------------------------------------------
|
|
@@ -81,7 +97,7 @@ async function rerankAndDedup(
|
|
|
81
97
|
if (candidates.length <= maxNodes) return candidates;
|
|
82
98
|
|
|
83
99
|
try {
|
|
84
|
-
const provider = await getConfiguredProvider();
|
|
100
|
+
const provider = await getConfiguredProvider("memoryRetrieval");
|
|
85
101
|
if (!provider) return candidates.slice(0, maxNodes);
|
|
86
102
|
|
|
87
103
|
// Numbered listing for the LLM: index + age + full content
|
|
@@ -111,7 +127,7 @@ Your job:
|
|
|
111
127
|
3. Return the IDs in order of importance (most important first).`,
|
|
112
128
|
{
|
|
113
129
|
config: {
|
|
114
|
-
|
|
130
|
+
callSite: "memoryRetrieval" as const,
|
|
115
131
|
tool_choice: { type: "tool" as const, name: "select_memories" },
|
|
116
132
|
thinking: { type: "disabled" },
|
|
117
133
|
temperature: 0,
|
|
@@ -180,7 +196,7 @@ async function dedupForTurn(
|
|
|
180
196
|
query: string,
|
|
181
197
|
): Promise<{ nodes: ScoredNode[]; llmApplied: boolean }> {
|
|
182
198
|
try {
|
|
183
|
-
const provider = await getConfiguredProvider();
|
|
199
|
+
const provider = await getConfiguredProvider("memoryRetrieval");
|
|
184
200
|
if (!provider)
|
|
185
201
|
return { nodes: candidates.slice(0, maxNodes), llmApplied: false };
|
|
186
202
|
|
|
@@ -202,7 +218,7 @@ async function dedupForTurn(
|
|
|
202
218
|
`Dedupe + rerank the following numbered items. Pick the most relevant items to the query. Call the select_items tool.\n\nBe aggressive on dedup — when multiple items describe the same event, fact, or status, keep ONLY the richest version. But be generous on relevance — only cut items that are completely irrelevant to the query. If it's even tangentially related, keep it.`,
|
|
203
219
|
{
|
|
204
220
|
config: {
|
|
205
|
-
|
|
221
|
+
callSite: "memoryRetrieval" as const,
|
|
206
222
|
tool_choice: { type: "tool" as const, name: "select_items" },
|
|
207
223
|
thinking: { type: "disabled" },
|
|
208
224
|
temperature: 0,
|
|
@@ -273,7 +289,7 @@ async function dedupCrossCategory(
|
|
|
273
289
|
maxNodes: number,
|
|
274
290
|
): Promise<ScoredNode[]> {
|
|
275
291
|
try {
|
|
276
|
-
const provider = await getConfiguredProvider();
|
|
292
|
+
const provider = await getConfiguredProvider("memoryRetrieval");
|
|
277
293
|
if (!provider) return candidates.slice(0, maxNodes);
|
|
278
294
|
|
|
279
295
|
const now = Date.now();
|
|
@@ -294,7 +310,7 @@ async function dedupCrossCategory(
|
|
|
294
310
|
`Deduplicate the following numbered items. When multiple items describe the same event, fact, or status, keep ONLY the richest version. Keep ALL items that are not duplicates — do not filter by relevance or topic. Call the select_items tool with every item that survives dedup.`,
|
|
295
311
|
{
|
|
296
312
|
config: {
|
|
297
|
-
|
|
313
|
+
callSite: "memoryRetrieval" as const,
|
|
298
314
|
tool_choice: { type: "tool" as const, name: "select_items" },
|
|
299
315
|
thinking: { type: "disabled" },
|
|
300
316
|
temperature: 0,
|
|
@@ -347,6 +363,13 @@ export interface ContextLoadOpts {
|
|
|
347
363
|
serendipitySlots?: number;
|
|
348
364
|
/** Maximum nodes to return (default 40). */
|
|
349
365
|
maxNodes?: number;
|
|
366
|
+
/**
|
|
367
|
+
* Optional dedicated user-message query text. When present and non-empty,
|
|
368
|
+
* `loadContextMemory` embeds this text independently of
|
|
369
|
+
* `recentSummaries` and uses the resulting vector to rank capability
|
|
370
|
+
* reserve slots. Leave `undefined` to use summary-only retrieval.
|
|
371
|
+
*/
|
|
372
|
+
userQuery?: string;
|
|
350
373
|
}
|
|
351
374
|
|
|
352
375
|
export interface ContextLoadResult {
|
|
@@ -355,6 +378,37 @@ export interface ContextLoadResult {
|
|
|
355
378
|
triggeredNodes: TriggeredResult[];
|
|
356
379
|
latencyMs: number;
|
|
357
380
|
metrics: RetrievalMetrics;
|
|
381
|
+
/**
|
|
382
|
+
* Dense query vector computed from `recentSummaries`. Surfaced so downstream
|
|
383
|
+
* callers (e.g. the PKB hint retriever) can reuse the same embedding for a
|
|
384
|
+
* second Qdrant query without paying for another embedding call. `undefined`
|
|
385
|
+
* when no summaries were provided or embedding failed (circuit breaker).
|
|
386
|
+
*/
|
|
387
|
+
queryVector?: number[];
|
|
388
|
+
/**
|
|
389
|
+
* Optional sparse vector passed into `searchGraphNodes` alongside the dense
|
|
390
|
+
* query vector. Currently always `undefined` — reserved for future hybrid
|
|
391
|
+
* retrieval that produces a sparse vector at the call site.
|
|
392
|
+
*/
|
|
393
|
+
sparseVector?: QdrantSparseVector;
|
|
394
|
+
/**
|
|
395
|
+
* Dense query vector computed from `opts.userQuery`. Surfaced so
|
|
396
|
+
* downstream callers (PKB hint search) can prefer it over the
|
|
397
|
+
* summary-based `queryVector` for user-intent-aligned retrieval.
|
|
398
|
+
* `undefined` when `userQuery` was not provided, was effectively empty,
|
|
399
|
+
* or the dedicated embed call was skipped/failed.
|
|
400
|
+
*/
|
|
401
|
+
userQueryVector?: number[];
|
|
402
|
+
/**
|
|
403
|
+
* Sparse (TF-IDF) vector of `opts.userQuery`. Surfaced so PKB hint search
|
|
404
|
+
* can pair it with `userQueryVector` to run a hybrid dense+sparse query —
|
|
405
|
+
* RRF fusion captures lexical matches (exact filenames, proper nouns,
|
|
406
|
+
* uncommon tokens) that pure dense embeddings wash out. Computed locally
|
|
407
|
+
* (no embedding-service call), so it's cheap to produce whenever the user
|
|
408
|
+
* query is non-empty. `undefined` on the same conditions as
|
|
409
|
+
* `userQueryVector`.
|
|
410
|
+
*/
|
|
411
|
+
userQuerySparseVector?: QdrantSparseVector;
|
|
358
412
|
}
|
|
359
413
|
|
|
360
414
|
/**
|
|
@@ -380,6 +434,7 @@ export async function loadContextMemory(
|
|
|
380
434
|
|
|
381
435
|
// 1. Embed recent conversation summaries as retrieval queries
|
|
382
436
|
let queryVector: number[] | null = null;
|
|
437
|
+
const sparseVector: QdrantSparseVector | undefined = undefined;
|
|
383
438
|
let embeddingProvider: string | null = null;
|
|
384
439
|
let embeddingModel: string | null = null;
|
|
385
440
|
let contextQueryText: string | null = null;
|
|
@@ -400,15 +455,51 @@ export async function loadContextMemory(
|
|
|
400
455
|
}
|
|
401
456
|
}
|
|
402
457
|
|
|
458
|
+
// 1b. Dedicated user-query embedding. Always embed the user query
|
|
459
|
+
// independently when present. Summaries and the user query are
|
|
460
|
+
// disjoint signals, so both vectors carry unique retrieval value —
|
|
461
|
+
// especially in workloads with short summaries and a substantive
|
|
462
|
+
// user question.
|
|
463
|
+
let userQueryVector: number[] | null = null;
|
|
464
|
+
let userQuerySparseVector: QdrantSparseVector | undefined = undefined;
|
|
465
|
+
const userQueryCandidateIds = new Map<string, number>(); // nodeId → score
|
|
466
|
+
const trimmedUserQuery = opts.userQuery?.trim() ?? "";
|
|
467
|
+
const shouldEmbedUserQuery = trimmedUserQuery.length > 0;
|
|
468
|
+
if (shouldEmbedUserQuery) {
|
|
469
|
+
try {
|
|
470
|
+
const result = await embedWithRetry(opts.config, [trimmedUserQuery], {
|
|
471
|
+
signal: opts.signal,
|
|
472
|
+
});
|
|
473
|
+
userQueryVector = result.vectors[0] ?? null;
|
|
474
|
+
if (!embeddingProvider) {
|
|
475
|
+
embeddingProvider = result.provider;
|
|
476
|
+
embeddingModel = result.model;
|
|
477
|
+
}
|
|
478
|
+
} catch (err) {
|
|
479
|
+
log.warn({ err }, "Failed to embed userQuery for context load");
|
|
480
|
+
}
|
|
481
|
+
// Sparse embedding is a local TF-IDF computation — no network call, so
|
|
482
|
+
// compute it independently of the dense embed. Even if the dense call
|
|
483
|
+
// failed, a sparse vector is still useful for downstream consumers that
|
|
484
|
+
// can operate on it alone.
|
|
485
|
+
const sparse = generateSparseEmbedding(trimmedUserQuery);
|
|
486
|
+
if (sparse.indices.length > 0) {
|
|
487
|
+
userQuerySparseVector = sparse;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
|
|
403
491
|
// 2. Hybrid retrieval from Qdrant (dense search on graph_node points)
|
|
404
492
|
const semanticCandidateIds = new Map<string, number>(); // nodeId → score
|
|
405
493
|
let hybridSearchLatencyMs = 0;
|
|
406
494
|
if (queryVector) {
|
|
407
495
|
const searchStart = Date.now();
|
|
408
496
|
try {
|
|
409
|
-
const results = await searchGraphNodes(
|
|
410
|
-
|
|
411
|
-
|
|
497
|
+
const results = await searchGraphNodes(
|
|
498
|
+
queryVector,
|
|
499
|
+
maxNodes * 3,
|
|
500
|
+
[opts.scopeId],
|
|
501
|
+
sparseVector,
|
|
502
|
+
);
|
|
412
503
|
for (const r of results) {
|
|
413
504
|
semanticCandidateIds.set(r.nodeId, r.score);
|
|
414
505
|
}
|
|
@@ -420,6 +511,30 @@ export async function loadContextMemory(
|
|
|
420
511
|
}
|
|
421
512
|
const pureSemanticHits = semanticCandidateIds.size;
|
|
422
513
|
|
|
514
|
+
// 2b. Run a parallel Qdrant search against the user-query vector and merge
|
|
515
|
+
// the results into the organic scoring pool via max-score union: a node
|
|
516
|
+
// hit by only the user-query vector still participates in downstream
|
|
517
|
+
// scoring, and a node hit by both vectors retains the higher score.
|
|
518
|
+
if (userQueryVector) {
|
|
519
|
+
try {
|
|
520
|
+
const results = await searchGraphNodes(
|
|
521
|
+
userQueryVector,
|
|
522
|
+
maxNodes * 3,
|
|
523
|
+
[opts.scopeId],
|
|
524
|
+
undefined,
|
|
525
|
+
);
|
|
526
|
+
for (const r of results) {
|
|
527
|
+
userQueryCandidateIds.set(r.nodeId, r.score);
|
|
528
|
+
const existing = semanticCandidateIds.get(r.nodeId);
|
|
529
|
+
if (existing === undefined || r.score > existing) {
|
|
530
|
+
semanticCandidateIds.set(r.nodeId, r.score);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
} catch (err) {
|
|
534
|
+
log.warn({ err }, "Qdrant search failed for userQuery vector");
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
|
|
423
538
|
// Also include top-significance nodes as a fallback
|
|
424
539
|
const topSignificance = queryNodes({
|
|
425
540
|
scopeId: opts.scopeId,
|
|
@@ -428,7 +543,7 @@ export async function loadContextMemory(
|
|
|
428
543
|
});
|
|
429
544
|
for (const node of topSignificance) {
|
|
430
545
|
if (!semanticCandidateIds.has(node.id)) {
|
|
431
|
-
semanticCandidateIds.set(node.id, 0); // no
|
|
546
|
+
semanticCandidateIds.set(node.id, 0); // no score from either Qdrant query, ranked by significance only
|
|
432
547
|
}
|
|
433
548
|
}
|
|
434
549
|
|
|
@@ -550,47 +665,69 @@ export async function loadContextMemory(
|
|
|
550
665
|
// Sort by score descending
|
|
551
666
|
scored.sort((a, b) => b.score - a.score);
|
|
552
667
|
|
|
553
|
-
// 5b. Reserve slots for skill/CLI capabilities.
|
|
554
|
-
//
|
|
555
|
-
//
|
|
668
|
+
// 5b. Reserve slots for skill/CLI capabilities.
|
|
669
|
+
//
|
|
670
|
+
// Source candidates from the hydrated semantic-search set (the same
|
|
671
|
+
// strategy `retrieveForTurn` uses) so ranking reflects query relevance.
|
|
672
|
+
// For cold-start cases (capability nodes exist in SQLite but their
|
|
673
|
+
// embeddings haven't landed in Qdrant yet), fall back to a narrow
|
|
674
|
+
// SQL pull that matches only capability-shaped content so organic
|
|
675
|
+
// procedurals can't crowd the pool.
|
|
556
676
|
const capabilityReserve = ctxLoadCfg.capabilityReserve;
|
|
557
|
-
const
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
677
|
+
const capabilityEntries: { node: MemoryNode; sim: number }[] = [];
|
|
678
|
+
if (capabilityReserve > 0) {
|
|
679
|
+
const uniqueCapabilityIds = new Set<string>();
|
|
680
|
+
let untaggedCount = 0;
|
|
681
|
+
for (const [nodeId, node] of nodeMap) {
|
|
682
|
+
if (node.fidelity === "gone") continue;
|
|
683
|
+
if (!isCapabilityNode(node)) continue;
|
|
684
|
+
const sim =
|
|
685
|
+
userQueryCandidateIds.get(nodeId) ??
|
|
686
|
+
semanticCandidateIds.get(nodeId) ??
|
|
687
|
+
0;
|
|
688
|
+
capabilityEntries.push({ node, sim });
|
|
689
|
+
const capId = extractCapabilityId(node);
|
|
690
|
+
if (capId) uniqueCapabilityIds.add(capId);
|
|
691
|
+
else untaggedCount++;
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
// Gate the fallback on distinct capability IDs (plus any entries
|
|
695
|
+
// whose content didn't match a known ID pattern), not raw entry
|
|
696
|
+
// count — duplicate capability-ID seeding formats can otherwise push
|
|
697
|
+
// `capabilityEntries.length` past the threshold and then collapse
|
|
698
|
+
// below it during the dedup pass below.
|
|
699
|
+
const distinctCount = uniqueCapabilityIds.size + untaggedCount;
|
|
700
|
+
if (distinctCount < capabilityReserve) {
|
|
701
|
+
const alreadySeen = new Set(capabilityEntries.map((e) => e.node.id));
|
|
702
|
+
const fallback = queryCapabilityNodes(
|
|
703
|
+
opts.scopeId,
|
|
704
|
+
capabilityReserve * 4,
|
|
705
|
+
);
|
|
706
|
+
for (const node of fallback) {
|
|
707
|
+
if (alreadySeen.has(node.id)) continue;
|
|
708
|
+
const sim =
|
|
709
|
+
userQueryCandidateIds.get(node.id) ??
|
|
710
|
+
semanticCandidateIds.get(node.id) ??
|
|
711
|
+
0;
|
|
712
|
+
capabilityEntries.push({ node, sim });
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
capabilityEntries.sort((a, b) => b.sim - a.sim);
|
|
566
718
|
|
|
567
719
|
// Dedup: both seeding systems may create nodes for the same capability.
|
|
568
720
|
// Extract capability ID from content and keep only the first node per ID.
|
|
569
721
|
const seenCapabilityIds = new Set<string>();
|
|
570
|
-
const
|
|
571
|
-
|
|
572
|
-
.
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
);
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
seenCapabilityIds.add(capId);
|
|
580
|
-
}
|
|
581
|
-
return true;
|
|
582
|
-
});
|
|
583
|
-
|
|
584
|
-
// Rank by semantic similarity when a query vector exists
|
|
585
|
-
let selectedCapabilities: MemoryNode[];
|
|
586
|
-
if (queryVector && capabilityNodes.length > capabilityReserve) {
|
|
587
|
-
selectedCapabilities = capabilityNodes
|
|
588
|
-
.map((node) => ({ node, sim: semanticCandidateIds.get(node.id) ?? 0 }))
|
|
589
|
-
.sort((a, b) => b.sim - a.sim)
|
|
590
|
-
.slice(0, capabilityReserve)
|
|
591
|
-
.map((e) => e.node);
|
|
592
|
-
} else {
|
|
593
|
-
selectedCapabilities = capabilityNodes.slice(0, capabilityReserve);
|
|
722
|
+
const selectedCapabilities: MemoryNode[] = [];
|
|
723
|
+
for (const { node } of capabilityEntries) {
|
|
724
|
+
if (selectedCapabilities.length >= capabilityReserve) break;
|
|
725
|
+
const capId = extractCapabilityId(node);
|
|
726
|
+
if (capId) {
|
|
727
|
+
if (seenCapabilityIds.has(capId)) continue;
|
|
728
|
+
seenCapabilityIds.add(capId);
|
|
729
|
+
}
|
|
730
|
+
selectedCapabilities.push(node);
|
|
594
731
|
}
|
|
595
732
|
|
|
596
733
|
const reservedCapabilities: ScoredNode[] = selectedCapabilities.map(
|
|
@@ -697,6 +834,10 @@ export async function loadContextMemory(
|
|
|
697
834
|
queryContext: contextQueryText,
|
|
698
835
|
topCandidates,
|
|
699
836
|
},
|
|
837
|
+
queryVector: queryVector ?? undefined,
|
|
838
|
+
sparseVector,
|
|
839
|
+
userQueryVector: userQueryVector ?? undefined,
|
|
840
|
+
userQuerySparseVector,
|
|
700
841
|
};
|
|
701
842
|
}
|
|
702
843
|
|
|
@@ -726,6 +867,28 @@ export interface TurnRetrievalResult {
|
|
|
726
867
|
triggeredNodes: TriggeredResult[];
|
|
727
868
|
latencyMs: number;
|
|
728
869
|
metrics: RetrievalMetrics;
|
|
870
|
+
/**
|
|
871
|
+
* Dense query vector computed from the last-exchange text (assistant +
|
|
872
|
+
* user message). Surfaced so downstream callers (e.g. the PKB hint
|
|
873
|
+
* retriever in `applyRuntimeInjections`) can reuse the same embedding
|
|
874
|
+
* for a second Qdrant query without paying for another embedding call.
|
|
875
|
+
* `undefined` when no text was embedded (image-only turn) or embedding
|
|
876
|
+
* failed (circuit breaker).
|
|
877
|
+
*/
|
|
878
|
+
queryVector?: number[];
|
|
879
|
+
/**
|
|
880
|
+
* Sparse (TF-IDF) vector of the user's last message, computed once per
|
|
881
|
+
* turn and reused across every return path of `retrieveForTurn`. Surfaced
|
|
882
|
+
* so downstream callers (e.g. the PKB hint retriever in
|
|
883
|
+
* `applyRuntimeInjections`) can pair it with `queryVector` to run a
|
|
884
|
+
* hybrid dense+sparse query — RRF fusion pulls in lexical matches
|
|
885
|
+
* (exact filenames, proper nouns, uncommon tokens) that pure dense
|
|
886
|
+
* embeddings wash out. Computed locally (no embedding-service call), so
|
|
887
|
+
* it survives even when the dense embed fails via the circuit breaker.
|
|
888
|
+
* `undefined` when the user's last message is empty/whitespace-only or
|
|
889
|
+
* yields no TF-IDF tokens.
|
|
890
|
+
*/
|
|
891
|
+
sparseVector?: QdrantSparseVector;
|
|
729
892
|
}
|
|
730
893
|
|
|
731
894
|
/**
|
|
@@ -766,6 +929,24 @@ export async function retrieveForTurn(
|
|
|
766
929
|
.filter((m) => m.length > 0)
|
|
767
930
|
.join("\n\n");
|
|
768
931
|
|
|
932
|
+
// Sparse (TF-IDF) vector of the user's last message only. Surfaced so PKB
|
|
933
|
+
// hint search can pair it with the per-turn dense vector, pulling in
|
|
934
|
+
// lexical matches (exact filenames, proper nouns, uncommon tokens) that
|
|
935
|
+
// pure dense embeddings wash out. Computed locally with no network call.
|
|
936
|
+
// The dense `queryVector` for per-turn is the combined assistant+user
|
|
937
|
+
// embedding (it drives graph search), so this pairing is slightly
|
|
938
|
+
// asymmetric — the sparse signal is user-only while the dense is mixed.
|
|
939
|
+
// That's acceptable for PKB's purpose: lexical matches are overwhelmingly
|
|
940
|
+
// driven by the user's own wording.
|
|
941
|
+
const trimmedUserLast = opts.userLastMessage.trim();
|
|
942
|
+
let perTurnSparseVector: QdrantSparseVector | undefined = undefined;
|
|
943
|
+
if (trimmedUserLast.length > 0) {
|
|
944
|
+
const sparse = generateSparseEmbedding(trimmedUserLast);
|
|
945
|
+
if (sparse.indices.length > 0) {
|
|
946
|
+
perTurnSparseVector = sparse;
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
|
|
769
950
|
// Image-to-image search: embed incoming user images as queries
|
|
770
951
|
// Runs before the text-empty early return so image-only turns are handled
|
|
771
952
|
const imageBlocks = (opts.userLastMessageBlocks ?? []).filter(
|
|
@@ -828,6 +1009,8 @@ export async function retrieveForTurn(
|
|
|
828
1009
|
embeddingModel,
|
|
829
1010
|
queryContext: queryText || null,
|
|
830
1011
|
},
|
|
1012
|
+
queryVector: undefined,
|
|
1013
|
+
sparseVector: perTurnSparseVector,
|
|
831
1014
|
};
|
|
832
1015
|
}
|
|
833
1016
|
|
|
@@ -900,6 +1083,8 @@ export async function retrieveForTurn(
|
|
|
900
1083
|
embeddingModel,
|
|
901
1084
|
queryContext: queryText || null,
|
|
902
1085
|
},
|
|
1086
|
+
queryVector: undefined,
|
|
1087
|
+
sparseVector: perTurnSparseVector,
|
|
903
1088
|
};
|
|
904
1089
|
}
|
|
905
1090
|
}
|
|
@@ -952,6 +1137,8 @@ export async function retrieveForTurn(
|
|
|
952
1137
|
embeddingModel,
|
|
953
1138
|
queryContext: queryText || null,
|
|
954
1139
|
},
|
|
1140
|
+
queryVector: queryEmbeddings[0],
|
|
1141
|
+
sparseVector: perTurnSparseVector,
|
|
955
1142
|
};
|
|
956
1143
|
}
|
|
957
1144
|
|
|
@@ -1134,5 +1321,7 @@ export async function retrieveForTurn(
|
|
|
1134
1321
|
queryContext: queryText || null,
|
|
1135
1322
|
topCandidates,
|
|
1136
1323
|
},
|
|
1324
|
+
queryVector: queryEmbeddings[0],
|
|
1325
|
+
sparseVector: perTurnSparseVector,
|
|
1137
1326
|
};
|
|
1138
1327
|
}
|
|
@@ -358,6 +358,47 @@ export function queryNodes(filters: NodeQueryFilters): MemoryNode[] {
|
|
|
358
358
|
return query.all().map(rowToNode);
|
|
359
359
|
}
|
|
360
360
|
|
|
361
|
+
/**
|
|
362
|
+
* Pull capability (skill / CLI) nodes directly from SQLite, ordered by
|
|
363
|
+
* significance DESC. Matches the content shapes produced by both the
|
|
364
|
+
* legacy (`skill:{id}\n`, `cli:{name}\n`) and current
|
|
365
|
+
* (`The "..." skill (id) is available.`, `The "assistant ..." CLI command`)
|
|
366
|
+
* seeding systems — keeping the SQL filter in sync with `isCapabilityNode`.
|
|
367
|
+
*
|
|
368
|
+
* Used as a cold-start fallback for context-load capability injection when
|
|
369
|
+
* no semantic-search candidates are capability nodes (e.g. fresh assistants
|
|
370
|
+
* whose embedding jobs haven't completed yet). The content-pattern filter
|
|
371
|
+
* prevents organic procedural memories from crowding out real capabilities.
|
|
372
|
+
*/
|
|
373
|
+
export function queryCapabilityNodes(
|
|
374
|
+
scopeId: string,
|
|
375
|
+
limit: number,
|
|
376
|
+
): MemoryNode[] {
|
|
377
|
+
const db = getDb();
|
|
378
|
+
const rows = db
|
|
379
|
+
.select()
|
|
380
|
+
.from(memoryGraphNodes)
|
|
381
|
+
.where(
|
|
382
|
+
and(
|
|
383
|
+
eq(memoryGraphNodes.scopeId, scopeId),
|
|
384
|
+
eq(memoryGraphNodes.type, "procedural"),
|
|
385
|
+
sql`${memoryGraphNodes.fidelity} != 'gone'`,
|
|
386
|
+
or(
|
|
387
|
+
sql`${memoryGraphNodes.content} LIKE 'skill:%'`,
|
|
388
|
+
sql`${memoryGraphNodes.content} LIKE 'cli:%'`,
|
|
389
|
+
and(
|
|
390
|
+
sql`${memoryGraphNodes.content} LIKE 'The "%'`,
|
|
391
|
+
sql`${memoryGraphNodes.content} LIKE '% is available.%'`,
|
|
392
|
+
),
|
|
393
|
+
),
|
|
394
|
+
),
|
|
395
|
+
)
|
|
396
|
+
.orderBy(sql`${memoryGraphNodes.significance} DESC`)
|
|
397
|
+
.limit(limit)
|
|
398
|
+
.all();
|
|
399
|
+
return rows.map(rowToNode);
|
|
400
|
+
}
|
|
401
|
+
|
|
361
402
|
/** Count all non-gone nodes in a scope. */
|
|
362
403
|
export function countNodes(scopeId: string): number {
|
|
363
404
|
const db = getDb();
|
|
@@ -14,6 +14,8 @@ import { getWorkspaceDir } from "../../util/platform.js";
|
|
|
14
14
|
import { buildExcerpt, buildFtsMatchQuery } from "../conversation-queries.js";
|
|
15
15
|
import { embedWithRetry } from "../embed.js";
|
|
16
16
|
import { generateSparseEmbedding } from "../embedding-backend.js";
|
|
17
|
+
import { enqueuePkbIndexJob } from "../jobs/embed-pkb-file.js";
|
|
18
|
+
import { PKB_WORKSPACE_SCOPE } from "../pkb/types.js";
|
|
17
19
|
import { searchGraphNodes } from "./graph-search.js";
|
|
18
20
|
import { getNodesByIds } from "./store.js";
|
|
19
21
|
|
|
@@ -249,6 +251,7 @@ async function handleArchiveRecall(
|
|
|
249
251
|
|
|
250
252
|
export interface RememberInput {
|
|
251
253
|
content: string;
|
|
254
|
+
finish_turn?: boolean;
|
|
252
255
|
}
|
|
253
256
|
|
|
254
257
|
export interface RememberResult {
|
|
@@ -286,6 +289,7 @@ export function handleRemember(
|
|
|
286
289
|
// Append to buffer.md
|
|
287
290
|
const bufferPath = join(pkbDir, "buffer.md");
|
|
288
291
|
appendFileSync(bufferPath, entry, "utf-8");
|
|
292
|
+
enqueuePkbReindex(pkbDir, bufferPath);
|
|
289
293
|
|
|
290
294
|
// Append to daily archive
|
|
291
295
|
const yyyy = now.getFullYear();
|
|
@@ -296,6 +300,29 @@ export function handleRemember(
|
|
|
296
300
|
appendFileSync(archivePath, `# ${month} ${day}, ${yyyy}\n\n`, "utf-8");
|
|
297
301
|
}
|
|
298
302
|
appendFileSync(archivePath, entry, "utf-8");
|
|
303
|
+
enqueuePkbReindex(pkbDir, archivePath);
|
|
299
304
|
|
|
300
305
|
return { success: true, message: "Saved to knowledge base." };
|
|
301
306
|
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Fire-and-forget enqueue of a PKB re-index job for a file we just wrote.
|
|
310
|
+
*
|
|
311
|
+
* Always indexes under {@link PKB_WORKSPACE_SCOPE}. See the comment on that
|
|
312
|
+
* constant for why PKB points are not per-conversation-scoped.
|
|
313
|
+
*
|
|
314
|
+
* Wrapped in try/catch so an enqueue failure (e.g. DB hiccup) cannot break
|
|
315
|
+
* the remember call — the write has already succeeded and the user's fact
|
|
316
|
+
* is safe on disk.
|
|
317
|
+
*/
|
|
318
|
+
function enqueuePkbReindex(pkbRoot: string, absPath: string): void {
|
|
319
|
+
try {
|
|
320
|
+
enqueuePkbIndexJob({
|
|
321
|
+
pkbRoot,
|
|
322
|
+
absPath,
|
|
323
|
+
memoryScopeId: PKB_WORKSPACE_SCOPE,
|
|
324
|
+
});
|
|
325
|
+
} catch (err) {
|
|
326
|
+
log.warn({ err, absPath }, "Failed to enqueue PKB re-index job");
|
|
327
|
+
}
|
|
328
|
+
}
|
|
@@ -82,7 +82,7 @@ export const graphRecallDefinition: ToolDefinition = {
|
|
|
82
82
|
export const graphRememberDefinition: ToolDefinition = {
|
|
83
83
|
name: "remember",
|
|
84
84
|
description:
|
|
85
|
-
"Save a fact to your knowledge base. Call this AGGRESSIVELY — capture anything concrete about their life: preferences, locations, names, dates, habits, opinions, health details, plans, relationship facts, routines, commitments. Default to remembering; only skip obvious noise (small talk, hypotheticals, things they're just musing about). Don't judge importance — filing decides that later. Examples: 'Prefers UberEats over DoorDash', 'Lives in NYC, from Texas', 'Takes
|
|
85
|
+
"Save a fact to your knowledge base. Call this AGGRESSIVELY — capture anything concrete about their life: preferences, locations, names, dates, habits, opinions, health details, plans, relationship facts, routines, commitments. Default to remembering; only skip obvious noise (small talk, hypotheticals, things they're just musing about). Don't judge importance — filing decides that later. Examples: 'Prefers UberEats over DoorDash', 'Lives in NYC, from Texas', 'Takes daily medication, tapering dose', 'Partner Alex lives in Austin', 'Watches a weekly show on Saturday nights', 'Conference in May'. Call this multiple times per conversation — it's cheap (one line appended to a file). Don't wait until the end. Don't batch. Every new fact, immediately. Remembering too much is infinitely better than forgetting something that mattered. CORRECTIONS are the highest priority — when the user corrects a fact you had wrong, `remember` the correction immediately. The wrong version is already propagated in your prior turns and memory graph; skipping a correction means future-you keeps operating on the old value. Never skip a correction even if you'd skip the equivalent fresh fact.",
|
|
86
86
|
input_schema: {
|
|
87
87
|
type: "object",
|
|
88
88
|
properties: {
|
|
@@ -91,6 +91,11 @@ export const graphRememberDefinition: ToolDefinition = {
|
|
|
91
91
|
description:
|
|
92
92
|
"The fact to remember. Write naturally — a preference, a detail, a commitment, a plan. No need to categorize.",
|
|
93
93
|
},
|
|
94
|
+
finish_turn: {
|
|
95
|
+
type: "boolean",
|
|
96
|
+
description:
|
|
97
|
+
"Set to true ONLY on the final `remember` call when you have nothing else to say and want to hand control back to the user. When true, the assistant turn ends after this tool call and no further LLM call is made. Do NOT set true on intermediate `remember` calls. Default: false.",
|
|
98
|
+
},
|
|
94
99
|
},
|
|
95
100
|
required: ["content"],
|
|
96
101
|
},
|
package/src/memory/indexer.ts
CHANGED
|
@@ -203,11 +203,11 @@ export async function indexMessageNow(
|
|
|
203
203
|
);
|
|
204
204
|
|
|
205
205
|
// ── Auto-analysis triggers ─────────────────────────────────────
|
|
206
|
-
//
|
|
207
|
-
//
|
|
208
|
-
//
|
|
209
|
-
//
|
|
210
|
-
//
|
|
206
|
+
// Immediate triggers (batch, compaction) and debounced triggers
|
|
207
|
+
// (idle, lifecycle) write to separate rows keyed by triggerGroup
|
|
208
|
+
// via `upsertAutoAnalysisJob`. When an immediate trigger fires,
|
|
209
|
+
// it cancels any pending debounced row for the same conversation
|
|
210
|
+
// to avoid redundant analysis runs.
|
|
211
211
|
enqueueAutoAnalysisIfEnabled({
|
|
212
212
|
conversationId: input.conversationId,
|
|
213
213
|
trigger: "idle",
|