vellum 0.2.1 → 0.2.7

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 (361) hide show
  1. package/README.md +15 -2
  2. package/bun.lock +71 -100
  3. package/package.json +5 -3
  4. package/scripts/capture-x-graphql.ts +562 -0
  5. package/scripts/ipc/check-swift-decoder-drift.ts +2 -1
  6. package/scripts/test.sh +5 -0
  7. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +133 -34
  8. package/src/__tests__/account-registry.test.ts +2 -1
  9. package/src/__tests__/agent-heartbeat-service.test.ts +250 -0
  10. package/src/__tests__/asset-materialize-tool.test.ts +16 -15
  11. package/src/__tests__/asset-search-tool.test.ts +23 -22
  12. package/src/__tests__/attachments-store.test.ts +56 -127
  13. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +5 -4
  14. package/src/__tests__/browser-skill-endstate.test.ts +4 -3
  15. package/src/__tests__/call-bridge.test.ts +385 -0
  16. package/src/__tests__/call-constants.test.ts +40 -0
  17. package/src/__tests__/call-orchestrator.test.ts +130 -4
  18. package/src/__tests__/call-recovery.test.ts +518 -0
  19. package/src/__tests__/call-routes-http.test.ts +459 -0
  20. package/src/__tests__/call-state-machine.test.ts +143 -0
  21. package/src/__tests__/call-store.test.ts +216 -1
  22. package/src/__tests__/cli-discover.test.ts +1 -1
  23. package/src/__tests__/commit-message-enrichment-service.test.ts +148 -7
  24. package/src/__tests__/compaction.benchmark.test.ts +176 -0
  25. package/src/__tests__/computer-use-tools.test.ts +250 -0
  26. package/src/__tests__/config-schema.test.ts +305 -3
  27. package/src/__tests__/conflict-store.test.ts +2 -1
  28. package/src/__tests__/contacts-tools.test.ts +331 -0
  29. package/src/__tests__/conversation-store.test.ts +30 -32
  30. package/src/__tests__/credential-security-invariants.test.ts +4 -0
  31. package/src/__tests__/date-context.test.ts +373 -0
  32. package/src/__tests__/db-schedule-syntax-migration.test.ts +129 -0
  33. package/src/__tests__/fixtures/media-reuse-fixtures.ts +3 -3
  34. package/src/__tests__/followup-tools.test.ts +303 -0
  35. package/src/__tests__/handlers-twilio-config.test.ts +221 -0
  36. package/src/__tests__/handlers-twitter-config.test.ts +718 -0
  37. package/src/__tests__/intent-routing.test.ts +64 -57
  38. package/src/__tests__/ipc-roundtrip.benchmark.test.ts +237 -0
  39. package/src/__tests__/ipc-snapshot.test.ts +71 -28
  40. package/src/__tests__/llm-usage-store.test.ts +3 -8
  41. package/src/__tests__/media-generate-image.test.ts +1 -1
  42. package/src/__tests__/media-reuse-story.e2e.test.ts +7 -7
  43. package/src/__tests__/memory-regressions.test.ts +100 -2
  44. package/src/__tests__/memory-retrieval.benchmark.test.ts +430 -0
  45. package/src/__tests__/parallel-tool.benchmark.test.ts +294 -0
  46. package/src/__tests__/playbook-tools.test.ts +342 -0
  47. package/src/__tests__/profile-compiler.test.ts +2 -1
  48. package/src/__tests__/provider-commit-message-generator.test.ts +303 -0
  49. package/src/__tests__/provider-streaming.benchmark.test.ts +773 -0
  50. package/src/__tests__/recurrence-engine-rruleset.test.ts +78 -0
  51. package/src/__tests__/recurrence-engine.test.ts +69 -0
  52. package/src/__tests__/recurrence-types.test.ts +71 -0
  53. package/src/__tests__/registry.test.ts +5 -3
  54. package/src/__tests__/relay-server.test.ts +633 -0
  55. package/src/__tests__/reminder-store.test.ts +6 -3
  56. package/src/__tests__/reminder.test.ts +43 -77
  57. package/src/__tests__/run-orchestrator-assistant-events.test.ts +8 -4
  58. package/src/__tests__/run-orchestrator.test.ts +4 -4
  59. package/src/__tests__/runtime-attachment-metadata.test.ts +7 -6
  60. package/src/__tests__/runtime-runs-http.test.ts +4 -4
  61. package/src/__tests__/runtime-runs.test.ts +4 -4
  62. package/src/__tests__/schedule-store.test.ts +482 -0
  63. package/src/__tests__/schedule-tools.test.ts +700 -0
  64. package/src/__tests__/scheduler-recurrence.test.ts +329 -0
  65. package/src/__tests__/server-history-render.test.ts +14 -13
  66. package/src/__tests__/session-conflict-gate.test.ts +28 -25
  67. package/src/__tests__/session-error.test.ts +28 -0
  68. package/src/__tests__/session-init.benchmark.test.ts +462 -0
  69. package/src/__tests__/session-queue.test.ts +71 -48
  70. package/src/__tests__/session-runtime-assembly.test.ts +161 -0
  71. package/src/__tests__/session-surfaces-task-progress.test.ts +104 -0
  72. package/src/__tests__/signup-e2e.test.ts +2 -1
  73. package/src/__tests__/skill-projection.benchmark.test.ts +328 -0
  74. package/src/__tests__/skill-script-runner.test.ts +159 -0
  75. package/src/__tests__/speaker-identification.test.ts +52 -0
  76. package/src/__tests__/subagent-manager-notify.test.ts +42 -10
  77. package/src/__tests__/subagent-tools.test.ts +141 -41
  78. package/src/__tests__/task-compiler.test.ts +2 -1
  79. package/src/__tests__/task-runner.test.ts +2 -1
  80. package/src/__tests__/task-scheduler.test.ts +2 -1
  81. package/src/__tests__/task-tools.test.ts +49 -56
  82. package/src/__tests__/tool-audit-listener.test.ts +1 -0
  83. package/src/__tests__/tool-domain-event-publisher.test.ts +2 -0
  84. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +500 -0
  85. package/src/__tests__/tool-executor.test.ts +13 -17
  86. package/src/__tests__/turn-commit.test.ts +218 -3
  87. package/src/__tests__/twilio-provider.test.ts +143 -0
  88. package/src/__tests__/twilio-routes.test.ts +789 -0
  89. package/src/__tests__/twitter-auth-handler.test.ts +581 -0
  90. package/src/__tests__/view-image-tool.test.ts +217 -0
  91. package/src/__tests__/workspace-git-service.test.ts +186 -0
  92. package/src/__tests__/workspace-heartbeat-service.test.ts +13 -3
  93. package/src/agent-heartbeat/agent-heartbeat-service.ts +155 -0
  94. package/src/bundler/app-bundler.ts +12 -8
  95. package/src/calls/__tests__/twilio-webhook-urls.test.ts +162 -0
  96. package/src/calls/call-bridge.ts +95 -0
  97. package/src/calls/call-constants.ts +43 -5
  98. package/src/calls/call-domain.ts +276 -0
  99. package/src/calls/call-orchestrator.ts +43 -17
  100. package/src/calls/call-recovery.ts +207 -0
  101. package/src/calls/call-state-machine.ts +68 -0
  102. package/src/calls/call-store.ts +192 -5
  103. package/src/calls/relay-server.ts +41 -4
  104. package/src/calls/speaker-identification.ts +213 -0
  105. package/src/calls/twilio-config.ts +8 -8
  106. package/src/calls/twilio-provider.ts +13 -9
  107. package/src/calls/twilio-routes.ts +90 -76
  108. package/src/calls/twilio-webhook-urls.ts +50 -0
  109. package/src/calls/types.ts +1 -1
  110. package/src/cli/config-commands.ts +334 -0
  111. package/src/cli/core-commands.ts +776 -0
  112. package/src/cli/doordash.ts +251 -1
  113. package/src/cli/ipc-client.ts +82 -0
  114. package/src/cli/map.ts +270 -0
  115. package/src/cli/twitter.ts +575 -0
  116. package/src/cli.ts +7 -5
  117. package/src/commands/__tests__/cc-command-registry.test.ts +319 -0
  118. package/src/commands/cc-command-registry.ts +209 -0
  119. package/src/config/bundled-skills/contacts/SKILL.md +39 -0
  120. package/src/config/bundled-skills/contacts/TOOLS.json +122 -0
  121. package/src/config/bundled-skills/contacts/tools/contact-merge.ts +9 -0
  122. package/src/config/bundled-skills/contacts/tools/contact-search.ts +9 -0
  123. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +9 -0
  124. package/src/config/bundled-skills/document/SKILL.md +18 -0
  125. package/src/config/bundled-skills/document/TOOLS.json +53 -0
  126. package/src/config/bundled-skills/document/tools/document-create.ts +9 -0
  127. package/src/config/bundled-skills/document/tools/document-update.ts +9 -0
  128. package/src/config/bundled-skills/doordash/SKILL.md +82 -23
  129. package/src/config/bundled-skills/followups/SKILL.md +32 -0
  130. package/src/config/bundled-skills/followups/TOOLS.json +100 -0
  131. package/src/config/bundled-skills/followups/tools/followup-create.ts +9 -0
  132. package/src/config/bundled-skills/followups/tools/followup-list.ts +9 -0
  133. package/src/config/bundled-skills/followups/tools/followup-resolve.ts +9 -0
  134. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +1 -23
  135. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +2 -1
  136. package/src/config/bundled-skills/playbooks/SKILL.md +31 -0
  137. package/src/config/bundled-skills/playbooks/TOOLS.json +126 -0
  138. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +9 -0
  139. package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +9 -0
  140. package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +9 -0
  141. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +9 -0
  142. package/src/config/bundled-skills/reminder/SKILL.md +20 -0
  143. package/src/config/bundled-skills/reminder/TOOLS.json +67 -0
  144. package/src/config/bundled-skills/reminder/tools/reminder-cancel.ts +9 -0
  145. package/src/config/bundled-skills/reminder/tools/reminder-create.ts +9 -0
  146. package/src/config/bundled-skills/reminder/tools/reminder-list.ts +9 -0
  147. package/src/config/bundled-skills/schedule/SKILL.md +74 -0
  148. package/src/config/bundled-skills/schedule/TOOLS.json +135 -0
  149. package/src/config/bundled-skills/schedule/tools/schedule-create.ts +9 -0
  150. package/src/config/bundled-skills/schedule/tools/schedule-delete.ts +9 -0
  151. package/src/config/bundled-skills/schedule/tools/schedule-list.ts +9 -0
  152. package/src/config/bundled-skills/schedule/tools/schedule-update.ts +9 -0
  153. package/src/config/bundled-skills/subagent/SKILL.md +25 -0
  154. package/src/config/bundled-skills/subagent/TOOLS.json +107 -0
  155. package/src/config/bundled-skills/subagent/tools/subagent-abort.ts +9 -0
  156. package/src/config/bundled-skills/subagent/tools/subagent-message.ts +9 -0
  157. package/src/config/bundled-skills/subagent/tools/subagent-read.ts +9 -0
  158. package/src/config/bundled-skills/subagent/tools/subagent-spawn.ts +9 -0
  159. package/src/config/bundled-skills/subagent/tools/subagent-status.ts +9 -0
  160. package/src/config/bundled-skills/tasks/SKILL.md +28 -0
  161. package/src/config/bundled-skills/tasks/TOOLS.json +256 -0
  162. package/src/config/bundled-skills/tasks/tools/task-delete.ts +9 -0
  163. package/src/config/bundled-skills/tasks/tools/task-list-add.ts +9 -0
  164. package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +9 -0
  165. package/src/config/bundled-skills/tasks/tools/task-list-show.ts +9 -0
  166. package/src/config/bundled-skills/tasks/tools/task-list-update.ts +9 -0
  167. package/src/config/bundled-skills/tasks/tools/task-list.ts +9 -0
  168. package/src/config/bundled-skills/tasks/tools/task-run.ts +9 -0
  169. package/src/config/bundled-skills/tasks/tools/task-save.ts +9 -0
  170. package/src/config/bundled-skills/twitter/SKILL.md +134 -0
  171. package/src/config/bundled-skills/watcher/SKILL.md +27 -0
  172. package/src/config/bundled-skills/watcher/TOOLS.json +147 -0
  173. package/src/config/bundled-skills/watcher/tools/watcher-create.ts +9 -0
  174. package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +9 -0
  175. package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +9 -0
  176. package/src/config/bundled-skills/watcher/tools/watcher-list.ts +9 -0
  177. package/src/config/bundled-skills/watcher/tools/watcher-update.ts +9 -0
  178. package/src/config/defaults.ts +34 -0
  179. package/src/config/loader.ts +4 -1
  180. package/src/config/schema.ts +165 -1
  181. package/src/config/system-prompt.ts +61 -16
  182. package/src/config/templates/IDENTITY.md +7 -0
  183. package/src/config/types.ts +4 -0
  184. package/src/config/vellum-skills/telegram-setup/SKILL.md +1 -5
  185. package/src/contacts/contact-store.ts +4 -4
  186. package/src/daemon/assistant-attachments.ts +10 -0
  187. package/src/daemon/classifier.ts +3 -1
  188. package/src/daemon/computer-use-session.ts +3 -1
  189. package/src/daemon/date-context.ts +136 -0
  190. package/src/daemon/handlers/apps.ts +16 -1
  191. package/src/daemon/handlers/browser.ts +54 -0
  192. package/src/daemon/handlers/computer-use.ts +7 -1
  193. package/src/daemon/handlers/config.ts +205 -5
  194. package/src/daemon/handlers/diagnostics.ts +5 -1
  195. package/src/daemon/handlers/documents.ts +18 -29
  196. package/src/daemon/handlers/home-base.ts +5 -1
  197. package/src/daemon/handlers/index.ts +40 -277
  198. package/src/daemon/handlers/misc.ts +9 -1
  199. package/src/daemon/handlers/publish.ts +6 -1
  200. package/src/daemon/handlers/sessions.ts +65 -12
  201. package/src/daemon/handlers/shared.ts +36 -1
  202. package/src/daemon/handlers/signing.ts +37 -0
  203. package/src/daemon/handlers/skills.ts +20 -6
  204. package/src/daemon/handlers/subagents.ts +8 -3
  205. package/src/daemon/handlers/twitter-auth.ts +169 -0
  206. package/src/daemon/handlers/work-items.ts +384 -68
  207. package/src/daemon/ipc-contract-inventory.json +32 -4
  208. package/src/daemon/ipc-contract.ts +156 -37
  209. package/src/daemon/ipc-protocol.ts +7 -2
  210. package/src/daemon/lifecycle.ts +21 -0
  211. package/src/daemon/main.ts +10 -4
  212. package/src/daemon/ride-shotgun-handler.ts +75 -10
  213. package/src/daemon/server.ts +143 -26
  214. package/src/daemon/session-agent-loop.ts +922 -0
  215. package/src/daemon/session-attachments.ts +28 -5
  216. package/src/daemon/session-conflict-gate.ts +18 -109
  217. package/src/daemon/session-error.ts +24 -3
  218. package/src/daemon/session-lifecycle.ts +147 -0
  219. package/src/daemon/session-media-retry.ts +147 -0
  220. package/src/daemon/session-messaging.ts +145 -0
  221. package/src/daemon/session-notifiers.ts +164 -0
  222. package/src/daemon/session-process.ts +2 -2
  223. package/src/daemon/session-queue-manager.ts +1 -0
  224. package/src/daemon/session-runtime-assembly.ts +52 -0
  225. package/src/daemon/session-skill-tools.ts +124 -5
  226. package/src/daemon/session-slash.ts +3 -0
  227. package/src/daemon/session-surfaces.ts +77 -2
  228. package/src/daemon/session-tool-setup.ts +216 -2
  229. package/src/daemon/session-usage.ts +0 -2
  230. package/src/daemon/session.ts +114 -1404
  231. package/src/daemon/video-thumbnail.ts +60 -0
  232. package/src/doordash/client.ts +121 -27
  233. package/src/doordash/queries.ts +1 -2
  234. package/src/export/formatter.ts +3 -1
  235. package/src/followups/followup-store.ts +4 -2
  236. package/src/followups/types.ts +6 -0
  237. package/src/hooks/templates.ts +1 -1
  238. package/src/index.ts +32 -1153
  239. package/src/memory/attachments-store.ts +28 -83
  240. package/src/memory/channel-delivery-store.ts +7 -21
  241. package/src/memory/clarification-resolver.ts +6 -5
  242. package/src/memory/conflict-intent.ts +114 -0
  243. package/src/memory/contradiction-checker.ts +3 -2
  244. package/src/memory/conversation-key-store.ts +10 -29
  245. package/src/memory/conversation-store.ts +2 -1
  246. package/src/memory/db.ts +96 -2
  247. package/src/memory/entity-extractor.ts +6 -3
  248. package/src/memory/items-extractor.ts +5 -4
  249. package/src/memory/job-handlers/conflict.ts +23 -1
  250. package/src/memory/jobs-store.ts +3 -2
  251. package/src/memory/llm-usage-store.ts +1 -2
  252. package/src/memory/runs-store.ts +1 -2
  253. package/src/memory/schema.ts +23 -2
  254. package/src/messaging/style-analyzer.ts +3 -2
  255. package/src/messaging/thread-summarizer.ts +8 -12
  256. package/src/messaging/triage-engine.ts +4 -2
  257. package/src/providers/openrouter/client.ts +20 -0
  258. package/src/providers/registry.ts +8 -0
  259. package/src/runtime/gateway-client.ts +36 -0
  260. package/src/runtime/http-server.ts +166 -22
  261. package/src/runtime/routes/attachment-routes.ts +2 -3
  262. package/src/runtime/routes/call-routes.ts +140 -0
  263. package/src/runtime/routes/channel-routes.ts +125 -88
  264. package/src/runtime/routes/conversation-routes.ts +5 -5
  265. package/src/runtime/routes/run-routes.ts +2 -2
  266. package/src/runtime/run-orchestrator.ts +9 -3
  267. package/src/schedule/recurrence-engine.ts +138 -0
  268. package/src/schedule/recurrence-types.ts +67 -0
  269. package/src/schedule/schedule-store.ts +102 -57
  270. package/src/schedule/scheduler.ts +9 -6
  271. package/src/security/oauth2.ts +29 -4
  272. package/src/security/secret-allowlist.ts +46 -0
  273. package/src/skills/clawhub.ts +1 -1
  274. package/src/subagent/manager.ts +40 -8
  275. package/src/swarm/backend-claude-code.ts +64 -9
  276. package/src/swarm/worker-prompts.ts +2 -1
  277. package/src/tasks/SPEC.md +34 -28
  278. package/src/tasks/ephemeral-permissions.ts +16 -7
  279. package/src/tasks/task-compiler.ts +5 -4
  280. package/src/tasks/task-runner.ts +10 -5
  281. package/src/tasks/task-scheduler.ts +1 -1
  282. package/src/tasks/tool-sanitizer.ts +36 -0
  283. package/src/tools/assets/search.ts +4 -4
  284. package/src/tools/browser/api-map.ts +293 -0
  285. package/src/tools/browser/auto-navigate.ts +270 -0
  286. package/src/tools/browser/browser-execution.ts +2 -1
  287. package/src/tools/browser/browser-manager.ts +2 -2
  288. package/src/tools/browser/network-recorder.ts +5 -4
  289. package/src/tools/browser/x-auto-navigate.ts +207 -0
  290. package/src/tools/calls/call-end.ts +17 -67
  291. package/src/tools/calls/call-start.ts +24 -85
  292. package/src/tools/calls/call-status.ts +35 -51
  293. package/src/tools/claude-code/claude-code.ts +207 -11
  294. package/src/tools/contacts/contact-merge.ts +46 -78
  295. package/src/tools/contacts/contact-search.ts +35 -79
  296. package/src/tools/contacts/contact-upsert.ts +35 -108
  297. package/src/tools/credentials/vault.ts +20 -4
  298. package/src/tools/document/document-tool.ts +71 -144
  299. package/src/tools/executor.ts +129 -10
  300. package/src/tools/followups/followup_create.ts +46 -88
  301. package/src/tools/followups/followup_list.ts +34 -74
  302. package/src/tools/followups/followup_resolve.ts +31 -66
  303. package/src/tools/host-terminal/cli-discover.ts +2 -1
  304. package/src/tools/host-terminal/host-shell.ts +10 -0
  305. package/src/tools/memory/handlers.ts +5 -4
  306. package/src/tools/network/__tests__/web-search.test.ts +427 -0
  307. package/src/tools/network/script-proxy/__tests__/logging.test.ts +248 -0
  308. package/src/tools/network/script-proxy/__tests__/policy.test.ts +234 -0
  309. package/src/tools/network/script-proxy/__tests__/router.test.ts +76 -0
  310. package/src/tools/network/web-fetch.ts +18 -6
  311. package/src/tools/playbooks/index.ts +4 -5
  312. package/src/tools/playbooks/playbook-create.ts +3 -47
  313. package/src/tools/playbooks/playbook-delete.ts +1 -25
  314. package/src/tools/playbooks/playbook-list.ts +1 -28
  315. package/src/tools/playbooks/playbook-update.ts +3 -51
  316. package/src/tools/reminder/reminder.ts +5 -78
  317. package/src/tools/schedule/create.ts +69 -74
  318. package/src/tools/schedule/delete.ts +21 -47
  319. package/src/tools/schedule/list.ts +55 -74
  320. package/src/tools/schedule/update.ts +77 -84
  321. package/src/tools/subagent/abort.ts +29 -58
  322. package/src/tools/subagent/message.ts +30 -63
  323. package/src/tools/subagent/read.ts +53 -84
  324. package/src/tools/subagent/spawn.ts +43 -82
  325. package/src/tools/subagent/status.ts +42 -71
  326. package/src/tools/swarm/delegate.ts +2 -1
  327. package/src/tools/tasks/index.ts +8 -8
  328. package/src/tools/tasks/task-delete.ts +60 -88
  329. package/src/tools/tasks/task-list.ts +31 -52
  330. package/src/tools/tasks/task-run.ts +72 -108
  331. package/src/tools/tasks/task-save.ts +33 -65
  332. package/src/tools/tasks/work-item-enqueue.ts +183 -215
  333. package/src/tools/tasks/work-item-list.ts +33 -63
  334. package/src/tools/tasks/work-item-remove.ts +45 -97
  335. package/src/tools/tasks/work-item-update.ts +91 -163
  336. package/src/tools/terminal/backends/native.ts +3 -1
  337. package/src/tools/tool-manifest.ts +0 -62
  338. package/src/tools/types.ts +6 -0
  339. package/src/tools/ui-surface/definitions.ts +3 -1
  340. package/src/tools/watch/screen-watch.ts +3 -1
  341. package/src/tools/watcher/create.ts +52 -98
  342. package/src/tools/watcher/delete.ts +20 -46
  343. package/src/tools/watcher/digest.ts +36 -70
  344. package/src/tools/watcher/list.ts +49 -79
  345. package/src/tools/watcher/update.ts +45 -91
  346. package/src/twitter/client.ts +690 -0
  347. package/src/twitter/session.ts +91 -0
  348. package/src/usage/types.ts +0 -1
  349. package/src/util/truncate.ts +6 -0
  350. package/src/watcher/providers/slack.ts +2 -1
  351. package/src/watcher/watcher-store.ts +3 -2
  352. package/src/work-items/work-item-store.ts +27 -2
  353. package/src/workspace/commit-message-enrichment-service.ts +31 -7
  354. package/src/workspace/git-service.ts +87 -22
  355. package/src/workspace/provider-commit-message-generator.ts +269 -0
  356. package/src/workspace/turn-commit.ts +62 -3
  357. package/src/tools/contacts/index.ts +0 -4
  358. package/src/tools/document/index.ts +0 -5
  359. package/src/tools/followups/index.ts +0 -3
  360. package/src/tools/subagent/index.ts +0 -5
  361. /package/src/__tests__/{memory-context-benchmark.test.ts → memory-context-benchmark.benchmark.test.ts} +0 -0
