@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
@@ -33,22 +33,6 @@
33
33
  "description": "Enable messaging skill section in the system prompt",
34
34
  "defaultEnabled": true
35
35
  },
36
- {
37
- "id": "messaging-gmail",
38
- "scope": "assistant",
39
- "key": "feature_flags.messaging.gmail.enabled",
40
- "label": "Messaging: Gmail",
41
- "description": "Allow messaging tools to operate on the Gmail platform",
42
- "defaultEnabled": true
43
- },
44
- {
45
- "id": "messaging-telegram",
46
- "scope": "assistant",
47
- "key": "feature_flags.messaging.telegram.enabled",
48
- "label": "Messaging: Telegram",
49
- "description": "Allow messaging tools to operate on the Telegram platform",
50
- "defaultEnabled": false
51
- },
52
36
  {
53
37
  "id": "collect-usage-data",
54
38
  "scope": "assistant",
@@ -81,6 +65,14 @@
81
65
  "description": "Show the Contacts tab in Settings for viewing and managing contacts",
82
66
  "defaultEnabled": false
83
67
  },
68
+ {
69
+ "id": "email-channel",
70
+ "scope": "assistant",
71
+ "key": "feature_flags.email-channel.enabled",
72
+ "label": "Email Channel",
73
+ "description": "Show the Email channel card on the Contacts page and enable the email-setup skill",
74
+ "defaultEnabled": false
75
+ },
84
76
  {
85
77
  "id": "outbound-proxy-sidecar",
86
78
  "scope": "assistant",
@@ -128,6 +120,14 @@
128
120
  "label": "Settings Developer Nav",
129
121
  "description": "Control Developer nav visibility in macOS settings",
130
122
  "defaultEnabled": true
123
+ },
124
+ {
125
+ "id": "logfire",
126
+ "scope": "assistant",
127
+ "key": "feature_flags.logfire.enabled",
128
+ "label": "Logfire LLM Observability",
129
+ "description": "Enable Logfire tracing for LLM request/response telemetry when LOGFIRE_TOKEN is set",
130
+ "defaultEnabled": false
131
131
  }
132
132
  ]
133
133
  }
@@ -333,12 +333,6 @@ export function loadConfig(): AssistantConfig {
333
333
  }
334
334
 
335
335
  // Environment variables override everything
336
- if (process.env.VELLUM_CONFIG_SANDBOX_ENABLED === "false") {
337
- config.sandbox.enabled = false;
338
- } else if (process.env.VELLUM_CONFIG_SANDBOX_ENABLED === "true") {
339
- config.sandbox.enabled = true;
340
- }
341
-
342
336
  if (process.env.ANTHROPIC_API_KEY) {
343
337
  config.apiKeys.anthropic = process.env.ANTHROPIC_API_KEY;
344
338
  }
@@ -91,27 +91,16 @@ export {
91
91
  MemoryRetentionConfigSchema,
92
92
  } from "./schemas/memory-lifecycle.js";
93
93
  export type {
94
- MemoryConflictsConfig,
95
- MemoryEntityConfig,
96
94
  MemoryExtractionConfig,
97
- MemoryProfileConfig,
98
95
  MemorySummarizationConfig,
99
96
  } from "./schemas/memory-processing.js";
100
97
  export {
101
- MemoryConflictsConfigSchema,
102
- MemoryEntityConfigSchema,
103
98
  MemoryExtractionConfigSchema,
104
- MemoryProfileConfigSchema,
105
99
  MemorySummarizationConfigSchema,
106
100
  } from "./schemas/memory-processing.js";
107
- export type {
108
- MemoryRerankingConfig,
109
- MemoryRetrievalConfig,
110
- } from "./schemas/memory-retrieval.js";
101
+ export type { MemoryRetrievalConfig } from "./schemas/memory-retrieval.js";
111
102
  export {
112
103
  MemoryDynamicBudgetConfigSchema,
113
- MemoryEarlyTerminationConfigSchema,
114
- MemoryRerankingConfigSchema,
115
104
  MemoryRetrievalConfigSchema,
116
105
  } from "./schemas/memory-retrieval.js";
