@vellumai/assistant 0.4.48 → 0.4.50
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 +26 -35
- package/README.md +5 -26
- package/docs/architecture/integrations.md +45 -41
- package/docs/architecture/keychain-broker.md +3 -3
- package/docs/architecture/memory.md +180 -119
- package/docs/runbook-trusted-contacts.md +3 -8
- package/hook-templates/debug-prompt-logger/hook.json +1 -1
- package/hook-templates/debug-prompt-logger/run.sh +1 -3
- package/package.json +2 -2
- package/src/__tests__/actor-token-service.test.ts +0 -1
- package/src/__tests__/agent-loop.test.ts +3 -1
- package/src/__tests__/anthropic-provider.test.ts +249 -2
- package/src/__tests__/approval-cascade.test.ts +796 -0
- package/src/__tests__/approval-primitive.test.ts +0 -1
- package/src/__tests__/approval-routes-http.test.ts +4 -0
- package/src/__tests__/assistant-attachments.test.ts +12 -34
- package/src/__tests__/assistant-feature-flag-guard.test.ts +0 -23
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +76 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -1
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +2 -2
- package/src/__tests__/canonical-guardian-store.test.ts +95 -0
- package/src/__tests__/channel-guardian.test.ts +0 -2
- package/src/__tests__/channel-readiness-routes.test.ts +15 -6
- package/src/__tests__/channel-readiness-service.test.ts +10 -9
- package/src/__tests__/checker.test.ts +13 -20
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +1 -1
- package/src/__tests__/computer-use-tools.test.ts +2 -19
- package/src/__tests__/config-schema.test.ts +1 -68
- package/src/__tests__/config-watcher.test.ts +0 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/context-image-dimensions.test.ts +332 -0
- package/src/__tests__/context-memory-e2e.test.ts +11 -100
- package/src/__tests__/context-token-estimator.test.ts +196 -13
- package/src/__tests__/conversation-attention-store.test.ts +0 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +0 -1
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +152 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -0
- package/src/__tests__/credential-metadata-store.test.ts +64 -73
- package/src/__tests__/credential-security-e2e.test.ts +1 -0
- package/src/__tests__/credential-security-invariants.test.ts +13 -7
- package/src/__tests__/credential-vault-unit.test.ts +284 -49
- package/src/__tests__/credential-vault.test.ts +150 -16
- package/src/__tests__/credentials-cli.test.ts +71 -0
- package/src/__tests__/cu-unified-flow.test.ts +532 -0
- package/src/__tests__/date-context.test.ts +93 -77
- package/src/__tests__/deterministic-verification-control-plane.test.ts +64 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/ephemeral-permissions.test.ts +3 -3
- package/src/__tests__/gateway-only-guard.test.ts +0 -1
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +93 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -39
- package/src/__tests__/heartbeat-service.test.ts +0 -1
- package/src/__tests__/history-repair.test.ts +245 -0
- package/src/__tests__/host-cu-proxy.test.ts +791 -0
- package/src/__tests__/host-shell-tool.test.ts +27 -15
- package/src/__tests__/http-user-message-parity.test.ts +2 -0
- package/src/__tests__/ingress-url-consistency.test.ts +14 -21
- package/src/__tests__/integration-status.test.ts +32 -51
- package/src/__tests__/intent-routing.test.ts +0 -1
- package/src/__tests__/invite-redemption-service.test.ts +65 -1
- package/src/__tests__/invite-routes-http.test.ts +10 -9
- package/src/__tests__/keychain-broker-client.test.ts +14 -46
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +56 -18
- package/src/__tests__/memory-lifecycle-e2e.test.ts +244 -387
- package/src/__tests__/memory-recall-quality.test.ts +244 -407
- package/src/__tests__/memory-regressions.experimental.test.ts +126 -101
- package/src/__tests__/memory-regressions.test.ts +477 -2841
- package/src/__tests__/memory-retrieval.benchmark.test.ts +33 -150
- package/src/__tests__/memory-upsert-concurrency.test.ts +5 -244
- package/src/__tests__/mime-builder.test.ts +28 -0
- package/src/__tests__/native-web-search.test.ts +1 -0
- package/src/__tests__/notification-routing-intent.test.ts +0 -1
- package/src/__tests__/oauth-cli.test.ts +941 -15
- package/src/__tests__/oauth-provider-profiles.test.ts +9 -9
- package/src/__tests__/oauth-scope-policy.test.ts +4 -6
- package/src/__tests__/oauth-store.test.ts +870 -0
- package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
- package/src/__tests__/provider-error-scenarios.test.ts +0 -1
- package/src/__tests__/provider-streaming.benchmark.test.ts +0 -1
- package/src/__tests__/public-ingress-urls.test.ts +15 -21
- package/src/__tests__/qdrant-collection-migration.test.ts +53 -8
- package/src/__tests__/recording-handler.test.ts +3 -4
- package/src/__tests__/registry.test.ts +2 -3
- package/src/__tests__/relay-server.test.ts +46 -1
- package/src/__tests__/runtime-events-sse.test.ts +55 -7
- package/src/__tests__/schedule-store.test.ts +0 -1
- package/src/__tests__/schedule-tools.test.ts +32 -0
- package/src/__tests__/scheduler-recurrence.test.ts +0 -1
- package/src/__tests__/scoped-approval-grants.test.ts +0 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
- package/src/__tests__/script-proxy-certs.test.ts +1 -1
- package/src/__tests__/secret-ingress-handler.test.ts +0 -1
- package/src/__tests__/secret-onetime-send.test.ts +1 -0
- package/src/__tests__/secure-keys.test.ts +7 -2
- package/src/__tests__/send-endpoint-busy.test.ts +24 -6
- package/src/__tests__/sequence-store.test.ts +0 -1
- package/src/__tests__/session-abort-tool-results.test.ts +1 -14
- package/src/__tests__/session-agent-loop-overflow.test.ts +1583 -0
- package/src/__tests__/session-agent-loop.test.ts +19 -15
- package/src/__tests__/session-confirmation-signals.test.ts +1 -15
- package/src/__tests__/session-error.test.ts +124 -2
- package/src/__tests__/session-history-web-search.test.ts +918 -0
- package/src/__tests__/session-init.benchmark.test.ts +4 -5
- package/src/__tests__/session-pre-run-repair.test.ts +1 -14
- package/src/__tests__/session-provider-retry-repair.test.ts +25 -28
- package/src/__tests__/session-queue.test.ts +37 -27
- package/src/__tests__/session-runtime-assembly.test.ts +54 -0
- package/src/__tests__/session-slash-known.test.ts +1 -15
- package/src/__tests__/session-slash-queue.test.ts +1 -15
- package/src/__tests__/session-slash-unknown.test.ts +1 -15
- package/src/__tests__/session-workspace-cache-state.test.ts +3 -33
- package/src/__tests__/session-workspace-injection.test.ts +3 -37
- package/src/__tests__/session-workspace-tool-tracking.test.ts +3 -37
- package/src/__tests__/skill-include-graph.test.ts +66 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +0 -1
- package/src/__tests__/skill-load-tool.test.ts +149 -1
- package/src/__tests__/skill-projection-feature-flag.test.ts +0 -1
- package/src/__tests__/skills-install-extract.test.ts +93 -0
- package/src/__tests__/skills-uninstall.test.ts +1 -1
- package/src/__tests__/skills.test.ts +3 -3
- package/src/__tests__/skillssh-registry.test.ts +451 -0
- package/src/__tests__/slack-channel-config.test.ts +67 -3
- package/src/__tests__/slack-share-routes.test.ts +17 -19
- package/src/__tests__/system-prompt.test.ts +0 -1
- package/src/__tests__/telegram-invite-adapter.test.ts +18 -22
- package/src/__tests__/terminal-tools.test.ts +4 -3
- package/src/__tests__/test-support/computer-use-skill-harness.ts +3 -2
- package/src/__tests__/tool-approval-handler.test.ts +0 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
- package/src/__tests__/tool-executor-shell-integration.test.ts +0 -1
- package/src/__tests__/tool-executor.test.ts +0 -1
- package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
- package/src/__tests__/trust-store-pattern-matches.test.ts +29 -0
- package/src/__tests__/trust-store.test.ts +7 -13
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
- package/src/__tests__/twilio-routes.test.ts +0 -16
- package/src/__tests__/verification-control-plane-policy.test.ts +0 -1
- package/src/__tests__/voice-invite-redemption.test.ts +32 -1
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
- package/src/agent/ax-tree-compaction.test.ts +286 -0
- package/src/agent/loop.ts +104 -131
- package/src/approvals/AGENTS.md +1 -1
- package/src/approvals/guardian-request-resolvers.ts +14 -2
- package/src/bundler/compiler-tools.ts +66 -2
- package/src/calls/call-domain.ts +133 -6
- package/src/calls/call-store.ts +6 -0
- package/src/calls/relay-server.ts +52 -18
- package/src/calls/relay-setup-router.ts +17 -1
- package/src/calls/twilio-config.ts +3 -8
- package/src/calls/twilio-routes.ts +1 -2
- package/src/calls/types.ts +3 -1
- package/src/calls/voice-ingress-preflight.ts +1 -1
- package/src/cli/commands/browser-relay.ts +18 -12
- package/src/cli/commands/completions.ts +0 -3
- package/src/cli/commands/credentials.ts +101 -15
- package/src/cli/commands/doctor.ts +4 -3
- package/src/cli/commands/mcp.ts +46 -59
- package/src/cli/commands/memory.ts +16 -165
- package/src/cli/commands/oauth/apps.ts +284 -0
- package/src/cli/commands/oauth/connections.ts +633 -0
- package/src/cli/commands/oauth/index.ts +52 -0
- package/src/cli/commands/oauth/providers.ts +256 -0
- package/src/cli/commands/sessions.ts +5 -2
- package/src/cli/commands/skills.ts +177 -339
- package/src/cli/http-client.ts +0 -20
- package/src/cli/main-screen.tsx +2 -2
- package/src/cli/program.ts +6 -11
- package/src/cli/reference.ts +1 -3
- package/src/cli.ts +4 -10
- package/src/config/assistant-feature-flags.ts +0 -3
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +1 -1
- package/src/config/bundled-skills/computer-use/SKILL.md +3 -6
- package/src/config/bundled-skills/computer-use/TOOLS.json +23 -5
- package/src/config/bundled-skills/computer-use/tools/{computer-use-request-control.ts → computer-use-observe.ts} +1 -5
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +21 -16
- package/src/config/bundled-skills/messaging/tools/shared.ts +1 -4
- package/src/config/bundled-skills/settings/SKILL.md +1 -1
- package/src/config/bundled-skills/settings/TOOLS.json +2 -8
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +5 -33
- package/src/config/bundled-tool-registry.ts +2 -5
- package/src/config/env-registry.ts +14 -83
- package/src/config/env.ts +11 -50
- package/src/config/feature-flag-registry.json +16 -16
- package/src/config/loader.ts +0 -6
- package/src/config/schema.ts +4 -13
- package/src/config/schemas/memory-lifecycle.ts +0 -9
- package/src/config/schemas/memory-processing.ts +0 -180
- package/src/config/schemas/memory-retrieval.ts +32 -104
- package/src/config/schemas/memory.ts +0 -10
- package/src/config/skills.ts +21 -2
- package/src/config/types.ts +0 -4
- package/src/context/image-dimensions.ts +229 -0
- package/src/context/token-estimator.ts +75 -12
- package/src/context/window-manager.ts +53 -11
- package/src/daemon/assistant-attachments.ts +1 -13
- package/src/daemon/config-watcher.ts +61 -3
- package/src/daemon/daemon-control.ts +1 -1
- package/src/daemon/date-context.ts +114 -31
- package/src/daemon/handlers/config-ingress.ts +8 -33
- package/src/daemon/handlers/config-slack-channel.ts +49 -46
- package/src/daemon/handlers/config-telegram.ts +32 -16
- package/src/daemon/handlers/sessions.ts +27 -36
- package/src/daemon/handlers/shared.ts +0 -130
- package/src/daemon/handlers/skills.ts +20 -1
- package/src/daemon/history-repair.ts +72 -8
- package/src/daemon/host-cu-proxy.ts +430 -0
- package/src/daemon/lifecycle.ts +67 -71
- package/src/daemon/mcp-reload-service.ts +2 -2
- package/src/daemon/message-protocol.ts +3 -0
- package/src/daemon/message-types/computer-use.ts +1 -129
- package/src/daemon/message-types/host-cu.ts +19 -0
- package/src/daemon/message-types/memory.ts +4 -16
- package/src/daemon/message-types/messages.ts +4 -0
- package/src/daemon/message-types/sessions.ts +4 -0
- package/src/daemon/server.ts +25 -21
- package/src/daemon/session-agent-loop-handlers.ts +40 -0
- package/src/daemon/session-agent-loop.ts +334 -48
- package/src/daemon/session-attachments.ts +1 -2
- package/src/daemon/session-error.ts +89 -6
- package/src/daemon/session-history.ts +17 -7
- package/src/daemon/session-media-retry.ts +6 -2
- package/src/daemon/session-memory.ts +69 -149
- package/src/daemon/session-process.ts +10 -1
- package/src/daemon/session-runtime-assembly.ts +49 -19
- package/src/daemon/session-slash.ts +1 -1
- package/src/daemon/session-surfaces.ts +43 -28
- package/src/daemon/session-tool-setup.ts +9 -10
- package/src/daemon/session.ts +150 -17
- package/src/daemon/tool-side-effects.ts +2 -8
- package/src/daemon/watch-handler.ts +2 -2
- package/src/events/tool-metrics-listener.ts +2 -2
- package/src/hooks/manager.ts +1 -4
- package/src/inbound/public-ingress-urls.ts +7 -7
- package/src/instrument.ts +61 -1
- package/src/logfire.ts +16 -5
- package/src/memory/admin.ts +2 -191
- package/src/memory/canonical-guardian-store.ts +38 -2
- package/src/memory/conversation-crud.ts +0 -33
- package/src/memory/conversation-key-store.ts +21 -0
- package/src/memory/conversation-queries.ts +22 -3
- package/src/memory/db-init.ts +32 -0
- package/src/memory/embedding-backend.ts +84 -8
- package/src/memory/embedding-types.ts +9 -1
- package/src/memory/indexer.ts +7 -46
- package/src/memory/items-extractor.ts +274 -76
- package/src/memory/job-handlers/backfill.ts +2 -127
- package/src/memory/job-handlers/cleanup.ts +2 -16
- package/src/memory/job-handlers/extraction.ts +2 -138
- package/src/memory/job-handlers/index-maintenance.ts +1 -6
- package/src/memory/job-handlers/summarization.ts +3 -148
- package/src/memory/job-utils.ts +21 -59
- package/src/memory/jobs-store.ts +1 -159
- package/src/memory/jobs-worker.ts +9 -52
- package/src/memory/migrations/104-core-indexes.ts +3 -3
- package/src/memory/migrations/149-oauth-tables.ts +62 -0
- package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +98 -0
- package/src/memory/migrations/151-oauth-providers-ping-url.ts +11 -0
- package/src/memory/migrations/152-memory-item-supersession.ts +44 -0
- package/src/memory/migrations/153-drop-entity-tables.ts +15 -0
- package/src/memory/migrations/154-drop-fts.ts +20 -0
- package/src/memory/migrations/155-drop-conflicts.ts +7 -0
- package/src/memory/migrations/156-call-session-invite-metadata.ts +24 -0
- package/src/memory/migrations/index.ts +8 -0
- package/src/memory/qdrant-client.ts +148 -51
- package/src/memory/raw-query.ts +1 -1
- package/src/memory/retriever.test.ts +294 -273
- package/src/memory/retriever.ts +421 -645
- package/src/memory/schema/calls.ts +2 -0
- package/src/memory/schema/index.ts +1 -0
- package/src/memory/schema/memory-core.ts +3 -48
- package/src/memory/schema/oauth.ts +67 -0
- package/src/memory/search/formatting.ts +263 -176
- package/src/memory/search/lexical.ts +1 -254
- package/src/memory/search/ranking.ts +0 -455
- package/src/memory/search/semantic.ts +100 -14
- package/src/memory/search/staleness.ts +47 -0
- package/src/memory/search/tier-classifier.ts +21 -0
- package/src/memory/search/types.ts +15 -77
- package/src/memory/task-memory-cleanup.ts +4 -6
- package/src/messaging/provider.ts +4 -4
- package/src/messaging/providers/gmail/client.ts +82 -2
- package/src/messaging/providers/gmail/mime-builder.ts +17 -7
- package/src/messaging/providers/gmail/people-client.ts +10 -10
- package/src/messaging/providers/telegram-bot/adapter.ts +17 -17
- package/src/messaging/providers/whatsapp/adapter.ts +11 -8
- package/src/messaging/registry.ts +2 -32
- package/src/notifications/copy-composer.ts +0 -5
- package/src/notifications/signal.ts +4 -5
- package/src/oauth/byo-connection.test.ts +133 -25
- package/src/oauth/byo-connection.ts +22 -6
- package/src/oauth/connect-orchestrator.ts +113 -57
- package/src/oauth/connect-types.ts +17 -23
- package/src/oauth/connection-resolver.ts +35 -11
- package/src/oauth/connection.ts +1 -1
- package/src/oauth/manual-token-connection.ts +104 -0
- package/src/oauth/oauth-store.ts +582 -0
- package/src/oauth/platform-connection.test.ts +29 -0
- package/src/oauth/platform-connection.ts +6 -5
- package/src/oauth/provider-behaviors.ts +124 -0
- package/src/oauth/scope-policy.ts +9 -2
- package/src/oauth/seed-providers.ts +167 -0
- package/src/oauth/token-persistence.ts +81 -77
- package/src/permissions/checker.ts +3 -3
- package/src/permissions/defaults.ts +1 -1
- package/src/permissions/prompter.ts +10 -1
- package/src/permissions/trust-store.ts +36 -1
- package/src/playbooks/playbook-compiler.ts +1 -1
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +3 -1
- package/src/prompts/system-prompt.ts +46 -42
- package/src/providers/anthropic/client.ts +59 -20
- package/src/providers/retry.ts +1 -27
- package/src/providers/types.ts +7 -1
- package/src/runtime/AGENTS.md +9 -0
- package/src/runtime/auth/route-policy.ts +6 -6
- package/src/runtime/channel-reply-delivery.ts +0 -40
- package/src/runtime/gateway-client.ts +0 -7
- package/src/runtime/guardian-reply-router.ts +24 -22
- package/src/runtime/http-server.ts +10 -8
- package/src/runtime/http-types.ts +2 -2
- package/src/runtime/invite-redemption-service.ts +19 -1
- package/src/runtime/invite-service.ts +25 -0
- package/src/runtime/middleware/twilio-validation.ts +1 -11
- package/src/runtime/pending-interactions.ts +14 -12
- package/src/runtime/routes/brain-graph-routes.ts +10 -90
- package/src/runtime/routes/channel-delivery-routes.ts +0 -1
- package/src/runtime/routes/conversation-routes.ts +81 -19
- package/src/runtime/routes/events-routes.ts +21 -11
- package/src/runtime/routes/host-cu-routes.ts +97 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +21 -12
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +12 -111
- package/src/runtime/routes/integrations/slack/share.ts +6 -7
- package/src/runtime/routes/log-export-routes.ts +126 -8
- package/src/runtime/routes/memory-item-routes.test.ts +754 -0
- package/src/runtime/routes/memory-item-routes.ts +503 -0
- package/src/runtime/routes/session-management-routes.ts +3 -3
- package/src/runtime/routes/settings-routes.ts +55 -48
- package/src/runtime/routes/surface-action-routes.ts +1 -1
- package/src/runtime/routes/trust-rules-routes.ts +14 -0
- package/src/runtime/routes/watch-routes.ts +128 -0
- package/src/runtime/routes/workspace-routes.ts +2 -1
- package/src/schedule/integration-status.ts +10 -9
- package/src/security/credential-key.ts +0 -156
- package/src/security/keychain-broker-client.ts +22 -10
- package/src/security/oauth2.ts +1 -1
- package/src/security/secure-keys.ts +25 -3
- package/src/security/token-manager.ts +137 -64
- package/src/skills/catalog-install.ts +414 -0
- package/src/skills/include-graph.ts +32 -0
- package/src/skills/skillssh-registry.ts +503 -0
- package/src/telegram/bot-username.ts +2 -3
- package/src/tools/assets/search.ts +5 -1
- package/src/tools/browser/network-recorder.ts +1 -1
- package/src/tools/browser/network-recording-types.ts +1 -1
- package/src/tools/computer-use/definitions.ts +36 -11
- package/src/tools/computer-use/registry.ts +5 -6
- package/src/tools/credentials/broker.ts +1 -2
- package/src/tools/credentials/metadata-store.ts +17 -121
- package/src/tools/credentials/vault.ts +92 -167
- package/src/tools/memory/definitions.ts +4 -13
- package/src/tools/memory/handlers.test.ts +83 -103
- package/src/tools/memory/handlers.ts +50 -85
- package/src/tools/registry.ts +2 -7
- package/src/tools/schedule/create.ts +8 -1
- package/src/tools/schedule/update.ts +8 -1
- package/src/tools/skills/load.ts +85 -3
- package/src/tools/watch/watch-state.ts +0 -12
- package/src/util/logger.ts +7 -41
- package/src/util/platform.ts +9 -28
- package/src/watcher/providers/google-calendar.ts +2 -1
- package/src/__tests__/clarification-resolver.test.ts +0 -193
- package/src/__tests__/computer-use-session-compaction.test.ts +0 -143
- package/src/__tests__/computer-use-session-lifecycle.test.ts +0 -322
- package/src/__tests__/computer-use-session-working-dir.test.ts +0 -166
- package/src/__tests__/computer-use-skill-baseline.test.ts +0 -78
- package/src/__tests__/computer-use-skill-endstate.test.ts +0 -105
- package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +0 -249
- package/src/__tests__/conflict-intent-tokenization.test.ts +0 -160
- package/src/__tests__/conflict-policy.test.ts +0 -269
- package/src/__tests__/conflict-store.test.ts +0 -372
- package/src/__tests__/contradiction-checker.test.ts +0 -361
- package/src/__tests__/entity-extractor.test.ts +0 -211
- package/src/__tests__/entity-search.test.ts +0 -1117
- package/src/__tests__/profile-compiler.test.ts +0 -392
- package/src/__tests__/ride-shotgun-handler.test.ts +0 -452
- package/src/__tests__/session-conflict-gate.test.ts +0 -1228
- package/src/__tests__/session-profile-injection.test.ts +0 -557
- package/src/cli/commands/dev.ts +0 -129
- package/src/cli/commands/map.ts +0 -391
- package/src/cli/commands/oauth.ts +0 -77
- package/src/config/bundled-skills/knowledge-graph/SKILL.md +0 -25
- package/src/config/bundled-skills/knowledge-graph/TOOLS.json +0 -66
- package/src/config/bundled-skills/knowledge-graph/tools/graph-query.ts +0 -211
- package/src/daemon/computer-use-session.ts +0 -1026
- package/src/daemon/ride-shotgun-handler.ts +0 -569
- package/src/daemon/session-conflict-gate.ts +0 -167
- package/src/daemon/session-dynamic-profile.ts +0 -77
- package/src/memory/clarification-resolver.ts +0 -417
- package/src/memory/conflict-intent.ts +0 -205
- package/src/memory/conflict-policy.ts +0 -127
- package/src/memory/conflict-store.ts +0 -410
- package/src/memory/contradiction-checker.ts +0 -508
- package/src/memory/entity-extractor.ts +0 -535
- package/src/memory/format-recall.ts +0 -47
- package/src/memory/fts-reconciler.ts +0 -165
- package/src/memory/job-handlers/conflict.ts +0 -200
- package/src/memory/profile-compiler.ts +0 -195
- package/src/memory/recall-cache.ts +0 -117
- package/src/memory/search/entity.ts +0 -535
- package/src/memory/search/query-expansion.test.ts +0 -70
- package/src/memory/search/query-expansion.ts +0 -118
- package/src/oauth/provider-base-urls.ts +0 -21
- package/src/oauth/provider-profiles.ts +0 -192
- package/src/prompts/computer-use-prompt.ts +0 -98
- package/src/runtime/routes/computer-use-routes.ts +0 -641
- package/src/runtime/routes/mcp-routes.ts +0 -20
- package/src/runtime/telegram-streaming-delivery.test.ts +0 -729
- package/src/runtime/telegram-streaming-delivery.ts +0 -393
- package/src/tools/computer-use/request-computer-control.ts +0 -56
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Token manager for OAuth2 credentials.
|
|
3
3
|
*
|
|
4
|
-
* Reads refresh configuration (tokenUrl, clientId)
|
|
5
|
-
*
|
|
6
|
-
* refresh
|
|
4
|
+
* Reads refresh configuration (tokenUrl, clientId, authMethod) exclusively
|
|
5
|
+
* from the SQLite oauth-store (provider + app + connection rows). After a
|
|
6
|
+
* successful refresh, writes tokens to new-format secure key paths and
|
|
7
|
+
* updates the oauth_connection row.
|
|
7
8
|
*/
|
|
8
9
|
|
|
9
10
|
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
getApp,
|
|
12
|
+
getConnection,
|
|
13
|
+
getConnectionByProvider,
|
|
14
|
+
getProvider,
|
|
15
|
+
updateConnection,
|
|
16
|
+
} from "../oauth/oauth-store.js";
|
|
13
17
|
import { getLogger } from "../util/logger.js";
|
|
14
|
-
import { credentialKey, migrateKeys } from "./credential-key.js";
|
|
15
18
|
import { refreshOAuth2Token, type TokenEndpointAuthMethod } from "./oauth2.js";
|
|
16
19
|
import { getSecureKey, setSecureKeyAsync } from "./secure-keys.js";
|
|
17
20
|
|
|
@@ -114,14 +117,14 @@ function recordRefreshFailure(service: string): void {
|
|
|
114
117
|
|
|
115
118
|
const inflightRefreshes = new Map<string, Promise<string>>();
|
|
116
119
|
|
|
117
|
-
function deduplicatedRefresh(service: string): Promise<string> {
|
|
118
|
-
const existing = inflightRefreshes.get(
|
|
120
|
+
function deduplicatedRefresh(service: string, connId: string): Promise<string> {
|
|
121
|
+
const existing = inflightRefreshes.get(connId);
|
|
119
122
|
if (existing) return existing;
|
|
120
123
|
|
|
121
|
-
const promise = doRefresh(service).finally(() => {
|
|
122
|
-
inflightRefreshes.delete(
|
|
124
|
+
const promise = doRefresh(service, connId).finally(() => {
|
|
125
|
+
inflightRefreshes.delete(connId);
|
|
123
126
|
});
|
|
124
|
-
inflightRefreshes.set(
|
|
127
|
+
inflightRefreshes.set(connId, promise);
|
|
125
128
|
return promise;
|
|
126
129
|
}
|
|
127
130
|
|
|
@@ -155,58 +158,115 @@ export class TokenExpiredError extends Error {
|
|
|
155
158
|
}
|
|
156
159
|
|
|
157
160
|
/**
|
|
158
|
-
* Check whether
|
|
159
|
-
* within the buffer window, based on the `expiresAt` field in credential metadata.
|
|
161
|
+
* Check whether a token is expired or will expire within the buffer window.
|
|
160
162
|
*/
|
|
161
|
-
function isTokenExpired(
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
163
|
+
function isTokenExpired(expiresAt: number | null): boolean {
|
|
164
|
+
if (!expiresAt) return false;
|
|
165
|
+
return Date.now() >= expiresAt - EXPIRY_BUFFER_MS;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// ── Refresh config resolution ─────────────────────────────────────────
|
|
169
|
+
|
|
170
|
+
/** Shared shape for resolved refresh configuration. */
|
|
171
|
+
interface RefreshConfig {
|
|
172
|
+
tokenUrl: string;
|
|
173
|
+
clientId: string;
|
|
174
|
+
/** OAuth client secret (optional — PKCE flows may omit it). */
|
|
175
|
+
secret?: string;
|
|
176
|
+
refreshToken?: string;
|
|
177
|
+
authMethod?: TokenEndpointAuthMethod;
|
|
178
|
+
connId: string;
|
|
165
179
|
}
|
|
166
180
|
|
|
167
181
|
/**
|
|
168
|
-
*
|
|
169
|
-
* refresh token and OAuth2 config stored in credential metadata.
|
|
182
|
+
* Resolve refresh configuration from the SQLite oauth-store.
|
|
170
183
|
*
|
|
171
|
-
*
|
|
172
|
-
* Throws `TokenExpiredError` if
|
|
184
|
+
* Looks up connection -> app -> provider to read tokenUrl, clientId, and
|
|
185
|
+
* authMethod. Throws `TokenExpiredError` if the connection is not found
|
|
186
|
+
* or incomplete.
|
|
173
187
|
*/
|
|
174
|
-
|
|
175
|
-
const
|
|
176
|
-
if (!
|
|
188
|
+
function resolveRefreshConfig(service: string, connId: string): RefreshConfig {
|
|
189
|
+
const conn = getConnection(connId);
|
|
190
|
+
if (!conn) {
|
|
177
191
|
throw new TokenExpiredError(
|
|
178
192
|
service,
|
|
179
|
-
`No
|
|
193
|
+
`No OAuth connection found for "${service}". Re-authorization required.${recoveryHint(service)}`,
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const app = getApp(conn.oauthAppId);
|
|
198
|
+
if (!app) {
|
|
199
|
+
throw new TokenExpiredError(
|
|
200
|
+
service,
|
|
201
|
+
`No OAuth app found for "${service}". Re-authorization required.${recoveryHint(service)}`,
|
|
180
202
|
);
|
|
181
203
|
}
|
|
182
204
|
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
const clientId = meta?.oauth2ClientId;
|
|
186
|
-
|
|
187
|
-
if (!tokenUrl || !clientId) {
|
|
188
|
-
// Legacy credentials created by the old integration flow don't store
|
|
189
|
-
// oauth2TokenUrl/oauth2ClientId in metadata. The client ID is user-specific
|
|
190
|
-
// (from their Google Cloud Console) and cannot be recovered, so the only
|
|
191
|
-
// path forward is re-authorization via the new oauth2_connect flow.
|
|
192
|
-
const isLegacy = service === "integration:gmail" && !tokenUrl && !clientId;
|
|
193
|
-
const hint = isLegacy
|
|
194
|
-
? ` This is a one-time migration: your old Gmail connection needs to be re-authorized. Ask me to "reconnect Gmail" to set it up again.`
|
|
195
|
-
: "";
|
|
205
|
+
const provider = getProvider(conn.providerKey);
|
|
206
|
+
if (!provider) {
|
|
196
207
|
throw new TokenExpiredError(
|
|
197
208
|
service,
|
|
198
|
-
`
|
|
209
|
+
`No OAuth provider found for "${service}". Re-authorization required.${recoveryHint(service)}`,
|
|
199
210
|
);
|
|
200
211
|
}
|
|
201
212
|
|
|
202
|
-
const
|
|
203
|
-
const
|
|
213
|
+
const tokenUrl = provider.tokenUrl;
|
|
214
|
+
const resolvedClientId = app.clientId;
|
|
215
|
+
if (!tokenUrl || !resolvedClientId) {
|
|
216
|
+
throw new TokenExpiredError(
|
|
217
|
+
service,
|
|
218
|
+
`Missing OAuth2 refresh config for "${service}".${recoveryHint(service)}`,
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const secret = getSecureKey(app.clientSecretCredentialPath);
|
|
223
|
+
|
|
224
|
+
const refreshToken = getSecureKey(
|
|
225
|
+
`oauth_connection/${conn.id}/refresh_token`,
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
const authMethod = provider.tokenEndpointAuthMethod as
|
|
204
229
|
| TokenEndpointAuthMethod
|
|
205
230
|
| undefined;
|
|
206
|
-
const resolvedTokenUrl = tokenUrl;
|
|
207
231
|
|
|
208
|
-
|
|
209
|
-
|
|
232
|
+
return {
|
|
233
|
+
connId: conn.id,
|
|
234
|
+
tokenUrl,
|
|
235
|
+
clientId: resolvedClientId,
|
|
236
|
+
secret,
|
|
237
|
+
refreshToken,
|
|
238
|
+
authMethod,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Attempt to refresh the OAuth2 access token for a service.
|
|
244
|
+
*
|
|
245
|
+
* Reads refresh config exclusively from the SQLite oauth-store (provider,
|
|
246
|
+
* app, connection).
|
|
247
|
+
*
|
|
248
|
+
* Returns the new access token on success.
|
|
249
|
+
* Throws `TokenExpiredError` if refresh is not possible.
|
|
250
|
+
*/
|
|
251
|
+
async function doRefresh(service: string, connId: string): Promise<string> {
|
|
252
|
+
const refreshConfig = resolveRefreshConfig(service, connId);
|
|
253
|
+
const {
|
|
254
|
+
tokenUrl,
|
|
255
|
+
clientId: resolvedClientId,
|
|
256
|
+
secret,
|
|
257
|
+
authMethod,
|
|
258
|
+
refreshToken,
|
|
259
|
+
} = refreshConfig;
|
|
260
|
+
|
|
261
|
+
if (!refreshToken) {
|
|
262
|
+
throw new TokenExpiredError(
|
|
263
|
+
service,
|
|
264
|
+
`No refresh token available for "${service}". Re-authorization required.${recoveryHint(service)}`,
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (isRefreshBreakerOpen(connId)) {
|
|
269
|
+
const state = refreshBreakers.get(connId)!;
|
|
210
270
|
const remainingMs = state.cooldownMs - (Date.now() - state.openedAt);
|
|
211
271
|
throw new TokenExpiredError(
|
|
212
272
|
service,
|
|
@@ -220,14 +280,14 @@ async function doRefresh(service: string): Promise<string> {
|
|
|
220
280
|
let result;
|
|
221
281
|
try {
|
|
222
282
|
result = await refreshOAuth2Token(
|
|
223
|
-
|
|
224
|
-
|
|
283
|
+
tokenUrl,
|
|
284
|
+
resolvedClientId,
|
|
225
285
|
refreshToken,
|
|
226
|
-
|
|
286
|
+
secret,
|
|
227
287
|
authMethod,
|
|
228
288
|
);
|
|
229
289
|
} catch (err) {
|
|
230
|
-
recordRefreshFailure(
|
|
290
|
+
recordRefreshFailure(connId);
|
|
231
291
|
if (isCredentialError(err)) {
|
|
232
292
|
const msg = err instanceof Error ? err.message : String(err);
|
|
233
293
|
throw new TokenExpiredError(
|
|
@@ -241,9 +301,10 @@ async function doRefresh(service: string): Promise<string> {
|
|
|
241
301
|
throw err;
|
|
242
302
|
}
|
|
243
303
|
|
|
304
|
+
// ----- Store refreshed access_token -----
|
|
244
305
|
if (
|
|
245
306
|
!(await setSecureKeyAsync(
|
|
246
|
-
|
|
307
|
+
`oauth_connection/${connId}/access_token`,
|
|
247
308
|
result.accessToken,
|
|
248
309
|
))
|
|
249
310
|
) {
|
|
@@ -256,7 +317,7 @@ async function doRefresh(service: string): Promise<string> {
|
|
|
256
317
|
if (result.refreshToken) {
|
|
257
318
|
if (
|
|
258
319
|
!(await setSecureKeyAsync(
|
|
259
|
-
|
|
320
|
+
`oauth_connection/${connId}/refresh_token`,
|
|
260
321
|
result.refreshToken,
|
|
261
322
|
))
|
|
262
323
|
) {
|
|
@@ -267,7 +328,7 @@ async function doRefresh(service: string): Promise<string> {
|
|
|
267
328
|
}
|
|
268
329
|
}
|
|
269
330
|
|
|
270
|
-
// Update
|
|
331
|
+
// Update oauth_connection row with new expiry.
|
|
271
332
|
// Use null to explicitly clear a stale expiresAt when the provider omits
|
|
272
333
|
// expires_in (or returns 0), so isTokenExpired won't keep forcing refreshes.
|
|
273
334
|
const expiresAt =
|
|
@@ -275,9 +336,19 @@ async function doRefresh(service: string): Promise<string> {
|
|
|
275
336
|
? Date.now() + result.expiresIn * 1000
|
|
276
337
|
: null;
|
|
277
338
|
|
|
278
|
-
|
|
339
|
+
try {
|
|
340
|
+
updateConnection(connId, {
|
|
341
|
+
expiresAt,
|
|
342
|
+
hasRefreshToken: !!result.refreshToken,
|
|
343
|
+
});
|
|
344
|
+
} catch (err) {
|
|
345
|
+
log.warn(
|
|
346
|
+
{ err, service },
|
|
347
|
+
"Failed to update oauth_connection after refresh",
|
|
348
|
+
);
|
|
349
|
+
}
|
|
279
350
|
|
|
280
|
-
recordRefreshSuccess(
|
|
351
|
+
recordRefreshSuccess(connId);
|
|
281
352
|
log.info({ service }, "OAuth2 access token refreshed successfully");
|
|
282
353
|
return result.accessToken;
|
|
283
354
|
}
|
|
@@ -290,17 +361,19 @@ async function doRefresh(service: string): Promise<string> {
|
|
|
290
361
|
* 2. If the token is expired or near-expiry, refreshes it before calling the callback.
|
|
291
362
|
* 3. If the callback throws with a 401 status, attempts one refresh-and-retry cycle.
|
|
292
363
|
*
|
|
293
|
-
*
|
|
294
|
-
*
|
|
364
|
+
* Retained only for BYO connection internals — prefer
|
|
365
|
+
* `resolveOAuthConnection(service).request()` for new code.
|
|
295
366
|
*/
|
|
296
367
|
export async function withValidToken<T>(
|
|
297
368
|
service: string,
|
|
298
369
|
callback: (token: string) => Promise<T>,
|
|
370
|
+
clientId?: string,
|
|
299
371
|
): Promise<T> {
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
372
|
+
const conn = getConnectionByProvider(service, clientId);
|
|
373
|
+
let token = conn
|
|
374
|
+
? getSecureKey(`oauth_connection/${conn.id}/access_token`)
|
|
375
|
+
: undefined;
|
|
376
|
+
if (!token || !conn) {
|
|
304
377
|
throw new TokenExpiredError(
|
|
305
378
|
service,
|
|
306
379
|
`No access token found for "${service}". Authorization required.${recoveryHint(service)}`,
|
|
@@ -308,15 +381,15 @@ export async function withValidToken<T>(
|
|
|
308
381
|
}
|
|
309
382
|
|
|
310
383
|
// Proactively refresh if expired or about to expire.
|
|
311
|
-
if (isTokenExpired(
|
|
312
|
-
token = await deduplicatedRefresh(service);
|
|
384
|
+
if (isTokenExpired(conn.expiresAt)) {
|
|
385
|
+
token = await deduplicatedRefresh(service, conn.id);
|
|
313
386
|
}
|
|
314
387
|
|
|
315
388
|
try {
|
|
316
389
|
return await callback(token);
|
|
317
390
|
} catch (err: unknown) {
|
|
318
391
|
if (is401Error(err)) {
|
|
319
|
-
token = await deduplicatedRefresh(service);
|
|
392
|
+
token = await deduplicatedRefresh(service, conn.id);
|
|
320
393
|
return callback(token);
|
|
321
394
|
}
|
|
322
395
|
throw err;
|