@@ -23,7 +23,7 @@ mock.module('../util/logger.js', () => ({
23
23
  }),
24
24
  }));
25
25
 
26
- import { initializeDb, getDb } from '../memory/db.js';
26
+ import { initializeDb, getDb, resetDb } from '../memory/db.js';
27
27
  import { recordUsageEvent, listUsageEvents } from '../memory/llm-usage-store.js';
28
28
  import type { UsageEventInput, PricingResult } from '../usage/types.js';
29
29
 
@@ -31,6 +31,7 @@ import type { UsageEventInput, PricingResult } from '../usage/types.js';
31
31
  initializeDb();
32
32
 
33
33
  afterAll(() => {
34
+ resetDb();
34
35
  try { rmSync(testDir, { recursive: true }); } catch { /* best effort */ }
35
36
  });
36
37
 
@@ -43,7 +44,6 @@ function makeInput(overrides?: Partial<UsageEventInput>): UsageEventInput {
43
44
  cacheCreationInputTokens: null,
44
45
  cacheReadInputTokens: null,
45
46
  actor: 'main_agent',
46
- assistantId: null,
47
47
  conversationId: null,
48
48
  runId: null,
49
49
  requestId: null,
@@ -86,7 +86,7 @@ describe('recordUsageEvent', () => {
86
86
  });
87
87
 
88
88
  test('persists a priced event that can be retrieved', () => {
89
- const input = makeInput({ assistantId: 'a1', conversationId: 'c1' });
89
+ const input = makeInput({ conversationId: 'c1' });
90
90
  const event = recordUsageEvent(input, pricedResult);
91
91
 
92
92
  const events = listUsageEvents();
@@ -94,7 +94,6 @@ describe('recordUsageEvent', () => {
94
94
  expect(events[0].id).toBe(event.id);
95
95
  expect(events[0].estimatedCostUsd).toBe(0.0045);
96
96
  expect(events[0].pricingStatus).toBe('priced');
97
- expect(events[0].assistantId).toBe('a1');
98
97
  expect(events[0].conversationId).toBe('c1');
99
98
  });
100
99
 
@@ -113,7 +112,6 @@ describe('recordUsageEvent', () => {
113
112
 
114
113
  test('handles null optional fields', () => {
115
114
  const input = makeInput({
116
- assistantId: null,
117
115
  conversationId: null,
118
116
  runId: null,
119
117
  requestId: null,
@@ -124,7 +122,6 @@ describe('recordUsageEvent', () => {
124
122
 
125
123
  const events = listUsageEvents();
126
124
  expect(events).toHaveLength(1);
127
- expect(events[0].assistantId).toBeNull();
128
125
  expect(events[0].conversationId).toBeNull();
129
126
  expect(events[0].runId).toBeNull();
130
127
  expect(events[0].requestId).toBeNull();
@@ -134,7 +131,6 @@ describe('recordUsageEvent', () => {
134
131
 
135
132
  test('handles populated optional fields', () => {
136
133
  const input = makeInput({
137
- assistantId: 'assistant-1',
138
134
  conversationId: 'conv-1',
139
135
  runId: 'run-1',
140
136
  requestId: 'req-1',
@@ -145,7 +141,6 @@ describe('recordUsageEvent', () => {
145
141
 
146
142
  const events = listUsageEvents();
147
143
  expect(events).toHaveLength(1);
148
- expect(events[0].assistantId).toBe('assistant-1');
149
144
  expect(events[0].conversationId).toBe('conv-1');
150
145
  expect(events[0].runId).toBe('run-1');
151
146
  expect(events[0].requestId).toBe('req-1');
@@ -232,7 +232,7 @@ describe('image-studio TOOLS.json manifest', () => {
232
232
  const props = manifest.tools[0].input_schema.properties;
233
233
  expect(props.mode.enum).toEqual(['generate', 'edit']);
234
234
  expect(props.attachment_ids.type).toBe('array');
235
- expect(props.model.enum).toEqual(['gemini-2.5-flash-image', 'gemini-3-pro-image']);
235
+ expect(props.model.enum).toEqual(['gemini-2.5-flash-image', 'gemini-3-pro-image', 'gemini-3-pro-image-preview']);
236
236
  expect(props.variants.type).toBe('number');
237
237
  });
238
238
  });
@@ -96,7 +96,7 @@ mock.module('../tools/network/script-proxy/certs.js', () => ({
96
96
  // Source imports (after mocks)
97
97
  // ---------------------------------------------------------------------------
98
98
 
99
- import { initializeDb, getDb } from '../memory/db.js';
99
+ import { initializeDb, getDb, resetDb } from '../memory/db.js';
100
100
  import { uploadAttachment, linkAttachmentToMessage } from '../memory/attachments-store.js';
101
101
  import { createConversation, addMessage } from '../memory/conversation-store.js';
102
102
  import { assetSearchTool, searchAttachments } from '../tools/assets/search.js';
@@ -114,6 +114,7 @@ initializeDb();
114
114
  mkdirSync(sandboxDir, { recursive: true });
115
115
 
116
116
  afterAll(async () => {
117
+ resetDb();
117
118
  await stopAllSessions();
118
119
  resolveByIdResults = new Map();
119
120
  secureKeyValues = new Map();
@@ -211,7 +212,7 @@ describe('Story E2E: selfie yesterday -> generated image today', () => {
211
212
 
212
213
  // -- Step 2: Selfie uploaded in Thread A (standard) --
213
214
  threadA = createConversation({ title: 'Thread A — selfie upload' });
214
- selfieAttachment = uploadAttachment('asst-story-01', 'selfie.png', 'image/png', TINY_PNG_BASE64);
215
+ selfieAttachment = uploadAttachment('selfie.png', 'image/png', TINY_PNG_BASE64);
215
216
  selfieId = selfieAttachment.id;
216
217
 
217
218
  const msgA = addMessage(threadA.id, 'user', 'Here is my selfie from yesterday');
@@ -358,7 +359,6 @@ describe('Story E2E: selfie yesterday -> generated image today', () => {
358
359
  // in the attachment store (same hash = returns existing row).
359
360
  const generatedImageBase64 = Buffer.from('generated-portrait-data-unique').toString('base64');
360
361
  const outputAttachment = uploadAttachment(
361
- 'asst-story-01',
362
362
  'generated-portrait.png',
363
363
  'image/png',
364
364
  generatedImageBase64,
@@ -473,7 +473,7 @@ describe('Private-thread variant: cross-thread media blocking', () => {
473
473
  test('selfie in private thread A is NOT discoverable via search from Thread B', async () => {
474
474
  // Upload selfie in a private thread
475
475
  const privateThread = createConversation({ title: 'Private selfie thread', threadType: 'private' });
476
- const selfie = uploadAttachment('asst-priv', 'private-selfie.png', 'image/png', TINY_PNG_BASE64);
476
+ const selfie = uploadAttachment('private-selfie.png', 'image/png', TINY_PNG_BASE64);
477
477
  const msg = addMessage(privateThread.id, 'user', 'My private selfie');
478
478
  linkAttachmentToMessage(msg.id, selfie.id, 0);
479
479
 
@@ -497,7 +497,7 @@ describe('Private-thread variant: cross-thread media blocking', () => {
497
497
  test('selfie in private thread A is NOT materializable from Thread B', async () => {
498
498
  const privateThread = createConversation({ title: 'Private selfie thread', threadType: 'private' });
499
499
  const base64 = Buffer.from('private image data').toString('base64');
500
- const selfie = uploadAttachment('asst-priv', 'private-selfie.png', 'image/png', base64);
500
+ const selfie = uploadAttachment('private-selfie.png', 'image/png', base64);
501
501
  const msg = addMessage(privateThread.id, 'user', 'My private selfie');
502
502
  linkAttachmentToMessage(msg.id, selfie.id, 0);
503
503
 
@@ -521,7 +521,7 @@ describe('Private-thread variant: cross-thread media blocking', () => {
521
521
 
522
522
  test('selfie in private thread IS accessible from the same private thread', async () => {
523
523
  const privateThread = createConversation({ title: 'Private selfie thread', threadType: 'private' });
524
- const selfie = uploadAttachment('asst-priv', 'private-selfie.png', 'image/png', TINY_PNG_BASE64);
524
+ const selfie = uploadAttachment('private-selfie.png', 'image/png', TINY_PNG_BASE64);
525
525
  const msg = addMessage(privateThread.id, 'user', 'My private selfie');
526
526
  linkAttachmentToMessage(msg.id, selfie.id, 0);
527
527
 
@@ -550,7 +550,7 @@ describe('Private-thread variant: cross-thread media blocking', () => {
550
550
 
551
551
  test('selfie in private thread A is NOT accessible from private thread B', async () => {
552
552
  const privateThreadA = createConversation({ title: 'Private thread A', threadType: 'private' });
553
- const selfie = uploadAttachment('asst-priv', 'thread-a-selfie.png', 'image/png', TINY_PNG_BASE64);
553
+ const selfie = uploadAttachment('thread-a-selfie.png', 'image/png', TINY_PNG_BASE64);
554
554
  const msgA = addMessage(privateThreadA.id, 'user', 'Selfie in thread A');
555
555
  linkAttachmentToMessage(msgA.id, selfie.id, 0);
556
556
 
@@ -949,7 +949,7 @@ describe('Memory regressions', () => {
949
949
  id: 'msg-conflicts-bg',
950
950
  conversationId: 'conv-conflicts-bg',
951
951
  role: 'user',
952
- content: JSON.stringify([{ type: 'text', text: 'Keep the new one instead.' }]),
952
+ content: JSON.stringify([{ type: 'text', text: 'Keep the new MySQL default instead.' }]),
953
953
  createdAt: now + 1,
954
954
  }).run();
955
955
 
@@ -1047,7 +1047,7 @@ describe('Memory regressions', () => {
1047
1047
  id: 'msg-conflicts-age',
1048
1048
  conversationId: 'conv-conflicts-age',
1049
1049
  role: 'user',
1050
- content: JSON.stringify([{ type: 'text', text: 'Keep the new one instead.' }]),
1050
+ content: JSON.stringify([{ type: 'text', text: 'Keep the new Bun runtime instead.' }]),
1051
1051
  createdAt: now + 1,
1052
1052
  }).run();
1053
1053
 
@@ -1118,6 +1118,104 @@ describe('Memory regressions', () => {
1118
1118
  }
1119
1119
  });
1120
1120
 
1121
+ test('background conflict resolver ignores clarification-like replies with no topical overlap when conflict was never asked', async () => {
1122
+ const db = getDb();
1123
+ const now = 1_700_001_400_000;
1124
+ const originalConflictsEnabled = TEST_CONFIG.memory.conflicts.enabled;
1125
+ TEST_CONFIG.memory.conflicts.enabled = true;
1126
+
1127
+ try {
1128
+ db.insert(conversations).values({
1129
+ id: 'conv-conflicts-unrelated',
1130
+ title: null,
1131
+ createdAt: now,
1132
+ updatedAt: now,
1133
+ totalInputTokens: 0,
1134
+ totalOutputTokens: 0,
1135
+ totalEstimatedCost: 0,
1136
+ contextSummary: null,
1137
+ contextCompactedMessageCount: 0,
1138
+ contextCompactedAt: null,
1139
+ }).run();
1140
+
1141
+ db.insert(messages).values({
1142
+ id: 'msg-conflicts-unrelated',
1143
+ conversationId: 'conv-conflicts-unrelated',
1144
+ role: 'user',
1145
+ content: JSON.stringify([{ type: 'text', text: 'Keep the new one instead.' }]),
1146
+ createdAt: now + 1,
1147
+ }).run();
1148
+
1149
+ db.insert(memoryItems).values([
1150
+ {
1151
+ id: 'item-conflict-existing-unrelated',
1152
+ kind: 'preference',
1153
+ subject: 'database',
1154
+ statement: 'Use Postgres by default.',
1155
+ status: 'active',
1156
+ confidence: 0.8,
1157
+ fingerprint: 'fp-conflict-existing-unrelated',
1158
+ verificationState: 'assistant_inferred',
1159
+ scopeId: 'scope-conflicts-unrelated',
1160
+ firstSeenAt: now - 10_000,
1161
+ lastSeenAt: now - 5_000,
1162
+ validFrom: now - 10_000,
1163
+ invalidAt: null,
1164
+ },
1165
+ {
1166
+ id: 'item-conflict-candidate-unrelated',
1167
+ kind: 'preference',
1168
+ subject: 'database',
1169
+ statement: 'Use MySQL by default.',
1170
+ status: 'pending_clarification',
1171
+ confidence: 0.8,
1172
+ fingerprint: 'fp-conflict-candidate-unrelated',
1173
+ verificationState: 'assistant_inferred',
1174
+ scopeId: 'scope-conflicts-unrelated',
1175
+ firstSeenAt: now - 9_000,
1176
+ lastSeenAt: now - 4_000,
1177
+ validFrom: now - 9_000,
1178
+ invalidAt: null,
1179
+ },
1180
+ ]).run();
1181
+
1182
+ const conflict = createOrUpdatePendingConflict({
1183
+ scopeId: 'scope-conflicts-unrelated',
1184
+ existingItemId: 'item-conflict-existing-unrelated',
1185
+ candidateItemId: 'item-conflict-candidate-unrelated',
1186
+ relationship: 'ambiguous_contradiction',
1187
+ });
1188
+ db.update(memoryItemConflicts)
1189
+ .set({ createdAt: now, updatedAt: now, lastAskedAt: null })
1190
+ .where(eq(memoryItemConflicts.id, conflict.id))
1191
+ .run();
1192
+
1193
+ enqueueResolvePendingConflictsForMessageJob('msg-conflicts-unrelated', 'scope-conflicts-unrelated');
1194
+ const processed = await runMemoryJobsOnce();
1195
+ expect(processed).toBe(1);
1196
+
1197
+ const existing = db
1198
+ .select()
1199
+ .from(memoryItems)
1200
+ .where(eq(memoryItems.id, 'item-conflict-existing-unrelated'))
1201
+ .get();
1202
+ const candidate = db
1203
+ .select()
1204
+ .from(memoryItems)
1205
+ .where(eq(memoryItems.id, 'item-conflict-candidate-unrelated'))
1206
+ .get();
1207
+ const updatedConflict = getConflictById(conflict.id);
1208
+
1209
+ expect(existing?.status).toBe('active');
1210
+ expect(existing?.invalidAt).toBeNull();
1211
+ expect(candidate?.status).toBe('pending_clarification');
1212
+ expect(updatedConflict?.status).toBe('pending_clarification');
1213
+ expect(updatedConflict?.resolutionNote).toBeNull();
1214
+ } finally {
1215
+ TEST_CONFIG.memory.conflicts.enabled = originalConflictsEnabled;
1216
+ }
1217
+ });
1218
+
1121
1219
  test('cleanup job enqueue is deduped and retention overrides upgrade payload', () => {
1122
1220
  const db = getDb();
1123
1221