@vellumai/assistant 0.5.16 → 0.6.0

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 (407) hide show
  1. package/ARCHITECTURE.md +1 -1
  2. package/Dockerfile +0 -3
  3. package/knip.json +2 -1
  4. package/openapi.yaml +660 -80
  5. package/package.json +1 -1
  6. package/src/__tests__/actor-token-service.test.ts +68 -0
  7. package/src/__tests__/agent-loop.test.ts +0 -32
  8. package/src/__tests__/always-loaded-tools-guard.test.ts +2 -2
  9. package/src/__tests__/anthropic-provider.test.ts +57 -3
  10. package/src/__tests__/app-compiler.test.ts +120 -0
  11. package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
  12. package/src/__tests__/call-conversation-messages.test.ts +2 -6
  13. package/src/__tests__/call-domain.test.ts +2 -6
  14. package/src/__tests__/call-pointer-messages.test.ts +2 -14
  15. package/src/__tests__/call-recovery.test.ts +2 -6
  16. package/src/__tests__/call-routes-http.test.ts +2 -6
  17. package/src/__tests__/call-store.test.ts +2 -6
  18. package/src/__tests__/cancel-resolves-conversation-key.test.ts +2 -6
  19. package/src/__tests__/canonical-guardian-store.test.ts +2 -6
  20. package/src/__tests__/channel-delivery-store.test.ts +2 -6
  21. package/src/__tests__/channel-retry-sweep.test.ts +2 -6
  22. package/src/__tests__/checker.test.ts +25 -3
  23. package/src/__tests__/clawhub.test.ts +54 -24
  24. package/src/__tests__/cli-command-risk-guard.test.ts +14 -0
  25. package/src/__tests__/cli-memory.test.ts +74 -69
  26. package/src/__tests__/config-schema.test.ts +1 -1
  27. package/src/__tests__/config-set-platform-guard.test.ts +302 -0
  28. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +2 -6
  29. package/src/__tests__/contacts-tools.test.ts +31 -0
  30. package/src/__tests__/context-overflow-reducer.test.ts +86 -0
  31. package/src/__tests__/context-token-estimator.test.ts +175 -10
  32. package/src/__tests__/conversation-agent-loop-overflow.test.ts +9 -0
  33. package/src/__tests__/conversation-agent-loop.test.ts +9 -0
  34. package/src/__tests__/conversation-attachments.test.ts +2 -6
  35. package/src/__tests__/conversation-attention-store.test.ts +2 -6
  36. package/src/__tests__/conversation-clear-safety.test.ts +2 -6
  37. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +4 -10
  38. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -6
  39. package/src/__tests__/conversation-disk-view.test.ts +2 -6
  40. package/src/__tests__/conversation-error.test.ts +33 -2
  41. package/src/__tests__/conversation-fork-crud.test.ts +2 -6
  42. package/src/__tests__/conversation-history-web-search.test.ts +5 -0
  43. package/src/__tests__/conversation-load-history-repair.test.ts +5 -1
  44. package/src/__tests__/conversation-media-retry.test.ts +91 -0
  45. package/src/__tests__/conversation-starter-routes.test.ts +20 -11
  46. package/src/__tests__/conversation-store.test.ts +2 -6
  47. package/src/__tests__/conversation-usage.test.ts +2 -6
  48. package/src/__tests__/conversation-wipe.test.ts +11 -408
  49. package/src/__tests__/credential-execution-feature-gates.test.ts +3 -3
  50. package/src/__tests__/credential-execution-shell-lockdown.test.ts +2 -2
  51. package/src/__tests__/credential-security-e2e.test.ts +2 -0
  52. package/src/__tests__/followup-tools.test.ts +2 -6
  53. package/src/__tests__/graph-extraction-event-date.test.ts +186 -0
  54. package/src/__tests__/guardian-action-conversation-turn.test.ts +2 -6
  55. package/src/__tests__/guardian-action-followup-executor.test.ts +2 -6
  56. package/src/__tests__/guardian-action-followup-store.test.ts +2 -6
  57. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +2 -6
  58. package/src/__tests__/guardian-action-late-reply.test.ts +2 -6
  59. package/src/__tests__/guardian-action-store.test.ts +2 -6
  60. package/src/__tests__/guardian-binding-drift-heal.test.ts +2 -6
  61. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +8 -8
  62. package/src/__tests__/guardian-dispatch.test.ts +2 -6
  63. package/src/__tests__/guardian-grant-minting.test.ts +2 -14
  64. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +2 -6
  65. package/src/__tests__/guardian-routing-invariants.test.ts +192 -6
  66. package/src/__tests__/guardian-routing-state.test.ts +2 -6
  67. package/src/__tests__/guardian-verification-voice-binding.test.ts +2 -6
  68. package/src/__tests__/inbound-invite-redemption.test.ts +2 -6
  69. package/src/__tests__/injection-block.test.ts +154 -0
  70. package/src/__tests__/install-meta.test.ts +506 -0
  71. package/src/__tests__/install-skill-routing.test.ts +292 -0
  72. package/src/__tests__/invite-redemption-service.test.ts +2 -6
  73. package/src/__tests__/invite-routes-http.test.ts +2 -6
  74. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +2 -14
  75. package/src/__tests__/list-messages-attachments.test.ts +2 -6
  76. package/src/__tests__/llm-context-route-provider.test.ts +2 -6
  77. package/src/__tests__/llm-request-log-turn-query.test.ts +2 -6
  78. package/src/__tests__/llm-usage-store.test.ts +2 -6
  79. package/src/__tests__/log-export-workspace.test.ts +2 -6
  80. package/src/__tests__/managed-store.test.ts +38 -11
  81. package/src/__tests__/memory-jobs-worker-backoff.test.ts +2 -8
  82. package/src/__tests__/memory-recall-log-store.test.ts +2 -6
  83. package/src/__tests__/memory-upsert-concurrency.test.ts +4 -112
  84. package/src/__tests__/non-member-access-request.test.ts +2 -6
  85. package/src/__tests__/notification-guardian-path.test.ts +2 -6
  86. package/src/__tests__/oauth-cli.test.ts +364 -2
  87. package/src/__tests__/oauth2-gateway-transport.test.ts +18 -3
  88. package/src/__tests__/outlook-attachments.test.ts +301 -0
  89. package/src/__tests__/outlook-automation-tools.test.ts +425 -0
  90. package/src/__tests__/outlook-categories.test.ts +212 -0
  91. package/src/__tests__/outlook-client-automation.test.ts +246 -0
  92. package/src/__tests__/outlook-compose-tools.test.ts +325 -0
  93. package/src/__tests__/outlook-declutter-tools.test.ts +585 -0
  94. package/src/__tests__/outlook-email-watcher.test.ts +322 -0
  95. package/src/__tests__/outlook-follow-up.test.ts +196 -0
  96. package/src/__tests__/outlook-messaging-provider.test.ts +498 -3
  97. package/src/__tests__/outlook-trash.test.ts +77 -0
  98. package/src/__tests__/outlook-unsubscribe.test.ts +250 -0
  99. package/src/__tests__/platform-callback-registration.test.ts +4 -4
  100. package/src/__tests__/playbook-execution.test.ts +76 -80
  101. package/src/__tests__/playbook-tools.test.ts +5 -7
  102. package/src/__tests__/provider-error-scenarios.test.ts +21 -0
  103. package/src/__tests__/rebuild-index-graph-nodes.test.ts +273 -0
  104. package/src/__tests__/registry.test.ts +2 -2
  105. package/src/__tests__/require-fresh-approval.test.ts +64 -2
  106. package/src/__tests__/runtime-events-sse-parity.test.ts +2 -6
  107. package/src/__tests__/runtime-events-sse.test.ts +2 -6
  108. package/src/__tests__/schedule-store.test.ts +2 -6
  109. package/src/__tests__/schedule-tools.test.ts +2 -6
  110. package/src/__tests__/scheduler-recurrence.test.ts +1 -5
  111. package/src/__tests__/scoped-approval-grants.test.ts +2 -6
  112. package/src/__tests__/scoped-grant-security-matrix.test.ts +2 -6
  113. package/src/__tests__/search-skills-unified.test.ts +421 -0
  114. package/src/__tests__/secret-onetime-send.test.ts +2 -0
  115. package/src/__tests__/send-endpoint-busy.test.ts +2 -6
  116. package/src/__tests__/sequence-store.test.ts +2 -6
  117. package/src/__tests__/server-history-render.test.ts +2 -6
  118. package/src/__tests__/skill-feature-flags-integration.test.ts +38 -31
  119. package/src/__tests__/skill-feature-flags.test.ts +6 -6
  120. package/src/__tests__/skill-load-feature-flag.test.ts +11 -11
  121. package/src/__tests__/skill-memory.test.ts +140 -98
  122. package/src/__tests__/skills-uninstall.test.ts +2 -2
  123. package/src/__tests__/skills.test.ts +1 -1
  124. package/src/__tests__/slack-inbound-verification.test.ts +2 -6
  125. package/src/__tests__/task-compiler.test.ts +2 -6
  126. package/src/__tests__/task-management-tools.test.ts +2 -6
  127. package/src/__tests__/task-memory-cleanup.test.ts +173 -229
  128. package/src/__tests__/task-runner.test.ts +2 -6
  129. package/src/__tests__/task-scheduler.test.ts +2 -6
  130. package/src/__tests__/test-preload.ts +3 -0
  131. package/src/__tests__/tool-approval-handler.test.ts +2 -6
  132. package/src/__tests__/tool-grant-request-escalation.test.ts +2 -6
  133. package/src/__tests__/tool-side-effects-slack-dm.test.ts +276 -0
  134. package/src/__tests__/trust-store.test.ts +1 -1
  135. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +2 -6
  136. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +2 -6
  137. package/src/__tests__/trusted-contact-multichannel.test.ts +2 -6
  138. package/src/__tests__/trusted-contact-verification.test.ts +2 -6
  139. package/src/__tests__/turn-boundary-resolution.test.ts +2 -6
  140. package/src/__tests__/usage-cache-backfill-migration.test.ts +1 -6
  141. package/src/__tests__/usage-routes.test.ts +2 -6
  142. package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
  143. package/src/__tests__/voice-invite-redemption.test.ts +2 -6
  144. package/src/__tests__/voice-scoped-grant-consumer.test.ts +2 -6
  145. package/src/__tests__/voice-session-bridge.test.ts +2 -6
  146. package/src/__tests__/volume-security-guard.test.ts +2 -0
  147. package/src/__tests__/workspace-lifecycle.test.ts +29 -1
  148. package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +2 -6
  149. package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +2 -6
  150. package/src/__tests__/workspace-migration-026-backfill-install-meta.test.ts +558 -0
  151. package/src/__tests__/workspace-policy.test.ts +1 -1
  152. package/src/agent/attachments.ts +7 -2
  153. package/src/agent/image-optimize.ts +165 -0
  154. package/src/agent/loop.ts +1 -15
  155. package/src/bundler/app-compiler.ts +179 -2
  156. package/src/bundler/package-resolver.ts +3 -5
  157. package/src/cli/__tests__/notifications.test.ts +1 -2
  158. package/src/cli/cli-memory.ts +67 -64
  159. package/src/cli/commands/avatar.ts +3 -3
  160. package/src/cli/commands/config.ts +26 -13
  161. package/src/cli/commands/doctor.ts +2 -2
  162. package/src/cli/commands/memory.ts +41 -55
  163. package/src/cli/commands/oauth/__tests__/connect.test.ts +2 -2
  164. package/src/cli/commands/oauth/__tests__/disconnect.test.ts +2 -2
  165. package/src/cli/commands/oauth/__tests__/mode.test.ts +8 -1
  166. package/src/cli/commands/oauth/__tests__/status.test.ts +2 -2
  167. package/src/cli/commands/oauth/connect.ts +11 -6
  168. package/src/cli/commands/oauth/mode.ts +7 -0
  169. package/src/cli/commands/oauth/shared.ts +39 -3
  170. package/src/cli/commands/platform/__tests__/connect.test.ts +1 -1
  171. package/src/cli/commands/platform/__tests__/disconnect.test.ts +1 -1
  172. package/src/cli/commands/platform/__tests__/status.test.ts +5 -5
  173. package/src/cli/commands/platform/index.ts +16 -16
  174. package/src/cli/commands/skills.ts +88 -16
  175. package/src/cli/commands/trust.ts +2 -2
  176. package/src/cli/lib/daemon-credential-client.ts +2 -3
  177. package/src/config/bundled-skills/acp/TOOLS.json +1 -1
  178. package/src/config/bundled-skills/contacts/SKILL.md +0 -1
  179. package/src/config/bundled-skills/contacts/TOOLS.json +0 -8
  180. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -4
  181. package/src/config/bundled-skills/gmail/SKILL.md +2 -10
  182. package/src/config/bundled-skills/google-calendar/SKILL.md +1 -9
  183. package/src/config/bundled-skills/messaging/SKILL.md +10 -18
  184. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +40 -33
  185. package/src/config/bundled-skills/outlook/SKILL.md +189 -0
  186. package/src/config/bundled-skills/outlook/TOOLS.json +530 -0
  187. package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +85 -0
  188. package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +77 -0
  189. package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +84 -0
  190. package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +94 -0
  191. package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +49 -0
  192. package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +237 -0
  193. package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +161 -0
  194. package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +32 -0
  195. package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +272 -0
  196. package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +29 -0
  197. package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +129 -0
  198. package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +87 -0
  199. package/src/config/bundled-skills/outlook/tools/shared.ts +20 -0
  200. package/src/config/bundled-skills/outlook-calendar/SKILL.md +51 -0
  201. package/src/config/bundled-skills/outlook-calendar/TOOLS.json +221 -0
  202. package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +252 -0
  203. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +53 -0
  204. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +74 -0
  205. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +18 -0
  206. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +46 -0
  207. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +36 -0
  208. package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +17 -0
  209. package/src/config/bundled-skills/outlook-calendar/types.ts +120 -0
  210. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +47 -40
  211. package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +16 -29
  212. package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +16 -18
  213. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +39 -47
  214. package/src/config/bundled-skills/slack/SKILL.md +1 -7
  215. package/src/config/bundled-tool-registry.ts +56 -4
  216. package/src/config/env-registry.ts +15 -8
  217. package/src/config/feature-flag-registry.json +21 -124
  218. package/src/config/schemas/platform.ts +8 -0
  219. package/src/config/schemas/timeouts.ts +1 -1
  220. package/src/config/skills.ts +18 -7
  221. package/src/context/token-estimator.ts +25 -18
  222. package/src/context/window-manager.ts +6 -2
  223. package/src/credential-execution/process-manager.ts +3 -1
  224. package/src/daemon/context-overflow-reducer.ts +46 -2
  225. package/src/daemon/conversation-agent-loop-handlers.ts +123 -82
  226. package/src/daemon/conversation-agent-loop.ts +96 -61
  227. package/src/daemon/conversation-error.ts +31 -8
  228. package/src/daemon/conversation-lifecycle.ts +33 -0
  229. package/src/daemon/conversation-media-retry.ts +85 -7
  230. package/src/daemon/conversation-notifiers.ts +4 -1
  231. package/src/daemon/conversation-runtime-assembly.ts +5 -0
  232. package/src/daemon/conversation.ts +41 -2
  233. package/src/daemon/daemon-control.ts +8 -2
  234. package/src/daemon/handlers/shared.ts +22 -12
  235. package/src/daemon/handlers/skills.ts +416 -202
  236. package/src/daemon/lifecycle.ts +40 -1
  237. package/src/daemon/main.ts +5 -1
  238. package/src/daemon/message-types/conversations.ts +4 -1
  239. package/src/daemon/message-types/messages.ts +3 -1
  240. package/src/daemon/message-types/skills.ts +97 -36
  241. package/src/daemon/providers-setup.ts +5 -0
  242. package/src/daemon/server.ts +11 -2
  243. package/src/daemon/tool-side-effects.ts +27 -5
  244. package/src/heartbeat/heartbeat-service.ts +1 -0
  245. package/src/hooks/cli.ts +2 -2
  246. package/src/hooks/runner.ts +15 -38
  247. package/src/inbound/platform-callback-registration.ts +14 -14
  248. package/src/memory/admin.ts +11 -45
  249. package/src/memory/conversation-bootstrap.ts +2 -0
  250. package/src/memory/conversation-crud.ts +242 -348
  251. package/src/memory/conversation-group-migration.ts +157 -0
  252. package/src/memory/conversation-queries.ts +4 -2
  253. package/src/memory/db-init.ts +30 -3
  254. package/src/memory/embed.ts +73 -0
  255. package/src/memory/embedding-backend.ts +8 -14
  256. package/src/memory/embedding-runtime-manager.ts +12 -114
  257. package/src/memory/fingerprint.ts +2 -2
  258. package/src/memory/graph/bootstrap.ts +512 -0
  259. package/src/memory/graph/capability-seed.ts +297 -0
  260. package/src/memory/graph/consolidation.ts +691 -0
  261. package/src/memory/graph/conversation-graph-memory.ts +630 -0
  262. package/src/memory/graph/decay.test.ts +208 -0
  263. package/src/memory/graph/decay.ts +195 -0
  264. package/src/memory/graph/extraction-job.ts +69 -0
  265. package/src/memory/graph/extraction.test.ts +936 -0
  266. package/src/memory/graph/extraction.ts +1254 -0
  267. package/src/memory/graph/graph-search.ts +266 -0
  268. package/src/memory/graph/image-ref-utils.ts +29 -0
  269. package/src/memory/graph/injection.test.ts +513 -0
  270. package/src/memory/graph/injection.ts +439 -0
  271. package/src/memory/graph/inspect.ts +534 -0
  272. package/src/memory/graph/narrative.ts +267 -0
  273. package/src/memory/graph/pattern-scan.ts +269 -0
  274. package/src/memory/graph/retriever.ts +1008 -0
  275. package/src/memory/graph/scoring.test.ts +548 -0
  276. package/src/memory/graph/scoring.ts +232 -0
  277. package/src/memory/graph/serendipity.ts +65 -0
  278. package/src/memory/graph/store.test.ts +1050 -0
  279. package/src/memory/graph/store.ts +699 -0
  280. package/src/memory/graph/tool-handlers.ts +426 -0
  281. package/src/memory/graph/tools.ts +141 -0
  282. package/src/memory/graph/triggers.test.ts +487 -0
  283. package/src/memory/graph/triggers.ts +223 -0
  284. package/src/memory/graph/types.ts +271 -0
  285. package/src/memory/group-crud.ts +191 -0
  286. package/src/memory/indexer.ts +37 -19
  287. package/src/memory/job-handlers/cleanup.ts +0 -53
  288. package/src/memory/job-handlers/conversation-starters.ts +91 -53
  289. package/src/memory/job-handlers/embedding.ts +5 -31
  290. package/src/memory/job-handlers/index-maintenance.ts +23 -11
  291. package/src/memory/job-handlers/summarization.ts +32 -17
  292. package/src/memory/job-utils.ts +1 -1
  293. package/src/memory/jobs-store.ts +50 -70
  294. package/src/memory/jobs-worker.ts +147 -112
  295. package/src/memory/message-content.ts +1 -0
  296. package/src/memory/migrations/202-memory-graph-tables.ts +130 -0
  297. package/src/memory/migrations/203-drop-memory-items-tables.ts +23 -0
  298. package/src/memory/migrations/204-rename-memory-graph-type-values.ts +46 -0
  299. package/src/memory/migrations/205-memory-graph-image-refs.ts +11 -0
  300. package/src/memory/migrations/index.ts +4 -0
  301. package/src/memory/migrations/registry.ts +8 -0
  302. package/src/memory/qdrant-client.ts +44 -17
  303. package/src/memory/schema/index.ts +1 -0
  304. package/src/memory/schema/memory-graph.ts +139 -0
  305. package/src/memory/search/semantic.ts +47 -91
  306. package/src/memory/task-memory-cleanup.ts +28 -50
  307. package/src/messaging/providers/outlook/adapter.ts +8 -1
  308. package/src/messaging/providers/outlook/client.ts +299 -0
  309. package/src/messaging/providers/outlook/types.ts +118 -0
  310. package/src/notifications/adapters/macos.ts +1 -0
  311. package/src/notifications/copy-composer.ts +9 -0
  312. package/src/notifications/signal.ts +16 -0
  313. package/src/oauth/seed-providers.ts +2 -1
  314. package/src/permissions/checker.ts +24 -3
  315. package/src/permissions/defaults.ts +4 -4
  316. package/src/permissions/workspace-policy.ts +1 -1
  317. package/src/playbooks/playbook-compiler.ts +19 -18
  318. package/src/playbooks/types.ts +4 -3
  319. package/src/prompts/system-prompt.ts +3 -29
  320. package/src/providers/anthropic/client.ts +47 -19
  321. package/src/providers/gemini/client.ts +1 -1
  322. package/src/providers/openai/client.ts +1 -1
  323. package/src/providers/registry.ts +1 -1
  324. package/src/providers/retry.ts +19 -3
  325. package/src/runtime/actor-trust-resolver.ts +5 -1
  326. package/src/runtime/auth/route-policy.ts +7 -0
  327. package/src/runtime/guardian-reply-router.ts +5 -1
  328. package/src/runtime/http-server.ts +23 -3
  329. package/src/runtime/middleware/auth.ts +20 -0
  330. package/src/runtime/routes/attachment-routes.test.ts +106 -0
  331. package/src/runtime/routes/attachment-routes.ts +106 -16
  332. package/src/runtime/routes/brain-graph-routes.ts +21 -22
  333. package/src/runtime/routes/btw-routes.ts +8 -0
  334. package/src/runtime/routes/conversation-management-routes.ts +2 -0
  335. package/src/runtime/routes/conversation-starter-routes.ts +2 -2
  336. package/src/runtime/routes/debug-routes.ts +1 -1
  337. package/src/runtime/routes/global-search-routes.ts +21 -19
  338. package/src/runtime/routes/group-routes.ts +207 -0
  339. package/src/runtime/routes/guardian-action-routes.ts +21 -10
  340. package/src/runtime/routes/guardian-bootstrap-routes.ts +23 -19
  341. package/src/runtime/routes/inbound-message-handler.ts +19 -0
  342. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +292 -0
  343. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +207 -0
  344. package/src/runtime/routes/memory-item-routes.test.ts +2 -14
  345. package/src/runtime/routes/memory-item-routes.ts +341 -388
  346. package/src/runtime/routes/schedule-routes.ts +2 -0
  347. package/src/runtime/routes/skills-routes.ts +103 -37
  348. package/src/runtime/routes/work-items-routes.test.ts +2 -6
  349. package/src/schedule/scheduler.ts +8 -1
  350. package/src/security/oauth2.ts +1 -1
  351. package/src/security/secure-keys.ts +4 -8
  352. package/src/shared/provider-env-vars.ts +19 -0
  353. package/src/skills/catalog-cache.ts +5 -0
  354. package/src/skills/catalog-install.ts +15 -14
  355. package/src/skills/clawhub.ts +134 -154
  356. package/src/skills/install-meta.ts +208 -0
  357. package/src/skills/managed-store.ts +27 -16
  358. package/src/skills/skill-memory.ts +152 -77
  359. package/src/skills/skillssh-registry.ts +19 -17
  360. package/src/tasks/task-runner.ts +3 -1
  361. package/src/telemetry/usage-telemetry-reporter.test.ts +3 -5
  362. package/src/tools/browser/runtime-check.ts +3 -1
  363. package/src/tools/memory/register.ts +63 -46
  364. package/src/tools/permission-checker.ts +7 -1
  365. package/src/tools/shared/filesystem/image-read.ts +22 -85
  366. package/src/tools/terminal/safe-env.ts +1 -0
  367. package/src/tools/tool-manifest.ts +3 -3
  368. package/src/util/browser.ts +25 -10
  369. package/src/util/bun-runtime.ts +172 -0
  370. package/src/watcher/providers/outlook-calendar.ts +343 -0
  371. package/src/watcher/providers/outlook.ts +198 -0
  372. package/src/workspace/migrations/025-remove-oauth-app-setup-skills.ts +76 -0
  373. package/src/workspace/migrations/026-backfill-install-meta.ts +325 -0
  374. package/src/workspace/migrations/027-remove-orphaned-optimized-images-cache.ts +42 -0
  375. package/src/workspace/migrations/registry.ts +6 -0
  376. package/src/__tests__/context-memory-e2e.test.ts +0 -415
  377. package/src/__tests__/journal-context.test.ts +0 -268
  378. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +0 -297
  379. package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -459
  380. package/src/__tests__/memory-query-builder.test.ts +0 -59
  381. package/src/__tests__/memory-recall-quality.test.ts +0 -1046
  382. package/src/__tests__/memory-regressions.experimental.test.ts +0 -629
  383. package/src/__tests__/memory-regressions.test.ts +0 -3696
  384. package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -295
  385. package/src/daemon/conversation-memory.ts +0 -207
  386. package/src/memory/conversation-starters-cadence.ts +0 -74
  387. package/src/memory/items-extractor.ts +0 -860
  388. package/src/memory/job-handlers/batch-extraction.ts +0 -753
  389. package/src/memory/job-handlers/extraction.ts +0 -40
  390. package/src/memory/job-handlers/journal-carry-forward.test.ts +0 -355
  391. package/src/memory/job-handlers/journal-carry-forward.ts +0 -255
  392. package/src/memory/journal-memory.ts +0 -224
  393. package/src/memory/query-builder.ts +0 -47
  394. package/src/memory/query-expansion.ts +0 -83
  395. package/src/memory/retriever.test.ts +0 -1592
  396. package/src/memory/retriever.ts +0 -1331
  397. package/src/memory/search/formatting.test.ts +0 -140
  398. package/src/memory/search/formatting.ts +0 -262
  399. package/src/memory/search/mmr.ts +0 -139
  400. package/src/memory/search/ranking.ts +0 -15
  401. package/src/memory/search/staleness.ts +0 -40
  402. package/src/memory/search/tier-classifier.ts +0 -18
  403. package/src/memory/search/types.ts +0 -121
  404. package/src/prompts/journal-context.ts +0 -154
  405. package/src/tools/memory/definitions.ts +0 -69
  406. package/src/tools/memory/handlers.test.ts +0 -562
  407. package/src/tools/memory/handlers.ts +0 -434
