@vellumai/assistant 0.5.16 → 0.6.0
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/ARCHITECTURE.md +1 -1
- package/Dockerfile +0 -3
- package/knip.json +2 -1
- package/openapi.yaml +660 -80
- package/package.json +1 -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 +57 -3
- package/src/__tests__/app-compiler.test.ts +120 -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 +25 -3
- package/src/__tests__/clawhub.test.ts +54 -24
- package/src/__tests__/cli-command-risk-guard.test.ts +14 -0
- package/src/__tests__/cli-memory.test.ts +74 -69
- package/src/__tests__/config-schema.test.ts +1 -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 +9 -0
- package/src/__tests__/conversation-agent-loop.test.ts +9 -0
- 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 +5 -0
- 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-starter-routes.test.ts +20 -11
- package/src/__tests__/conversation-store.test.ts +2 -6
- package/src/__tests__/conversation-usage.test.ts +2 -6
- package/src/__tests__/conversation-wipe.test.ts +11 -408
- 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__/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__/inbound-invite-redemption.test.ts +2 -6
- package/src/__tests__/injection-block.test.ts +154 -0
- package/src/__tests__/install-meta.test.ts +506 -0
- package/src/__tests__/install-skill-routing.test.ts +292 -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 +2 -14
- package/src/__tests__/list-messages-attachments.test.ts +2 -6
- package/src/__tests__/llm-context-route-provider.test.ts +2 -6
- package/src/__tests__/llm-request-log-turn-query.test.ts +2 -6
- package/src/__tests__/llm-usage-store.test.ts +2 -6
- package/src/__tests__/log-export-workspace.test.ts +2 -6
- package/src/__tests__/managed-store.test.ts +38 -11
- package/src/__tests__/memory-jobs-worker-backoff.test.ts +2 -8
- package/src/__tests__/memory-recall-log-store.test.ts +2 -6
- package/src/__tests__/memory-upsert-concurrency.test.ts +4 -112
- package/src/__tests__/non-member-access-request.test.ts +2 -6
- 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__/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__/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__/provider-error-scenarios.test.ts +21 -0
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +273 -0
- package/src/__tests__/registry.test.ts +2 -2
- 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__/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__/scoped-approval-grants.test.ts +2 -6
- package/src/__tests__/scoped-grant-security-matrix.test.ts +2 -6
- package/src/__tests__/search-skills-unified.test.ts +421 -0
- package/src/__tests__/secret-onetime-send.test.ts +2 -0
- package/src/__tests__/send-endpoint-busy.test.ts +2 -6
- package/src/__tests__/sequence-store.test.ts +2 -6
- package/src/__tests__/server-history-render.test.ts +2 -6
- 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 +11 -11
- package/src/__tests__/skill-memory.test.ts +140 -98
- 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__/task-compiler.test.ts +2 -6
- package/src/__tests__/task-management-tools.test.ts +2 -6
- package/src/__tests__/task-memory-cleanup.test.ts +173 -229
- package/src/__tests__/task-runner.test.ts +2 -6
- package/src/__tests__/task-scheduler.test.ts +2 -6
- package/src/__tests__/test-preload.ts +3 -0
- package/src/__tests__/tool-approval-handler.test.ts +2 -6
- package/src/__tests__/tool-grant-request-escalation.test.ts +2 -6
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +276 -0
- 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 +2 -6
- 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-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 +1 -15
- 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/cli-memory.ts +67 -64
- package/src/cli/commands/avatar.ts +3 -3
- package/src/cli/commands/config.ts +26 -13
- package/src/cli/commands/doctor.ts +2 -2
- package/src/cli/commands/memory.ts +41 -55
- 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 +11 -6
- 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/skills.ts +88 -16
- package/src/cli/commands/trust.ts +2 -2
- package/src/cli/lib/daemon-credential-client.ts +2 -3
- package/src/config/bundled-skills/acp/TOOLS.json +1 -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 +2 -10
- package/src/config/bundled-skills/google-calendar/SKILL.md +1 -9
- package/src/config/bundled-skills/messaging/SKILL.md +10 -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/slack/SKILL.md +1 -7
- package/src/config/bundled-tool-registry.ts +56 -4
- package/src/config/env-registry.ts +15 -8
- package/src/config/feature-flag-registry.json +21 -124
- package/src/config/schemas/platform.ts +8 -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/context-overflow-reducer.ts +46 -2
- package/src/daemon/conversation-agent-loop-handlers.ts +123 -82
- package/src/daemon/conversation-agent-loop.ts +96 -61
- package/src/daemon/conversation-error.ts +31 -8
- package/src/daemon/conversation-lifecycle.ts +33 -0
- package/src/daemon/conversation-media-retry.ts +85 -7
- package/src/daemon/conversation-notifiers.ts +4 -1
- package/src/daemon/conversation-runtime-assembly.ts +5 -0
- package/src/daemon/conversation.ts +41 -2
- package/src/daemon/daemon-control.ts +8 -2
- package/src/daemon/handlers/shared.ts +22 -12
- package/src/daemon/handlers/skills.ts +416 -202
- package/src/daemon/lifecycle.ts +40 -1
- package/src/daemon/main.ts +5 -1
- package/src/daemon/message-types/conversations.ts +4 -1
- package/src/daemon/message-types/messages.ts +3 -1
- package/src/daemon/message-types/skills.ts +97 -36
- package/src/daemon/providers-setup.ts +5 -0
- package/src/daemon/server.ts +11 -2
- package/src/daemon/tool-side-effects.ts +27 -5
- package/src/heartbeat/heartbeat-service.ts +1 -0
- 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/memory/admin.ts +11 -45
- package/src/memory/conversation-bootstrap.ts +2 -0
- package/src/memory/conversation-crud.ts +242 -348
- package/src/memory/conversation-group-migration.ts +157 -0
- package/src/memory/conversation-queries.ts +4 -2
- package/src/memory/db-init.ts +30 -3
- 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 +512 -0
- package/src/memory/graph/capability-seed.ts +297 -0
- package/src/memory/graph/consolidation.ts +691 -0
- package/src/memory/graph/conversation-graph-memory.ts +630 -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 +69 -0
- package/src/memory/graph/extraction.test.ts +936 -0
- package/src/memory/graph/extraction.ts +1254 -0
- package/src/memory/graph/graph-search.ts +266 -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 +439 -0
- package/src/memory/graph/inspect.ts +534 -0
- package/src/memory/graph/narrative.ts +267 -0
- package/src/memory/graph/pattern-scan.ts +269 -0
- package/src/memory/graph/retriever.ts +1008 -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 +1050 -0
- package/src/memory/graph/store.ts +699 -0
- package/src/memory/graph/tool-handlers.ts +426 -0
- package/src/memory/graph/tools.ts +141 -0
- package/src/memory/graph/triggers.test.ts +487 -0
- package/src/memory/graph/triggers.ts +223 -0
- package/src/memory/graph/types.ts +271 -0
- package/src/memory/group-crud.ts +191 -0
- package/src/memory/indexer.ts +37 -19
- package/src/memory/job-handlers/cleanup.ts +0 -53
- 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 +50 -70
- package/src/memory/jobs-worker.ts +147 -112
- 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 +23 -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/index.ts +4 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/qdrant-client.ts +44 -17
- package/src/memory/schema/index.ts +1 -0
- package/src/memory/schema/memory-graph.ts +139 -0
- package/src/memory/search/semantic.ts +47 -91
- package/src/memory/task-memory-cleanup.ts +28 -50
- 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 +9 -0
- package/src/notifications/signal.ts +16 -0
- package/src/oauth/seed-providers.ts +2 -1
- package/src/permissions/checker.ts +24 -3
- package/src/permissions/defaults.ts +4 -4
- package/src/permissions/workspace-policy.ts +1 -1
- package/src/playbooks/playbook-compiler.ts +19 -18
- package/src/playbooks/types.ts +4 -3
- package/src/prompts/system-prompt.ts +3 -29
- package/src/providers/anthropic/client.ts +47 -19
- 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 +7 -0
- package/src/runtime/guardian-reply-router.ts +5 -1
- package/src/runtime/http-server.ts +23 -3
- package/src/runtime/middleware/auth.ts +20 -0
- package/src/runtime/routes/attachment-routes.test.ts +106 -0
- package/src/runtime/routes/attachment-routes.ts +106 -16
- package/src/runtime/routes/brain-graph-routes.ts +21 -22
- package/src/runtime/routes/btw-routes.ts +8 -0
- package/src/runtime/routes/conversation-management-routes.ts +2 -0
- 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/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/memory-item-routes.test.ts +2 -14
- package/src/runtime/routes/memory-item-routes.ts +341 -388
- package/src/runtime/routes/schedule-routes.ts +2 -0
- package/src/runtime/routes/skills-routes.ts +103 -37
- package/src/runtime/routes/work-items-routes.test.ts +2 -6
- package/src/schedule/scheduler.ts +8 -1
- 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 +15 -14
- package/src/skills/clawhub.ts +134 -154
- package/src/skills/install-meta.ts +208 -0
- package/src/skills/managed-store.ts +27 -16
- package/src/skills/skill-memory.ts +152 -77
- package/src/skills/skillssh-registry.ts +19 -17
- package/src/tasks/task-runner.ts +3 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +3 -5
- package/src/tools/browser/runtime-check.ts +3 -1
- package/src/tools/memory/register.ts +63 -46
- package/src/tools/permission-checker.ts +7 -1
- package/src/tools/shared/filesystem/image-read.ts +22 -85
- package/src/tools/terminal/safe-env.ts +1 -0
- package/src/tools/tool-manifest.ts +3 -3
- package/src/util/browser.ts +25 -10
- package/src/util/bun-runtime.ts +172 -0
- package/src/watcher/providers/outlook-calendar.ts +343 -0
- package/src/watcher/providers/outlook.ts +198 -0
- 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/registry.ts +6 -0
- 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/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
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
export type CandidateType = "segment" | "item" | "summary" | "media";
|
|
2
|
-
export type CandidateSource = "semantic";
|
|
3
|
-
|
|
4
|
-
export type StalenessLevel = "fresh" | "aging" | "stale" | "very_stale";
|
|
5
|
-
|
|
6
|
-
export interface Candidate {
|
|
7
|
-
key: string;
|
|
8
|
-
type: CandidateType;
|
|
9
|
-
id: string;
|
|
10
|
-
source: CandidateSource;
|
|
11
|
-
text: string;
|
|
12
|
-
kind: string;
|
|
13
|
-
modality?: "text" | "image" | "audio" | "video";
|
|
14
|
-
/** The conversation this candidate originated from (segments only). */
|
|
15
|
-
conversationId?: string;
|
|
16
|
-
/** The source message ID this candidate was extracted from (segments only). */
|
|
17
|
-
messageId?: string;
|
|
18
|
-
/** The ID of the memory item this candidate supersedes (items only). */
|
|
19
|
-
supersedes?: string;
|
|
20
|
-
/** Relative workspace path to the source conversation's messages file. */
|
|
21
|
-
sourcePath?: string;
|
|
22
|
-
confidence: number;
|
|
23
|
-
importance: number;
|
|
24
|
-
createdAt: number;
|
|
25
|
-
semantic: number;
|
|
26
|
-
recency: number;
|
|
27
|
-
finalScore: number;
|
|
28
|
-
tier?: 1 | 2 | null;
|
|
29
|
-
staleness?: StalenessLevel;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface MemoryRecallCandiateDebug {
|
|
33
|
-
key: string;
|
|
34
|
-
type: CandidateType;
|
|
35
|
-
kind: string;
|
|
36
|
-
finalScore: number;
|
|
37
|
-
semantic: number;
|
|
38
|
-
recency: number;
|
|
39
|
-
sourceLabel?: string;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export type DegradationReason =
|
|
43
|
-
| "embedding_provider_down"
|
|
44
|
-
| "qdrant_unavailable"
|
|
45
|
-
| "embedding_generation_failed";
|
|
46
|
-
|
|
47
|
-
export interface DegradationStatus {
|
|
48
|
-
semanticUnavailable: boolean;
|
|
49
|
-
reason: DegradationReason;
|
|
50
|
-
fallbackSources: string[];
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export interface MemoryRecallResult {
|
|
54
|
-
enabled: boolean;
|
|
55
|
-
degraded: boolean;
|
|
56
|
-
degradation?: DegradationStatus;
|
|
57
|
-
reason?: string;
|
|
58
|
-
provider?: string;
|
|
59
|
-
model?: string;
|
|
60
|
-
semanticHits: number;
|
|
61
|
-
mergedCount: number;
|
|
62
|
-
selectedCount: number;
|
|
63
|
-
injectedTokens: number;
|
|
64
|
-
injectedText: string;
|
|
65
|
-
latencyMs: number;
|
|
66
|
-
topCandidates: MemoryRecallCandiateDebug[];
|
|
67
|
-
/** Count of tier 1 candidates after demotion. */
|
|
68
|
-
tier1Count?: number;
|
|
69
|
-
/** Count of tier 2 candidates after demotion. */
|
|
70
|
-
tier2Count?: number;
|
|
71
|
-
/** Milliseconds spent in the hybrid search step. */
|
|
72
|
-
hybridSearchMs?: number;
|
|
73
|
-
/** Whether sparse vectors were used in the hybrid search. */
|
|
74
|
-
sparseVectorUsed?: boolean;
|
|
75
|
-
/** Whether HyDE query expansion was used for this retrieval. */
|
|
76
|
-
hydeExpanded?: boolean;
|
|
77
|
-
/** Number of hypothetical documents generated by HyDE expansion. */
|
|
78
|
-
hydeDocCount?: number;
|
|
79
|
-
/** Whether MMR diversity ranking was applied to candidates. */
|
|
80
|
-
mmrApplied?: boolean;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Override the global scope policy for a single retrieval call.
|
|
85
|
-
* Private conversations use this to guarantee they always read from their own
|
|
86
|
-
* scope AND fall back to 'default', regardless of what the global config says.
|
|
87
|
-
*/
|
|
88
|
-
export interface ScopePolicyOverride {
|
|
89
|
-
/** The primary scope to query (e.g. a private conversation's scope ID). */
|
|
90
|
-
scopeId: string;
|
|
91
|
-
/** When true, results from the 'default' scope are included alongside
|
|
92
|
-
* the primary scope. Equivalent to 'allow_global_fallback' behavior
|
|
93
|
-
* but controlled per-call instead of globally. */
|
|
94
|
-
fallbackToDefault: boolean;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
export interface MemoryRecallOptions {
|
|
98
|
-
excludeMessageIds?: string[];
|
|
99
|
-
signal?: AbortSignal;
|
|
100
|
-
scopeId?: string;
|
|
101
|
-
/**
|
|
102
|
-
* When set, overrides both `scopeId` and the global `scopePolicy` config
|
|
103
|
-
* for this retrieval call. Designed for private conversations that need to
|
|
104
|
-
* guarantee private+default fallback independent of global settings.
|
|
105
|
-
*/
|
|
106
|
-
scopePolicyOverride?: ScopePolicyOverride;
|
|
107
|
-
maxInjectTokensOverride?: number;
|
|
108
|
-
/**
|
|
109
|
-
* When true, use HyDE (Hypothetical Document Embeddings) query expansion
|
|
110
|
-
* to generate hypothetical memory documents, embed them alongside the raw
|
|
111
|
-
* query, and run parallel semantic searches for improved recall.
|
|
112
|
-
*/
|
|
113
|
-
hydeEnabled?: boolean;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
export interface ItemMetadata {
|
|
117
|
-
accessCount: number;
|
|
118
|
-
lastUsedAt: number | null;
|
|
119
|
-
verificationState: string;
|
|
120
|
-
sourceConversationCount?: number;
|
|
121
|
-
}
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import { readdirSync, readFileSync, statSync } from "node:fs";
|
|
2
|
-
import { basename, join } from "node:path";
|
|
3
|
-
|
|
4
|
-
import { getMemoryCheckpoint } from "../memory/checkpoints.js";
|
|
5
|
-
import {
|
|
6
|
-
enqueueMemoryJob,
|
|
7
|
-
hasActiveCarryForwardJob,
|
|
8
|
-
} from "../memory/jobs-store.js";
|
|
9
|
-
import { getLogger } from "../util/logger.js";
|
|
10
|
-
import { getWorkspaceDir } from "../util/platform.js";
|
|
11
|
-
|
|
12
|
-
const log = getLogger("journal-context");
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Format a Unix-epoch millisecond value as "MM/DD/YY HH:MM".
|
|
16
|
-
*/
|
|
17
|
-
export function formatJournalAbsoluteTime(mtime: number): string {
|
|
18
|
-
const d = new Date(mtime);
|
|
19
|
-
const mm = String(d.getMonth() + 1).padStart(2, "0");
|
|
20
|
-
const dd = String(d.getDate()).padStart(2, "0");
|
|
21
|
-
const yy = String(d.getFullYear() % 100).padStart(2, "0");
|
|
22
|
-
const hh = String(d.getHours()).padStart(2, "0");
|
|
23
|
-
const min = String(d.getMinutes()).padStart(2, "0");
|
|
24
|
-
return `${mm}/${dd}/${yy} ${hh}:${min}`;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Build a journal context section for inclusion in the system prompt.
|
|
29
|
-
*
|
|
30
|
-
* Reads `{workspaceDir}/journal/*.md` files, sorts by creation time
|
|
31
|
-
* (newest first), and returns a formatted string with timestamps.
|
|
32
|
-
* Returns `null` when no entries are available.
|
|
33
|
-
*/
|
|
34
|
-
export function buildJournalContext(
|
|
35
|
-
maxEntries: number,
|
|
36
|
-
userSlug?: string | null,
|
|
37
|
-
): string | null {
|
|
38
|
-
if (maxEntries <= 0) return null;
|
|
39
|
-
|
|
40
|
-
// When no user is identified, skip journal entirely
|
|
41
|
-
if (userSlug == null) return null;
|
|
42
|
-
|
|
43
|
-
// Sanitize slug once and reuse everywhere — prevents path traversal and
|
|
44
|
-
// normalizes empty strings to "unknown" so directory reads and carry-forward
|
|
45
|
-
// dedup keys always agree.
|
|
46
|
-
const safeSlug = basename(userSlug) || "unknown";
|
|
47
|
-
const journalDir = join(getWorkspaceDir(), "journal", safeSlug);
|
|
48
|
-
|
|
49
|
-
let files: string[];
|
|
50
|
-
try {
|
|
51
|
-
files = readdirSync(journalDir);
|
|
52
|
-
} catch {
|
|
53
|
-
// Directory doesn't exist — no journal entries
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Filter for .md files, excluding README.md (case-insensitive)
|
|
58
|
-
const mdFiles = files.filter(
|
|
59
|
-
(f) =>
|
|
60
|
-
f.endsWith(".md") &&
|
|
61
|
-
!f.startsWith(".") &&
|
|
62
|
-
f.toLowerCase() !== "readme.md",
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
// Collect file info with birthtime (creation time), skipping unreadable entries
|
|
66
|
-
const allEntries = mdFiles
|
|
67
|
-
.flatMap((f) => {
|
|
68
|
-
try {
|
|
69
|
-
const filepath = join(journalDir, f);
|
|
70
|
-
const stat = statSync(filepath);
|
|
71
|
-
if (!stat.isFile()) return [];
|
|
72
|
-
// Fall back to mtimeMs when birthtimeMs is unavailable (returns 0 on Linux ext4, NFS, Docker overlayfs)
|
|
73
|
-
const birthtimeMs = stat.birthtimeMs > 0 ? stat.birthtimeMs : stat.mtimeMs;
|
|
74
|
-
return [{ filename: f, filepath, birthtimeMs }];
|
|
75
|
-
} catch {
|
|
76
|
-
return [];
|
|
77
|
-
}
|
|
78
|
-
})
|
|
79
|
-
.sort((a, b) => b.birthtimeMs - a.birthtimeMs);
|
|
80
|
-
|
|
81
|
-
const entries = allEntries.slice(0, maxEntries);
|
|
82
|
-
const rotatingOut = allEntries.slice(maxEntries);
|
|
83
|
-
|
|
84
|
-
// Enqueue carry-forward jobs for entries rotating out of the context window.
|
|
85
|
-
// Wrapped in try-catch so DB errors never break journal context rendering.
|
|
86
|
-
if (rotatingOut.length > 0) {
|
|
87
|
-
try {
|
|
88
|
-
for (const entry of rotatingOut) {
|
|
89
|
-
const checkpointKey = `journal_carry_forward:${safeSlug}:${entry.filename}`;
|
|
90
|
-
if (getMemoryCheckpoint(checkpointKey) != null) continue;
|
|
91
|
-
if (hasActiveCarryForwardJob(entry.filename, safeSlug)) continue;
|
|
92
|
-
|
|
93
|
-
let content: string;
|
|
94
|
-
try {
|
|
95
|
-
content = readFileSync(entry.filepath, "utf-8");
|
|
96
|
-
} catch {
|
|
97
|
-
continue;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
enqueueMemoryJob("journal_carry_forward", {
|
|
101
|
-
journalContent: content,
|
|
102
|
-
userSlug: safeSlug,
|
|
103
|
-
filename: entry.filename,
|
|
104
|
-
scopeId: "default",
|
|
105
|
-
});
|
|
106
|
-
log.info(
|
|
107
|
-
{ filename: entry.filename, userSlug: safeSlug },
|
|
108
|
-
"Enqueued journal carry-forward job for rotating-out entry",
|
|
109
|
-
);
|
|
110
|
-
}
|
|
111
|
-
} catch (err) {
|
|
112
|
-
log.warn(
|
|
113
|
-
{ err: err instanceof Error ? err.message : String(err) },
|
|
114
|
-
"Failed to enqueue journal carry-forward jobs",
|
|
115
|
-
);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
if (entries.length === 0) return null;
|
|
120
|
-
|
|
121
|
-
const sections: string[] = [
|
|
122
|
-
`# Journal\n\nYour journal entries, most recent first. These are YOUR words from past conversations.\n**Write new entries to:** \`journal/${safeSlug}/\``,
|
|
123
|
-
];
|
|
124
|
-
|
|
125
|
-
for (let i = 0; i < entries.length; i++) {
|
|
126
|
-
const entry = entries[i];
|
|
127
|
-
let content: string;
|
|
128
|
-
try {
|
|
129
|
-
content = readFileSync(entry.filepath, "utf-8");
|
|
130
|
-
} catch {
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
const timestamp = formatJournalAbsoluteTime(entry.birthtimeMs);
|
|
134
|
-
|
|
135
|
-
let header: string;
|
|
136
|
-
if (i === 0) {
|
|
137
|
-
header = `## ${entry.filename} — MOST RECENT (${timestamp})`;
|
|
138
|
-
} else if (i === entries.length - 1 && entries.length === maxEntries) {
|
|
139
|
-
header = `## ${entry.filename} — LEAVING CONTEXT (${timestamp})`;
|
|
140
|
-
header +=
|
|
141
|
-
"\nNOTE: This is the oldest entry in your active context. When you write your next journal entry, carry forward anything from here that still matters to you — after that, this entry will only be available via the filesystem and memory recall.";
|
|
142
|
-
header += "\n";
|
|
143
|
-
} else {
|
|
144
|
-
header = `## ${entry.filename} (${timestamp})`;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
sections.push(header + "\n" + content);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// If all readFileSync calls failed, sections only contains the header — return null
|
|
151
|
-
if (sections.length === 1) return null;
|
|
152
|
-
|
|
153
|
-
return sections.join("\n\n");
|
|
154
|
-
}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import type { ToolDefinition } from "../../providers/types.js";
|
|
2
|
-
|
|
3
|
-
export const memoryRecallDefinition: ToolDefinition = {
|
|
4
|
-
name: "memory_recall",
|
|
5
|
-
description:
|
|
6
|
-
"Semantic search across memory for specific information. Relevant memories are auto-injected each turn, so only call this when the auto-injected context doesn't contain what you need - e.g. the user references a past session, or you need deeper recall. Be specific in your query for best results. Returns formatted memory context with item IDs for use with memory_manage. Results include source conversation titles so you can identify which conversation a memory originated from.",
|
|
7
|
-
input_schema: {
|
|
8
|
-
type: "object",
|
|
9
|
-
properties: {
|
|
10
|
-
query: {
|
|
11
|
-
type: "string",
|
|
12
|
-
description: "The search query - be specific and descriptive",
|
|
13
|
-
},
|
|
14
|
-
scope: {
|
|
15
|
-
type: "string",
|
|
16
|
-
enum: ["default", "conversation"],
|
|
17
|
-
description:
|
|
18
|
-
'Scope to search - "default" searches all memory, "conversation" restricts to current conversation',
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
required: ["query"],
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const memoryManageProperties = {
|
|
26
|
-
op: {
|
|
27
|
-
type: "string" as const,
|
|
28
|
-
enum: ["save", "update", "delete"],
|
|
29
|
-
description: "The operation to perform",
|
|
30
|
-
},
|
|
31
|
-
memory_id: {
|
|
32
|
-
type: "string" as const,
|
|
33
|
-
description: "ID of existing memory item (required for update/delete)",
|
|
34
|
-
},
|
|
35
|
-
statement: {
|
|
36
|
-
type: "string" as const,
|
|
37
|
-
description:
|
|
38
|
-
"The fact or preference to remember (required for save/update, 1-2 sentences)",
|
|
39
|
-
},
|
|
40
|
-
kind: {
|
|
41
|
-
type: "string" as const,
|
|
42
|
-
enum: [
|
|
43
|
-
"identity",
|
|
44
|
-
"preference",
|
|
45
|
-
"project",
|
|
46
|
-
"decision",
|
|
47
|
-
"constraint",
|
|
48
|
-
"event",
|
|
49
|
-
"journal",
|
|
50
|
-
],
|
|
51
|
-
description:
|
|
52
|
-
'Category of the memory item (required for save). Use "constraint" for mistakes, gotchas, discoveries, and working solutions - write as advice to your future self. Use "journal" for journal-style memories — experiential snapshots, upcoming events, things to carry forward.',
|
|
53
|
-
},
|
|
54
|
-
subject: {
|
|
55
|
-
type: "string" as const,
|
|
56
|
-
description: "Short subject/topic label, 2-8 words (optional, save only)",
|
|
57
|
-
},
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
export const memoryManageDefinition: ToolDefinition = {
|
|
61
|
-
name: "memory_manage",
|
|
62
|
-
description:
|
|
63
|
-
"Save, update, or delete memory items. If you want to remember something, save it now. Use 'save' for new information worth remembering (facts, preferences, mistakes, discoveries, gotchas), 'update' to correct existing items, 'delete' to remove outdated items. When a user says 'remember this', save immediately. Be proactive: if you learn something important that may be useful in the future, always call this tool — don't just say or hope you'll remember it. This is not a substitute for updating workspace files when relevant - do both.",
|
|
64
|
-
input_schema: {
|
|
65
|
-
type: "object",
|
|
66
|
-
properties: memoryManageProperties,
|
|
67
|
-
required: ["op"],
|
|
68
|
-
},
|
|
69
|
-
};
|