@vellumai/assistant 0.5.16 → 0.6.1
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 +4 -0
- package/ARCHITECTURE.md +69 -16
- package/Dockerfile +2 -5
- package/bun.lock +6 -2
- package/docker-entrypoint.sh +32 -1
- package/docs/architecture/integrations.md +1 -1
- package/docs/architecture/memory.md +21 -24
- package/knip.json +2 -1
- package/openapi.yaml +1198 -83
- package/package.json +5 -1
- package/src/__tests__/actor-token-service.test.ts +68 -0
- package/src/__tests__/agent-loop.test.ts +0 -32
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -2
- package/src/__tests__/anthropic-provider.test.ts +217 -98
- package/src/__tests__/app-compiler.test.ts +120 -0
- package/src/__tests__/app-dir-path-guard.test.ts +1 -0
- package/src/__tests__/app-executors.test.ts +47 -1
- package/src/__tests__/app-source-watcher.test.ts +159 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
- package/src/__tests__/call-conversation-messages.test.ts +2 -6
- package/src/__tests__/call-domain.test.ts +2 -6
- package/src/__tests__/call-pointer-messages.test.ts +2 -14
- package/src/__tests__/call-recovery.test.ts +2 -6
- package/src/__tests__/call-routes-http.test.ts +2 -6
- package/src/__tests__/call-store.test.ts +2 -6
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +2 -6
- package/src/__tests__/canonical-guardian-store.test.ts +2 -6
- package/src/__tests__/channel-delivery-store.test.ts +2 -6
- package/src/__tests__/channel-retry-sweep.test.ts +2 -6
- package/src/__tests__/checker.test.ts +63 -9
- package/src/__tests__/clawhub.test.ts +54 -24
- package/src/__tests__/cli-command-risk-guard.test.ts +14 -0
- package/src/__tests__/config-schema.test.ts +6 -1
- package/src/__tests__/config-set-platform-guard.test.ts +302 -0
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +2 -6
- package/src/__tests__/contacts-tools.test.ts +31 -0
- package/src/__tests__/context-overflow-reducer.test.ts +86 -0
- package/src/__tests__/context-token-estimator.test.ts +175 -10
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +13 -6
- package/src/__tests__/conversation-agent-loop.test.ts +13 -51
- package/src/__tests__/conversation-attachments.test.ts +2 -6
- package/src/__tests__/conversation-attention-store.test.ts +2 -6
- package/src/__tests__/conversation-clear-safety.test.ts +2 -6
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +4 -10
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -6
- package/src/__tests__/conversation-disk-view.test.ts +2 -6
- package/src/__tests__/conversation-error.test.ts +33 -2
- package/src/__tests__/conversation-fork-crud.test.ts +2 -6
- package/src/__tests__/conversation-history-web-search.test.ts +6 -1
- package/src/__tests__/conversation-load-history-repair.test.ts +5 -1
- package/src/__tests__/conversation-media-retry.test.ts +91 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +653 -832
- package/src/__tests__/conversation-runtime-workspace.test.ts +1 -93
- package/src/__tests__/conversation-starter-routes.test.ts +20 -11
- package/src/__tests__/conversation-store.test.ts +2 -6
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +17 -4
- package/src/__tests__/conversation-usage.test.ts +2 -6
- package/src/__tests__/conversation-wipe.test.ts +13 -414
- package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -12
- package/src/__tests__/conversation-workspace-injection.test.ts +25 -26
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -1
- package/src/__tests__/copy-composer-tc-templates.test.ts +335 -0
- package/src/__tests__/credential-execution-feature-gates.test.ts +3 -3
- package/src/__tests__/credential-execution-shell-lockdown.test.ts +2 -2
- package/src/__tests__/credential-security-e2e.test.ts +2 -0
- package/src/__tests__/date-context.test.ts +76 -210
- package/src/__tests__/db-schedule-syntax-migration.test.ts +16 -1
- package/src/__tests__/file-list-tool.test.ts +219 -0
- package/src/__tests__/first-greeting.test.ts +1 -1
- package/src/__tests__/followup-tools.test.ts +2 -6
- package/src/__tests__/graph-extraction-event-date.test.ts +186 -0
- package/src/__tests__/guardian-action-conversation-turn.test.ts +2 -6
- package/src/__tests__/guardian-action-followup-executor.test.ts +2 -6
- package/src/__tests__/guardian-action-followup-store.test.ts +2 -6
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +2 -6
- package/src/__tests__/guardian-action-late-reply.test.ts +2 -6
- package/src/__tests__/guardian-action-store.test.ts +2 -6
- package/src/__tests__/guardian-binding-drift-heal.test.ts +2 -6
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +8 -8
- package/src/__tests__/guardian-dispatch.test.ts +2 -6
- package/src/__tests__/guardian-grant-minting.test.ts +2 -14
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +2 -6
- package/src/__tests__/guardian-routing-invariants.test.ts +192 -6
- package/src/__tests__/guardian-routing-state.test.ts +2 -6
- package/src/__tests__/guardian-verification-voice-binding.test.ts +2 -6
- package/src/__tests__/heartbeat-service.test.ts +180 -3
- package/src/__tests__/identity-routes.test.ts +328 -0
- package/src/__tests__/inbound-invite-redemption.test.ts +2 -6
- package/src/__tests__/injection-block.test.ts +178 -0
- package/src/__tests__/install-meta.test.ts +506 -0
- package/src/__tests__/install-skill-routing.test.ts +293 -0
- package/src/__tests__/invite-redemption-service.test.ts +2 -6
- package/src/__tests__/invite-routes-http.test.ts +2 -6
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +17 -28
- package/src/__tests__/list-messages-attachments.test.ts +2 -6
- package/src/__tests__/list-messages-tool-merge.test.ts +300 -0
- package/src/__tests__/llm-context-normalization.test.ts +18 -18
- package/src/__tests__/llm-context-route-provider.test.ts +103 -6
- package/src/__tests__/llm-request-log-turn-query.test.ts +164 -6
- package/src/__tests__/llm-usage-store.test.ts +2 -6
- package/src/__tests__/log-export-workspace.test.ts +74 -111
- package/src/__tests__/managed-store.test.ts +38 -11
- package/src/__tests__/mcp-abort-signal.test.ts +5 -0
- package/src/__tests__/mcp-client-auth.test.ts +5 -0
- package/src/__tests__/memory-jobs-worker-backoff.test.ts +2 -8
- package/src/__tests__/memory-recall-log-store.test.ts +134 -6
- package/src/__tests__/memory-upsert-concurrency.test.ts +4 -112
- package/src/__tests__/migration-export-streaming.test.ts +304 -0
- package/src/__tests__/migration-import-commit-http.test.ts +11 -10
- package/src/__tests__/mock-fetch.ts +87 -0
- package/src/__tests__/non-member-access-request.test.ts +2 -6
- package/src/__tests__/notification-decision-recipient-context.test.ts +282 -0
- package/src/__tests__/notification-guardian-path.test.ts +2 -6
- package/src/__tests__/oauth-cli.test.ts +364 -2
- package/src/__tests__/oauth2-gateway-transport.test.ts +18 -3
- package/src/__tests__/onboarding-template-contract.test.ts +62 -14
- package/src/__tests__/outlook-attachments.test.ts +301 -0
- package/src/__tests__/outlook-automation-tools.test.ts +425 -0
- package/src/__tests__/outlook-categories.test.ts +212 -0
- package/src/__tests__/outlook-client-automation.test.ts +246 -0
- package/src/__tests__/outlook-compose-tools.test.ts +325 -0
- package/src/__tests__/outlook-declutter-tools.test.ts +585 -0
- package/src/__tests__/outlook-email-watcher.test.ts +322 -0
- package/src/__tests__/outlook-follow-up.test.ts +196 -0
- package/src/__tests__/outlook-messaging-provider.test.ts +498 -3
- package/src/__tests__/outlook-trash.test.ts +77 -0
- package/src/__tests__/outlook-unsubscribe.test.ts +250 -0
- package/src/__tests__/parser.test.ts +32 -0
- package/src/__tests__/permission-checker-host-gate.test.ts +452 -0
- package/src/__tests__/permission-controls-v2-flag.test.ts +55 -0
- package/src/__tests__/permission-mode-sse.test.ts +418 -0
- package/src/__tests__/permission-mode-store.test.ts +277 -0
- package/src/__tests__/permission-mode.test.ts +101 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +359 -0
- package/src/__tests__/platform-callback-registration.test.ts +4 -4
- package/src/__tests__/playbook-execution.test.ts +76 -80
- package/src/__tests__/playbook-tools.test.ts +5 -7
- package/src/__tests__/profiler-routes.test.ts +502 -0
- package/src/__tests__/profiler-run-store.test.ts +441 -0
- package/src/__tests__/provider-error-scenarios.test.ts +21 -0
- package/src/__tests__/proxy-approval-callback.test.ts +4 -75
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +273 -0
- package/src/__tests__/registry.test.ts +3 -3
- package/src/__tests__/require-fresh-approval.test.ts +64 -2
- package/src/__tests__/runtime-events-sse-parity.test.ts +2 -6
- package/src/__tests__/runtime-events-sse.test.ts +2 -6
- package/src/__tests__/sandbox-host-parity.test.ts +5 -4
- package/src/__tests__/schedule-store.test.ts +2 -6
- package/src/__tests__/schedule-tools.test.ts +2 -6
- package/src/__tests__/scheduler-recurrence.test.ts +1 -5
- package/src/__tests__/scheduler-reuse-conversation.test.ts +368 -0
- package/src/__tests__/scoped-approval-grants.test.ts +2 -6
- package/src/__tests__/scoped-grant-security-matrix.test.ts +2 -6
- package/src/__tests__/scrub-corrupted-image-attachments.test.ts +278 -0
- package/src/__tests__/search-skills-unified.test.ts +422 -0
- package/src/__tests__/secret-onetime-send.test.ts +2 -0
- package/src/__tests__/send-endpoint-busy.test.ts +44 -9
- package/src/__tests__/sequence-store.test.ts +2 -6
- package/src/__tests__/server-history-render.test.ts +2 -6
- package/src/__tests__/set-permission-mode.test.ts +274 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +38 -31
- package/src/__tests__/skill-feature-flags.test.ts +6 -6
- package/src/__tests__/skill-load-feature-flag.test.ts +23 -11
- package/src/__tests__/skill-memory.test.ts +2 -741
- package/src/__tests__/skills-uninstall.test.ts +2 -2
- package/src/__tests__/skills.test.ts +1 -1
- package/src/__tests__/slack-inbound-verification.test.ts +2 -6
- package/src/__tests__/strip-memory-injections.test.ts +187 -0
- package/src/__tests__/subagent-detail.test.ts +84 -0
- package/src/__tests__/subagent-disposal.test.ts +308 -0
- package/src/__tests__/subagent-manager-notify.test.ts +19 -10
- package/src/__tests__/subagent-notify-parent.test.ts +390 -0
- package/src/__tests__/subagent-role-registry.test.ts +108 -0
- package/src/__tests__/subagent-tool-filtering.test.ts +71 -0
- package/src/__tests__/subagent-tools.test.ts +464 -4
- package/src/__tests__/system-prompt-ask-mode.test.ts +139 -0
- package/src/__tests__/task-compiler.test.ts +2 -6
- package/src/__tests__/task-management-tools.test.ts +2 -6
- package/src/__tests__/task-memory-cleanup.test.ts +185 -241
- package/src/__tests__/task-runner.test.ts +2 -6
- package/src/__tests__/task-scheduler.test.ts +2 -6
- package/src/__tests__/terminal-tools.test.ts +17 -27
- package/src/__tests__/test-preload.ts +7 -0
- package/src/__tests__/tool-approval-handler.test.ts +2 -6
- package/src/__tests__/tool-executor.test.ts +4 -26
- package/src/__tests__/tool-grant-request-escalation.test.ts +2 -6
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +277 -0
- package/src/__tests__/top-level-renderer.test.ts +10 -13
- package/src/__tests__/trust-store.test.ts +1 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +2 -6
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +118 -8
- package/src/__tests__/trusted-contact-multichannel.test.ts +2 -6
- package/src/__tests__/trusted-contact-verification.test.ts +2 -6
- package/src/__tests__/turn-boundary-resolution.test.ts +2 -6
- package/src/__tests__/usage-cache-backfill-migration.test.ts +1 -6
- package/src/__tests__/usage-routes.test.ts +2 -6
- package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
- package/src/__tests__/voice-invite-redemption.test.ts +2 -6
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +2 -6
- package/src/__tests__/voice-session-bridge.test.ts +2 -6
- package/src/__tests__/volume-security-guard.test.ts +2 -0
- package/src/__tests__/workspace-lifecycle.test.ts +29 -1
- package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +2 -6
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +2 -6
- package/src/__tests__/workspace-migration-026-backfill-install-meta.test.ts +558 -0
- package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +387 -0
- package/src/__tests__/workspace-policy.test.ts +1 -1
- package/src/agent/attachments.ts +7 -2
- package/src/agent/image-optimize.ts +165 -0
- package/src/agent/loop.ts +7 -15
- package/src/approvals/guardian-request-resolvers.ts +24 -0
- package/src/avatar/traits-png-sync.ts +3 -3
- package/src/bundler/app-compiler.ts +179 -2
- package/src/bundler/package-resolver.ts +3 -5
- package/src/cli/__tests__/notifications.test.ts +1 -2
- package/src/cli/__tests__/run-assistant-command.ts +29 -0
- package/src/cli/commands/__tests__/email-download.test.ts +245 -0
- package/src/cli/commands/__tests__/email-list.test.ts +192 -0
- package/src/cli/commands/__tests__/email-register.test.ts +186 -0
- package/src/cli/commands/__tests__/email-send.test.ts +291 -0
- package/src/cli/commands/__tests__/email-status.test.ts +181 -0
- package/src/cli/commands/__tests__/email-unregister.test.ts +139 -0
- package/src/cli/commands/__tests__/routes.test.ts +562 -0
- package/src/cli/commands/avatar.ts +3 -3
- package/src/cli/commands/config.ts +26 -13
- package/src/cli/commands/conversations.ts +1 -8
- package/src/cli/commands/doctor.ts +2 -2
- package/src/cli/commands/email.ts +584 -835
- package/src/cli/commands/memory.ts +37 -84
- package/src/cli/commands/notifications.ts +7 -2
- package/src/cli/commands/oauth/__tests__/connect.test.ts +2 -2
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +2 -2
- package/src/cli/commands/oauth/__tests__/mode.test.ts +8 -1
- package/src/cli/commands/oauth/__tests__/status.test.ts +2 -2
- package/src/cli/commands/oauth/connect.ts +25 -11
- package/src/cli/commands/oauth/mode.ts +7 -0
- package/src/cli/commands/oauth/shared.ts +39 -3
- package/src/cli/commands/platform/__tests__/connect.test.ts +1 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +1 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +5 -5
- package/src/cli/commands/platform/index.ts +16 -16
- package/src/cli/commands/routes.ts +396 -0
- package/src/cli/commands/skills.ts +218 -36
- package/src/cli/commands/trust.ts +2 -2
- package/src/cli/lib/daemon-credential-client.ts +2 -3
- package/src/cli/program.ts +2 -0
- package/src/cli.ts +1 -120
- package/src/config/bundled-skills/acp/TOOLS.json +1 -1
- package/src/config/bundled-skills/app-builder/SKILL.md +4 -1
- package/src/config/bundled-skills/contacts/SKILL.md +0 -1
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -8
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -4
- package/src/config/bundled-skills/gmail/SKILL.md +4 -12
- package/src/config/bundled-skills/google-calendar/SKILL.md +1 -9
- package/src/config/bundled-skills/messaging/SKILL.md +17 -18
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +40 -33
- package/src/config/bundled-skills/outlook/SKILL.md +189 -0
- package/src/config/bundled-skills/outlook/TOOLS.json +530 -0
- package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +85 -0
- package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +77 -0
- package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +84 -0
- package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +94 -0
- package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +49 -0
- package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +237 -0
- package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +161 -0
- package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +32 -0
- package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +272 -0
- package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +29 -0
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +129 -0
- package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +87 -0
- package/src/config/bundled-skills/outlook/tools/shared.ts +20 -0
- package/src/config/bundled-skills/outlook-calendar/SKILL.md +51 -0
- package/src/config/bundled-skills/outlook-calendar/TOOLS.json +221 -0
- package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +252 -0
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +53 -0
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +74 -0
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +18 -0
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +46 -0
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +36 -0
- package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +17 -0
- package/src/config/bundled-skills/outlook-calendar/types.ts +120 -0
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +47 -40
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +16 -29
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +16 -18
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +39 -47
- package/src/config/bundled-skills/schedule/SKILL.md +22 -2
- package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
- package/src/config/bundled-skills/settings/tools/avatar-get.ts +3 -13
- package/src/config/bundled-skills/settings/tools/avatar-remove.ts +2 -4
- package/src/config/bundled-skills/settings/tools/avatar-update.ts +5 -2
- package/src/config/bundled-skills/slack/SKILL.md +3 -7
- package/src/config/bundled-skills/subagent/SKILL.md +43 -3
- package/src/config/bundled-skills/subagent/TOOLS.json +29 -4
- package/src/config/bundled-tool-registry.ts +56 -4
- package/src/config/env-registry.ts +78 -8
- package/src/config/feature-flag-registry.json +38 -125
- package/src/config/schema.ts +8 -0
- package/src/config/schemas/filing.ts +51 -0
- package/src/config/schemas/heartbeat.ts +15 -12
- package/src/config/schemas/memory-lifecycle.ts +12 -0
- package/src/config/schemas/platform.ts +8 -0
- package/src/config/schemas/security.ts +14 -0
- package/src/config/schemas/timeouts.ts +1 -1
- package/src/config/skills.ts +18 -7
- package/src/context/token-estimator.ts +25 -18
- package/src/context/window-manager.ts +6 -2
- package/src/credential-execution/process-manager.ts +3 -1
- package/src/daemon/app-source-watcher.ts +93 -0
- package/src/daemon/config-watcher.ts +79 -1
- package/src/daemon/context-overflow-reducer.ts +46 -2
- package/src/daemon/conversation-agent-loop-handlers.ts +143 -82
- package/src/daemon/conversation-agent-loop.ts +236 -108
- package/src/daemon/conversation-error.ts +31 -8
- package/src/daemon/conversation-history.ts +4 -19
- package/src/daemon/conversation-lifecycle.ts +36 -9
- package/src/daemon/conversation-media-retry.ts +85 -7
- package/src/daemon/conversation-notifiers.ts +4 -1
- package/src/daemon/conversation-process.ts +13 -7
- package/src/daemon/conversation-runtime-assembly.ts +305 -306
- package/src/daemon/conversation-tool-setup.ts +44 -14
- package/src/daemon/conversation-workspace.ts +1 -2
- package/src/daemon/conversation.ts +59 -2
- package/src/daemon/daemon-control.ts +8 -2
- package/src/daemon/date-context.ts +26 -53
- package/src/daemon/first-greeting.ts +1 -1
- package/src/daemon/handlers/conversations.ts +4 -7
- package/src/daemon/handlers/shared.test.ts +143 -0
- package/src/daemon/handlers/shared.ts +85 -17
- package/src/daemon/handlers/skills.ts +416 -209
- package/src/daemon/lifecycle.ts +212 -131
- package/src/daemon/main.ts +5 -1
- package/src/daemon/message-types/conversations.ts +29 -7
- package/src/daemon/message-types/messages.ts +12 -2
- package/src/daemon/message-types/schedules.ts +1 -0
- package/src/daemon/message-types/settings.ts +6 -0
- package/src/daemon/message-types/skills.ts +97 -36
- package/src/daemon/profiler-run-store.ts +557 -0
- package/src/daemon/providers-setup.ts +5 -0
- package/src/daemon/server.ts +100 -11
- package/src/daemon/shutdown-handlers.ts +5 -0
- package/src/daemon/tool-side-effects.ts +50 -8
- package/src/export/transcript-formatter.ts +148 -0
- package/src/filing/filing-service.ts +228 -0
- package/src/heartbeat/heartbeat-service.ts +97 -7
- package/src/hooks/cli.ts +2 -2
- package/src/hooks/runner.ts +15 -38
- package/src/inbound/platform-callback-registration.ts +14 -14
- package/src/mcp/client.ts +6 -0
- package/src/mcp/mcp-oauth-provider.ts +149 -27
- package/src/memory/admin.ts +42 -75
- package/src/memory/app-store.ts +69 -0
- package/src/memory/conversation-bootstrap.ts +3 -1
- package/src/memory/conversation-crud.ts +211 -288
- package/src/memory/conversation-group-migration.ts +157 -0
- package/src/memory/conversation-queries.ts +61 -13
- package/src/memory/conversation-title-service.ts +1 -0
- package/src/memory/db-init.ts +194 -361
- package/src/memory/embed.ts +73 -0
- package/src/memory/embedding-backend.ts +8 -14
- package/src/memory/embedding-runtime-manager.ts +12 -114
- package/src/memory/fingerprint.ts +2 -2
- package/src/memory/graph/bootstrap.ts +521 -0
- package/src/memory/graph/capability-seed.ts +449 -0
- package/src/memory/graph/consolidation.ts +725 -0
- package/src/memory/graph/conversation-graph-memory.ts +659 -0
- package/src/memory/graph/decay.test.ts +208 -0
- package/src/memory/graph/decay.ts +195 -0
- package/src/memory/graph/extraction-job.ts +74 -0
- package/src/memory/graph/extraction.test.ts +936 -0
- package/src/memory/graph/extraction.ts +1297 -0
- package/src/memory/graph/graph-memory-state-store.ts +37 -0
- package/src/memory/graph/graph-search.ts +280 -0
- package/src/memory/graph/image-ref-utils.ts +29 -0
- package/src/memory/graph/injection.test.ts +513 -0
- package/src/memory/graph/injection.ts +469 -0
- package/src/memory/graph/inspect.ts +543 -0
- package/src/memory/graph/narrative.ts +267 -0
- package/src/memory/graph/pattern-scan.ts +269 -0
- package/src/memory/graph/retriever.ts +1111 -0
- package/src/memory/graph/scoring.test.ts +548 -0
- package/src/memory/graph/scoring.ts +232 -0
- package/src/memory/graph/serendipity.ts +65 -0
- package/src/memory/graph/store.test.ts +1098 -0
- package/src/memory/graph/store.ts +838 -0
- package/src/memory/graph/tool-handlers.ts +301 -0
- package/src/memory/graph/tools.ts +97 -0
- package/src/memory/graph/triggers.test.ts +487 -0
- package/src/memory/graph/triggers.ts +223 -0
- package/src/memory/graph/types.ts +295 -0
- package/src/memory/group-crud.ts +191 -0
- package/src/memory/indexer.ts +37 -19
- package/src/memory/job-handlers/cleanup.ts +32 -42
- package/src/memory/job-handlers/conversation-starters.ts +91 -53
- package/src/memory/job-handlers/embedding.ts +5 -31
- package/src/memory/job-handlers/index-maintenance.ts +23 -11
- package/src/memory/job-handlers/summarization.ts +32 -17
- package/src/memory/job-utils.ts +1 -1
- package/src/memory/jobs-store.ts +21 -31
- package/src/memory/jobs-worker.ts +180 -129
- package/src/memory/llm-request-log-store.ts +96 -12
- package/src/memory/memory-recall-log-store.ts +49 -5
- package/src/memory/message-content.ts +1 -0
- package/src/memory/migrations/202-memory-graph-tables.ts +130 -0
- package/src/memory/migrations/203-drop-memory-items-tables.ts +55 -0
- package/src/memory/migrations/204-rename-memory-graph-type-values.ts +46 -0
- package/src/memory/migrations/205-memory-graph-image-refs.ts +11 -0
- package/src/memory/migrations/206-memory-graph-node-edits.ts +19 -0
- package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +131 -0
- package/src/memory/migrations/207-conversation-graph-memory-state.ts +20 -0
- package/src/memory/migrations/208-conversations-last-message-at.ts +35 -0
- package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +85 -0
- package/src/memory/migrations/210-schedule-reuse-conversation.ts +13 -0
- package/src/memory/migrations/211-memory-recall-logs-query-context.ts +21 -0
- package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +19 -0
- package/src/memory/migrations/index.ts +12 -0
- package/src/memory/migrations/registry.ts +16 -0
- package/src/memory/qdrant-client.ts +44 -17
- package/src/memory/schema/conversations.ts +14 -0
- package/src/memory/schema/index.ts +1 -0
- package/src/memory/schema/infrastructure.ts +8 -1
- package/src/memory/schema/memory-core.ts +0 -51
- package/src/memory/schema/memory-graph.ts +154 -0
- package/src/memory/search/semantic.ts +47 -91
- package/src/memory/task-memory-cleanup.ts +58 -61
- package/src/messaging/providers/outlook/adapter.ts +8 -1
- package/src/messaging/providers/outlook/client.ts +299 -0
- package/src/messaging/providers/outlook/types.ts +118 -0
- package/src/notifications/adapters/macos.ts +1 -0
- package/src/notifications/copy-composer.ts +95 -0
- package/src/notifications/decision-engine.ts +35 -0
- package/src/notifications/signal.ts +16 -0
- package/src/oauth/seed-providers.ts +2 -1
- package/src/permissions/checker.ts +36 -4
- package/src/permissions/defaults.ts +4 -4
- package/src/permissions/permission-mode-store.ts +180 -0
- package/src/permissions/permission-mode.ts +31 -0
- package/src/permissions/workspace-policy.ts +10 -1
- package/src/playbooks/playbook-compiler.ts +19 -18
- package/src/playbooks/types.ts +4 -3
- package/src/prompts/system-prompt.ts +62 -36
- package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +100 -0
- package/src/prompts/templates/BOOTSTRAP.md +70 -165
- package/src/prompts/templates/HEARTBEAT.md +3 -1
- package/src/prompts/templates/SOUL.md +25 -4
- package/src/prompts/templates/UPDATES.md +8 -0
- package/src/providers/anthropic/client.ts +136 -220
- package/src/providers/gemini/client.ts +1 -1
- package/src/providers/openai/client.ts +1 -1
- package/src/providers/registry.ts +1 -1
- package/src/providers/retry.ts +19 -3
- package/src/runtime/actor-trust-resolver.ts +5 -1
- package/src/runtime/auth/route-policy.ts +30 -0
- package/src/runtime/guardian-reply-router.ts +5 -1
- package/src/runtime/http-server.ts +55 -5
- package/src/runtime/http-types.ts +12 -1
- package/src/runtime/middleware/auth.ts +20 -0
- package/src/runtime/migrations/vbundle-builder.ts +389 -3
- package/src/runtime/migrations/vbundle-importer.ts +8 -6
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +378 -0
- package/src/runtime/routes/app-management-routes.ts +1 -11
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +26 -0
- package/src/runtime/routes/archive-utils.ts +29 -0
- package/src/runtime/routes/attachment-routes.test.ts +106 -0
- package/src/runtime/routes/attachment-routes.ts +106 -16
- package/src/runtime/routes/avatar-routes.ts +2 -9
- package/src/runtime/routes/brain-graph-routes.ts +21 -22
- package/src/runtime/routes/btw-routes.ts +22 -1
- package/src/runtime/routes/conversation-analysis-routes.ts +173 -0
- package/src/runtime/routes/conversation-management-routes.ts +3 -14
- package/src/runtime/routes/conversation-query-routes.ts +49 -3
- package/src/runtime/routes/conversation-routes.ts +264 -44
- package/src/runtime/routes/conversation-starter-routes.ts +2 -2
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/global-search-routes.ts +21 -19
- package/src/runtime/routes/group-routes.ts +207 -0
- package/src/runtime/routes/guardian-action-routes.ts +21 -10
- package/src/runtime/routes/guardian-bootstrap-routes.ts +23 -19
- package/src/runtime/routes/heartbeat-routes.ts +4 -10
- package/src/runtime/routes/identity-routes.ts +53 -18
- package/src/runtime/routes/inbound-message-handler.ts +19 -0
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +292 -0
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +207 -0
- package/src/runtime/routes/llm-context-normalization.ts +14 -10
- package/src/runtime/routes/log-export-routes.ts +23 -275
- package/src/runtime/routes/memory-item-routes.test.ts +170 -247
- package/src/runtime/routes/memory-item-routes.ts +341 -388
- package/src/runtime/routes/migration-routes.ts +18 -7
- package/src/runtime/routes/profiler-routes.ts +350 -0
- package/src/runtime/routes/schedule-routes.ts +28 -11
- package/src/runtime/routes/settings-routes.ts +95 -8
- package/src/runtime/routes/skills-routes.ts +103 -37
- package/src/runtime/routes/subagents-routes.ts +28 -7
- package/src/runtime/routes/user-route-dispatcher.ts +223 -0
- package/src/runtime/routes/user-routes.ts +41 -0
- package/src/runtime/routes/work-items-routes.test.ts +2 -6
- package/src/runtime/routes/workspace-routes.ts +0 -1
- package/src/schedule/schedule-store.ts +30 -0
- package/src/schedule/scheduler.ts +52 -18
- package/src/security/oauth2.ts +1 -1
- package/src/security/secure-keys.ts +4 -8
- package/src/shared/provider-env-vars.ts +19 -0
- package/src/skills/catalog-cache.ts +5 -0
- package/src/skills/catalog-install.ts +25 -16
- package/src/skills/clawhub.ts +134 -154
- package/src/skills/install-meta.ts +208 -0
- package/src/skills/managed-store.ts +29 -18
- package/src/skills/skill-memory.ts +12 -229
- package/src/skills/skillssh-registry.ts +19 -17
- package/src/subagent/index.ts +13 -3
- package/src/subagent/manager.ts +308 -29
- package/src/subagent/types.ts +68 -0
- package/src/tasks/task-runner.ts +7 -5
- package/src/telemetry/usage-telemetry-reporter.test.ts +3 -5
- package/src/tools/apps/executors.ts +29 -4
- package/src/tools/browser/runtime-check.ts +3 -1
- package/src/tools/filesystem/list.ts +93 -0
- package/src/tools/memory/register.ts +63 -46
- package/src/tools/permission-checker.ts +85 -1
- package/src/tools/registry.ts +4 -0
- package/src/tools/schedule/create.ts +3 -0
- package/src/tools/schedule/list.ts +1 -0
- package/src/tools/schedule/update.ts +6 -0
- package/src/tools/shared/filesystem/errors.ts +5 -0
- package/src/tools/shared/filesystem/file-ops-service.ts +90 -2
- package/src/tools/shared/filesystem/image-read.ts +22 -85
- package/src/tools/shared/filesystem/types.ts +17 -0
- package/src/tools/shared/shell-output.ts +31 -2
- package/src/tools/subagent/abort.ts +12 -2
- package/src/tools/subagent/message.ts +9 -2
- package/src/tools/subagent/notify-parent.ts +79 -0
- package/src/tools/subagent/read.ts +29 -8
- package/src/tools/subagent/resolve.ts +21 -0
- package/src/tools/subagent/spawn.ts +2 -0
- package/src/tools/subagent/status.ts +11 -1
- package/src/tools/system/avatar-generator.ts +3 -3
- package/src/tools/system/register.ts +23 -0
- package/src/tools/system/set-permission-mode.ts +103 -0
- package/src/tools/terminal/parser.ts +30 -5
- package/src/tools/terminal/safe-env.ts +17 -1
- package/src/tools/tool-manifest.ts +9 -3
- package/src/tools/types.ts +2 -0
- package/src/util/browser.ts +25 -10
- package/src/util/bun-runtime.ts +172 -0
- package/src/util/logger.ts +1 -1
- package/src/util/platform.ts +50 -17
- package/src/watcher/providers/outlook-calendar.ts +343 -0
- package/src/watcher/providers/outlook.ts +198 -0
- package/src/workspace/migrations/023-move-config-files-to-workspace.ts +2 -2
- package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +2 -2
- package/src/workspace/migrations/025-remove-oauth-app-setup-skills.ts +76 -0
- package/src/workspace/migrations/026-backfill-install-meta.ts +325 -0
- package/src/workspace/migrations/027-remove-orphaned-optimized-images-cache.ts +42 -0
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +270 -0
- package/src/workspace/migrations/029-seed-pkb.ts +84 -0
- package/src/workspace/migrations/registry.ts +10 -0
- package/src/workspace/top-level-renderer.ts +5 -9
- package/src/__tests__/cli-memory.test.ts +0 -372
- package/src/__tests__/clipboard.test.ts +0 -88
- package/src/__tests__/context-memory-e2e.test.ts +0 -415
- package/src/__tests__/journal-context.test.ts +0 -268
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +0 -297
- package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -459
- package/src/__tests__/memory-query-builder.test.ts +0 -59
- package/src/__tests__/memory-recall-quality.test.ts +0 -1046
- package/src/__tests__/memory-regressions.experimental.test.ts +0 -629
- package/src/__tests__/memory-regressions.test.ts +0 -3696
- package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -295
- package/src/cli/cli-memory.ts +0 -176
- package/src/daemon/conversation-memory.ts +0 -207
- package/src/memory/conversation-starters-cadence.ts +0 -74
- package/src/memory/items-extractor.ts +0 -860
- package/src/memory/job-handlers/batch-extraction.ts +0 -753
- package/src/memory/job-handlers/extraction.ts +0 -40
- package/src/memory/job-handlers/journal-carry-forward.test.ts +0 -355
- package/src/memory/job-handlers/journal-carry-forward.ts +0 -255
- package/src/memory/journal-memory.ts +0 -224
- package/src/memory/query-builder.ts +0 -47
- package/src/memory/query-expansion.ts +0 -83
- package/src/memory/retriever.test.ts +0 -1592
- package/src/memory/retriever.ts +0 -1331
- package/src/memory/search/formatting.test.ts +0 -140
- package/src/memory/search/formatting.ts +0 -262
- package/src/memory/search/mmr.ts +0 -139
- package/src/memory/search/ranking.ts +0 -15
- package/src/memory/search/staleness.ts +0 -40
- package/src/memory/search/tier-classifier.ts +0 -18
- package/src/memory/search/types.ts +0 -121
- package/src/prompts/journal-context.ts +0 -154
- package/src/tools/memory/definitions.ts +0 -69
- package/src/tools/memory/handlers.test.ts +0 -562
- package/src/tools/memory/handlers.ts +0 -434
- package/src/util/clipboard.ts +0 -34
|
@@ -1,295 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Retrieval Benchmark
|
|
3
|
-
*
|
|
4
|
-
* Measures end-to-end memory recall time with varying database sizes.
|
|
5
|
-
* Validates latency stays within acceptable bounds and token budget
|
|
6
|
-
* enforcement works correctly.
|
|
7
|
-
*
|
|
8
|
-
* The pipeline uses hybrid search (Qdrant) only. With Qdrant mocked empty,
|
|
9
|
-
* no candidates are found and injectedText is empty. The tests verify
|
|
10
|
-
* pipeline completion, latency bounds, and token budget enforcement.
|
|
11
|
-
*/
|
|
12
|
-
import {
|
|
13
|
-
afterAll,
|
|
14
|
-
beforeAll,
|
|
15
|
-
beforeEach,
|
|
16
|
-
describe,
|
|
17
|
-
expect,
|
|
18
|
-
mock,
|
|
19
|
-
test,
|
|
20
|
-
} from "bun:test";
|
|
21
|
-
|
|
22
|
-
mock.module("../util/logger.js", () => ({
|
|
23
|
-
getLogger: () =>
|
|
24
|
-
new Proxy({} as Record<string, unknown>, {
|
|
25
|
-
get: () => () => {},
|
|
26
|
-
}),
|
|
27
|
-
}));
|
|
28
|
-
|
|
29
|
-
// Counter for semantic search invocations
|
|
30
|
-
let semanticSearchCallCount = 0;
|
|
31
|
-
|
|
32
|
-
mock.module("../memory/search/semantic.js", () => ({
|
|
33
|
-
semanticSearch: async () => {
|
|
34
|
-
semanticSearchCallCount++;
|
|
35
|
-
return [];
|
|
36
|
-
},
|
|
37
|
-
isQdrantConnectionError: () => false,
|
|
38
|
-
}));
|
|
39
|
-
|
|
40
|
-
mock.module("../memory/embedding-backend.js", () => ({
|
|
41
|
-
getMemoryBackendStatus: async (config: { memory: { enabled: boolean } }) => ({
|
|
42
|
-
enabled: config.memory.enabled,
|
|
43
|
-
degraded: false,
|
|
44
|
-
provider: "local",
|
|
45
|
-
model: "mock-embedding",
|
|
46
|
-
reason: null,
|
|
47
|
-
}),
|
|
48
|
-
embedWithBackend: async () => ({
|
|
49
|
-
provider: "local" as const,
|
|
50
|
-
model: "mock-embedding",
|
|
51
|
-
vectors: [new Array(1536).fill(0)],
|
|
52
|
-
}),
|
|
53
|
-
generateSparseEmbedding: () => ({ indices: [], values: [] }),
|
|
54
|
-
logMemoryEmbeddingWarning: () => {},
|
|
55
|
-
}));
|
|
56
|
-
|
|
57
|
-
import { DEFAULT_CONFIG } from "../config/defaults.js";
|
|
58
|
-
import type { AssistantConfig } from "../config/types.js";
|
|
59
|
-
import { getDb, initializeDb, resetDb } from "../memory/db.js";
|
|
60
|
-
import { buildMemoryRecall } from "../memory/retriever.js";
|
|
61
|
-
import { conversations, memorySegments, messages } from "../memory/schema.js";
|
|
62
|
-
|
|
63
|
-
function seedMemoryItems(
|
|
64
|
-
conversationId: string,
|
|
65
|
-
count: number,
|
|
66
|
-
now: number,
|
|
67
|
-
): void {
|
|
68
|
-
const db = getDb();
|
|
69
|
-
db.insert(conversations)
|
|
70
|
-
.values({
|
|
71
|
-
id: conversationId,
|
|
72
|
-
title: null,
|
|
73
|
-
createdAt: now,
|
|
74
|
-
updatedAt: now,
|
|
75
|
-
totalInputTokens: 0,
|
|
76
|
-
totalOutputTokens: 0,
|
|
77
|
-
totalEstimatedCost: 0,
|
|
78
|
-
contextSummary: null,
|
|
79
|
-
contextCompactedMessageCount: 0,
|
|
80
|
-
contextCompactedAt: null,
|
|
81
|
-
})
|
|
82
|
-
.run();
|
|
83
|
-
|
|
84
|
-
for (let i = 0; i < count; i++) {
|
|
85
|
-
const msgId = `msg-${conversationId}-${i}`;
|
|
86
|
-
const text = `Memory item ${i}: information about topic-${
|
|
87
|
-
i % 20
|
|
88
|
-
} including keyword-${i % 10} details.`;
|
|
89
|
-
db.insert(messages)
|
|
90
|
-
.values({
|
|
91
|
-
id: msgId,
|
|
92
|
-
conversationId,
|
|
93
|
-
role: i % 2 === 0 ? "user" : "assistant",
|
|
94
|
-
content: JSON.stringify([{ type: "text", text }]),
|
|
95
|
-
createdAt: now + i,
|
|
96
|
-
})
|
|
97
|
-
.run();
|
|
98
|
-
db.insert(memorySegments)
|
|
99
|
-
.values({
|
|
100
|
-
id: `seg-${conversationId}-${i}`,
|
|
101
|
-
messageId: msgId,
|
|
102
|
-
conversationId,
|
|
103
|
-
role: i % 2 === 0 ? "user" : "assistant",
|
|
104
|
-
segmentIndex: 0,
|
|
105
|
-
text,
|
|
106
|
-
tokenEstimate: 20,
|
|
107
|
-
scopeId: "default",
|
|
108
|
-
createdAt: now + i,
|
|
109
|
-
updatedAt: now + i,
|
|
110
|
-
})
|
|
111
|
-
.run();
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function makeConfig(overrides?: { maxInjectTokens?: number }): AssistantConfig {
|
|
116
|
-
return {
|
|
117
|
-
...DEFAULT_CONFIG,
|
|
118
|
-
memory: {
|
|
119
|
-
...DEFAULT_CONFIG.memory,
|
|
120
|
-
embeddings: {
|
|
121
|
-
...DEFAULT_CONFIG.memory.embeddings,
|
|
122
|
-
provider: "local" as const,
|
|
123
|
-
required: false,
|
|
124
|
-
},
|
|
125
|
-
retrieval: {
|
|
126
|
-
...DEFAULT_CONFIG.memory.retrieval,
|
|
127
|
-
maxInjectTokens: overrides?.maxInjectTokens ?? 750,
|
|
128
|
-
dynamicBudget: {
|
|
129
|
-
enabled: false,
|
|
130
|
-
minInjectTokens: 160,
|
|
131
|
-
maxInjectTokens: overrides?.maxInjectTokens ?? 750,
|
|
132
|
-
targetHeadroomTokens: 900,
|
|
133
|
-
},
|
|
134
|
-
},
|
|
135
|
-
},
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
describe("Memory retrieval benchmark", () => {
|
|
140
|
-
beforeAll(() => {
|
|
141
|
-
initializeDb();
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
beforeEach(() => {
|
|
145
|
-
const db = getDb();
|
|
146
|
-
db.run("DELETE FROM memory_item_sources");
|
|
147
|
-
db.run("DELETE FROM memory_embeddings");
|
|
148
|
-
db.run("DELETE FROM memory_items");
|
|
149
|
-
|
|
150
|
-
db.run("DELETE FROM memory_segments");
|
|
151
|
-
db.run("DELETE FROM messages");
|
|
152
|
-
db.run("DELETE FROM conversations");
|
|
153
|
-
db.run("DELETE FROM memory_jobs");
|
|
154
|
-
db.run("DELETE FROM memory_checkpoints");
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
afterAll(() => {
|
|
158
|
-
resetDb();
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
test("retrieval completes under 500ms for 100 items", async () => {
|
|
162
|
-
const conversationId = "conv-bench-100";
|
|
163
|
-
const now = 1_700_500_000_000;
|
|
164
|
-
seedMemoryItems(conversationId, 100, now);
|
|
165
|
-
|
|
166
|
-
const config = makeConfig();
|
|
167
|
-
const recall = await buildMemoryRecall(
|
|
168
|
-
"What do we know about topic-5 and keyword-3?",
|
|
169
|
-
conversationId,
|
|
170
|
-
config,
|
|
171
|
-
);
|
|
172
|
-
|
|
173
|
-
expect(recall.enabled).toBe(true);
|
|
174
|
-
expect(recall.degraded).toBe(false);
|
|
175
|
-
// Relaxed threshold — guards against severe regressions, not precise benchmarking
|
|
176
|
-
expect(recall.latencyMs).toBeLessThan(500);
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
test("retrieval completes under 1000ms for 500 items", async () => {
|
|
180
|
-
const conversationId = "conv-bench-500";
|
|
181
|
-
const now = 1_700_500_000_000;
|
|
182
|
-
seedMemoryItems(conversationId, 500, now);
|
|
183
|
-
|
|
184
|
-
const config = makeConfig();
|
|
185
|
-
const recall = await buildMemoryRecall(
|
|
186
|
-
"What do we know about topic-5 and keyword-3?",
|
|
187
|
-
conversationId,
|
|
188
|
-
config,
|
|
189
|
-
);
|
|
190
|
-
|
|
191
|
-
expect(recall.enabled).toBe(true);
|
|
192
|
-
expect(recall.degraded).toBe(false);
|
|
193
|
-
expect(recall.latencyMs).toBeLessThan(1000);
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
test("retrieval completes under 2000ms for 2000 items", async () => {
|
|
197
|
-
const conversationId = "conv-bench-2000";
|
|
198
|
-
const now = 1_700_500_000_000;
|
|
199
|
-
seedMemoryItems(conversationId, 2000, now);
|
|
200
|
-
|
|
201
|
-
const config = makeConfig();
|
|
202
|
-
const recall = await buildMemoryRecall(
|
|
203
|
-
"What do we know about topic-5 and keyword-3?",
|
|
204
|
-
conversationId,
|
|
205
|
-
config,
|
|
206
|
-
);
|
|
207
|
-
|
|
208
|
-
expect(recall.enabled).toBe(true);
|
|
209
|
-
expect(recall.degraded).toBe(false);
|
|
210
|
-
expect(recall.latencyMs).toBeLessThan(2000);
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
test("token budget enforcement: maxInjectTokens is respected", async () => {
|
|
214
|
-
const conversationId = "conv-bench-budget";
|
|
215
|
-
const now = 1_700_500_000_000;
|
|
216
|
-
seedMemoryItems(conversationId, 500, now);
|
|
217
|
-
|
|
218
|
-
const smallBudget = 200;
|
|
219
|
-
const config = makeConfig({ maxInjectTokens: smallBudget });
|
|
220
|
-
const recall = await buildMemoryRecall(
|
|
221
|
-
"What do we know about topic-5 and keyword-3?",
|
|
222
|
-
conversationId,
|
|
223
|
-
config,
|
|
224
|
-
);
|
|
225
|
-
|
|
226
|
-
expect(recall.enabled).toBe(true);
|
|
227
|
-
// With Qdrant mocked empty, no candidates are found.
|
|
228
|
-
// Verify the budget cap is still respected.
|
|
229
|
-
expect(recall.injectedTokens).toBeLessThanOrEqual(smallBudget);
|
|
230
|
-
|
|
231
|
-
// Compare against a larger budget
|
|
232
|
-
const largeBudget = 2000;
|
|
233
|
-
const largeConfig = makeConfig({ maxInjectTokens: largeBudget });
|
|
234
|
-
const largeRecall = await buildMemoryRecall(
|
|
235
|
-
"What do we know about topic-5 and keyword-3?",
|
|
236
|
-
conversationId,
|
|
237
|
-
largeConfig,
|
|
238
|
-
);
|
|
239
|
-
|
|
240
|
-
expect(largeRecall.injectedTokens).toBeLessThanOrEqual(largeBudget);
|
|
241
|
-
// With more budget, we should get at least as many tokens
|
|
242
|
-
expect(largeRecall.injectedTokens).toBeGreaterThanOrEqual(
|
|
243
|
-
recall.injectedTokens,
|
|
244
|
-
);
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
test("semantic search is invoked when not early terminated", async () => {
|
|
248
|
-
const conversationId = "conv-bench-semantic";
|
|
249
|
-
const now = 1_700_500_000_000;
|
|
250
|
-
seedMemoryItems(conversationId, 100, now);
|
|
251
|
-
|
|
252
|
-
const query = "What do we know about topic-5 and keyword-3?";
|
|
253
|
-
|
|
254
|
-
// earlyTermination is always false in the new pipeline, so semantic
|
|
255
|
-
// search should always be invoked when a query vector is available.
|
|
256
|
-
semanticSearchCallCount = 0;
|
|
257
|
-
const config = makeConfig();
|
|
258
|
-
await buildMemoryRecall(query, conversationId, config);
|
|
259
|
-
|
|
260
|
-
expect(semanticSearchCallCount).toBeGreaterThan(0);
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
test("recall.latencyMs tracks wall-clock within 50% tolerance", async () => {
|
|
264
|
-
const conversationId = "conv-bench-wallclock";
|
|
265
|
-
const now = 1_700_500_000_000;
|
|
266
|
-
seedMemoryItems(conversationId, 500, now);
|
|
267
|
-
|
|
268
|
-
const config = makeConfig();
|
|
269
|
-
|
|
270
|
-
// Use Date.now() to match the timer source used by buildMemoryRecall
|
|
271
|
-
// (which also uses Date.now()), avoiding precision mismatches between
|
|
272
|
-
// integer-ms Date.now() and sub-ms performance.now().
|
|
273
|
-
const wallStart = Date.now();
|
|
274
|
-
const recall = await buildMemoryRecall(
|
|
275
|
-
"What do we know about topic-5 and keyword-3?",
|
|
276
|
-
conversationId,
|
|
277
|
-
config,
|
|
278
|
-
);
|
|
279
|
-
const wallMs = Date.now() - wallStart;
|
|
280
|
-
|
|
281
|
-
expect(recall.enabled).toBe(true);
|
|
282
|
-
// latencyMs may be 0 when the pipeline runs very fast (< 1ms granularity)
|
|
283
|
-
expect(recall.latencyMs).toBeGreaterThanOrEqual(0);
|
|
284
|
-
|
|
285
|
-
// Self-reported latencyMs should agree with wall-clock within 50%.
|
|
286
|
-
// Tolerance is wide because both sides use Date.now() (integer ms),
|
|
287
|
-
// so on fast runs the quantization error can be large relative to
|
|
288
|
-
// total elapsed time.
|
|
289
|
-
if (wallMs > 0) {
|
|
290
|
-
const ratio = recall.latencyMs / wallMs;
|
|
291
|
-
expect(ratio).toBeGreaterThanOrEqual(0.5);
|
|
292
|
-
expect(ratio).toBeLessThanOrEqual(1.5);
|
|
293
|
-
}
|
|
294
|
-
});
|
|
295
|
-
});
|
package/src/cli/cli-memory.ts
DELETED
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
import { and, eq } from "drizzle-orm";
|
|
2
|
-
import { v4 as uuid } from "uuid";
|
|
3
|
-
|
|
4
|
-
import { getDb } from "../memory/db.js";
|
|
5
|
-
import { computeMemoryFingerprint } from "../memory/fingerprint.js";
|
|
6
|
-
import { enqueueMemoryJob } from "../memory/jobs-store.js";
|
|
7
|
-
import { memoryItems } from "../memory/schema.js";
|
|
8
|
-
import { getLogger } from "../util/logger.js";
|
|
9
|
-
import { buildCliProgram } from "./program.js";
|
|
10
|
-
|
|
11
|
-
const log = getLogger("cli-memory");
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Build a capability statement for a CLI command.
|
|
15
|
-
* Truncated to 500 chars max (matching the limit used by memory item extraction).
|
|
16
|
-
*/
|
|
17
|
-
export function buildCliCapabilityStatement(
|
|
18
|
-
name: string,
|
|
19
|
-
description: string,
|
|
20
|
-
): string {
|
|
21
|
-
let statement = `The "assistant ${name}" CLI command is available. ${description}.`;
|
|
22
|
-
|
|
23
|
-
// Truncate to 500 chars max
|
|
24
|
-
if (statement.length > 500) {
|
|
25
|
-
statement = statement.slice(0, 500);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return statement;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Upsert a capability memory item for a CLI command.
|
|
33
|
-
* Best-effort: errors are logged but never thrown.
|
|
34
|
-
*/
|
|
35
|
-
export function upsertCliCapabilityMemory(
|
|
36
|
-
commandName: string,
|
|
37
|
-
description: string,
|
|
38
|
-
): void {
|
|
39
|
-
try {
|
|
40
|
-
const db = getDb();
|
|
41
|
-
const subject = `cli:${commandName}`;
|
|
42
|
-
const statement = buildCliCapabilityStatement(commandName, description);
|
|
43
|
-
const kind = "capability";
|
|
44
|
-
const scopeId = "default";
|
|
45
|
-
const confidence = 1.0;
|
|
46
|
-
const importance = 0.7;
|
|
47
|
-
const fingerprint = computeMemoryFingerprint(
|
|
48
|
-
scopeId,
|
|
49
|
-
kind,
|
|
50
|
-
subject,
|
|
51
|
-
statement,
|
|
52
|
-
);
|
|
53
|
-
const now = Date.now();
|
|
54
|
-
|
|
55
|
-
const existing = db
|
|
56
|
-
.select()
|
|
57
|
-
.from(memoryItems)
|
|
58
|
-
.where(
|
|
59
|
-
and(
|
|
60
|
-
eq(memoryItems.kind, kind),
|
|
61
|
-
eq(memoryItems.subject, subject),
|
|
62
|
-
eq(memoryItems.scopeId, scopeId),
|
|
63
|
-
),
|
|
64
|
-
)
|
|
65
|
-
.get();
|
|
66
|
-
|
|
67
|
-
if (existing) {
|
|
68
|
-
if (
|
|
69
|
-
existing.status === "active" &&
|
|
70
|
-
existing.fingerprint === fingerprint
|
|
71
|
-
) {
|
|
72
|
-
// Same content — just touch lastSeenAt
|
|
73
|
-
db.update(memoryItems)
|
|
74
|
-
.set({ lastSeenAt: now })
|
|
75
|
-
.where(eq(memoryItems.id, existing.id))
|
|
76
|
-
.run();
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
if (existing.status === "active") {
|
|
81
|
-
// Content changed — update statement and fingerprint
|
|
82
|
-
db.update(memoryItems)
|
|
83
|
-
.set({
|
|
84
|
-
statement,
|
|
85
|
-
fingerprint,
|
|
86
|
-
lastSeenAt: now,
|
|
87
|
-
})
|
|
88
|
-
.where(eq(memoryItems.id, existing.id))
|
|
89
|
-
.run();
|
|
90
|
-
enqueueMemoryJob("embed_item", { itemId: existing.id });
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// status === "deleted" or other — reactivate
|
|
95
|
-
db.update(memoryItems)
|
|
96
|
-
.set({
|
|
97
|
-
status: "active",
|
|
98
|
-
statement,
|
|
99
|
-
fingerprint,
|
|
100
|
-
lastSeenAt: now,
|
|
101
|
-
firstSeenAt: now,
|
|
102
|
-
})
|
|
103
|
-
.where(eq(memoryItems.id, existing.id))
|
|
104
|
-
.run();
|
|
105
|
-
enqueueMemoryJob("embed_item", { itemId: existing.id });
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// No existing — insert new row
|
|
110
|
-
const id = uuid();
|
|
111
|
-
db.insert(memoryItems)
|
|
112
|
-
.values({
|
|
113
|
-
id,
|
|
114
|
-
kind,
|
|
115
|
-
subject,
|
|
116
|
-
statement,
|
|
117
|
-
status: "active",
|
|
118
|
-
confidence,
|
|
119
|
-
importance,
|
|
120
|
-
fingerprint,
|
|
121
|
-
sourceType: "extraction",
|
|
122
|
-
scopeId,
|
|
123
|
-
firstSeenAt: now,
|
|
124
|
-
lastSeenAt: now,
|
|
125
|
-
})
|
|
126
|
-
.run();
|
|
127
|
-
enqueueMemoryJob("embed_item", { itemId: id });
|
|
128
|
-
} catch (err) {
|
|
129
|
-
log.warn({ err, commandName }, "Failed to upsert CLI capability memory");
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Seed capability memory items for all CLI commands.
|
|
135
|
-
* Prunes stale entries whose commands are no longer registered.
|
|
136
|
-
* Best-effort: errors are logged but never thrown.
|
|
137
|
-
*/
|
|
138
|
-
export function seedCliCommandMemories(): void {
|
|
139
|
-
try {
|
|
140
|
-
const program = buildCliProgram();
|
|
141
|
-
const commandNames = new Set<string>();
|
|
142
|
-
|
|
143
|
-
for (const cmd of program.commands) {
|
|
144
|
-
commandNames.add(cmd.name());
|
|
145
|
-
upsertCliCapabilityMemory(cmd.name(), cmd.description());
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// Prune stale capability memories for commands no longer registered
|
|
149
|
-
const db = getDb();
|
|
150
|
-
const allCapabilities = db
|
|
151
|
-
.select()
|
|
152
|
-
.from(memoryItems)
|
|
153
|
-
.where(
|
|
154
|
-
and(
|
|
155
|
-
eq(memoryItems.kind, "capability"),
|
|
156
|
-
eq(memoryItems.scopeId, "default"),
|
|
157
|
-
eq(memoryItems.status, "active"),
|
|
158
|
-
),
|
|
159
|
-
)
|
|
160
|
-
.all();
|
|
161
|
-
|
|
162
|
-
const now = Date.now();
|
|
163
|
-
for (const item of allCapabilities) {
|
|
164
|
-
if (!item.subject.startsWith("cli:")) continue;
|
|
165
|
-
const itemCommandName = item.subject.replace("cli:", "");
|
|
166
|
-
if (!commandNames.has(itemCommandName)) {
|
|
167
|
-
db.update(memoryItems)
|
|
168
|
-
.set({ status: "deleted", lastSeenAt: now })
|
|
169
|
-
.where(eq(memoryItems.id, item.id))
|
|
170
|
-
.run();
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
} catch (err) {
|
|
174
|
-
log.warn({ err }, "Failed to seed CLI command memories");
|
|
175
|
-
}
|
|
176
|
-
}
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
import { getConfig } from "../config/loader.js";
|
|
2
|
-
import { estimatePromptTokens } from "../context/token-estimator.js";
|
|
3
|
-
import { buildMemoryQuery } from "../memory/query-builder.js";
|
|
4
|
-
import { computeRecallBudget } from "../memory/retrieval-budget.js";
|
|
5
|
-
import {
|
|
6
|
-
buildMemoryRecall,
|
|
7
|
-
injectMemoryRecallAsUserBlock,
|
|
8
|
-
} from "../memory/retriever.js";
|
|
9
|
-
import type { ScopePolicyOverride } from "../memory/search/types.js";
|
|
10
|
-
import type { Message } from "../providers/types.js";
|
|
11
|
-
import type { Provider } from "../providers/types.js";
|
|
12
|
-
import type { ServerMessage } from "./message-protocol.js";
|
|
13
|
-
|
|
14
|
-
export interface MemoryRecallResult {
|
|
15
|
-
runMessages: Message[];
|
|
16
|
-
recall: Awaited<ReturnType<typeof buildMemoryRecall>>;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface MemoryPrepareContext {
|
|
20
|
-
conversationId: string;
|
|
21
|
-
messages: Message[];
|
|
22
|
-
systemPrompt: string;
|
|
23
|
-
provider: Provider;
|
|
24
|
-
scopeId: string;
|
|
25
|
-
includeDefaultFallback: boolean;
|
|
26
|
-
trustClass: "guardian" | "trusted_contact" | "unknown";
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Returns true when the latest user turn is an internal tool-result-only
|
|
31
|
-
* message (no user-authored text/image content).
|
|
32
|
-
*/
|
|
33
|
-
function isToolResultOnlyUserTurn(message: Message | undefined): boolean {
|
|
34
|
-
return (
|
|
35
|
-
message?.role === "user" &&
|
|
36
|
-
message.content.length > 0 &&
|
|
37
|
-
message.content.every(
|
|
38
|
-
(block) =>
|
|
39
|
-
block.type === "tool_result" || block.type === "web_search_tool_result",
|
|
40
|
-
)
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Fast gate that determines whether the current turn warrants memory
|
|
46
|
-
* retrieval. Returns `false` for mechanical no-ops (empty content,
|
|
47
|
-
* tool-result-only) so the full memory pipeline can be skipped.
|
|
48
|
-
* Runs in microseconds — no external calls.
|
|
49
|
-
*
|
|
50
|
-
* Note: We intentionally avoid character-length heuristics here.
|
|
51
|
-
* Short messages like "What did I say?" or "My preferences?" are
|
|
52
|
-
* legitimate memory queries. Per AGENTS.md, judgement calls about
|
|
53
|
-
* message value should be routed through the daemon, not hardcoded.
|
|
54
|
-
*/
|
|
55
|
-
export function needsMemory(messages: Message[], content: string): boolean {
|
|
56
|
-
// Empty or whitespace-only content — mechanical validation, nothing to query
|
|
57
|
-
if (!content || content.trim().length === 0) return false;
|
|
58
|
-
|
|
59
|
-
// Tool-result-only turns (assistant tool loop)
|
|
60
|
-
const latestMessage = messages[messages.length - 1];
|
|
61
|
-
if (isToolResultOnlyUserTurn(latestMessage)) return false;
|
|
62
|
-
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Build memory recall for a single agent loop turn using the V2 hybrid
|
|
68
|
-
* pipeline. Returns the augmented run messages and metadata for
|
|
69
|
-
* downstream event emission.
|
|
70
|
-
*
|
|
71
|
-
* Memory context is injected as a text content block prepended to the
|
|
72
|
-
* last user message (same pattern as workspace/temporal injections).
|
|
73
|
-
* Stripping is handled by `stripUserTextBlocksByPrefix` matching the
|
|
74
|
-
* `<memory_context __injected>` prefix in `RUNTIME_INJECTION_PREFIXES`.
|
|
75
|
-
*/
|
|
76
|
-
export async function prepareMemoryContext(
|
|
77
|
-
ctx: MemoryPrepareContext,
|
|
78
|
-
content: string,
|
|
79
|
-
userMessageId: string,
|
|
80
|
-
abortSignal: AbortSignal,
|
|
81
|
-
onEvent: (msg: ServerMessage) => void,
|
|
82
|
-
): Promise<MemoryRecallResult> {
|
|
83
|
-
// Provenance-based trust gating: untrusted actors skip all memory operations
|
|
84
|
-
// to prevent untrusted content from influencing memory-augmented responses.
|
|
85
|
-
const isTrustedActor = ctx.trustClass === "guardian";
|
|
86
|
-
|
|
87
|
-
// Build a no-op result that skips the entire memory pipeline.
|
|
88
|
-
const noopResult = (): MemoryRecallResult => ({
|
|
89
|
-
runMessages: ctx.messages,
|
|
90
|
-
recall: {
|
|
91
|
-
enabled: false,
|
|
92
|
-
degraded: false,
|
|
93
|
-
injectedText: "",
|
|
94
|
-
semanticHits: 0,
|
|
95
|
-
mergedCount: 0,
|
|
96
|
-
selectedCount: 0,
|
|
97
|
-
injectedTokens: 0,
|
|
98
|
-
latencyMs: 0,
|
|
99
|
-
topCandidates: [],
|
|
100
|
-
tier1Count: 0,
|
|
101
|
-
tier2Count: 0,
|
|
102
|
-
} as Awaited<ReturnType<typeof buildMemoryRecall>>,
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
if (!isTrustedActor) {
|
|
106
|
-
return noopResult();
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// Gate: skip the entire memory pipeline for mechanical no-ops (empty
|
|
110
|
-
// content, tool-result-only turns).
|
|
111
|
-
if (!needsMemory(ctx.messages, content)) {
|
|
112
|
-
return noopResult();
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const runtimeConfig = getConfig();
|
|
116
|
-
|
|
117
|
-
// Memory recall via the V2 hybrid pipeline
|
|
118
|
-
const recallQuery = buildMemoryQuery(content, ctx.messages);
|
|
119
|
-
const dynamicBudgetConfig = runtimeConfig.memory?.retrieval?.dynamicBudget;
|
|
120
|
-
const recallBudget = dynamicBudgetConfig?.enabled
|
|
121
|
-
? computeRecallBudget({
|
|
122
|
-
estimatedPromptTokens: estimatePromptTokens(
|
|
123
|
-
ctx.messages,
|
|
124
|
-
ctx.systemPrompt,
|
|
125
|
-
{ providerName: ctx.provider.name },
|
|
126
|
-
),
|
|
127
|
-
maxInputTokens: runtimeConfig.contextWindow.maxInputTokens,
|
|
128
|
-
targetHeadroomTokens: dynamicBudgetConfig.targetHeadroomTokens,
|
|
129
|
-
minInjectTokens: dynamicBudgetConfig.minInjectTokens,
|
|
130
|
-
maxInjectTokens: dynamicBudgetConfig.maxInjectTokens,
|
|
131
|
-
})
|
|
132
|
-
: undefined;
|
|
133
|
-
// Build scope policy override for non-default scopes so retrieval
|
|
134
|
-
// honours the conversation's memory policy regardless of the global config.
|
|
135
|
-
const scopePolicyOverride: ScopePolicyOverride | undefined =
|
|
136
|
-
ctx.scopeId !== "default"
|
|
137
|
-
? { scopeId: ctx.scopeId, fallbackToDefault: ctx.includeDefaultFallback }
|
|
138
|
-
: undefined;
|
|
139
|
-
|
|
140
|
-
const recall = await buildMemoryRecall(
|
|
141
|
-
recallQuery,
|
|
142
|
-
ctx.conversationId,
|
|
143
|
-
runtimeConfig,
|
|
144
|
-
{
|
|
145
|
-
excludeMessageIds: [userMessageId],
|
|
146
|
-
signal: abortSignal,
|
|
147
|
-
maxInjectTokensOverride: recallBudget,
|
|
148
|
-
scopeId: ctx.scopeId,
|
|
149
|
-
scopePolicyOverride,
|
|
150
|
-
},
|
|
151
|
-
);
|
|
152
|
-
onEvent({
|
|
153
|
-
type: "memory_status",
|
|
154
|
-
enabled: recall.enabled,
|
|
155
|
-
degraded: recall.degraded,
|
|
156
|
-
degradation: recall.degradation
|
|
157
|
-
? {
|
|
158
|
-
semanticUnavailable: recall.degradation.semanticUnavailable,
|
|
159
|
-
reason: recall.degradation.reason,
|
|
160
|
-
fallbackSources: [...recall.degradation.fallbackSources],
|
|
161
|
-
}
|
|
162
|
-
: undefined,
|
|
163
|
-
reason: recall.reason,
|
|
164
|
-
provider: recall.provider,
|
|
165
|
-
model: recall.model,
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
// Inject recall as a text block prepended to the last user message.
|
|
169
|
-
// When injection text is empty, skip injection entirely.
|
|
170
|
-
let runMessages = ctx.messages;
|
|
171
|
-
if (recall.injectedText.length > 0) {
|
|
172
|
-
const userTail = ctx.messages[ctx.messages.length - 1];
|
|
173
|
-
if (userTail && userTail.role === "user") {
|
|
174
|
-
runMessages = injectMemoryRecallAsUserBlock(
|
|
175
|
-
ctx.messages,
|
|
176
|
-
recall.injectedText,
|
|
177
|
-
);
|
|
178
|
-
onEvent({
|
|
179
|
-
type: "memory_recalled",
|
|
180
|
-
provider: recall.provider ?? "unknown",
|
|
181
|
-
model: recall.model ?? "unknown",
|
|
182
|
-
degradation: recall.degradation
|
|
183
|
-
? {
|
|
184
|
-
semanticUnavailable: recall.degradation.semanticUnavailable,
|
|
185
|
-
reason: recall.degradation.reason,
|
|
186
|
-
fallbackSources: [...recall.degradation.fallbackSources],
|
|
187
|
-
}
|
|
188
|
-
: undefined,
|
|
189
|
-
semanticHits: recall.semanticHits,
|
|
190
|
-
tier1Count: recall.tier1Count ?? 0,
|
|
191
|
-
tier2Count: recall.tier2Count ?? 0,
|
|
192
|
-
hybridSearchLatencyMs: recall.hybridSearchMs ?? 0,
|
|
193
|
-
sparseVectorUsed: recall.sparseVectorUsed ?? false,
|
|
194
|
-
mergedCount: recall.mergedCount,
|
|
195
|
-
selectedCount: recall.selectedCount,
|
|
196
|
-
injectedTokens: recall.injectedTokens,
|
|
197
|
-
latencyMs: recall.latencyMs,
|
|
198
|
-
topCandidates: recall.topCandidates,
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
return {
|
|
204
|
-
runMessages,
|
|
205
|
-
recall,
|
|
206
|
-
};
|
|
207
|
-
}
|