@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
|
@@ -68,14 +68,13 @@ export function findLastUndoableUserMessageIndex(messages: Message[]): number {
|
|
|
68
68
|
// ── Qdrant Vector Cleanup ────────────────────────────────────────────
|
|
69
69
|
|
|
70
70
|
/**
|
|
71
|
-
* Delete Qdrant vector entries for the given segment
|
|
71
|
+
* Delete Qdrant vector entries for the given segment IDs.
|
|
72
72
|
* Individual deletion failures are logged and enqueued as retry jobs
|
|
73
73
|
* to prevent silently orphaned vectors.
|
|
74
74
|
*/
|
|
75
75
|
export async function cleanupQdrantVectors(
|
|
76
76
|
conversationId: string,
|
|
77
77
|
segmentIds: string[],
|
|
78
|
-
orphanedItemIds: string[],
|
|
79
78
|
): Promise<void> {
|
|
80
79
|
let qdrant: ReturnType<typeof getQdrantClient>;
|
|
81
80
|
try {
|
|
@@ -84,15 +83,12 @@ export async function cleanupQdrantVectors(
|
|
|
84
83
|
return; // Qdrant not initialized — nothing to clean up.
|
|
85
84
|
}
|
|
86
85
|
|
|
87
|
-
if (segmentIds.length === 0
|
|
86
|
+
if (segmentIds.length === 0) return;
|
|
88
87
|
|
|
89
88
|
const targets: Array<{ targetType: string; targetId: string }> = [];
|
|
90
89
|
for (const segId of segmentIds) {
|
|
91
90
|
targets.push({ targetType: "segment", targetId: segId });
|
|
92
91
|
}
|
|
93
|
-
for (const itemId of orphanedItemIds) {
|
|
94
|
-
targets.push({ targetType: "item", targetId: itemId });
|
|
95
|
-
}
|
|
96
92
|
|
|
97
93
|
const results = await Promise.allSettled(
|
|
98
94
|
targets.map((t) =>
|
|
@@ -124,7 +120,6 @@ export async function cleanupQdrantVectors(
|
|
|
124
120
|
succeeded,
|
|
125
121
|
failed,
|
|
126
122
|
segments: segmentIds.length,
|
|
127
|
-
items: orphanedItemIds.length,
|
|
128
123
|
},
|
|
129
124
|
"Cleaned up Qdrant vectors after regenerate",
|
|
130
125
|
);
|
|
@@ -187,20 +182,17 @@ export function consolidateAssistantMessages(
|
|
|
187
182
|
// Still delete internal tool_result messages even if only one assistant message,
|
|
188
183
|
// and collect IDs for vector cleanup
|
|
189
184
|
const allSegmentIds: string[] = [];
|
|
190
|
-
const allOrphanedItemIds: string[] = [];
|
|
191
185
|
for (const id of messagesToDelete) {
|
|
192
186
|
const deleted = deleteMessageById(id);
|
|
193
187
|
didMutate = true;
|
|
194
188
|
allSegmentIds.push(...deleted.segmentIds);
|
|
195
|
-
allOrphanedItemIds.push(...deleted.orphanedItemIds);
|
|
196
189
|
}
|
|
197
190
|
|
|
198
191
|
// Clean up Qdrant vectors (fire-and-forget)
|
|
199
|
-
if (allSegmentIds.length > 0
|
|
192
|
+
if (allSegmentIds.length > 0) {
|
|
200
193
|
cleanupQdrantVectors(
|
|
201
194
|
conversationId,
|
|
202
195
|
allSegmentIds,
|
|
203
|
-
allOrphanedItemIds,
|
|
204
196
|
).catch((err) => {
|
|
205
197
|
log.warn(
|
|
206
198
|
{ err, conversationId },
|
|
@@ -322,24 +314,20 @@ export function consolidateAssistantMessages(
|
|
|
322
314
|
// Delete the other assistant messages and internal tool_result messages,
|
|
323
315
|
// and collect IDs for vector cleanup
|
|
324
316
|
const allSegmentIds: string[] = [];
|
|
325
|
-
const allOrphanedItemIds: string[] = [];
|
|
326
317
|
for (let i = 1; i < messagesToConsolidate.length; i++) {
|
|
327
318
|
const deleted = deleteMessageById(messagesToConsolidate[i].id);
|
|
328
319
|
allSegmentIds.push(...deleted.segmentIds);
|
|
329
|
-
allOrphanedItemIds.push(...deleted.orphanedItemIds);
|
|
330
320
|
}
|
|
331
321
|
for (const id of messagesToDelete) {
|
|
332
322
|
const deleted = deleteMessageById(id);
|
|
333
323
|
allSegmentIds.push(...deleted.segmentIds);
|
|
334
|
-
allOrphanedItemIds.push(...deleted.orphanedItemIds);
|
|
335
324
|
}
|
|
336
325
|
|
|
337
326
|
// Clean up Qdrant vectors (fire-and-forget)
|
|
338
|
-
if (allSegmentIds.length > 0
|
|
327
|
+
if (allSegmentIds.length > 0) {
|
|
339
328
|
cleanupQdrantVectors(
|
|
340
329
|
conversationId,
|
|
341
330
|
allSegmentIds,
|
|
342
|
-
allOrphanedItemIds,
|
|
343
331
|
).catch((err) => {
|
|
344
332
|
log.warn(
|
|
345
333
|
{ err, conversationId },
|
|
@@ -539,18 +527,15 @@ export async function regenerate(
|
|
|
539
527
|
|
|
540
528
|
// Delete each message via deleteMessageById and collect IDs for Qdrant cleanup.
|
|
541
529
|
const allSegmentIds: string[] = [];
|
|
542
|
-
const allOrphanedItemIds: string[] = [];
|
|
543
530
|
for (const msg of messagesToDelete) {
|
|
544
531
|
const deleted = deleteMessageById(msg.id);
|
|
545
532
|
allSegmentIds.push(...deleted.segmentIds);
|
|
546
|
-
allOrphanedItemIds.push(...deleted.orphanedItemIds);
|
|
547
533
|
}
|
|
548
534
|
|
|
549
535
|
// Clean up Qdrant vectors (fire-and-forget).
|
|
550
536
|
cleanupQdrantVectors(
|
|
551
537
|
conversation.conversationId,
|
|
552
538
|
allSegmentIds,
|
|
553
|
-
allOrphanedItemIds,
|
|
554
539
|
).catch((err) => {
|
|
555
540
|
log.warn(
|
|
556
541
|
{ err, conversationId: conversation.conversationId },
|
|
@@ -9,7 +9,6 @@ import type { EventBus } from "../events/bus.js";
|
|
|
9
9
|
import type { AssistantDomainEvents } from "../events/domain-events.js";
|
|
10
10
|
import type { ToolProfiler } from "../events/tool-profiling-listener.js";
|
|
11
11
|
import { getHookManager } from "../hooks/manager.js";
|
|
12
|
-
import { getMemoryCheckpoint } from "../memory/checkpoints.js";
|
|
13
12
|
import {
|
|
14
13
|
getConversation,
|
|
15
14
|
getMessages,
|
|
@@ -150,6 +149,11 @@ export interface DisposeContext extends AbortContext {
|
|
|
150
149
|
currentTurnSurfaces: Array<unknown>;
|
|
151
150
|
lastSurfaceAction: Map<string, unknown>;
|
|
152
151
|
workspaceTopLevelContext: string | null;
|
|
152
|
+
trustContext?: { trustClass: TrustClass };
|
|
153
|
+
/** Active memory node IDs snapshotted from the conversation's InContextTracker before disposal. */
|
|
154
|
+
activeContextNodeIds?: string[];
|
|
155
|
+
/** Memory scope for extraction — defaults to "default" if omitted. */
|
|
156
|
+
memoryScopeId?: string;
|
|
153
157
|
abort(): void;
|
|
154
158
|
}
|
|
155
159
|
|
|
@@ -199,6 +203,25 @@ export async function loadFromDb(ctx: LoadFromDbContext): Promise<void> {
|
|
|
199
203
|
|
|
200
204
|
content = reinjectImageSourcePaths(content, role, m.metadata);
|
|
201
205
|
|
|
206
|
+
// Re-inject persisted memory block from metadata so it survives
|
|
207
|
+
// conversation reloads (eviction, restart, fork).
|
|
208
|
+
if (role === "user" && m.metadata) {
|
|
209
|
+
try {
|
|
210
|
+
const meta = JSON.parse(m.metadata);
|
|
211
|
+
if (typeof meta.memoryInjectedBlock === "string") {
|
|
212
|
+
content = [
|
|
213
|
+
{
|
|
214
|
+
type: "text" as const,
|
|
215
|
+
text: `<memory __injected>\n${meta.memoryInjectedBlock}\n</memory>`,
|
|
216
|
+
},
|
|
217
|
+
...content,
|
|
218
|
+
];
|
|
219
|
+
}
|
|
220
|
+
} catch {
|
|
221
|
+
/* ignore parse errors — metadata may be malformed */
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
202
225
|
return { role, content };
|
|
203
226
|
});
|
|
204
227
|
|
|
@@ -269,17 +292,21 @@ export function disposeConversation(ctx: DisposeContext): void {
|
|
|
269
292
|
conversationId: ctx.conversationId,
|
|
270
293
|
});
|
|
271
294
|
|
|
272
|
-
// Trigger
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
enqueueMemoryJob("
|
|
295
|
+
// Trigger graph extraction for end-of-conversation sweep.
|
|
296
|
+
// Only extract from guardian conversations to preserve the memory trust
|
|
297
|
+
// boundary — untrusted content must not influence future memory retrieval.
|
|
298
|
+
if (!isUntrustedTrustClass(ctx.trustContext?.trustClass)) {
|
|
299
|
+
try {
|
|
300
|
+
enqueueMemoryJob("graph_extract", {
|
|
278
301
|
conversationId: ctx.conversationId,
|
|
302
|
+
scopeId: ctx.memoryScopeId ?? "default",
|
|
303
|
+
...(ctx.activeContextNodeIds?.length
|
|
304
|
+
? { activeContextNodeIds: ctx.activeContextNodeIds }
|
|
305
|
+
: {}),
|
|
279
306
|
});
|
|
307
|
+
} catch {
|
|
308
|
+
// Best-effort — don't block conversation disposal
|
|
280
309
|
}
|
|
281
|
-
} catch {
|
|
282
|
-
// Best-effort — don't block conversation disposal
|
|
283
310
|
}
|
|
284
311
|
|
|
285
312
|
ctx.abort();
|
|
@@ -6,13 +6,25 @@
|
|
|
6
6
|
* text stubs to shrink the payload before retrying.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import { estimateContentBlockTokens } from "../context/token-estimator.js";
|
|
9
10
|
import { getSummaryFromContextMessage } from "../context/window-manager.js";
|
|
10
11
|
import type { ContentBlock, Message } from "../providers/types.js";
|
|
11
12
|
|
|
13
|
+
export interface StripMediaOptions {
|
|
14
|
+
/** Token budget available for media in the latest user message. Keeps as
|
|
15
|
+
* many images as fit within this budget instead of the hardcoded limit. */
|
|
16
|
+
mediaTokenBudget?: number;
|
|
17
|
+
/** Provider name for per-image token estimation. */
|
|
18
|
+
providerName?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
12
21
|
const RETRY_KEEP_LATEST_MEDIA_BLOCKS = 3;
|
|
13
22
|
const MAX_MEDIA_STUB_TEXT = 2_000;
|
|
14
23
|
|
|
15
|
-
export function stripMediaPayloadsForRetry(
|
|
24
|
+
export function stripMediaPayloadsForRetry(
|
|
25
|
+
messages: Message[],
|
|
26
|
+
options?: StripMediaOptions,
|
|
27
|
+
): {
|
|
16
28
|
messages: Message[];
|
|
17
29
|
modified: boolean;
|
|
18
30
|
replacedBlocks: number;
|
|
@@ -31,6 +43,8 @@ export function stripMediaPayloadsForRetry(messages: Message[]): {
|
|
|
31
43
|
let modified = false;
|
|
32
44
|
let replacedBlocks = 0;
|
|
33
45
|
let keptLatestMediaBlocks = 0;
|
|
46
|
+
let cumulativeMediaTokens = 0;
|
|
47
|
+
const useBudget = options?.mediaTokenBudget != null;
|
|
34
48
|
|
|
35
49
|
const nextMessages = messages.map((msg, msgIndex) => {
|
|
36
50
|
const nextContent: ContentBlock[] = [];
|
|
@@ -39,9 +53,20 @@ export function stripMediaPayloadsForRetry(messages: Message[]): {
|
|
|
39
53
|
// few (in the most recent user message) and strip older ones so the
|
|
40
54
|
// retry can actually reduce context size when images are the cause.
|
|
41
55
|
if (block.type === "image") {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
56
|
+
let keep = false;
|
|
57
|
+
if (latestUserIndex === msgIndex) {
|
|
58
|
+
if (useBudget) {
|
|
59
|
+
const cost = estimateContentBlockTokens(block, {
|
|
60
|
+
providerName: options!.providerName,
|
|
61
|
+
});
|
|
62
|
+
if (cumulativeMediaTokens + cost <= options!.mediaTokenBudget!) {
|
|
63
|
+
cumulativeMediaTokens += cost;
|
|
64
|
+
keep = true;
|
|
65
|
+
}
|
|
66
|
+
} else {
|
|
67
|
+
keep = keptLatestMediaBlocks < RETRY_KEEP_LATEST_MEDIA_BLOCKS;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
45
70
|
if (keep) {
|
|
46
71
|
keptLatestMediaBlocks += 1;
|
|
47
72
|
nextContent.push(block);
|
|
@@ -54,9 +79,20 @@ export function stripMediaPayloadsForRetry(messages: Message[]): {
|
|
|
54
79
|
}
|
|
55
80
|
|
|
56
81
|
if (block.type === "file") {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
82
|
+
let keep = false;
|
|
83
|
+
if (latestUserIndex === msgIndex) {
|
|
84
|
+
if (useBudget) {
|
|
85
|
+
const cost = estimateContentBlockTokens(block, {
|
|
86
|
+
providerName: options!.providerName,
|
|
87
|
+
});
|
|
88
|
+
if (cumulativeMediaTokens + cost <= options!.mediaTokenBudget!) {
|
|
89
|
+
cumulativeMediaTokens += cost;
|
|
90
|
+
keep = true;
|
|
91
|
+
}
|
|
92
|
+
} else {
|
|
93
|
+
keep = keptLatestMediaBlocks < RETRY_KEEP_LATEST_MEDIA_BLOCKS;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
60
96
|
if (keep) {
|
|
61
97
|
keptLatestMediaBlocks += 1;
|
|
62
98
|
nextContent.push(block);
|
|
@@ -112,6 +148,48 @@ export function stripMediaPayloadsForRetry(messages: Message[]): {
|
|
|
112
148
|
};
|
|
113
149
|
}
|
|
114
150
|
|
|
151
|
+
/**
|
|
152
|
+
* Estimate the total token cost of stubs that will replace unconditionally
|
|
153
|
+
* stubbed media blocks (non-latest-user-message images/files and all
|
|
154
|
+
* tool_result-nested media). This lets callers account for stub overhead
|
|
155
|
+
* when computing the available media token budget.
|
|
156
|
+
*/
|
|
157
|
+
export function estimateUnconditionalStubTokens(
|
|
158
|
+
messages: Message[],
|
|
159
|
+
options?: { providerName?: string },
|
|
160
|
+
): number {
|
|
161
|
+
let latestUserIndex: number | null = null;
|
|
162
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
163
|
+
const msg = messages[i];
|
|
164
|
+
if (msg.role !== "user") continue;
|
|
165
|
+
if (isToolResultOnlyMessage(msg)) continue;
|
|
166
|
+
if (getSummaryFromContextMessage(msg) != null) continue;
|
|
167
|
+
latestUserIndex = i;
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
let stubTokens = 0;
|
|
172
|
+
for (let msgIndex = 0; msgIndex < messages.length; msgIndex++) {
|
|
173
|
+
const msg = messages[msgIndex];
|
|
174
|
+
for (const block of msg.content) {
|
|
175
|
+
if (block.type === "image" && msgIndex !== latestUserIndex) {
|
|
176
|
+
stubTokens += estimateContentBlockTokens(imageBlockToStub(block), options);
|
|
177
|
+
} else if (block.type === "file" && msgIndex !== latestUserIndex) {
|
|
178
|
+
stubTokens += estimateContentBlockTokens(fileBlockToStub(block), options);
|
|
179
|
+
} else if (block.type === "tool_result" && block.contentBlocks) { // guard:allow-tool-result-only — web_search_tool_result has no contentBlocks
|
|
180
|
+
for (const cb of block.contentBlocks) {
|
|
181
|
+
if (cb.type === "image") {
|
|
182
|
+
stubTokens += estimateContentBlockTokens(imageBlockToStub(cb), options);
|
|
183
|
+
} else if (cb.type === "file") {
|
|
184
|
+
stubTokens += estimateContentBlockTokens(fileBlockToStub(cb), options);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return stubTokens;
|
|
191
|
+
}
|
|
192
|
+
|
|
115
193
|
function imageBlockToStub(
|
|
116
194
|
block: Extract<ContentBlock, { type: "image" }>,
|
|
117
195
|
): Extract<ContentBlock, { type: "text" }> {
|
|
@@ -99,6 +99,7 @@ export function registerConversationNotifiers(
|
|
|
99
99
|
ctx.sendToClient({
|
|
100
100
|
type: "message_complete",
|
|
101
101
|
conversationId: conversationId,
|
|
102
|
+
messageId: msg.id,
|
|
102
103
|
});
|
|
103
104
|
}
|
|
104
105
|
},
|
|
@@ -133,6 +134,7 @@ export function registerConversationNotifiers(
|
|
|
133
134
|
ctx.sendToClient({
|
|
134
135
|
type: "message_complete",
|
|
135
136
|
conversationId: conversationId,
|
|
137
|
+
messageId: msg.id,
|
|
136
138
|
});
|
|
137
139
|
}
|
|
138
140
|
},
|
|
@@ -145,7 +147,7 @@ export function registerConversationNotifiers(
|
|
|
145
147
|
const callee = callSession?.toNumber ?? "the caller";
|
|
146
148
|
const questionText = `**Live call question** (to ${callee}):\n\n${question}\n\n_Use the call answer API to respond._`;
|
|
147
149
|
|
|
148
|
-
await addMessage(
|
|
150
|
+
const msg = await addMessage(
|
|
149
151
|
conversationId,
|
|
150
152
|
"assistant",
|
|
151
153
|
JSON.stringify([{ type: "text", text: questionText }]),
|
|
@@ -168,6 +170,7 @@ export function registerConversationNotifiers(
|
|
|
168
170
|
ctx.sendToClient({
|
|
169
171
|
type: "message_complete",
|
|
170
172
|
conversationId: conversationId,
|
|
173
|
+
messageId: msg.id,
|
|
171
174
|
});
|
|
172
175
|
},
|
|
173
176
|
);
|
|
@@ -54,7 +54,8 @@ export function formatCompactResult(result: ContextWindowResult): string {
|
|
|
54
54
|
if (!result.compacted) {
|
|
55
55
|
return `Context compaction skipped — ${result.reason ?? "nothing to compact"}.`;
|
|
56
56
|
}
|
|
57
|
-
const saved =
|
|
57
|
+
const saved =
|
|
58
|
+
result.previousEstimatedInputTokens - result.estimatedInputTokens;
|
|
58
59
|
return [
|
|
59
60
|
"Context Compacted\n",
|
|
60
61
|
`Tokens: ${fmt(result.previousEstimatedInputTokens)} → ${fmt(result.estimatedInputTokens)} (${fmt(saved)} saved)`,
|
|
@@ -295,13 +296,13 @@ export async function drainQueue(
|
|
|
295
296
|
if (next.isInteractive === false) {
|
|
296
297
|
conversation.clearProxyAvailability();
|
|
297
298
|
} else {
|
|
298
|
-
// Restore proxy availability only for desktop-originating turns (macos
|
|
299
|
+
// Restore proxy availability only for desktop-originating turns (macos)
|
|
299
300
|
// in case a prior non-interactive drain disabled it. Non-desktop interactive
|
|
300
301
|
// interfaces (CLI, Vellum) should not re-enable desktop host proxies.
|
|
301
302
|
const interfaceCtx =
|
|
302
303
|
queuedInterfaceCtx ?? conversation.getTurnInterfaceContext();
|
|
303
304
|
const sourceInterface = interfaceCtx?.userMessageInterface;
|
|
304
|
-
if (sourceInterface === "macos"
|
|
305
|
+
if (sourceInterface === "macos") {
|
|
305
306
|
conversation.restoreProxyAvailability();
|
|
306
307
|
conversation.addPreactivatedSkillId("computer-use");
|
|
307
308
|
}
|
|
@@ -310,7 +311,8 @@ export async function drainQueue(
|
|
|
310
311
|
// Snapshot persona context at turn start so later tool turns can't pick up
|
|
311
312
|
// a different actor's context if a concurrent request mutates the live fields.
|
|
312
313
|
conversation.currentTurnTrustContext = conversation.trustContext;
|
|
313
|
-
conversation.currentTurnChannelCapabilities =
|
|
314
|
+
conversation.currentTurnChannelCapabilities =
|
|
315
|
+
conversation.channelCapabilities;
|
|
314
316
|
|
|
315
317
|
// Resolve slash commands for queued messages
|
|
316
318
|
const slashResult = await resolveSlash(
|
|
@@ -671,7 +673,8 @@ export async function processMessage(
|
|
|
671
673
|
// Snapshot persona context at turn start so later tool turns can't pick up
|
|
672
674
|
// a different actor's context if a concurrent request mutates the live fields.
|
|
673
675
|
conversation.currentTurnTrustContext = conversation.trustContext;
|
|
674
|
-
conversation.currentTurnChannelCapabilities =
|
|
676
|
+
conversation.currentTurnChannelCapabilities =
|
|
677
|
+
conversation.channelCapabilities;
|
|
675
678
|
conversation.currentActiveSurfaceId = activeSurfaceId;
|
|
676
679
|
conversation.currentPage = currentPage;
|
|
677
680
|
const trimmedContent = content.trim();
|
|
@@ -880,7 +883,9 @@ export async function processMessage(
|
|
|
880
883
|
try {
|
|
881
884
|
const pmTurnCtx = conversation.getTurnChannelContext();
|
|
882
885
|
const pmInterfaceCtx = conversation.getTurnInterfaceContext();
|
|
883
|
-
const pmProvenance = provenanceFromTrustContext(
|
|
886
|
+
const pmProvenance = provenanceFromTrustContext(
|
|
887
|
+
conversation.trustContext,
|
|
888
|
+
);
|
|
884
889
|
const pmChannelMeta = {
|
|
885
890
|
...pmProvenance,
|
|
886
891
|
...(pmTurnCtx
|
|
@@ -892,7 +897,8 @@ export async function processMessage(
|
|
|
892
897
|
...(pmInterfaceCtx
|
|
893
898
|
? {
|
|
894
899
|
userMessageInterface: pmInterfaceCtx.userMessageInterface,
|
|
895
|
-
assistantMessageInterface:
|
|
900
|
+
assistantMessageInterface:
|
|
901
|
+
pmInterfaceCtx.assistantMessageInterface,
|
|
896
902
|
}
|
|
897
903
|
: {}),
|
|
898
904
|
};
|