@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.
Files changed (423) hide show
  1. package/ARCHITECTURE.md +26 -35
  2. package/README.md +5 -26
  3. package/docs/architecture/integrations.md +45 -41
  4. package/docs/architecture/keychain-broker.md +3 -3
  5. package/docs/architecture/memory.md +180 -119
  6. package/docs/runbook-trusted-contacts.md +3 -8
  7. package/hook-templates/debug-prompt-logger/hook.json +1 -1
  8. package/hook-templates/debug-prompt-logger/run.sh +1 -3
  9. package/package.json +2 -2
  10. package/src/__tests__/actor-token-service.test.ts +0 -1
  11. package/src/__tests__/agent-loop.test.ts +3 -1
  12. package/src/__tests__/anthropic-provider.test.ts +249 -2
  13. package/src/__tests__/approval-cascade.test.ts +796 -0
  14. package/src/__tests__/approval-primitive.test.ts +0 -1
  15. package/src/__tests__/approval-routes-http.test.ts +4 -0
  16. package/src/__tests__/assistant-attachments.test.ts +12 -34
  17. package/src/__tests__/assistant-feature-flag-guard.test.ts +0 -23
  18. package/src/__tests__/assistant-feature-flag-guardrails.test.ts +76 -0
  19. package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -1
  20. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +2 -2
  21. package/src/__tests__/canonical-guardian-store.test.ts +95 -0
  22. package/src/__tests__/channel-guardian.test.ts +0 -2
  23. package/src/__tests__/channel-readiness-routes.test.ts +15 -6
  24. package/src/__tests__/channel-readiness-service.test.ts +10 -9
  25. package/src/__tests__/checker.test.ts +13 -20
  26. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +1 -1
  27. package/src/__tests__/computer-use-tools.test.ts +2 -19
  28. package/src/__tests__/config-schema.test.ts +1 -68
  29. package/src/__tests__/config-watcher.test.ts +0 -1
  30. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  31. package/src/__tests__/context-image-dimensions.test.ts +332 -0
  32. package/src/__tests__/context-memory-e2e.test.ts +11 -100
  33. package/src/__tests__/context-token-estimator.test.ts +196 -13
  34. package/src/__tests__/conversation-attention-store.test.ts +0 -1
  35. package/src/__tests__/conversation-attention-telegram.test.ts +0 -1
  36. package/src/__tests__/conversation-routes-guardian-reply.test.ts +152 -0
  37. package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -0
  38. package/src/__tests__/credential-metadata-store.test.ts +64 -73
  39. package/src/__tests__/credential-security-e2e.test.ts +1 -0
  40. package/src/__tests__/credential-security-invariants.test.ts +13 -7
  41. package/src/__tests__/credential-vault-unit.test.ts +284 -49
  42. package/src/__tests__/credential-vault.test.ts +150 -16
  43. package/src/__tests__/credentials-cli.test.ts +71 -0
  44. package/src/__tests__/cu-unified-flow.test.ts +532 -0
  45. package/src/__tests__/date-context.test.ts +93 -77
  46. package/src/__tests__/deterministic-verification-control-plane.test.ts +64 -0
  47. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  48. package/src/__tests__/ephemeral-permissions.test.ts +3 -3
  49. package/src/__tests__/gateway-only-guard.test.ts +0 -1
  50. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
  51. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
  52. package/src/__tests__/guardian-routing-invariants.test.ts +93 -1
  53. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
  54. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -39
  55. package/src/__tests__/heartbeat-service.test.ts +0 -1
  56. package/src/__tests__/history-repair.test.ts +245 -0
  57. package/src/__tests__/host-cu-proxy.test.ts +791 -0
  58. package/src/__tests__/host-shell-tool.test.ts +27 -15
  59. package/src/__tests__/http-user-message-parity.test.ts +2 -0
  60. package/src/__tests__/ingress-url-consistency.test.ts +14 -21
  61. package/src/__tests__/integration-status.test.ts +32 -51
  62. package/src/__tests__/intent-routing.test.ts +0 -1
  63. package/src/__tests__/invite-redemption-service.test.ts +65 -1
  64. package/src/__tests__/invite-routes-http.test.ts +10 -9
  65. package/src/__tests__/keychain-broker-client.test.ts +14 -46
  66. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +56 -18
  67. package/src/__tests__/memory-lifecycle-e2e.test.ts +244 -387
  68. package/src/__tests__/memory-recall-quality.test.ts +244 -407
  69. package/src/__tests__/memory-regressions.experimental.test.ts +126 -101
  70. package/src/__tests__/memory-regressions.test.ts +477 -2841
  71. package/src/__tests__/memory-retrieval.benchmark.test.ts +33 -150
  72. package/src/__tests__/memory-upsert-concurrency.test.ts +5 -244
  73. package/src/__tests__/mime-builder.test.ts +28 -0
  74. package/src/__tests__/native-web-search.test.ts +1 -0
  75. package/src/__tests__/notification-routing-intent.test.ts +0 -1
  76. package/src/__tests__/oauth-cli.test.ts +941 -15
  77. package/src/__tests__/oauth-provider-profiles.test.ts +9 -9
  78. package/src/__tests__/oauth-scope-policy.test.ts +4 -6
  79. package/src/__tests__/oauth-store.test.ts +870 -0
  80. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
  81. package/src/__tests__/provider-error-scenarios.test.ts +0 -1
  82. package/src/__tests__/provider-streaming.benchmark.test.ts +0 -1
  83. package/src/__tests__/public-ingress-urls.test.ts +15 -21
  84. package/src/__tests__/qdrant-collection-migration.test.ts +53 -8
  85. package/src/__tests__/recording-handler.test.ts +3 -4
  86. package/src/__tests__/registry.test.ts +2 -3
  87. package/src/__tests__/relay-server.test.ts +46 -1
  88. package/src/__tests__/runtime-events-sse.test.ts +55 -7
  89. package/src/__tests__/schedule-store.test.ts +0 -1
  90. package/src/__tests__/schedule-tools.test.ts +32 -0
  91. package/src/__tests__/scheduler-recurrence.test.ts +0 -1
  92. package/src/__tests__/scoped-approval-grants.test.ts +0 -1
  93. package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
  94. package/src/__tests__/script-proxy-certs.test.ts +1 -1
  95. package/src/__tests__/secret-ingress-handler.test.ts +0 -1
  96. package/src/__tests__/secret-onetime-send.test.ts +1 -0
  97. package/src/__tests__/secure-keys.test.ts +7 -2
  98. package/src/__tests__/send-endpoint-busy.test.ts +24 -6
  99. package/src/__tests__/sequence-store.test.ts +0 -1
  100. package/src/__tests__/session-abort-tool-results.test.ts +1 -14
  101. package/src/__tests__/session-agent-loop-overflow.test.ts +1583 -0
  102. package/src/__tests__/session-agent-loop.test.ts +19 -15
  103. package/src/__tests__/session-confirmation-signals.test.ts +1 -15
  104. package/src/__tests__/session-error.test.ts +124 -2
  105. package/src/__tests__/session-history-web-search.test.ts +918 -0
  106. package/src/__tests__/session-init.benchmark.test.ts +4 -5
  107. package/src/__tests__/session-pre-run-repair.test.ts +1 -14
  108. package/src/__tests__/session-provider-retry-repair.test.ts +25 -28
  109. package/src/__tests__/session-queue.test.ts +37 -27
  110. package/src/__tests__/session-runtime-assembly.test.ts +54 -0
  111. package/src/__tests__/session-slash-known.test.ts +1 -15
  112. package/src/__tests__/session-slash-queue.test.ts +1 -15
  113. package/src/__tests__/session-slash-unknown.test.ts +1 -15
  114. package/src/__tests__/session-workspace-cache-state.test.ts +3 -33
  115. package/src/__tests__/session-workspace-injection.test.ts +3 -37
  116. package/src/__tests__/session-workspace-tool-tracking.test.ts +3 -37
  117. package/src/__tests__/skill-include-graph.test.ts +66 -0
  118. package/src/__tests__/skill-load-feature-flag.test.ts +0 -1
  119. package/src/__tests__/skill-load-tool.test.ts +149 -1
  120. package/src/__tests__/skill-projection-feature-flag.test.ts +0 -1
  121. package/src/__tests__/skills-install-extract.test.ts +93 -0
  122. package/src/__tests__/skills-uninstall.test.ts +1 -1
  123. package/src/__tests__/skills.test.ts +3 -3
  124. package/src/__tests__/skillssh-registry.test.ts +451 -0
  125. package/src/__tests__/slack-channel-config.test.ts +67 -3
  126. package/src/__tests__/slack-share-routes.test.ts +17 -19
  127. package/src/__tests__/system-prompt.test.ts +0 -1
  128. package/src/__tests__/telegram-invite-adapter.test.ts +18 -22
  129. package/src/__tests__/terminal-tools.test.ts +4 -3
  130. package/src/__tests__/test-support/computer-use-skill-harness.ts +3 -2
  131. package/src/__tests__/tool-approval-handler.test.ts +0 -1
  132. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
  133. package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
  134. package/src/__tests__/tool-executor-shell-integration.test.ts +0 -1
  135. package/src/__tests__/tool-executor.test.ts +0 -1
  136. package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
  137. package/src/__tests__/trust-store-pattern-matches.test.ts +29 -0
  138. package/src/__tests__/trust-store.test.ts +7 -13
  139. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  140. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
  141. package/src/__tests__/twilio-routes.test.ts +0 -16
  142. package/src/__tests__/verification-control-plane-policy.test.ts +0 -1
  143. package/src/__tests__/voice-invite-redemption.test.ts +32 -1
  144. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
  145. package/src/agent/ax-tree-compaction.test.ts +286 -0
  146. package/src/agent/loop.ts +104 -131
  147. package/src/approvals/AGENTS.md +1 -1
  148. package/src/approvals/guardian-request-resolvers.ts +14 -2
  149. package/src/bundler/compiler-tools.ts +66 -2
  150. package/src/calls/call-domain.ts +133 -6
  151. package/src/calls/call-store.ts +6 -0
  152. package/src/calls/relay-server.ts +52 -18
  153. package/src/calls/relay-setup-router.ts +17 -1
  154. package/src/calls/twilio-config.ts +3 -8
  155. package/src/calls/twilio-routes.ts +1 -2
  156. package/src/calls/types.ts +3 -1
  157. package/src/calls/voice-ingress-preflight.ts +1 -1
  158. package/src/cli/commands/browser-relay.ts +18 -12
  159. package/src/cli/commands/completions.ts +0 -3
  160. package/src/cli/commands/credentials.ts +101 -15
  161. package/src/cli/commands/doctor.ts +4 -3
  162. package/src/cli/commands/mcp.ts +46 -59
  163. package/src/cli/commands/memory.ts +16 -165
  164. package/src/cli/commands/oauth/apps.ts +284 -0
  165. package/src/cli/commands/oauth/connections.ts +633 -0
  166. package/src/cli/commands/oauth/index.ts +52 -0
  167. package/src/cli/commands/oauth/providers.ts +256 -0
  168. package/src/cli/commands/sessions.ts +5 -2
  169. package/src/cli/commands/skills.ts +177 -339
  170. package/src/cli/http-client.ts +0 -20
  171. package/src/cli/main-screen.tsx +2 -2
  172. package/src/cli/program.ts +6 -11
  173. package/src/cli/reference.ts +1 -3
  174. package/src/cli.ts +4 -10
  175. package/src/config/assistant-feature-flags.ts +0 -3
  176. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +1 -1
  177. package/src/config/bundled-skills/computer-use/SKILL.md +3 -6
  178. package/src/config/bundled-skills/computer-use/TOOLS.json +23 -5
  179. package/src/config/bundled-skills/computer-use/tools/{computer-use-request-control.ts → computer-use-observe.ts} +1 -5
  180. package/src/config/bundled-skills/google-calendar/calendar-client.ts +21 -16
  181. package/src/config/bundled-skills/messaging/tools/shared.ts +1 -4
  182. package/src/config/bundled-skills/settings/SKILL.md +1 -1
  183. package/src/config/bundled-skills/settings/TOOLS.json +2 -8
  184. package/src/config/bundled-skills/settings/tools/voice-config-update.ts +5 -33
  185. package/src/config/bundled-tool-registry.ts +2 -5
  186. package/src/config/env-registry.ts +14 -83
  187. package/src/config/env.ts +11 -50
  188. package/src/config/feature-flag-registry.json +16 -16
  189. package/src/config/loader.ts +0 -6
  190. package/src/config/schema.ts +4 -13
  191. package/src/config/schemas/memory-lifecycle.ts +0 -9
  192. package/src/config/schemas/memory-processing.ts +0 -180
  193. package/src/config/schemas/memory-retrieval.ts +32 -104
  194. package/src/config/schemas/memory.ts +0 -10
  195. package/src/config/skills.ts +21 -2
  196. package/src/config/types.ts +0 -4
  197. package/src/context/image-dimensions.ts +229 -0
  198. package/src/context/token-estimator.ts +75 -12
  199. package/src/context/window-manager.ts +53 -11
  200. package/src/daemon/assistant-attachments.ts +1 -13
  201. package/src/daemon/config-watcher.ts +61 -3
  202. package/src/daemon/daemon-control.ts +1 -1
  203. package/src/daemon/date-context.ts +114 -31
  204. package/src/daemon/handlers/config-ingress.ts +8 -33
  205. package/src/daemon/handlers/config-slack-channel.ts +49 -46
  206. package/src/daemon/handlers/config-telegram.ts +32 -16
  207. package/src/daemon/handlers/sessions.ts +27 -36
  208. package/src/daemon/handlers/shared.ts +0 -130
  209. package/src/daemon/handlers/skills.ts +20 -1
  210. package/src/daemon/history-repair.ts +72 -8
  211. package/src/daemon/host-cu-proxy.ts +430 -0
  212. package/src/daemon/lifecycle.ts +67 -71
  213. package/src/daemon/mcp-reload-service.ts +2 -2
  214. package/src/daemon/message-protocol.ts +3 -0
  215. package/src/daemon/message-types/computer-use.ts +1 -129
  216. package/src/daemon/message-types/host-cu.ts +19 -0
  217. package/src/daemon/message-types/memory.ts +4 -16
  218. package/src/daemon/message-types/messages.ts +4 -0
  219. package/src/daemon/message-types/sessions.ts +4 -0
  220. package/src/daemon/server.ts +25 -21
  221. package/src/daemon/session-agent-loop-handlers.ts +40 -0
  222. package/src/daemon/session-agent-loop.ts +334 -48
  223. package/src/daemon/session-attachments.ts +1 -2
  224. package/src/daemon/session-error.ts +89 -6
  225. package/src/daemon/session-history.ts +17 -7
  226. package/src/daemon/session-media-retry.ts +6 -2
  227. package/src/daemon/session-memory.ts +69 -149
  228. package/src/daemon/session-process.ts +10 -1
  229. package/src/daemon/session-runtime-assembly.ts +49 -19
  230. package/src/daemon/session-slash.ts +1 -1
  231. package/src/daemon/session-surfaces.ts +43 -28
  232. package/src/daemon/session-tool-setup.ts +9 -10
  233. package/src/daemon/session.ts +150 -17
  234. package/src/daemon/tool-side-effects.ts +2 -8
  235. package/src/daemon/watch-handler.ts +2 -2
  236. package/src/events/tool-metrics-listener.ts +2 -2
  237. package/src/hooks/manager.ts +1 -4
  238. package/src/inbound/public-ingress-urls.ts +7 -7
  239. package/src/instrument.ts +61 -1
  240. package/src/logfire.ts +16 -5
  241. package/src/memory/admin.ts +2 -191
  242. package/src/memory/canonical-guardian-store.ts +38 -2
  243. package/src/memory/conversation-crud.ts +0 -33
  244. package/src/memory/conversation-key-store.ts +21 -0
  245. package/src/memory/conversation-queries.ts +22 -3
  246. package/src/memory/db-init.ts +32 -0
  247. package/src/memory/embedding-backend.ts +84 -8
  248. package/src/memory/embedding-types.ts +9 -1
  249. package/src/memory/indexer.ts +7 -46
  250. package/src/memory/items-extractor.ts +274 -76
  251. package/src/memory/job-handlers/backfill.ts +2 -127
  252. package/src/memory/job-handlers/cleanup.ts +2 -16
  253. package/src/memory/job-handlers/extraction.ts +2 -138
  254. package/src/memory/job-handlers/index-maintenance.ts +1 -6
  255. package/src/memory/job-handlers/summarization.ts +3 -148
  256. package/src/memory/job-utils.ts +21 -59
  257. package/src/memory/jobs-store.ts +1 -159
  258. package/src/memory/jobs-worker.ts +9 -52
  259. package/src/memory/migrations/104-core-indexes.ts +3 -3
  260. package/src/memory/migrations/149-oauth-tables.ts +62 -0
  261. package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +98 -0
  262. package/src/memory/migrations/151-oauth-providers-ping-url.ts +11 -0
  263. package/src/memory/migrations/152-memory-item-supersession.ts +44 -0
  264. package/src/memory/migrations/153-drop-entity-tables.ts +15 -0
  265. package/src/memory/migrations/154-drop-fts.ts +20 -0
  266. package/src/memory/migrations/155-drop-conflicts.ts +7 -0
  267. package/src/memory/migrations/156-call-session-invite-metadata.ts +24 -0
  268. package/src/memory/migrations/index.ts +8 -0
  269. package/src/memory/qdrant-client.ts +148 -51
  270. package/src/memory/raw-query.ts +1 -1
  271. package/src/memory/retriever.test.ts +294 -273
  272. package/src/memory/retriever.ts +421 -645
  273. package/src/memory/schema/calls.ts +2 -0
  274. package/src/memory/schema/index.ts +1 -0
  275. package/src/memory/schema/memory-core.ts +3 -48
  276. package/src/memory/schema/oauth.ts +67 -0
  277. package/src/memory/search/formatting.ts +263 -176
  278. package/src/memory/search/lexical.ts +1 -254
  279. package/src/memory/search/ranking.ts +0 -455
  280. package/src/memory/search/semantic.ts +100 -14
  281. package/src/memory/search/staleness.ts +47 -0
  282. package/src/memory/search/tier-classifier.ts +21 -0
  283. package/src/memory/search/types.ts +15 -77
  284. package/src/memory/task-memory-cleanup.ts +4 -6
  285. package/src/messaging/provider.ts +4 -4
  286. package/src/messaging/providers/gmail/client.ts +82 -2
  287. package/src/messaging/providers/gmail/mime-builder.ts +17 -7
  288. package/src/messaging/providers/gmail/people-client.ts +10 -10
  289. package/src/messaging/providers/telegram-bot/adapter.ts +17 -17
  290. package/src/messaging/providers/whatsapp/adapter.ts +11 -8
  291. package/src/messaging/registry.ts +2 -32
  292. package/src/notifications/copy-composer.ts +0 -5
  293. package/src/notifications/signal.ts +4 -5
  294. package/src/oauth/byo-connection.test.ts +133 -25
  295. package/src/oauth/byo-connection.ts +22 -6
  296. package/src/oauth/connect-orchestrator.ts +113 -57
  297. package/src/oauth/connect-types.ts +17 -23
  298. package/src/oauth/connection-resolver.ts +35 -11
  299. package/src/oauth/connection.ts +1 -1
  300. package/src/oauth/manual-token-connection.ts +104 -0
  301. package/src/oauth/oauth-store.ts +582 -0
  302. package/src/oauth/platform-connection.test.ts +29 -0
  303. package/src/oauth/platform-connection.ts +6 -5
  304. package/src/oauth/provider-behaviors.ts +124 -0
  305. package/src/oauth/scope-policy.ts +9 -2
  306. package/src/oauth/seed-providers.ts +167 -0
  307. package/src/oauth/token-persistence.ts +81 -77
  308. package/src/permissions/checker.ts +3 -3
  309. package/src/permissions/defaults.ts +1 -1
  310. package/src/permissions/prompter.ts +10 -1
  311. package/src/permissions/trust-store.ts +36 -1
  312. package/src/playbooks/playbook-compiler.ts +1 -1
  313. package/src/prompts/__tests__/build-cli-reference-section.test.ts +3 -1
  314. package/src/prompts/system-prompt.ts +46 -42
  315. package/src/providers/anthropic/client.ts +59 -20
  316. package/src/providers/retry.ts +1 -27
  317. package/src/providers/types.ts +7 -1
  318. package/src/runtime/AGENTS.md +9 -0
  319. package/src/runtime/auth/route-policy.ts +6 -6
  320. package/src/runtime/channel-reply-delivery.ts +0 -40
  321. package/src/runtime/gateway-client.ts +0 -7
  322. package/src/runtime/guardian-reply-router.ts +24 -22
  323. package/src/runtime/http-server.ts +10 -8
  324. package/src/runtime/http-types.ts +2 -2
  325. package/src/runtime/invite-redemption-service.ts +19 -1
  326. package/src/runtime/invite-service.ts +25 -0
  327. package/src/runtime/middleware/twilio-validation.ts +1 -11
  328. package/src/runtime/pending-interactions.ts +14 -12
  329. package/src/runtime/routes/brain-graph-routes.ts +10 -90
  330. package/src/runtime/routes/channel-delivery-routes.ts +0 -1
  331. package/src/runtime/routes/conversation-routes.ts +81 -19
  332. package/src/runtime/routes/events-routes.ts +21 -11
  333. package/src/runtime/routes/host-cu-routes.ts +97 -0
  334. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +21 -12
  335. package/src/runtime/routes/inbound-stages/background-dispatch.ts +12 -111
  336. package/src/runtime/routes/integrations/slack/share.ts +6 -7
  337. package/src/runtime/routes/log-export-routes.ts +126 -8
  338. package/src/runtime/routes/memory-item-routes.test.ts +754 -0
  339. package/src/runtime/routes/memory-item-routes.ts +503 -0
  340. package/src/runtime/routes/session-management-routes.ts +3 -3
  341. package/src/runtime/routes/settings-routes.ts +55 -48
  342. package/src/runtime/routes/surface-action-routes.ts +1 -1
  343. package/src/runtime/routes/trust-rules-routes.ts +14 -0
  344. package/src/runtime/routes/watch-routes.ts +128 -0
  345. package/src/runtime/routes/workspace-routes.ts +2 -1
  346. package/src/schedule/integration-status.ts +10 -9
  347. package/src/security/credential-key.ts +0 -156
  348. package/src/security/keychain-broker-client.ts +22 -10
  349. package/src/security/oauth2.ts +1 -1
  350. package/src/security/secure-keys.ts +25 -3
  351. package/src/security/token-manager.ts +137 -64
  352. package/src/skills/catalog-install.ts +414 -0
  353. package/src/skills/include-graph.ts +32 -0
  354. package/src/skills/skillssh-registry.ts +503 -0
  355. package/src/telegram/bot-username.ts +2 -3
  356. package/src/tools/assets/search.ts +5 -1
  357. package/src/tools/browser/network-recorder.ts +1 -1
  358. package/src/tools/browser/network-recording-types.ts +1 -1
  359. package/src/tools/computer-use/definitions.ts +36 -11
  360. package/src/tools/computer-use/registry.ts +5 -6
  361. package/src/tools/credentials/broker.ts +1 -2
  362. package/src/tools/credentials/metadata-store.ts +17 -121
  363. package/src/tools/credentials/vault.ts +92 -167
  364. package/src/tools/memory/definitions.ts +4 -13
  365. package/src/tools/memory/handlers.test.ts +83 -103
  366. package/src/tools/memory/handlers.ts +50 -85
  367. package/src/tools/registry.ts +2 -7
  368. package/src/tools/schedule/create.ts +8 -1
  369. package/src/tools/schedule/update.ts +8 -1
  370. package/src/tools/skills/load.ts +85 -3
  371. package/src/tools/watch/watch-state.ts +0 -12
  372. package/src/util/logger.ts +7 -41
  373. package/src/util/platform.ts +9 -28
  374. package/src/watcher/providers/google-calendar.ts +2 -1
  375. package/src/__tests__/clarification-resolver.test.ts +0 -193
  376. package/src/__tests__/computer-use-session-compaction.test.ts +0 -143
  377. package/src/__tests__/computer-use-session-lifecycle.test.ts +0 -322
  378. package/src/__tests__/computer-use-session-working-dir.test.ts +0 -166
  379. package/src/__tests__/computer-use-skill-baseline.test.ts +0 -78
  380. package/src/__tests__/computer-use-skill-endstate.test.ts +0 -105
  381. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +0 -249
  382. package/src/__tests__/conflict-intent-tokenization.test.ts +0 -160
  383. package/src/__tests__/conflict-policy.test.ts +0 -269
  384. package/src/__tests__/conflict-store.test.ts +0 -372
  385. package/src/__tests__/contradiction-checker.test.ts +0 -361
  386. package/src/__tests__/entity-extractor.test.ts +0 -211
  387. package/src/__tests__/entity-search.test.ts +0 -1117
  388. package/src/__tests__/profile-compiler.test.ts +0 -392
  389. package/src/__tests__/ride-shotgun-handler.test.ts +0 -452
  390. package/src/__tests__/session-conflict-gate.test.ts +0 -1228
  391. package/src/__tests__/session-profile-injection.test.ts +0 -557
  392. package/src/cli/commands/dev.ts +0 -129
  393. package/src/cli/commands/map.ts +0 -391
  394. package/src/cli/commands/oauth.ts +0 -77
  395. package/src/config/bundled-skills/knowledge-graph/SKILL.md +0 -25
  396. package/src/config/bundled-skills/knowledge-graph/TOOLS.json +0 -66
  397. package/src/config/bundled-skills/knowledge-graph/tools/graph-query.ts +0 -211
  398. package/src/daemon/computer-use-session.ts +0 -1026
  399. package/src/daemon/ride-shotgun-handler.ts +0 -569
  400. package/src/daemon/session-conflict-gate.ts +0 -167
  401. package/src/daemon/session-dynamic-profile.ts +0 -77
  402. package/src/memory/clarification-resolver.ts +0 -417
  403. package/src/memory/conflict-intent.ts +0 -205
  404. package/src/memory/conflict-policy.ts +0 -127
  405. package/src/memory/conflict-store.ts +0 -410
  406. package/src/memory/contradiction-checker.ts +0 -508
  407. package/src/memory/entity-extractor.ts +0 -535
  408. package/src/memory/format-recall.ts +0 -47
  409. package/src/memory/fts-reconciler.ts +0 -165
  410. package/src/memory/job-handlers/conflict.ts +0 -200
  411. package/src/memory/profile-compiler.ts +0 -195
  412. package/src/memory/recall-cache.ts +0 -117
  413. package/src/memory/search/entity.ts +0 -535
  414. package/src/memory/search/query-expansion.test.ts +0 -70
  415. package/src/memory/search/query-expansion.ts +0 -118
  416. package/src/oauth/provider-base-urls.ts +0 -21
  417. package/src/oauth/provider-profiles.ts +0 -192
  418. package/src/prompts/computer-use-prompt.ts +0 -98
  419. package/src/runtime/routes/computer-use-routes.ts +0 -641
  420. package/src/runtime/routes/mcp-routes.ts +0 -20
  421. package/src/runtime/telegram-streaming-delivery.test.ts +0 -729
  422. package/src/runtime/telegram-streaming-delivery.ts +0 -393
  423. 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
