@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
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Memory Graph — Scoring functions for retrieval
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
|
|
5
|
+
import type { MemoryEdge, MemoryNode, ScoredNode } from "./types.js";
|
|
6
|
+
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Temporal boost — cyclical similarity on hour / dayOfWeek / month
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Cyclical similarity between two points on a circle of given period.
|
|
13
|
+
* Returns 1.0 when identical, -1.0 when opposite, continuous between.
|
|
14
|
+
*/
|
|
15
|
+
function cyclicalSimilarity(a: number, b: number, period: number): number {
|
|
16
|
+
const angleA = (2 * Math.PI * a) / period;
|
|
17
|
+
const angleB = (2 * Math.PI * b) / period;
|
|
18
|
+
return (
|
|
19
|
+
Math.cos(angleA) * Math.cos(angleB) + Math.sin(angleA) * Math.sin(angleB)
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Compute a temporal boost for a memory node based on how similar its
|
|
25
|
+
* creation time is to the current time across three cyclical dimensions.
|
|
26
|
+
*
|
|
27
|
+
* Returns a value roughly in [-1, 1] (weighted sum of three cos similarities).
|
|
28
|
+
* In practice, used as a small additive modifier to retrieval scores.
|
|
29
|
+
*/
|
|
30
|
+
export function computeTemporalBoost(node: MemoryNode, now: Date): number {
|
|
31
|
+
const created = new Date(node.created);
|
|
32
|
+
|
|
33
|
+
const hourSim = cyclicalSimilarity(created.getHours(), now.getHours(), 24);
|
|
34
|
+
const daySim = cyclicalSimilarity(created.getDay(), now.getDay(), 7);
|
|
35
|
+
const monthSim = cyclicalSimilarity(created.getMonth(), now.getMonth(), 12);
|
|
36
|
+
|
|
37
|
+
// Hour matters most (same time of day), day-of-week next, season least
|
|
38
|
+
return 0.5 * hourSim + 0.3 * daySim + 0.2 * monthSim;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Effective significance — Ebbinghaus forgetting curve with stability
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Compute the effective (decayed) significance of a memory node right now.
|
|
47
|
+
*
|
|
48
|
+
* Uses the Ebbinghaus forgetting curve: S(t) = S₀ × e^(-t/stability)
|
|
49
|
+
* where t is days since last reinforcement.
|
|
50
|
+
*
|
|
51
|
+
* High stability (from many reinforcements) → very slow decay.
|
|
52
|
+
* stability=14 (default) → after 2 weeks, ~37% remains.
|
|
53
|
+
* stability=806 (10 reinforcements) → essentially permanent.
|
|
54
|
+
*/
|
|
55
|
+
export function computeEffectiveSignificance(
|
|
56
|
+
node: MemoryNode,
|
|
57
|
+
now: number,
|
|
58
|
+
): number {
|
|
59
|
+
const elapsedMs = now - node.lastReinforced;
|
|
60
|
+
const elapsedDays = elapsedMs / (1000 * 60 * 60 * 24);
|
|
61
|
+
if (elapsedDays <= 0) return node.significance;
|
|
62
|
+
return node.significance * Math.exp(-elapsedDays / node.stability);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// Activation spreading — BFS with decaying weight over edges
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Starting from a set of activated node IDs, spread activation through
|
|
71
|
+
* the edge graph with decaying weight. Returns a map of nodeId → activation
|
|
72
|
+
* boost for all nodes reachable within maxHops.
|
|
73
|
+
*
|
|
74
|
+
* Each hop reduces the weight by `decayFactor` (default 0.5).
|
|
75
|
+
* Self-activation (start nodes) is not included in the output.
|
|
76
|
+
*/
|
|
77
|
+
export function computeActivationSpread(
|
|
78
|
+
startNodeIds: string[],
|
|
79
|
+
edges: MemoryEdge[],
|
|
80
|
+
maxHops: number = 2,
|
|
81
|
+
decayFactor: number = 0.5,
|
|
82
|
+
): Map<string, number> {
|
|
83
|
+
// Build adjacency list (bidirectional — edges connect both ways)
|
|
84
|
+
const adjacency = new Map<
|
|
85
|
+
string,
|
|
86
|
+
Array<{ neighbor: string; weight: number }>
|
|
87
|
+
>();
|
|
88
|
+
for (const edge of edges) {
|
|
89
|
+
if (!adjacency.has(edge.sourceNodeId)) adjacency.set(edge.sourceNodeId, []);
|
|
90
|
+
if (!adjacency.has(edge.targetNodeId)) adjacency.set(edge.targetNodeId, []);
|
|
91
|
+
adjacency.get(edge.sourceNodeId)!.push({
|
|
92
|
+
neighbor: edge.targetNodeId,
|
|
93
|
+
weight: edge.weight,
|
|
94
|
+
});
|
|
95
|
+
adjacency.get(edge.targetNodeId)!.push({
|
|
96
|
+
neighbor: edge.sourceNodeId,
|
|
97
|
+
weight: edge.weight,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const activation = new Map<string, number>();
|
|
102
|
+
const startSet = new Set(startNodeIds);
|
|
103
|
+
|
|
104
|
+
// BFS with decaying weight
|
|
105
|
+
let frontier = startNodeIds.map((id) => ({ id, weight: 1.0 }));
|
|
106
|
+
|
|
107
|
+
for (let hop = 0; hop < maxHops; hop++) {
|
|
108
|
+
const nextFrontier: Array<{ id: string; weight: number }> = [];
|
|
109
|
+
for (const { id, weight } of frontier) {
|
|
110
|
+
const neighbors = adjacency.get(id);
|
|
111
|
+
if (!neighbors) continue;
|
|
112
|
+
|
|
113
|
+
for (const { neighbor, weight: edgeWeight } of neighbors) {
|
|
114
|
+
if (startSet.has(neighbor)) continue; // Don't boost start nodes
|
|
115
|
+
|
|
116
|
+
const spreadWeight = weight * edgeWeight * decayFactor;
|
|
117
|
+
const current = activation.get(neighbor) ?? 0;
|
|
118
|
+
// Take the max, not sum — prevents double-counting from multiple paths
|
|
119
|
+
if (spreadWeight > current) {
|
|
120
|
+
activation.set(neighbor, spreadWeight);
|
|
121
|
+
}
|
|
122
|
+
nextFrontier.push({ id: neighbor, weight: spreadWeight });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
frontier = nextFrontier;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return activation;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
// Recency boost — linear decay over days
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Compute a recency boost for a memory node. Returns 1.0 for nodes created
|
|
137
|
+
* right now, decaying linearly to 0.0 at `halfLifeDays` and beyond.
|
|
138
|
+
*
|
|
139
|
+
* This is distinct from temporalBoost (cyclical time-of-day similarity).
|
|
140
|
+
* Recency ensures recent events surface at conversation start even when
|
|
141
|
+
* their significance is moderate.
|
|
142
|
+
*/
|
|
143
|
+
export function computeRecencyBoost(
|
|
144
|
+
node: MemoryNode,
|
|
145
|
+
nowMs: number,
|
|
146
|
+
halfLifeDays: number = 7,
|
|
147
|
+
): number {
|
|
148
|
+
const elapsedDays = (nowMs - node.created) / (1000 * 60 * 60 * 24);
|
|
149
|
+
if (elapsedDays <= 0) return 1.0;
|
|
150
|
+
return Math.max(0, 1.0 - elapsedDays / (halfLifeDays * 2));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// Combined scoring
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
|
|
157
|
+
/** Weights for combining score components. */
|
|
158
|
+
export interface ScoringWeights {
|
|
159
|
+
semanticSimilarity: number;
|
|
160
|
+
effectiveSignificance: number;
|
|
161
|
+
emotionalIntensity: number;
|
|
162
|
+
temporalBoost: number;
|
|
163
|
+
recencyBoost: number;
|
|
164
|
+
triggerBoost: number;
|
|
165
|
+
activationBoost: number;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** Weights for context-load (conversation start): balanced across all signals. */
|
|
169
|
+
const DEFAULT_WEIGHTS: ScoringWeights = {
|
|
170
|
+
semanticSimilarity: 0.25,
|
|
171
|
+
effectiveSignificance: 0.15,
|
|
172
|
+
emotionalIntensity: 0.15,
|
|
173
|
+
temporalBoost: 0.05,
|
|
174
|
+
recencyBoost: 0.15,
|
|
175
|
+
triggerBoost: 0.15,
|
|
176
|
+
activationBoost: 0.1,
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Weights for per-turn injection: heavily biased toward semantic similarity.
|
|
181
|
+
* Per-turn injections should only surface memories directly relevant to
|
|
182
|
+
* what's being discussed right now — not general high-significance memories.
|
|
183
|
+
*/
|
|
184
|
+
export const PER_TURN_WEIGHTS: ScoringWeights = {
|
|
185
|
+
semanticSimilarity: 0.60,
|
|
186
|
+
effectiveSignificance: 0.05,
|
|
187
|
+
emotionalIntensity: 0.05,
|
|
188
|
+
temporalBoost: 0.0,
|
|
189
|
+
recencyBoost: 0.05,
|
|
190
|
+
triggerBoost: 0.20,
|
|
191
|
+
activationBoost: 0.05,
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Compute the final retrieval score for a candidate node.
|
|
196
|
+
* All components should be in [0, 1] range before weighting.
|
|
197
|
+
*
|
|
198
|
+
* Recency boost (0.15) ensures recent events always surface at conversation
|
|
199
|
+
* start — without it, the context block becomes a museum of greatest hits
|
|
200
|
+
* with no awareness of what happened recently. The 14-day half-life means
|
|
201
|
+
* events from the past week score 0.5-1.0, while events older than 2 weeks
|
|
202
|
+
* contribute nothing via recency (they surface through significance, semantic
|
|
203
|
+
* similarity, or triggers instead).
|
|
204
|
+
*/
|
|
205
|
+
export function scoreCandidate(
|
|
206
|
+
node: MemoryNode,
|
|
207
|
+
components: {
|
|
208
|
+
semanticSimilarity: number;
|
|
209
|
+
effectiveSignificance: number;
|
|
210
|
+
emotionalIntensity: number;
|
|
211
|
+
temporalBoost: number;
|
|
212
|
+
recencyBoost: number;
|
|
213
|
+
triggerBoost: number;
|
|
214
|
+
activationBoost: number;
|
|
215
|
+
},
|
|
216
|
+
weights: ScoringWeights = DEFAULT_WEIGHTS,
|
|
217
|
+
): ScoredNode {
|
|
218
|
+
const score =
|
|
219
|
+
weights.semanticSimilarity * components.semanticSimilarity +
|
|
220
|
+
weights.effectiveSignificance * components.effectiveSignificance +
|
|
221
|
+
weights.emotionalIntensity * components.emotionalIntensity +
|
|
222
|
+
weights.temporalBoost * Math.max(0, components.temporalBoost) +
|
|
223
|
+
weights.recencyBoost * components.recencyBoost +
|
|
224
|
+
weights.triggerBoost * components.triggerBoost +
|
|
225
|
+
weights.activationBoost * components.activationBoost;
|
|
226
|
+
|
|
227
|
+
return {
|
|
228
|
+
node,
|
|
229
|
+
score,
|
|
230
|
+
scoreBreakdown: components,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Memory Graph — Serendipity sampling
|
|
3
|
+
//
|
|
4
|
+
// Reserves a few retrieval slots for weighted-random picks from the mid-tier
|
|
5
|
+
// of scored candidates. Prevents the same memories from always loading and
|
|
6
|
+
// creates unexpected associations that can spark new connections.
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
|
|
9
|
+
import type { ScoredNode } from "./types.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Sample `reserveSlots` candidates from the 30th–70th percentile band
|
|
13
|
+
* of the scored candidates list (which should already be sorted desc by score).
|
|
14
|
+
*
|
|
15
|
+
* Sampling is weighted: higher-scoring mid-tier nodes are more likely
|
|
16
|
+
* to be picked, but there's genuine randomness.
|
|
17
|
+
*
|
|
18
|
+
* Returns the selected serendipity nodes. The caller should merge these
|
|
19
|
+
* with the deterministically-selected top nodes.
|
|
20
|
+
*/
|
|
21
|
+
export function sampleSerendipity(
|
|
22
|
+
sortedCandidates: ScoredNode[],
|
|
23
|
+
reserveSlots: number,
|
|
24
|
+
): ScoredNode[] {
|
|
25
|
+
if (reserveSlots <= 0 || sortedCandidates.length === 0) return [];
|
|
26
|
+
|
|
27
|
+
// Percentile boundaries
|
|
28
|
+
const p30 = Math.floor(sortedCandidates.length * 0.3);
|
|
29
|
+
const p70 = Math.floor(sortedCandidates.length * 0.7);
|
|
30
|
+
|
|
31
|
+
// Mid-tier band — skip the top (already selected) and bottom (noise)
|
|
32
|
+
const midTier = sortedCandidates.slice(p30, p70);
|
|
33
|
+
if (midTier.length === 0) return [];
|
|
34
|
+
|
|
35
|
+
const slots = Math.min(reserveSlots, midTier.length);
|
|
36
|
+
|
|
37
|
+
// Weighted random sampling without replacement
|
|
38
|
+
// Weight = score (higher score within mid-tier = more likely to be picked)
|
|
39
|
+
const selected: ScoredNode[] = [];
|
|
40
|
+
const pool = [...midTier];
|
|
41
|
+
|
|
42
|
+
for (let i = 0; i < slots; i++) {
|
|
43
|
+
if (pool.length === 0) break;
|
|
44
|
+
|
|
45
|
+
const totalWeight = pool.reduce(
|
|
46
|
+
(sum, c) => sum + Math.max(c.score, 0.01),
|
|
47
|
+
0,
|
|
48
|
+
);
|
|
49
|
+
let random = Math.random() * totalWeight;
|
|
50
|
+
|
|
51
|
+
let picked = pool.length - 1; // fallback to last
|
|
52
|
+
for (let j = 0; j < pool.length; j++) {
|
|
53
|
+
random -= Math.max(pool[j].score, 0.01);
|
|
54
|
+
if (random <= 0) {
|
|
55
|
+
picked = j;
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
selected.push(pool[picked]);
|
|
61
|
+
pool.splice(picked, 1);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return selected;
|
|
65
|
+
}
|