@vellumai/assistant 0.8.4 → 0.8.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/AGENTS.md +33 -1
- package/ARCHITECTURE.md +3 -3
- package/bunfig.toml +6 -1
- package/docs/browser-use-architecture-phase2.md +1 -1
- package/docs/credential-execution-service.md +6 -6
- package/docs/plugins.md +4 -3
- package/knip.json +2 -1
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +12 -13
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +4 -1
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +16 -14
- package/openapi.yaml +2748 -216
- package/package.json +1 -1
- package/src/__tests__/actor-token-service.test.ts +3 -2
- package/src/__tests__/agent-loop-exit-reason.test.ts +102 -9
- package/src/__tests__/agent-loop-override-profile.test.ts +2 -1
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +1 -0
- package/src/__tests__/agent-wake-override-profile.test.ts +1 -0
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -2
- package/src/__tests__/annotate-risk-options.test.ts +1 -0
- package/src/__tests__/anthropic-provider.test.ts +34 -37
- package/src/__tests__/approval-cascade.test.ts +1 -0
- package/src/__tests__/approval-routes-http.test.ts +9 -13
- package/src/__tests__/assert-not-live-db.ts +79 -0
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +12 -28
- package/src/__tests__/audit-log-rotation.test.ts +72 -18
- package/src/__tests__/auto-analysis-end-to-end.test.ts +6 -6
- package/src/__tests__/background-workers-disk-pressure.test.ts +8 -11
- package/src/__tests__/browser-skill-endstate.test.ts +3 -3
- package/src/__tests__/btw-routes.test.ts +5 -5
- package/src/__tests__/call-controller.test.ts +3 -3
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +3 -2
- package/src/__tests__/channel-guardian.test.ts +6 -5
- package/src/__tests__/channel-readiness-slack-remote.test.ts +175 -0
- package/src/__tests__/channel-reply-delivery.test.ts +35 -0
- package/src/__tests__/channel-retry-sweep.test.ts +320 -3
- package/src/__tests__/checker.test.ts +18 -27
- package/src/__tests__/compaction-events.test.ts +2 -0
- package/src/__tests__/compaction-trail-store.test.ts +264 -0
- package/src/__tests__/compactor-call-site-logging.test.ts +215 -0
- package/src/__tests__/compactor-preserved-tail-count.test.ts +1 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +12 -16
- package/src/__tests__/computer-use-tools.test.ts +14 -18
- package/src/__tests__/config-loader-backfill.test.ts +13 -28
- package/src/__tests__/config-loader-corrupt.test.ts +5 -5
- package/src/__tests__/config-loader-platform-defaults.test.ts +93 -26
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +3 -3
- package/src/__tests__/config-managed-gemini-defaults.test.ts +3 -4
- package/src/__tests__/config-schema.test.ts +10 -10
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/connection-model-compat.test.ts +83 -0
- package/src/__tests__/contacts-tools.test.ts +3 -2
- package/src/__tests__/context-token-estimator.test.ts +22 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +5 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +55 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +231 -2
- package/src/__tests__/conversation-agent-loop.test.ts +581 -54
- package/src/__tests__/conversation-analysis-routes.test.ts +1 -0
- package/src/__tests__/conversation-app-control-instantiation.test.ts +31 -24
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -0
- package/src/__tests__/conversation-attention-store.test.ts +101 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +3 -2
- package/src/__tests__/conversation-clear-safety.test.ts +25 -25
- package/src/__tests__/conversation-confirmation-signals.test.ts +1 -0
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-error.test.ts +61 -0
- package/src/__tests__/conversation-fork-crud.test.ts +239 -15
- package/src/__tests__/conversation-fork-route.test.ts +3 -2
- package/src/__tests__/conversation-history-web-search.test.ts +1 -0
- package/src/__tests__/conversation-inference-profile-list.test.ts +3 -2
- package/src/__tests__/conversation-inference-profile-route.test.ts +3 -2
- package/src/__tests__/conversation-lifecycle.test.ts +53 -11
- package/src/__tests__/conversation-list-source.test.ts +3 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +2 -1
- package/src/__tests__/{conversation-load-cleaned-at.test.ts → conversation-load-history-stripped.test.ts} +14 -13
- package/src/__tests__/conversation-pairing.test.ts +53 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +26 -7
- package/src/__tests__/conversation-process-callsite.test.ts +1 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/conversation-queue.test.ts +333 -291
- package/src/__tests__/conversation-routes-disk-view.test.ts +112 -18
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +33 -8
- package/src/__tests__/conversation-routes-slash-commands.test.ts +68 -2
- package/src/__tests__/conversation-runtime-assembly.test.ts +78 -0
- package/src/__tests__/conversation-skill-tools.test.ts +40 -147
- package/src/__tests__/conversation-slash-queue.test.ts +84 -32
- package/src/__tests__/conversation-slash-unknown.test.ts +5 -0
- package/src/__tests__/conversation-speed-override.test.ts +1 -0
- package/src/__tests__/conversation-store.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +46 -0
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-standalone.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -3
- package/src/__tests__/conversation-surfaces-table-action.test.ts +7 -17
- package/src/__tests__/conversation-sync-tags.test.ts +218 -35
- package/src/__tests__/conversation-title-service.test.ts +1 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +30 -0
- package/src/__tests__/conversation-usage.test.ts +1 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -1
- package/src/__tests__/credential-broker-browser-fill.test.ts +3 -3
- package/src/__tests__/credential-broker-server-use.test.ts +5 -5
- package/src/__tests__/credential-execution-client.test.ts +72 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +19 -19
- package/src/__tests__/credential-execution-tools.test.ts +6 -6
- package/src/__tests__/credential-health-service.test.ts +252 -3
- package/src/__tests__/credential-security-invariants.test.ts +6 -5
- package/src/__tests__/credential-vault-unit.test.ts +21 -21
- package/src/__tests__/credential-vault.test.ts +5 -5
- package/src/__tests__/cross-provider-web-search.test.ts +56 -2
- package/src/__tests__/db-connection-isolation.test.ts +7 -6
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +8 -10
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +7 -10
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +9 -15
- package/src/__tests__/db-test-helpers.ts +58 -0
- package/src/__tests__/disk-pressure-guard.test.ts +58 -41
- package/src/__tests__/disk-pressure-lifecycle.test.ts +13 -10
- package/src/__tests__/disk-pressure-routes.test.ts +0 -33
- package/src/__tests__/disk-pressure-tools.test.ts +0 -4
- package/src/__tests__/dm-persistence.test.ts +26 -40
- package/src/__tests__/document-create-dedupe.test.ts +189 -0
- package/src/__tests__/document-find-replace.test.ts +3 -2
- package/src/__tests__/document-tool-security.test.ts +81 -2
- package/src/__tests__/dynamic-page-surface.test.ts +2 -2
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +5 -4
- package/src/__tests__/email-html-renderer.test.ts +12 -0
- package/src/__tests__/encrypted-store-test-helpers.ts +56 -0
- package/src/__tests__/encrypted-store.test.ts +11 -9
- package/src/__tests__/feature-flag-test-helpers.ts +53 -0
- package/src/__tests__/filing-service.test.ts +1 -0
- package/src/__tests__/first-greeting.test.ts +62 -12
- package/src/__tests__/gateway-flag-listener.test.ts +236 -0
- package/src/__tests__/gemini-provider.test.ts +104 -0
- package/src/__tests__/guardian-action-sweep.test.ts +3 -2
- package/src/__tests__/guardian-dispatch.test.ts +0 -1
- package/src/__tests__/guardian-outbound-http.test.ts +10 -7
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +48 -3
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +5 -0
- package/src/__tests__/heartbeat-service.test.ts +5 -0
- package/src/__tests__/helpers/mock-logger.ts +26 -0
- package/src/__tests__/host-bash-routes.test.ts +1 -0
- package/src/__tests__/host-cu-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-file-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-shell-tool.test.ts +6 -5
- package/src/__tests__/host-transfer-routes-targeted.test.ts +1 -0
- package/src/__tests__/http-conversation-lineage.test.ts +3 -2
- package/src/__tests__/http-user-message-parity.test.ts +29 -7
- package/src/__tests__/identity-intro-cache.test.ts +133 -22
- package/src/__tests__/inbound-slack-persistence.test.ts +44 -72
- package/src/__tests__/inference-profile-reaper.test.ts +3 -2
- package/src/__tests__/inference-profile-session-ipc.test.ts +3 -2
- package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
- package/src/__tests__/injector-disk-pressure.test.ts +3 -17
- package/src/__tests__/inline-skill-load-permissions.test.ts +4 -4
- package/src/__tests__/list-messages-hidden-metadata.test.ts +80 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +70 -11
- package/src/__tests__/llm-context-normalization.test.ts +42 -0
- package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
- package/src/__tests__/llm-resolver.test.ts +408 -9
- package/src/__tests__/llm-schema.test.ts +1 -1
- package/src/__tests__/llm-usage-store.test.ts +66 -0
- package/src/__tests__/logger.test.ts +89 -0
- package/src/__tests__/manual-token-reconciliation.test.ts +76 -1
- package/src/__tests__/mcp-abort-signal.test.ts +16 -2
- package/src/__tests__/mcp-client-auth.test.ts +14 -0
- package/src/__tests__/media-generate-image.test.ts +31 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
- package/src/__tests__/messaging-send-tool.test.ts +1 -0
- package/src/__tests__/migration-import-from-url.test.ts +3 -3
- package/src/__tests__/mock-gateway-ipc.ts +18 -2
- package/src/__tests__/model-intents.test.ts +4 -6
- package/src/__tests__/native-web-search.test.ts +30 -2
- package/src/__tests__/notification-deep-link.test.ts +62 -0
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/oauth-commands-routes.test.ts +37 -0
- package/src/__tests__/oauth-provider-visibility.test.ts +8 -8
- package/src/__tests__/oauth-store.test.ts +3 -2
- package/src/__tests__/onboarding-template-contract.test.ts +4 -3
- package/src/__tests__/openai-provider.test.ts +54 -9
- package/src/__tests__/openai-responses-provider.test.ts +176 -14
- package/src/__tests__/openrouter-provider-only.test.ts +27 -5
- package/src/__tests__/outbound-slack-persistence.test.ts +46 -1
- package/src/__tests__/pending-interactions-resolved-event.test.ts +0 -1
- package/src/__tests__/persistence-pipeline.test.ts +139 -1
- package/src/__tests__/persistence-secret-redaction.test.ts +83 -12
- package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
- package/src/__tests__/platform.test.ts +2 -2
- package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
- package/src/__tests__/plugin-bootstrap.test.ts +11 -13
- package/src/__tests__/plugin-tool-contribution.test.ts +50 -40
- package/src/__tests__/plugin-types.test.ts +3 -2
- package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
- package/src/__tests__/pricing.test.ts +12 -0
- package/src/__tests__/process-message-background-slack.test.ts +21 -16
- package/src/__tests__/process-message-display-content.test.ts +19 -22
- package/src/__tests__/provider-catalog-visibility.test.ts +9 -9
- package/src/__tests__/provider-platform-proxy-integration.test.ts +216 -4
- package/src/__tests__/provider-registry-ollama.test.ts +45 -22
- package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
- package/src/__tests__/recording-handler.test.ts +1 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +84 -84
- package/src/__tests__/relay-server.test.ts +10 -10
- package/src/__tests__/require-fresh-approval.test.ts +2 -2
- package/src/__tests__/runtime-attachment-metadata.test.ts +3 -2
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
- package/src/__tests__/schedule-store.test.ts +16 -1
- package/src/__tests__/scheduler-reuse-conversation.test.ts +48 -3
- package/src/__tests__/secret-ingress-http.test.ts +5 -1
- package/src/__tests__/secure-keys.test.ts +3 -3
- package/src/__tests__/send-endpoint-busy.test.ts +81 -42
- package/src/__tests__/server-history-render.test.ts +4 -1
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
- package/src/__tests__/skill-feature-flags-integration.test.ts +8 -10
- package/src/__tests__/skill-feature-flags.test.ts +16 -18
- package/src/__tests__/skill-load-feature-flag.test.ts +5 -5
- package/src/__tests__/skill-projection-feature-flag.test.ts +48 -37
- package/src/__tests__/skill-projection.benchmark.test.ts +7 -13
- package/src/__tests__/skill-tool-factory.test.ts +97 -96
- package/src/__tests__/slack-channel-config.test.ts +3 -3
- package/src/__tests__/subagent-call-site-routing.test.ts +11 -3
- package/src/__tests__/subagent-disposal.test.ts +27 -8
- package/src/__tests__/subagent-fork-notifications.test.ts +24 -9
- package/src/__tests__/subagent-fork-spawn.test.ts +13 -4
- package/src/__tests__/subagent-manager-notify.test.ts +20 -8
- package/src/__tests__/subagent-notify-parent.test.ts +6 -5
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +58 -0
- package/src/__tests__/subagent-tools.test.ts +2 -1
- package/src/__tests__/suggestion-routes.test.ts +2 -0
- package/src/__tests__/sync-message-contract.test.ts +59 -0
- package/src/__tests__/system-prompt.test.ts +183 -131
- package/src/__tests__/terminal-tools.test.ts +1 -1
- package/src/__tests__/test-preload-verifier.ts +68 -0
- package/src/__tests__/test-preload.ts +32 -39
- package/src/__tests__/tool-approval-handler.test.ts +1 -5
- package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +35 -12
- package/src/__tests__/tool-executor.test.ts +64 -72
- package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
- package/src/__tests__/tool-preview-lifecycle.test.ts +1 -0
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/twilio-routes.test.ts +3 -2
- package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
- package/src/__tests__/usage-routes.test.ts +3 -0
- package/src/__tests__/validate-input.test.ts +381 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +3 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +2 -1
- package/src/__tests__/voice-session-bridge.test.ts +37 -28
- package/src/__tests__/workspace-git-service.test.ts +6 -5
- package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
- package/src/__tests__/workspace-migration-090-memory-router-cost-optimized-profile.test.ts +326 -0
- package/src/__tests__/workspace-migration-091-retighten-migration-onboarding-thread.test.ts +166 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
- package/src/acp/prepare-agent-env.ts +78 -0
- package/src/acp/session-manager.ts +6 -7
- package/src/agent/loop.ts +88 -0
- package/src/api/README.md +127 -0
- package/src/api/constants/call-sites.ts +27 -0
- package/src/api/events/assistant-outbound-attachment.ts +51 -0
- package/src/api/events/assistant-text-delta.ts +32 -0
- package/src/api/events/assistant-turn-start.ts +33 -0
- package/src/api/events/document-comment-created.ts +48 -0
- package/src/api/events/document-comment-deleted.ts +24 -0
- package/src/api/events/document-comment-reopened.ts +25 -0
- package/src/api/events/document-comment-resolved.ts +27 -0
- package/src/api/events/generation-cancelled.ts +24 -0
- package/src/api/events/generation-handoff.ts +41 -0
- package/src/api/events/message-complete.ts +42 -0
- package/src/api/events/open-url.ts +30 -0
- package/src/api/events/relationship-state-updated.ts +25 -0
- package/src/api/events/tool-use-start.ts +32 -0
- package/src/api/index.ts +129 -0
- package/src/api/package.json +10 -0
- package/src/api/responses/llm-context-response.ts +39 -0
- package/src/api/responses/llm-request-log-entry.ts +93 -0
- package/src/api/responses/memory-recall-log.ts +65 -0
- package/src/api/responses/memory-v2-activation-log.ts +78 -0
- package/src/background-wake/background-wake-routes.test.ts +868 -0
- package/src/background-wake/platform-client.test.ts +308 -0
- package/src/background-wake/platform-client.ts +167 -0
- package/src/background-wake/publisher.ts +91 -0
- package/src/background-wake/runtime-registry.ts +24 -0
- package/src/background-wake/wake-intent-hooks.test.ts +282 -0
- package/src/calls/guardian-dispatch.ts +1 -0
- package/src/calls/voice-session-bridge.ts +4 -4
- package/src/cli/commands/__tests__/browser.test.ts +23 -5
- package/src/cli/commands/__tests__/conversations-slack.test.ts +16 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
- package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
- package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +1 -0
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
- package/src/cli/commands/__tests__/notifications.test.ts +184 -40
- package/src/cli/commands/browser.ts +247 -0
- package/src/cli/commands/channels/__tests__/channels.test.ts +143 -0
- package/src/cli/commands/channels/index.ts +229 -0
- package/src/cli/commands/domain.ts +91 -41
- package/src/cli/commands/inference.ts +93 -40
- package/src/cli/commands/memory-v2-compare-render.ts +115 -0
- package/src/cli/commands/memory-v2.ts +176 -1
- package/src/cli/commands/memory-v3-render.ts +491 -0
- package/src/cli/commands/memory-v3.ts +567 -0
- package/src/cli/commands/notifications.ts +365 -55
- package/src/cli/lib/open-browser.ts +7 -2
- package/src/cli/program.ts +4 -0
- package/src/config/assistant-feature-flags.ts +39 -46
- package/src/config/bundled-skills/document-editor/SKILL.md +16 -3
- package/src/config/bundled-skills/document-editor/TOOLS.json +18 -0
- package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
- package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +1 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +2 -2
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -0
- package/src/config/bundled-tool-registry.ts +2 -0
- package/src/config/call-site-defaults.ts +8 -7
- package/src/config/feature-flag-cache.ts +86 -0
- package/src/config/feature-flag-registry.json +33 -17
- package/src/config/llm-context-resolution.ts +10 -1
- package/src/config/llm-resolver.ts +121 -15
- package/src/config/loader.ts +4 -5
- package/src/config/schemas/__tests__/memory-v2.test.ts +228 -1
- package/src/config/schemas/call-site-catalog.ts +21 -7
- package/src/config/schemas/heartbeat.ts +1 -1
- package/src/config/schemas/llm.ts +102 -2
- package/src/config/schemas/memory-v2.ts +272 -0
- package/src/config/schemas/memory.ts +2 -1
- package/src/config/schemas/services.ts +6 -2
- package/src/config/seed-inference-profiles.ts +36 -16
- package/src/context/compactor.ts +52 -0
- package/src/context/token-estimator.ts +10 -5
- package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
- package/src/conversations/message-consolidation.ts +404 -0
- package/src/credential-execution/executable-discovery.ts +40 -0
- package/src/credential-execution/process-manager.ts +6 -2
- package/src/credential-health/credential-health-service.ts +125 -40
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -6
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +13 -15
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +2 -3
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -0
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +25 -12
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +1 -0
- package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +107 -0
- package/src/daemon/__tests__/web-search-status-text.test.ts +1 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +390 -80
- package/src/daemon/conversation-agent-loop.ts +244 -90
- package/src/daemon/conversation-error.ts +64 -6
- package/src/daemon/conversation-lifecycle.ts +27 -22
- package/src/daemon/conversation-messaging.ts +84 -43
- package/src/daemon/conversation-process.ts +74 -37
- package/src/daemon/conversation-runtime-assembly.ts +38 -17
- package/src/daemon/conversation-skill-tools.ts +14 -30
- package/src/daemon/conversation-surfaces.ts +69 -34
- package/src/daemon/conversation-tool-setup.ts +77 -32
- package/src/daemon/conversation-usage.ts +2 -0
- package/src/daemon/conversation.ts +40 -75
- package/src/daemon/daemon-control.ts +1 -1
- package/src/daemon/daemon-skill-host.ts +9 -2
- package/src/daemon/disk-pressure-guard.ts +39 -29
- package/src/daemon/first-greeting.ts +31 -13
- package/src/daemon/handlers/config-model.test.ts +1 -0
- package/src/daemon/handlers/conversations.ts +11 -3
- package/src/daemon/handlers/shared.ts +6 -1
- package/src/daemon/host-browser-proxy.ts +5 -5
- package/src/daemon/host-cu-proxy.ts +4 -4
- package/src/daemon/host-file-proxy.ts +4 -4
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/host-transfer-proxy.ts +10 -10
- package/src/daemon/lifecycle.ts +29 -26
- package/src/daemon/mcp-reload-service.ts +1 -1
- package/src/daemon/meet-manifest-loader.ts +11 -24
- package/src/daemon/message-types/conversations.ts +22 -27
- package/src/daemon/message-types/document-comments.ts +8 -44
- package/src/daemon/message-types/home.ts +2 -14
- package/src/daemon/message-types/integrations.ts +2 -7
- package/src/daemon/message-types/messages.ts +25 -48
- package/src/daemon/message-types/subagents.ts +6 -0
- package/src/daemon/message-types/sync.ts +14 -0
- package/src/daemon/process-message.ts +9 -9
- package/src/daemon/providers-setup.ts +1 -1
- package/src/daemon/server.ts +16 -0
- package/src/daemon/shutdown-handlers.ts +24 -5
- package/src/daemon/switch-inference-profile-tool.ts +62 -0
- package/src/daemon/tool-setup-types.ts +7 -0
- package/src/daemon/wake-target-adapter.ts +10 -0
- package/src/documents/document-store.ts +38 -0
- package/src/export/__tests__/transcript-formatter.test.ts +1 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +30 -1
- package/src/heartbeat/heartbeat-service.ts +63 -0
- package/src/home/__tests__/feed-writer.test.ts +161 -0
- package/src/home/__tests__/post-connect-feed.test.ts +1 -0
- package/src/home/__tests__/suggested-prompts.test.ts +55 -59
- package/src/home/feed-writer.ts +146 -7
- package/src/home/home-greeting.ts +0 -9
- package/src/home/suggested-prompts.ts +27 -154
- package/src/ipc/__tests__/cli-ipc.test.ts +1 -0
- package/src/ipc/gateway-client.test.ts +4 -1
- package/src/ipc/gateway-flag-listener.ts +123 -0
- package/src/ipc/skill-routes/__tests__/memory.test.ts +1 -0
- package/src/ipc/skill-routes/__tests__/registries.test.ts +36 -7
- package/src/ipc/skill-routes/memory.ts +4 -3
- package/src/ipc/skill-routes/registries.ts +35 -40
- package/src/memory/__tests__/db-async-query.test.ts +165 -0
- package/src/memory/__tests__/db-maintenance.test.ts +115 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +242 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +26 -5
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +1 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +8 -0
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +1 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +31 -0
- package/src/memory/auto-analysis-enqueue.ts +5 -1
- package/src/memory/conversation-attention-store.ts +17 -3
- package/src/memory/conversation-crud.ts +423 -182
- package/src/memory/conversation-starters-cadence.ts +3 -1
- package/src/memory/conversation-title-service.ts +19 -3
- package/src/memory/db-async-query.ts +214 -0
- package/src/memory/db-connection.ts +29 -19
- package/src/memory/db-init.ts +14 -0
- package/src/memory/db-maintenance.ts +30 -21
- package/src/memory/db-singleton.ts +77 -0
- package/src/memory/delivery-channels.ts +82 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +2 -4
- package/src/memory/graph/bootstrap.ts +8 -1
- package/src/memory/graph/capability-seed.ts +7 -3
- package/src/memory/graph/conversation-graph-memory.ts +100 -17
- package/src/memory/graph/extraction.ts +1 -5
- package/src/memory/graph/graph-search.ts +7 -1
- package/src/memory/graph/retriever.test.ts +3 -3
- package/src/memory/indexer.ts +28 -18
- package/src/memory/job-handlers/cleanup.ts +76 -18
- package/src/memory/job-handlers/conversation-starters.ts +1 -4
- package/src/memory/job-handlers/embedding.test.ts +3 -2
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -2
- package/src/memory/jobs/embed-pkb-file.ts +6 -1
- package/src/memory/jobs-store.ts +14 -0
- package/src/memory/jobs-worker.ts +66 -22
- package/src/memory/llm-request-log-source-clickhouse.ts +122 -2
- package/src/memory/llm-request-log-source-local.ts +31 -0
- package/src/memory/llm-request-log-source.ts +40 -2
- package/src/memory/llm-request-log-store.ts +228 -1
- package/src/memory/llm-usage-store.ts +24 -0
- package/src/memory/memory-retrospective-enqueue.ts +8 -1
- package/src/memory/memory-retrospective-job.ts +5 -0
- package/src/memory/memory-v2-activation-log-store.ts +110 -7
- package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
- package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
- package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
- package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
- package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
- package/src/memory/migrations/265-drop-provider-connection-status.ts +26 -0
- package/src/memory/migrations/266-messages-client-message-id.ts +43 -0
- package/src/memory/migrations/index.ts +19 -0
- package/src/memory/migrations/registry.ts +33 -0
- package/src/memory/schema/conversations.ts +10 -2
- package/src/memory/schema/inference.ts +0 -1
- package/src/memory/schema/infrastructure.ts +21 -0
- package/src/memory/tool-usage-store.ts +36 -8
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +5 -2
- package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
- package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
- package/src/memory/v2/__tests__/harness-metrics.test.ts +83 -0
- package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +230 -0
- package/src/memory/v2/__tests__/harness-runner.test.ts +135 -0
- package/src/memory/v2/__tests__/injection.test.ts +127 -98
- package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
- package/src/memory/v2/__tests__/router.test.ts +171 -3
- package/src/memory/v2/__tests__/sweep-job.test.ts +6 -3
- package/src/memory/v2/harness/compare.ts +57 -0
- package/src/memory/v2/harness/metrics.ts +128 -0
- package/src/memory/v2/harness/oracle.ts +145 -0
- package/src/memory/v2/harness/replay-input.ts +240 -0
- package/src/memory/v2/harness/retriever.ts +74 -0
- package/src/memory/v2/harness/router-retriever.ts +43 -0
- package/src/memory/v2/harness/runner.ts +112 -0
- package/src/memory/v2/harness/trace.ts +64 -0
- package/src/memory/v2/injection.ts +21 -15
- package/src/memory/v2/prompts/router.ts +26 -1
- package/src/memory/v2/qdrant.ts +14 -2
- package/src/memory/v2/router.ts +171 -18
- package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
- package/src/memory/v3/__tests__/consolidation-job.test.ts +466 -0
- package/src/memory/v3/__tests__/coretrieval-seed.test.ts +270 -0
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
- package/src/memory/v3/__tests__/edges.test.ts +706 -0
- package/src/memory/v3/__tests__/filter.test.ts +560 -0
- package/src/memory/v3/__tests__/gate.test.ts +637 -0
- package/src/memory/v3/__tests__/index-composition.test.ts +291 -0
- package/src/memory/v3/__tests__/loop.test.ts +775 -0
- package/src/memory/v3/__tests__/retriever.test.ts +226 -0
- package/src/memory/v3/__tests__/scouts.test.ts +489 -0
- package/src/memory/v3/__tests__/shadow-diff.test.ts +225 -0
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +398 -0
- package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
- package/src/memory/v3/__tests__/traversal.test.ts +508 -0
- package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
- package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
- package/src/memory/v3/__tests__/tree-walk.test.ts +784 -0
- package/src/memory/v3/__tests__/validate.test.ts +277 -0
- package/src/memory/v3/auto-edges.ts +223 -0
- package/src/memory/v3/coactivation-store.ts +124 -0
- package/src/memory/v3/consolidation-job.ts +323 -0
- package/src/memory/v3/coretrieval-seed.ts +240 -0
- package/src/memory/v3/edge-learning-job.ts +160 -0
- package/src/memory/v3/edges.ts +286 -0
- package/src/memory/v3/filter.ts +286 -0
- package/src/memory/v3/gate.ts +349 -0
- package/src/memory/v3/index-composition.ts +126 -0
- package/src/memory/v3/llm-capture.ts +46 -0
- package/src/memory/v3/loop.ts +430 -0
- package/src/memory/v3/maintenance.ts +144 -0
- package/src/memory/v3/prompt-context.ts +33 -0
- package/src/memory/v3/prompts/consolidation.ts +458 -0
- package/src/memory/v3/prompts/system-prompts.ts +196 -0
- package/src/memory/v3/retriever.ts +33 -0
- package/src/memory/v3/scouts.ts +431 -0
- package/src/memory/v3/shadow-diff.ts +287 -0
- package/src/memory/v3/shadow-middleware.ts +347 -0
- package/src/memory/v3/traversal.ts +211 -0
- package/src/memory/v3/tree-index.ts +237 -0
- package/src/memory/v3/tree-store.ts +394 -0
- package/src/memory/v3/tree-walk.ts +356 -0
- package/src/memory/v3/types.ts +65 -0
- package/src/memory/v3/validate.ts +323 -0
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +1 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +1 -0
- package/src/notifications/adapters/macos.ts +18 -1
- package/src/notifications/adapters/platform.ts +1 -1
- package/src/notifications/adapters/slack.ts +45 -11
- package/src/notifications/broadcaster.ts +114 -63
- package/src/notifications/conversation-pairing.ts +23 -3
- package/src/notifications/decision-engine.ts +1 -4
- package/src/notifications/decisions-store.ts +32 -1
- package/src/notifications/deliveries-store.ts +45 -0
- package/src/notifications/edit-notification.ts +201 -0
- package/src/notifications/emit-signal.ts +40 -50
- package/src/notifications/signal.ts +10 -0
- package/src/notifications/types.ts +37 -0
- package/src/oauth/byo-connection.test.ts +67 -3
- package/src/oauth/byo-connection.ts +32 -5
- package/src/oauth/connect-orchestrator.ts +9 -0
- package/src/oauth/connection-resolver.test.ts +76 -0
- package/src/oauth/connection-resolver.ts +49 -10
- package/src/oauth/manual-token-connection.ts +51 -3
- package/src/oauth/seed-providers.ts +3 -0
- package/src/permissions/approval-policy.test.ts +19 -5
- package/src/permissions/approval-policy.ts +14 -3
- package/src/permissions/checker.ts +21 -8
- package/src/permissions/prompter.ts +3 -3
- package/src/permissions/question-prompter.ts +5 -2
- package/src/permissions/secret-prompter.ts +2 -2
- package/src/platform/client.test.ts +24 -1
- package/src/platform/client.ts +8 -0
- package/src/platform/feature-gate.ts +15 -0
- package/src/plugin-api/index.ts +4 -0
- package/src/plugin-api/types.ts +7 -33
- package/src/plugins/defaults/index.ts +6 -0
- package/src/plugins/defaults/injectors.ts +20 -19
- package/src/plugins/defaults/persistence.ts +25 -6
- package/src/plugins/external-plugin-loader.ts +5 -68
- package/src/plugins/types.ts +68 -29
- package/src/proactive-artifact/aux-message-injector.ts +17 -4
- package/src/proactive-artifact/job.test.ts +1 -0
- package/src/prompts/__tests__/system-prompt.test.ts +4 -4
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
- package/src/prompts/persona-resolver.ts +36 -21
- package/src/prompts/sections.ts +39 -7
- package/src/prompts/system-prompt.ts +84 -221
- package/src/prompts/template-detection.ts +10 -4
- package/src/prompts/templates/BOOTSTRAP.md +9 -13
- package/src/prompts/templates/IDENTITY.md +0 -2
- package/src/prompts/templates/system-sections.ts +230 -8
- package/src/providers/__tests__/connection-model-compat.test.ts +233 -0
- package/src/providers/__tests__/registry-native-web-search.test.ts +122 -0
- package/src/providers/__tests__/retry-callsite.test.ts +85 -5
- package/src/providers/anthropic/client.ts +32 -66
- package/src/providers/call-site-routing.ts +42 -6
- package/src/providers/connection-model-compat.ts +61 -0
- package/src/providers/connection-resolution.ts +47 -14
- package/src/providers/fireworks/client.ts +1 -0
- package/src/providers/gemini/client.ts +70 -6
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +0 -2
- package/src/providers/inference/__tests__/base-url-security.test.ts +2 -3
- package/src/providers/inference/__tests__/{connections-status-label.test.ts → connections-label.test.ts} +12 -111
- package/src/providers/inference/adapter-factory.ts +3 -0
- package/src/providers/inference/auth.ts +0 -8
- package/src/providers/inference/connections.ts +3 -66
- package/src/providers/inference/resolve-auth.ts +2 -3
- package/src/providers/minimax/client.ts +106 -0
- package/src/providers/model-catalog.ts +78 -1
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +157 -5
- package/src/providers/openai/chat-completions-provider.ts +116 -15
- package/src/providers/openai/codex-models.ts +20 -0
- package/src/providers/openai/responses-provider.ts +87 -30
- package/src/providers/openrouter/client.ts +13 -8
- package/src/providers/provider-send-message.ts +20 -5
- package/src/providers/registry.ts +48 -8
- package/src/providers/retry.ts +50 -7
- package/src/providers/search-provider-catalog.ts +17 -9
- package/src/providers/thinking-config.ts +26 -1
- package/src/providers/types.ts +9 -0
- package/src/providers/usage-tracking.ts +2 -0
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/__tests__/agent-wake.test.ts +1 -0
- package/src/runtime/__tests__/background-job-runner.test.ts +1 -0
- package/src/runtime/access-request-helper.ts +1 -0
- package/src/runtime/agent-wake.ts +1 -0
- package/src/runtime/assistant-event-hub.ts +76 -6
- package/src/runtime/auth/route-policy.ts +46 -0
- package/src/runtime/btw-sidechain.ts +0 -6
- package/src/runtime/channel-readiness-service.ts +68 -0
- package/src/runtime/channel-reply-delivery.ts +23 -0
- package/src/runtime/channel-retry-sweep.ts +47 -14
- package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
- package/src/runtime/http-types.ts +0 -2
- package/src/runtime/migrations/vbundle-builder.ts +12 -4
- package/src/runtime/pending-interactions.ts +0 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -0
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +406 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +204 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +209 -1
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -50
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +76 -9
- package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +35 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +3 -2
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +294 -0
- package/src/runtime/routes/__tests__/task-routes.test.ts +48 -3
- package/src/runtime/routes/acp-routes-list.test.ts +3 -0
- package/src/runtime/routes/acp-routes.test.ts +255 -6
- package/src/runtime/routes/acp-routes.ts +8 -1
- package/src/runtime/routes/app-management-routes.ts +111 -4
- package/src/runtime/routes/avatar-routes.ts +10 -10
- package/src/runtime/routes/background-wake-routes.ts +356 -0
- package/src/runtime/routes/browser-tabs-routes.ts +200 -0
- package/src/runtime/routes/btw-routes.ts +4 -10
- package/src/runtime/routes/conversation-analysis-routes.ts +6 -0
- package/src/runtime/routes/conversation-cli-routes.ts +1 -1
- package/src/runtime/routes/conversation-compaction-routes.ts +263 -0
- package/src/runtime/routes/conversation-list-routes.ts +159 -4
- package/src/runtime/routes/conversation-management-routes.ts +108 -26
- package/src/runtime/routes/conversation-query-routes.ts +200 -44
- package/src/runtime/routes/conversation-routes.ts +409 -521
- package/src/runtime/routes/conversation-starter-routes.ts +6 -3
- package/src/runtime/routes/conversations-import-routes.ts +19 -6
- package/src/runtime/routes/disk-pressure-routes.ts +1 -1
- package/src/runtime/routes/documents-routes.ts +10 -1
- package/src/runtime/routes/domain-routes.ts +60 -10
- package/src/runtime/routes/email-routes.ts +5 -2
- package/src/runtime/routes/events-routes.ts +54 -10
- package/src/runtime/routes/group-routes.ts +35 -8
- package/src/runtime/routes/home-feed-routes.ts +129 -0
- package/src/runtime/routes/host-browser-routes.ts +10 -2
- package/src/runtime/routes/host-cu-routes.ts +2 -2
- package/src/runtime/routes/identity-intro-cache.ts +61 -16
- package/src/runtime/routes/identity-routes.ts +30 -9
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +530 -6
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +57 -8
- package/src/runtime/routes/index.ts +10 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
- package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
- package/src/runtime/routes/inference-provider-connection-routes.ts +5 -26
- package/src/runtime/routes/integrations/vercel.ts +15 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
- package/src/runtime/routes/llm-context-normalization.ts +7 -2
- package/src/runtime/routes/memory-item-routes.ts +8 -3
- package/src/runtime/routes/memory-v2-routes.ts +215 -5
- package/src/runtime/routes/memory-v3-routes.ts +474 -0
- package/src/runtime/routes/migration-routes.ts +32 -28
- package/src/runtime/routes/notification-routes.ts +63 -1
- package/src/runtime/routes/oauth-commands-routes.ts +6 -1
- package/src/runtime/routes/plugins-routes.ts +337 -0
- package/src/runtime/routes/rename-conversation-routes.ts +6 -2
- package/src/runtime/routes/secret-routes.ts +25 -5
- package/src/runtime/routes/settings-routes.ts +12 -11
- package/src/runtime/routes/slack-channel-routes.ts +5 -4
- package/src/runtime/routes/surface-action-routes.ts +1 -38
- package/src/runtime/routes/surface-content-routes.ts +12 -5
- package/src/runtime/routes/surface-conversation-resolver.ts +65 -0
- package/src/runtime/routes/wipe-conversation-routes.ts +3 -0
- package/src/runtime/routes/workspace-routes.ts +25 -10
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -0
- package/src/runtime/slack-dm-text-delivery.ts +177 -0
- package/src/runtime/sync/resource-sync-events.ts +106 -38
- package/src/runtime/sync/sync-publisher.test.ts +49 -0
- package/src/runtime/sync/sync-publisher.ts +2 -1
- package/src/runtime/tool-grant-request-helper.ts +1 -0
- package/src/runtime/verification-outbound-actions.ts +73 -1
- package/src/schedule/schedule-store.ts +8 -1
- package/src/schedule/scheduler.ts +111 -15
- package/src/security/__tests__/provider-key-env-fallback.test.ts +3 -3
- package/src/security/encrypted-store.ts +7 -16
- package/src/security/store-path-override.ts +61 -0
- package/src/signals/user-message.ts +5 -8
- package/src/skills/validate-input.ts +177 -0
- package/src/subagent/manager.ts +13 -13
- package/src/subagent/types.ts +6 -0
- package/src/tasks/tool-sanitizer.ts +2 -2
- package/src/telemetry/types.ts +12 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/acp/spawn.test.ts +119 -0
- package/src/tools/acp/spawn.ts +15 -2
- package/src/tools/apps/definitions.ts +36 -28
- package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
- package/src/tools/ask-question/ask-question-tool.ts +38 -45
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +2 -8
- package/src/tools/browser/__tests__/pinned-tabs.test.ts +70 -0
- package/src/tools/browser/browser-execution.ts +16 -3
- package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +3 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +12 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +27 -1
- package/src/tools/browser/cdp-client/factory.ts +100 -17
- package/src/tools/browser/cdp-client/local-cdp-client.ts +12 -0
- package/src/tools/browser/cdp-client/types.ts +65 -0
- package/src/tools/browser/pinned-tabs.ts +96 -40
- package/src/tools/computer-use/definitions.ts +282 -336
- package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
- package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
- package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
- package/src/tools/credentials/vault.ts +3 -9
- package/src/tools/document/document-tool.ts +189 -7
- package/src/tools/execution-target.ts +18 -23
- package/src/tools/executor.ts +24 -56
- package/src/tools/filesystem/edit.ts +3 -9
- package/src/tools/filesystem/list.ts +3 -9
- package/src/tools/filesystem/read.ts +3 -9
- package/src/tools/filesystem/write.ts +3 -9
- package/src/tools/host-filesystem/edit.test.ts +1 -0
- package/src/tools/host-filesystem/edit.ts +3 -9
- package/src/tools/host-filesystem/read.test.ts +1 -0
- package/src/tools/host-filesystem/read.ts +3 -9
- package/src/tools/host-filesystem/transfer.test.ts +31 -6
- package/src/tools/host-filesystem/transfer.ts +3 -9
- package/src/tools/host-filesystem/write.test.ts +1 -0
- package/src/tools/host-filesystem/write.ts +3 -9
- package/src/tools/host-terminal/host-shell.ts +3 -9
- package/src/tools/mcp/mcp-tool-factory.ts +1 -10
- package/src/tools/memory/register.test.ts +1 -1
- package/src/tools/memory/register.ts +4 -9
- package/src/tools/network/__tests__/managed-search-proxy.test.ts +282 -0
- package/src/tools/network/__tests__/web-search.test.ts +211 -3
- package/src/tools/network/managed-search-proxy.ts +183 -0
- package/src/tools/network/web-fetch.ts +3 -9
- package/src/tools/network/web-search.ts +224 -76
- package/src/tools/policy-context.ts +3 -1
- package/src/tools/registry.ts +150 -123
- package/src/tools/schedule/create.ts +1 -1
- package/src/tools/schema-transforms.ts +1 -1
- package/src/tools/skills/execute.ts +3 -9
- package/src/tools/skills/load.ts +3 -9
- package/src/tools/skills/skill-tool-factory.ts +18 -44
- package/src/tools/subagent/notify-parent.ts +3 -9
- package/src/tools/subagent/spawn.ts +3 -0
- package/src/tools/system/request-permission.ts +3 -9
- package/src/tools/terminal/shell.ts +3 -9
- package/src/tools/tool-approval-handler.ts +10 -4
- package/src/tools/tool-defaults.ts +94 -0
- package/src/tools/tool-name-aliases.ts +72 -14
- package/src/tools/types.ts +32 -101
- package/src/tools/ui-surface/definitions.ts +104 -108
- package/src/types/onboarding-context.ts +6 -0
- package/src/usage/attribution.ts +32 -1
- package/src/usage/pricing.ts +23 -0
- package/src/usage/types.ts +12 -0
- package/src/util/browser.ts +7 -2
- package/src/util/logger.ts +16 -7
- package/src/util/platform.ts +7 -2
- package/src/util/sqlite3-runtime.ts +65 -0
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
- package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
- package/src/workspace/migrations/090-memory-router-cost-optimized-profile.ts +109 -0
- package/src/workspace/migrations/091-retighten-migration-onboarding-thread.ts +41 -0
- package/src/workspace/migrations/registry.ts +6 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
- package/src/__tests__/message-complete-display-id.test.ts +0 -175
- package/src/daemon/query-complexity-router.ts +0 -75
- package/src/prompts/cache-boundary.ts +0 -8
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory v3 route definitions — read-only diagnostics over the hand-authored
|
|
3
|
+
* v3 tree DAG.
|
|
4
|
+
*
|
|
5
|
+
* Two operations, both side-effect-free (no LLM, no writes):
|
|
6
|
+
*
|
|
7
|
+
* - `memory_v3_validate` — returns the {@link TreeValidationReport} from
|
|
8
|
+
* `validateTree(workspaceDir)` (orphan pages, cycles, dangling refs,
|
|
9
|
+
* stale-index, unknown edge targets).
|
|
10
|
+
* - `memory_v3_tree` — returns a JSON-serializable view of
|
|
11
|
+
* `getTreeIndex(workspaceDir)`: the root id, every node id, and each
|
|
12
|
+
* node's ordered child refs. `TreeIndex` is Map-based, so the handler
|
|
13
|
+
* flattens it into arrays/objects the wire protocol can carry.
|
|
14
|
+
*
|
|
15
|
+
* The v3 tree is authored by the v2 → v3 data-migration; these routes are the
|
|
16
|
+
* on-demand inspection surface operators run while that migration is in flight.
|
|
17
|
+
* They are NOT invoked on any turn.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { z } from "zod";
|
|
21
|
+
|
|
22
|
+
import { loadConfig } from "../../config/loader.js";
|
|
23
|
+
import type { AssistantConfig } from "../../config/types.js";
|
|
24
|
+
import { getDb } from "../../memory/db-connection.js";
|
|
25
|
+
import { readActivationLogsForShadowDiff } from "../../memory/memory-v2-activation-log-store.js";
|
|
26
|
+
import type {
|
|
27
|
+
RetrievalCost,
|
|
28
|
+
RetrievalInput,
|
|
29
|
+
} from "../../memory/v2/harness/retriever.js";
|
|
30
|
+
import type { DescentTrace } from "../../memory/v2/harness/trace.js";
|
|
31
|
+
import { loadNowText } from "../../memory/v2/now-text.js";
|
|
32
|
+
import {
|
|
33
|
+
DEFAULT_SEED_OPTIONS,
|
|
34
|
+
seedCoretrievalEdges,
|
|
35
|
+
type SeedCoretrievalResult,
|
|
36
|
+
} from "../../memory/v3/coretrieval-seed.js";
|
|
37
|
+
import type { LlmCallRecord } from "../../memory/v3/llm-capture.js";
|
|
38
|
+
import { runRetrievalLoop } from "../../memory/v3/loop.js";
|
|
39
|
+
import type {
|
|
40
|
+
ShadowDiffResult,
|
|
41
|
+
ShadowDiffTurn,
|
|
42
|
+
SlugFrequency,
|
|
43
|
+
UnpairedShadowTurn,
|
|
44
|
+
} from "../../memory/v3/shadow-diff.js";
|
|
45
|
+
import { computeShadowDiff } from "../../memory/v3/shadow-diff.js";
|
|
46
|
+
import { getTreeIndex } from "../../memory/v3/tree-index.js";
|
|
47
|
+
import type { TreeValidationReport } from "../../memory/v3/validate.js";
|
|
48
|
+
import { validateTree } from "../../memory/v3/validate.js";
|
|
49
|
+
import { getWorkspaceDir } from "../../util/platform.js";
|
|
50
|
+
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
51
|
+
|
|
52
|
+
// Re-export the loop trace/cost shapes so the CLI renderer can import them from
|
|
53
|
+
// this route module (type-only) without reaching across the
|
|
54
|
+
// `cli/no-daemon-internals` boundary into `memory/v2/harness/*`.
|
|
55
|
+
export type { RetrievalCost } from "../../memory/v2/harness/retriever.js";
|
|
56
|
+
export type {
|
|
57
|
+
DescentPass,
|
|
58
|
+
DescentTrace,
|
|
59
|
+
EdgeExpansion,
|
|
60
|
+
GateDecision,
|
|
61
|
+
ScoutResult,
|
|
62
|
+
TreeLevel,
|
|
63
|
+
} from "../../memory/v2/harness/trace.js";
|
|
64
|
+
export type { LlmCallRecord };
|
|
65
|
+
export type {
|
|
66
|
+
ShadowDiffResult,
|
|
67
|
+
ShadowDiffTurn,
|
|
68
|
+
SlugFrequency,
|
|
69
|
+
UnpairedShadowTurn,
|
|
70
|
+
};
|
|
71
|
+
export type { SeedCoretrievalResult };
|
|
72
|
+
|
|
73
|
+
// ── Validate ────────────────────────────────────────────────────────────
|
|
74
|
+
|
|
75
|
+
const MemoryV3ValidateParams = z.object({}).strict();
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Wire shape for `memory_v3_validate`. Identical to the daemon-internal
|
|
79
|
+
* {@link TreeValidationReport} — every field is already serializable, so the
|
|
80
|
+
* route forwards it verbatim. Re-exported as its own type so the CLI can
|
|
81
|
+
* import it without reaching into the validator module.
|
|
82
|
+
*/
|
|
83
|
+
export type MemoryV3ValidateResult = TreeValidationReport;
|
|
84
|
+
|
|
85
|
+
async function handleValidate({
|
|
86
|
+
body = {},
|
|
87
|
+
}: RouteHandlerArgs): Promise<MemoryV3ValidateResult> {
|
|
88
|
+
// Read-only structural validation of the v3 tree. Like the v2 validate
|
|
89
|
+
// route, it is intentionally ungated: operators dry-run it while the
|
|
90
|
+
// v2 → v3 migration is mid-flight, well before any v3 flag flips.
|
|
91
|
+
MemoryV3ValidateParams.parse(body);
|
|
92
|
+
return validateTree(getWorkspaceDir());
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ── Tree ────────────────────────────────────────────────────────────────
|
|
96
|
+
|
|
97
|
+
const MemoryV3TreeParams = z.object({}).strict();
|
|
98
|
+
|
|
99
|
+
/** One node in the serialized tree view: its id and ordered child refs. */
|
|
100
|
+
export interface MemoryV3TreeNodeView {
|
|
101
|
+
id: string;
|
|
102
|
+
children: Array<{ kind: "node" | "page"; ref: string }>;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* JSON-serializable projection of the {@link TreeIndex}. `TreeIndex` keys its
|
|
107
|
+
* adjacency by `Map`, which doesn't survive JSON, so the handler flattens it:
|
|
108
|
+
* `root` is the entry-point node id and `nodes` is every node with its ordered
|
|
109
|
+
* child refs. The CLI renderer walks `nodes`/`root` to print an indented tree,
|
|
110
|
+
* marking shared-DAG re-entries.
|
|
111
|
+
*/
|
|
112
|
+
export interface MemoryV3TreeResult {
|
|
113
|
+
root: string;
|
|
114
|
+
nodes: MemoryV3TreeNodeView[];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async function handleTree({
|
|
118
|
+
body = {},
|
|
119
|
+
}: RouteHandlerArgs): Promise<MemoryV3TreeResult> {
|
|
120
|
+
MemoryV3TreeParams.parse(body);
|
|
121
|
+
|
|
122
|
+
const tree = await getTreeIndex(getWorkspaceDir());
|
|
123
|
+
|
|
124
|
+
const nodes: MemoryV3TreeNodeView[] = [...tree.nodes.keys()]
|
|
125
|
+
.sort()
|
|
126
|
+
.map((id) => ({
|
|
127
|
+
id,
|
|
128
|
+
children: (tree.childrenByNode.get(id) ?? []).map((child) => ({
|
|
129
|
+
kind: child.kind,
|
|
130
|
+
ref: child.ref,
|
|
131
|
+
})),
|
|
132
|
+
}));
|
|
133
|
+
|
|
134
|
+
return { root: tree.root, nodes };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// ── Simulate ──────────────────────────────────────────────────────────────
|
|
138
|
+
|
|
139
|
+
/** The five v3 retrieval lanes, in fanout order. */
|
|
140
|
+
const V3_LANE_NAMES = ["hot", "sparse", "dense", "tree", "edges"] as const;
|
|
141
|
+
|
|
142
|
+
export const MemoryV3SimulateParams = z
|
|
143
|
+
.object({
|
|
144
|
+
/** The ad-hoc user query to route a single synthetic turn against. */
|
|
145
|
+
query: z.string().min(1, "memory.v3.simulate query must be non-empty"),
|
|
146
|
+
/**
|
|
147
|
+
* Optional `<now>` override. When omitted the live workspace NOW.md is
|
|
148
|
+
* loaded so the run exercises production-like standing context.
|
|
149
|
+
*/
|
|
150
|
+
nowText: z.string().optional(),
|
|
151
|
+
/** Override `memory.v3.passCap` for this run only. */
|
|
152
|
+
passCap: z
|
|
153
|
+
.number()
|
|
154
|
+
.int("memory.v3.simulate passCap must be an integer")
|
|
155
|
+
.positive("memory.v3.simulate passCap must be positive")
|
|
156
|
+
.optional(),
|
|
157
|
+
/**
|
|
158
|
+
* Restrict the run to this allowlist of lanes (others forced off). Omit to
|
|
159
|
+
* inherit the live `memory.v3.lanes` toggles.
|
|
160
|
+
*/
|
|
161
|
+
lanes: z
|
|
162
|
+
.array(z.enum(V3_LANE_NAMES))
|
|
163
|
+
.min(1, "memory.v3.simulate lanes must list at least one lane")
|
|
164
|
+
.optional(),
|
|
165
|
+
})
|
|
166
|
+
.strict();
|
|
167
|
+
|
|
168
|
+
/** The v3 lane toggle block, echoed back so the caller sees what actually ran. */
|
|
169
|
+
export interface MemoryV3SimulateLanes {
|
|
170
|
+
hot: boolean;
|
|
171
|
+
sparse: boolean;
|
|
172
|
+
dense: boolean;
|
|
173
|
+
tree: boolean;
|
|
174
|
+
edges: boolean;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Wire shape for `memory_v3_simulate`. The loop's `sourceBySlug` Map is
|
|
179
|
+
* flattened to a plain object (lane label per slug); `trace`/`cost` are already
|
|
180
|
+
* JSON-serializable. `effectiveConfig` echoes the passCap + lane toggles the
|
|
181
|
+
* run actually used after overrides were applied.
|
|
182
|
+
*/
|
|
183
|
+
export interface MemoryV3SimulateResult {
|
|
184
|
+
query: string;
|
|
185
|
+
selectedSlugs: string[];
|
|
186
|
+
/** Per-slug provenance lane: `hot` | `sparse` | `dense` | `tree` | `edge`. */
|
|
187
|
+
sourceBySlug: Record<string, string>;
|
|
188
|
+
trace: DescentTrace;
|
|
189
|
+
cost: RetrievalCost;
|
|
190
|
+
/** Non-null when the dense filter failed open on any pass. */
|
|
191
|
+
failureReason: string | null;
|
|
192
|
+
/**
|
|
193
|
+
* Every v3 LLM call made during the run (filter / each descender / gate),
|
|
194
|
+
* with full input + raw response. Empty unless capture was on (it always is
|
|
195
|
+
* for simulate). Read-only debug surface — persisted nowhere.
|
|
196
|
+
*/
|
|
197
|
+
llmCalls: LlmCallRecord[];
|
|
198
|
+
effectiveConfig: {
|
|
199
|
+
passCap: number;
|
|
200
|
+
lanes: MemoryV3SimulateLanes;
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Overlay the simulate overrides on the live config. Only the v3 passCap + lane
|
|
206
|
+
* toggles are exposed; everything else (providers, prompts, scout quotas) stays
|
|
207
|
+
* exactly as a live turn would see it. `write.coactivation` is forced off so the
|
|
208
|
+
* simulate stays strictly read-only — the loop's only persistence path is the
|
|
209
|
+
* co-activation insert, which this guarantees never fires.
|
|
210
|
+
*/
|
|
211
|
+
function applyV3SimulateOverrides(
|
|
212
|
+
live: AssistantConfig,
|
|
213
|
+
overrides: { passCap?: number; lanes?: ReadonlyArray<string> },
|
|
214
|
+
): AssistantConfig {
|
|
215
|
+
const liveV3 = live.memory.v3;
|
|
216
|
+
const lanes = overrides.lanes
|
|
217
|
+
? {
|
|
218
|
+
hot: overrides.lanes.includes("hot"),
|
|
219
|
+
sparse: overrides.lanes.includes("sparse"),
|
|
220
|
+
dense: overrides.lanes.includes("dense"),
|
|
221
|
+
tree: overrides.lanes.includes("tree"),
|
|
222
|
+
edges: overrides.lanes.includes("edges"),
|
|
223
|
+
}
|
|
224
|
+
: liveV3.lanes;
|
|
225
|
+
return {
|
|
226
|
+
...live,
|
|
227
|
+
memory: {
|
|
228
|
+
...live.memory,
|
|
229
|
+
v3: {
|
|
230
|
+
...liveV3,
|
|
231
|
+
...(overrides.passCap !== undefined
|
|
232
|
+
? { passCap: overrides.passCap }
|
|
233
|
+
: {}),
|
|
234
|
+
lanes,
|
|
235
|
+
write: { ...liveV3.write, coactivation: false },
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Run the v3 retrieval loop read-only against a single ad-hoc query and return
|
|
243
|
+
* its selection, per-lane provenance, and full descent trace. Mirrors the
|
|
244
|
+
* single-turn semantics of `memory_v2_simulate_router` (the query becomes the
|
|
245
|
+
* just-arrived `userMessage` of one synthetic turn) and the input-build of the
|
|
246
|
+
* v3 shadow middleware, but persists nothing.
|
|
247
|
+
*
|
|
248
|
+
* The loop is invoked directly — it is NOT gated by `memory.v3.enabled` /
|
|
249
|
+
* `.shadow` (those gates live in the shadow middleware), so operators can probe
|
|
250
|
+
* v3 retrieval while the flags are still off.
|
|
251
|
+
*/
|
|
252
|
+
async function handleSimulate({
|
|
253
|
+
body = {},
|
|
254
|
+
}: RouteHandlerArgs): Promise<MemoryV3SimulateResult> {
|
|
255
|
+
const {
|
|
256
|
+
query,
|
|
257
|
+
nowText: rawNowText,
|
|
258
|
+
passCap,
|
|
259
|
+
lanes,
|
|
260
|
+
} = MemoryV3SimulateParams.parse(body);
|
|
261
|
+
|
|
262
|
+
const config = applyV3SimulateOverrides(loadConfig(), { passCap, lanes });
|
|
263
|
+
|
|
264
|
+
const workspaceDir = getWorkspaceDir();
|
|
265
|
+
const nowText =
|
|
266
|
+
rawNowText !== undefined ? rawNowText : await loadNowText(workspaceDir);
|
|
267
|
+
|
|
268
|
+
const input: RetrievalInput = {
|
|
269
|
+
workspaceDir,
|
|
270
|
+
recentTurnPairs: [{ assistantMessage: "", userMessage: query }],
|
|
271
|
+
nowText,
|
|
272
|
+
priorEverInjected: [],
|
|
273
|
+
config,
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
const llmCalls: LlmCallRecord[] = [];
|
|
277
|
+
const output = await runRetrievalLoop(input, {
|
|
278
|
+
db: getDb(),
|
|
279
|
+
capture: (record) => llmCalls.push(record),
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
const sourceBySlug: Record<string, string> = {};
|
|
283
|
+
for (const [slug, lane] of output.sourceBySlug.entries()) {
|
|
284
|
+
sourceBySlug[slug] = lane;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return {
|
|
288
|
+
query,
|
|
289
|
+
selectedSlugs: output.selectedSlugs,
|
|
290
|
+
sourceBySlug,
|
|
291
|
+
trace: output.trace ?? { passes: [] },
|
|
292
|
+
cost: output.cost ?? {},
|
|
293
|
+
failureReason: output.failureReason ?? null,
|
|
294
|
+
llmCalls,
|
|
295
|
+
effectiveConfig: {
|
|
296
|
+
passCap: config.memory.v3.passCap,
|
|
297
|
+
lanes: config.memory.v3.lanes,
|
|
298
|
+
},
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// ── Shadow-diff ─────────────────────────────────────────────────────────
|
|
303
|
+
|
|
304
|
+
/** Default pairing tolerance: a shadow row + its router sibling land ~1-2s apart. */
|
|
305
|
+
const DEFAULT_SHADOW_DIFF_TOLERANCE_SEC = 10;
|
|
306
|
+
/** Default cap on per-turn detail rows returned (aggregates are unbounded). */
|
|
307
|
+
const DEFAULT_SHADOW_DIFF_LIMIT = 50;
|
|
308
|
+
/** Milliseconds per day, for the `sinceDays` read-window cutoff. */
|
|
309
|
+
const MS_PER_DAY = 86_400_000;
|
|
310
|
+
|
|
311
|
+
const MemoryV3ShadowDiffParams = z
|
|
312
|
+
.object({
|
|
313
|
+
/** Only consider shadow rows newer than this many days. Omit for all rows. */
|
|
314
|
+
sinceDays: z
|
|
315
|
+
.number()
|
|
316
|
+
.positive("memory.v3.shadow-diff sinceDays must be positive")
|
|
317
|
+
.optional(),
|
|
318
|
+
/** Max |Δt| (seconds) to pair a shadow row with a router row. */
|
|
319
|
+
toleranceSec: z
|
|
320
|
+
.number()
|
|
321
|
+
.positive("memory.v3.shadow-diff toleranceSec must be positive")
|
|
322
|
+
.optional(),
|
|
323
|
+
/** Cap on per-turn detail rows in the response (newest first). */
|
|
324
|
+
limit: z
|
|
325
|
+
.number()
|
|
326
|
+
.int("memory.v3.shadow-diff limit must be an integer")
|
|
327
|
+
.positive("memory.v3.shadow-diff limit must be positive")
|
|
328
|
+
.optional(),
|
|
329
|
+
})
|
|
330
|
+
.strict();
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Compare the v3 shadow selections against the live v2 router selections,
|
|
334
|
+
* turn-for-turn, from the activation log. Read-only: reads `v3_shadow` rows and
|
|
335
|
+
* the `router` rows they pair with (bounded to those conversations + time
|
|
336
|
+
* span), then diffs each pair. Requires v3 shadow mode to have been running
|
|
337
|
+
* (`memory.v3.enabled` + `.shadow`) so the `v3_shadow` rows exist; the route
|
|
338
|
+
* itself runs no LLM and writes nothing.
|
|
339
|
+
*/
|
|
340
|
+
async function handleShadowDiff({
|
|
341
|
+
body = {},
|
|
342
|
+
}: RouteHandlerArgs): Promise<ShadowDiffResult> {
|
|
343
|
+
const { sinceDays, toleranceSec, limit } =
|
|
344
|
+
MemoryV3ShadowDiffParams.parse(body);
|
|
345
|
+
|
|
346
|
+
const sinceMs =
|
|
347
|
+
sinceDays !== undefined ? Date.now() - sinceDays * MS_PER_DAY : null;
|
|
348
|
+
const toleranceMs =
|
|
349
|
+
(toleranceSec ?? DEFAULT_SHADOW_DIFF_TOLERANCE_SEC) * 1000;
|
|
350
|
+
|
|
351
|
+
const { shadow, router } = readActivationLogsForShadowDiff({
|
|
352
|
+
sinceMs,
|
|
353
|
+
paddingMs: toleranceMs,
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
return computeShadowDiff(shadow, router, {
|
|
357
|
+
toleranceMs,
|
|
358
|
+
detailLimit: limit ?? DEFAULT_SHADOW_DIFF_LIMIT,
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// ── Seed co-retrieval edges ───────────────────────────────────────────────
|
|
363
|
+
|
|
364
|
+
const MemoryV3SeedEdgesParams = z
|
|
365
|
+
.object({
|
|
366
|
+
/** A pair must co-occur on at least this many router turns to earn an edge. */
|
|
367
|
+
minCount: z
|
|
368
|
+
.number()
|
|
369
|
+
.int("memory.v3.seed-edges minCount must be an integer")
|
|
370
|
+
.positive("memory.v3.seed-edges minCount must be positive")
|
|
371
|
+
.optional(),
|
|
372
|
+
/** Neighbors kept per source node, ranked by NPMI descending. */
|
|
373
|
+
topK: z
|
|
374
|
+
.number()
|
|
375
|
+
.int("memory.v3.seed-edges topK must be an integer")
|
|
376
|
+
.positive("memory.v3.seed-edges topK must be positive")
|
|
377
|
+
.optional(),
|
|
378
|
+
/** Exclude neighbors selected on more than this fraction of all turns. */
|
|
379
|
+
maxNeighborFreqRatio: z
|
|
380
|
+
.number()
|
|
381
|
+
.positive("memory.v3.seed-edges maxNeighborFreqRatio must be positive")
|
|
382
|
+
.max(1, "memory.v3.seed-edges maxNeighborFreqRatio must be <= 1")
|
|
383
|
+
.optional(),
|
|
384
|
+
/** Flat weight each seeded edge is written at. */
|
|
385
|
+
seedWeight: z
|
|
386
|
+
.number()
|
|
387
|
+
.positive("memory.v3.seed-edges seedWeight must be positive")
|
|
388
|
+
.optional(),
|
|
389
|
+
})
|
|
390
|
+
.strict();
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Build the co-retrieval graph from the v2 router's selection history and
|
|
394
|
+
* persist it into `memory_v3_auto_edges`. This is the one write surface among
|
|
395
|
+
* the v3 routes — it warm-starts the learned edge graph that the edge-expansion
|
|
396
|
+
* lane merges (when `memory.v3.edges.learnedAdjacencyThreshold > 0`). Idempotent:
|
|
397
|
+
* re-running upserts each seeded edge to the flat seed weight without unbounded
|
|
398
|
+
* growth. Runs no LLM.
|
|
399
|
+
*/
|
|
400
|
+
async function handleSeedEdges({
|
|
401
|
+
body = {},
|
|
402
|
+
}: RouteHandlerArgs): Promise<SeedCoretrievalResult> {
|
|
403
|
+
const { minCount, topK, maxNeighborFreqRatio, seedWeight } =
|
|
404
|
+
MemoryV3SeedEdgesParams.parse(body);
|
|
405
|
+
return seedCoretrievalEdges(getDb(), {
|
|
406
|
+
minCount: minCount ?? DEFAULT_SEED_OPTIONS.minCount,
|
|
407
|
+
topK: topK ?? DEFAULT_SEED_OPTIONS.topK,
|
|
408
|
+
maxNeighborFreqRatio:
|
|
409
|
+
maxNeighborFreqRatio ?? DEFAULT_SEED_OPTIONS.maxNeighborFreqRatio,
|
|
410
|
+
seedWeight: seedWeight ?? DEFAULT_SEED_OPTIONS.seedWeight,
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// ── Route definitions ───────────────────────────────────────────────────
|
|
415
|
+
|
|
416
|
+
export const ROUTES: RouteDefinition[] = [
|
|
417
|
+
{
|
|
418
|
+
operationId: "memory_v3_validate",
|
|
419
|
+
method: "POST",
|
|
420
|
+
endpoint: "memory/v3/validate",
|
|
421
|
+
handler: handleValidate,
|
|
422
|
+
summary: "Validate the memory v3 tree structure (read-only)",
|
|
423
|
+
description:
|
|
424
|
+
"Read-only structural validation of the hand-authored v3 tree DAG. Reports dangling child refs, orphan pages, cycles, stale compositional indexes, and unknown edge targets. Writes nothing and runs no LLM — operators dry-run it while the v2 → v3 migration is in flight.",
|
|
425
|
+
tags: ["memory"],
|
|
426
|
+
requestBody: MemoryV3ValidateParams,
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
operationId: "memory_v3_tree",
|
|
430
|
+
method: "POST",
|
|
431
|
+
endpoint: "memory/v3/tree",
|
|
432
|
+
handler: handleTree,
|
|
433
|
+
summary: "Return a serializable view of the memory v3 tree DAG (read-only)",
|
|
434
|
+
description:
|
|
435
|
+
"Returns the v3 tree root id plus every node and its ordered child refs (page:/node:) as a JSON-serializable projection of the in-memory TreeIndex. Read-only; the CLI uses it to print an indented tree with shared-DAG re-entries marked.",
|
|
436
|
+
tags: ["memory"],
|
|
437
|
+
requestBody: MemoryV3TreeParams,
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
operationId: "memory_v3_simulate",
|
|
441
|
+
method: "POST",
|
|
442
|
+
endpoint: "memory/v3/simulate",
|
|
443
|
+
handler: handleSimulate,
|
|
444
|
+
summary:
|
|
445
|
+
"Dry-run the v3 retrieval loop against an ad-hoc query (read-only)",
|
|
446
|
+
description:
|
|
447
|
+
"Runs the v3 multi-lane bounded-descent retrieval loop read-only against a single synthetic turn built from the supplied query plus the live (or supplied) NOW context. Returns the selected page slugs, per-lane provenance, the full multi-pass descent trace, and accumulated cost. Optional passCap / lane-allowlist overrides apply on top of live config. Invoked directly (not gated by memory.v3.enabled/shadow) so operators can probe v3 retrieval before flipping the flags; writes nothing (co-activation persistence is forced off), though each pass still spends the loop's filter + gate LLM calls.",
|
|
448
|
+
tags: ["memory"],
|
|
449
|
+
requestBody: MemoryV3SimulateParams,
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
operationId: "memory_v3_shadow_diff",
|
|
453
|
+
method: "POST",
|
|
454
|
+
endpoint: "memory/v3/shadow-diff",
|
|
455
|
+
handler: handleShadowDiff,
|
|
456
|
+
summary:
|
|
457
|
+
"Diff v3 shadow selections against live v2 router selections (read-only)",
|
|
458
|
+
description:
|
|
459
|
+
"Compares the v3 shadow-mode selections against the live v2 router selections turn-for-turn, from the memory activation log. Pairs each v3_shadow row with the nearest v2 router row in the same conversation (by timestamp, within a tolerance — the turn columns use different counters), then reports per-turn and aggregate overlap, what v3 surfaced that v2 did not, and what v2 had that v3 dropped, broken down by v3 provenance lane. The v2 comparand is the router's fresh per-turn pick (status='injected'), not its accumulated in-context set. Requires that v3 shadow mode has been running so v3_shadow rows exist; the route runs no LLM and writes nothing.",
|
|
460
|
+
tags: ["memory"],
|
|
461
|
+
requestBody: MemoryV3ShadowDiffParams,
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
operationId: "memory_v3_seed_edges",
|
|
465
|
+
method: "POST",
|
|
466
|
+
endpoint: "memory/v3/seed-edges",
|
|
467
|
+
handler: handleSeedEdges,
|
|
468
|
+
summary: "Seed the learned co-retrieval edge graph from v2 router history",
|
|
469
|
+
description:
|
|
470
|
+
"Builds an NPMI-scored co-retrieval graph from the v2 router's per-turn selections (memory_v2_activation_logs, status='injected') and persists it into memory_v3_auto_edges, warm-starting the learned edge graph that the v3 edge-expansion lane merges with curated edges when memory.v3.edges.learnedAdjacencyThreshold > 0. NPMI plus a min co-occurrence floor and an always-on frequency ceiling keep the neighborhoods associative rather than base-rate noise. Idempotent (upserts to a flat seed weight). Runs no LLM; the only write among the v3 routes.",
|
|
471
|
+
tags: ["memory"],
|
|
472
|
+
requestBody: MemoryV3SeedEdgesParams,
|
|
473
|
+
},
|
|
474
|
+
];
|
|
@@ -17,13 +17,13 @@
|
|
|
17
17
|
import { createReadStream } from "node:fs";
|
|
18
18
|
import { hostname } from "node:os";
|
|
19
19
|
import { PassThrough, Readable } from "node:stream";
|
|
20
|
-
import { Database } from "bun:sqlite";
|
|
21
20
|
|
|
22
21
|
import { z } from "zod";
|
|
23
22
|
|
|
24
23
|
import { getPlatformAssistantId } from "../../config/env.js";
|
|
25
24
|
import { invalidateConfigCache } from "../../config/loader.js";
|
|
26
25
|
import { getAssistantName } from "../../daemon/identity-helpers.js";
|
|
26
|
+
import { runAsyncSqlite } from "../../memory/db-async-query.js";
|
|
27
27
|
import { getDb, resetDb } from "../../memory/db-connection.js";
|
|
28
28
|
import { validateMigrationState } from "../../memory/migrations/validate-migration-state.js";
|
|
29
29
|
import { credentialKey } from "../../security/credential-key.js";
|
|
@@ -38,11 +38,7 @@ import {
|
|
|
38
38
|
upsertCredentialMetadata,
|
|
39
39
|
} from "../../tools/credentials/metadata-store.js";
|
|
40
40
|
import { getLogger } from "../../util/logger.js";
|
|
41
|
-
import {
|
|
42
|
-
getDbPath,
|
|
43
|
-
getWorkspaceDir,
|
|
44
|
-
getWorkspaceHooksDir,
|
|
45
|
-
} from "../../util/platform.js";
|
|
41
|
+
import { getWorkspaceDir, getWorkspaceHooksDir } from "../../util/platform.js";
|
|
46
42
|
import { APP_VERSION } from "../../version.js";
|
|
47
43
|
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
|
|
48
44
|
import {
|
|
@@ -356,21 +352,28 @@ export async function handleMigrationExport(
|
|
|
356
352
|
...manifestInputs,
|
|
357
353
|
secretsRedacted,
|
|
358
354
|
credentials,
|
|
359
|
-
checkpoint: () => {
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
355
|
+
checkpoint: async () => {
|
|
356
|
+
// Dispatch through `runAsyncSqlite` so the WAL checkpoint runs
|
|
357
|
+
// in a sqlite3 subprocess on hosts where it's available. A WAL
|
|
358
|
+
// flush on a multi-GB WAL file can otherwise stall the daemon's
|
|
359
|
+
// event loop for the full duration of the flush.
|
|
360
|
+
//
|
|
361
|
+
// FULL (not TRUNCATE): TRUNCATE has a side effect where, if the
|
|
362
|
+
// WAL is empty after the checkpoint, SQLite unlinks the WAL file
|
|
363
|
+
// from the directory. When the daemon's in-process connection
|
|
364
|
+
// still holds the original WAL fd, the unlink orphans that fd
|
|
365
|
+
// into a "ghost WAL" only the daemon can reach, and subsequent
|
|
366
|
+
// connections create a fresh WAL on disk — split-brain. FULL
|
|
367
|
+
// gives us the same flush-completion guarantee without the
|
|
368
|
+
// unlink side effect. See assistant/AGENTS.md "SQLite WAL
|
|
369
|
+
// checkpointing".
|
|
370
|
+
const result = await runAsyncSqlite("PRAGMA wal_checkpoint(FULL)");
|
|
371
|
+
if (!result.ok) {
|
|
369
372
|
// Best-effort: if the DB can't be checkpointed (e.g. not a valid
|
|
370
373
|
// SQLite file, missing WAL, etc.) we still proceed with the export
|
|
371
374
|
// using whatever is on disk.
|
|
372
375
|
log.warn(
|
|
373
|
-
{
|
|
376
|
+
{ error: result.error, backend: result.backend },
|
|
374
377
|
"WAL checkpoint failed — exporting without checkpoint",
|
|
375
378
|
);
|
|
376
379
|
}
|
|
@@ -582,18 +585,19 @@ export async function handleMigrationExportToGcs({ body }: RouteHandlerArgs) {
|
|
|
582
585
|
...manifestInputs,
|
|
583
586
|
secretsRedacted,
|
|
584
587
|
credentials: collected.credentials,
|
|
585
|
-
checkpoint: () => {
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
588
|
+
checkpoint: async () => {
|
|
589
|
+
// Dispatch through `runAsyncSqlite` so the WAL checkpoint runs
|
|
590
|
+
// in a sqlite3 subprocess on hosts where it's available. A
|
|
591
|
+
// WAL flush on a multi-GB WAL file can otherwise stall the
|
|
592
|
+
// daemon's event loop for the full duration of the flush.
|
|
593
|
+
//
|
|
594
|
+
// FULL (not TRUNCATE): see the disk-export checkpoint above
|
|
595
|
+
// for rationale. assistant/AGENTS.md "SQLite WAL
|
|
596
|
+
// checkpointing".
|
|
597
|
+
const result = await runAsyncSqlite("PRAGMA wal_checkpoint(FULL)");
|
|
598
|
+
if (!result.ok) {
|
|
595
599
|
log.warn(
|
|
596
|
-
{
|
|
600
|
+
{ error: result.error, backend: result.backend },
|
|
597
601
|
"WAL checkpoint failed — exporting without checkpoint",
|
|
598
602
|
);
|
|
599
603
|
}
|
|
@@ -8,10 +8,11 @@ import { z } from "zod";
|
|
|
8
8
|
import { getDb } from "../../memory/db-connection.js";
|
|
9
9
|
import { notificationDeliveries } from "../../memory/schema.js";
|
|
10
10
|
import { bufferIfDeferred } from "../../notifications/deferred-emit.js";
|
|
11
|
+
import { editNotification } from "../../notifications/edit-notification.js";
|
|
11
12
|
import { emitNotificationSignal } from "../../notifications/emit-signal.js";
|
|
12
13
|
import { listEvents } from "../../notifications/events-store.js";
|
|
13
14
|
import type { AttentionHints } from "../../notifications/signal.js";
|
|
14
|
-
import { BadRequestError } from "./errors.js";
|
|
15
|
+
import { BadRequestError, NotFoundError } from "./errors.js";
|
|
15
16
|
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
16
17
|
|
|
17
18
|
function handleNotificationIntentResult({ body = {} }: RouteHandlerArgs) {
|
|
@@ -89,6 +90,26 @@ const ListNotificationEventsParams = z.object({
|
|
|
89
90
|
sourceEventName: z.string().optional(),
|
|
90
91
|
});
|
|
91
92
|
|
|
93
|
+
const EditNotificationParams = z
|
|
94
|
+
.object({
|
|
95
|
+
id: z.string().min(1).describe("Feed item id (notif:<uuid>) or bare uuid"),
|
|
96
|
+
title: z.string().optional(),
|
|
97
|
+
body: z.string().optional(),
|
|
98
|
+
urgency: z.enum(["low", "medium", "high", "critical"]).optional(),
|
|
99
|
+
status: z.enum(["new", "seen", "acted_on", "dismissed"]).optional(),
|
|
100
|
+
})
|
|
101
|
+
.refine(
|
|
102
|
+
(v) =>
|
|
103
|
+
v.title !== undefined ||
|
|
104
|
+
v.body !== undefined ||
|
|
105
|
+
v.urgency !== undefined ||
|
|
106
|
+
v.status !== undefined,
|
|
107
|
+
{
|
|
108
|
+
message:
|
|
109
|
+
"At least one of `title`, `body`, `urgency`, or `status` must be supplied",
|
|
110
|
+
},
|
|
111
|
+
);
|
|
112
|
+
|
|
92
113
|
// ── Notification pipeline handlers ───────────────────────────────────
|
|
93
114
|
|
|
94
115
|
async function handleEmitSignal({ body = {} }: RouteHandlerArgs) {
|
|
@@ -125,6 +146,19 @@ async function handleEmitSignal({ body = {} }: RouteHandlerArgs) {
|
|
|
125
146
|
};
|
|
126
147
|
}
|
|
127
148
|
|
|
149
|
+
async function handleEditNotification({ body = {} }: RouteHandlerArgs) {
|
|
150
|
+
const validated = EditNotificationParams.parse(body);
|
|
151
|
+
const result = await editNotification(validated);
|
|
152
|
+
if (!result) {
|
|
153
|
+
throw new NotFoundError(`No notification found for id ${validated.id}`);
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
ok: true,
|
|
157
|
+
feedItem: result.feedItem,
|
|
158
|
+
channels: result.channels,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
128
162
|
function handleListEvents({ body = {} }: RouteHandlerArgs) {
|
|
129
163
|
const validated = ListNotificationEventsParams.parse(body);
|
|
130
164
|
const rows = listEvents({
|
|
@@ -175,6 +209,34 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
175
209
|
reason: z.string(),
|
|
176
210
|
}),
|
|
177
211
|
},
|
|
212
|
+
{
|
|
213
|
+
operationId: "edit_notification",
|
|
214
|
+
endpoint: "notifications/edit",
|
|
215
|
+
method: "POST",
|
|
216
|
+
handler: handleEditNotification,
|
|
217
|
+
summary: "Edit an already-sent notification",
|
|
218
|
+
description:
|
|
219
|
+
"Patch the home-feed entry for a notification and, where supported (Slack today), update the delivered message in place.",
|
|
220
|
+
tags: ["notifications"],
|
|
221
|
+
requestBody: EditNotificationParams,
|
|
222
|
+
responseBody: z.object({
|
|
223
|
+
ok: z.boolean(),
|
|
224
|
+
feedItem: z.record(z.string(), z.unknown()),
|
|
225
|
+
channels: z.array(
|
|
226
|
+
z.object({
|
|
227
|
+
channel: z.string(),
|
|
228
|
+
deliveryId: z.string(),
|
|
229
|
+
outcome: z.enum(["updated", "unsupported", "skipped", "failed"]),
|
|
230
|
+
reason: z.string().optional(),
|
|
231
|
+
}),
|
|
232
|
+
),
|
|
233
|
+
}),
|
|
234
|
+
additionalResponses: {
|
|
235
|
+
"404": {
|
|
236
|
+
description: "No notification found for the supplied id",
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
},
|
|
178
240
|
{
|
|
179
241
|
operationId: "list_notification_events",
|
|
180
242
|
endpoint: "notifications/events",
|