- return pendingRequestIds
209
+ results = pendingRequestIds
207
210
  .map(getCanonicalGuardianRequest)
208
211
  .filter((r): r is CanonicalGuardianRequest => r?.status === "pending");
209
- }
210
-
211
- // Query by guardian identity when available
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
- // 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
- 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
- // Actors with a guardianPrincipalId but no actorExternalUserId or
234
- // conversationId: query by principal so desktop sessions can still
235
- // discover pending guardian work via their bound principal.
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
- return [];
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 { mcpRouteDefinitions } from "./routes/mcp-routes.js";
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 getComputerUseDeps?: RuntimeHttpServerOptions["getComputerUseDeps"];
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.getComputerUseDeps = options.getComputerUseDeps;
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.getComputerUseDeps
977
- ? computerUseRouteDefinitions({
978
- getComputerUseDeps: this.getComputerUseDeps,
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 computer-use session dependencies (CU routes). */
223
- getComputerUseDeps?: () => import("./routes/computer-use-routes.js").ComputerUseDeps;
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. An explicit local-dev
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 host_file interactions.
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 host_file_request, the onEvent callback registers
7
- * the interaction here. Standalone HTTP endpoints (/v1/confirm, /v1/secret,
8
- * /v1/trust-rules, /v1/host-bash-result, /v1/host-file-result) look up
9
- * the session from this tracker to resolve the interaction.
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 host_file interactions are intentionally skipped — they
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 or /v1/host-file-result after
89
- * completing the operation, get a 404, and the proxy timer would fire with
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 entities mapped to brain regions based on their type.
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 "profile":
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 "instruction":
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(),
@@ -5,7 +5,6 @@
5
5
  import * as deliveryStatus from "../../memory/delivery-status.js";
6
6
  import { httpError } from "../http-errors.js";
7
7
  export {
8
- deliverAttachmentsOnly,
9
8
  type DeliverReplyOptions,
10
9
  deliverReplyViaCallback,
11
10
  } from "../channel-reply-delivery.js";