117
106
  export type {
@@ -289,7 +278,9 @@ export const AssistantConfigSchema = z
289
278
  PermissionsConfigSchema.parse({}),
290
279
  ),
291
280
  auditLog: AuditLogConfigSchema.default(AuditLogConfigSchema.parse({})),
292
- logFile: LogFileConfigSchema.default(LogFileConfigSchema.parse({})),
281
+ logFile: LogFileConfigSchema.default(
282
+ LogFileConfigSchema.parse({ dir: getDataDir() + "/logs" }),
283
+ ),
293
284
  pricingOverrides: z.array(ModelPricingOverrideSchema).default([]),
294
285
  heartbeat: HeartbeatConfigSchema.default(HeartbeatConfigSchema.parse({})),
295
286
  swarm: SwarmConfigSchema.default(SwarmConfigSchema.parse({})),
@@ -33,15 +33,6 @@ export const MemoryCleanupConfigSchema = z.object({
33
33
  .int("memory.cleanup.enqueueIntervalMs must be an integer")
34
34
  .positive("memory.cleanup.enqueueIntervalMs must be a positive integer")
35
35
  .default(6 * 60 * 60 * 1000),
36
- resolvedConflictRetentionMs: z
37
- .number({
38
- error: "memory.cleanup.resolvedConflictRetentionMs must be a number",
39
- })
40
- .int("memory.cleanup.resolvedConflictRetentionMs must be an integer")
41
- .positive(
42
- "memory.cleanup.resolvedConflictRetentionMs must be a positive integer",
43
- )
44
- .default(30 * 24 * 60 * 60 * 1000),
45
36
  supersededItemRetentionMs: z
46
37
  .number({
47
38
  error: "memory.cleanup.supersededItemRetentionMs must be a number",
@@ -1,28 +1,5 @@
1
1
  import { z } from "zod";
2
2
 
3
- const VALID_MEMORY_ITEM_KINDS = [
4
- "preference",
5
- "profile",
6
- "project",
7
- "decision",
8
- "todo",
9
- "fact",
10
- "constraint",
11
- "relationship",
12
- "event",
13
- "opinion",
14
- "instruction",
15
- "style",
16
- ] as const;
17
-
18
- const DEFAULT_CONFLICTABLE_KINDS = [
19
- "preference",
20
- "profile",
21
- "constraint",
22
- "instruction",
23
- "style",
24
- ] as const;
25
-
26
3
  export const MemoryExtractionConfigSchema = z.object({
27
4
  useLLM: z
28
5
  .boolean({ error: "memory.extraction.useLLM must be a boolean" })
@@ -50,166 +27,9 @@ export const MemorySummarizationConfigSchema = z.object({
50
27
  .default("latency-optimized"),
51
28
  });
52
29
 
53
- export const MemoryEntityConfigSchema = z.object({
54
- enabled: z
55
- .boolean({ error: "memory.entity.enabled must be a boolean" })
56
- .default(true),
57
- modelIntent: z
58
- .enum(["latency-optimized", "quality-optimized", "vision-optimized"], {
59
- error: "memory.entity.modelIntent must be a valid model intent",
60
- })
61
- .default("latency-optimized"),
62
- extractRelations: z
63
- .object({
64
- enabled: z
65
- .boolean({
66
- error: "memory.entity.extractRelations.enabled must be a boolean",
67
- })
68
- .default(true),
69
- backfillBatchSize: z
70
- .number({
71
- error:
72
- "memory.entity.extractRelations.backfillBatchSize must be a number",
73
- })
74
- .int(
75
- "memory.entity.extractRelations.backfillBatchSize must be an integer",
76
- )
77
- .positive(
78
- "memory.entity.extractRelations.backfillBatchSize must be a positive integer",
79
- )
80
- .default(200),
81
- })
82
- .default({ enabled: true, backfillBatchSize: 200 }),
83
- relationRetrieval: z
84
- .object({
85
- enabled: z
86
- .boolean({
87
- error: "memory.entity.relationRetrieval.enabled must be a boolean",
88
- })
89
- .default(true),
90
- maxSeedEntities: z
91
- .number({
92
- error:
93
- "memory.entity.relationRetrieval.maxSeedEntities must be a number",
94
- })
95
- .int(
96
- "memory.entity.relationRetrieval.maxSeedEntities must be an integer",
97
- )
98
- .positive(
99
- "memory.entity.relationRetrieval.maxSeedEntities must be a positive integer",
100
- )
101
- .default(8),
102
- maxNeighborEntities: z
103
- .number({
104
- error:
105
- "memory.entity.relationRetrieval.maxNeighborEntities must be a number",
106
- })
107
- .int(
108
- "memory.entity.relationRetrieval.maxNeighborEntities must be an integer",
109
- )
110
- .positive(
111
- "memory.entity.relationRetrieval.maxNeighborEntities must be a positive integer",
112
- )
113
- .default(20),
114
- maxEdges: z
115
- .number({
116
- error: "memory.entity.relationRetrieval.maxEdges must be a number",
117
- })
118
- .int("memory.entity.relationRetrieval.maxEdges must be an integer")
119
- .positive(
120
- "memory.entity.relationRetrieval.maxEdges must be a positive integer",
121
- )
122
- .default(40),
123
- neighborScoreMultiplier: z
124
- .number({
125
- error:
126
- "memory.entity.relationRetrieval.neighborScoreMultiplier must be a number",
127
- })
128
- .gt(
129
- 0,
130
- "memory.entity.relationRetrieval.neighborScoreMultiplier must be > 0",
131
- )
132
- .lte(
133
- 1,
134
- "memory.entity.relationRetrieval.neighborScoreMultiplier must be <= 1",
135
- )
136
- .default(0.7),
137
- maxDepth: z
138
- .number({
139
- error: "memory.entity.relationRetrieval.maxDepth must be a number",
140
- })
141
- .int("memory.entity.relationRetrieval.maxDepth must be an integer")
142
- .positive(
143
- "memory.entity.relationRetrieval.maxDepth must be a positive integer",
144
- )
145
- .default(3),
146
- depthDecay: z
147
- .boolean({
148
- error: "memory.entity.relationRetrieval.depthDecay must be a boolean",
149
- })
150
- .default(true),
151
- })
152
- .default({
153
- enabled: true,
154
- maxSeedEntities: 8,
155
- maxNeighborEntities: 20,
156
- maxEdges: 40,
157
- neighborScoreMultiplier: 0.7,
158
- maxDepth: 3,
159
- depthDecay: true,
160
- }),
161
- });
162
-
163
- export const MemoryConflictsConfigSchema = z.object({
164
- enabled: z
165
- .boolean({ error: "memory.conflicts.enabled must be a boolean" })
166
- .default(true),
167
- gateMode: z
168
- .enum(["soft"], { error: 'memory.conflicts.gateMode must be "soft"' })
169
- .default("soft"),
170
- resolverLlmTimeoutMs: z
171
- .number({ error: "memory.conflicts.resolverLlmTimeoutMs must be a number" })
172
- .int("memory.conflicts.resolverLlmTimeoutMs must be an integer")
173
- .positive(
174
- "memory.conflicts.resolverLlmTimeoutMs must be a positive integer",
175
- )
176
- .default(12000),
177
- relevanceThreshold: z
178
- .number({ error: "memory.conflicts.relevanceThreshold must be a number" })
179
- .min(0, "memory.conflicts.relevanceThreshold must be >= 0")
180
- .max(1, "memory.conflicts.relevanceThreshold must be <= 1")
181
- .default(0.3),
182
- conflictableKinds: z
183
- .array(
184
- z.enum(VALID_MEMORY_ITEM_KINDS, {
185
- error: `memory.conflicts.conflictableKinds entries must be one of: ${VALID_MEMORY_ITEM_KINDS.join(
186
- ", ",
187
- )}`,
188
- }),
189
- )
190
- .nonempty({
191
- message: "memory.conflicts.conflictableKinds must not be empty",
192
- })
193
- .default([...DEFAULT_CONFLICTABLE_KINDS]),
194
- });
195
-
196
- export const MemoryProfileConfigSchema = z.object({
197
- enabled: z
198
- .boolean({ error: "memory.profile.enabled must be a boolean" })
199
- .default(true),
200
- maxInjectTokens: z
201
- .number({ error: "memory.profile.maxInjectTokens must be a number" })
202
- .int("memory.profile.maxInjectTokens must be an integer")
203
- .positive("memory.profile.maxInjectTokens must be a positive integer")
204
- .default(800),
205
- });
206
-
207
30
  export type MemoryExtractionConfig = z.infer<
208
31
  typeof MemoryExtractionConfigSchema
209
32
  >;
210
33
  export type MemorySummarizationConfig = z.infer<
211
34
  typeof MemorySummarizationConfigSchema
212
35
  >;
213
- export type MemoryEntityConfig = z.infer<typeof MemoryEntityConfigSchema>;
214
- export type MemoryConflictsConfig = z.infer<typeof MemoryConflictsConfigSchema>;
215
- export type MemoryProfileConfig = z.infer<typeof MemoryProfileConfigSchema>;
@@ -1,22 +1,5 @@
1
1
  import { z } from "zod";
2
2
 
3
- export const MemoryRerankingConfigSchema = z.object({
4
- enabled: z
5
- .boolean({ error: "memory.retrieval.reranking.enabled must be a boolean" })
6
- .default(false),
7
- modelIntent: z
8
- .enum(["latency-optimized", "quality-optimized", "vision-optimized"], {
9
- error:
10
- "memory.retrieval.reranking.modelIntent must be a valid model intent",
11
- })
12
- .default("latency-optimized"),
13
- topK: z
14
- .number({ error: "memory.retrieval.reranking.topK must be a number" })
15
- .int("memory.retrieval.reranking.topK must be an integer")
16
- .positive("memory.retrieval.reranking.topK must be a positive integer")
17
- .default(20),
18
- });
19
-
20
3
  export const MemoryDynamicBudgetConfigSchema = z.object({
21
4
  enabled: z
22
5
  .boolean({
@@ -55,49 +38,6 @@ export const MemoryDynamicBudgetConfigSchema = z.object({
55
38
  .default(10000),
56
39
  });
57
40
 
58
- export const MemoryEarlyTerminationConfigSchema = z.object({
59
- enabled: z
60
- .boolean({
61
- error: "memory.retrieval.earlyTermination.enabled must be a boolean",
62
- })
63
- .default(true),
64
- minCandidates: z
65
- .number({
66
- error: "memory.retrieval.earlyTermination.minCandidates must be a number",
67
- })
68
- .int("memory.retrieval.earlyTermination.minCandidates must be an integer")
69
- .positive(
70
- "memory.retrieval.earlyTermination.minCandidates must be a positive integer",
71
- )
72
- .default(20),
73
- minHighConfidence: z
74
- .number({
75
- error:
76
- "memory.retrieval.earlyTermination.minHighConfidence must be a number",
77
- })
78
- .int(
79
- "memory.retrieval.earlyTermination.minHighConfidence must be an integer",
80
- )
81
- .positive(
82
- "memory.retrieval.earlyTermination.minHighConfidence must be a positive integer",
83
- )
84
- .default(10),
85
- confidenceThreshold: z
86
- .number({
87
- error:
88
- "memory.retrieval.earlyTermination.confidenceThreshold must be a number",
89
- })
90
- .min(
91
- 0,
92
- "memory.retrieval.earlyTermination.confidenceThreshold must be >= 0",
93
- )
94
- .max(
95
- 1,
96
- "memory.retrieval.earlyTermination.confidenceThreshold must be <= 1",
97
- )
98
- .default(0.7),
99
- });
100
-
101
41
  /**
102
42
  * Per-kind freshness windows (in days). Items older than their window
103
43
  * (based on lastSeenAt) are down-ranked unless recently reinforced.
@@ -109,12 +49,13 @@ const MemoryFreshnessConfigSchema = z.object({
109
49
  .default(true),
110
50
  maxAgeDays: z
111
51
  .object({
112
- fact: z
52
+ identity: z
113
53
  .number({
114
- error: "memory.retrieval.freshness.maxAgeDays.fact must be a number",
54
+ error:
55
+ "memory.retrieval.freshness.maxAgeDays.identity must be a number",
115
56
  })
116
57
  .nonnegative(
117
- "memory.retrieval.freshness.maxAgeDays.fact must be non-negative",
58
+ "memory.retrieval.freshness.maxAgeDays.identity must be non-negative",
118
59
  )
119
60
  .default(0),
120
61
  preference: z
@@ -126,34 +67,50 @@ const MemoryFreshnessConfigSchema = z.object({
126
67
  "memory.retrieval.freshness.maxAgeDays.preference must be non-negative",
127
68
  )
128
69
  .default(0),
129
- behavior: z
70
+ project: z
130
71
  .number({
131
72
  error:
132
- "memory.retrieval.freshness.maxAgeDays.behavior must be a number",
73
+ "memory.retrieval.freshness.maxAgeDays.project must be a number",
133
74
  })
134
75
  .nonnegative(
135
- "memory.retrieval.freshness.maxAgeDays.behavior must be non-negative",
76
+ "memory.retrieval.freshness.maxAgeDays.project must be non-negative",
136
77
  )
137
- .default(90),
138
- event: z
78
+ .default(30),
79
+ decision: z
139
80
  .number({
140
- error: "memory.retrieval.freshness.maxAgeDays.event must be a number",
81
+ error:
82
+ "memory.retrieval.freshness.maxAgeDays.decision must be a number",
141
83
  })
142
84
  .nonnegative(
143
- "memory.retrieval.freshness.maxAgeDays.event must be non-negative",
85
+ "memory.retrieval.freshness.maxAgeDays.decision must be non-negative",
144
86
  )
145
87
  .default(30),
146
- opinion: z
88
+ constraint: z
147
89
  .number({
148
90
  error:
149
- "memory.retrieval.freshness.maxAgeDays.opinion must be a number",
91
+ "memory.retrieval.freshness.maxAgeDays.constraint must be a number",
92
+ })
93
+ .nonnegative(
94
+ "memory.retrieval.freshness.maxAgeDays.constraint must be non-negative",
95
+ )
96
+ .default(90),
97
+ event: z
98
+ .number({
99
+ error: "memory.retrieval.freshness.maxAgeDays.event must be a number",
150
100
  })
151
101
  .nonnegative(
152
- "memory.retrieval.freshness.maxAgeDays.opinion must be non-negative",
102
+ "memory.retrieval.freshness.maxAgeDays.event must be non-negative",
153
103
  )
154
- .default(60),
104
+ .default(30),
155
105
  })
156
- .default({ fact: 0, preference: 0, behavior: 90, event: 30, opinion: 60 }),
106
+ .default({
107
+ identity: 0,
108
+ preference: 0,
109
+ project: 30,
110
+ decision: 30,
111
+ constraint: 90,
112
+ event: 30,
113
+ }),
157
114
  staleDecay: z
158
115
  .number({ error: "memory.retrieval.freshness.staleDecay must be a number" })
159
116
  .min(0, "memory.retrieval.freshness.staleDecay must be >= 0")
@@ -171,36 +128,11 @@ const MemoryFreshnessConfigSchema = z.object({
171
128
  });
172
129
 
173
130
  export const MemoryRetrievalConfigSchema = z.object({
174
- lexicalTopK: z
175
- .number({ error: "memory.retrieval.lexicalTopK must be a number" })
176
- .int("memory.retrieval.lexicalTopK must be an integer")
177
- .positive("memory.retrieval.lexicalTopK must be a positive integer")
178
- .default(80),
179
- semanticTopK: z
180
- .number({ error: "memory.retrieval.semanticTopK must be a number" })
181
- .int("memory.retrieval.semanticTopK must be an integer")
182
- .positive("memory.retrieval.semanticTopK must be a positive integer")
183
- .default(40),
184
131
  maxInjectTokens: z
185
132
  .number({ error: "memory.retrieval.maxInjectTokens must be a number" })
186
133
  .int("memory.retrieval.maxInjectTokens must be an integer")
187
134
  .positive("memory.retrieval.maxInjectTokens must be a positive integer")
188
135
  .default(10000),
189
- injectionFormat: z
190
- .enum(["markdown", "structured_v1"], {
191
- error:
192
- 'memory.retrieval.injectionFormat must be "markdown" or "structured_v1"',
193
- })
194
- .default("markdown"),
195
- injectionStrategy: z
196
- .enum(["prepend_user_block", "separate_context_message"], {
197
- error:
198
- 'memory.retrieval.injectionStrategy must be "prepend_user_block" or "separate_context_message"',
199
- })
200
- .default("prepend_user_block"),
201
- reranking: MemoryRerankingConfigSchema.default(
202
- MemoryRerankingConfigSchema.parse({}),
203
- ),
204
136
  freshness: MemoryFreshnessConfigSchema.default(
205
137
  MemoryFreshnessConfigSchema.parse({}),
206
138
  ),
@@ -213,10 +145,6 @@ export const MemoryRetrievalConfigSchema = z.object({
213
145
  dynamicBudget: MemoryDynamicBudgetConfigSchema.default(
214
146
  MemoryDynamicBudgetConfigSchema.parse({}),
215
147
  ),
216
- earlyTermination: MemoryEarlyTerminationConfigSchema.default(
217
- MemoryEarlyTerminationConfigSchema.parse({}),
218
- ),
219
148
  });
220
149
 
221
- export type MemoryRerankingConfig = z.infer<typeof MemoryRerankingConfigSchema>;
222
150
  export type MemoryRetrievalConfig = z.infer<typeof MemoryRetrievalConfigSchema>;
@@ -6,10 +6,7 @@ import {
6
6
  MemoryRetentionConfigSchema,
7
7
  } from "./memory-lifecycle.js";
8
8
  import {
9
- MemoryConflictsConfigSchema,
10
- MemoryEntityConfigSchema,
11
9
  MemoryExtractionConfigSchema,
12
- MemoryProfileConfigSchema,
13
10
  MemorySummarizationConfigSchema,
14
11
  } from "./memory-processing.js";
15
12
  import { MemoryRetrievalConfigSchema } from "./memory-retrieval.js";
@@ -46,13 +43,6 @@ export const MemoryConfigSchema = z.object({
46
43
  summarization: MemorySummarizationConfigSchema.default(
47
44
  MemorySummarizationConfigSchema.parse({}),
48
45
  ),
49
- entity: MemoryEntityConfigSchema.default(MemoryEntityConfigSchema.parse({})),
50
- conflicts: MemoryConflictsConfigSchema.default(
51
- MemoryConflictsConfigSchema.parse({}),
52
- ),
53
- profile: MemoryProfileConfigSchema.default(
54
- MemoryProfileConfigSchema.parse({}),
55
- ),
56
46
  });
57
47
 
58
48
  export type MemoryConfig = z.infer<typeof MemoryConfigSchema>;
@@ -146,14 +146,23 @@ export interface SkillDefinition extends SkillSummary {
146
146
  body: string;
147
147
  }
148
148
 
149
+ export type SkillLookupErrorCode =
150
+ | "not_found"
151
+ | "ambiguous"
152
+ | "empty_catalog"
153
+ | "invalid_selector"
154
+ | "load_failed";
155
+
149
156
  export interface SkillLookupResult {
150
157
  skill?: SkillDefinition;
151
158
  error?: string;
159
+ errorCode?: SkillLookupErrorCode;
152
160
  }
153
161
 
154
162
  export interface SkillSelectorResult {
155
163
  skill?: SkillSummary;
156
164
  error?: string;
165
+ errorCode?: SkillLookupErrorCode;
157
166
  }
158
167
 
159
168
  // ─── Skill Tool Manifest Types ────────────────────────────────────────────────
@@ -1210,6 +1219,7 @@ export function resolveSkillSelector(
1210
1219
  if (!needle) {
1211
1220
  return {
1212
1221
  error: "Skill selector is required and must be a non-empty string.",
1222
+ errorCode: "invalid_selector",
1213
1223
  };
1214
1224
  }
1215
1225
 
@@ -1218,6 +1228,7 @@ export function resolveSkillSelector(
1218
1228
  return {
1219
1229
  error:
1220
1230
  "No skills are available. Configure ~/.vellum/workspace/skills/SKILLS.md or add skill directories.",
1231
+ errorCode: "empty_catalog",
1221
1232
  };
1222
1233
  }
1223
1234
 
@@ -1236,7 +1247,10 @@ export function resolveSkillSelector(
1236
1247
  }
1237
1248
  if (exactNameMatches.length > 1) {
1238
1249
  const ids = exactNameMatches.map((skill) => skill.id).join(", ");
1239
- return { error: `Ambiguous skill name "${needle}". Matching IDs: ${ids}` };
1250
+ return {
1251
+ error: `Ambiguous skill name "${needle}". Matching IDs: ${ids}`,
1252
+ errorCode: "ambiguous",
1253
+ };
1240
1254
  }
1241
1255
 
1242
1256
  const idPrefixMatches = catalog.filter((skill) =>
@@ -1249,12 +1263,14 @@ export function resolveSkillSelector(
1249
1263
  const ids = idPrefixMatches.map((skill) => skill.id).join(", ");
1250
1264
  return {
1251
1265
  error: `Ambiguous skill id prefix "${needle}". Matching IDs: ${ids}`,
1266
+ errorCode: "ambiguous",
1252
1267
  };
1253
1268
  }
1254
1269
 
1255
1270
  const knownSkills = catalog.map((skill) => skill.id).join(", ");
1256
1271
  return {
1257
1272
  error: `No skill matched "${needle}". Available skills: ${knownSkills}`,
1273
+ errorCode: "not_found",
1258
1274
  };
1259
1275
  }
1260
1276
 
@@ -1264,7 +1280,10 @@ export function loadSkillBySelector(
1264
1280
  ): SkillLookupResult {
1265
1281
  const resolved = resolveSkillSelector(selector, workspaceSkillsDir);
1266
1282
  if (!resolved.skill) {
1267
- return { error: resolved.error ?? "Failed to resolve skill selector." };
1283
+ return {
1284
+ error: resolved.error ?? "Failed to resolve skill selector.",
1285
+ errorCode: resolved.errorCode ?? "load_failed",
1286
+ };
1268
1287
  }
1269
1288
  return loadSkillDefinition(resolved.skill);
1270
1289
  }
@@ -12,13 +12,9 @@ export type {
12
12
  IngressConfig,
13
13
  LogFileConfig,
14
14
  MemoryConfig,
15
- MemoryConflictsConfig,
16
15
  MemoryEmbeddingsConfig,
17
- MemoryEntityConfig,
18
16
  MemoryExtractionConfig,
19
17
  MemoryJobsConfig,
20
- MemoryProfileConfig,
21
- MemoryRerankingConfig,
22
18
  MemoryRetentionConfig,
23
19
  MemoryRetrievalConfig,
24
20
  MemorySegmentationConfig,