vellum 0.2.0 → 0.2.2

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 +5 -2
  3. package/package.json +4 -2
  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 +161 -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__/app-bundler.test.ts +12 -33
  11. package/src/__tests__/asset-materialize-tool.test.ts +16 -15
  12. package/src/__tests__/asset-search-tool.test.ts +23 -22
  13. package/src/__tests__/attachments-store.test.ts +56 -127
  14. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +5 -4
  15. package/src/__tests__/browser-skill-endstate.test.ts +5 -8
  16. package/src/__tests__/call-bridge.test.ts +385 -0
  17. package/src/__tests__/call-constants.test.ts +40 -0
  18. package/src/__tests__/call-orchestrator.test.ts +454 -0
  19. package/src/__tests__/call-recovery.test.ts +518 -0
  20. package/src/__tests__/call-routes-http.test.ts +459 -0
  21. package/src/__tests__/call-state-machine.test.ts +143 -0
  22. package/src/__tests__/call-state.test.ts +133 -0
  23. package/src/__tests__/call-store.test.ts +691 -0
  24. package/src/__tests__/cli-discover.test.ts +1 -1
  25. package/src/__tests__/commit-message-enrichment-service.test.ts +550 -0
  26. package/src/__tests__/compaction.benchmark.test.ts +176 -0
  27. package/src/__tests__/computer-use-tools.test.ts +250 -0
  28. package/src/__tests__/config-schema.test.ts +348 -3
  29. package/src/__tests__/conflict-store.test.ts +2 -1
  30. package/src/__tests__/contacts-tools.test.ts +331 -0
  31. package/src/__tests__/conversation-store.test.ts +30 -32
  32. package/src/__tests__/credential-security-invariants.test.ts +4 -0
  33. package/src/__tests__/date-context.test.ts +373 -0
  34. package/src/__tests__/db-schedule-syntax-migration.test.ts +129 -0
  35. package/src/__tests__/doordash-session.test.ts +9 -0
  36. package/src/__tests__/fixtures/media-reuse-fixtures.ts +3 -3
  37. package/src/__tests__/followup-tools.test.ts +303 -0
  38. package/src/__tests__/handlers-twitter-config.test.ts +718 -0
  39. package/src/__tests__/intent-routing.test.ts +64 -57
  40. package/src/__tests__/ipc-roundtrip.benchmark.test.ts +237 -0
  41. package/src/__tests__/ipc-snapshot.test.ts +96 -28
  42. package/src/__tests__/llm-usage-store.test.ts +3 -8
  43. package/src/__tests__/media-generate-image.test.ts +1 -1
  44. package/src/__tests__/media-reuse-story.e2e.test.ts +7 -7
  45. package/src/__tests__/memory-retrieval.benchmark.test.ts +430 -0
  46. package/src/__tests__/parallel-tool.benchmark.test.ts +294 -0
  47. package/src/__tests__/playbook-tools.test.ts +342 -0
  48. package/src/__tests__/profile-compiler.test.ts +2 -1
  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 +17 -10
  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 +222 -0
  58. package/src/__tests__/run-orchestrator.test.ts +7 -7
  59. package/src/__tests__/runtime-attachment-metadata.test.ts +19 -20
  60. package/src/__tests__/runtime-runs-http.test.ts +5 -23
  61. package/src/__tests__/runtime-runs.test.ts +11 -11
  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-error.test.ts +28 -0
  67. package/src/__tests__/session-init.benchmark.test.ts +462 -0
  68. package/src/__tests__/session-queue.test.ts +89 -16
  69. package/src/__tests__/session-runtime-assembly.test.ts +161 -0
  70. package/src/__tests__/session-surfaces-task-progress.test.ts +104 -0
  71. package/src/__tests__/signup-e2e.test.ts +2 -1
  72. package/src/__tests__/skill-projection.benchmark.test.ts +328 -0
  73. package/src/__tests__/skill-script-runner.test.ts +159 -0
  74. package/src/__tests__/speaker-identification.test.ts +52 -0
  75. package/src/__tests__/subagent-manager-notify.test.ts +42 -10
  76. package/src/__tests__/subagent-tools.test.ts +141 -41
  77. package/src/__tests__/task-compiler.test.ts +2 -1
  78. package/src/__tests__/task-runner.test.ts +2 -1
  79. package/src/__tests__/task-scheduler.test.ts +2 -1
  80. package/src/__tests__/task-tools.test.ts +49 -56
  81. package/src/__tests__/tool-audit-listener.test.ts +1 -0
  82. package/src/__tests__/tool-domain-event-publisher.test.ts +2 -0
  83. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +500 -0
  84. package/src/__tests__/tool-executor.test.ts +13 -17
  85. package/src/__tests__/turn-commit.test.ts +273 -2
  86. package/src/__tests__/twilio-provider.test.ts +143 -0
  87. package/src/__tests__/twilio-routes.test.ts +789 -0
  88. package/src/__tests__/twitter-auth-handler.test.ts +581 -0
  89. package/src/__tests__/view-image-tool.test.ts +217 -0
  90. package/src/__tests__/workspace-git-service.test.ts +403 -0
  91. package/src/__tests__/workspace-heartbeat-service.test.ts +141 -2
  92. package/src/agent-heartbeat/agent-heartbeat-service.ts +155 -0
  93. package/src/bundler/app-bundler.ts +35 -14
  94. package/src/calls/call-bridge.ts +95 -0
  95. package/src/calls/call-constants.ts +48 -0
  96. package/src/calls/call-domain.ts +276 -0
  97. package/src/calls/call-orchestrator.ts +390 -0
  98. package/src/calls/call-recovery.ts +207 -0
  99. package/src/calls/call-state-machine.ts +68 -0
  100. package/src/calls/call-state.ts +64 -0
  101. package/src/calls/call-store.ts +416 -0
  102. package/src/calls/relay-server.ts +335 -0
  103. package/src/calls/speaker-identification.ts +213 -0
  104. package/src/calls/twilio-config.ts +34 -0
  105. package/src/calls/twilio-provider.ts +173 -0
  106. package/src/calls/twilio-routes.ts +250 -0
  107. package/src/calls/types.ts +37 -0
  108. package/src/calls/voice-provider.ts +14 -0
  109. package/src/cli/config-commands.ts +334 -0
  110. package/src/cli/core-commands.ts +776 -0
  111. package/src/cli/doordash.ts +256 -25
  112. package/src/cli/ipc-client.ts +82 -0
  113. package/src/cli/map.ts +246 -0
  114. package/src/cli/twitter.ts +575 -0
  115. package/src/cli.ts +7 -5
  116. package/src/commands/__tests__/cc-command-registry.test.ts +319 -0
  117. package/src/commands/cc-command-registry.ts +209 -0
  118. package/src/config/bundled-skills/contacts/SKILL.md +39 -0
  119. package/src/config/bundled-skills/contacts/TOOLS.json +122 -0
  120. package/src/config/bundled-skills/contacts/tools/contact-merge.ts +9 -0
  121. package/src/config/bundled-skills/contacts/tools/contact-search.ts +9 -0
  122. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +9 -0
  123. package/src/config/bundled-skills/document/SKILL.md +18 -0
  124. package/src/config/bundled-skills/document/TOOLS.json +53 -0
  125. package/src/config/bundled-skills/document/tools/document-create.ts +9 -0
  126. package/src/config/bundled-skills/document/tools/document-update.ts +9 -0
  127. package/src/config/bundled-skills/doordash/SKILL.md +163 -0
  128. package/src/config/bundled-skills/followups/SKILL.md +32 -0
  129. package/src/config/bundled-skills/followups/TOOLS.json +100 -0
  130. package/src/config/bundled-skills/followups/tools/followup-create.ts +9 -0
  131. package/src/config/bundled-skills/followups/tools/followup-list.ts +9 -0
  132. package/src/config/bundled-skills/followups/tools/followup-resolve.ts +9 -0
  133. package/src/config/bundled-skills/image-studio/TOOLS.json +2 -2
  134. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -24
  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 +44 -0
  179. package/src/config/loader.ts +4 -1
  180. package/src/config/schema.ts +218 -1
  181. package/src/config/system-prompt.ts +100 -6
  182. package/src/config/templates/IDENTITY.md +7 -0
  183. package/src/config/types.ts +5 -0
  184. package/src/contacts/contact-store.ts +4 -4
  185. package/src/daemon/assistant-attachments.ts +10 -0
  186. package/src/daemon/classifier.ts +3 -1
  187. package/src/daemon/computer-use-session.ts +3 -1
  188. package/src/daemon/date-context.ts +136 -0
  189. package/src/daemon/handlers/apps.ts +16 -1
  190. package/src/daemon/handlers/browser.ts +54 -0
  191. package/src/daemon/handlers/computer-use.ts +7 -1
  192. package/src/daemon/handlers/config.ts +192 -4
  193. package/src/daemon/handlers/diagnostics.ts +5 -1
  194. package/src/daemon/handlers/documents.ts +18 -29
  195. package/src/daemon/handlers/home-base.ts +5 -1
  196. package/src/daemon/handlers/index.ts +40 -271
  197. package/src/daemon/handlers/misc.ts +9 -1
  198. package/src/daemon/handlers/publish.ts +6 -1
  199. package/src/daemon/handlers/sessions.ts +65 -12
  200. package/src/daemon/handlers/shared.ts +36 -1
  201. package/src/daemon/handlers/signing.ts +37 -0
  202. package/src/daemon/handlers/skills.ts +20 -6
  203. package/src/daemon/handlers/subagents.ts +8 -3
  204. package/src/daemon/handlers/twitter-auth.ts +169 -0
  205. package/src/daemon/handlers/work-items.ts +495 -39
  206. package/src/daemon/ipc-contract-inventory.json +40 -4
  207. package/src/daemon/ipc-contract.ts +185 -37
  208. package/src/daemon/ipc-protocol.ts +7 -2
  209. package/src/daemon/lifecycle.ts +48 -5
  210. package/src/daemon/main.ts +10 -4
  211. package/src/daemon/ride-shotgun-handler.ts +74 -10
  212. package/src/daemon/server.ts +144 -29
  213. package/src/daemon/session-agent-loop.ts +887 -0
  214. package/src/daemon/session-attachments.ts +28 -5
  215. package/src/daemon/session-error.ts +24 -3
  216. package/src/daemon/session-lifecycle.ts +147 -0
  217. package/src/daemon/session-media-retry.ts +147 -0
  218. package/src/daemon/session-messaging.ts +145 -0
  219. package/src/daemon/session-notifiers.ts +164 -0
  220. package/src/daemon/session-process.ts +2 -2
  221. package/src/daemon/session-queue-manager.ts +1 -0
  222. package/src/daemon/session-runtime-assembly.ts +52 -0
  223. package/src/daemon/session-skill-tools.ts +124 -5
  224. package/src/daemon/session-slash.ts +3 -0
  225. package/src/daemon/session-surfaces.ts +77 -2
  226. package/src/daemon/session-tool-setup.ts +222 -2
  227. package/src/daemon/session-usage.ts +0 -2
  228. package/src/daemon/session.ts +114 -1365
  229. package/src/daemon/video-thumbnail.ts +60 -0
  230. package/src/doordash/client.ts +121 -27
  231. package/src/doordash/queries.ts +1 -2
  232. package/src/export/formatter.ts +3 -1
  233. package/src/followups/followup-store.ts +4 -2
  234. package/src/followups/types.ts +6 -0
  235. package/src/hooks/templates.ts +1 -1
  236. package/src/index.ts +32 -1151
  237. package/src/media/gemini-image-service.ts +1 -1
  238. package/src/memory/attachments-store.ts +28 -83
  239. package/src/memory/channel-delivery-store.ts +7 -21
  240. package/src/memory/clarification-resolver.ts +6 -5
  241. package/src/memory/contradiction-checker.ts +3 -2
  242. package/src/memory/conversation-key-store.ts +10 -29
  243. package/src/memory/conversation-store.ts +2 -1
  244. package/src/memory/db.ts +362 -2
  245. package/src/memory/entity-extractor.ts +6 -3
  246. package/src/memory/items-extractor.ts +5 -4
  247. package/src/memory/jobs-store.ts +3 -2
  248. package/src/memory/llm-usage-store.ts +1 -2
  249. package/src/memory/runs-store.ts +1 -2
  250. package/src/memory/schema.ts +65 -2
  251. package/src/messaging/style-analyzer.ts +3 -2
  252. package/src/messaging/thread-summarizer.ts +8 -12
  253. package/src/messaging/triage-engine.ts +4 -2
  254. package/src/providers/openrouter/client.ts +20 -0
  255. package/src/providers/registry.ts +8 -0
  256. package/src/runtime/http-server.ts +277 -25
  257. package/src/runtime/http-types.ts +0 -2
  258. package/src/runtime/routes/attachment-routes.ts +5 -6
  259. package/src/runtime/routes/call-routes.ts +140 -0
  260. package/src/runtime/routes/channel-routes.ts +12 -19
  261. package/src/runtime/routes/conversation-routes.ts +5 -9
  262. package/src/runtime/routes/run-routes.ts +4 -8
  263. package/src/runtime/run-orchestrator.ts +39 -6
  264. package/src/schedule/recurrence-engine.ts +138 -0
  265. package/src/schedule/recurrence-types.ts +67 -0
  266. package/src/schedule/schedule-store.ts +102 -57
  267. package/src/schedule/scheduler.ts +9 -6
  268. package/src/security/oauth2.ts +29 -4
  269. package/src/security/secret-allowlist.ts +46 -0
  270. package/src/skills/clawhub.ts +1 -1
  271. package/src/subagent/manager.ts +40 -8
  272. package/src/swarm/backend-claude-code.ts +64 -9
  273. package/src/swarm/worker-prompts.ts +2 -1
  274. package/src/tasks/SPEC.md +34 -28
  275. package/src/tasks/ephemeral-permissions.ts +16 -7
  276. package/src/tasks/task-compiler.ts +5 -4
  277. package/src/tasks/task-runner.ts +10 -5
  278. package/src/tasks/task-scheduler.ts +1 -1
  279. package/src/tasks/tool-sanitizer.ts +36 -0
  280. package/src/tools/assets/search.ts +4 -4
  281. package/src/tools/browser/api-map.ts +220 -0
  282. package/src/tools/browser/auto-navigate.ts +270 -0
  283. package/src/tools/browser/browser-execution.ts +2 -1
  284. package/src/tools/browser/browser-manager.ts +2 -2
  285. package/src/tools/browser/network-recorder.ts +5 -4
  286. package/src/tools/browser/x-auto-navigate.ts +207 -0
  287. package/src/tools/calls/call-end.ts +67 -0
  288. package/src/tools/calls/call-start.ts +73 -0
  289. package/src/tools/calls/call-status.ts +81 -0
  290. package/src/tools/claude-code/claude-code.ts +77 -11
  291. package/src/tools/contacts/contact-merge.ts +46 -78
  292. package/src/tools/contacts/contact-search.ts +35 -79
  293. package/src/tools/contacts/contact-upsert.ts +35 -108
  294. package/src/tools/credentials/vault.ts +21 -5
  295. package/src/tools/document/document-tool.ts +71 -144
  296. package/src/tools/executor.ts +129 -10
  297. package/src/tools/followups/followup_create.ts +46 -88
  298. package/src/tools/followups/followup_list.ts +34 -74
  299. package/src/tools/followups/followup_resolve.ts +31 -66
  300. package/src/tools/host-terminal/cli-discover.ts +2 -1
  301. package/src/tools/host-terminal/host-shell.ts +10 -0
  302. package/src/tools/memory/handlers.ts +5 -4
  303. package/src/tools/network/__tests__/web-search.test.ts +427 -0
  304. package/src/tools/network/script-proxy/__tests__/logging.test.ts +248 -0
  305. package/src/tools/network/script-proxy/__tests__/policy.test.ts +234 -0
  306. package/src/tools/network/script-proxy/__tests__/router.test.ts +76 -0
  307. package/src/tools/network/web-fetch.ts +18 -6
  308. package/src/tools/playbooks/index.ts +4 -5
  309. package/src/tools/playbooks/playbook-create.ts +3 -47
  310. package/src/tools/playbooks/playbook-delete.ts +1 -25
  311. package/src/tools/playbooks/playbook-list.ts +1 -28
  312. package/src/tools/playbooks/playbook-update.ts +3 -51
  313. package/src/tools/registry.ts +2 -4
  314. package/src/tools/reminder/reminder.ts +5 -78
  315. package/src/tools/schedule/create.ts +69 -74
  316. package/src/tools/schedule/delete.ts +21 -47
  317. package/src/tools/schedule/list.ts +55 -74
  318. package/src/tools/schedule/update.ts +77 -84
  319. package/src/tools/subagent/abort.ts +29 -58
  320. package/src/tools/subagent/message.ts +30 -63
  321. package/src/tools/subagent/read.ts +53 -84
  322. package/src/tools/subagent/spawn.ts +43 -82
  323. package/src/tools/subagent/status.ts +42 -71
  324. package/src/tools/swarm/delegate.ts +2 -1
  325. package/src/tools/tasks/index.ts +8 -6
  326. package/src/tools/tasks/task-delete.ts +69 -56
  327. package/src/tools/tasks/task-list.ts +31 -52
  328. package/src/tools/tasks/task-run.ts +74 -102
  329. package/src/tools/tasks/task-save.ts +33 -65
  330. package/src/tools/tasks/work-item-enqueue.ts +192 -134
  331. package/src/tools/tasks/work-item-list.ts +33 -78
  332. package/src/tools/tasks/work-item-remove.ts +60 -0
  333. package/src/tools/tasks/work-item-update.ts +114 -0
  334. package/src/tools/terminal/backends/native.ts +3 -1
  335. package/src/tools/tool-manifest.ts +20 -74
  336. package/src/tools/types.ts +6 -0
  337. package/src/tools/ui-surface/definitions.ts +6 -1
  338. package/src/tools/watch/screen-watch.ts +3 -1
  339. package/src/tools/watcher/create.ts +52 -98
  340. package/src/tools/watcher/delete.ts +20 -46
  341. package/src/tools/watcher/digest.ts +36 -70
  342. package/src/tools/watcher/list.ts +49 -79
  343. package/src/tools/watcher/update.ts +45 -91
  344. package/src/twitter/client.ts +690 -0
  345. package/src/twitter/session.ts +91 -0
  346. package/src/usage/types.ts +0 -1
  347. package/src/util/truncate.ts +6 -0
  348. package/src/watcher/providers/slack.ts +2 -1
  349. package/src/watcher/watcher-store.ts +3 -2
  350. package/src/work-items/work-item-store.ts +236 -2
  351. package/src/workspace/commit-message-enrichment-service.ts +284 -0
  352. package/src/workspace/commit-message-provider.ts +95 -0
  353. package/src/workspace/git-service.ts +272 -52
  354. package/src/workspace/heartbeat-service.ts +70 -13
  355. package/src/workspace/provider-commit-message-generator.ts +242 -0
  356. package/src/workspace/turn-commit.ts +100 -51
  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
