@vellumai/assistant 0.5.13 → 0.5.14
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/.env.example +1 -6
- package/AGENTS.md +4 -0
- package/ARCHITECTURE.md +0 -1
- package/bunfig.toml +1 -0
- package/docs/architecture/memory.md +3 -3
- package/openapi.yaml +127 -22
- package/package.json +1 -1
- package/src/__tests__/access-request-decision.test.ts +2 -32
- package/src/__tests__/actor-token-service.test.ts +1 -31
- package/src/__tests__/anthropic-provider.test.ts +53 -40
- package/src/__tests__/app-git-history.test.ts +9 -17
- package/src/__tests__/app-git-service.test.ts +14 -20
- package/src/__tests__/app-store-dir-names.test.ts +10 -20
- package/src/__tests__/approval-cascade.test.ts +2 -19
- package/src/__tests__/approval-primitive.test.ts +2 -27
- package/src/__tests__/approval-routes-http.test.ts +2 -30
- package/src/__tests__/assistant-events-sse-hardening.test.ts +2 -28
- package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -45
- package/src/__tests__/attachments-store.test.ts +5 -32
- package/src/__tests__/audit-log-rotation.test.ts +5 -36
- package/src/__tests__/avatar-e2e.test.ts +1 -9
- package/src/__tests__/avatar-generator.test.ts +1 -7
- package/src/__tests__/browser-fill-credential.test.ts +0 -4
- package/src/__tests__/browser-manager.test.ts +0 -6
- package/src/__tests__/call-controller.test.ts +1 -22
- package/src/__tests__/call-conversation-messages.test.ts +0 -21
- package/src/__tests__/call-domain.test.ts +0 -25
- package/src/__tests__/call-pointer-messages.test.ts +0 -21
- package/src/__tests__/call-recovery.test.ts +0 -22
- package/src/__tests__/call-routes-http.test.ts +0 -24
- package/src/__tests__/call-store.test.ts +0 -21
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +0 -24
- package/src/__tests__/canonical-guardian-store.test.ts +48 -21
- package/src/__tests__/channel-approval-routes.test.ts +6 -26
- package/src/__tests__/channel-approvals.test.ts +1 -38
- package/src/__tests__/channel-delivery-store.test.ts +0 -21
- package/src/__tests__/channel-guardian.test.ts +0 -26
- package/src/__tests__/channel-reply-delivery.test.ts +5 -0
- package/src/__tests__/channel-retry-sweep.test.ts +0 -21
- package/src/__tests__/checker.test.ts +26 -61
- package/src/__tests__/clawhub.test.ts +9 -25
- package/src/__tests__/cli-command-risk-guard.test.ts +0 -18
- package/src/__tests__/config-loader-backfill.test.ts +9 -28
- package/src/__tests__/config-schema-cmd.test.ts +5 -25
- package/src/__tests__/config-schema.test.ts +21 -40
- package/src/__tests__/config-watcher.test.ts +4 -91
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -21
- package/src/__tests__/contacts-tools.test.ts +0 -21
- package/src/__tests__/context-memory-e2e.test.ts +0 -21
- package/src/__tests__/context-window-manager.test.ts +130 -3
- package/src/__tests__/conversation-abort-tool-results.test.ts +0 -4
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +0 -4
- package/src/__tests__/conversation-agent-loop.test.ts +0 -4
- package/src/__tests__/conversation-attachments.test.ts +1 -24
- package/src/__tests__/conversation-attention-store.test.ts +0 -21
- package/src/__tests__/conversation-attention-telegram.test.ts +0 -22
- package/src/__tests__/conversation-clear-safety.test.ts +0 -22
- package/src/__tests__/conversation-confirmation-signals.test.ts +2 -21
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +0 -24
- package/src/__tests__/conversation-disk-view-integration.test.ts +1 -23
- package/src/__tests__/conversation-disk-view.test.ts +5 -27
- package/src/__tests__/conversation-error.test.ts +1 -1
- package/src/__tests__/conversation-fork-crud.test.ts +1 -33
- package/src/__tests__/conversation-fork-route.test.ts +0 -27
- package/src/__tests__/conversation-history-web-search.test.ts +23 -16
- package/src/__tests__/conversation-init.benchmark.test.ts +22 -43
- package/src/__tests__/conversation-key-store-disk-view.test.ts +8 -34
- package/src/__tests__/conversation-load-history-repair.test.ts +0 -4
- package/src/__tests__/conversation-pre-run-repair.test.ts +0 -4
- package/src/__tests__/conversation-provider-retry-repair.test.ts +0 -4
- package/src/__tests__/conversation-queue.test.ts +8 -8
- package/src/__tests__/conversation-routes-disk-view.test.ts +13 -51
- package/src/__tests__/conversation-runtime-assembly.test.ts +64 -38
- package/src/__tests__/conversation-slash-commands.test.ts +5 -0
- package/src/__tests__/conversation-slash-queue.test.ts +0 -4
- package/src/__tests__/conversation-slash-unknown.test.ts +0 -4
- package/src/__tests__/conversation-speed-override.test.ts +326 -0
- package/src/__tests__/conversation-starter-routes.test.ts +0 -23
- package/src/__tests__/conversation-store.test.ts +0 -21
- package/src/__tests__/conversation-unread-route.test.ts +0 -24
- package/src/__tests__/conversation-usage.test.ts +56 -21
- package/src/__tests__/conversation-wipe.test.ts +0 -21
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -4
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -4
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -4
- package/src/__tests__/credential-execution-shell-lockdown.test.ts +8 -5
- package/src/__tests__/credential-vault-unit.test.ts +9 -428
- package/src/__tests__/credentials-cli.test.ts +10 -10
- package/src/__tests__/daemon-assistant-events.test.ts +0 -19
- package/src/__tests__/date-context.test.ts +77 -97
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +7 -24
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +29 -42
- package/src/__tests__/delete-managed-skill-tool.test.ts +2 -10
- package/src/__tests__/deterministic-verification-control-plane.test.ts +1 -26
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +61 -15
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -36
- package/src/__tests__/email-cli.test.ts +6 -6
- package/src/__tests__/ephemeral-permissions.test.ts +5 -17
- package/src/__tests__/first-greeting.test.ts +4 -32
- package/src/__tests__/followup-tools.test.ts +0 -21
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -20
- package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -23
- package/src/__tests__/guardian-action-followup-executor.test.ts +0 -23
- package/src/__tests__/guardian-action-followup-store.test.ts +0 -21
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -21
- package/src/__tests__/guardian-action-late-reply.test.ts +0 -21
- package/src/__tests__/guardian-action-store.test.ts +0 -21
- package/src/__tests__/guardian-action-sweep.test.ts +0 -21
- package/src/__tests__/guardian-binding-drift-heal.test.ts +0 -23
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +172 -22
- package/src/__tests__/guardian-dispatch.test.ts +0 -21
- package/src/__tests__/guardian-grant-minting.test.ts +0 -22
- package/src/__tests__/guardian-outbound-http.test.ts +0 -22
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -23
- package/src/__tests__/guardian-routing-invariants.test.ts +0 -22
- package/src/__tests__/guardian-routing-state.test.ts +0 -22
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -24
- package/src/__tests__/headless-browser-interactions.test.ts +0 -4
- package/src/__tests__/headless-browser-navigate.test.ts +0 -4
- package/src/__tests__/headless-browser-read-tools.test.ts +0 -4
- package/src/__tests__/headless-browser-snapshot.test.ts +0 -4
- package/src/__tests__/heartbeat-service.test.ts +99 -26
- package/src/__tests__/hooks-blocking.test.ts +3 -3
- package/src/__tests__/hooks-config.test.ts +7 -7
- package/src/__tests__/hooks-discovery.test.ts +3 -3
- package/src/__tests__/hooks-integration.test.ts +5 -5
- package/src/__tests__/hooks-manager.test.ts +3 -3
- package/src/__tests__/hooks-runner.test.ts +5 -23
- package/src/__tests__/hooks-settings.test.ts +3 -3
- package/src/__tests__/hooks-templates.test.ts +3 -3
- package/src/__tests__/http-conversation-lineage.test.ts +0 -27
- package/src/__tests__/identity-intro-cache.test.ts +0 -4
- package/src/__tests__/inbound-invite-redemption.test.ts +0 -22
- package/src/__tests__/inline-skill-load-permissions.test.ts +5 -16
- package/src/__tests__/intent-routing.test.ts +2 -55
- package/src/__tests__/invite-redemption-service.test.ts +0 -21
- package/src/__tests__/invite-routes-http.test.ts +0 -21
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +0 -17
- package/src/__tests__/journal-context.test.ts +8 -75
- package/src/__tests__/list-messages-attachments.test.ts +0 -22
- package/src/__tests__/llm-context-route-provider.test.ts +0 -21
- package/src/__tests__/llm-request-log-turn-query.test.ts +46 -28
- package/src/__tests__/llm-usage-store.test.ts +0 -21
- package/src/__tests__/log-export-workspace.test.ts +1 -1
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -1
- package/src/__tests__/managed-store.test.ts +1 -1
- package/src/__tests__/mcp-cli.test.ts +7 -10
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +0 -21
- package/src/__tests__/memory-jobs-worker-backoff.test.ts +0 -11
- package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -21
- package/src/__tests__/memory-recall-log-store.test.ts +0 -27
- package/src/__tests__/memory-recall-quality.test.ts +0 -21
- package/src/__tests__/memory-regressions.experimental.test.ts +31 -30
- package/src/__tests__/memory-regressions.test.ts +282 -70
- package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -21
- package/src/__tests__/memory-upsert-concurrency.test.ts +0 -21
- package/src/__tests__/messaging-send-tool.test.ts +201 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +18 -13
- package/src/__tests__/migration-export-http.test.ts +7 -1
- package/src/__tests__/migration-import-commit-http.test.ts +16 -14
- package/src/__tests__/migration-import-preflight-http.test.ts +27 -44
- package/src/__tests__/migration-validate-http.test.ts +1 -28
- package/src/__tests__/native-web-search.test.ts +25 -22
- package/src/__tests__/non-member-access-request.test.ts +0 -22
- package/src/__tests__/notification-guardian-path.test.ts +0 -21
- package/src/__tests__/notification-schedule-dedup.test.ts +1 -25
- package/src/__tests__/oauth-apps-routes.test.ts +103 -2
- package/src/__tests__/oauth-cli.test.ts +52 -0
- package/src/__tests__/oauth-provider-profiles.test.ts +0 -16
- package/src/__tests__/oauth-provider-serializer.test.ts +232 -0
- package/src/__tests__/oauth-providers-routes.test.ts +257 -0
- package/src/__tests__/oauth-store.test.ts +0 -21
- package/src/__tests__/onboarding-template-contract.test.ts +2 -2
- package/src/__tests__/openai-provider.test.ts +261 -0
- package/src/__tests__/pairing-concurrent.test.ts +6 -6
- package/src/__tests__/pairing-routes.test.ts +7 -1
- package/src/__tests__/path-policy.test.ts +1 -1
- package/src/__tests__/platform.test.ts +64 -88
- package/src/__tests__/playbook-execution.test.ts +0 -21
- package/src/__tests__/playbook-tools.test.ts +0 -21
- package/src/__tests__/pricing.test.ts +100 -0
- package/src/__tests__/relay-server.test.ts +1 -25
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -24
- package/src/__tests__/runtime-events-sse-parity.test.ts +2 -24
- package/src/__tests__/runtime-events-sse.test.ts +0 -24
- package/src/__tests__/sandbox-diagnostics.test.ts +2 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +1 -1
- package/src/__tests__/schedule-store.test.ts +0 -21
- package/src/__tests__/schedule-tools.test.ts +0 -21
- package/src/__tests__/scheduler-recurrence.test.ts +0 -21
- package/src/__tests__/scoped-approval-grants.test.ts +0 -21
- package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -21
- package/src/__tests__/secret-allowlist.test.ts +1 -1
- package/src/__tests__/secret-ingress-channel.test.ts +0 -5
- package/src/__tests__/secret-ingress-cli.test.ts +0 -6
- package/src/__tests__/secret-ingress-http.test.ts +0 -5
- package/src/__tests__/secret-ingress.test.ts +0 -5
- package/src/__tests__/send-endpoint-busy.test.ts +0 -24
- package/src/__tests__/sequence-store.test.ts +0 -21
- package/src/__tests__/server-history-render.test.ts +0 -24
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -4
- package/src/__tests__/skill-load-inline-command.test.ts +9 -0
- package/src/__tests__/skill-load-inline-includes.test.ts +9 -0
- package/src/__tests__/skill-load-tool.test.ts +11 -0
- package/src/__tests__/skills-uninstall.test.ts +10 -8
- package/src/__tests__/skills.test.ts +1 -1
- package/src/__tests__/slack-channel-config.test.ts +1 -1
- package/src/__tests__/slack-inbound-verification.test.ts +0 -22
- package/src/__tests__/starter-bundle.test.ts +4 -1
- package/src/__tests__/suggestion-routes.test.ts +2 -0
- package/src/__tests__/system-prompt.test.ts +1 -1
- package/src/__tests__/terminal-tools.test.ts +1 -1
- package/src/__tests__/test-preload.ts +31 -0
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +1 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -1
- package/src/__tests__/tool-executor.test.ts +0 -20
- package/src/__tests__/tool-input-summary.test.ts +124 -0
- package/src/__tests__/tool-preview-lifecycle.test.ts +2 -1
- package/src/__tests__/trust-store.test.ts +7 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -1
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +1 -1
- package/src/__tests__/trusted-contact-multichannel.test.ts +1 -1
- package/src/__tests__/trusted-contact-verification.test.ts +1 -1
- package/src/__tests__/turn-boundary-resolution.test.ts +1 -1
- package/src/__tests__/twilio-routes.test.ts +1 -1
- package/src/__tests__/update-bulletin.test.ts +1 -1
- package/src/__tests__/vbundle-pax-and-symlink.test.ts +1 -1
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +1 -0
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +1 -1
- package/src/__tests__/voice-session-bridge.test.ts +1 -1
- package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +4 -4
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +1 -1
- package/src/__tests__/workspace-migration-down-functions.test.ts +15 -3
- package/src/__tests__/workspace-migration-seed-device-id.test.ts +40 -4
- package/src/agent/loop.ts +6 -9
- package/src/approvals/guardian-decision-primitive.ts +46 -18
- package/src/approvals/guardian-request-resolvers.ts +19 -2
- package/src/calls/active-call-lease.ts +2 -2
- package/src/cli/AGENTS.md +1 -1
- package/src/cli/commands/doctor.ts +9 -9
- package/src/cli/commands/memory.ts +142 -0
- package/src/cli/commands/oauth/__tests__/connect.test.ts +13 -11
- package/src/cli/commands/oauth/__tests__/ping.test.ts +1 -1
- package/src/cli/commands/oauth/connect.ts +13 -12
- package/src/cli/commands/oauth/index.ts +1 -1
- package/src/cli/commands/oauth/providers.ts +47 -62
- package/src/cli/commands/platform/__tests__/connect.test.ts +72 -46
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +54 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +36 -0
- package/src/cli/commands/platform/connect.ts +17 -7
- package/src/cli/commands/platform/disconnect.ts +28 -3
- package/src/cli/commands/platform/index.ts +3 -3
- package/src/cli.ts +1 -299
- package/src/config/assistant-feature-flags.ts +23 -15
- package/src/config/bundled-skills/app-builder/TOOLS.json +16 -0
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +4 -0
- package/src/config/bundled-skills/app-builder/tools/app-delete.ts +5 -1
- package/src/config/bundled-skills/app-builder/tools/app-generate-icon.ts +9 -1
- package/src/config/bundled-skills/app-builder/tools/app-refresh.ts +5 -1
- package/src/config/bundled-skills/contacts/TOOLS.json +8 -0
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +10 -1
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +16 -2
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +1 -0
- package/src/config/bundled-skills/messaging/SKILL.md +7 -7
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +37 -0
- package/src/config/bundled-skills/slack/SKILL.md +18 -0
- package/src/config/env-registry.ts +15 -11
- package/src/config/env.ts +1 -11
- package/src/config/feature-flag-registry.json +16 -0
- package/src/config/schema.ts +4 -0
- package/src/config/schemas/heartbeat.ts +6 -1
- package/src/config/schemas/inference.ts +14 -3
- package/src/config/schemas/memory-processing.ts +16 -8
- package/src/config/schemas/memory-retrieval.ts +3 -3
- package/src/config/skills.ts +1 -1
- package/src/context/window-manager.ts +174 -51
- package/src/credential-execution/executable-discovery.ts +2 -2
- package/src/daemon/approved-devices-store.ts +2 -2
- package/src/daemon/assistant-attachments.ts +2 -0
- package/src/daemon/config-watcher.ts +4 -50
- package/src/daemon/conversation-agent-loop-handlers.ts +9 -1
- package/src/daemon/conversation-agent-loop.ts +12 -0
- package/src/daemon/conversation-error.ts +3 -5
- package/src/daemon/conversation-history.ts +7 -3
- package/src/daemon/conversation-lifecycle.ts +16 -0
- package/src/daemon/conversation-messaging.ts +1 -0
- package/src/daemon/conversation-notifiers.ts +67 -30
- package/src/daemon/conversation-process.ts +161 -2
- package/src/daemon/conversation-queue-manager.ts +2 -0
- package/src/daemon/conversation-runtime-assembly.ts +33 -11
- package/src/daemon/conversation-slash.ts +14 -3
- package/src/daemon/conversation-tool-setup.ts +2 -0
- package/src/daemon/conversation-usage.ts +32 -4
- package/src/daemon/conversation.ts +33 -1
- package/src/daemon/daemon-control.ts +32 -16
- package/src/daemon/date-context.ts +47 -45
- package/src/daemon/dictation-profile-store.ts +2 -2
- package/src/daemon/handlers/conversations.ts +19 -0
- package/src/daemon/handlers/shared.ts +14 -21
- package/src/daemon/lifecycle.ts +5 -7
- package/src/daemon/message-types/conversations.ts +2 -0
- package/src/daemon/message-types/guardian-actions.ts +3 -17
- package/src/daemon/message-types/integrations.ts +11 -1
- package/src/daemon/message-types/messages.ts +1 -0
- package/src/daemon/pairing-store.ts +2 -79
- package/src/daemon/server.ts +154 -8
- package/src/daemon/watch-handler.ts +65 -21
- package/src/email/guardrails.ts +3 -3
- package/src/heartbeat/heartbeat-service.ts +14 -7
- package/src/hooks/cli.ts +2 -2
- package/src/hooks/config.ts +2 -2
- package/src/hooks/discovery.ts +2 -2
- package/src/hooks/manager.ts +2 -2
- package/src/hooks/runner.ts +5 -2
- package/src/hooks/templates.ts +2 -2
- package/src/memory/admin.ts +181 -2
- package/src/memory/app-git-service.ts +61 -4
- package/src/memory/attachments-store.ts +2 -0
- package/src/memory/canonical-guardian-store.ts +16 -0
- package/src/memory/db-init.ts +8 -0
- package/src/memory/embedding-local.ts +5 -2
- package/src/memory/indexer.ts +44 -26
- package/src/memory/items-extractor.ts +34 -82
- package/src/memory/job-handlers/batch-extraction.ts +741 -0
- package/src/memory/job-handlers/journal-carry-forward.test.ts +383 -0
- package/src/memory/job-handlers/journal-carry-forward.ts +255 -0
- package/src/memory/jobs-store.ts +28 -0
- package/src/memory/jobs-worker.ts +56 -9
- package/src/memory/lifecycle-events-store.ts +4 -2
- package/src/memory/llm-request-log-store.ts +40 -2
- package/src/memory/llm-usage-store.ts +4 -3
- package/src/memory/migrations/199-guardian-request-enrichment-columns.ts +71 -0
- package/src/memory/migrations/200-usage-llm-call-count.ts +20 -0
- package/src/memory/migrations/index.ts +2 -0
- package/src/memory/query-expansion.ts +83 -0
- package/src/memory/retriever.test.ts +119 -0
- package/src/memory/retriever.ts +513 -105
- package/src/memory/schema/guardian.ts +4 -0
- package/src/memory/schema/infrastructure.ts +1 -0
- package/src/memory/search/formatting.test.ts +140 -0
- package/src/memory/search/formatting.ts +143 -198
- package/src/memory/search/mmr.ts +136 -0
- package/src/memory/search/staleness.ts +0 -15
- package/src/memory/search/tier-classifier.ts +10 -21
- package/src/memory/search/types.ts +17 -0
- package/src/messaging/providers/slack/adapter.ts +51 -5
- package/src/notifications/broadcaster.ts +13 -0
- package/src/notifications/copy-composer.ts +8 -0
- package/src/oauth/connect-orchestrator.ts +1 -1
- package/src/oauth/connection-resolver.ts +2 -2
- package/src/oauth/provider-serializer.ts +116 -0
- package/src/permissions/trust-store.ts +24 -7
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +5 -0
- package/src/prompts/journal-context.ts +50 -35
- package/src/prompts/persona-resolver.ts +1 -1
- package/src/prompts/system-prompt.ts +27 -28
- package/src/prompts/templates/BOOTSTRAP.md +14 -1
- package/src/prompts/templates/HEARTBEAT.md +10 -0
- package/src/prompts/templates/NOW.md +19 -25
- package/src/prompts/templates/SOUL.md +13 -1
- package/src/prompts/templates/UPDATES.md +12 -0
- package/src/prompts/update-bulletin.ts +1 -1
- package/src/providers/anthropic/client.ts +89 -18
- package/src/providers/model-catalog.ts +22 -2
- package/src/providers/model-intents.ts +2 -2
- package/src/providers/openai/client.ts +40 -1
- package/src/providers/retry.ts +23 -4
- package/src/providers/types.ts +2 -0
- package/src/runtime/assistant-scope.ts +1 -1
- package/src/runtime/auth/__tests__/credential-service.test.ts +1 -0
- package/src/runtime/auth/route-policy.ts +1 -0
- package/src/runtime/auth/token-service.ts +51 -29
- package/src/runtime/confirmation-request-guardian-bridge.ts +3 -1
- package/src/runtime/guardian-decision-types.ts +16 -10
- package/src/runtime/http-server.ts +3 -14
- package/src/runtime/http-types.ts +1 -0
- package/src/runtime/migrations/vbundle-builder.ts +7 -4
- package/src/runtime/migrations/vbundle-import-analyzer.ts +0 -4
- package/src/runtime/migrations/vbundle-importer.ts +1 -1
- package/src/runtime/routes/conversation-query-routes.ts +40 -8
- package/src/runtime/routes/conversation-routes.ts +125 -3
- package/src/runtime/routes/guardian-action-routes.ts +9 -3
- package/src/runtime/routes/identity-routes.ts +25 -4
- package/src/runtime/routes/llm-context-normalization.ts +1 -0
- package/src/runtime/routes/log-export-routes.ts +34 -12
- package/src/runtime/routes/migration-routes.ts +6 -10
- package/src/runtime/routes/oauth-apps.ts +2 -9
- package/src/runtime/routes/oauth-providers.ts +60 -0
- package/src/runtime/routes/pairing-routes.ts +0 -8
- package/src/runtime/routes/settings-routes.ts +0 -1
- package/src/runtime/routes/telemetry-routes.ts +16 -4
- package/src/security/encrypted-store.ts +2 -2
- package/src/security/secret-allowlist.ts +3 -3
- package/src/signals/emit-event.ts +42 -0
- package/src/signals/user-message.ts +37 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +83 -19
- package/src/telemetry/usage-telemetry-reporter.ts +23 -17
- package/src/tools/browser/runtime-check.ts +2 -2
- package/src/tools/credentials/vault.ts +2 -249
- package/src/tools/memory/definitions.ts +1 -1
- package/src/tools/memory/handlers.test.ts +50 -8
- package/src/tools/memory/handlers.ts +3 -1
- package/src/tools/side-effects.ts +1 -6
- package/src/tools/terminal/safe-env.ts +3 -2
- package/src/tools/terminal/shell.ts +11 -14
- package/src/tools/tool-approval-handler.ts +20 -1
- package/src/tools/tool-input-summary.ts +66 -0
- package/src/tools/types.ts +4 -0
- package/src/usage/types.ts +4 -0
- package/src/util/device-id.ts +10 -10
- package/src/util/platform.ts +71 -33
- package/src/util/pricing.ts +19 -6
- package/src/util/strip-comment-lines.ts +28 -0
- package/src/workspace/git-service.ts +8 -18
- package/src/workspace/migrations/003-seed-device-id.ts +6 -4
- package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +7 -1
- package/src/workspace/migrations/017-seed-persona-dirs.ts +2 -4
- package/src/workspace/migrations/021-move-signals-to-workspace.ts +84 -0
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +94 -0
- package/src/workspace/migrations/023-move-config-files-to-workspace.ts +86 -0
- package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +126 -0
- package/src/workspace/migrations/migrate-to-workspace-volume.ts +3 -6
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/signals/confirm.ts +0 -82
- package/src/signals/trust-rule.ts +0 -174
|
@@ -39,7 +39,7 @@ export type MemoryItemKind =
|
|
|
39
39
|
|
|
40
40
|
export type OverrideConfidence = "explicit" | "tentative" | "inferred";
|
|
41
41
|
|
|
42
|
-
interface ExtractedItem {
|
|
42
|
+
export interface ExtractedItem {
|
|
43
43
|
kind: MemoryItemKind;
|
|
44
44
|
subject: string;
|
|
45
45
|
statement: string;
|
|
@@ -50,9 +50,11 @@ interface ExtractedItem {
|
|
|
50
50
|
overrideConfidence: OverrideConfidence;
|
|
51
51
|
/** True when the LLM emitted a supersedes ID that was rejected (hallucinated). */
|
|
52
52
|
supersedesRejected?: boolean;
|
|
53
|
+
/** Which speaker's message this item was extracted from (batch extraction only). */
|
|
54
|
+
sourceRole?: "user" | "assistant";
|
|
53
55
|
}
|
|
54
56
|
|
|
55
|
-
const VALID_KINDS = new Set<string>([
|
|
57
|
+
export const VALID_KINDS = new Set<string>([
|
|
56
58
|
"identity",
|
|
57
59
|
"preference",
|
|
58
60
|
"project",
|
|
@@ -67,10 +69,10 @@ const VALID_KINDS = new Set<string>([
|
|
|
67
69
|
* because journal memories are created directly from disk files — any
|
|
68
70
|
* LLM-produced journal items would be silently dropped, wasting tokens.
|
|
69
71
|
*/
|
|
70
|
-
const EXTRACTION_KINDS = [...VALID_KINDS].filter((k) => k !== "journal");
|
|
72
|
+
export const EXTRACTION_KINDS = [...VALID_KINDS].filter((k) => k !== "journal");
|
|
71
73
|
|
|
72
74
|
/** Maps old kind names to their new equivalents for graceful migration. */
|
|
73
|
-
const KIND_MIGRATION_MAP: Record<string, MemoryItemKind> = {
|
|
75
|
+
export const KIND_MIGRATION_MAP: Record<string, MemoryItemKind> = {
|
|
74
76
|
profile: "identity",
|
|
75
77
|
fact: "identity",
|
|
76
78
|
relationship: "identity",
|
|
@@ -80,7 +82,7 @@ const KIND_MIGRATION_MAP: Record<string, MemoryItemKind> = {
|
|
|
80
82
|
style: "preference",
|
|
81
83
|
};
|
|
82
84
|
|
|
83
|
-
const SUPERSEDE_KINDS = new Set<MemoryItemKind>([
|
|
85
|
+
export const SUPERSEDE_KINDS = new Set<MemoryItemKind>([
|
|
84
86
|
"identity",
|
|
85
87
|
"preference",
|
|
86
88
|
"project",
|
|
@@ -88,63 +90,6 @@ const SUPERSEDE_KINDS = new Set<MemoryItemKind>([
|
|
|
88
90
|
"constraint",
|
|
89
91
|
]);
|
|
90
92
|
|
|
91
|
-
// ── Semantic density gating ────────────────────────────────────────────
|
|
92
|
-
// Skip messages that are too short or consist of low-value filler.
|
|
93
|
-
|
|
94
|
-
const LOW_VALUE_PATTERNS = new Set([
|
|
95
|
-
"ok",
|
|
96
|
-
"okay",
|
|
97
|
-
"k",
|
|
98
|
-
"sure",
|
|
99
|
-
"yes",
|
|
100
|
-
"no",
|
|
101
|
-
"yep",
|
|
102
|
-
"nope",
|
|
103
|
-
"yeah",
|
|
104
|
-
"nah",
|
|
105
|
-
"thanks",
|
|
106
|
-
"thank you",
|
|
107
|
-
"ty",
|
|
108
|
-
"thx",
|
|
109
|
-
"thanks!",
|
|
110
|
-
"thank you!",
|
|
111
|
-
"got it",
|
|
112
|
-
"understood",
|
|
113
|
-
"makes sense",
|
|
114
|
-
"sounds good",
|
|
115
|
-
"sounds great",
|
|
116
|
-
"cool",
|
|
117
|
-
"nice",
|
|
118
|
-
"great",
|
|
119
|
-
"awesome",
|
|
120
|
-
"perfect",
|
|
121
|
-
"done",
|
|
122
|
-
"lgtm",
|
|
123
|
-
"agreed",
|
|
124
|
-
"right",
|
|
125
|
-
"correct",
|
|
126
|
-
"exactly",
|
|
127
|
-
"yup",
|
|
128
|
-
"ack",
|
|
129
|
-
"hm",
|
|
130
|
-
"hmm",
|
|
131
|
-
"hmmm",
|
|
132
|
-
"ah",
|
|
133
|
-
"oh",
|
|
134
|
-
"i see",
|
|
135
|
-
]);
|
|
136
|
-
|
|
137
|
-
function hasSemanticDensity(text: string): boolean {
|
|
138
|
-
const trimmed = text.trim();
|
|
139
|
-
if (trimmed.length < 15) return false;
|
|
140
|
-
const lower = trimmed.toLowerCase().replace(/[.!?,;:\s]+$/, "");
|
|
141
|
-
if (LOW_VALUE_PATTERNS.has(lower)) return false;
|
|
142
|
-
// Very short messages with only 1-2 words are typically not memorable
|
|
143
|
-
const wordCount = trimmed.split(/\s+/).length;
|
|
144
|
-
if (wordCount <= 2) return false;
|
|
145
|
-
return true;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
93
|
// ── LLM-powered extraction ────────────────────────────────────────────
|
|
149
94
|
|
|
150
95
|
// Budget for the extraction system prompt (in characters). This is a
|
|
@@ -154,7 +99,7 @@ function hasSemanticDensity(text: string): boolean {
|
|
|
154
99
|
// tokens. ~6000 tokens ≈ 24 000 chars is a safe ceiling.
|
|
155
100
|
const EXTRACTION_SYSTEM_PROMPT_CHAR_BUDGET = 24_000;
|
|
156
101
|
|
|
157
|
-
function buildExtractionSystemPrompt(
|
|
102
|
+
export function buildExtractionSystemPrompt(
|
|
158
103
|
existingItems: Array<{
|
|
159
104
|
id: string;
|
|
160
105
|
kind: string;
|
|
@@ -174,18 +119,19 @@ Extract items in these categories:
|
|
|
174
119
|
- project: Project names, repos, tech stacks, architecture details, action items, follow-ups, things to do later
|
|
175
120
|
- decision: Choices made, approaches selected, trade-offs resolved
|
|
176
121
|
- constraint: Rules, requirements, things that must/must not be done, explicit directives on how the assistant should behave
|
|
177
|
-
- event:
|
|
122
|
+
- event: Moments that mattered — turning points, breakthroughs, significant shared experiences, deadlines, milestones
|
|
178
123
|
|
|
179
124
|
For each item, provide:
|
|
180
125
|
- kind: One of the categories above
|
|
181
126
|
- subject: A short label (2-8 words) identifying what this is about
|
|
182
|
-
- statement: A relationship-rich
|
|
127
|
+
- statement: A relationship-rich statement to remember (1-2 sentences). Include context about *why this mattered*, not just what happened. Write statements your future self would recognize as significant, not just accurate. Include relational context — who recommended it, why it matters, how it connects to other facts. For example, write "Data processing library that Sarah from Marketing recommended for the Q4 pipeline rewrite" instead of just "Uses pandas".
|
|
183
128
|
- confidence: How confident you are this is accurate (0.0-1.0)
|
|
184
|
-
- importance: How valuable this is to remember (0.0-1.0)
|
|
185
|
-
- 1.0:
|
|
186
|
-
- 0.8-0.9:
|
|
187
|
-
- 0.6-0.7: Project details, constraints, opinions
|
|
188
|
-
- 0.3-0.5: Contextual details, minor preferences
|
|
129
|
+
- importance: How valuable this is to remember (0.0-1.0). Not all facts are equally worth remembering — some moments are load-bearing.
|
|
130
|
+
- 1.0: Moments that changed the working relationship, breakthroughs, hard-won lessons, turning points
|
|
131
|
+
- 0.8-0.9: Significant decisions, strong preferences, personal facts that shape how you work together
|
|
132
|
+
- 0.6-0.7: Project details, constraints, opinions, recurring patterns
|
|
133
|
+
- 0.3-0.5: Contextual details, minor preferences, transient facts
|
|
134
|
+
- 0.1-0.2: Mundane facts (timezone, editor choice) — worth storing but shouldn't dominate retrieval
|
|
189
135
|
- supersedes: If this item replaces an existing memory item, set this to the ID of the item it replaces. Use null if it does not replace anything. Determine supersession by understanding the semantic meaning — do not rely on keyword matching.
|
|
190
136
|
- overrideConfidence: How confident you are that this overrides an existing item:
|
|
191
137
|
- "explicit": Clear override signal (e.g., "Actually I now prefer X", "I changed my mind about Y", "We switched from A to B")
|
|
@@ -198,7 +144,8 @@ Rules:
|
|
|
198
144
|
- Do NOT extract raw code snippets, JSON fragments, YAML, configuration values, log output, or data structures. Only extract the human-readable meaning or intent behind such content, not the literal syntax.
|
|
199
145
|
- Prefer fewer high-quality items over many low-quality ones.
|
|
200
146
|
- If the message contains no memorable information, return an empty array.
|
|
201
|
-
- The preceding conversation context (if provided) is for disambiguation only. Extract items ONLY from the final message after the --- separator, not from the context messages
|
|
147
|
+
- The preceding conversation context (if provided) is for disambiguation only. Extract items ONLY from the final message after the --- separator, not from the context messages.
|
|
148
|
+
- When superseding an existing memory, capture what shifted — the old state, the new state, and what prompted the change. The evolution is as valuable as the current state.`;
|
|
202
149
|
|
|
203
150
|
// Try to extract user name from persona text
|
|
204
151
|
let userName = "the user";
|
|
@@ -229,6 +176,12 @@ Good extractions from user messages:
|
|
|
229
176
|
- "We decided to go with Redis for the cache layer because DynamoDB was too expensive at our read volume"
|
|
230
177
|
→ kind: decision, subject: "Cache layer choice", statement: "${userName} chose Redis over DynamoDB for caching due to cost at high read volumes"
|
|
231
178
|
|
|
179
|
+
- "We pair-debugged a 4-hour outage and found the bug was a missing semicolon — user said it was the most frustrating and satisfying debug session"
|
|
180
|
+
→ kind: event, importance: 0.95, subject: "4-hour outage debug session", statement: "${userName} and assistant pair-debugged a 4-hour outage caused by a missing semicolon — ${userName} described it as the most frustrating and satisfying debug session"
|
|
181
|
+
|
|
182
|
+
- "User scrapped the entire approach mid-project and the rewrite turned out way better"
|
|
183
|
+
→ kind: decision, importance: 0.9, subject: "Architecture rewrite decision", statement: "${userName} scrapped the entire approach mid-project and rewrote it — the rewrite turned out significantly better, validating the decision to start over"
|
|
184
|
+
|
|
232
185
|
Good extractions from assistant messages:
|
|
233
186
|
- "Based on your earlier mention, I see you're using Next.js 14 with the app router for the dashboard project."
|
|
234
187
|
→ kind: project, subject: "Dashboard tech stack", statement: "${userName}'s dashboard project uses Next.js 14 with the app router"
|
|
@@ -244,7 +197,10 @@ Do NOT extract:
|
|
|
244
197
|
- "I think the best approach would be to refactor this" → speculative, no action taken yet
|
|
245
198
|
- "The tests passed" → transient status
|
|
246
199
|
- "Sure, sounds good" → filler
|
|
247
|
-
- "\`\`\`json {"key": "val"} \`\`\`" → raw code/data, extract meaning not syntax
|
|
200
|
+
- "\`\`\`json {"key": "val"} \`\`\`" → raw code/data, extract meaning not syntax
|
|
201
|
+
|
|
202
|
+
Low importance (still worth storing):
|
|
203
|
+
- "User uses VS Code" → kind: preference, importance: 0.15, subject: "Editor choice", statement: "${userName} uses VS Code as their editor"`;
|
|
248
204
|
|
|
249
205
|
if (existingItems.length > 0) {
|
|
250
206
|
instructions += `\n\nExisting memory items (use these to identify supersession targets — set \`supersedes\` to the item ID if the new information replaces one of these):\n`;
|
|
@@ -285,7 +241,7 @@ Do NOT extract:
|
|
|
285
241
|
return prompt;
|
|
286
242
|
}
|
|
287
243
|
|
|
288
|
-
const VALID_OVERRIDE_CONFIDENCES = new Set<string>([
|
|
244
|
+
export const VALID_OVERRIDE_CONFIDENCES = new Set<string>([
|
|
289
245
|
"explicit",
|
|
290
246
|
"tentative",
|
|
291
247
|
"inferred",
|
|
@@ -306,7 +262,7 @@ interface LLMExtractedItem {
|
|
|
306
262
|
* extraction LLM awareness of existing items it might supersede.
|
|
307
263
|
* This is a write-path-only heuristic — not used at read time.
|
|
308
264
|
*/
|
|
309
|
-
function queryExistingItemsForContext(
|
|
265
|
+
export function queryExistingItemsForContext(
|
|
310
266
|
scopeId: string,
|
|
311
267
|
text: string,
|
|
312
268
|
): Array<{ id: string; kind: string; subject: string; statement: string }> {
|
|
@@ -478,7 +434,7 @@ async function extractItemsWithLLM(
|
|
|
478
434
|
systemPrompt,
|
|
479
435
|
{
|
|
480
436
|
config: {
|
|
481
|
-
modelIntent:
|
|
437
|
+
modelIntent: "quality-optimized" as const,
|
|
482
438
|
tool_choice: { type: "tool" as const, name: "store_memory_items" },
|
|
483
439
|
},
|
|
484
440
|
},
|
|
@@ -632,11 +588,7 @@ export async function extractAndUpsertMemoryItemsForMessage(
|
|
|
632
588
|
}
|
|
633
589
|
|
|
634
590
|
const text = extractTextFromStoredMessageContent(message.content);
|
|
635
|
-
if (
|
|
636
|
-
log.debug(
|
|
637
|
-
{ messageId },
|
|
638
|
-
"Skipping extraction — message lacks semantic density",
|
|
639
|
-
);
|
|
591
|
+
if (text.length === 0) {
|
|
640
592
|
triggerConversationStartersIfNeeded(journalUpserted, effectiveScopeId);
|
|
641
593
|
return journalUpserted;
|
|
642
594
|
}
|
|
@@ -889,7 +841,7 @@ export async function extractAndUpsertMemoryItemsForMessage(
|
|
|
889
841
|
|
|
890
842
|
// ── Helpers ────────────────────────────────────────────────────────────
|
|
891
843
|
|
|
892
|
-
function deduplicateItems(items: ExtractedItem[]): ExtractedItem[] {
|
|
844
|
+
export function deduplicateItems(items: ExtractedItem[]): ExtractedItem[] {
|
|
893
845
|
const seen = new Set<string>();
|
|
894
846
|
const unique: ExtractedItem[] = [];
|
|
895
847
|
for (const item of items) {
|
|
@@ -901,7 +853,7 @@ function deduplicateItems(items: ExtractedItem[]): ExtractedItem[] {
|
|
|
901
853
|
}
|
|
902
854
|
|
|
903
855
|
/** Parse a score value, returning `fallback` for null, undefined, empty strings, and non-finite numbers. */
|
|
904
|
-
function parseScore(value: unknown, fallback: number): number {
|
|
856
|
+
export function parseScore(value: unknown, fallback: number): number {
|
|
905
857
|
if (value == null || value === "") return fallback;
|
|
906
858
|
const n = Number(value);
|
|
907
859
|
return Number.isFinite(n) ? n : fallback;
|