@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,205 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared conflict intent helpers used by both interactive conflict gating and
|
|
3
|
-
* background conflict resolution jobs.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export interface ConflictStatementPair {
|
|
7
|
-
existingStatement: string;
|
|
8
|
-
candidateStatement: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function computeConflictRelevance(
|
|
12
|
-
userMessage: string,
|
|
13
|
-
conflict: ConflictStatementPair,
|
|
14
|
-
): number {
|
|
15
|
-
const queryTokens = tokenizeForConflictRelevance(userMessage);
|
|
16
|
-
if (queryTokens.size === 0) return 0;
|
|
17
|
-
const existingTokens = tokenizeForConflictRelevance(
|
|
18
|
-
conflict.existingStatement,
|
|
19
|
-
);
|
|
20
|
-
const candidateTokens = tokenizeForConflictRelevance(
|
|
21
|
-
conflict.candidateStatement,
|
|
22
|
-
);
|
|
23
|
-
return Math.max(
|
|
24
|
-
overlapRatio(queryTokens, existingTokens),
|
|
25
|
-
overlapRatio(queryTokens, candidateTokens),
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const NOISE_TOKENS = new Set([
|
|
30
|
-
"http",
|
|
31
|
-
"https",
|
|
32
|
-
"github",
|
|
33
|
-
"gitlab",
|
|
34
|
-
"www",
|
|
35
|
-
"com",
|
|
36
|
-
"org",
|
|
37
|
-
]);
|
|
38
|
-
|
|
39
|
-
// Matches full URLs (http(s)://...) and scheme-less bare domain URLs for known
|
|
40
|
-
// code hosting sites (e.g. github.com/org/repo/pull/123) so embedded path
|
|
41
|
-
// segments like "pull", "issue", "ticket" don't leak into relevance scoring.
|
|
42
|
-
// The scheme-less branch is restricted to known hosting domains to avoid
|
|
43
|
-
// stripping dotted identifiers like "index.ts/runtime".
|
|
44
|
-
const URL_PATTERN =
|
|
45
|
-
/https?:\/\/[^\s)>\]]+|(?:github|gitlab|bitbucket)\.(?:com|org|io)\/[^\s)>\]]*/gi;
|
|
46
|
-
|
|
47
|
-
export function tokenizeForConflictRelevance(input: string): Set<string> {
|
|
48
|
-
const stripped = input.replace(URL_PATTERN, " ");
|
|
49
|
-
const tokens = stripped
|
|
50
|
-
.toLowerCase()
|
|
51
|
-
.split(/[^a-z0-9]+/g)
|
|
52
|
-
.map((token) => token.trim())
|
|
53
|
-
.filter((token) => token.length >= 4)
|
|
54
|
-
.filter((token) => !/^\d+$/.test(token))
|
|
55
|
-
.filter((token) => !NOISE_TOKENS.has(token));
|
|
56
|
-
return new Set(tokens);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export function overlapRatio(left: Set<string>, right: Set<string>): number {
|
|
60
|
-
if (left.size === 0 || right.size === 0) return 0;
|
|
61
|
-
let overlap = 0;
|
|
62
|
-
for (const token of left) {
|
|
63
|
-
if (right.has(token)) overlap += 1;
|
|
64
|
-
}
|
|
65
|
-
return overlap / Math.max(left.size, right.size);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Tokenize for statement-to-statement coherence checking.
|
|
70
|
-
* Uses a lower minimum token length (>= 3) than `tokenizeForConflictRelevance`
|
|
71
|
-
* to preserve short technical terms like "vim", "css", "git", "npm", etc.
|
|
72
|
-
*/
|
|
73
|
-
function tokenizeForCoherence(input: string): Set<string> {
|
|
74
|
-
const stripped = input.replace(URL_PATTERN, " ");
|
|
75
|
-
const tokens = stripped
|
|
76
|
-
.toLowerCase()
|
|
77
|
-
.split(/[^a-z0-9]+/g)
|
|
78
|
-
.map((token) => token.trim())
|
|
79
|
-
.filter((token) => token.length >= 3)
|
|
80
|
-
.filter((token) => !/^\d+$/.test(token))
|
|
81
|
-
.filter((token) => !NOISE_TOKENS.has(token));
|
|
82
|
-
return new Set(tokens);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Check whether two conflict statements have topical coherence.
|
|
87
|
-
* Returns true if the statements share at least one meaningful token.
|
|
88
|
-
* Uses a permissive tokenizer (>= 3 chars) to avoid dropping short
|
|
89
|
-
* technical terms like "vim", "css", "git", etc.
|
|
90
|
-
*/
|
|
91
|
-
export function areStatementsCoherent(
|
|
92
|
-
statementA: string,
|
|
93
|
-
statementB: string,
|
|
94
|
-
): boolean {
|
|
95
|
-
const tokensA = tokenizeForCoherence(statementA);
|
|
96
|
-
const tokensB = tokenizeForCoherence(statementB);
|
|
97
|
-
return overlapRatio(tokensA, tokensB) > 0;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Action verbs that signal the user is making a deliberate choice.
|
|
101
|
-
const ACTION_CUES = new Set([
|
|
102
|
-
"keep",
|
|
103
|
-
"use",
|
|
104
|
-
"prefer",
|
|
105
|
-
"go",
|
|
106
|
-
"pick",
|
|
107
|
-
"choose",
|
|
108
|
-
"take",
|
|
109
|
-
"want",
|
|
110
|
-
"select",
|
|
111
|
-
]);
|
|
112
|
-
|
|
113
|
-
// Directional/merge cue words mirrored from clarification-resolver.ts heuristics.
|
|
114
|
-
const DIRECTIONAL_CUES = new Set([
|
|
115
|
-
"existing",
|
|
116
|
-
"old",
|
|
117
|
-
"previous",
|
|
118
|
-
"first",
|
|
119
|
-
"earlier",
|
|
120
|
-
"original",
|
|
121
|
-
"candidate",
|
|
122
|
-
"new",
|
|
123
|
-
"latest",
|
|
124
|
-
"second",
|
|
125
|
-
"updated",
|
|
126
|
-
"instead",
|
|
127
|
-
"replace",
|
|
128
|
-
"both",
|
|
129
|
-
"merge",
|
|
130
|
-
"combine",
|
|
131
|
-
"together",
|
|
132
|
-
"either",
|
|
133
|
-
"mix",
|
|
134
|
-
"option",
|
|
135
|
-
"former",
|
|
136
|
-
"latter",
|
|
137
|
-
]);
|
|
138
|
-
|
|
139
|
-
const MAX_REPLY_WORD_COUNT = 12;
|
|
140
|
-
|
|
141
|
-
// Direction-only matches (no action verb) must be very short to avoid
|
|
142
|
-
// false positives from unrelated statements that happen to contain
|
|
143
|
-
// common words like "new", "old", "option", etc.
|
|
144
|
-
const MAX_DIRECTION_ONLY_WORD_COUNT = 4;
|
|
145
|
-
|
|
146
|
-
// Messages starting with a question word are unlikely to be clarification
|
|
147
|
-
// replies even when they lack a trailing question mark.
|
|
148
|
-
const QUESTION_WORD_PREFIXES = new Set([
|
|
149
|
-
"what",
|
|
150
|
-
"how",
|
|
151
|
-
"why",
|
|
152
|
-
"where",
|
|
153
|
-
"when",
|
|
154
|
-
"which",
|
|
155
|
-
"who",
|
|
156
|
-
"whom",
|
|
157
|
-
"whose",
|
|
158
|
-
]);
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Determines whether a user message looks like a deliberate clarification
|
|
162
|
-
* reply (e.g. "keep the new one", "both", "option B").
|
|
163
|
-
*/
|
|
164
|
-
export function looksLikeClarificationReply(userMessage: string): boolean {
|
|
165
|
-
const trimmed = userMessage.trim();
|
|
166
|
-
if (trimmed.endsWith("?")) return false;
|
|
167
|
-
|
|
168
|
-
const words = trimmed.toLowerCase().split(/\s+/).filter(Boolean);
|
|
169
|
-
if (words.length === 0 || words.length > MAX_REPLY_WORD_COUNT) return false;
|
|
170
|
-
|
|
171
|
-
const normalized = words.map((w) => w.replace(/[^a-z]/g, ""));
|
|
172
|
-
|
|
173
|
-
// Reject messages that start with a question word (even without '?').
|
|
174
|
-
// Match exact question words or contractions (e.g. "what's", "where's"),
|
|
175
|
-
// but not words that merely share a prefix (e.g. "whichever", "however").
|
|
176
|
-
const firstWord = words[0];
|
|
177
|
-
const firstNorm = normalized[0];
|
|
178
|
-
for (const qw of QUESTION_WORD_PREFIXES) {
|
|
179
|
-
if (
|
|
180
|
-
firstNorm === qw ||
|
|
181
|
-
(firstWord.startsWith(qw) &&
|
|
182
|
-
"'\u2018\u2019".includes(firstWord[qw.length]))
|
|
183
|
-
)
|
|
184
|
-
return false;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
const hasAction = normalized.some((w) => ACTION_CUES.has(w));
|
|
188
|
-
const hasDirection = normalized.some((w) => DIRECTIONAL_CUES.has(w));
|
|
189
|
-
|
|
190
|
-
if (hasAction) return true;
|
|
191
|
-
if (hasDirection) return words.length <= MAX_DIRECTION_ONLY_WORD_COUNT;
|
|
192
|
-
return false;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* Conflict resolution requires explicit clarification intent with non-zero
|
|
197
|
-
* topical overlap with the conflict statements.
|
|
198
|
-
*/
|
|
199
|
-
export function shouldAttemptConflictResolution(input: {
|
|
200
|
-
clarificationReply: boolean;
|
|
201
|
-
relevance: number;
|
|
202
|
-
}): boolean {
|
|
203
|
-
if (!input.clarificationReply) return false;
|
|
204
|
-
return input.relevance > 0;
|
|
205
|
-
}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure, deterministic policy helpers for memory conflict eligibility.
|
|
3
|
-
* Used by contradiction checker, session conflict gate, and background resolver.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export interface ConflictPolicyConfig {
|
|
7
|
-
conflictableKinds: readonly string[];
|
|
8
|
-
[key: string]: unknown;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Returns true when the given memory item kind is eligible to participate
|
|
13
|
-
* in conflict detection according to the current policy.
|
|
14
|
-
*/
|
|
15
|
-
export function isConflictKindEligible(
|
|
16
|
-
kind: string,
|
|
17
|
-
config: ConflictPolicyConfig,
|
|
18
|
-
): boolean {
|
|
19
|
-
return config.conflictableKinds.includes(kind);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Returns true when both sides of a potential conflict pair are kind-eligible.
|
|
24
|
-
*/
|
|
25
|
-
export function isConflictKindPairEligible(
|
|
26
|
-
existingKind: string,
|
|
27
|
-
candidateKind: string,
|
|
28
|
-
config: ConflictPolicyConfig,
|
|
29
|
-
): boolean {
|
|
30
|
-
return (
|
|
31
|
-
isConflictKindEligible(existingKind, config) &&
|
|
32
|
-
isConflictKindEligible(candidateKind, config)
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// ── Transient statement classification ─────────────────────────────────
|
|
37
|
-
|
|
38
|
-
const PR_URL_PATTERN = /github\.com\/[^/]+\/[^/]+\/pull\/\d+/i;
|
|
39
|
-
const ISSUE_TICKET_PATTERN = /\b(?:issue|pr|ticket|pull request)\s*#?\d+/i;
|
|
40
|
-
const TRACKING_LANGUAGE_PATTERN =
|
|
41
|
-
/\b(?:this pr|that issue|while we wait|currently tracking)\b/i;
|
|
42
|
-
|
|
43
|
-
// Statements about needing clarification are transient conversational artifacts
|
|
44
|
-
// extracted from previous conflict-gate interactions — not durable facts.
|
|
45
|
-
// Allowing them into the conflict pipeline creates self-reinforcing loops.
|
|
46
|
-
// Patterns are kept narrow to avoid filtering legitimate durable instructions.
|
|
47
|
-
const META_CLARIFICATION_PATTERN =
|
|
48
|
-
/\b(?:needs? clarification\b|unclear which (?:version|value|setting)\b|user should (?:specify|clarify)\b|conflicting (?:notes|instructions)(?:\s*[:."]|\s+(?:about|regarding|for)\b))/i;
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Returns true when a statement looks like a transient tracking note
|
|
52
|
-
* (PR URLs, issue references, short-lived progress notes) rather than
|
|
53
|
-
* a durable user preference or instruction.
|
|
54
|
-
*/
|
|
55
|
-
export function isTransientTrackingStatement(statement: string): boolean {
|
|
56
|
-
if (PR_URL_PATTERN.test(statement)) return true;
|
|
57
|
-
if (ISSUE_TICKET_PATTERN.test(statement)) return true;
|
|
58
|
-
if (TRACKING_LANGUAGE_PATTERN.test(statement)) return true;
|
|
59
|
-
if (META_CLARIFICATION_PATTERN.test(statement)) return true;
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const DURABLE_INSTRUCTION_CUES =
|
|
64
|
-
/\b(?:always|never|default|every time|by default|style|format|tone|convention|standard)\b/i;
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Returns true when a statement contains strong durable instruction cues,
|
|
68
|
-
* suggesting it represents a persistent user preference or style rule.
|
|
69
|
-
*/
|
|
70
|
-
export function isDurableInstructionStatement(statement: string): boolean {
|
|
71
|
-
return DURABLE_INSTRUCTION_CUES.test(statement);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// ── Verification-state provenance ──────────────────────────────────────
|
|
75
|
-
|
|
76
|
-
// States indicating user involvement — either the user directly stated
|
|
77
|
-
// the information, explicitly confirmed it, or it was bulk-imported from
|
|
78
|
-
// a trusted external source the user chose to connect.
|
|
79
|
-
const USER_EVIDENCED_STATES = new Set([
|
|
80
|
-
"user_reported",
|
|
81
|
-
"user_confirmed",
|
|
82
|
-
"legacy_import",
|
|
83
|
-
]);
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Returns true when the verification state indicates user provenance
|
|
87
|
-
* (as opposed to purely assistant-inferred).
|
|
88
|
-
*/
|
|
89
|
-
export function isUserEvidencedVerificationState(state: string): boolean {
|
|
90
|
-
return USER_EVIDENCED_STATES.has(state);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Returns true when at least one side of a conflict pair has user-evidenced
|
|
95
|
-
* provenance. Assistant-inferred-only conflicts should not escalate into
|
|
96
|
-
* user-facing behavior.
|
|
97
|
-
*/
|
|
98
|
-
export function isConflictUserEvidenced(
|
|
99
|
-
existingState: string,
|
|
100
|
-
candidateState: string,
|
|
101
|
-
): boolean {
|
|
102
|
-
return (
|
|
103
|
-
isUserEvidencedVerificationState(existingState) ||
|
|
104
|
-
isUserEvidencedVerificationState(candidateState)
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Returns true when a statement of the given kind is eligible to participate
|
|
110
|
-
* in conflict detection at the statement level. This combines kind eligibility
|
|
111
|
-
* with statement-level durability heuristics.
|
|
112
|
-
*
|
|
113
|
-
* For instruction/style kinds: requires positive durable cues and no transient cues.
|
|
114
|
-
* For other eligible kinds: rejects if transient tracking cues dominate.
|
|
115
|
-
*/
|
|
116
|
-
export function isStatementConflictEligible(
|
|
117
|
-
kind: string,
|
|
118
|
-
statement: string,
|
|
119
|
-
config?: ConflictPolicyConfig,
|
|
120
|
-
): boolean {
|
|
121
|
-
if (config && !isConflictKindEligible(kind, config)) return false;
|
|
122
|
-
if (isTransientTrackingStatement(statement)) return false;
|
|
123
|
-
if (kind === "instruction" || kind === "style") {
|
|
124
|
-
return isDurableInstructionStatement(statement);
|
|
125
|
-
}
|
|
126
|
-
return true;
|
|
127
|
-
}
|