@@ -34,20 +34,21 @@ mock.module('./indexer.js', () => ({
34
34
  }));
35
35
 
36
36
  import type { Database } from 'bun:sqlite';
37
- import { initializeDb, getDb } from '../memory/db.js';
37
+ import { initializeDb, getDb, resetDb } from '../memory/db.js';
38
38
  import { createTask, createTaskRun } from '../tasks/task-store.js';
39
39
  import { createWorkItem } from '../work-items/work-item-store.js';
40
- import { taskSaveTool } from '../tools/tasks/task-save.js';
41
- import { taskRunTool } from '../tools/tasks/task-run.js';
42
- import { taskListTool } from '../tools/tasks/task-list.js';
43
- import { taskListShowTool } from '../tools/tasks/work-item-list.js';
44
- import { taskListAddTool } from '../tools/tasks/work-item-enqueue.js';
45
- import { taskDeleteTool } from '../tools/tasks/task-delete.js';
40
+ import { executeTaskSave } from '../tools/tasks/task-save.js';
41
+ import { executeTaskRun } from '../tools/tasks/task-run.js';
42
+ import { executeTaskList } from '../tools/tasks/task-list.js';
43
+ import { executeTaskListShow } from '../tools/tasks/work-item-list.js';
44
+ import { executeTaskListAdd } from '../tools/tasks/work-item-enqueue.js';
45
+ import { executeTaskDelete } from '../tools/tasks/task-delete.js';
46
46
  import type { ToolContext } from '../tools/types.js';
