@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
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
type CanonicalGuardianRequest,
|
|
31
31
|
getCanonicalGuardianRequest,
|
|
32
32
|
getCanonicalGuardianRequestByCode,
|
|
33
|
+
isRequestExpired,
|
|
33
34
|
listCanonicalGuardianRequests,
|
|
34
35
|
} from "../memory/canonical-guardian-store.js";
|
|
35
36
|
import {
|
|
@@ -198,49 +199,50 @@ function findPendingCanonicalRequests(
|
|
|
198
199
|
pendingRequestIds?: string[],
|
|
199
200
|
conversationId?: string,
|
|
200
201
|
): CanonicalGuardianRequest[] {
|
|
202
|
+
let results: CanonicalGuardianRequest[];
|
|
203
|
+
|
|
201
204
|
// When explicit IDs are provided, look them up directly
|
|
202
205
|
if (pendingRequestIds) {
|
|
203
206
|
if (pendingRequestIds.length === 0) {
|
|
204
207
|
return [];
|
|
205
208
|
}
|
|
206
|
-
|
|
209
|
+
results = pendingRequestIds
|
|
207
210
|
.map(getCanonicalGuardianRequest)
|
|
208
211
|
.filter((r): r is CanonicalGuardianRequest => r?.status === "pending");
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
if (actor.actorExternalUserId) {
|
|
213
|
-
return listCanonicalGuardianRequests({
|
|
212
|
+
} else if (actor.actorExternalUserId) {
|
|
213
|
+
// Query by guardian identity when available
|
|
214
|
+
results = listCanonicalGuardianRequests({
|
|
214
215
|
status: "pending",
|
|
215
216
|
guardianExternalUserId: actor.actorExternalUserId,
|
|
216
217
|
});
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
if (conversationId) {
|
|
224
|
-
return listCanonicalGuardianRequests({
|
|
218
|
+
} else if (conversationId) {
|
|
219
|
+
// Actors without an actorExternalUserId: scope by conversationId so the NL
|
|
220
|
+
// path can discover pending requests bound to this conversation.
|
|
221
|
+
// Include guardianPrincipalId filter when available so the guardian only
|
|
222
|
+
// sees requests they are authorized to act on.
|
|
223
|
+
results = listCanonicalGuardianRequests({
|
|
225
224
|
status: "pending",
|
|
226
225
|
conversationId,
|
|
227
226
|
...(actor.guardianPrincipalId
|
|
228
227
|
? { guardianPrincipalId: actor.guardianPrincipalId }
|
|
229
228
|
: {}),
|
|
230
229
|
});
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
if (actor.guardianPrincipalId) {
|
|
237
|
-
return listCanonicalGuardianRequests({
|
|
230
|
+
} else if (actor.guardianPrincipalId) {
|
|
231
|
+
// Actors with a guardianPrincipalId but no actorExternalUserId or
|
|
232
|
+
// conversationId: query by principal so desktop sessions can still
|
|
233
|
+
// discover pending guardian work via their bound principal.
|
|
234
|
+
results = listCanonicalGuardianRequests({
|
|
238
235
|
status: "pending",
|
|
239
236
|
guardianPrincipalId: actor.guardianPrincipalId,
|
|
240
237
|
});
|
|
238
|
+
} else {
|
|
239
|
+
return [];
|
|
241
240
|
}
|
|
242
241
|
|
|
243
|
-
|
|
242
|
+
// Exclude requests that have passed their expiresAt deadline — they can
|
|
243
|
+
// no longer be resolved and should not trigger disambiguation or NL
|
|
244
|
+
// classification.
|
|
245
|
+
return results.filter((r) => !isRequestExpired(r));
|
|
244
246
|
}
|
|
245
247
|
|
|
246
248
|
/** Map an approval action string to the NL engine's allowed actions for guardians. */
|
|
@@ -110,7 +110,6 @@ import {
|
|
|
110
110
|
stopGuardianExpirySweep,
|
|
111
111
|
} from "./routes/channel-routes.js";
|
|
112
112
|
import { channelVerificationRouteDefinitions } from "./routes/channel-verification-routes.js";
|
|
113
|
-
import { computerUseRouteDefinitions } from "./routes/computer-use-routes.js";
|
|
114
113
|
import {
|
|
115
114
|
contactCatchAllRouteDefinitions,
|
|
116
115
|
contactRouteDefinitions,
|
|
@@ -126,6 +125,7 @@ import { guardianActionRouteDefinitions } from "./routes/guardian-action-routes.
|
|
|
126
125
|
import { handleGuardianBootstrap } from "./routes/guardian-bootstrap-routes.js";
|
|
127
126
|
import { handleGuardianRefresh } from "./routes/guardian-refresh-routes.js";
|
|
128
127
|
import { hostBashRouteDefinitions } from "./routes/host-bash-routes.js";
|
|
128
|
+
import { hostCuRouteDefinitions } from "./routes/host-cu-routes.js";
|
|
129
129
|
import { hostFileRouteDefinitions } from "./routes/host-file-routes.js";
|
|
130
130
|
import { handleHealth } from "./routes/identity-routes.js";
|
|
131
131
|
import { identityRouteDefinitions } from "./routes/identity-routes.js";
|
|
@@ -135,7 +135,7 @@ import { telegramRouteDefinitions } from "./routes/integrations/telegram.js";
|
|
|
135
135
|
import { twilioRouteDefinitions } from "./routes/integrations/twilio.js";
|
|
136
136
|
import { inviteRouteDefinitions } from "./routes/invite-routes.js";
|
|
137
137
|
import { logExportRouteDefinitions } from "./routes/log-export-routes.js";
|
|
138
|
-
import {
|
|
138
|
+
import { memoryItemRouteDefinitions } from "./routes/memory-item-routes.js";
|
|
139
139
|
import { migrationRouteDefinitions } from "./routes/migration-routes.js";
|
|
140
140
|
import type { PairingHandlerContext } from "./routes/pairing-routes.js";
|
|
141
141
|
import {
|
|
@@ -155,6 +155,7 @@ import { surfaceActionRouteDefinitions } from "./routes/surface-action-routes.js
|
|
|
155
155
|
import { surfaceContentRouteDefinitions } from "./routes/surface-content-routes.js";
|
|
156
156
|
import { trustRulesRouteDefinitions } from "./routes/trust-rules-routes.js";
|
|
157
157
|
import { usageRouteDefinitions } from "./routes/usage-routes.js";
|
|
158
|
+
import { watchRouteDefinitions } from "./routes/watch-routes.js";
|
|
158
159
|
import { workItemRouteDefinitions } from "./routes/work-items-routes.js";
|
|
159
160
|
import { workspaceRouteDefinitions } from "./routes/workspace-routes.js";
|
|
160
161
|
|
|
@@ -216,7 +217,7 @@ export class RuntimeHttpServer {
|
|
|
216
217
|
private getSkillContext?: RuntimeHttpServerOptions["getSkillContext"];
|
|
217
218
|
private sessionManagementDeps?: RuntimeHttpServerOptions["sessionManagementDeps"];
|
|
218
219
|
private getModelSetContext?: RuntimeHttpServerOptions["getModelSetContext"];
|
|
219
|
-
private
|
|
220
|
+
private getWatchDeps?: RuntimeHttpServerOptions["getWatchDeps"];
|
|
220
221
|
private getRecordingDeps?: RuntimeHttpServerOptions["getRecordingDeps"];
|
|
221
222
|
private router: HttpRouter;
|
|
222
223
|
|
|
@@ -237,7 +238,7 @@ export class RuntimeHttpServer {
|
|
|
237
238
|
this.getSkillContext = options.getSkillContext;
|
|
238
239
|
this.sessionManagementDeps = options.sessionManagementDeps;
|
|
239
240
|
this.getModelSetContext = options.getModelSetContext;
|
|
240
|
-
this.
|
|
241
|
+
this.getWatchDeps = options.getWatchDeps;
|
|
241
242
|
this.getRecordingDeps = options.getRecordingDeps;
|
|
242
243
|
this.router = new HttpRouter(this.buildRouteTable());
|
|
243
244
|
}
|
|
@@ -722,9 +723,9 @@ export class RuntimeHttpServer {
|
|
|
722
723
|
...secretRouteDefinitions(),
|
|
723
724
|
...identityRouteDefinitions(),
|
|
724
725
|
...debugRouteDefinitions(),
|
|
725
|
-
...mcpRouteDefinitions(),
|
|
726
726
|
...usageRouteDefinitions(),
|
|
727
727
|
...workspaceRouteDefinitions(),
|
|
728
|
+
...memoryItemRouteDefinitions(),
|
|
728
729
|
...settingsRouteDefinitions(),
|
|
729
730
|
...scheduleRouteDefinitions({
|
|
730
731
|
sendMessageDeps: this.sendMessageDeps,
|
|
@@ -946,6 +947,7 @@ export class RuntimeHttpServer {
|
|
|
946
947
|
...globalSearchRouteDefinitions(),
|
|
947
948
|
...approvalRouteDefinitions(),
|
|
948
949
|
...hostBashRouteDefinitions(),
|
|
950
|
+
...hostCuRouteDefinitions(),
|
|
949
951
|
...hostFileRouteDefinitions(),
|
|
950
952
|
...(this.getSkillContext
|
|
951
953
|
? skillRouteDefinitions({
|
|
@@ -973,9 +975,9 @@ export class RuntimeHttpServer {
|
|
|
973
975
|
...channelReadinessRouteDefinitions(),
|
|
974
976
|
...attachmentRouteDefinitions(),
|
|
975
977
|
|
|
976
|
-
...(this.
|
|
977
|
-
?
|
|
978
|
-
|
|
978
|
+
...(this.getWatchDeps
|
|
979
|
+
? watchRouteDefinitions({
|
|
980
|
+
getWatchDeps: this.getWatchDeps,
|
|
979
981
|
})
|
|
980
982
|
: []),
|
|
981
983
|
...(this.getRecordingDeps
|
|
@@ -219,8 +219,8 @@ export interface RuntimeHttpServerOptions {
|
|
|
219
219
|
sessionManagementDeps?: SessionManagementDeps;
|
|
220
220
|
/** Lazy factory for model config set context (session eviction, config reload suppression). */
|
|
221
221
|
getModelSetContext?: () => import("../daemon/handlers/config-model.js").ModelSetContext;
|
|
222
|
-
/** Provider for
|
|
223
|
-
|
|
222
|
+
/** Provider for watch observation dependencies (watch routes). */
|
|
223
|
+
getWatchDeps?: () => import("./routes/watch-routes.js").WatchDeps;
|
|
224
224
|
/** Provider for recording dependencies (recording routes). */
|
|
225
225
|
getRecordingDeps?: () => import("./routes/recording-routes.js").RecordingDeps;
|
|
226
226
|
}
|
|
@@ -146,6 +146,12 @@ export function redeemInvite(params: {
|
|
|
146
146
|
return { ok: false, reason: "invalid_token" };
|
|
147
147
|
}
|
|
148
148
|
|
|
149
|
+
// Guardian channels must not be reactivated via regular invite redemption —
|
|
150
|
+
// their lifecycle is managed exclusively through the guardian binding flow.
|
|
151
|
+
if (existingContact && existingContact.role === "guardian") {
|
|
152
|
+
return { ok: false, reason: "invalid_token" };
|
|
153
|
+
}
|
|
154
|
+
|
|
149
155
|
// Inactive member reactivation: when the user already has a member record
|
|
150
156
|
// in a non-active state (revoked/pending), reactivate it via upsertContactChannel
|
|
151
157
|
// and consume an invite use atomically. The fresh-member path below also
|
|
@@ -338,6 +344,7 @@ export function redeemVoiceInviteCode(params: {
|
|
|
338
344
|
externalUserId: canonicalCallerId,
|
|
339
345
|
});
|
|
340
346
|
const existingVoiceChannel = voiceContactResult?.channel ?? null;
|
|
347
|
+
const voiceContact = voiceContactResult?.contact ?? null;
|
|
341
348
|
|
|
342
349
|
if (existingVoiceChannel && existingVoiceChannel.status === "active") {
|
|
343
350
|
return {
|
|
@@ -352,13 +359,18 @@ export function redeemVoiceInviteCode(params: {
|
|
|
352
359
|
return { ok: false, reason: "invalid_or_expired" };
|
|
353
360
|
}
|
|
354
361
|
|
|
362
|
+
// Guardian channels must not be reactivated via regular invite redemption —
|
|
363
|
+
// their lifecycle is managed exclusively through the guardian binding flow.
|
|
364
|
+
if (voiceContact && voiceContact.role === "guardian") {
|
|
365
|
+
return { ok: false, reason: "invalid_or_expired" };
|
|
366
|
+
}
|
|
367
|
+
|
|
355
368
|
// Atomic redemption: upsert member + consume invite use in a transaction
|
|
356
369
|
const STALE_INVITE = Symbol("stale_invite");
|
|
357
370
|
let memberId: string | undefined;
|
|
358
371
|
|
|
359
372
|
// Reactivation should not overwrite a guardian-managed nickname (same
|
|
360
373
|
// protection as the token-based redemption path above).
|
|
361
|
-
const voiceContact = voiceContactResult?.contact ?? null;
|
|
362
374
|
const preservedDisplayName = voiceContact?.displayName?.trim().length
|
|
363
375
|
? voiceContact.displayName
|
|
364
376
|
: (invite.friendName ?? undefined);
|
|
@@ -487,6 +499,12 @@ export function redeemInviteByCode(params: {
|
|
|
487
499
|
return { ok: false, reason: "invalid_token" };
|
|
488
500
|
}
|
|
489
501
|
|
|
502
|
+
// Guardian channels must not be reactivated via regular invite redemption —
|
|
503
|
+
// their lifecycle is managed exclusively through the guardian binding flow.
|
|
504
|
+
if (existingContact && existingContact.role === "guardian") {
|
|
505
|
+
return { ok: false, reason: "invalid_token" };
|
|
506
|
+
}
|
|
507
|
+
|
|
490
508
|
// Inactive member reactivation: reactivate via upsertContactChannel and consume
|
|
491
509
|
// an invite use atomically.
|
|
492
510
|
if (existingChannel) {
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* /v1/contacts/channels endpoints.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
import { startInviteCall } from "../calls/call-domain.js";
|
|
11
12
|
import { isChannelId } from "../channels/types.js";
|
|
12
13
|
import {
|
|
13
14
|
createInvite,
|
|
@@ -23,6 +24,7 @@ import {
|
|
|
23
24
|
DEFAULT_USER_REFERENCE,
|
|
24
25
|
resolveGuardianName,
|
|
25
26
|
} from "../prompts/user-reference.js";
|
|
27
|
+
import { getLogger } from "../util/logger.js";
|
|
26
28
|
import { isValidE164 } from "../util/phone.js";
|
|
27
29
|
import { generateVoiceCode, hashVoiceCode } from "../util/voice-code.js";
|
|
28
30
|
import {
|
|
@@ -37,6 +39,8 @@ import {
|
|
|
37
39
|
type VoiceRedemptionOutcome,
|
|
38
40
|
} from "./invite-redemption-service.js";
|
|
39
41
|
|
|
42
|
+
const log = getLogger("invite-service");
|
|
43
|
+
|
|
40
44
|
// ---------------------------------------------------------------------------
|
|
41
45
|
// Response shapes — used by both HTTP routes and message handlers
|
|
42
46
|
// ---------------------------------------------------------------------------
|
|
@@ -250,6 +254,27 @@ export async function createIngressInvite(params: {
|
|
|
250
254
|
});
|
|
251
255
|
}
|
|
252
256
|
|
|
257
|
+
// For voice invites with a known phone number, initiate an outbound call
|
|
258
|
+
// so the contact is prompted to enter their code immediately.
|
|
259
|
+
if (
|
|
260
|
+
params.sourceChannel === "phone" &&
|
|
261
|
+
params.expectedExternalUserId &&
|
|
262
|
+
params.friendName &&
|
|
263
|
+
effectiveGuardianName
|
|
264
|
+
) {
|
|
265
|
+
// Fire-and-forget: don't block invite creation on call initiation
|
|
266
|
+
startInviteCall({
|
|
267
|
+
phoneNumber: params.expectedExternalUserId,
|
|
268
|
+
friendName: params.friendName,
|
|
269
|
+
guardianName: effectiveGuardianName,
|
|
270
|
+
}).catch((err) => {
|
|
271
|
+
log.warn(
|
|
272
|
+
{ err, inviteId: invite.id },
|
|
273
|
+
"Failed to initiate outbound invite call",
|
|
274
|
+
);
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
|
|
253
278
|
// Voice invites must not expose the token — callers must redeem via the
|
|
254
279
|
// identity-bound voice code flow, not the generic token redemption path.
|
|
255
280
|
return {
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { TwilioConversationRelayProvider } from "../../calls/twilio-provider.js";
|
|
6
|
-
import { isTwilioWebhookValidationDisabled } from "../../config/env.js";
|
|
7
6
|
import { loadConfig } from "../../config/loader.js";
|
|
8
7
|
import { getPublicBaseUrl } from "../../inbound/public-ingress-urls.js";
|
|
9
8
|
import { getLogger } from "../../util/logger.js";
|
|
@@ -51,22 +50,13 @@ export const GATEWAY_ONLY_BLOCKED_SUBPATHS = new Set([
|
|
|
51
50
|
* Returns a 403 Response if signature validation fails.
|
|
52
51
|
*
|
|
53
52
|
* Fail-closed: if the auth token is not configured, the request is rejected
|
|
54
|
-
* with 403 rather than silently skipping validation.
|
|
55
|
-
* bypass is available via TWILIO_WEBHOOK_VALIDATION_DISABLED=true.
|
|
53
|
+
* with 403 rather than silently skipping validation.
|
|
56
54
|
*/
|
|
57
55
|
export async function validateTwilioWebhook(
|
|
58
56
|
req: Request,
|
|
59
57
|
): Promise<{ body: string } | Response> {
|
|
60
58
|
const rawBody = await req.text();
|
|
61
59
|
|
|
62
|
-
// Allow explicit local-dev bypass -- must be exactly "true"
|
|
63
|
-
if (isTwilioWebhookValidationDisabled()) {
|
|
64
|
-
log.warn(
|
|
65
|
-
"Twilio webhook signature validation explicitly disabled via TWILIO_WEBHOOK_VALIDATION_DISABLED",
|
|
66
|
-
);
|
|
67
|
-
return { body: rawBody };
|
|
68
|
-
}
|
|
69
|
-
|
|
70
60
|
const authToken = TwilioConversationRelayProvider.getAuthToken();
|
|
71
61
|
|
|
72
62
|
if (!authToken) {
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* In-memory tracker that maps requestId to session info for pending
|
|
3
|
-
* confirmation, secret, host_bash, and
|
|
3
|
+
* confirmation, secret, host_bash, host_file, and host_cu interactions.
|
|
4
4
|
*
|
|
5
5
|
* When the agent loop emits a confirmation_request, secret_request,
|
|
6
|
-
* host_bash_request, or
|
|
7
|
-
* the interaction here. Standalone HTTP endpoints
|
|
8
|
-
* /v1/
|
|
9
|
-
* the session from this
|
|
6
|
+
* host_bash_request, host_file_request, or host_cu_request, the onEvent
|
|
7
|
+
* callback registers the interaction here. Standalone HTTP endpoints
|
|
8
|
+
* (/v1/confirm, /v1/secret, /v1/trust-rules, /v1/host-bash-result,
|
|
9
|
+
* /v1/host-file-result, /v1/host-cu-result) look up the session from this
|
|
10
|
+
* tracker to resolve the interaction.
|
|
10
11
|
*/
|
|
11
12
|
|
|
12
13
|
import type { Session } from "../daemon/session.js";
|
|
@@ -29,7 +30,7 @@ export interface ConfirmationDetails {
|
|
|
29
30
|
export interface PendingInteraction {
|
|
30
31
|
session: Session;
|
|
31
32
|
conversationId: string;
|
|
32
|
-
kind: "confirmation" | "secret" | "host_bash" | "host_file";
|
|
33
|
+
kind: "confirmation" | "secret" | "host_bash" | "host_file" | "host_cu";
|
|
33
34
|
confirmationDetails?: ConfirmationDetails;
|
|
34
35
|
}
|
|
35
36
|
|
|
@@ -82,19 +83,20 @@ export function getByConversation(
|
|
|
82
83
|
* Remove pending confirmation and secret interactions for a given session.
|
|
83
84
|
* Used when auto-denying all pending interactions (e.g. new user message).
|
|
84
85
|
*
|
|
85
|
-
* host_bash and
|
|
86
|
-
* represent in-flight tool executions proxied to the client, not
|
|
86
|
+
* host_bash, host_file, and host_cu interactions are intentionally skipped
|
|
87
|
+
* — they represent in-flight tool executions proxied to the client, not
|
|
87
88
|
* confirmations to auto-deny. Removing them would orphan the request: the
|
|
88
|
-
* client would POST to /v1/host-bash-result
|
|
89
|
-
* completing the operation, get a 404, and the
|
|
90
|
-
* a spurious timeout error.
|
|
89
|
+
* client would POST to /v1/host-bash-result, /v1/host-file-result, or
|
|
90
|
+
* /v1/host-cu-result after completing the operation, get a 404, and the
|
|
91
|
+
* proxy timer would fire with a spurious timeout error.
|
|
91
92
|
*/
|
|
92
93
|
export function removeBySession(session: Session): void {
|
|
93
94
|
for (const [requestId, interaction] of pending) {
|
|
94
95
|
if (
|
|
95
96
|
interaction.session === session &&
|
|
96
97
|
interaction.kind !== "host_bash" &&
|
|
97
|
-
interaction.kind !== "host_file"
|
|
98
|
+
interaction.kind !== "host_file" &&
|
|
99
|
+
interaction.kind !== "host_cu"
|
|
98
100
|
) {
|
|
99
101
|
pending.delete(requestId);
|
|
100
102
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Route handlers for the brain graph visualization endpoint.
|
|
3
3
|
*
|
|
4
4
|
* Queries the memory database to return a knowledge graph shaped for brain-lobe
|
|
5
|
-
* visualization, with
|
|
5
|
+
* visualization, with memory items mapped to brain regions based on their kind.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { readFileSync } from "node:fs";
|
|
@@ -11,65 +11,23 @@ import { join } from "node:path";
|
|
|
11
11
|
import { count } from "drizzle-orm";
|
|
12
12
|
|
|
13
13
|
import { getDb } from "../../memory/db.js";
|
|
14
|
-
import {
|
|
15
|
-
memoryEntities,
|
|
16
|
-
memoryEntityRelations,
|
|
17
|
-
memoryItems,
|
|
18
|
-
} from "../../memory/schema.js";
|
|
14
|
+
import { memoryItems } from "../../memory/schema.js";
|
|
19
15
|
import { resolveBundledDir } from "../../util/bundled-asset.js";
|
|
20
16
|
import type { RouteDefinition } from "../http-router.js";
|
|
21
17
|
|
|
22
|
-
function getLobeRegion(entityType: string): string {
|
|
23
|
-
switch (entityType) {
|
|
24
|
-
case "person":
|
|
25
|
-
case "organization":
|
|
26
|
-
return "right-social";
|
|
27
|
-
case "project":
|
|
28
|
-
case "company":
|
|
29
|
-
return "left-planning";
|
|
30
|
-
case "tool":
|
|
31
|
-
return "left-technical";
|
|
32
|
-
case "concept":
|
|
33
|
-
return "right-creative";
|
|
34
|
-
case "location":
|
|
35
|
-
return "right-spatial";
|
|
36
|
-
default:
|
|
37
|
-
return "center";
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function getEntityColor(entityType: string): string {
|
|
42
|
-
switch (entityType) {
|
|
43
|
-
case "person":
|
|
44
|
-
return "#22c55e";
|
|
45
|
-
case "project":
|
|
46
|
-
return "#f97316";
|
|
47
|
-
case "tool":
|
|
48
|
-
return "#06b6d4";
|
|
49
|
-
case "company":
|
|
50
|
-
return "#a855f7";
|
|
51
|
-
case "organization":
|
|
52
|
-
return "#a855f7";
|
|
53
|
-
case "concept":
|
|
54
|
-
return "#eab308";
|
|
55
|
-
case "location":
|
|
56
|
-
return "#14b8a6";
|
|
57
|
-
default:
|
|
58
|
-
return "#94a3b8";
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
18
|
function getMemoryKindColor(kind: string): string {
|
|
63
19
|
switch (kind) {
|
|
64
|
-
case "
|
|
20
|
+
case "identity":
|
|
65
21
|
return "#8b5cf6";
|
|
66
22
|
case "preference":
|
|
67
23
|
return "#3b82f6";
|
|
24
|
+
case "project":
|
|
25
|
+
return "#10b981";
|
|
26
|
+
case "decision":
|
|
27
|
+
return "#f59e0b";
|
|
68
28
|
case "constraint":
|
|
69
29
|
return "#ef4444";
|
|
70
|
-
case "
|
|
71
|
-
return "#f59e0b";
|
|
72
|
-
case "style":
|
|
30
|
+
case "event":
|
|
73
31
|
return "#ec4899";
|
|
74
32
|
default:
|
|
75
33
|
return "#94a3b8";
|
|
@@ -80,27 +38,6 @@ export function handleGetBrainGraph(): Response {
|
|
|
80
38
|
try {
|
|
81
39
|
const db = getDb();
|
|
82
40
|
|
|
83
|
-
const entityRows = db
|
|
84
|
-
.select({
|
|
85
|
-
id: memoryEntities.id,
|
|
86
|
-
name: memoryEntities.name,
|
|
87
|
-
type: memoryEntities.type,
|
|
88
|
-
mentionCount: memoryEntities.mentionCount,
|
|
89
|
-
firstSeenAt: memoryEntities.firstSeenAt,
|
|
90
|
-
lastSeenAt: memoryEntities.lastSeenAt,
|
|
91
|
-
})
|
|
92
|
-
.from(memoryEntities)
|
|
93
|
-
.all();
|
|
94
|
-
|
|
95
|
-
const relationRows = db
|
|
96
|
-
.select({
|
|
97
|
-
sourceEntityId: memoryEntityRelations.sourceEntityId,
|
|
98
|
-
targetEntityId: memoryEntityRelations.targetEntityId,
|
|
99
|
-
relation: memoryEntityRelations.relation,
|
|
100
|
-
})
|
|
101
|
-
.from(memoryEntityRelations)
|
|
102
|
-
.all();
|
|
103
|
-
|
|
104
41
|
const kindCountRows = db
|
|
105
42
|
.select({
|
|
106
43
|
kind: memoryItems.kind,
|
|
@@ -110,23 +47,6 @@ export function handleGetBrainGraph(): Response {
|
|
|
110
47
|
.groupBy(memoryItems.kind)
|
|
111
48
|
.all();
|
|
112
49
|
|
|
113
|
-
const entities = entityRows.map((entity) => ({
|
|
114
|
-
id: entity.id,
|
|
115
|
-
name: entity.name,
|
|
116
|
-
type: entity.type,
|
|
117
|
-
lobeRegion: getLobeRegion(entity.type),
|
|
118
|
-
color: getEntityColor(entity.type),
|
|
119
|
-
mentionCount: entity.mentionCount,
|
|
120
|
-
firstSeenAt: entity.firstSeenAt,
|
|
121
|
-
lastSeenAt: entity.lastSeenAt,
|
|
122
|
-
}));
|
|
123
|
-
|
|
124
|
-
const relations = relationRows.map((rel) => ({
|
|
125
|
-
sourceId: rel.sourceEntityId,
|
|
126
|
-
targetId: rel.targetEntityId,
|
|
127
|
-
relation: rel.relation,
|
|
128
|
-
}));
|
|
129
|
-
|
|
130
50
|
const memorySummary = kindCountRows.map((row) => ({
|
|
131
51
|
kind: row.kind,
|
|
132
52
|
count: row.count,
|
|
@@ -139,8 +59,8 @@ export function handleGetBrainGraph(): Response {
|
|
|
139
59
|
);
|
|
140
60
|
|
|
141
61
|
return Response.json({
|
|
142
|
-
entities,
|
|
143
|
-
relations,
|
|
62
|
+
entities: [],
|
|
63
|
+
relations: [],
|
|
144
64
|
memorySummary,
|
|
145
65
|
totalKnowledgeCount,
|
|
146
66
|
generatedAt: new Date().toISOString(),
|