@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
package/src/daemon/lifecycle.ts
CHANGED
|
@@ -5,7 +5,6 @@ import { reconcileCallsOnStartup } from "../calls/call-recovery.js";
|
|
|
5
5
|
import { setRelayBroadcast } from "../calls/relay-server.js";
|
|
6
6
|
import { TwilioConversationRelayProvider } from "../calls/twilio-provider.js";
|
|
7
7
|
import { setVoiceBridgeDeps } from "../calls/voice-session-bridge.js";
|
|
8
|
-
import { seedCliCommandMemories } from "../cli/cli-memory.js";
|
|
9
8
|
import {
|
|
10
9
|
getPlatformAssistantId,
|
|
11
10
|
getQdrantHttpPortEnv,
|
|
@@ -32,6 +31,7 @@ import {
|
|
|
32
31
|
awaitCesClientWithTimeout,
|
|
33
32
|
DEFAULT_CES_STARTUP_TIMEOUT_MS,
|
|
34
33
|
} from "../credential-execution/startup-timeout.js";
|
|
34
|
+
import { FilingService } from "../filing/filing-service.js";
|
|
35
35
|
import { HeartbeatService } from "../heartbeat/heartbeat-service.js";
|
|
36
36
|
import { getHookManager } from "../hooks/manager.js";
|
|
37
37
|
import { installTemplates } from "../hooks/templates.js";
|
|
@@ -82,7 +82,6 @@ import {
|
|
|
82
82
|
setCesClient,
|
|
83
83
|
setCesReconnect,
|
|
84
84
|
} from "../security/secure-keys.js";
|
|
85
|
-
import { seedCatalogSkillMemories } from "../skills/skill-memory.js";
|
|
86
85
|
import { UsageTelemetryReporter } from "../telemetry/usage-telemetry-reporter.js";
|
|
87
86
|
import { getDeviceId } from "../util/device-id.js";
|
|
88
87
|
import { getLogger, initLogger } from "../util/logger.js";
|
|
@@ -124,6 +123,7 @@ import {
|
|
|
124
123
|
} from "./handlers/conversations.js";
|
|
125
124
|
import { installAssistantSymlink } from "./install-symlink.js";
|
|
126
125
|
import type { ServerMessage } from "./message-protocol.js";
|
|
126
|
+
import { runProfilerSweep } from "./profiler-run-store.js";
|
|
127
127
|
import {
|
|
128
128
|
initializeProvidersAndTools,
|
|
129
129
|
registerMessagingProviders,
|
|
@@ -279,151 +279,191 @@ export async function runDaemon(): Promise<void> {
|
|
|
279
279
|
// workspace migrations (e.g. 009-backfill-conversation-disk-view)
|
|
280
280
|
// depend on DB migrations having run (e.g. the inline-attachment-to-disk
|
|
281
281
|
// backfill that populates attachment filePaths).
|
|
282
|
-
initializeDb();
|
|
283
|
-
// Seed well-known OAuth provider configurations (insert-if-not-exists)
|
|
284
|
-
seedOAuthProviders();
|
|
285
|
-
log.info("Daemon startup: DB initialized");
|
|
286
|
-
|
|
287
|
-
await runWorkspaceMigrations(getWorkspaceDir(), WORKSPACE_MIGRATIONS);
|
|
288
|
-
log.info("Daemon startup: workspace migrations complete");
|
|
289
|
-
|
|
290
|
-
// Backfill oauth_connection rows for manual-token providers (Telegram,
|
|
291
|
-
// Slack channel) that already have stored credentials from before the
|
|
292
|
-
// oauth_connection migration. Safe to call on every startup.
|
|
293
282
|
//
|
|
294
|
-
//
|
|
295
|
-
//
|
|
296
|
-
//
|
|
283
|
+
// If DB initialization fails (e.g. a migration error), the daemon
|
|
284
|
+
// continues in a degraded state — DB-dependent features won't work but
|
|
285
|
+
// the HTTP server and config-based subsystems still start so the process
|
|
286
|
+
// remains reachable for health checks and diagnostics.
|
|
287
|
+
let dbReady = false;
|
|
297
288
|
try {
|
|
298
|
-
|
|
289
|
+
initializeDb();
|
|
290
|
+
dbReady = true;
|
|
291
|
+
log.info("Daemon startup: DB initialized");
|
|
299
292
|
} catch (err) {
|
|
300
|
-
log.
|
|
293
|
+
log.error(
|
|
301
294
|
{ err },
|
|
302
|
-
"
|
|
295
|
+
"DB initialization failed — continuing startup in degraded mode",
|
|
303
296
|
);
|
|
304
297
|
}
|
|
305
298
|
|
|
306
|
-
//
|
|
307
|
-
//
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
"
|
|
314
|
-
|
|
299
|
+
// Seed well-known OAuth provider configurations (insert-if-not-exists).
|
|
300
|
+
// Runs in its own try/catch so a seeding error doesn't force degraded mode
|
|
301
|
+
// when the DB itself initialized successfully.
|
|
302
|
+
if (dbReady) {
|
|
303
|
+
try {
|
|
304
|
+
seedOAuthProviders();
|
|
305
|
+
} catch (err) {
|
|
306
|
+
log.warn({ err }, "OAuth provider seeding failed — continuing startup");
|
|
307
|
+
}
|
|
315
308
|
}
|
|
316
309
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
setSentryDeviceId(getDeviceId());
|
|
310
|
+
if (dbReady) {
|
|
311
|
+
await runWorkspaceMigrations(getWorkspaceDir(), WORKSPACE_MIGRATIONS);
|
|
312
|
+
log.info("Daemon startup: workspace migrations complete");
|
|
321
313
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
314
|
+
// Profiler retention sweep — prune completed profiler runs to stay
|
|
315
|
+
// within configured byte-count, run-count, and free-space budgets.
|
|
316
|
+
// Runs on every startup and is safe to call from explicit cleanup routes.
|
|
317
|
+
try {
|
|
318
|
+
const sweepResult = runProfilerSweep();
|
|
319
|
+
if (sweepResult.prunedCount > 0 || sweepResult.activeRunOverBudget) {
|
|
320
|
+
log.info(
|
|
321
|
+
{
|
|
322
|
+
prunedCount: sweepResult.prunedCount,
|
|
323
|
+
freedBytes: sweepResult.freedBytes,
|
|
324
|
+
activeRunOverBudget: sweepResult.activeRunOverBudget,
|
|
325
|
+
remainingRuns: sweepResult.remainingRuns,
|
|
326
|
+
},
|
|
327
|
+
"Profiler retention sweep completed on startup",
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
} catch (err) {
|
|
331
|
+
log.warn(
|
|
332
|
+
{ err },
|
|
333
|
+
"Profiler retention sweep failed — continuing startup",
|
|
334
|
+
);
|
|
337
335
|
}
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
336
|
+
|
|
337
|
+
// Backfill oauth_connection rows for manual-token providers (Telegram,
|
|
338
|
+
// Slack channel) that already have stored credentials from before the
|
|
339
|
+
// oauth_connection migration. Safe to call on every startup.
|
|
340
|
+
//
|
|
341
|
+
// Must run AFTER workspace migrations.
|
|
342
|
+
// Otherwise syncManualTokenConnection sees no stored credentials and
|
|
343
|
+
// incorrectly removes existing connection rows.
|
|
344
|
+
try {
|
|
345
|
+
await backfillManualTokenConnections();
|
|
346
|
+
} catch (err) {
|
|
347
|
+
log.warn(
|
|
348
|
+
{ err },
|
|
349
|
+
"Manual-token connection backfill failed — continuing startup",
|
|
350
|
+
);
|
|
343
351
|
}
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
352
|
+
|
|
353
|
+
// Backfill injection templates on Slack bot token credentials so the
|
|
354
|
+
// credential proxy can inject Authorization headers. Safe on every startup.
|
|
355
|
+
try {
|
|
356
|
+
backfillSlackInjectionTemplates();
|
|
357
|
+
} catch (err) {
|
|
358
|
+
log.warn(
|
|
359
|
+
{ err },
|
|
360
|
+
"Slack injection template backfill failed — continuing startup",
|
|
361
|
+
);
|
|
349
362
|
}
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
)
|
|
363
|
+
|
|
364
|
+
// Now that workspace migrations have run (including 003-seed-device-id
|
|
365
|
+
// which may copy the legacy installationId into device.json), it is safe
|
|
366
|
+
// to read the device ID and set the Sentry tag.
|
|
367
|
+
setSentryDeviceId(getDeviceId());
|
|
368
|
+
|
|
369
|
+
// Purge private (temporary) conversations from the previous daemon run.
|
|
370
|
+
// These are ephemeral by design and should not survive daemon restarts.
|
|
371
|
+
const { count: purgedCount, deletedMemory } = purgePrivateConversations();
|
|
372
|
+
if (purgedCount > 0) {
|
|
355
373
|
log.info(
|
|
356
|
-
{
|
|
357
|
-
|
|
358
|
-
orphanedItems: deletedMemory.orphanedItemIds.length,
|
|
359
|
-
deletedSummaries: deletedMemory.deletedSummaryIds.length,
|
|
360
|
-
},
|
|
361
|
-
"Enqueued Qdrant vector cleanup jobs for purged private conversations",
|
|
374
|
+
{ purgedCount },
|
|
375
|
+
`Purged ${purgedCount} private conversation(s) from previous daemon run`,
|
|
362
376
|
);
|
|
377
|
+
// Qdrant may not be ready at startup, so enqueue vector cleanup jobs
|
|
378
|
+
// rather than attempting direct deletion.
|
|
379
|
+
for (const segId of deletedMemory.segmentIds) {
|
|
380
|
+
enqueueMemoryJob("delete_qdrant_vectors", {
|
|
381
|
+
targetType: "segment",
|
|
382
|
+
targetId: segId,
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
for (const summaryId of deletedMemory.deletedSummaryIds) {
|
|
386
|
+
enqueueMemoryJob("delete_qdrant_vectors", {
|
|
387
|
+
targetType: "summary",
|
|
388
|
+
targetId: summaryId,
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
if (
|
|
392
|
+
deletedMemory.segmentIds.length > 0 ||
|
|
393
|
+
deletedMemory.deletedSummaryIds.length > 0
|
|
394
|
+
) {
|
|
395
|
+
log.info(
|
|
396
|
+
{
|
|
397
|
+
segments: deletedMemory.segmentIds.length,
|
|
398
|
+
deletedSummaries: deletedMemory.deletedSummaryIds.length,
|
|
399
|
+
},
|
|
400
|
+
"Enqueued Qdrant vector cleanup jobs for purged private conversations",
|
|
401
|
+
);
|
|
402
|
+
}
|
|
363
403
|
}
|
|
364
|
-
}
|
|
365
404
|
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
405
|
+
// Expire stale pending canonical guardian requests left over from before
|
|
406
|
+
// this process started. Two categories are cleaned up:
|
|
407
|
+
//
|
|
408
|
+
// 1. Interaction-bound kinds (tool_approval, pending_question) — their
|
|
409
|
+
// in-memory pending-interaction session references are gone, so they
|
|
410
|
+
// can never be completed.
|
|
411
|
+
// 2. Any pending request whose expiresAt has already passed — persistent
|
|
412
|
+
// kinds (access_request, tool_grant_request) that expired while the
|
|
413
|
+
// daemon was stopped are transitioned so dedup logic doesn't return
|
|
414
|
+
// stale rows.
|
|
415
|
+
const expiredCount = expireAllPendingCanonicalRequests();
|
|
416
|
+
if (expiredCount > 0) {
|
|
417
|
+
log.info(
|
|
418
|
+
{ event: "startup_expired_stale_requests", expiredCount },
|
|
419
|
+
`Expired ${expiredCount} stale canonical request(s) from previous process`,
|
|
420
|
+
);
|
|
421
|
+
}
|
|
383
422
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
423
|
+
// Ensure a vellum guardian binding exists so the identity system works
|
|
424
|
+
// without requiring a manual bootstrap step.
|
|
425
|
+
try {
|
|
426
|
+
ensureVellumGuardianBinding(DAEMON_INTERNAL_ASSISTANT_ID);
|
|
427
|
+
} catch (err) {
|
|
428
|
+
log.warn(
|
|
429
|
+
{ err },
|
|
430
|
+
"Vellum guardian binding backfill failed — continuing startup",
|
|
431
|
+
);
|
|
432
|
+
}
|
|
394
433
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
434
|
+
try {
|
|
435
|
+
syncUpdateBulletinOnStartup();
|
|
436
|
+
} catch (err) {
|
|
437
|
+
log.warn({ err }, "Bulletin sync failed — continuing startup");
|
|
438
|
+
}
|
|
400
439
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
440
|
+
// Recover orphaned work items that were left in 'running' state when the
|
|
441
|
+
// daemon previously crashed or was killed mid-task.
|
|
442
|
+
const orphanedRunning = listWorkItems({ status: "running" });
|
|
443
|
+
if (orphanedRunning.length > 0) {
|
|
444
|
+
for (const item of orphanedRunning) {
|
|
445
|
+
updateWorkItem(item.id, {
|
|
446
|
+
status: "failed",
|
|
447
|
+
lastRunStatus: "interrupted",
|
|
448
|
+
});
|
|
449
|
+
log.info(
|
|
450
|
+
{ workItemId: item.id, title: item.title },
|
|
451
|
+
"Recovered orphaned running work item → failed (interrupted)",
|
|
452
|
+
);
|
|
453
|
+
}
|
|
410
454
|
log.info(
|
|
411
|
-
{
|
|
412
|
-
"Recovered orphaned running work
|
|
455
|
+
{ count: orphanedRunning.length },
|
|
456
|
+
"Recovered orphaned running work items",
|
|
413
457
|
);
|
|
414
458
|
}
|
|
415
|
-
log.info(
|
|
416
|
-
{ count: orphanedRunning.length },
|
|
417
|
-
"Recovered orphaned running work items",
|
|
418
|
-
);
|
|
419
|
-
}
|
|
420
459
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
460
|
+
try {
|
|
461
|
+
const twilioProvider = new TwilioConversationRelayProvider();
|
|
462
|
+
await reconcileCallsOnStartup(twilioProvider, log);
|
|
463
|
+
} catch (err) {
|
|
464
|
+
log.warn({ err }, "Call recovery failed — continuing startup");
|
|
465
|
+
}
|
|
466
|
+
} // end if (dbReady)
|
|
427
467
|
|
|
428
468
|
// Merge CLI-provided default config (from VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH)
|
|
429
469
|
// into the workspace config file before the first loadConfig() call so
|
|
@@ -642,18 +682,38 @@ export async function runDaemon(): Promise<void> {
|
|
|
642
682
|
log.info("Daemon startup: starting memory worker");
|
|
643
683
|
bgRefs.memoryWorker = startMemoryJobsWorker();
|
|
644
684
|
|
|
645
|
-
// Seed capability
|
|
646
|
-
// pipeline can surface relevant skills via semantic search.
|
|
685
|
+
// Seed capability graph nodes (new memory graph system)
|
|
647
686
|
try {
|
|
648
|
-
|
|
687
|
+
const {
|
|
688
|
+
seedSkillGraphNodes,
|
|
689
|
+
seedCliGraphNodes,
|
|
690
|
+
seedUninstalledCatalogSkillMemories,
|
|
691
|
+
} = await import("../memory/graph/capability-seed.js");
|
|
692
|
+
seedSkillGraphNodes();
|
|
693
|
+
seedCliGraphNodes();
|
|
694
|
+
void seedUninstalledCatalogSkillMemories().catch((err) =>
|
|
695
|
+
log.warn(
|
|
696
|
+
{ err },
|
|
697
|
+
"Uninstalled catalog skill memory seeding failed — continuing",
|
|
698
|
+
),
|
|
699
|
+
);
|
|
649
700
|
} catch (err) {
|
|
650
|
-
log.warn({ err }, "
|
|
701
|
+
log.warn({ err }, "Graph capability seeding failed — continuing");
|
|
651
702
|
}
|
|
652
703
|
|
|
704
|
+
// Auto-bootstrap: if the graph has no non-procedural nodes but historical
|
|
705
|
+
// segments exist, enqueue a one-time graph_bootstrap job to populate the
|
|
706
|
+
// graph from conversation history and journal files.
|
|
653
707
|
try {
|
|
654
|
-
|
|
708
|
+
const { maybeEnqueueGraphBootstrap, cleanupStaleItemVectors } =
|
|
709
|
+
await import("../memory/graph/bootstrap.js");
|
|
710
|
+
maybeEnqueueGraphBootstrap();
|
|
711
|
+
// Fire-and-forget: clean up orphaned Qdrant vectors from dropped memory_items table
|
|
712
|
+
void cleanupStaleItemVectors().catch((err) =>
|
|
713
|
+
log.warn({ err }, "Stale item vector cleanup failed — continuing"),
|
|
714
|
+
);
|
|
655
715
|
} catch (err) {
|
|
656
|
-
log.warn({ err }, "
|
|
716
|
+
log.warn({ err }, "Graph bootstrap check failed — continuing");
|
|
657
717
|
}
|
|
658
718
|
}
|
|
659
719
|
|
|
@@ -810,8 +870,8 @@ export async function runDaemon(): Promise<void> {
|
|
|
810
870
|
guardianFollowUpConversationGenerator:
|
|
811
871
|
createGuardianFollowUpConversationGenerator(),
|
|
812
872
|
sendMessageDeps: {
|
|
813
|
-
getOrCreateConversation: (conversationId) =>
|
|
814
|
-
server.getConversationForMessages(conversationId),
|
|
873
|
+
getOrCreateConversation: (conversationId, options) =>
|
|
874
|
+
server.getConversationForMessages(conversationId, options),
|
|
815
875
|
assistantEventHub,
|
|
816
876
|
resolveAttachments: (attachmentIds) => {
|
|
817
877
|
const resolved = attachmentsStore.getAttachmentsByIds(attachmentIds, {
|
|
@@ -1187,6 +1247,26 @@ export async function runDaemon(): Promise<void> {
|
|
|
1187
1247
|
"Heartbeat service configured",
|
|
1188
1248
|
);
|
|
1189
1249
|
|
|
1250
|
+
const filingConfig = config.filing;
|
|
1251
|
+
const filing = new FilingService({
|
|
1252
|
+
processMessage: (conversationId, content, options) =>
|
|
1253
|
+
server.processMessage(conversationId, content, undefined, {
|
|
1254
|
+
trustContext: {
|
|
1255
|
+
sourceChannel: "vellum",
|
|
1256
|
+
trustClass: "guardian",
|
|
1257
|
+
},
|
|
1258
|
+
...options,
|
|
1259
|
+
}),
|
|
1260
|
+
});
|
|
1261
|
+
filing.start();
|
|
1262
|
+
log.info(
|
|
1263
|
+
{
|
|
1264
|
+
enabled: filingConfig.enabled,
|
|
1265
|
+
intervalMs: filingConfig.intervalMs,
|
|
1266
|
+
},
|
|
1267
|
+
"Filing service configured",
|
|
1268
|
+
);
|
|
1269
|
+
|
|
1190
1270
|
// Retrieve the MCP manager if MCP servers were configured.
|
|
1191
1271
|
// The manager is a singleton created during initializeProvidersAndTools().
|
|
1192
1272
|
const mcpManager =
|
|
@@ -1198,6 +1278,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
1198
1278
|
server,
|
|
1199
1279
|
workspaceHeartbeat,
|
|
1200
1280
|
heartbeat,
|
|
1281
|
+
filing,
|
|
1201
1282
|
hookManager,
|
|
1202
1283
|
runtimeHttp,
|
|
1203
1284
|
scheduler,
|
package/src/daemon/main.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
process.title = "vellum-daemon";
|
|
3
3
|
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
|
|
4
7
|
import * as Sentry from "@sentry/node";
|
|
5
8
|
|
|
6
9
|
import { getLogger } from "../util/logger.js";
|
|
10
|
+
import { getDataDir } from "../util/platform.js";
|
|
7
11
|
import { runDaemon } from "./lifecycle.js";
|
|
8
12
|
import { emitDaemonError } from "./startup-error.js";
|
|
9
13
|
|
|
@@ -21,7 +25,7 @@ runDaemon().catch(async (err) => {
|
|
|
21
25
|
}
|
|
22
26
|
console.error("Failed to start assistant:", err);
|
|
23
27
|
console.error(
|
|
24
|
-
|
|
28
|
+
`Troubleshooting: check if another assistant is already running, verify ${join(homedir(), ".vellum")} permissions, and review logs at ${getDataDir()}/logs/`,
|
|
25
29
|
);
|
|
26
30
|
// Emit a structured error line as the last line of stderr so consumers
|
|
27
31
|
// (e.g. the macOS app) can parse it reliably.
|
|
@@ -14,12 +14,10 @@ export interface ConversationListRequest {
|
|
|
14
14
|
limit?: number;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
/**
|
|
18
|
-
|
|
17
|
+
/** Shared fields for all transport metadata variants. */
|
|
18
|
+
interface BaseTransportMetadata {
|
|
19
19
|
/** Logical channel identifier (e.g. "desktop", "telegram", "mobile"). */
|
|
20
20
|
channelId: ChannelId;
|
|
21
|
-
/** Interface identifier for this transport (e.g. "macos", "ios", "cli"). */
|
|
22
|
-
interfaceId?: InterfaceId;
|
|
23
21
|
/** Optional natural-language hints for channel-specific UX behavior. */
|
|
24
22
|
hints?: string[];
|
|
25
23
|
/** Optional concise UX brief for this channel. */
|
|
@@ -28,6 +26,27 @@ export interface ConversationTransportMetadata {
|
|
|
28
26
|
chatType?: string;
|
|
29
27
|
}
|
|
30
28
|
|
|
29
|
+
/** Transport metadata for macOS desktop clients, including host environment fields. */
|
|
30
|
+
export interface MacosTransportMetadata extends BaseTransportMetadata {
|
|
31
|
+
/** Interface identifier for macOS transport. */
|
|
32
|
+
interfaceId: "macos";
|
|
33
|
+
/** Home directory of the host macOS user. */
|
|
34
|
+
hostHomeDir?: string;
|
|
35
|
+
/** Username of the host macOS user. */
|
|
36
|
+
hostUsername?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Transport metadata for non-macOS transports. */
|
|
40
|
+
export interface NonMacosTransportMetadata extends BaseTransportMetadata {
|
|
41
|
+
/** Interface identifier for this transport (e.g. "ios", "cli"). */
|
|
42
|
+
interfaceId?: Exclude<InterfaceId, "macos">;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Lightweight conversation transport metadata for channel identity and natural-language guidance. */
|
|
46
|
+
export type ConversationTransportMetadata =
|
|
47
|
+
| MacosTransportMetadata
|
|
48
|
+
| NonMacosTransportMetadata;
|
|
49
|
+
|
|
31
50
|
export interface ConversationCreateRequest {
|
|
32
51
|
type: "conversation_create";
|
|
33
52
|
title?: string;
|
|
@@ -264,8 +283,10 @@ export interface HistoryResponseToolCall {
|
|
|
264
283
|
input: Record<string, unknown>;
|
|
265
284
|
result?: string;
|
|
266
285
|
isError?: boolean;
|
|
267
|
-
/** Base64-encoded image data from tool contentBlocks (e.g. browser_screenshot). */
|
|
286
|
+
/** Base64-encoded image data from tool contentBlocks (e.g. browser_screenshot). @deprecated Use imageDataList. */
|
|
268
287
|
imageData?: string;
|
|
288
|
+
/** Base64-encoded image data from tool contentBlocks (e.g. browser_screenshot, image generation). */
|
|
289
|
+
imageDataList?: string[];
|
|
269
290
|
/** Unix ms when the tool started executing. */
|
|
270
291
|
startedAt?: number;
|
|
271
292
|
/** Unix ms when the tool completed. */
|
|
@@ -308,11 +329,11 @@ export interface HistoryResponse {
|
|
|
308
329
|
contentOrder?: string[];
|
|
309
330
|
/** UI surfaces (widgets) embedded in the message. */
|
|
310
331
|
surfaces?: HistoryResponseSurface[];
|
|
311
|
-
/** Present when this message is a subagent lifecycle notification (completed/failed/aborted). */
|
|
332
|
+
/** Present when this message is a subagent lifecycle notification (running/completed/failed/aborted). */
|
|
312
333
|
subagentNotification?: {
|
|
313
334
|
subagentId: string;
|
|
314
335
|
label: string;
|
|
315
|
-
status: "completed" | "failed" | "aborted";
|
|
336
|
+
status: "running" | "completed" | "failed" | "aborted";
|
|
316
337
|
error?: string;
|
|
317
338
|
conversationId?: string;
|
|
318
339
|
};
|
|
@@ -370,6 +391,7 @@ export interface ContextCompacted {
|
|
|
370
391
|
export type ConversationErrorCode =
|
|
371
392
|
| "PROVIDER_NETWORK"
|
|
372
393
|
| "PROVIDER_RATE_LIMIT"
|
|
394
|
+
| "PROVIDER_OVERLOADED"
|
|
373
395
|
| "PROVIDER_API"
|
|
374
396
|
| "PROVIDER_BILLING"
|
|
375
397
|
| "PROVIDER_ORDERING"
|
|
@@ -124,8 +124,10 @@ export interface ToolResult {
|
|
|
124
124
|
};
|
|
125
125
|
status?: string;
|
|
126
126
|
conversationId?: string;
|
|
127
|
-
/** Base64-encoded image data extracted from contentBlocks (e.g. browser_screenshot). */
|
|
127
|
+
/** Base64-encoded image data extracted from contentBlocks (e.g. browser_screenshot). @deprecated Use imageDataList. */
|
|
128
128
|
imageData?: string;
|
|
129
|
+
/** Base64-encoded image data extracted from contentBlocks (e.g. browser_screenshot, image generation). */
|
|
130
|
+
imageDataList?: string[];
|
|
129
131
|
/** The tool_use block ID for client-side correlation. */
|
|
130
132
|
toolUseId?: string;
|
|
131
133
|
}
|
|
@@ -306,6 +308,13 @@ export interface AssistantActivityState {
|
|
|
306
308
|
statusText?: string;
|
|
307
309
|
}
|
|
308
310
|
|
|
311
|
+
/** Broadcast to clients when the two-axis permission mode changes. */
|
|
312
|
+
export interface PermissionModeUpdate {
|
|
313
|
+
type: "permission_mode_update";
|
|
314
|
+
askBeforeActing: boolean;
|
|
315
|
+
hostAccess: boolean;
|
|
316
|
+
}
|
|
317
|
+
|
|
309
318
|
export type TraceEventKind =
|
|
310
319
|
| "request_received"
|
|
311
320
|
| "request_queued"
|
|
@@ -367,4 +376,5 @@ export type _MessagesServerMessages =
|
|
|
367
376
|
| SuggestionResponse
|
|
368
377
|
| TraceEvent
|
|
369
378
|
| ConfirmationStateChanged
|
|
370
|
-
| AssistantActivityState
|
|
379
|
+
| AssistantActivityState
|
|
380
|
+
| PermissionModeUpdate;
|
|
@@ -34,6 +34,11 @@ export interface AvatarUpdated {
|
|
|
34
34
|
avatarPath: string;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
/** Sent by the daemon when sounds config or sound files change on disk. */
|
|
38
|
+
export interface SoundsConfigUpdated {
|
|
39
|
+
type: "sounds_config_updated";
|
|
40
|
+
}
|
|
41
|
+
|
|
37
42
|
/** Response to a generate_avatar request indicating success or failure. */
|
|
38
43
|
export interface GenerateAvatarResponse {
|
|
39
44
|
type: "generate_avatar_response";
|
|
@@ -51,4 +56,5 @@ export type _SettingsClientMessages =
|
|
|
51
56
|
export type _SettingsServerMessages =
|
|
52
57
|
| ClientSettingsUpdate
|
|
53
58
|
| AvatarUpdated
|
|
59
|
+
| SoundsConfigUpdated
|
|
54
60
|
| GenerateAvatarResponse;
|