@@ -1,459 +0,0 @@
1
- /**
2
- * Memory lifecycle E2E regression test.
3
- *
4
- * Verifies the new memory pipeline end-to-end:
5
- * - Standard-kind enum items (identity, preference, project, decision, constraint, event, journal, capability, ...)
6
- * - Supersession chains (supersedes/supersededBy fields)
7
- * - Hybrid search retrieval
8
- * - Two-layer XML injection format (<memory_context> with sections)
9
- * - Stripping removes <memory_context> tags
10
- * - No conflict gate references
11
- */
12
- import {
13
- afterAll,
14
- beforeAll,
15
- beforeEach,
16
- describe,
17
- expect,
18
- mock,
19
- test,
20
- } from "bun:test";
21
-
22
- import { DEFAULT_CONFIG } from "../config/defaults.js";
23
-
24
- mock.module("../util/logger.js", () => ({
25
- getLogger: () =>
26
- new Proxy({} as Record<string, unknown>, {
27
- get: () => () => {},
28
- }),
29
- }));
30
-
31
- // Stub the local embedding backend so the real ONNX model never loads
32
- mock.module("../memory/embedding-local.js", () => ({
33
- LocalEmbeddingBackend: class {
34
- readonly provider = "local" as const;
35
- readonly model: string;
36
- constructor(model: string) {
37
- this.model = model;
38
- }
39
- async embed(texts: string[]): Promise<number[][]> {
40
- return texts.map(() => new Array(384).fill(0));
41
- }
42
- },
43
- }));
44
-
45
- // Dynamic Qdrant mock: tests can push results to be returned by searchWithFilter/hybridSearch
46
- let mockQdrantResults: Array<{
47
- id: string;
48
- score: number;
49
- payload: Record<string, unknown>;
50
- }> = [];
51
-
52
- mock.module("../memory/qdrant-client.js", () => ({
53
- getQdrantClient: () => ({
54
- searchWithFilter: async () => mockQdrantResults,
55
- hybridSearch: async () => mockQdrantResults,
56
- upsertPoints: async () => {},
57
- deletePoints: async () => {},
58
- }),
59
- initQdrantClient: () => {},
60
- }));
61
-
62
- const TEST_CONFIG = {
63
- ...DEFAULT_CONFIG,
64
- memory: {
65
- ...DEFAULT_CONFIG.memory,
66
- embeddings: {
67
- ...DEFAULT_CONFIG.memory.embeddings,
68
- required: false,
69
- },
70
- extraction: {
71
- ...DEFAULT_CONFIG.memory.extraction,
72
- useLLM: false,
73
- },
74
- retrieval: {
75
- ...DEFAULT_CONFIG.memory.retrieval,
76
- maxInjectTokens: 900,
77
- },
78
- },
79
- };
80
-
81
- mock.module("../config/loader.js", () => ({
82
- loadConfig: () => TEST_CONFIG,
83
- getConfig: () => TEST_CONFIG,
84
- loadRawConfig: () => ({}),
85
- saveRawConfig: () => {},
86
- invalidateConfigCache: () => {},
87
- }));
88
-
89
- import { stripUserTextBlocksByPrefix } from "../daemon/conversation-runtime-assembly.js";
90
- import { getDb, initializeDb, resetDb } from "../memory/db.js";
91
- import {
92
- resetCleanupScheduleThrottle,
93
- resetStaleSweepThrottle,
94
- } from "../memory/jobs-worker.js";
95
- import {
96
- buildMemoryRecall,
97
- injectMemoryRecallAsUserBlock,
98
- } from "../memory/retriever.js";
99
- import {
100
- conversations,
101
- memoryItems,
102
- memoryItemSources,
103
- messages,
104
- } from "../memory/schema.js";
105
- import type { Message } from "../providers/types.js";
106
-
107
- describe("Memory lifecycle E2E regression", () => {
108
- beforeAll(() => {
109
- initializeDb();
110
- });
111
-
112
- beforeEach(() => {
113
- const db = getDb();
114
- db.run("DELETE FROM memory_item_sources");
115
- db.run("DELETE FROM memory_embeddings");
116
- db.run("DELETE FROM memory_items");
117
- db.run("DELETE FROM memory_segments");
118
- db.run("DELETE FROM messages");
119
- db.run("DELETE FROM conversations");
120
- db.run("DELETE FROM memory_jobs");
121
- db.run("DELETE FROM memory_checkpoints");
122
- mockQdrantResults = [];
123
- resetCleanupScheduleThrottle();
124
- resetStaleSweepThrottle();
125
- });
126
-
127
- afterAll(() => {
128
- resetDb();
129
- });
130
-
131
- test("extraction produces items with standard-kind enum and supersession chains form correctly", async () => {
132
- const db = getDb();
133
- const now = 1_701_100_000_000;
134
- const conversationId = "conv-memory-lifecycle";
135
-
136
- db.insert(conversations)
137
- .values({
138
- id: conversationId,
139
- title: null,
140
- createdAt: now,
141
- updatedAt: now,
142
- totalInputTokens: 0,
143
- totalOutputTokens: 0,
144
- totalEstimatedCost: 0,
145
- contextSummary: null,
146
- contextCompactedMessageCount: 0,
147
- contextCompactedAt: null,
148
- })
149
- .run();
150
-
151
- db.insert(messages)
152
- .values([
153
- {
154
- id: "msg-lifecycle-seed",
155
- conversationId,
156
- role: "user",
157
- content: JSON.stringify([
158
- {
159
- type: "text",
160
- text: "Atlas deployment notes mention Kubernetes infrastructure.",
161
- },
162
- ]),
163
- createdAt: now + 10,
164
- },
165
- ])
166
- .run();
167
-
168
- // Seed items using the standard-kind enum
169
- const kinds = [
170
- "identity",
171
- "preference",
172
- "project",
173
- "decision",
174
- "constraint",
175
- "event",
176
- ] as const;
177
- for (let i = 0; i < kinds.length; i++) {
178
- db.insert(memoryItems)
179
- .values({
180
- id: `item-kind-${kinds[i]}`,
181
- kind: kinds[i],
182
- subject: `${kinds[i]} test`,
183
- statement: `This is a ${kinds[i]} item for testing.`,
184
- status: "active",
185
- confidence: 0.9,
186
- importance: 0.8,
187
- fingerprint: `fp-item-kind-${kinds[i]}`,
188
- verificationState: "assistant_inferred",
189
- scopeId: "default",
190
- firstSeenAt: now + i,
191
- lastSeenAt: now + i,
192
- })
193
- .run();
194
-
195
- db.insert(memoryItemSources)
196
- .values({
197
- memoryItemId: `item-kind-${kinds[i]}`,
198
- messageId: "msg-lifecycle-seed",
199
- evidence: `${kinds[i]} evidence`,
200
- createdAt: now + i,
201
- })
202
- .run();
203
- }
204
-
205
- // Create a supersession chain: old decision superseded by new decision
206
- db.insert(memoryItems)
207
- .values({
208
- id: "item-old-decision",
209
- kind: "decision",
210
- subject: "deploy strategy",
211
- statement: "Deploy manually every Friday.",
212
- status: "superseded",
213
- confidence: 0.7,
214
- importance: 0.6,
215
- fingerprint: "fp-old-decision",
216
- verificationState: "assistant_inferred",
217
- scopeId: "default",
218
- firstSeenAt: now - 10_000,
219
- lastSeenAt: now - 10_000,
220
- supersededBy: "item-kind-decision",
221
- })
222
- .run();
223
-
224
- // Update the new decision to reference the old one
225
- db.run(
226
- `UPDATE memory_items SET supersedes = 'item-old-decision' WHERE id = 'item-kind-decision'`,
227
- );
228
-
229
- // Verify supersession chain is stored correctly
230
- const oldDecision = db
231
- .select()
232
- .from(memoryItems)
233
- .all()
234
- .find((i) => i.id === "item-old-decision");
235
- const newDecision = db
236
- .select()
237
- .from(memoryItems)
238
- .all()
239
- .find((i) => i.id === "item-kind-decision");
240
-
241
- expect(oldDecision).toBeDefined();
242
- expect(oldDecision!.status).toBe("superseded");
243
- expect(oldDecision!.supersededBy).toBe("item-kind-decision");
244
-
245
- expect(newDecision).toBeDefined();
246
- expect(newDecision!.status).toBe("active");
247
- expect(newDecision!.supersedes).toBe("item-old-decision");
248
- });
249
-
250
- test("recall completes with no injected memory when Qdrant returns empty", async () => {
251
- const db = getDb();
252
- const now = 1_701_100_000_000;
253
- const conversationId = "conv-recall-lifecycle";
254
-
255
- db.insert(conversations)
256
- .values({
257
- id: conversationId,
258
- title: null,
259
- createdAt: now,
260
- updatedAt: now,
261
- totalInputTokens: 0,
262
- totalOutputTokens: 0,
263
- totalEstimatedCost: 0,
264
- contextSummary: null,
265
- contextCompactedMessageCount: 0,
266
- contextCompactedAt: null,
267
- })
268
- .run();
269
-
270
- db.insert(messages)
271
- .values({
272
- id: "msg-recall-seed",
273
- conversationId,
274
- role: "user",
275
- content: JSON.stringify([
276
- {
277
- type: "text",
278
- text: "Atlas deployment notes mention Kubernetes infrastructure.",
279
- },
280
- ]),
281
- createdAt: now + 10,
282
- })
283
- .run();
284
-
285
- // Insert a segment (Qdrant is mocked empty, so this will not be recalled)
286
- db.run(`
287
- INSERT INTO memory_segments (
288
- id, message_id, conversation_id, role, segment_index, text, token_estimate, scope_id, created_at, updated_at
289
- ) VALUES (
290
- 'seg-recall-seed', 'msg-recall-seed', '${conversationId}', 'user', 0,
291
- 'Atlas deployment notes mention Kubernetes infrastructure.', 10, 'default',
292
- ${now + 10}, ${now + 10}
293
- )
294
- `);
295
-
296
- const recall = await buildMemoryRecall(
297
- "atlas deployment guidance",
298
- conversationId,
299
- TEST_CONFIG,
300
- );
301
-
302
- // Without semantic search (Qdrant mocked empty), no candidates pass
303
- // tier classification (threshold > 0.6).
304
- expect(recall.enabled).toBe(true);
305
- });
306
-
307
- test("two-layer XML injection format uses <memory_context> tags", async () => {
308
- const db = getDb();
309
- const now = 1_701_100_000_000;
310
- const conversationId = "conv-injection-format";
311
-
312
- db.insert(conversations)
313
- .values({
314
- id: conversationId,
315
- title: null,
316
- createdAt: now,
317
- updatedAt: now,
318
- totalInputTokens: 0,
319
- totalOutputTokens: 0,
320
- totalEstimatedCost: 0,
321
- contextSummary: null,
322
- contextCompactedMessageCount: 1,
323
- contextCompactedAt: null,
324
- })
325
- .run();
326
-
327
- db.insert(messages)
328
- .values({
329
- id: "msg-injection-seed",
330
- conversationId,
331
- role: "user",
332
- content: JSON.stringify([
333
- {
334
- type: "text",
335
- text: "My preferred timezone is America/Los_Angeles.",
336
- },
337
- ]),
338
- createdAt: now + 10,
339
- })
340
- .run();
341
-
342
- // Seed a memory item so the semantic search path can find it
343
- db.insert(memoryItems)
344
- .values({
345
- id: "item-timezone-pref",
346
- kind: "preference",
347
- subject: "timezone preference",
348
- statement: "My preferred timezone is America/Los_Angeles.",
349
- status: "active",
350
- confidence: 0.9,
351
- importance: 0.8,
352
- fingerprint: "fp-item-timezone-pref",
353
- firstSeenAt: now + 10,
354
- lastSeenAt: now + 10,
355
- })
356
- .run();
357
-
358
- db.insert(memoryItemSources)
359
- .values({
360
- memoryItemId: "item-timezone-pref",
361
- messageId: "msg-injection-seed",
362
- evidence: "timezone preference evidence",
363
- createdAt: now + 10,
364
- })
365
- .run();
366
-
367
- // Mock Qdrant to return the timezone preference item
368
- mockQdrantResults = [
369
- {
370
- id: "emb-timezone-pref",
371
- score: 0.92,
372
- payload: {
373
- target_type: "item",
374
- target_id: "item-timezone-pref",
375
- text: "My preferred timezone is America/Los_Angeles.",
376
- kind: "preference",
377
- status: "active",
378
- created_at: now + 10,
379
- last_seen_at: now + 10,
380
- },
381
- },
382
- ];
383
-
384
- const recall = await buildMemoryRecall(
385
- "timezone",
386
- conversationId,
387
- TEST_CONFIG,
388
- );
389
-
390
- expect(recall.enabled).toBe(true);
391
- expect(recall.injectedText.length).toBeGreaterThan(0);
392
- expect(recall.injectedTokens).toBeGreaterThan(0);
393
- expect(recall.injectedText).toContain("<memory_context __injected>");
394
- expect(recall.injectedText).toContain("</memory_context>");
395
- });
396
-
397
- test("stripping removes <memory_context> block from injected recall", () => {
398
- const memoryRecallText =
399
- "<memory_context __injected>\n\n<relevant_context>\nuser prefers concise answers\n</relevant_context>\n\n</memory_context>";
400
- const originalMessages: Message[] = [
401
- {
402
- role: "user",
403
- content: [{ type: "text" as const, text: "Actual user request" }],
404
- },
405
- ];
406
- const injected = injectMemoryRecallAsUserBlock(
407
- originalMessages,
408
- memoryRecallText,
409
- );
410
-
411
- // Memory context prepended to the last user message as a content block
412
- expect(injected).toHaveLength(1);
413
- expect(injected[0].role).toBe("user");
414
- expect(injected[0].content).toHaveLength(2);
415
- const b0 = injected[0].content[0];
416
- const b1 = injected[0].content[1];
417
- expect(b0.type === "text" && b0.text).toBe(memoryRecallText);
418
- expect(b1.type === "text" && b1.text).toBe("Actual user request");
419
-
420
- // Stripped by prefix-based stripping (same mechanism as workspace/temporal)
421
- const cleaned = stripUserTextBlocksByPrefix(injected, [
422
- "<memory_context __injected>",
423
- ]);
424
- expect(cleaned).toHaveLength(1);
425
- expect(cleaned[0].content).toHaveLength(1);
426
- const cb0 = cleaned[0].content[0];
427
- expect(cb0.type === "text" && cb0.text).toBe("Actual user request");
428
- });
429
-
430
- test("empty retrieval returns no injection", async () => {
431
- const db = getDb();
432
- const now = 1_701_100_000_000;
433
- const conversationId = "conv-empty-lifecycle";
434
-
435
- db.insert(conversations)
436
- .values({
437
- id: conversationId,
438
- title: null,
439
- createdAt: now,
440
- updatedAt: now,
441
- totalInputTokens: 0,
442
- totalOutputTokens: 0,
443
- totalEstimatedCost: 0,
444
- contextSummary: null,
445
- contextCompactedMessageCount: 0,
446
- contextCompactedAt: null,
447
- })
448
- .run();
449
-
450
- const recall = await buildMemoryRecall(
451
- "completely unrelated xyzzy topic",
452
- conversationId,
453
- TEST_CONFIG,
454
- );
455
-
456
- expect(recall.injectedText).toBe("");
457
- expect(recall.injectedTokens).toBe(0);
458
- });
459
- });
@@ -1,59 +0,0 @@
1
- import { describe, expect, test } from "bun:test";
2
-
3
- import { createContextSummaryMessage } from "../context/window-manager.js";
4
- import { buildMemoryQuery } from "../memory/query-builder.js";
5
- import type { Message } from "../providers/types.js";
6
-
7
- function userMessage(text: string): Message {
8
- return { role: "user", content: [{ type: "text", text }] };
9
- }
10
-
11
- describe("memory query builder", () => {
12
- test("builds deterministic user-request section when no summary exists", () => {
13
- const messages = [userMessage("hello")];
14
- const query = buildMemoryQuery("Need a memory recall query.", messages);
15
-
16
- expect(query).toBe("Need a memory recall query.");
17
- expect(query).not.toContain("Context summary:");
18
- });
19
-
20
- test("includes session summary section when summary context message exists", () => {
21
- const messages = [
22
- createContextSummaryMessage("## Goals\n- Keep tests deterministic"),
23
- userMessage("what did we decide?"),
24
- ];
25
- const query = buildMemoryQuery("Summarize decisions.", messages);
26
-
27
- expect(query).toContain("Summarize decisions.");
28
- expect(query).toContain("Context summary:");
29
- expect(query).toContain("Keep tests deterministic");
30
- expect(query).not.toContain("## User Request");
31
- expect(query).not.toContain("## Conversation Context Summary");
32
- });
33
-
34
- test("truncates oversized sections with deterministic marker", () => {
35
- const oversizedRequest = "r".repeat(400);
36
- const oversizedSummary = "s".repeat(500);
37
- const messages = [createContextSummaryMessage(oversizedSummary)];
38
-
39
- const query = buildMemoryQuery(oversizedRequest, messages, {
40
- maxUserRequestChars: 120,
41
- maxSessionSummaryChars: 120,
42
- });
43
-
44
- expect(query).toContain("<truncated />");
45
- expect(query).toContain("Context summary:");
46
- expect(query).not.toContain("## User Request");
47
- expect(query).not.toContain("## Conversation Context Summary");
48
- });
49
-
50
- test("returns stable output for identical inputs", () => {
51
- const messages = [
52
- createContextSummaryMessage("stable summary"),
53
- userMessage("latest"),
54
- ];
55
- const a = buildMemoryQuery("stable request", messages);
56
- const b = buildMemoryQuery("stable request", messages);
57
- expect(a).toBe(b);
58
- });
59
- });