47
47
 
48
48
  initializeDb();
49
49
 
50
50
  afterAll(() => {
51
+ resetDb();
51
52
  try { rmSync(testDir, { recursive: true }); } catch { /* best effort */ }
52
53
  });
53
54
 
@@ -104,7 +105,7 @@ describe('task_save tool', () => {
104
105
  );
105
106
  addTestMessage(convId, 'assistant', 'Here is the summary...');
106
107
 
107
- const result = await taskSaveTool.execute(
108
+ const result = await executeTaskSave(
108
109
  { conversation_id: convId },
109
110
  stubContext,
110
111
  );
@@ -120,7 +121,7 @@ describe('task_save tool', () => {
120
121
  addTestMessage(convId, 'user', 'Read and analyze the logs');
121
122
  addTestMessage(convId, 'assistant', 'Done!');
122
123
 
123
- const result = await taskSaveTool.execute(
124
+ const result = await executeTaskSave(
124
125
  { conversation_id: convId, title: 'My Custom Title' },
125
126
  stubContext,
126
127
  );
@@ -134,7 +135,7 @@ describe('task_save tool', () => {
134
135
  addTestMessage(convId, 'user', 'Summarize the report');
135
136
  addTestMessage(convId, 'assistant', 'Done.');
136
137
 
137
- const result = await taskSaveTool.execute({}, stubContext);
138
+ const result = await executeTaskSave({}, stubContext);
138
139
 
139
140
  expect(result.isError).toBe(false);
140
141
  expect(result.content).toContain('Task saved successfully');
@@ -142,7 +143,7 @@ describe('task_save tool', () => {
142
143
  });
143
144
 
144
145
  test('returns error for nonexistent conversation', async () => {
145
- const result = await taskSaveTool.execute(
146
+ const result = await executeTaskSave(
146
147
  { conversation_id: 'nonexistent' },
147
148
  stubContext,
148
149
  );
@@ -171,7 +172,7 @@ describe('task_run tool', () => {
171
172
  requiredTools: ['file_read'],
172
173
  });
173
174
 
174
- const result = await taskRunTool.execute(
175
+ const result = await executeTaskRun(
175
176
  { task_name: 'summarize', inputs: { file_path: '/tmp/report.txt' } },
176
177
  stubContext,
177
178
  );
@@ -188,7 +189,7 @@ describe('task_run tool', () => {
188
189
  inputSchema: { type: 'object', properties: { url: { type: 'string', description: 'URL' } } },
189
190
  });
190
191
 
191
- const result = await taskRunTool.execute(
192
+ const result = await executeTaskRun(
192
193
  { task_id: task.id, inputs: { url: 'https://prod.example.com' } },
193
194
  stubContext,
194
195
  );
@@ -204,7 +205,7 @@ describe('task_run tool', () => {
204
205
  template: 'Do something',
205
206
  });
206
207
 
207
- const result = await taskRunTool.execute(
208
+ const result = await executeTaskRun(
208
209
  { task_name: 'nonexistent' },
209
210
  stubContext,
210
211
  );
@@ -215,13 +216,13 @@ describe('task_run tool', () => {
215
216
  });
216
217
 
217
218
  test('returns error when task not found by ID', async () => {
218
- const result = await taskRunTool.execute(
219
+ const result = await executeTaskRun(
219
220
  { task_id: 'bad-id' },
220
221
  stubContext,
221
222
  );
222
223
 
223
224
  expect(result.isError).toBe(true);
224
- expect(result.content).toContain('No task found with ID "bad-id"');
225
+ expect(result.content).toContain('No task template found with ID "bad-id"');
225
226
  });
226
227
 
227
228
  test('renders template with inputs', async () => {
@@ -237,7 +238,7 @@ describe('task_run tool', () => {
237
238
  },
238
239
  });
239
240
 
240
- const result = await taskRunTool.execute(
241
+ const result = await executeTaskRun(
241
242
  {
242
243
  task_name: 'multi-input',
243
244
  inputs: { file_path: '/home/user/data.csv', url: 'https://api.example.com/upload' },
@@ -259,7 +260,7 @@ describe('task_run tool', () => {
259
260
  },
260
261
  });
261
262
 
262
- const result = await taskRunTool.execute(
263
+ const result = await executeTaskRun(
263
264
  { task_name: 'input required' },
264
265
  stubContext,
265
266
  );
@@ -269,14 +270,14 @@ describe('task_run tool', () => {
269
270
  });
270
271
 
271
272
  test('returns error when neither task_name nor task_id provided', async () => {
272
- const result = await taskRunTool.execute({}, stubContext);
273
+ const result = await executeTaskRun({}, stubContext);
273
274
 
274
275
  expect(result.isError).toBe(true);
275
276
  expect(result.content).toContain('At least one of task_name or task_id must be provided');
276
277
  });
277
278
 
278
279
  test('returns error with helpful message when no tasks exist', async () => {
279
- const result = await taskRunTool.execute(
280
+ const result = await executeTaskRun(
280
281
  { task_name: 'anything' },
281
282
  stubContext,
282
283
  );
@@ -292,7 +293,7 @@ describe('task_run tool', () => {
292
293
  requiredTools: ['file_read', 'bash'],
293
294
  });
294
295
 
295
- const result = await taskRunTool.execute(
296
+ const result = await executeTaskRun(
296
297
  { task_name: 'tools' },
297
298
  stubContext,
298
299
  );
@@ -329,7 +330,7 @@ describe('task_list tool', () => {
329
330
  requiredTools: ['file_read', 'file_write'],
330
331
  });
331
332
 
332
- const result = await taskListTool.execute({}, stubContext);
333
+ const result = await executeTaskList({}, stubContext);
333
334
 
334
335
  expect(result.isError).toBe(false);
335
336
  expect(result.content).toContain('Found 2 task template(s)');
@@ -342,7 +343,7 @@ describe('task_list tool', () => {
342
343
  });
343
344
 
344
345
  test('returns empty message when no tasks exist', async () => {
345
- const result = await taskListTool.execute({}, stubContext);
346
+ const result = await executeTaskList({}, stubContext);
346
347
 
347
348
  expect(result.isError).toBe(false);
348
349
  expect(result.content).toContain('No task templates found');
@@ -355,7 +356,7 @@ describe('task_list tool', () => {
355
356
  template: 'Something',
356
357
  });
357
358
 
358
- const result = await taskListTool.execute({}, stubContext);
359
+ const result = await executeTaskList({}, stubContext);
359
360
 
360
361
  expect(result.isError).toBe(false);
361
362
  expect(result.content).toContain('Status: active');
@@ -378,21 +379,17 @@ describe('task_list_show tool', () => {
378
379
  createWorkItem({ taskId: task.id, title: 'Work Item Alpha', priorityTier: 0 });
379
380
  createWorkItem({ taskId: task.id, title: 'Work Item Beta', notes: 'some notes', priorityTier: 1 });
380
381
 
381
- const result = await taskListShowTool.execute({}, stubContext);
382
+ const result = await executeTaskListShow({}, stubContext);
382
383
 
383
384
  expect(result.isError).toBe(false);
384
- expect(result.content).toContain('Found 2 work item(s)');
385
- expect(result.content).toContain('Work Item Alpha');
386
- expect(result.content).toContain('Work Item Beta');
387
- expect(result.content).toContain('Status: queued');
388
- expect(result.content).toContain('Notes: some notes');
385
+ expect(result.content).toContain('Opened Tasks window (2 items)');
389
386
  });
390
387
 
391
388
  test('returns empty message when no work items', async () => {
392
- const result = await taskListShowTool.execute({}, stubContext);
389
+ const result = await executeTaskListShow({}, stubContext);
393
390
 
394
391
  expect(result.isError).toBe(false);
395
- expect(result.content).toContain('No Tasks found');
392
+ expect(result.content).toContain('no tasks queued');
396
393
  });
397
394
 
398
395
  test('filters by status when status param is provided', async () => {
@@ -403,17 +400,13 @@ describe('task_list_show tool', () => {
403
400
  const doneItem = createWorkItem({ taskId: task.id, title: 'Done Item', priorityTier: 1 });
404
401
  raw.query('UPDATE work_items SET status = ? WHERE id = ?').run('done', doneItem.id);
405
402
 
406
- const resultQueued = await taskListShowTool.execute({ status: 'queued' }, stubContext);
403
+ const resultQueued = await executeTaskListShow({ status: 'queued' }, stubContext);
407
404
  expect(resultQueued.isError).toBe(false);
408
- expect(resultQueued.content).toContain('Found 1 work item(s)');
409
- expect(resultQueued.content).toContain('Queued Item');
410
- expect(resultQueued.content).not.toContain('Done Item');
405
+ expect(resultQueued.content).toContain('1 queued item');
411
406
 
412
- const resultDone = await taskListShowTool.execute({ status: 'done' }, stubContext);
407
+ const resultDone = await executeTaskListShow({ status: 'done' }, stubContext);
413
408
  expect(resultDone.isError).toBe(false);
414
- expect(resultDone.content).toContain('Found 1 work item(s)');
415
- expect(resultDone.content).toContain('Done Item');
416
- expect(resultDone.content).not.toContain('Queued Item');
409
+ expect(resultDone.content).toContain('1 done item');
417
410
  });
418
411
  });
419
412
 
@@ -430,7 +423,7 @@ describe('task_list_add tool', () => {
430
423
  test('successfully enqueues by task_id', async () => {
431
424
  const task = createTask({ title: 'Deploy Service', template: 'deploy it' });
432
425
 
433
- const result = await taskListAddTool.execute({ task_id: task.id }, stubContext);
426
+ const result = await executeTaskListAdd({ task_id: task.id }, stubContext);
434
427
 
435
428
  expect(result.isError).toBe(false);
436
429
  expect(result.content).toContain('Enqueued work item');
@@ -441,7 +434,7 @@ describe('task_list_add tool', () => {
441
434
  test('successfully enqueues by task_name (case-insensitive match)', async () => {
442
435
  createTask({ title: 'Run Database Migration', template: 'migrate' });
443
436
 
444
- const result = await taskListAddTool.execute({ task_name: 'database migration' }, stubContext);
437
+ const result = await executeTaskListAdd({ task_name: 'database migration' }, stubContext);
445
438
 
446
439
  expect(result.isError).toBe(false);
447
440
  expect(result.content).toContain('Enqueued work item');
@@ -452,7 +445,7 @@ describe('task_list_add tool', () => {
452
445
  createTask({ title: 'Deploy Frontend', template: 'deploy fe' });
453
446
  createTask({ title: 'Deploy Backend', template: 'deploy be' });
454
447
 
455
- const result = await taskListAddTool.execute({ task_name: 'deploy' }, stubContext);
448
+ const result = await executeTaskListAdd({ task_name: 'deploy' }, stubContext);
456
449
 
457
450
  expect(result.isError).toBe(true);
458
451
  expect(result.content).toContain('Multiple task definitions match');
@@ -463,21 +456,21 @@ describe('task_list_add tool', () => {
463
456
  test('returns error when no matching task found', async () => {
464
457
  createTask({ title: 'Existing Task', template: 'do something' });
465
458
 
466
- const result = await taskListAddTool.execute({ task_name: 'nonexistent' }, stubContext);
459
+ const result = await executeTaskListAdd({ task_name: 'nonexistent' }, stubContext);
467
460
 
468
461
  expect(result.isError).toBe(true);
469
462
  expect(result.content).toContain('No task definition found matching "nonexistent"');
470
463
  });
471
464
 
472
465
  test('returns error when no identifiers provided at all', async () => {
473
- const result = await taskListAddTool.execute({}, stubContext);
466
+ const result = await executeTaskListAdd({}, stubContext);
474
467
 
475
468
  expect(result.isError).toBe(true);
476
469
  expect(result.content).toContain('You must provide either task_id, task_name, or title');
477
470
  });
478
471
 
479
472
  test('creates ad-hoc work item with just title (no task_id or task_name)', async () => {
480
- const result = await taskListAddTool.execute(
473
+ const result = await executeTaskListAdd(
481
474
  { title: 'Check Gmail' },
482
475
  stubContext,
483
476
  );
@@ -491,7 +484,7 @@ describe('task_list_add tool', () => {
491
484
  });
492
485
 
493
486
  test('ad-hoc work item with notes and priority', async () => {
494
- const result = await taskListAddTool.execute(
487
+ const result = await executeTaskListAdd(
495
488
  {
496
489
  title: 'Buy groceries',
497
490
  notes: 'Milk, eggs, bread',
@@ -507,21 +500,21 @@ describe('task_list_add tool', () => {
507
500
  });
508
501
 
509
502
  test('ad-hoc work item shows up in task_list_show', async () => {
510
- await taskListAddTool.execute(
503
+ await executeTaskListAdd(
511
504
  { title: 'Call dentist' },
512
505
  stubContext,
513
506
  );
514
507
 
515
- const listResult = await taskListShowTool.execute({}, stubContext);
508
+ const listResult = await executeTaskListShow({}, stubContext);
516
509
 
517
510
  expect(listResult.isError).toBe(false);
518
- expect(listResult.content).toContain('Call dentist');
511
+ expect(listResult.content).toContain('Opened Tasks window (1 item)');
519
512
  });
520
513
 
521
514
  test('applies optional overrides (title, notes, priority_tier)', async () => {
522
515
  const task = createTask({ title: 'Generic Task', template: 'do it' });
523
516
 
524
- const result = await taskListAddTool.execute(
517
+ const result = await executeTaskListAdd(
525
518
  {
526
519
  task_id: task.id,
527
520
  title: 'Custom Title Override',
@@ -551,7 +544,7 @@ describe('task_delete tool', () => {
551
544
  test('successfully deletes a single task', async () => {
552
545
  const task = createTask({ title: 'Doomed Task', template: 'bye' });
553
546
 
554
- const result = await taskDeleteTool.execute({ task_ids: [task.id] }, stubContext);
547
+ const result = await executeTaskDelete({ task_ids: [task.id] }, stubContext);
555
548
 
556
549
  expect(result.isError).toBe(false);
557
550
  expect(result.content).toContain('Deleted task: Doomed Task');
@@ -561,7 +554,7 @@ describe('task_delete tool', () => {
561
554
  const t1 = createTask({ title: 'Task One', template: 'one' });
562
555
  const t2 = createTask({ title: 'Task Two', template: 'two' });
563
556
 
564
- const result = await taskDeleteTool.execute({ task_ids: [t1.id, t2.id] }, stubContext);
557
+ const result = await executeTaskDelete({ task_ids: [t1.id, t2.id] }, stubContext);
565
558
 
566
559
  expect(result.isError).toBe(false);
567
560
  expect(result.content).toContain('Deleted 2 task(s)');
@@ -570,10 +563,10 @@ describe('task_delete tool', () => {
570
563
  });
571
564
 
572
565
  test('returns error for non-existent task ID', async () => {
573
- const result = await taskDeleteTool.execute({ task_ids: ['nonexistent-id'] }, stubContext);
566
+ const result = await executeTaskDelete({ task_ids: ['nonexistent-id'] }, stubContext);
574
567
 
575
568
  expect(result.isError).toBe(true);
576
- expect(result.content).toContain('No task found with ID nonexistent-id');
569
+ expect(result.content).toContain('No task template or work item found with ID "nonexistent-id"');
577
570
  });
578
571
 
579
572
  test('cascades deletion to associated task runs and work items', async () => {
@@ -588,7 +581,7 @@ describe('task_delete tool', () => {
588
581
  expect(runsBefore.count).toBe(1);
589
582
  expect(itemsBefore.count).toBe(1);
590
583
 
591
- const result = await taskDeleteTool.execute({ task_ids: [task.id] }, stubContext);
584
+ const result = await executeTaskDelete({ task_ids: [task.id] }, stubContext);
592
585
 
593
586
  expect(result.isError).toBe(false);
594
587
  expect(result.content).toContain('Deleted task: Parent Task');
@@ -103,6 +103,7 @@ describe('tool audit listener', () => {
103
103
  durationMs: 9,
104
104
  errorMessage: 'boom',
105
105
  isExpected: false,
106
+ errorCategory: 'tool_failure',
106
107
  });
107
108
 
108
109
  expect(records).toHaveLength(1);
@@ -190,6 +190,7 @@ describe('createToolDomainEventPublisher', () => {
190
190
  durationMs: 12,
191
191
  errorMessage: 'cat: /missing: No such file or directory',
192
192
  isExpected: false,
193
+ errorCategory: 'tool_failure',
193
194
  errorName: 'Error',
194
195
  errorStack: 'Error: cat: /missing: No such file or directory',
195
196
  });
@@ -229,6 +230,7 @@ describe('createToolDomainEventPublisher', () => {
229
230
  durationMs: 9,
230
231
  errorMessage: 'ENOENT',
231
232
  isExpected: false,
233
+ errorCategory: 'tool_failure',
232
234
  errorName: 'Error',
233
235
  errorStack: 'Error: ENOENT\n at test',
234
236
  });